Skip to content

Commit 1281f6e

Browse files
author
Katochimoto
committed
Merge remote-tracking branch 'origin/rc-1.0.0'
2 parents 8378595 + 4475a57 commit 1281f6e

38 files changed

+5268
-3268
lines changed

dist/x-bubbles-compact.js

+1,989-1,285
Large diffs are not rendered by default.

dist/x-bubbles-compact.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/x-bubbles-compact.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/x-bubbles.js

+1,989-1,285
Large diffs are not rendered by default.

dist/x-bubbles.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/x-bubbles.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/x-bubbles.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/x-bubbles.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+14-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "x-bubbles",
33
"description": "Bubbles",
4-
"version": "0.0.27",
4+
"version": "1.0.2",
55
"keywords": [],
66
"homepage": "https://github.com/Katochimoto/x-bubbles",
77
"author": {
@@ -20,33 +20,33 @@
2020
},
2121
"dependencies": {},
2222
"devDependencies": {
23-
"babel-eslint": "7.0.0",
24-
"babel-loader": "6.2.5",
25-
"babel-preset-es2015": "6.16.0",
23+
"babel-eslint": "7.1.1",
24+
"babel-loader": "6.2.10",
25+
"babel-preset-es2015": "6.18.0",
2626
"babel-preset-stage-0": "6.16.0",
27-
"babel-register": "6.16.3",
28-
"benchmark": "2.1.1",
27+
"babel-register": "6.18.0",
28+
"benchmark": "2.1.2",
2929
"chai": "3.5.0",
30-
"document-register-element": "1.2.0",
30+
"document-register-element": "1.3.0",
3131
"es6-promise": "4.0.5",
32-
"eslint": "3.7.1",
32+
"eslint": "3.12.2",
3333
"eslint-config-yandex": "1.0.6",
34-
"eslint-loader": "1.5.0",
34+
"eslint-loader": "1.6.1",
3535
"file-loader": "0.9.0",
36-
"invariant": "2.2.1",
36+
"invariant": "2.2.2",
3737
"istanbul": "1.1.0-alpha.1",
3838
"istanbul-instrumenter-loader": "0.2.0",
3939
"jquery": "3.1.1",
4040
"karma-babel-preprocessor": "6.0.1",
4141
"karma-chai": "0.1.0",
4242
"karma-coverage": "1.1.1",
43-
"karma-mocha": "1.2.0",
43+
"karma-mocha": "1.3.0",
4444
"karma-phantomjs-launcher": "1.0.2",
4545
"karma-sinon-chai": "1.2.4",
4646
"karma-sourcemap-loader": "0.3.7",
4747
"karma-webpack": "1.8.0",
48-
"lodash": "4.16.4",
49-
"mocha": "3.1.2",
48+
"lodash": "4.17.2",
49+
"mocha": "3.2.0",
5050
"modernizr": "3.3.1",
5151
"modernizr-loader": "0.0.5",
5252
"preprocess": "3.1.0",
@@ -56,7 +56,7 @@
5656
"sinon-chai": "2.8.0",
5757
"url-loader": "0.5.7",
5858
"karma": "1.3.0",
59-
"webpack": "1.13.2"
59+
"webpack": "1.14.0"
6060
},
6161
"engines": {
6262
"node": ">=4.0.0",

samples/index.html

+17-5
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
function cut(str, cutStart, cutEnd) {
167167
return str.substr(0, cutStart) + (cutEnd > 0 ? str.substr(cutEnd) : '');
168168
}
169-
169+
/*
170170
console.log('>>>0', JSON.stringify(',,,,,a,,,b,;;;c;;;;,d,,,'), JSON.stringify(tokenizer(',,,,,a,,,b,;;;c;;;;,d,,,')));
171171
console.log('>>>1', JSON.stringify('[email protected]'), JSON.stringify(tokenizer('[email protected]')));
172172
console.log('>>>2', JSON.stringify('[email protected], asdqwe'), JSON.stringify(tokenizer('[email protected], asdqwe')));
@@ -176,14 +176,26 @@
176176
console.log('>>>6', JSON.stringify('test1, test2 <[email protected]>'), JSON.stringify(tokenizer('test1, test2 <[email protected]>')));
177177
console.log('>>>7', JSON.stringify('[email protected], test2 <[email protected]>'), JSON.stringify(tokenizer('[email protected], test2 <[email protected]>')));
178178
console.log('>>>8', JSON.stringify('test0, [email protected], test2 <[email protected]>'), JSON.stringify(tokenizer('test0, [email protected], test2 <[email protected]>')));
179+
*/
180+
181+
window.addEventListener('x-bubbles-ready', function(event) {
182+
console.log('>><<', event);
183+
}, false);
184+
185+
function separatorCond(inputValue) {
186+
return REG_EMAIL.test(inputValue);
187+
}
188+
179189
</script>
180190
<div style="margin-top: 0;">
181191
<div class="bubbles"
182192
id="test"
183193
is="x-bubbles"
184194
tabindex="0"
185195
data-tokenizer="tokenizer"
186-
data-separator="">
196+
data-separator="/[,;]/"
197+
data-separator-cond="separatorCond"
198+
data-selection="false">
187199

188200
123,456,789
189201
</div>
@@ -196,19 +208,19 @@
196208
var set = document.getElementById('test');
197209

198210
set.addEventListener('change', function(event) {
199-
console.log('change');
211+
// console.log('change');
200212
}, false);
201213

202214
set.addEventListener('bubble-input', function(event) {
203215
console.log('bubble-input', event.detail.data);
204216
}, false);
205217

206218
set.addEventListener('focus', function(event) {
207-
console.log('focus');
219+
// console.log('focus');
208220
}, false);
209221

210222
set.addEventListener('blur', function(event) {
211-
console.log('blur');
223+
// console.log('blur');
212224
}, false);
213225

214226
document.getElementById('add-bubble')

src/core/bubble.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,22 @@ function edit(nodeSet, nodeBubble) {
5757

5858
/**
5959
* У обертки нельзя делать tabindex=-1, иначе будет слетать фокус с поля ввода.
60-
* @param {[type]} nodeSet [description]
61-
* @param {[type]} dataText [description]
62-
* @param {Object} [dataAttributes={}] [description]
63-
* @returns {[type]} [description]
60+
* @param {HTMLElement} nodeEditor
61+
* @param {string} dataText
62+
* @param {Object} [dataAttributes={}]
63+
* @returns {?HTMLElement}
6464
*/
65-
function create(nodeSet, dataText, dataAttributes = {}) {
65+
function create(nodeEditor, dataText, dataAttributes = {}) {
6666
dataText = text.textClean(dataText);
6767

6868
if (!dataText) {
6969
return;
7070
}
7171

72-
const bubbleFormation = nodeSet.options('bubbleFormation');
73-
const classBubble = nodeSet.options('classBubble');
74-
const draggable = canUseDrag && nodeSet.options('draggable');
75-
const wrap = nodeSet.ownerDocument.createElement('span');
72+
const bubbleFormation = nodeEditor.options('bubbleFormation');
73+
const classBubble = nodeEditor.options('classBubble');
74+
const draggable = canUseDrag && nodeEditor.options('draggable') && nodeEditor.options('selection');
75+
const wrap = nodeEditor.ownerDocument.createElement('span');
7676

7777
wrap.innerText = dataText;
7878

src/core/bubbleset.js

+12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ exports.headBubble = headBubble;
1111
exports.lastBubble = lastBubble;
1212
exports.nextBubble = nextBubble;
1313
exports.prevBubble = prevBubble;
14+
exports.removeBubbles = removeBubbles;
15+
exports.moveBubbles = moveBubbles;
1416

1517
function lastBubble(nodeSet) {
1618
return nodeSet.querySelector('[bubble]:last-child');
@@ -130,3 +132,13 @@ function isEditorNode(node) {
130132
node.getAttribute('is') === 'x-bubbles'
131133
);
132134
}
135+
136+
function removeBubbles(nodeEditor, list) {
137+
nodeEditor.fireBeforeRemove(list);
138+
list.forEach(item => nodeEditor.removeChild(item));
139+
}
140+
141+
function moveBubbles(nodeEditorFrom, nodeEditorTo, list) {
142+
nodeEditorFrom.fireBeforeRemove(list);
143+
list.forEach(item => nodeEditorTo.appendChild(item));
144+
}

src/core/common/blur.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const events = require('../events');
2+
const { PROPS } = require('../constant');
3+
4+
/**
5+
* @param {Event} event
6+
* @returns {?boolean}
7+
*/
8+
module.exports = function (event) {
9+
if (event.currentTarget[ PROPS.LOCK_COPY ]) {
10+
return events.prevent(event);
11+
}
12+
};

src/core/common/click.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const events = require('../events');
2+
const bubbleset = require('../bubbleset');
3+
const { PROPS } = require('../constant');
4+
5+
/**
6+
* @param {Event} event
7+
* @param {Object} sharedData
8+
* @param {HTMLElement} [sharedData.nodeEditor]
9+
* @param {HTMLElement} [sharedData.nodeBubble]
10+
* @param {boolean} [sharedData.isDblclick]
11+
* @returns {?boolean}
12+
*/
13+
module.exports = function (event, sharedData) {
14+
const nodeEditor = bubbleset.closestNodeSet(event.target);
15+
if (!nodeEditor) {
16+
return events.prevent(event);
17+
}
18+
19+
sharedData.nodeEditor = nodeEditor;
20+
sharedData.nodeBubble = bubbleset.closestNodeBubble(event.target);
21+
sharedData.isDblclick = false;
22+
23+
if (sharedData.nodeBubble) {
24+
const clickTime = Date.now();
25+
sharedData.isDblclick = nodeEditor[ PROPS.CLICK_TIME ] && (clickTime - nodeEditor[ PROPS.CLICK_TIME ]) < 200;
26+
27+
nodeEditor[ PROPS.CLICK_TIME ] = clickTime;
28+
}
29+
};

src/core/common/focus.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const raf = require('raf');
2+
const context = require('../../context');
3+
const events = require('../events');
4+
const { PROPS } = require('../constant');
5+
6+
/**
7+
* @param {Event} event
8+
* @returns {?boolean}
9+
*/
10+
module.exports = function (event) {
11+
const nodeEditor = event.currentTarget;
12+
if (nodeEditor[ PROPS.LOCK_COPY ]) {
13+
events.prevent(event);
14+
delete nodeEditor[ PROPS.LOCK_COPY ];
15+
16+
// Safary 10 не сбрасывает курсор без задержки
17+
raf(() => {
18+
const selection = context.getSelection();
19+
selection && selection.removeAllRanges();
20+
});
21+
22+
return false;
23+
}
24+
};

src/core/common/keydown.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const utils = require('../utils');
2+
const events = require('../events');
3+
const { KEY } = require('../constant');
4+
5+
/**
6+
* @param {Event} event
7+
* @param {Object} sharedData
8+
* @param {Selection} [sharedData.selection]
9+
* @param {HTMLElement} [sharedData.nodeEditor]
10+
*/
11+
module.exports = function (event, sharedData) {
12+
const code = events.keyCode(event);
13+
sharedData.nodeEditor = event.currentTarget;
14+
15+
switch (code) {
16+
case KEY.Left:
17+
case KEY.Right:
18+
case KEY.Delete:
19+
case KEY.Backspace:
20+
event.preventDefault();
21+
sharedData.selection = utils.getSelection(event.currentTarget);
22+
break;
23+
}
24+
};

src/core/constant.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ exports.CLS = {
2323
};
2424

2525
exports.EV = {
26+
BEFORE_REMOVE: 'before-remove',
2627
BUBBLE_EDIT: 'bubble-edit',
2728
BUBBLE_INPUT: 'bubble-input',
2829
CHANGE: 'change',
@@ -31,10 +32,13 @@ exports.EV = {
3132
DRAGLEAVE: 'dragleave',
3233
DRAGSTART: 'dragstart',
3334
DROP: 'drop',
35+
READY: 'x-bubbles-ready',
3436
};
3537

3638
exports.PROPS = {
37-
BUBBLE_VALUE: '_bubbleValue',
38-
CLICK_TIME: '_clickTime',
39-
LOCK_COPY: '_lockCopy',
39+
BUBBLE_VALUE: '__bubble_value__',
40+
CLICK_TIME: '__click_time__',
41+
LOCAL_EVENTS: '__events__',
42+
LOCK_COPY: '__lock_copy__',
43+
OPTIONS: '__options__',
4044
};

src/core/drag/mouse.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ function onMouseup(dragSet, event) {
8383
const list = select.get(currentDragSet);
8484

8585
if (list.length) {
86-
list.forEach(item => nodeSet.appendChild(item));
86+
bubbleset.moveBubbles(currentDragSet, nodeSet, list);
8787
context.setTimeout(onDropSuccess, 0, currentDragSet, nodeSet);
8888
}
8989
}

src/core/drag/native.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function onDrop(event) {
6868
const list = select.get(currentDragSet);
6969

7070
if (list.length) {
71-
list.forEach(item => nodeSet.appendChild(item));
71+
bubbleset.moveBubbles(currentDragSet, nodeSet, list);
7272
context.setTimeout(onDropSuccess, 0, currentDragSet, nodeSet);
7373
}
7474
}

0 commit comments

Comments
 (0)