neo.mjs 4.2.7 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/realworld/view/HomeComponent.mjs +3 -6
- package/apps/realworld/view/article/CommentComponent.mjs +3 -6
- package/apps/realworld/view/article/Component.mjs +4 -7
- package/apps/realworld/view/article/CreateCommentComponent.mjs +3 -6
- package/apps/realworld/view/article/CreateComponent.mjs +3 -6
- package/apps/realworld/view/article/PreviewComponent.mjs +2 -5
- package/apps/realworld/view/article/TagListComponent.mjs +2 -5
- package/apps/realworld/view/user/ProfileComponent.mjs +3 -6
- package/apps/realworld/view/user/SettingsComponent.mjs +3 -6
- package/apps/realworld/view/user/SignUpComponent.mjs +2 -5
- package/apps/realworld2/view/article/PreviewComponent.mjs +2 -5
- package/apps/realworld2/view/article/TagListComponent.mjs +2 -5
- package/apps/website/view/MainContainer.mjs +1 -0
- package/apps/website/view/MainContainerController.mjs +7 -0
- package/apps/website/view/blog/List.mjs +41 -3
- package/apps/website/view/examples/List.mjs +28 -3
- package/apps/website/view/examples/TabContainer.mjs +7 -4
- package/buildScripts/addConfig.mjs +1 -0
- package/examples/ConfigurationViewport.mjs +1 -1
- package/examples/button/base/MainContainer.mjs +75 -12
- package/examples/tab/container/MainContainer.mjs +3 -3
- package/examples/todoList/version1/MainComponent.mjs +3 -6
- package/package.json +1 -1
- package/resources/scss/src/apps/website/blog/List.scss +2 -2
- package/resources/scss/src/apps/website/examples/List.scss +2 -2
- package/resources/scss/src/button/Base.scss +41 -3
- package/resources/scss/src/calendar/view/calendars/ColorsList.scss +5 -2
- package/resources/scss/src/layout/Card.scss +6 -10
- package/resources/scss/src/list/Base.scss +11 -3
- package/resources/scss/src/tab/Container.scss +3 -4
- package/resources/scss/src/tab/header/Button.scss +6 -1
- package/resources/scss/src/table/Container.scss +3 -1
- package/resources/scss/src/table/header/Button.scss +21 -1
- package/resources/scss/src/tree/List.scss +11 -1
- package/resources/scss/theme-dark/button/Base.scss +7 -1
- package/resources/scss/theme-dark/table/header/Button.scss +11 -9
- package/resources/scss/theme-light/button/Base.scss +7 -1
- package/resources/scss/theme-light/table/header/Button.scss +11 -9
- package/src/button/Base.mjs +151 -43
- package/src/calendar/view/YearComponent.mjs +3 -6
- package/src/calendar/view/calendars/ColorsList.mjs +18 -0
- package/src/calendar/view/calendars/EditContainer.mjs +7 -9
- package/src/calendar/view/month/Component.mjs +3 -6
- package/src/calendar/view/week/Component.mjs +3 -6
- package/src/calendar/view/week/plugin/DragDrop.mjs +6 -9
- package/src/component/Base.mjs +123 -58
- package/src/component/Carousel.mjs +5 -17
- package/src/component/Chip.mjs +2 -7
- package/src/component/Circle.mjs +4 -7
- package/src/component/DateSelector.mjs +5 -8
- package/src/component/Gallery.mjs +4 -7
- package/src/component/Helix.mjs +2 -5
- package/src/component/Splitter.mjs +3 -6
- package/src/component/mwc/Button.mjs +4 -7
- package/src/component/mwc/TextField.mjs +2 -5
- package/src/draggable/DropZone.mjs +3 -7
- package/src/draggable/list/DragZone.mjs +6 -9
- package/src/draggable/toolbar/DragZone.mjs +5 -8
- package/src/form/Fieldset.mjs +3 -6
- package/src/form/field/CheckBox.mjs +2 -5
- package/src/form/field/Range.mjs +3 -6
- package/src/form/field/Text.mjs +2 -5
- package/src/form/field/trigger/Base.mjs +4 -12
- package/src/grid/header/Button.mjs +3 -6
- package/src/layout/Base.mjs +5 -7
- package/src/layout/Card.mjs +32 -35
- package/src/layout/Fit.mjs +11 -11
- package/src/layout/Flexbox.mjs +28 -36
- package/src/layout/HBox.mjs +1 -1
- package/src/layout/VBox.mjs +1 -1
- package/src/list/Base.mjs +31 -11
- package/src/plugin/Resizable.mjs +3 -6
- package/src/selection/grid/CellModel.mjs +3 -6
- package/src/selection/grid/ColumnModel.mjs +3 -6
- package/src/selection/grid/RowModel.mjs +3 -6
- package/src/selection/table/CellModel.mjs +3 -6
- package/src/selection/table/ColumnModel.mjs +3 -6
- package/src/selection/table/RowModel.mjs +3 -6
- package/src/sitemap/Component.mjs +3 -6
- package/src/tab/Container.mjs +1 -1
- package/src/tab/header/Button.mjs +13 -2
- package/src/table/Container.mjs +11 -3
- package/src/table/header/Button.mjs +9 -5
- package/src/tooltip/Base.mjs +5 -15
- package/src/tree/List.mjs +4 -0
- package/src/util/KeyNavigation.mjs +8 -13
package/src/button/Base.mjs
CHANGED
@@ -6,7 +6,27 @@ import NeoArray from '../util/Array.mjs';
|
|
6
6
|
* @extends Neo.component.Base
|
7
7
|
*/
|
8
8
|
class Base extends Component {
|
9
|
+
/**
|
10
|
+
* Time in ms for the ripple effect when clicking on the button.
|
11
|
+
* Only active if useRippleEffect is set to true.
|
12
|
+
* @member {Number} rippleEffectDuration=400
|
13
|
+
*/
|
14
|
+
rippleEffectDuration = 400
|
15
|
+
/**
|
16
|
+
* Internal flag to store the last setTimeout() id for ripple effect remove node callbacks
|
17
|
+
* @member {Number} #rippleTimeoutId=null
|
18
|
+
* @private
|
19
|
+
*/
|
20
|
+
#rippleTimeoutId = null
|
21
|
+
|
9
22
|
static getStaticConfig() {return {
|
23
|
+
/**
|
24
|
+
* Valid values for badgePosition
|
25
|
+
* @member {String[]} badgePositions=['bottom-left','bottom-right','top-left','top-right']
|
26
|
+
* @protected
|
27
|
+
* @static
|
28
|
+
*/
|
29
|
+
badgePositions: ['bottom-left', 'bottom-right', 'top-left', 'top-right'],
|
10
30
|
/**
|
11
31
|
* Valid values for iconPosition
|
12
32
|
* @member {String[]} iconPositions=['top','right','bottom','left']
|
@@ -27,6 +47,14 @@ class Base extends Component {
|
|
27
47
|
* @protected
|
28
48
|
*/
|
29
49
|
ntype: 'button',
|
50
|
+
/**
|
51
|
+
* @member {String} badgePosition_='top-right'
|
52
|
+
*/
|
53
|
+
badgePosition_: 'top-right',
|
54
|
+
/**
|
55
|
+
* @member {String|null} badgeText_=null
|
56
|
+
*/
|
57
|
+
badgeText_: null,
|
30
58
|
/**
|
31
59
|
* @member {String[]} cls=['neo-button']
|
32
60
|
*/
|
@@ -91,9 +119,9 @@ class Base extends Component {
|
|
91
119
|
urlTarget_: '_blank',
|
92
120
|
/**
|
93
121
|
* True adds an expanding circle on click
|
94
|
-
* @member {Boolean} useRippleEffect_=
|
122
|
+
* @member {Boolean} useRippleEffect_=true
|
95
123
|
*/
|
96
|
-
useRippleEffect_:
|
124
|
+
useRippleEffect_: true,
|
97
125
|
/**
|
98
126
|
* @member {Object} _vdom
|
99
127
|
*/
|
@@ -101,10 +129,49 @@ class Base extends Component {
|
|
101
129
|
{tag: 'button', type: 'button', cn: [
|
102
130
|
{tag: 'span', cls: ['neo-button-glyph']},
|
103
131
|
{tag: 'span', cls: ['neo-button-text']},
|
104
|
-
{
|
132
|
+
{cls: ['neo-button-badge']},
|
133
|
+
{cls: ['neo-button-ripple-wrapper'], cn: [
|
134
|
+
{cls: ['neo-button-ripple']}
|
135
|
+
]}
|
105
136
|
]}
|
106
137
|
}}
|
107
138
|
|
139
|
+
/**
|
140
|
+
* Triggered after the badgePosition config got changed
|
141
|
+
* @param {String} value
|
142
|
+
* @param {String} oldValue
|
143
|
+
* @protected
|
144
|
+
*/
|
145
|
+
afterSetBadgePosition(value, oldValue) {
|
146
|
+
let me = this,
|
147
|
+
badgeEl = me.getBadgeNode(),
|
148
|
+
cls = badgeEl.cls || [],
|
149
|
+
vdom = me.vdom;
|
150
|
+
|
151
|
+
NeoArray.remove(cls, 'neo-' + oldValue);
|
152
|
+
NeoArray.add(cls, 'neo-' + value);
|
153
|
+
|
154
|
+
badgeEl.cls = cls;
|
155
|
+
me.vdom = vdom;
|
156
|
+
}
|
157
|
+
|
158
|
+
/**
|
159
|
+
* Triggered after the badgeText config got changed
|
160
|
+
* @param {String|null} value
|
161
|
+
* @param {String|null} oldValue
|
162
|
+
* @protected
|
163
|
+
*/
|
164
|
+
afterSetBadgeText(value, oldValue) {
|
165
|
+
let me = this,
|
166
|
+
badgeNode = me.getBadgeNode(),
|
167
|
+
vdom = me.vdom;
|
168
|
+
|
169
|
+
badgeNode.html = value;
|
170
|
+
badgeNode.removeDom = !Boolean(value);
|
171
|
+
|
172
|
+
me.vdom = vdom;
|
173
|
+
}
|
174
|
+
|
108
175
|
/**
|
109
176
|
* Triggered after the handler config got changed
|
110
177
|
* @param {String} value
|
@@ -112,17 +179,12 @@ class Base extends Component {
|
|
112
179
|
* @protected
|
113
180
|
*/
|
114
181
|
afterSetHandler(value, oldValue) {
|
115
|
-
|
116
|
-
let me = this,
|
117
|
-
domListeners = me.domListeners;
|
118
|
-
|
119
|
-
domListeners.push({
|
120
|
-
click: value,
|
121
|
-
scope: me.handlerScope || me
|
122
|
-
});
|
182
|
+
let me = this;
|
123
183
|
|
124
|
-
|
125
|
-
|
184
|
+
value && me.addDomListeners({
|
185
|
+
click: value,
|
186
|
+
scope: me.handlerScope || me
|
187
|
+
});
|
126
188
|
}
|
127
189
|
|
128
190
|
/**
|
@@ -134,7 +196,7 @@ class Base extends Component {
|
|
134
196
|
afterSetIconCls(value, oldValue) {
|
135
197
|
let me = this,
|
136
198
|
vdom = me.vdom,
|
137
|
-
iconNode = me.
|
199
|
+
iconNode = me.getIconNode();
|
138
200
|
|
139
201
|
NeoArray.remove(iconNode.cls, oldValue);
|
140
202
|
|
@@ -157,7 +219,7 @@ class Base extends Component {
|
|
157
219
|
afterSetIconColor(value, oldValue) {
|
158
220
|
let me = this,
|
159
221
|
vdom = me.vdom,
|
160
|
-
iconNode = me.
|
222
|
+
iconNode = me.getIconNode();
|
161
223
|
|
162
224
|
if (!iconNode.style) {
|
163
225
|
iconNode.style = {};
|
@@ -206,17 +268,12 @@ class Base extends Component {
|
|
206
268
|
* @protected
|
207
269
|
*/
|
208
270
|
afterSetRoute(value, oldValue) {
|
209
|
-
|
210
|
-
let me = this,
|
211
|
-
domListeners = me.domListeners;
|
212
|
-
|
213
|
-
domListeners.push({
|
214
|
-
click: me.changeRoute,
|
215
|
-
scope: me
|
216
|
-
});
|
271
|
+
let me = this;
|
217
272
|
|
218
|
-
|
219
|
-
|
273
|
+
value && me.addDomListeners({
|
274
|
+
click: me.changeRoute,
|
275
|
+
scope: me
|
276
|
+
});
|
220
277
|
}
|
221
278
|
|
222
279
|
/**
|
@@ -274,17 +331,20 @@ class Base extends Component {
|
|
274
331
|
* @protected
|
275
332
|
*/
|
276
333
|
afterSetUseRippleEffect(value, oldValue) {
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
me.domListeners = domListeners;
|
334
|
+
let me = this,
|
335
|
+
listener = {click: me.showRipple, scope: me},
|
336
|
+
rippleWrapper = me.getRippleWrapper(),
|
337
|
+
vdom = me.vdom;
|
338
|
+
|
339
|
+
if (!value && oldValue) {
|
340
|
+
me.removeDomListeners(listener);
|
341
|
+
} else if (value) {
|
342
|
+
me.addDomListeners(listener);
|
287
343
|
}
|
344
|
+
|
345
|
+
// setting the config to false should end running ripple animations
|
346
|
+
rippleWrapper.removeDom = true;
|
347
|
+
me.vdom = vdom;
|
288
348
|
}
|
289
349
|
|
290
350
|
/**
|
@@ -322,6 +382,17 @@ class Base extends Component {
|
|
322
382
|
return iconCls;
|
323
383
|
}
|
324
384
|
|
385
|
+
/**
|
386
|
+
* Triggered before the badgePosition config gets changed
|
387
|
+
* @param {String} value
|
388
|
+
* @param {String} oldValue
|
389
|
+
* @returns {String}
|
390
|
+
* @protected
|
391
|
+
*/
|
392
|
+
beforeSetBadgePosition(value, oldValue) {
|
393
|
+
return this.beforeSetEnumValue(value, oldValue, 'badgePosition');
|
394
|
+
}
|
395
|
+
|
325
396
|
/**
|
326
397
|
* Triggered before the iconCls config gets changed. Converts the string into an array if needed.
|
327
398
|
* @param {Array|String|null} value
|
@@ -360,16 +431,43 @@ class Base extends Component {
|
|
360
431
|
}
|
361
432
|
}
|
362
433
|
|
434
|
+
/**
|
435
|
+
* Convenience shortcut
|
436
|
+
* @returns {Object}
|
437
|
+
*/
|
438
|
+
getBadgeNode() {
|
439
|
+
return this.getVdomRoot().cn[2];
|
440
|
+
}
|
441
|
+
|
442
|
+
/**
|
443
|
+
* Convenience shortcut
|
444
|
+
* @returns {Object}
|
445
|
+
*/
|
446
|
+
getIconNode() {
|
447
|
+
return this.getVdomRoot().cn[0];
|
448
|
+
}
|
449
|
+
|
450
|
+
/**
|
451
|
+
* Convenience shortcut
|
452
|
+
* @returns {Object}
|
453
|
+
*/
|
454
|
+
getRippleWrapper() {
|
455
|
+
return this.getVdomRoot().cn[3];
|
456
|
+
}
|
457
|
+
|
363
458
|
/**
|
364
459
|
* @param {Object} data
|
365
460
|
*/
|
366
461
|
async showRipple(data) {
|
367
|
-
let me
|
368
|
-
buttonRect
|
369
|
-
diameter
|
370
|
-
radius
|
371
|
-
vdom
|
372
|
-
|
462
|
+
let me = this,
|
463
|
+
buttonRect = data.path[0].rect,
|
464
|
+
diameter = Math.max(buttonRect.height, buttonRect.width),
|
465
|
+
radius = diameter / 2,
|
466
|
+
vdom = me.vdom,
|
467
|
+
rippleEffectDuration = me.rippleEffectDuration,
|
468
|
+
rippleWrapper = me.getRippleWrapper(),
|
469
|
+
rippleEl = rippleWrapper.cn[0],
|
470
|
+
rippleTimeoutId;
|
373
471
|
|
374
472
|
rippleEl.style = Object.assign(rippleEl.style || {}, {
|
375
473
|
animation: 'none',
|
@@ -379,14 +477,24 @@ class Base extends Component {
|
|
379
477
|
width : `${diameter}px`
|
380
478
|
});
|
381
479
|
|
382
|
-
delete
|
480
|
+
delete rippleWrapper.removeDom;
|
383
481
|
|
384
482
|
me.vdom = vdom;
|
385
483
|
|
386
484
|
await Neo.timeout(1);
|
387
485
|
|
388
|
-
rippleEl.style.animation =
|
486
|
+
rippleEl.style.animation = `ripple ${rippleEffectDuration}ms linear`;
|
389
487
|
me.vdom = vdom;
|
488
|
+
|
489
|
+
me.#rippleTimeoutId = rippleTimeoutId = setTimeout(() => {
|
490
|
+
// we do not want to break animations when clicking multiple times
|
491
|
+
if (me.#rippleTimeoutId === rippleTimeoutId) {
|
492
|
+
me.#rippleTimeoutId = null;
|
493
|
+
|
494
|
+
rippleWrapper.removeDom = true;
|
495
|
+
me.vdom = vdom;
|
496
|
+
}
|
497
|
+
}, rippleEffectDuration);
|
390
498
|
}
|
391
499
|
}
|
392
500
|
|
@@ -178,15 +178,12 @@ class YearComponent extends Component {
|
|
178
178
|
construct(config) {
|
179
179
|
super.construct(config);
|
180
180
|
|
181
|
-
let me
|
182
|
-
domListeners = me.domListeners;
|
181
|
+
let me = this;
|
183
182
|
|
184
|
-
|
183
|
+
me.addDomListeners([
|
185
184
|
{click: me.onNavButtonClick, delegate: '.neo-nav-button', scope: me},
|
186
185
|
{wheel: me.onWheel, scope: me}
|
187
|
-
);
|
188
|
-
|
189
|
-
me.domListeners = domListeners;
|
186
|
+
]);
|
190
187
|
|
191
188
|
if (me.calendarStore.getCount() > 0 && me.eventStore.getCount() > 0) {
|
192
189
|
me.createMonths(true); // silent update
|
@@ -21,6 +21,10 @@ class ColorsList extends List {
|
|
21
21
|
* @member {String[]} cls=['neo-calendars-colors-list','neo-list']
|
22
22
|
*/
|
23
23
|
cls: ['neo-calendars-colors-list', 'neo-list'],
|
24
|
+
/**
|
25
|
+
* @member {Boolean} useWrapperNode=false
|
26
|
+
*/
|
27
|
+
useWrapperNode: false,
|
24
28
|
/**
|
25
29
|
* The list gets used as a form field, so we are adjusting the selection based on this config
|
26
30
|
* @member {String} value_=null
|
@@ -63,6 +67,20 @@ class ColorsList extends List {
|
|
63
67
|
}};
|
64
68
|
}
|
65
69
|
|
70
|
+
/**
|
71
|
+
* @returns {Object}
|
72
|
+
*/
|
73
|
+
getVdomRoot() {
|
74
|
+
return this.vdom;
|
75
|
+
}
|
76
|
+
|
77
|
+
/**
|
78
|
+
* @returns {Object}
|
79
|
+
*/
|
80
|
+
getVnodeRoot() {
|
81
|
+
return this.vnode;
|
82
|
+
}
|
83
|
+
|
66
84
|
/**
|
67
85
|
*
|
68
86
|
*/
|
@@ -64,9 +64,7 @@ class EditContainer extends FormContainer {
|
|
64
64
|
afterSetMounted(value, oldValue) {
|
65
65
|
super.afterSetMounted(value, oldValue);
|
66
66
|
|
67
|
-
|
68
|
-
this.getField('name').focus();
|
69
|
-
}
|
67
|
+
value && this.getField('name').focus();
|
70
68
|
}
|
71
69
|
|
72
70
|
/**
|
@@ -117,12 +115,12 @@ class EditContainer extends FormContainer {
|
|
117
115
|
|
118
116
|
if (record) {
|
119
117
|
me.colorsList = Neo.create({
|
120
|
-
module
|
121
|
-
appName
|
122
|
-
listeners: {change: me.onColorChange, scope: me},
|
123
|
-
parentId
|
124
|
-
|
125
|
-
|
118
|
+
module : ColorsList,
|
119
|
+
appName : me.appName,
|
120
|
+
listeners : {change: me.onColorChange, scope: me},
|
121
|
+
parentId : me.parentId,
|
122
|
+
value : record.color,
|
123
|
+
wrapperStyle: {marginTop: '0.2em'},
|
126
124
|
...me.colorsListConfig
|
127
125
|
});
|
128
126
|
|
@@ -160,15 +160,12 @@ class Component extends BaseComponent {
|
|
160
160
|
construct(config) {
|
161
161
|
super.construct(config);
|
162
162
|
|
163
|
-
let me
|
164
|
-
domListeners = me.domListeners;
|
163
|
+
let me = this;
|
165
164
|
|
166
|
-
|
165
|
+
me.addDomListeners([
|
167
166
|
{dblclick: me.onEventDoubleClick, delegate: 'neo-event', scope: me},
|
168
167
|
{wheel : me.onWheel, scope: me}
|
169
|
-
);
|
170
|
-
|
171
|
-
me.domListeners = domListeners;
|
168
|
+
]);
|
172
169
|
|
173
170
|
if (me.calendarStore.getCount() > 0 && me.eventStore.getCount() > 0) {
|
174
171
|
me.needsEventUpdate = true;
|
@@ -219,15 +219,12 @@ class Component extends BaseComponent {
|
|
219
219
|
construct(config) {
|
220
220
|
super.construct(config);
|
221
221
|
|
222
|
-
let me
|
223
|
-
domListeners = me.domListeners;
|
222
|
+
let me = this;
|
224
223
|
|
225
|
-
|
224
|
+
me.addDomListeners([
|
226
225
|
{dblclick: me.onEventDoubleClick, scope: me, delegate: '.neo-event'},
|
227
226
|
{wheel : me.onWheel, scope: me}
|
228
|
-
);
|
229
|
-
|
230
|
-
me.domListeners = domListeners;
|
227
|
+
]);
|
231
228
|
|
232
229
|
me.timeAxis = Neo.create(TimeAxisComponent, {
|
233
230
|
appName : me.appName,
|
@@ -29,22 +29,19 @@ class DragDrop extends Base {
|
|
29
29
|
construct(config) {
|
30
30
|
super.construct(config);
|
31
31
|
|
32
|
-
let me
|
33
|
-
columnOpts
|
34
|
-
eventOpts
|
35
|
-
owner
|
36
|
-
domListeners = owner.domListeners;
|
32
|
+
let me = this,
|
33
|
+
columnOpts = {scope: me, delegate: '.neo-c-w-column'},
|
34
|
+
eventOpts = {scope: me, delegate: '.neo-event'},
|
35
|
+
owner = me.owner;
|
37
36
|
|
38
|
-
|
37
|
+
owner.addDomListeners([
|
39
38
|
{'drag:end' : me.onColumnDragEnd, ...columnOpts},
|
40
39
|
{'drag:end' : me.onEventDragEnd, ...eventOpts},
|
41
40
|
{'drag:move' : me.onColumnDragMove, ...columnOpts},
|
42
41
|
{'drag:move' : me.onEventDragMove, ...eventOpts},
|
43
42
|
{'drag:start': me.onColumnDragStart, ...columnOpts},
|
44
43
|
{'drag:start': me.onEventDragStart, ...eventOpts}
|
45
|
-
);
|
46
|
-
|
47
|
-
owner.domListeners = domListeners;
|
44
|
+
]);
|
48
45
|
}
|
49
46
|
|
50
47
|
/**
|