neo.mjs 8.0.0 → 8.0.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/ServiceWorker.mjs +2 -2
- package/apps/portal/index.html +1 -1
- package/apps/portal/view/about/Container.mjs +0 -2
- package/apps/portal/view/about/MemberContainer.mjs +1 -20
- package/apps/portal/view/home/FooterContainer.mjs +1 -5
- package/examples/ConfigurationViewport.mjs +37 -32
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/grid/cellEditing/MainContainer.mjs +175 -0
- package/examples/grid/cellEditing/MainContainerStateProvider.mjs +62 -0
- package/examples/grid/cellEditing/MainModel.mjs +30 -0
- package/examples/grid/cellEditing/MainStore.mjs +54 -0
- package/examples/grid/cellEditing/app.mjs +6 -0
- package/examples/grid/cellEditing/index.html +11 -0
- package/examples/grid/cellEditing/neo-config.json +6 -0
- package/examples/grid/container/MainContainer.mjs +7 -6
- package/examples/grid/covid/GridContainer.mjs +36 -36
- package/examples/grid/covid/Util.mjs +1 -1
- package/examples/table/cellEditing/MainContainer.mjs +174 -0
- package/examples/table/cellEditing/MainContainerStateProvider.mjs +62 -0
- package/examples/table/cellEditing/MainModel.mjs +30 -0
- package/examples/table/cellEditing/MainStore.mjs +54 -0
- package/examples/table/cellEditing/app.mjs +6 -0
- package/examples/table/cellEditing/index.html +11 -0
- package/examples/table/cellEditing/neo-config.json +6 -0
- package/examples/table/nestedRecordFields/MainContainerStateProvider.mjs +2 -1
- package/package.json +5 -5
- package/resources/scss/src/apps/portal/home/FooterContainer.scss +11 -2
- package/resources/scss/src/grid/Container.scss +0 -13
- package/resources/scss/src/grid/plugin/CellEditing.scss +11 -0
- package/resources/scss/src/table/plugin/CellEditing.scss +11 -0
- package/src/DefaultConfig.mjs +2 -2
- package/src/component/DateSelector.mjs +15 -0
- package/src/form/field/Base.mjs +1 -4
- package/src/form/field/ComboBox.mjs +18 -2
- package/src/form/field/Date.mjs +10 -4
- package/src/grid/Container.mjs +242 -39
- package/src/grid/README.md +1 -1
- package/src/grid/View.mjs +282 -129
- package/src/grid/header/Button.mjs +327 -36
- package/src/grid/header/Toolbar.mjs +68 -4
- package/src/grid/plugin/CellEditing.mjs +30 -0
- package/src/main/DomEvents.mjs +12 -3
- package/src/manager/Focus.mjs +2 -2
- package/src/plugin/Base.mjs +15 -1
- package/src/plugin/Resizable.mjs +1 -5
- package/src/selection/Model.mjs +5 -1
- package/src/selection/grid/CellColumnModel.mjs +1 -1
- package/src/selection/grid/CellColumnRowModel.mjs +1 -1
- package/src/selection/grid/CellModel.mjs +1 -1
- package/src/selection/grid/ColumnModel.mjs +2 -2
- package/src/table/Container.mjs +32 -3
- package/src/table/View.mjs +9 -4
- package/src/table/header/Toolbar.mjs +15 -1
- package/src/table/plugin/CellEditing.mjs +330 -0
- package/src/util/KeyNavigation.mjs +14 -8
@@ -1,5 +1,7 @@
|
|
1
|
-
import BaseButton
|
2
|
-
import NeoArray
|
1
|
+
import BaseButton from '../../button/Base.mjs';
|
2
|
+
import NeoArray from '../../util/Array.mjs';
|
3
|
+
import TextField from '../../form/field/Text.mjs';
|
4
|
+
import {resolveCallback} from '../../util/Function.mjs';
|
3
5
|
|
4
6
|
/**
|
5
7
|
* @class Neo.grid.header.Button
|
@@ -8,7 +10,7 @@ import NeoArray from '../../util/Array.mjs';
|
|
8
10
|
class Button extends BaseButton {
|
9
11
|
/**
|
10
12
|
* Valid values for align
|
11
|
-
* @member {String[]} cellAlignValues: ['left',
|
13
|
+
* @member {String[]} cellAlignValues: ['left','center','right']
|
12
14
|
* @protected
|
13
15
|
* @static
|
14
16
|
*/
|
@@ -30,10 +32,36 @@ class Button extends BaseButton {
|
|
30
32
|
*/
|
31
33
|
baseCls: ['neo-grid-header-button'],
|
32
34
|
/**
|
33
|
-
* Alignment of the matching
|
35
|
+
* Alignment of the matching grid cells. Valid values are left, center, right
|
34
36
|
* @member {String} cellAlign_='left'
|
35
37
|
*/
|
36
38
|
cellAlign_: 'left',
|
39
|
+
/**
|
40
|
+
* @member {String|null} dataField=null
|
41
|
+
*/
|
42
|
+
dataField: null,
|
43
|
+
/**
|
44
|
+
* Sort direction when clicking on an unsorted button
|
45
|
+
* @member {String} defaultSortDirection='ASC'
|
46
|
+
*/
|
47
|
+
defaultSortDirection: 'ASC',
|
48
|
+
/**
|
49
|
+
* @member {Boolean} draggable_=true
|
50
|
+
*/
|
51
|
+
draggable_: true,
|
52
|
+
/**
|
53
|
+
* @member {Object} editorConfig=null
|
54
|
+
*/
|
55
|
+
editorConfig: null,
|
56
|
+
/**
|
57
|
+
* @member {Object} filterConfig=null
|
58
|
+
*/
|
59
|
+
filterConfig: null,
|
60
|
+
/**
|
61
|
+
* @member {Neo.form.field.Base|null} filterField=null
|
62
|
+
* @protected
|
63
|
+
*/
|
64
|
+
filterField: null,
|
37
65
|
/**
|
38
66
|
* @member {String} iconCls='fa fa-arrow-circle-up'
|
39
67
|
*/
|
@@ -47,19 +75,27 @@ class Button extends BaseButton {
|
|
47
75
|
* @member {String|null} isSorted_=null
|
48
76
|
* @protected
|
49
77
|
*/
|
50
|
-
isSorted_: null
|
78
|
+
isSorted_: null,
|
79
|
+
/**
|
80
|
+
* @member {Function|String|null} renderer_='cellRenderer'
|
81
|
+
*/
|
82
|
+
renderer_: 'cellRenderer',
|
83
|
+
/**
|
84
|
+
* Scope to execute the column renderer.
|
85
|
+
* Defaults to the matching grid.Container
|
86
|
+
* @member {Neo.core.Base|null} rendererScope=null
|
87
|
+
*/
|
88
|
+
rendererScope: null,
|
89
|
+
/**
|
90
|
+
* @member {Boolean} showHeaderFilter_=false
|
91
|
+
*/
|
92
|
+
showHeaderFilter_: false,
|
93
|
+
/**
|
94
|
+
* @member {Boolean} sortable_=true
|
95
|
+
*/
|
96
|
+
sortable_: true
|
51
97
|
}
|
52
98
|
|
53
|
-
/**
|
54
|
-
* Sort direction when clicking on an unsorted button
|
55
|
-
* @member {String} defaultSortDirection='ASC'
|
56
|
-
*/
|
57
|
-
defaultSortDirection = 'ASC'
|
58
|
-
/**
|
59
|
-
* @member {String|null} field=null
|
60
|
-
*/
|
61
|
-
field = null
|
62
|
-
|
63
99
|
/**
|
64
100
|
* @param {Object} config
|
65
101
|
*/
|
@@ -68,46 +104,146 @@ class Button extends BaseButton {
|
|
68
104
|
|
69
105
|
let me = this;
|
70
106
|
|
71
|
-
me.addDomListeners({
|
72
|
-
|
73
|
-
|
107
|
+
me.draggable && me.addDomListeners({
|
108
|
+
dragend : me.onDragEnd,
|
109
|
+
dragenter: me.onDragEnter,
|
110
|
+
dragleave: me.onDragLeave,
|
111
|
+
dragover : me.onDragOver,
|
112
|
+
dragstart: me.onDragStart,
|
113
|
+
drop : me.onDrop,
|
114
|
+
scope : me
|
74
115
|
})
|
75
116
|
}
|
76
117
|
|
77
118
|
/**
|
78
|
-
* Triggered after the
|
119
|
+
* Triggered after the draggable config got changed
|
79
120
|
* @param {Boolean} value
|
80
121
|
* @param {Boolean} oldValue
|
81
122
|
* @protected
|
82
123
|
*/
|
124
|
+
afterSetDraggable(value, oldValue) {
|
125
|
+
let me = this;
|
126
|
+
|
127
|
+
if (value === true) {
|
128
|
+
me.getVdomRoot().draggable = true
|
129
|
+
} else {
|
130
|
+
delete me.getVdomRoot().draggable
|
131
|
+
}
|
132
|
+
|
133
|
+
me.update()
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* Triggered after the isSorted config got changed
|
138
|
+
* @param {String|null} value
|
139
|
+
* @param {String|null} oldValue
|
140
|
+
* @protected
|
141
|
+
*/
|
83
142
|
afterSetIsSorted(value, oldValue) {
|
84
|
-
let me
|
85
|
-
{cls}
|
143
|
+
let me = this,
|
144
|
+
{cls} = me,
|
145
|
+
container = me.up('grid-container');
|
86
146
|
|
87
147
|
switch(value) {
|
88
148
|
case null:
|
89
149
|
NeoArray.add(cls, 'neo-sort-hidden');
|
90
|
-
break
|
150
|
+
break
|
91
151
|
case 'ASC':
|
92
152
|
NeoArray.remove(cls, 'neo-sort-desc');
|
93
153
|
NeoArray.remove(cls, 'neo-sort-hidden');
|
94
154
|
NeoArray.add(cls, 'neo-sort-asc');
|
95
|
-
break
|
155
|
+
break
|
96
156
|
case 'DESC':
|
97
157
|
NeoArray.remove(cls, 'neo-sort-asc');
|
98
158
|
NeoArray.remove(cls, 'neo-sort-hidden');
|
99
159
|
NeoArray.add(cls, 'neo-sort-desc');
|
100
|
-
break
|
160
|
+
break
|
101
161
|
}
|
102
162
|
|
103
163
|
me.cls = cls;
|
104
164
|
|
165
|
+
// testing check until all example grids have a store
|
166
|
+
if (!container || !container.store) {
|
167
|
+
return
|
168
|
+
}
|
169
|
+
|
105
170
|
me.mounted && me.fire('sort', {
|
106
171
|
direction: value,
|
107
|
-
property : me.
|
172
|
+
property : me.dataField
|
108
173
|
})
|
109
174
|
}
|
110
175
|
|
176
|
+
/**
|
177
|
+
* Triggered after the showHeaderFilter config got changed
|
178
|
+
* @param {Boolean} value
|
179
|
+
* @param {Boolean} oldValue
|
180
|
+
* @protected
|
181
|
+
*/
|
182
|
+
afterSetShowHeaderFilter(value, oldValue) {
|
183
|
+
let me = this;
|
184
|
+
|
185
|
+
if (value) {
|
186
|
+
if (!me.filterField) {
|
187
|
+
me.filterField = Neo.create({
|
188
|
+
module : TextField,
|
189
|
+
appName : me.appName,
|
190
|
+
flag : 'filter-field',
|
191
|
+
hideLabel: true,
|
192
|
+
parentId : me.id,
|
193
|
+
style : {marginLeft: '.5em', marginRight: '.5em'},
|
194
|
+
windowId : me.windowId,
|
195
|
+
|
196
|
+
listeners: {
|
197
|
+
change : me.changeFilterValue,
|
198
|
+
operatorChange: me.changeFilterOperator,
|
199
|
+
scope : me
|
200
|
+
},
|
201
|
+
|
202
|
+
...me.editorConfig
|
203
|
+
});
|
204
|
+
|
205
|
+
me.vdom.cn.push(me.filterField.createVdomReference())
|
206
|
+
} else {
|
207
|
+
delete me.filterField.vdom.removeDom
|
208
|
+
}
|
209
|
+
} else if (me.filterField) {
|
210
|
+
me.filterField.vdom.removeDom = true
|
211
|
+
}
|
212
|
+
|
213
|
+
me.updateDepth = 2;
|
214
|
+
me.update()
|
215
|
+
}
|
216
|
+
|
217
|
+
/**
|
218
|
+
* Triggered after the sortable config got changed
|
219
|
+
* @param {Boolean} value
|
220
|
+
* @param {Boolean} oldValue
|
221
|
+
* @protected
|
222
|
+
*/
|
223
|
+
afterSetSortable(value, oldValue) {
|
224
|
+
let me = this,
|
225
|
+
{cls} = me;
|
226
|
+
|
227
|
+
if (value === true) {
|
228
|
+
NeoArray.remove(cls, 'neo-sort-hidden');
|
229
|
+
|
230
|
+
me.addDomListeners({
|
231
|
+
click: me.onButtonClick,
|
232
|
+
scope: me
|
233
|
+
})
|
234
|
+
} else {
|
235
|
+
NeoArray.add(cls, 'neo-sort-hidden');
|
236
|
+
|
237
|
+
me.removeDomListeners({
|
238
|
+
click: me.onButtonClick,
|
239
|
+
scope: me
|
240
|
+
})
|
241
|
+
}
|
242
|
+
|
243
|
+
me.cls = cls;
|
244
|
+
me.update()
|
245
|
+
}
|
246
|
+
|
111
247
|
/**
|
112
248
|
* Triggered before the cellAlign config gets changed
|
113
249
|
* @param {String} value
|
@@ -118,6 +254,39 @@ class Button extends BaseButton {
|
|
118
254
|
return this.beforeSetEnumValue(value, oldValue, 'cellAlign', 'cellAlignValues')
|
119
255
|
}
|
120
256
|
|
257
|
+
/**
|
258
|
+
* Triggered before the renderer config gets changed
|
259
|
+
* @param {Function|String|null} value
|
260
|
+
* @param {Function|String|null} oldValue
|
261
|
+
* @protected
|
262
|
+
*/
|
263
|
+
beforeSetRenderer(value, oldValue) {
|
264
|
+
return resolveCallback(value, this).fn
|
265
|
+
}
|
266
|
+
|
267
|
+
/**
|
268
|
+
* @param {Object} data
|
269
|
+
* @param {Neo.button.Base} data.column
|
270
|
+
* @param {String} data.dataField
|
271
|
+
* @param {Neo.grid.Container} data.gridContainer
|
272
|
+
* @param {Number} data.index
|
273
|
+
* @param {Object} data.record
|
274
|
+
* @param {Number|String} data.value
|
275
|
+
* @returns {*}
|
276
|
+
*/
|
277
|
+
cellRenderer(data) {
|
278
|
+
return data.value
|
279
|
+
}
|
280
|
+
|
281
|
+
/**
|
282
|
+
*
|
283
|
+
*/
|
284
|
+
destroy(...args) {
|
285
|
+
this.filterField?.destroy();
|
286
|
+
|
287
|
+
super.destroy(...args)
|
288
|
+
}
|
289
|
+
|
121
290
|
/**
|
122
291
|
* @protected
|
123
292
|
*/
|
@@ -145,26 +314,148 @@ class Button extends BaseButton {
|
|
145
314
|
/**
|
146
315
|
* @protected
|
147
316
|
*/
|
148
|
-
|
317
|
+
onDragEnd() {
|
318
|
+
let me = this,
|
319
|
+
{style} = me;
|
320
|
+
|
321
|
+
delete style.opacity;
|
322
|
+
me.style = style
|
323
|
+
}
|
324
|
+
|
325
|
+
/**
|
326
|
+
* @protected
|
327
|
+
*/
|
328
|
+
onDragEnter() {
|
149
329
|
let me = this,
|
150
330
|
{cls} = me;
|
151
331
|
|
152
|
-
NeoArray.add(cls, 'neo-
|
332
|
+
NeoArray.add(cls, 'neo-drag-over');
|
333
|
+
me.cls = cls
|
334
|
+
}
|
153
335
|
|
154
|
-
|
155
|
-
|
336
|
+
/**
|
337
|
+
* @protected
|
338
|
+
*/
|
339
|
+
onDragLeave() {
|
340
|
+
let me = this,
|
341
|
+
{cls} = me;
|
342
|
+
|
343
|
+
NeoArray.remove(cls, 'neo-drag-over');
|
344
|
+
me.cls = cls
|
345
|
+
}
|
346
|
+
|
347
|
+
/**
|
348
|
+
* @param {Object} event
|
349
|
+
*/
|
350
|
+
onDragOver(event) {
|
351
|
+
//console.log('onDragOver', event);
|
352
|
+
}
|
353
|
+
|
354
|
+
/**
|
355
|
+
* @protected
|
356
|
+
*/
|
357
|
+
onDragStart() {
|
358
|
+
let me = this,
|
359
|
+
{style} = me;
|
360
|
+
|
361
|
+
style.opacity = 0.4;
|
362
|
+
me.style = style
|
156
363
|
}
|
157
364
|
|
158
365
|
/**
|
159
366
|
* @param {Object} data
|
160
|
-
* @param {String} data.field
|
161
|
-
* @param {Number} data.index
|
162
|
-
* @param {Object} data.record
|
163
|
-
* @param {Number|String} data.value
|
164
|
-
* @returns {*}
|
165
367
|
*/
|
166
|
-
|
167
|
-
|
368
|
+
onDrop(data) {
|
369
|
+
let me = this,
|
370
|
+
headerToolbar = me.parent,
|
371
|
+
{style} = me,
|
372
|
+
gridContainer = headerToolbar.parent;
|
373
|
+
|
374
|
+
me.onDragLeave();
|
375
|
+
headerToolbar.switchItems(me.id, data.srcId);
|
376
|
+
gridContainer.createViewData(gridContainer.store.data);
|
377
|
+
|
378
|
+
style.opacity = 1;
|
379
|
+
me.style = style
|
380
|
+
}
|
381
|
+
|
382
|
+
/**
|
383
|
+
* @param {Object} data
|
384
|
+
*/
|
385
|
+
changeFilterOperator(data) {
|
386
|
+
let me = this,
|
387
|
+
gridContainer = me.up('grid-container'),
|
388
|
+
store = gridContainer?.store,
|
389
|
+
operator = data.value,
|
390
|
+
filter, filters;
|
391
|
+
|
392
|
+
if (store) {
|
393
|
+
filter = store.getFilter(me.dataField);
|
394
|
+
|
395
|
+
if (!filter) {
|
396
|
+
filters = store.filters;
|
397
|
+
|
398
|
+
filters.push({
|
399
|
+
property: me.dataField,
|
400
|
+
operator,
|
401
|
+
value : null,
|
402
|
+
...me.filterConfig
|
403
|
+
});
|
404
|
+
|
405
|
+
store.filters = filters
|
406
|
+
} else {
|
407
|
+
filter.operator = operator
|
408
|
+
}
|
409
|
+
}
|
410
|
+
}
|
411
|
+
|
412
|
+
/**
|
413
|
+
* @param {Object} data
|
414
|
+
*/
|
415
|
+
changeFilterValue(data) {
|
416
|
+
let me = this,
|
417
|
+
gridContainer = me.up('grid-container'),
|
418
|
+
store = gridContainer?.store,
|
419
|
+
{value} = data,
|
420
|
+
field, filter, filters, model;
|
421
|
+
|
422
|
+
if (store) {
|
423
|
+
filter = store.getFilter(me.dataField);
|
424
|
+
model = store.model;
|
425
|
+
field = model && model.getField(me.dataField);
|
426
|
+
|
427
|
+
if (value && field.type.toLowerCase() === 'date') {
|
428
|
+
value = new Date(value)
|
429
|
+
}
|
430
|
+
|
431
|
+
if (!filter) {
|
432
|
+
filters = store.filters;
|
433
|
+
|
434
|
+
filters.push({
|
435
|
+
property: me.dataField,
|
436
|
+
operator: 'like',
|
437
|
+
value,
|
438
|
+
...me.filterConfig
|
439
|
+
});
|
440
|
+
|
441
|
+
store.filters = filters
|
442
|
+
} else {
|
443
|
+
filter.value = value
|
444
|
+
}
|
445
|
+
}
|
446
|
+
}
|
447
|
+
|
448
|
+
/**
|
449
|
+
* @protected
|
450
|
+
*/
|
451
|
+
removeSortingCss() {
|
452
|
+
let me = this,
|
453
|
+
{cls} = me;
|
454
|
+
|
455
|
+
NeoArray.add(cls, 'neo-sort-hidden');
|
456
|
+
|
457
|
+
me.cls = cls;
|
458
|
+
me._isSorted = null
|
168
459
|
}
|
169
460
|
}
|
170
461
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import BaseToolbar from '../../toolbar/Base.mjs';
|
2
|
+
import NeoArray from '../../util/Array.mjs';
|
2
3
|
|
3
4
|
/**
|
4
5
|
* @class Neo.grid.header.Toolbar
|
@@ -21,11 +22,59 @@ class Toolbar extends BaseToolbar {
|
|
21
22
|
*/
|
22
23
|
baseCls: ['neo-grid-header-toolbar', 'neo-toolbar'],
|
23
24
|
/**
|
24
|
-
* @member {Object} itemDefaults={ntype:'grid-header-button'}
|
25
|
-
* @protected
|
25
|
+
* @member {Object} itemDefaults={ntype: 'grid-header-button'}
|
26
26
|
*/
|
27
27
|
itemDefaults: {
|
28
28
|
ntype: 'grid-header-button'
|
29
|
+
},
|
30
|
+
/**
|
31
|
+
* @member {Boolean} showHeaderFilters_=false
|
32
|
+
*/
|
33
|
+
showHeaderFilters_: false,
|
34
|
+
/**
|
35
|
+
* @member {Boolean} sortable=true
|
36
|
+
*/
|
37
|
+
sortable: true
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Triggered after the showHeaderFilters config got changed
|
42
|
+
* @param {Boolean} value
|
43
|
+
* @param {Boolean} oldValue
|
44
|
+
* @protected
|
45
|
+
*/
|
46
|
+
afterSetShowHeaderFilters(value, oldValue) {
|
47
|
+
if (oldValue !== undefined) {
|
48
|
+
let me = this;
|
49
|
+
|
50
|
+
me.items.forEach(item => {
|
51
|
+
item.setSilent({
|
52
|
+
showHeaderFilter: value
|
53
|
+
})
|
54
|
+
});
|
55
|
+
|
56
|
+
me.updateDepth = -1; // filters can be deeply nested
|
57
|
+
me.update()
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Triggered after the sortable config got changed
|
63
|
+
* @param {Boolean} value
|
64
|
+
* @param {Boolean} oldValue
|
65
|
+
* @protected
|
66
|
+
*/
|
67
|
+
afterSetSortable(value, oldValue) {
|
68
|
+
if (oldValue !== undefined) {
|
69
|
+
let me = this;
|
70
|
+
|
71
|
+
me.items.forEach(item => {
|
72
|
+
item.setSilent({
|
73
|
+
sortable: value
|
74
|
+
})
|
75
|
+
});
|
76
|
+
|
77
|
+
me.update()
|
29
78
|
}
|
30
79
|
}
|
31
80
|
|
@@ -41,7 +90,7 @@ class Toolbar extends BaseToolbar {
|
|
41
90
|
|
42
91
|
let dockLeftWidth = 0,
|
43
92
|
dockRightWidth = 0,
|
44
|
-
items
|
93
|
+
{items} = me,
|
45
94
|
len = items.length,
|
46
95
|
style;
|
47
96
|
|
@@ -54,7 +103,7 @@ class Toolbar extends BaseToolbar {
|
|
54
103
|
if (item.width) {style.width = item.width + 'px'}
|
55
104
|
|
56
105
|
if (item.dock) {
|
57
|
-
item.vdom.cls
|
106
|
+
NeoArray.add(item.vdom.cls, 'neo-locked');
|
58
107
|
|
59
108
|
if (item.dock === 'left') {
|
60
109
|
style.left = dockLeftWidth + 'px'
|
@@ -63,6 +112,7 @@ class Toolbar extends BaseToolbar {
|
|
63
112
|
dockLeftWidth += (item.width + 1) // todo: borders fix
|
64
113
|
}
|
65
114
|
|
115
|
+
item.sortable = me.sortable;
|
66
116
|
item.wrapperStyle = style;
|
67
117
|
|
68
118
|
// inverse loop direction
|
@@ -80,6 +130,20 @@ class Toolbar extends BaseToolbar {
|
|
80
130
|
|
81
131
|
me.update()
|
82
132
|
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* @param {String} dataField
|
136
|
+
* @returns {Neo.button.Base|null}
|
137
|
+
*/
|
138
|
+
getColumn(dataField) {
|
139
|
+
for (const item of this.items) {
|
140
|
+
if (item.dataField === dataField) {
|
141
|
+
return item
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
return null
|
146
|
+
}
|
83
147
|
}
|
84
148
|
|
85
149
|
export default Neo.setupClass(Toolbar);
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import BaseCellEditing from '../../table/plugin/CellEditing.mjs';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @class Neo.grid.plugin.CellEditing
|
5
|
+
* @extends Neo.table.plugin.CellEditing
|
6
|
+
*/
|
7
|
+
class CellEditing extends BaseCellEditing {
|
8
|
+
static config = {
|
9
|
+
/**
|
10
|
+
* @member {String} className='Neo.grid.plugin.CellEditing'
|
11
|
+
* @protected
|
12
|
+
*/
|
13
|
+
className: 'Neo.grid.plugin.CellEditing',
|
14
|
+
/**
|
15
|
+
* @member {String} ntype='plugin-grid-cell-editing'
|
16
|
+
* @protected
|
17
|
+
*/
|
18
|
+
ntype: 'plugin-grid-cell-editing',
|
19
|
+
/**
|
20
|
+
* @member {String} cellCls='neo-grid-cell'
|
21
|
+
*/
|
22
|
+
cellCls: 'neo-grid-cell',
|
23
|
+
/**
|
24
|
+
* @member {String[]} editorCls=['neo-grid-editor']
|
25
|
+
*/
|
26
|
+
editorCls: ['neo-grid-editor']
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
export default Neo.setupClass(CellEditing);
|
package/src/main/DomEvents.mjs
CHANGED
@@ -541,19 +541,28 @@ class DomEvents extends Base {
|
|
541
541
|
* @param {KeyboardEvent} event
|
542
542
|
*/
|
543
543
|
onKeyDown(event) {
|
544
|
-
let
|
544
|
+
let me = this,
|
545
|
+
{target} = event,
|
545
546
|
{tagName} = target,
|
546
547
|
isInput = tagName === 'INPUT' || tagName === 'TEXTAREA';
|
547
548
|
|
548
549
|
if (isInput && disabledInputKeys[target.id]?.includes(event.key)) {
|
549
550
|
event.preventDefault()
|
550
551
|
} else {
|
551
|
-
|
552
|
+
me.sendMessageToApp(me.getKeyboardEventData(event));
|
553
|
+
|
554
|
+
if (
|
555
|
+
isInput &&
|
556
|
+
event.key === 'Tab' &&
|
557
|
+
me.testPathInclusion(event, ['neo-table-editor'], true)
|
558
|
+
) {
|
559
|
+
event.preventDefault()
|
560
|
+
}
|
552
561
|
|
553
562
|
if (
|
554
563
|
!isInput &&
|
555
564
|
['ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowUp'].includes(event.key) &&
|
556
|
-
|
565
|
+
me.testPathInclusion(event, ['neo-selection'], true)
|
557
566
|
) {
|
558
567
|
event.preventDefault()
|
559
568
|
}
|
package/src/manager/Focus.mjs
CHANGED
@@ -35,9 +35,9 @@ class Focus extends CoreBase {
|
|
35
35
|
/**
|
36
36
|
* The amount of time for a focusIn to occur after the last focusOut
|
37
37
|
* to get combined into a focusmove event.
|
38
|
-
* @member {Number} maxFocusInOutGap=
|
38
|
+
* @member {Number} maxFocusInOutGap=50
|
39
39
|
*/
|
40
|
-
maxFocusInOutGap:
|
40
|
+
maxFocusInOutGap: 50,
|
41
41
|
/**
|
42
42
|
* The maximum amount of items stored inside the history array
|
43
43
|
* @member {Number} maxHistoryLength=20
|
package/src/plugin/Base.mjs
CHANGED
@@ -24,7 +24,11 @@ class Base extends CoreBase {
|
|
24
24
|
* @member {Neo.component.Base} owner=null
|
25
25
|
* @protected
|
26
26
|
*/
|
27
|
-
owner: null
|
27
|
+
owner: null,
|
28
|
+
/**
|
29
|
+
* @member {Number|null} windowId_=null
|
30
|
+
*/
|
31
|
+
windowId_: null
|
28
32
|
}
|
29
33
|
|
30
34
|
/**
|
@@ -42,6 +46,16 @@ class Base extends CoreBase {
|
|
42
46
|
}
|
43
47
|
}
|
44
48
|
|
49
|
+
/**
|
50
|
+
* Triggered after the windowId config got changed
|
51
|
+
* @param {Number|null} value
|
52
|
+
* @param {Number|null} oldValue
|
53
|
+
* @protected
|
54
|
+
*/
|
55
|
+
afterSetWindowId(value, oldValue) {
|
56
|
+
value && Neo.currentWorker.insertThemeFiles(value, this.__proto__)
|
57
|
+
}
|
58
|
+
|
45
59
|
/**
|
46
60
|
* Override this method to apply changes to the owner Component when it does get mounted
|
47
61
|
*/
|
package/src/plugin/Resizable.mjs
CHANGED
package/src/selection/Model.mjs
CHANGED
@@ -88,7 +88,7 @@ class CellColumnModel extends CellModel {
|
|
88
88
|
idArray = ColumnModel.getCellId(data.path).split('__'),
|
89
89
|
currentColumn = idArray[2],
|
90
90
|
{view} = me,
|
91
|
-
fields = view.columns.map(c => c.
|
91
|
+
fields = view.columns.map(c => c.dataField),
|
92
92
|
newIndex = (fields.indexOf(currentColumn) + step) % fields.length,
|
93
93
|
columnNodeIds, tbodyNode;
|
94
94
|
|