neo.mjs 8.0.1 → 8.1.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.
Files changed (50) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/index.html +1 -1
  3. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  4. package/examples/ServiceWorker.mjs +2 -2
  5. package/examples/grid/covid/neo-config.json +6 -5
  6. package/package.json +5 -5
  7. package/resources/scss/src/examples/grid/covid/GridContainer.scss +1 -1
  8. package/resources/scss/src/grid/Container.scss +13 -10
  9. package/resources/scss/src/grid/View.scss +45 -19
  10. package/resources/scss/src/grid/header/Button.scss +2 -4
  11. package/resources/scss/src/grid/header/Toolbar.scss +2 -3
  12. package/src/DefaultConfig.mjs +2 -2
  13. package/src/Xhr.mjs +1 -1
  14. package/src/button/Base.mjs +2 -2
  15. package/src/collection/Base.mjs +5 -5
  16. package/src/component/Base.mjs +3 -3
  17. package/src/container/Base.mjs +2 -2
  18. package/src/controller/Base.mjs +3 -3
  19. package/src/dialog/Base.mjs +2 -2
  20. package/src/form/field/Base.mjs +2 -2
  21. package/src/form/field/CheckBox.mjs +2 -2
  22. package/src/form/field/FileUpload.mjs +4 -4
  23. package/src/form/field/Hidden.mjs +2 -2
  24. package/src/form/field/Text.mjs +2 -2
  25. package/src/grid/Container.mjs +156 -62
  26. package/src/grid/View.mjs +396 -74
  27. package/src/grid/header/Button.mjs +6 -2
  28. package/src/grid/header/Toolbar.mjs +48 -4
  29. package/src/layout/Base.mjs +3 -3
  30. package/src/list/Base.mjs +2 -2
  31. package/src/list/Circle.mjs +2 -2
  32. package/src/list/Color.mjs +2 -2
  33. package/src/list/Component.mjs +2 -2
  34. package/src/manager/Base.mjs +3 -3
  35. package/src/manager/Component.mjs +20 -11
  36. package/src/manager/DomEvent.mjs +5 -6
  37. package/src/manager/Instance.mjs +4 -4
  38. package/src/manager/Task.mjs +2 -2
  39. package/src/manager/Toast.mjs +3 -3
  40. package/src/plugin/Base.mjs +3 -3
  41. package/src/plugin/Popover.mjs +3 -3
  42. package/src/plugin/PrefixField.mjs +2 -2
  43. package/src/plugin/Resizable.mjs +2 -2
  44. package/src/plugin/Responsive.mjs +2 -2
  45. package/src/selection/Model.mjs +12 -1
  46. package/src/toolbar/Base.mjs +2 -2
  47. package/src/toolbar/Breadcrumb.mjs +1 -1
  48. package/src/tooltip/Base.mjs +2 -2
  49. package/src/worker/Base.mjs +3 -3
  50. package/src/grid/README.md +0 -3
@@ -1,17 +1,24 @@
1
1
  import BaseContainer from '../container/Base.mjs';
2
2
  import ClassSystemUtil from '../util/ClassSystem.mjs';
3
- import CssUtil from '../util/Css.mjs';
4
- import NeoArray from '../util/Array.mjs';
3
+ import GridView from './View.mjs';
5
4
  import RowModel from '../selection/grid/RowModel.mjs';
6
5
  import Store from '../data/Store.mjs';
7
- import View from './View.mjs';
8
6
  import * as header from './header/_export.mjs';
9
7
 
10
8
  /**
11
9
  * @class Neo.grid.Container
12
10
  * @extends Neo.container.Base
13
11
  */
14
- class Container extends BaseContainer {
12
+ class GridContainer extends BaseContainer {
13
+ /**
14
+ * @member {Object} delayable
15
+ * @protected
16
+ * @static
17
+ */
18
+ static delayable = {
19
+ onResize: {type: 'buffer', timer: 300}
20
+ }
21
+
15
22
  static config = {
16
23
  /**
17
24
  * @member {String} className='Neo.grid.Container'
@@ -25,10 +32,11 @@ class Container extends BaseContainer {
25
32
  ntype: 'grid-container',
26
33
  /**
27
34
  * @member {String[]} baseCls=['neo-grid-container']
35
+ * @protected
28
36
  */
29
37
  baseCls: ['neo-grid-container'],
30
38
  /**
31
- * true uses table.plugin.CellEditing
39
+ * true uses grid.plugin.CellEditing
32
40
  * @member {Boolean} cellEditing_=false
33
41
  */
34
42
  cellEditing_: false,
@@ -42,7 +50,7 @@ class Container extends BaseContainer {
42
50
  */
43
51
  columns_: [],
44
52
  /**
45
- * Configs for Neo.table.header.Toolbar
53
+ * Configs for Neo.grid.header.Toolbar
46
54
  * @member {Object|null} [headerToolbarConfig=null]
47
55
  */
48
56
  headerToolbarConfig: null,
@@ -60,10 +68,19 @@ class Container extends BaseContainer {
60
68
  */
61
69
  layout: 'base',
62
70
  /**
63
- * @member {Boolean} scrollbarsCssApplied=false
71
+ * @member {String} role='grid'
72
+ */
73
+ role: 'grid',
74
+ /**
75
+ * Number in px
76
+ * @member {Number} rowHeight_=32
77
+ */
78
+ rowHeight_: 32,
79
+ /**
80
+ * @member {String|null} scrollbarId_=null
64
81
  * @protected
65
82
  */
66
- scrollbarsCssApplied: false,
83
+ scrollbarId_: null,
67
84
  /**
68
85
  * @member {Neo.selection.Model} selectionModel_=null
69
86
  */
@@ -81,12 +98,7 @@ class Container extends BaseContainer {
81
98
  */
82
99
  store_: null,
83
100
  /**
84
- * todo: only works for chrome & safari -> add a check
85
- * @member {Boolean} useCustomScrollbars_=true
86
- */
87
- useCustomScrollbars_: true,
88
- /**
89
- * Configs for Neo.table.View
101
+ * Configs for Neo.grid.View
90
102
  * @member {Object|null} [viewConfig=null]
91
103
  */
92
104
  viewConfig: null,
@@ -105,21 +117,35 @@ class Container extends BaseContainer {
105
117
  */
106
118
  _vdom:
107
119
  {cls: ['neo-grid-wrapper'], cn: [
108
- {cn: []}
120
+ {'aria-rowcount': 1, cn: []} // aria-rowcount includes the column headers
109
121
  ]}
110
122
  }
111
123
 
124
+ /**
125
+ * We do not need the first event to trigger logic, since afterSetMounted() handles this
126
+ * @member {Boolean}} initialResizeEvent=true
127
+ */
128
+ initialResizeEvent = true
129
+
112
130
  /**
113
131
  * Convenience method to access the Neo.grid.header.Toolbar
114
- * @returns {Neo.table.header.Toolbar|null}
132
+ * @returns {Neo.grid.header.Toolbar|null}
115
133
  */
116
134
  get headerToolbar() {
117
135
  return Neo.getComponent(this.headerToolbarId) || Neo.get(this.headerToolbarId)
118
136
  }
119
137
 
138
+ /**
139
+ * Convenience method to access the Neo.grid.Scrollbar
140
+ * @returns {Neo.grid.Scrollbar|null}
141
+ */
142
+ get scrollbar() {
143
+ return Neo.getComponent(this.scrollbarId) || Neo.get(this.scrollbarId)
144
+ }
145
+
120
146
  /**
121
147
  * Convenience method to access the Neo.grid.View
122
- * @returns {Neo.table.View|null}
148
+ * @returns {Neo.grid.View|null}
123
149
  */
124
150
  get view() {
125
151
  return Neo.getComponent(this.viewId) || Neo.get(this.viewId)
@@ -131,28 +157,38 @@ class Container extends BaseContainer {
131
157
  construct(config) {
132
158
  super.construct(config);
133
159
 
134
- let me = this;
160
+ let me = this,
161
+ {rowHeight, store} = me;
135
162
 
136
163
  me.headerToolbarId = Neo.getId('grid-header-toolbar');
164
+ me.scrollbarId = Neo.getId('grid-scrollbar');
137
165
  me.viewId = Neo.getId('grid-view');
138
166
 
139
167
  me.items = [{
140
168
  module : header.Toolbar,
169
+ gridContainer : me,
141
170
  id : me.headerToolbarId,
142
171
  showHeaderFilters: me.showHeaderFilters,
143
172
  sortable : me.sortable,
144
173
  ...me.headerToolbarConfig
145
174
  }, {
146
- module : View,
175
+ module : GridView,
147
176
  containerId: me.id,
148
177
  id : me.viewId,
149
- store : me.store,
178
+ rowHeight,
179
+ store,
150
180
  ...me.viewConfig
151
181
  }];
152
182
 
153
183
  me.vdom.id = me.getWrapperId();
154
184
 
155
- me.createColumns(me.columns)
185
+ me.createColumns(me.columns);
186
+
187
+ me.addDomListeners({
188
+ resize: me.onResize,
189
+ scroll: me.onScroll,
190
+ scope : me
191
+ })
156
192
  }
157
193
 
158
194
  /**
@@ -199,6 +235,48 @@ class Container extends BaseContainer {
199
235
  }
200
236
  }
201
237
 
238
+ /**
239
+ * Triggered after the mounted config got changed
240
+ * @param {Boolean} value
241
+ * @param {Boolean} oldValue
242
+ * @protected
243
+ */
244
+ afterSetMounted(value, oldValue) {
245
+ super.afterSetMounted(value, oldValue);
246
+
247
+ let me = this,
248
+ {ResizeObserver} = Neo.main.addon,
249
+ resizeParams = {id: me.id, windowId: me.windowId};
250
+
251
+ if (value) {
252
+ ResizeObserver.register(resizeParams);
253
+ me.passSizeToView()
254
+ } else if (!value && oldValue) { // unmount
255
+ me.initialResizeEvent = true;
256
+ ResizeObserver.unregister(resizeParams)
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Triggered after the rowHeight config got changed
262
+ * @param {Number} value
263
+ * @param {Number} oldValue
264
+ * @protected
265
+ */
266
+ afterSetRowHeight(value, oldValue) {
267
+ if (value > 0) {
268
+ let {scrollbar, view} = this;
269
+
270
+ if (scrollbar) {
271
+ scrollbar.rowHeight = value
272
+ }
273
+
274
+ if (view) {
275
+ view.rowHeight = value
276
+ }
277
+ }
278
+ }
279
+
202
280
  /**
203
281
  * Triggered after the selectionModel config got changed
204
282
  * @param {Neo.selection.Model} value
@@ -233,41 +311,6 @@ class Container extends BaseContainer {
233
311
  }
234
312
  }
235
313
 
236
- /**
237
- * Triggered after the useCustomScrollbars config got changed
238
- * @param {Boolean} value
239
- * @param {Boolean} oldValue
240
- * @protected
241
- */
242
- afterSetUseCustomScrollbars(value, oldValue) {
243
- if (value === true) {
244
- this.vdom.cls = NeoArray.union(this.vdom.cls, ['neo-use-custom-scrollbar'])
245
- }
246
- }
247
-
248
- /**
249
- * @protected
250
- */
251
- applyCustomScrollbarsCss() {
252
- let me = this,
253
- id = me.getWrapperId(),
254
- cssRules = [];
255
-
256
- if (me.dockLeftMargin) {
257
- cssRules.push('#' + id + '::-webkit-scrollbar-track:horizontal {margin-left: ' + me.dockLeftMargin + 'px;}')
258
- }
259
-
260
- if (me.dockRightMargin) {
261
- cssRules.push('#' + id + '::-webkit-scrollbar-track:horizontal {margin-right: ' + me.dockRightMargin + 'px;}')
262
- }
263
-
264
- if (cssRules.length > 0) {
265
- CssUtil.insertRules(me.appName, cssRules)
266
- }
267
-
268
- me.scrollbarsCssApplied = true
269
- }
270
-
271
314
  /**
272
315
  * Triggered before the columns config gets changed.
273
316
  * @param {Object[]} value
@@ -385,7 +428,7 @@ class Container extends BaseContainer {
385
428
  renderer;
386
429
 
387
430
  if (!columns || !columns.length) {
388
- Neo.logError('Attempting to create a table.Container without defined columns', me.id);
431
+ Neo.logError('Attempting to create a grid.Container without defined columns', me.id);
389
432
  }
390
433
 
391
434
  columns.forEach(column => {
@@ -424,11 +467,24 @@ class Container extends BaseContainer {
424
467
  createViewData(inputData) {
425
468
  let me = this;
426
469
 
427
- me.view.createViewData(inputData);
470
+ me.getVdomRoot()['aria-rowcount'] = inputData.length + 2; // 1 based & the header row counts as well
471
+ me.update();
428
472
 
429
- if (me.useCustomScrollbars && me.scrollbarsCssApplied === false) {
430
- me.applyCustomScrollbarsCss()
431
- }
473
+ me.view.createViewData()
474
+ }
475
+
476
+ /**
477
+ * @param args
478
+ */
479
+ destroy(...args) {
480
+ let me = this;
481
+
482
+ me.mounted && Neo.main.addon.ResizeObserver.unregister({
483
+ id : me.id,
484
+ windowId: me.windowId
485
+ });
486
+
487
+ super.destroy(...args)
432
488
  }
433
489
 
434
490
  /**
@@ -469,6 +525,30 @@ class Container extends BaseContainer {
469
525
  this.selectionModel?.register(this)
470
526
  }
471
527
 
528
+ /**
529
+ * @param {Object} data
530
+ */
531
+ async onResize(data) {
532
+ let me = this;
533
+
534
+ if (!me.initialResizeEvent) {
535
+ await me.passSizeToView(true);
536
+
537
+ me.view.updateVisibleColumns();
538
+
539
+ await me.headerToolbar.passSizeToView()
540
+ } else {
541
+ me.initialResizeEvent = false
542
+ }
543
+ }
544
+
545
+ /**
546
+ * @param {Object} data
547
+ */
548
+ onScroll(data) {
549
+ this.view.scrollPosition = {x: data.scrollLeft, y: this.view.scrollPosition.y}
550
+ }
551
+
472
552
  /**
473
553
  * @param {Object} opts
474
554
  * @param {String} opts.direction
@@ -526,6 +606,20 @@ class Container extends BaseContainer {
526
606
  this.view.onStoreRecordChange(opts)
527
607
  }
528
608
 
609
+ /**
610
+ * @param {Boolean} silent=false
611
+ * @returns {Promise<void>}
612
+ */
613
+ async passSizeToView(silent=false) {
614
+ let me = this,
615
+ [containerRect, headerRect] = await me.getDomRect([me.id, me.headerToolbarId]);
616
+
617
+ me.view[silent ? 'setSilent' : 'set']({
618
+ availableHeight: containerRect.height - headerRect.height,
619
+ containerWidth : containerRect.width
620
+ })
621
+ }
622
+
529
623
  /**
530
624
  * @param {String} dataField
531
625
  * @protected
@@ -539,4 +633,4 @@ class Container extends BaseContainer {
539
633
  }
540
634
  }
541
635
 
542
- export default Neo.setupClass(Container);
636
+ export default Neo.setupClass(GridContainer);