neo.mjs 8.18.0 → 8.19.0

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.
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.18.0'
23
+ * @member {String} version='8.19.0'
24
24
  */
25
- version: '8.18.0'
25
+ version: '8.19.0'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-02-08",
19
+ "datePublished": "2025-02-09",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.18.0'
110
+ html : 'v8.19.0'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -190,7 +190,7 @@ class ConfigurationViewport extends Viewport {
190
190
  let me = this,
191
191
  button = data.component,
192
192
  countThemes = themes.length,
193
- futureIndex, newTheme, oldIndex, oldTheme, themeIndex;
193
+ futureIndex, newTheme, themeIndex;
194
194
 
195
195
  themes.forEach((theme, index) => {
196
196
  if (button.text === theme.label) {
@@ -200,8 +200,6 @@ class ConfigurationViewport extends Viewport {
200
200
  });
201
201
 
202
202
  futureIndex = (themeIndex + countThemes +1) % countThemes;
203
- oldIndex = (themeIndex + countThemes -1) % countThemes;
204
- oldTheme = themes[oldIndex].name;
205
203
 
206
204
  button.text = themes[futureIndex].label;
207
205
 
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.18.0'
23
+ * @member {String} version='8.19.0'
24
24
  */
25
- version: '8.18.0'
25
+ version: '8.19.0'
26
26
  }
27
27
 
28
28
  /**
@@ -0,0 +1,176 @@
1
+ import ComboBox from '../../../src/form/field/ComboBox.mjs';
2
+ import Container from '../../../src/container/Base.mjs';
3
+ import Radio from '../../../src/form/field/Radio.mjs';
4
+
5
+ /**
6
+ * @class Neo.examples.grid.bigData.ControlsContainer
7
+ * @extends Neo.container.Base
8
+ */
9
+ class ControlsContainer extends Container {
10
+ static config = {
11
+ /**
12
+ * @member {String} className='Neo.examples.grid.bigData.ControlsContainer'
13
+ * @protected
14
+ */
15
+ className: 'Neo.examples.grid.bigData.ControlsContainer',
16
+ /**
17
+ * @member {String[]} cls=['neo-examples-bigdata-controls-container']
18
+ */
19
+ cls: ['neo-examples-bigdata-controls-container'],
20
+ /**
21
+ * @member {Object[]} items
22
+ */
23
+ items: [{
24
+ ntype : 'button',
25
+ cls : ['sections-container-button'],
26
+ handler: 'up.onControlsToggleButtonClick',
27
+ iconCls: 'fas fa-bars'
28
+ }, {
29
+ module: Container,
30
+
31
+ itemDefaults: {
32
+ module : ComboBox,
33
+ clearable : false,
34
+ displayField: 'id',
35
+ editable : false
36
+ },
37
+
38
+ items: [{
39
+ ntype: 'component',
40
+ html : '<a class="github-button" href="https://github.com/neomjs/neo" data-size="large" data-show-count="true" aria-label="Star neomjs/neo on GitHub">Star</a>',
41
+ style: {marginLeft: 'auto'}
42
+ }, {
43
+ labelText : 'Amount Rows',
44
+ labelWidth: 120,
45
+ listeners : {change: 'up.onAmountRowsChange'},
46
+ store : ['1000', '5000', '10000', '20000', '50000'],
47
+ style : {marginTop: '2em'},
48
+ value : '1000',
49
+ width : 200
50
+ }, {
51
+ labelText : 'Amount Columns',
52
+ labelWidth: 145,
53
+ listeners : {change: 'up.onAmountColumnsChange'},
54
+ store : ['10', '25', '50', '75', '100'],
55
+ value : '50',
56
+ width : 200
57
+ }, {
58
+ labelText : 'Buffer Rows',
59
+ labelWidth: 145,
60
+ listeners : {change: 'up.onBufferRowRangeChange'},
61
+ store : ['0', '3', '5', '10', '25', '50'],
62
+ value : '5',
63
+ width : 200
64
+ }, {
65
+ labelText : 'Buffer Columns',
66
+ labelWidth: 145,
67
+ listeners : {change: 'up.onBufferColumnRangeChange'},
68
+ store : ['0', '3', '5', '10', '20'],
69
+ value : '3',
70
+ width : 200
71
+ }, {
72
+ module : Radio,
73
+ checked : true,
74
+ labelText : 'Theme',
75
+ labelWidth : 70,
76
+ listeners : {change: 'up.onThemeRadioChange'},
77
+ name : 'theme',
78
+ style : {marginTop: '2em'},
79
+ value : 'neo-theme-dark',
80
+ valueLabelText: 'Dark'
81
+ }, {
82
+ module : Radio,
83
+ labelText : '',
84
+ labelWidth : 70,
85
+ listeners : {change: 'up.onThemeRadioChange'},
86
+ name : 'theme',
87
+ style : {marginTop: '.3em'},
88
+ value : 'neo-theme-light',
89
+ valueLabelText: 'Light'
90
+ }]
91
+ }],
92
+ /**
93
+ * @member {Object} layout={ntype:'vbox'}
94
+ */
95
+ layout: {ntype: 'vbox'},
96
+ /**
97
+ * @member {String} tag='aside'
98
+ */
99
+ tag: 'aside'
100
+ }
101
+
102
+ get grid() {
103
+ return this.parent.getItem('grid')
104
+ }
105
+
106
+ /**
107
+ *
108
+ */
109
+ onConstructed() {
110
+ super.onConstructed();
111
+
112
+ Neo.main.DomAccess.addScript({
113
+ async : true,
114
+ defer : true,
115
+ src : 'https://buttons.github.io/buttons.js',
116
+ windowId: this.windowId
117
+ })
118
+ }
119
+
120
+ /**
121
+ * @param {Object} data
122
+ */
123
+ onAmountColumnsChange(data) {
124
+ if (data.oldValue) {
125
+ this.grid.isLoading = 'Is Loading';
126
+ this.grid.amountColumns = parseInt(data.value.id)
127
+ }
128
+ }
129
+
130
+ /**
131
+ * @param {Object} data
132
+ */
133
+ onAmountRowsChange(data) {
134
+ if (data.oldValue) {
135
+ this.grid.isLoading = 'Is Loading';
136
+ this.grid.store.amountRows = parseInt(data.value.id)
137
+ }
138
+ }
139
+
140
+ /**
141
+ * @param {Object} data
142
+ */
143
+ onBufferColumnRangeChange(data) {
144
+ if (data.oldValue) {
145
+ this.grid.view.bufferColumnRange = parseInt(data.value.id)
146
+ }
147
+ }
148
+
149
+ /**
150
+ * @param {Object} data
151
+ */
152
+ onBufferRowRangeChange(data) {
153
+ if (data.oldValue) {
154
+ this.grid.view.bufferRowRange = parseInt(data.value.id)
155
+ }
156
+ }
157
+
158
+ /**
159
+ * @param {Object} data
160
+ */
161
+ async onControlsToggleButtonClick(data) {
162
+ let me = this,
163
+ button = data.component;
164
+
165
+ // Custom flag to track the state
166
+ button.expanded = !button.expanded;
167
+
168
+ me.toggleCls('neo-expanded');
169
+
170
+ await me.timeout(button.expanded ? 250 : 0);
171
+
172
+ me.grid.toggleCls('neo-extend-margin-right');
173
+ }
174
+ }
175
+
176
+ export default Neo.setupClass(ControlsContainer);
@@ -28,7 +28,14 @@ class GridContainer extends BaseGridContainer {
28
28
  /**
29
29
  * @member {Object[]} store=MainStore
30
30
  */
31
- store: MainStore
31
+ store: MainStore,
32
+ /**
33
+ * @member {Object} viewConfig
34
+ */
35
+ viewConfig: {
36
+ bufferColumnRange: 3,
37
+ bufferRowRange : 5
38
+ }
32
39
  }
33
40
 
34
41
  /**
@@ -1,7 +1,6 @@
1
- import ComboBox from '../../../src/form/field/ComboBox.mjs';
2
- import GridContainer from './GridContainer.mjs';
3
- import Toolbar from '../../../src/toolbar/Base.mjs';
4
- import Viewport from '../../../src/container/Viewport.mjs';
1
+ import ControlsContainer from './ControlsContainer.mjs';
2
+ import GridContainer from './GridContainer.mjs';
3
+ import Viewport from '../../../src/container/Viewport.mjs';
5
4
 
6
5
  /**
7
6
  * @class Neo.examples.grid.bigData.MainContainer
@@ -22,104 +21,22 @@ class MainContainer extends Viewport {
22
21
  * @member {Object[]} items
23
22
  */
24
23
  items: [{
25
- module: Toolbar,
26
- flex : 'none',
27
- layout: {ntype: 'hbox', align: 'stretch', wrap: 'wrap'},
28
- style : {marginBottom: '1em', padding: 0},
29
-
30
- itemDefaults: {
31
- module : ComboBox,
32
- clearable : false,
33
- displayField: 'id',
34
- editable : false
35
- },
36
-
37
- items: [{
38
- labelText : 'Amount Rows',
39
- labelWidth: 110,
40
- listeners : {change: 'up.onAmountRowsChange'},
41
- store : ['1000', '5000', '10000', '20000', '50000'],
42
- value : '10000',
43
- width : 200
44
- }, {
45
- labelText : 'Amount Columns',
46
- labelWidth: 135,
47
- listeners : {change: 'up.onAmountColumnsChange'},
48
- store : ['10', '25', '50', '75', '100'],
49
- value : '50',
50
- width : 200
51
- }, {
52
- labelText : 'Buffer Rows',
53
- labelWidth: 95,
54
- listeners : {change: 'up.ontBufferRowRangeChange'},
55
- store : ['0', '3', '5', '10', '25', '50'],
56
- value : '5',
57
- width : 160
58
- }, {
59
- labelText : 'Buffer Columns',
60
- labelWidth: 120,
61
- listeners : {change: 'up.ontBufferColumnRangeChange'},
62
- store : ['0', '3', '5', '10', '20'],
63
- value : '0',
64
- width : 185
65
- }]
24
+ module : GridContainer,
25
+ reference: 'grid'
66
26
  }, {
67
- module : GridContainer,
68
- reference : 'grid',
69
- viewConfig: {
70
- bufferRowRange: 5
71
- }
27
+ module: ControlsContainer
72
28
  }],
73
29
  /**
74
- * @member {Object} layout={ntype:'vbox',align:'stretch'}
30
+ * @member {Object} layout={ntype:'hbox',align:'stretch'}
75
31
  */
76
- layout: {ntype: 'vbox', align: 'stretch'},
77
- /**
78
- * @member {Object} style={padding:'20px'}
79
- */
80
- style: {padding: '20px'}
81
- }
82
-
83
- get grid() {
84
- return this.getItem('grid')
85
- }
86
-
87
- /**
88
- * @param {Object} data
89
- */
90
- onAmountColumnsChange(data) {
91
- if (data.oldValue) {
92
- this.grid.isLoading = 'Is Loading';
93
- this.grid.amountColumns = parseInt(data.value.id)
94
- }
95
- }
96
-
97
- /**
98
- * @param {Object} data
99
- */
100
- onAmountRowsChange(data) {
101
- if (data.oldValue) {
102
- this.grid.isLoading = 'Is Loading';
103
- this.grid.store.amountRows = parseInt(data.value.id)
104
- }
105
- }
106
-
107
- /**
108
- * @param {Object} data
109
- */
110
- ontBufferColumnRangeChange(data) {
111
- if (data.oldValue) {
112
- this.grid.view.bufferColumnRange = parseInt(data.value.id)
113
- }
32
+ layout: {ntype: 'hbox', align: 'stretch'}
114
33
  }
115
34
 
116
35
  /**
117
- * @param {Object} data
36
+ * @param {Object} opts
118
37
  */
119
- ontBufferRowRangeChange(data) {
120
- if (data.oldValue) {
121
- this.grid.view.bufferRowRange = parseInt(data.value.id)
122
- }
38
+ onThemeRadioChange({value}) {
39
+ this.theme = value
123
40
  }
124
41
  }
125
42
 
@@ -17,9 +17,9 @@ class MainStore extends Store {
17
17
  */
18
18
  amountColumns_: 50,
19
19
  /**
20
- * @member {Number} amountRows_=10000
20
+ * @member {Number} amountRows_=1000
21
21
  */
22
- amountRows_: 10000,
22
+ amountRows_: 1000,
23
23
  /**
24
24
  * @member {Neo.data.Model} model=Model
25
25
  */
@@ -4,5 +4,5 @@
4
4
  "environment" : "development",
5
5
  "mainPath" : "./Main.mjs",
6
6
  "mainThreadAddons": ["DragDrop", "Navigator", "ResizeObserver", "Stylesheet"],
7
- "themes" : ["neo-theme-dark"]
7
+ "themes" : ["neo-theme-dark", "neo-theme-light"]
8
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.18.0",
3
+ "version": "8.19.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -0,0 +1,38 @@
1
+ .neo-examples-bigdata-controls-container {
2
+ border : none; // reset the default 1px
3
+ bottom : .5em;
4
+ box-shadow : 0 5px 10px rgba(75,75,75,.3);
5
+ display : block;
6
+ flex-shrink : 0;
7
+ min-width : 235px;
8
+ overflow : visible;
9
+ padding : .5em 1em;
10
+ position : absolute;
11
+ right : -235px;
12
+ top : .5em;
13
+ transition : right 250ms ease-out;
14
+ width : 235px;
15
+ z-index : 100;
16
+
17
+ &.neo-expanded {
18
+ right: 0;
19
+ }
20
+
21
+ .sections-container-button {
22
+ //background-color: #fff;
23
+ border-radius : 8px;
24
+ box-shadow : 0 5px 10px rgba(75,75,75,.3);
25
+ display : flex;
26
+ height : 35px;
27
+ min-width : 35px;
28
+ position : absolute;
29
+ left : -53px;
30
+ top : .2em;
31
+ width : 35px;
32
+
33
+ .neo-button-glyph {
34
+ // color : #000; // required for mobile
35
+ font-size: 13px;
36
+ }
37
+ }
38
+ }
@@ -1,7 +1,9 @@
1
1
  .neo-examples-bigdata-maincontainer {
2
- .neo-toolbar {
3
- .neo-combobox {
4
- margin: 2px 1em;
2
+ .neo-grid-wrapper {
3
+ margin: 3.5em 1em 1em 1em;
4
+
5
+ &:has(.neo-extend-margin-right) {
6
+ margin-right: calc(235px + 1em);
5
7
  }
6
8
  }
7
9
  }
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '8.18.0'
265
+ * @default '8.19.0'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '8.18.0'
270
+ version: '8.19.0'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
@@ -120,7 +120,7 @@ class DragZone extends BaseDragZone {
120
120
  * @param {String} data.id
121
121
  * @param {Neo.component.Base[]} data.items
122
122
  */
123
- onItemsCreated(data) {console.log('onItemsCreated');
123
+ onItemsCreated(data) {
124
124
  this.adjustToolbarItemCls(true)
125
125
  }
126
126
  }
@@ -447,20 +447,22 @@ class ComboBox extends Picker {
447
447
  * @param {*} oldValue
448
448
  * @override
449
449
  */
450
- fireChangeEvent(value, oldValue) {
450
+ async fireChangeEvent(value, oldValue) {
451
451
  let me = this,
452
452
  FormContainer = Neo.form?.Container,
453
453
  params = {component: me, oldValue, value};
454
454
 
455
- me.fire('change', params);
455
+ await me.timeout(30);
456
456
 
457
- if (!me.suspendEvents) {
458
- ComponentManager.getParents(me).forEach(parent => {
459
- if (FormContainer && parent instanceof FormContainer) {
460
- parent.fire('fieldChange', params)
461
- }
462
- })
463
- }
457
+ me.fire('change', params);
458
+
459
+ if (!me.suspendEvents) {
460
+ ComponentManager.getParents(me).forEach(parent => {
461
+ if (FormContainer && parent instanceof FormContainer) {
462
+ parent.fire('fieldChange', params)
463
+ }
464
+ })
465
+ }
464
466
  }
465
467
 
466
468
  /**
@@ -557,7 +559,7 @@ class ComboBox extends Picker {
557
559
  * @param {Object[]} selectionChangeEvent.selection
558
560
  * @protected
559
561
  */
560
- async onListItemSelectionChange({ selection }) {
562
+ async onListItemSelectionChange({selection}) {
561
563
  if (selection?.length) {
562
564
  let me = this,
563
565
  selected = selection[0],
@@ -567,19 +569,15 @@ class ComboBox extends Picker {
567
569
 
568
570
  me.updateTypeAheadValue(null, true);
569
571
 
572
+ await me.hidePicker();
573
+
570
574
  me.preventFiltering = true;
571
575
  me.value = record;
572
576
  me.preventFiltering = false;
573
577
 
574
578
  me.fire('select', {
575
579
  value: record
576
- });
577
-
578
- // Short delay to let selection DOM updates get applied.
579
- // Alternatively, we could hide the picker before the selection happen and limit updates to the vdom.
580
- await me.timeout(20);
581
-
582
- await me.hidePicker()
580
+ })
583
581
  }
584
582
  }
585
583