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
@@ -21,12 +21,20 @@ class Toolbar extends BaseToolbar {
21
21
  * @member {String[]} baseCls=['neo-grid-header-toolbar','neo-toolbar']
22
22
  */
23
23
  baseCls: ['neo-grid-header-toolbar', 'neo-toolbar'],
24
+ /**
25
+ * @member {Neo.grid.Container|null} gridContainer=null
26
+ */
27
+ gridContainer: null,
24
28
  /**
25
29
  * @member {Object} itemDefaults={ntype: 'grid-header-button'}
26
30
  */
27
31
  itemDefaults: {
28
32
  ntype: 'grid-header-button'
29
33
  },
34
+ /**
35
+ * @member {String} role='row'
36
+ */
37
+ role: 'row',
30
38
  /**
31
39
  * @member {Boolean} showHeaderFilters_=false
32
40
  */
@@ -34,7 +42,23 @@ class Toolbar extends BaseToolbar {
34
42
  /**
35
43
  * @member {Boolean} sortable=true
36
44
  */
37
- sortable: true
45
+ sortable: true,
46
+ /**
47
+ * @member {Object} _vdom
48
+ */
49
+ _vdom:
50
+ {'aria-rowindex': 1, cn: [{cn: []}]}
51
+ }
52
+
53
+ /**
54
+ * Triggered after the mounted config got changed
55
+ * @param {Boolean} value
56
+ * @param {Boolean} oldValue
57
+ * @protected
58
+ */
59
+ afterSetMounted(value, oldValue) {
60
+ super.afterSetMounted(value, oldValue);
61
+ value && this.passSizeToView()
38
62
  }
39
63
 
40
64
  /**
@@ -95,6 +119,8 @@ class Toolbar extends BaseToolbar {
95
119
  style;
96
120
 
97
121
  items.forEach((item, index) => {
122
+ item.vdom['aria-colindex'] = index + 1; // 1 based
123
+
98
124
  style = item.wrapperStyle;
99
125
 
100
126
  // todo: only add px if number
@@ -105,11 +131,12 @@ class Toolbar extends BaseToolbar {
105
131
  if (item.dock) {
106
132
  NeoArray.add(item.vdom.cls, 'neo-locked');
107
133
 
108
- if (item.dock === 'left') {
134
+ /*if (item.dock === 'left') {
109
135
  style.left = dockLeftWidth + 'px'
110
136
  }
111
137
 
112
138
  dockLeftWidth += (item.width + 1) // todo: borders fix
139
+ */
113
140
  }
114
141
 
115
142
  item.sortable = me.sortable;
@@ -118,14 +145,14 @@ class Toolbar extends BaseToolbar {
118
145
  // inverse loop direction
119
146
  item = items[len - index -1];
120
147
 
121
- if (item.dock === 'right') {
148
+ /*if (item.dock === 'right') {
122
149
  style = item.wrapperStyle;
123
150
  style.right = dockRightWidth + 'px';
124
151
 
125
152
  item.wrapperStyle = style;
126
153
 
127
154
  dockRightWidth += (item.width + 1) // todo: borders fix
128
- }
155
+ }*/
129
156
  });
130
157
 
131
158
  me.update()
@@ -144,6 +171,23 @@ class Toolbar extends BaseToolbar {
144
171
 
145
172
  return null
146
173
  }
174
+
175
+
176
+
177
+ /**
178
+ * @param {Boolean} silent=false
179
+ * @returns {Promise<void>}
180
+ */
181
+ async passSizeToView(silent=false) {
182
+ let me = this,
183
+ rects = await me.getDomRect(me.items.map(item => item.id)),
184
+ lastItem = rects[rects.length - 1];
185
+
186
+ me.gridContainer.view[silent ? 'setSilent' : 'set']({
187
+ availableWidth : lastItem.x + lastItem.width - rects[0].x,
188
+ columnPositions: rects.map(item => ({width: item.width, x: item.x - rects[0].x}))
189
+ })
190
+ }
147
191
  }
148
192
 
149
193
  export default Neo.setupClass(Toolbar);
@@ -1,4 +1,4 @@
1
- import CoreBase from '../core/Base.mjs';
1
+ import Base from '../core/Base.mjs';
2
2
  import NeoArray from '../util/Array.mjs';
3
3
 
4
4
  /**
@@ -7,7 +7,7 @@ import NeoArray from '../util/Array.mjs';
7
7
  * @class Neo.layout.Base
8
8
  * @extends Neo.core.Base
9
9
  */
10
- class Base extends CoreBase {
10
+ class Layout extends Base {
11
11
  static config = {
12
12
  /**
13
13
  * @member {String} className='Neo.layout.Base'
@@ -156,4 +156,4 @@ class Base extends CoreBase {
156
156
  }
157
157
  }
158
158
 
159
- export default Neo.setupClass(Base);
159
+ export default Neo.setupClass(Layout);
package/src/list/Base.mjs CHANGED
@@ -8,7 +8,7 @@ import Store from '../data/Store.mjs';
8
8
  * @class Neo.list.Base
9
9
  * @extends Neo.component.Base
10
10
  */
11
- class Base extends Component {
11
+ class List extends Component {
12
12
  static config = {
13
13
  /**
14
14
  * @member {String} className='Neo.list.Base'
@@ -848,4 +848,4 @@ class Base extends Component {
848
848
  }
849
849
  }
850
850
 
851
- export default Neo.setupClass(Base);
851
+ export default Neo.setupClass(List);
@@ -1,11 +1,11 @@
1
1
  import CircleComponent from '../component/Circle.mjs';
2
- import Component from './Component.mjs';
2
+ import ComponentList from './Component.mjs';
3
3
 
4
4
  /**
5
5
  * @class Neo.list.Circle
6
6
  * @extends Neo.list.Component
7
7
  */
8
- class Circle extends Component {
8
+ class Circle extends ComponentList {
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Neo.list.Circle'
@@ -1,10 +1,10 @@
1
- import Base from './Base.mjs';
1
+ import List from './Base.mjs';
2
2
 
3
3
  /**
4
4
  * @class Neo.list.Color
5
5
  * @extends Neo.list.Base
6
6
  */
7
- class Color extends Base {
7
+ class Color extends List {
8
8
  static config = {
9
9
  /**
10
10
  * @member {String} className='Neo.list.Color'
@@ -1,11 +1,11 @@
1
- import Base from './Base.mjs';
1
+ import List from './Base.mjs';
2
2
 
3
3
  /**
4
4
  * A base class for lists which will use component based list items
5
5
  * @class Neo.list.Component
6
6
  * @extends Neo.list.Base
7
7
  */
8
- class Component extends Base {
8
+ class Component extends List {
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Neo.list.Component'
@@ -1,11 +1,11 @@
1
- import CollectionBase from '../collection/Base.mjs';
1
+ import Collection from '../collection/Base.mjs';
2
2
 
3
3
  /**
4
4
  * Abstract base class for the other manager classes
5
5
  * @class Neo.manager.Base
6
6
  * @extends Neo.collection.Base
7
7
  */
8
- class Base extends CollectionBase{
8
+ class Manager extends Collection{
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Neo.manager.Base'
@@ -44,4 +44,4 @@ class Base extends CollectionBase{
44
44
  }
45
45
  }
46
46
 
47
- export default Neo.setupClass(Base);
47
+ export default Neo.setupClass(Manager);
@@ -1,4 +1,4 @@
1
- import Base from './Base.mjs';
1
+ import Manager from './Base.mjs';
2
2
  import VDomUtil from '../util/VDom.mjs';
3
3
  import VNodeUtil from '../util/VNode.mjs';
4
4
 
@@ -7,7 +7,7 @@ import VNodeUtil from '../util/VNode.mjs';
7
7
  * @extends Neo.manager.Base
8
8
  * @singleton
9
9
  */
10
- class Component extends Base {
10
+ class Component extends Manager {
11
11
  static config = {
12
12
  /**
13
13
  * @member {String} className='Neo.manager.Component'
@@ -177,6 +177,15 @@ class Component extends Base {
177
177
  return null
178
178
  }
179
179
 
180
+ /**
181
+ * Returns the object associated to the key, or null if there is none.
182
+ * @param key
183
+ * @returns {Neo.component.Base|null}
184
+ */
185
+ get(key) {
186
+ return this.wrapperNodes.get(key) || super.get(key)
187
+ }
188
+
180
189
  /**
181
190
  * Returns all child components which are recursively matched via their parentId
182
191
  * @param {Neo.component.Base} component
@@ -241,14 +250,14 @@ class Component extends Base {
241
250
  * @returns {Neo.component.Base|null|Neo.component.Base[]}
242
251
  *
243
252
  * @example
244
- // as String: ntype[comma separated propterties]
245
- Neo.first('toolbar button[text=Try me,icon=people]')
246
- // as Object: Add properties. ntype is optional
247
- Neo.first({
253
+ // as String: ntype[comma separated propterties]
254
+ Neo.first('toolbar button[text=Try me,icon=people]')
255
+ // as Object: Add properties. ntype is optional
256
+ Neo.first({
248
257
  icon: 'people'
249
258
  })
250
- // as Array: An Array of Objects. No Strings allowed
251
- Neo.first([{
259
+ // as Array: An Array of Objects. No Strings allowed
260
+ Neo.first([{
252
261
  ntype: 'toolbar'
253
262
  },{
254
263
  ntype: 'button', text: 'Try me', icon: 'people
@@ -258,7 +267,7 @@ class Component extends Base {
258
267
  * not stop after the first result.
259
268
  *
260
269
  * @example
261
- Neo.first('button', false) // => [Button, Button, Button]
270
+ Neo.first('button', false) // => [Button, Button, Button]
262
271
  */
263
272
  getFirst(componentDescription, returnFirstMatch = true) {
264
273
  let objects = [],
@@ -279,7 +288,7 @@ class Component extends Base {
279
288
 
280
289
  if (pairs) {
281
290
  const pairsRegex = /\[(.*?)\]/,
282
- pairsMatch = pairs.match(pairsRegex);
291
+ pairsMatch = pairs.match(pairsRegex);
283
292
 
284
293
  if (pairsMatch) {
285
294
  const pairs = pairsMatch[1].split(',');
@@ -345,7 +354,7 @@ class Component extends Base {
345
354
  len = path?.length || 0;
346
355
 
347
356
  for (; i < len; i++) {
348
- if (me.has(path[i])) {
357
+ if (me.has(path[i]) || me.wrapperNodes.get(path[i])) {
349
358
  componentPath.push(path[i])
350
359
  }
351
360
  }
@@ -202,7 +202,7 @@ class DomEvent extends Base {
202
202
  opts : config,
203
203
  priority : config.priority,
204
204
  scope : config.scope || scope,
205
- vnodeId : config.vnodeId || scope.id
205
+ vnodeId : config.vnodeId || scope.vdom.id
206
206
  };
207
207
  }
208
208
 
@@ -427,15 +427,15 @@ class DomEvent extends Base {
427
427
  if (!eventConfigKeys.includes(key)) {
428
428
  me.register({
429
429
  bubble : domListener.bubble || value.bubble,
430
- delegate : domListener.delegate || value.delegate || '#' + component.id,
430
+ delegate : domListener.delegate || value.delegate || '#' + (component.vdom.id || component.id),
431
431
  eventName : key,
432
- id : component.id,
432
+ id : component.vdom.id || component.id, // honor wrapper nodes
433
433
  opts : value,
434
434
  originalConfig: domListener,
435
435
  ownerId : component.id,
436
436
  priority : domListener.priority || value.priority || 1,
437
437
  scope : domListener.scope || component,
438
- vnodeId : domListener.vnodeId || value.vnodeId || component.id
438
+ vnodeId : domListener.vnodeId || value.vnodeId || component.vdom.id
439
439
  })
440
440
  }
441
441
  })
@@ -468,8 +468,7 @@ class DomEvent extends Base {
468
468
  if (j != null) {
469
469
  targetId = path[j].id
470
470
  }
471
- }
472
- else {
471
+ } else {
473
472
  let delegationArray = delegate.split(' '),
474
473
  len = delegationArray.length,
475
474
  hasMatch, i, item, isId;
@@ -1,12 +1,12 @@
1
- import Base from './Base.mjs';
2
- import CoreBase from '../core/Base.mjs';
1
+ import Base from '../core/Base.mjs';
2
+ import Manager from './Base.mjs';
3
3
 
4
4
  /**
5
5
  * @class Neo.manager.Instance
6
6
  * @extends Neo.manager.Base
7
7
  * @singleton
8
8
  */
9
- class Instance extends Base {
9
+ class Instance extends Manager {
10
10
  static config = {
11
11
  /**
12
12
  * @member {String} className='Neo.manager.Instance'
@@ -28,7 +28,7 @@ class Instance extends Base {
28
28
 
29
29
  let me = this;
30
30
 
31
- CoreBase.instanceManagerAvailable = true;
31
+ Base.instanceManagerAvailable = true;
32
32
 
33
33
  me.consumeNeoIdMap();
34
34
 
@@ -1,4 +1,4 @@
1
- import Base from './Base.mjs';
1
+ import Manager from './Base.mjs';
2
2
 
3
3
  /**
4
4
  * @class Neo.manager.Task
@@ -32,7 +32,7 @@ import Base from './Base.mjs';
32
32
  * TaskManager.run(taskId);
33
33
  * TaskManager.get(taskId).repeat = 20;
34
34
  */
35
- class Task extends Base {
35
+ class Task extends Manager {
36
36
  static config = {
37
37
  /**
38
38
  * @member {String} className='Neo.manager.Task'
@@ -1,5 +1,5 @@
1
- import Base from './Base.mjs';
2
- import NeoArray from "../util/Array.mjs";
1
+ import Manager from './Base.mjs';
2
+ import NeoArray from '../util/Array.mjs';
3
3
 
4
4
  /**
5
5
  * See Neo.dialog.Toast for examples
@@ -7,7 +7,7 @@ import NeoArray from "../util/Array.mjs";
7
7
  * @extends Neo.manager.Base
8
8
  * @singleton
9
9
  */
10
- class Toast extends Base {
10
+ class Toast extends Manager {
11
11
  static config = {
12
12
  /**
13
13
  * @member {String} className='Neo.manager.Toast'
@@ -1,4 +1,4 @@
1
- import CoreBase from '../core/Base.mjs';
1
+ import Base from '../core/Base.mjs';
2
2
 
3
3
  /**
4
4
  * Abstract base class for plugin implementations.
@@ -7,7 +7,7 @@ import CoreBase from '../core/Base.mjs';
7
7
  * @class Neo.plugin.Base
8
8
  * @extends Neo.core.Base
9
9
  */
10
- class Base extends CoreBase {
10
+ class Plugin extends Base {
11
11
  static config = {
12
12
  /**
13
13
  * @member {String} className='Neo.plugin.Base'
@@ -64,4 +64,4 @@ class Base extends CoreBase {
64
64
  }
65
65
  }
66
66
 
67
- export default Neo.setupClass(Base);
67
+ export default Neo.setupClass(Plugin);
@@ -1,6 +1,6 @@
1
- import Base from './Base.mjs';
2
1
  import Container from '../container/Base.mjs'
3
- import NeoArray from "../util/Array.mjs";
2
+ import NeoArray from '../util/Array.mjs';
3
+ import Plugin from './Base.mjs';
4
4
 
5
5
  /**
6
6
  * Popover usable as tooltip
@@ -26,7 +26,7 @@ import NeoArray from "../util/Array.mjs";
26
26
  * }]
27
27
  * }]
28
28
  */
29
- class Popover extends Base {
29
+ class Popover extends Plugin {
30
30
  /**
31
31
  * Valid values for align
32
32
  * @member {String[]} alignValues=['bc-tc','tc-bc','tl-tr','tr-tl','cl-cr','cr-cl',null]
@@ -1,4 +1,4 @@
1
- import Base from './Base.mjs';
1
+ import Plugin from './Base.mjs';
2
2
 
3
3
  /**
4
4
  * @class Neo.plugin.PrefixField
@@ -17,7 +17,7 @@ import Base from './Base.mjs';
17
17
  * }]
18
18
  * }
19
19
  */
20
- class PrefixField extends Base {
20
+ class PrefixField extends Plugin {
21
21
  static config = {
22
22
  /**
23
23
  * @member {String} className='Neo.plugin.PrefixField'
@@ -1,12 +1,12 @@
1
- import Base from './Base.mjs';
2
1
  import DragZone from '../draggable/DragZone.mjs';
3
2
  import NeoArray from '../util/Array.mjs';
3
+ import Plugin from './Base.mjs';
4
4
 
5
5
  /**
6
6
  * @class Neo.plugin.Resizable
7
7
  * @extends Neo.plugin.Base
8
8
  */
9
- class Resizable extends Base {
9
+ class Resizable extends Plugin {
10
10
  /**
11
11
  * Resize cursor styles use north, south based names, so we need a mapping.
12
12
  * The order has to match the static positions array.
@@ -1,10 +1,10 @@
1
- import BasePlugin from './Base.mjs';
1
+ import Plugin from './Base.mjs';
2
2
 
3
3
  /**
4
4
  * @class Neo.plugin.Responsive
5
5
  * @extends Neo.plugin.Base
6
6
  */
7
- class Responsive extends BasePlugin {
7
+ class Responsive extends Plugin {
8
8
  static config = {
9
9
  /**
10
10
  * @member {String} className='Neo.plugin.Responsive'
@@ -110,6 +110,9 @@ class Model extends Base {
110
110
  NeoArray.remove(itemCollection, item);
111
111
 
112
112
  if (!silent) {
113
+ // We need a bigger depth, since grid.Container & table.Container use selection.Model as a top-level config.
114
+ // In case the config would get moved to grid.View & table.View, we would not need it.
115
+ view.updateDepth = -1;
113
116
  view.update();
114
117
 
115
118
  me.fire('selectionChange', {
@@ -136,6 +139,9 @@ class Model extends Base {
136
139
  });
137
140
 
138
141
  if (!silent && items.length > 0) {
142
+ // We need a bigger depth, since grid.Container & table.Container use selection.Model as a top-level config.
143
+ // In case the config would get moved to grid.View & table.View, we would not need it.
144
+ view.updateDepth = -1;
139
145
  view.update()
140
146
  }
141
147
 
@@ -244,7 +250,12 @@ class Model extends Base {
244
250
 
245
251
  NeoArray.add(itemCollection, items);
246
252
 
247
- !view.silentSelect && view.update();
253
+ if (!view.silentSelect) {
254
+ // We need a bigger depth, since grid.Container & table.Container use selection.Model as a top-level config.
255
+ // In case the config would get moved to grid.View & table.View, we would not need it.
256
+ view.updateDepth = -1;
257
+ view.update()
258
+ }
248
259
 
249
260
  view.onSelect?.(items);
250
261
 
@@ -8,7 +8,7 @@ import NeoArray from '../util/Array.mjs';
8
8
  * @class Neo.toolbar.Base
9
9
  * @extends Neo.container.Base
10
10
  */
11
- class Base extends Container {
11
+ class Toolbar extends Container {
12
12
  /**
13
13
  * Valid values for dock
14
14
  * @member {String[]} dockPositions=['top','right','bottom','left', null]
@@ -223,4 +223,4 @@ class Base extends Container {
223
223
  }
224
224
  }
225
225
 
226
- export default Neo.setupClass(Base);
226
+ export default Neo.setupClass(Toolbar);
@@ -1,7 +1,7 @@
1
1
  import ClassSystemUtil from '../util/ClassSystem.mjs';
2
2
  import HashHistory from '../util/HashHistory.mjs';
3
3
  import Store from '../data/Store.mjs';
4
- import Toolbar from '../toolbar/Base.mjs';
4
+ import Toolbar from './Base.mjs';
5
5
 
6
6
  /**
7
7
  * @class Neo.toolbar.Breadcrumb
@@ -8,7 +8,7 @@ let singletons = {};
8
8
  * @class Neo.tooltip.Base
9
9
  * @extends Neo.container.Base
10
10
  */
11
- class Base extends Container {
11
+ class Tooltip extends Container {
12
12
  static config = {
13
13
  /**
14
14
  * @member {String} className='Neo.tooltip.Base'
@@ -368,4 +368,4 @@ class Base extends Container {
368
368
  }
369
369
  }
370
370
 
371
- export default Neo.setupClass(Base);
371
+ export default Neo.setupClass(Tooltip);
@@ -1,4 +1,4 @@
1
- import CoreBase from '../core/Base.mjs';
1
+ import Base from '../core/Base.mjs';
2
2
  import Observable from '../core/Observable.mjs';
3
3
  import Message from './Message.mjs';
4
4
  import RemoteMethodAccess from './mixin/RemoteMethodAccess.mjs';
@@ -9,7 +9,7 @@ import RemoteMethodAccess from './mixin/RemoteMethodAccess.mjs';
9
9
  * @extends Neo.core.Base
10
10
  * @abstract
11
11
  */
12
- class Base extends CoreBase {
12
+ class Worker extends Base {
13
13
  static config = {
14
14
  /**
15
15
  * @member {String} className='Neo.worker.Base'
@@ -309,4 +309,4 @@ class Base extends CoreBase {
309
309
  }
310
310
  }
311
311
 
312
- export default Neo.setupClass(Base);
312
+ export default Neo.setupClass(Worker);
@@ -1,3 +0,0 @@
1
- The grid implementation using div tags is currently on hold in favor for the table implementation using a table tag.
2
-
3
- The BufferedGrid implementation is currently scoped for neo v9.