neo.mjs 8.0.0-beta.2 → 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.
Files changed (63) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/covid/view/MainContainerController.mjs +7 -4
  3. package/apps/portal/index.html +1 -1
  4. package/apps/portal/view/about/Container.mjs +0 -2
  5. package/apps/portal/view/about/MemberContainer.mjs +1 -20
  6. package/apps/portal/view/home/FooterContainer.mjs +1 -5
  7. package/apps/sharedcovid/view/MainContainerController.mjs +7 -4
  8. package/examples/ConfigurationViewport.mjs +37 -32
  9. package/examples/ServiceWorker.mjs +2 -2
  10. package/examples/calendar/weekview/MainContainer.mjs +6 -6
  11. package/examples/grid/cellEditing/MainContainer.mjs +175 -0
  12. package/examples/grid/cellEditing/MainContainerStateProvider.mjs +62 -0
  13. package/examples/grid/cellEditing/MainModel.mjs +30 -0
  14. package/examples/grid/cellEditing/MainStore.mjs +54 -0
  15. package/examples/grid/cellEditing/app.mjs +6 -0
  16. package/examples/grid/cellEditing/index.html +11 -0
  17. package/examples/grid/cellEditing/neo-config.json +6 -0
  18. package/examples/grid/container/MainContainer.mjs +7 -6
  19. package/examples/grid/covid/GridContainer.mjs +36 -36
  20. package/examples/grid/covid/Util.mjs +1 -1
  21. package/examples/table/cellEditing/MainContainer.mjs +174 -0
  22. package/examples/table/cellEditing/MainContainerStateProvider.mjs +62 -0
  23. package/examples/table/cellEditing/MainModel.mjs +30 -0
  24. package/examples/table/cellEditing/MainStore.mjs +54 -0
  25. package/examples/table/cellEditing/app.mjs +6 -0
  26. package/examples/table/cellEditing/index.html +11 -0
  27. package/examples/table/cellEditing/neo-config.json +6 -0
  28. package/examples/table/nestedRecordFields/MainContainerStateProvider.mjs +2 -1
  29. package/package.json +8 -8
  30. package/resources/scss/src/apps/portal/home/FooterContainer.scss +11 -2
  31. package/resources/scss/src/grid/Container.scss +0 -13
  32. package/resources/scss/src/grid/plugin/CellEditing.scss +11 -0
  33. package/resources/scss/src/table/plugin/CellEditing.scss +11 -0
  34. package/src/DefaultConfig.mjs +2 -2
  35. package/src/Neo.mjs +2 -2
  36. package/src/code/LivePreview.mjs +2 -2
  37. package/src/component/DateSelector.mjs +15 -0
  38. package/src/core/Base.mjs +1 -1
  39. package/src/form/field/Base.mjs +1 -4
  40. package/src/form/field/ComboBox.mjs +18 -2
  41. package/src/form/field/Date.mjs +10 -4
  42. package/src/grid/Container.mjs +242 -39
  43. package/src/grid/README.md +1 -1
  44. package/src/grid/View.mjs +282 -129
  45. package/src/grid/header/Button.mjs +327 -36
  46. package/src/grid/header/Toolbar.mjs +68 -4
  47. package/src/grid/plugin/CellEditing.mjs +30 -0
  48. package/src/main/DomEvents.mjs +12 -3
  49. package/src/manager/Focus.mjs +2 -2
  50. package/src/plugin/Base.mjs +15 -1
  51. package/src/plugin/Resizable.mjs +1 -5
  52. package/src/selection/Model.mjs +5 -1
  53. package/src/selection/grid/CellColumnModel.mjs +1 -1
  54. package/src/selection/grid/CellColumnRowModel.mjs +1 -1
  55. package/src/selection/grid/CellModel.mjs +1 -1
  56. package/src/selection/grid/ColumnModel.mjs +2 -2
  57. package/src/table/Container.mjs +32 -3
  58. package/src/table/View.mjs +9 -4
  59. package/src/table/header/Toolbar.mjs +15 -1
  60. package/src/table/plugin/CellEditing.mjs +330 -0
  61. package/src/tooltip/Base.mjs +17 -17
  62. package/src/util/KeyNavigation.mjs +14 -8
  63. package/src/vdom/Helper.mjs +1 -3
@@ -32,18 +32,18 @@ class GridContainer extends BaseGridContainer {
32
32
  * @member {Object[]} columns
33
33
  */
34
34
  columns: [{
35
- cls : ['neo-index-column'],
36
- dock : 'left',
37
- field : 'index',
38
- minWidth: 40,
39
- text : '#',
40
- renderer: Util.indexRenderer,
41
- width : 40
35
+ cls : ['neo-index-column'],
36
+ dataField: 'index',
37
+ dock : 'left',
38
+ minWidth : 40,
39
+ text : '#',
40
+ renderer : Util.indexRenderer,
41
+ width : 40
42
42
  }, {
43
43
  cellAlign : 'left',
44
+ dataField : 'country',
44
45
  defaultSortDirection: 'ASC',
45
46
  dock : 'left',
46
- field : 'country',
47
47
  text : 'Country',
48
48
  width : 200,
49
49
 
@@ -58,44 +58,44 @@ class GridContainer extends BaseGridContainer {
58
58
  };
59
59
  }
60
60
  }, {
61
- field: 'cases',
62
- text : 'Cases'
61
+ dataField: 'cases',
62
+ text : 'Cases'
63
63
  }, {
64
- field: 'casesPerOneMillion',
65
- text : 'Cases / 1M'
64
+ dataField: 'casesPerOneMillion',
65
+ text : 'Cases / 1M'
66
66
  }, {
67
- field : 'infected',
68
- text : 'Infected',
69
- renderer: data => Util.formatInfected(data)
67
+ dataField: 'infected',
68
+ text : 'Infected',
69
+ renderer : data => Util.formatInfected(data)
70
70
  }, {
71
- field : 'active',
72
- text : 'Active',
73
- renderer: data => Util.formatNumber(data, '#64B5F6')
71
+ dataField: 'active',
72
+ text : 'Active',
73
+ renderer : data => Util.formatNumber(data, '#64B5F6')
74
74
  }, {
75
- field : 'recovered',
76
- text : 'Recovered',
77
- renderer: data => Util.formatNumber(data, '#28ca68')
75
+ dataField: 'recovered',
76
+ text : 'Recovered',
77
+ renderer : data => Util.formatNumber(data, '#28ca68')
78
78
  }, {
79
- field : 'critical',
80
- text : 'Critical',
81
- renderer: data => Util.formatNumber(data, 'orange')
79
+ dataField: 'critical',
80
+ text : 'Critical',
81
+ renderer : data => Util.formatNumber(data, 'orange')
82
82
  }, {
83
- field : 'deaths',
84
- text : 'Deaths',
85
- renderer: data => Util.formatNumber(data, '#fb6767')
83
+ dataField: 'deaths',
84
+ text : 'Deaths',
85
+ renderer : data => Util.formatNumber(data, '#fb6767')
86
86
  }, {
87
- field: 'todayCases',
88
- text : 'Cases today'
87
+ dataField: 'todayCases',
88
+ text : 'Cases today'
89
89
  }, {
90
- field : 'todayDeaths',
91
- text : 'Deaths today',
92
- renderer: data => Util.formatNumber(data, '#fb6767')
90
+ dataField: 'todayDeaths',
91
+ text : 'Deaths today',
92
+ renderer : data => Util.formatNumber(data, '#fb6767')
93
93
  }, {
94
- field: 'tests',
95
- text : 'Tests'
94
+ dataField: 'tests',
95
+ text : 'Tests'
96
96
  }, {
97
- field: 'testsPerOneMillion',
98
- text : 'Tests / 1M'
97
+ dataField: 'testsPerOneMillion',
98
+ text : 'Tests / 1M'
99
99
  }],
100
100
  /**
101
101
  * @member {Neo.controller.Component} controller=GridContainerController
@@ -133,7 +133,7 @@ class Util extends Base {
133
133
  imageName = map[imageName] || imageName;
134
134
 
135
135
  if (Neo.config.isGitHubPages) {
136
- let path = `../../../../resources/images/flaticon/country_flags/png/${imageName}.png`;
136
+ let path = `../../../../resources_pub/images/flaticon/country_flags/png/${imageName}.png`;
137
137
 
138
138
  if (Neo.config.environment !== 'development') {
139
139
  path = `../../${path}`
@@ -0,0 +1,174 @@
1
+ import CellColumnModel from '../../../src/selection/table/CellColumnModel.mjs';
2
+ import CellColumnRowModel from '../../../src/selection/table/CellColumnRowModel.mjs';
3
+ import CellModel from '../../../src/selection/table/CellModel.mjs';
4
+ import CellRowModel from '../../../src/selection/table/CellRowModel.mjs';
5
+ import CheckBox from '../../../src/form/field/CheckBox.mjs';
6
+ import CountryField from '../../../src/form/field/Country.mjs';
7
+ import ConfigurationViewport from '../../ConfigurationViewport.mjs';
8
+ import DateField from '../../../src/form/field/Date.mjs';
9
+ import MainContainerStateProvider from './MainContainerStateProvider.mjs';
10
+ import MainStore from './MainStore.mjs';
11
+ import NumberField from '../../../src/form/field/Number.mjs';
12
+ import Radio from '../../../src/form/field/Radio.mjs';
13
+ import TableContainer from '../../../src/table/Container.mjs';
14
+
15
+ /**
16
+ * @class Neo.examples.table.cellEditing.MainContainer
17
+ * @extends Neo.examples.ConfigurationViewport
18
+ */
19
+ class MainContainer extends ConfigurationViewport {
20
+ static config = {
21
+ className : 'Neo.examples.table.cellEditing.MainContainer',
22
+ autoMount : true,
23
+ configItemLabelWidth: 130,
24
+ configPanelFlex : 1.5,
25
+ exampleComponentFlex: 3,
26
+ layout : {ntype: 'hbox', align: 'stretch'},
27
+ stateProvider : MainContainerStateProvider
28
+ }
29
+
30
+ /**
31
+ * @param {Object} data
32
+ */
33
+ countryRenderer({record}) {
34
+ let countryStore = this.getStateProvider().getStore('countries');
35
+
36
+ if (countryStore.getCount() > 0) {
37
+ return countryStore.get(record.country).name
38
+ }
39
+
40
+ return ''
41
+ }
42
+
43
+ /**
44
+ * @returns {Object[]}
45
+ */
46
+ createConfigurationComponents() {
47
+ let me = this;
48
+
49
+ const selectionModelRadioDefaults = {
50
+ module : Radio,
51
+ hideValueLabel: false,
52
+ labelText : '',
53
+ name : 'selectionModel',
54
+ width : 350
55
+ };
56
+
57
+ return [{
58
+ module : NumberField,
59
+ labelText: 'height',
60
+ listeners: {change: me.onConfigChange.bind(me, 'height')},
61
+ maxValue : 800,
62
+ minValue : 225,
63
+ stepSize : 5,
64
+ value : me.exampleComponent.height
65
+ }, {
66
+ ...selectionModelRadioDefaults,
67
+ checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellmodel',
68
+ labelText : 'selectionModel',
69
+ listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellModel)},
70
+ style : {marginTop: '10px'},
71
+ valueLabelText: 'Cell'
72
+ }, {
73
+ ...selectionModelRadioDefaults,
74
+ checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellcolumnmodel',
75
+ listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnModel)},
76
+ valueLabelText: 'Cell & Column'
77
+ }, {
78
+ ...selectionModelRadioDefaults,
79
+ checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellrowmodel',
80
+ listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellRowModel)},
81
+ valueLabelText: 'Cell & Row'
82
+ }, {
83
+ ...selectionModelRadioDefaults,
84
+ checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellcolumnrowmodel',
85
+ listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnRowModel)},
86
+ valueLabelText: 'Cell & Column & Row'
87
+ }, {
88
+ module : CheckBox,
89
+ checked : me.exampleComponent.sortable,
90
+ hideLabel : true,
91
+ listeners : {change: me.onConfigChange.bind(me, 'sortable')},
92
+ style : {marginTop: '10px'},
93
+ valueLabelText: 'sortable'
94
+ }, {
95
+ module : CheckBox,
96
+ checked : false, // we can not access the lazy-loaded plugin yet
97
+ hideLabel : true,
98
+ listeners : {change: me.onPluginConfigChange.bind(me, 'disabled')},
99
+ style : {marginTop: '10px'},
100
+ valueLabelText: 'Disable CellEditing'
101
+ }]
102
+ }
103
+
104
+ /**
105
+ * @returns {Object}
106
+ */
107
+ createExampleComponent() {
108
+ return {
109
+ module : TableContainer,
110
+ bind : {store : 'stores.mainStore'},
111
+ cellEditing : true,
112
+ parentId : this.id,
113
+ selectionModel: CellModel,
114
+ store : MainStore,
115
+
116
+ columnDefaults: {
117
+ editable: true
118
+ },
119
+
120
+ columns: [{
121
+ dataField: 'firstname',
122
+ text : 'Firstname'
123
+ }, {
124
+ dataField: 'randomNumber',
125
+ text : 'Number (step 5)',
126
+
127
+ editor: {
128
+ module : NumberField,
129
+ clearable: false,
130
+ maxValue : 100,
131
+ minValue : 0,
132
+ stepSize : 5
133
+ }
134
+ }, {
135
+ dataField: 'randomDate',
136
+ renderer : ({value}) => new Intl.DateTimeFormat('default').format(value),
137
+ text : 'Random Date',
138
+
139
+ editor: {
140
+ module : DateField,
141
+ clearable: false,
142
+ maxValue : '2024-12-20',
143
+ minValue : '2024-12-10'
144
+ }
145
+ }, {
146
+ dataField: 'country',
147
+ renderer : 'up.countryRenderer',
148
+ text : 'Country',
149
+
150
+ editor: {
151
+ module : CountryField,
152
+ bind : {store: 'stores.countries'},
153
+ clearable : false,
154
+ forceSelection: true,
155
+ valueField : 'code'
156
+ }
157
+ }, {
158
+ dataField: 'githubId',
159
+ editable : false,
160
+ text : 'Github Id (Non-editable)'
161
+ }]
162
+ }
163
+ }
164
+
165
+ /**
166
+ * @param {String} config
167
+ * @param {Object} opts
168
+ */
169
+ onPluginConfigChange(config, opts) {
170
+ this.exampleComponent.getPlugin('table-cell-editing')[config] = opts.value
171
+ }
172
+ }
173
+
174
+ export default Neo.setupClass(MainContainer);
@@ -0,0 +1,62 @@
1
+ import MainStore from './MainStore.mjs';
2
+ import StateProvider from '../../../src/state/Provider.mjs';
3
+ import Store from '../../../src/data/Store.mjs';
4
+
5
+ const countrySymbol = Symbol.for('country');
6
+
7
+ /**
8
+ * @class Neo.examples.table.cellEditing.MainContainerStateProvider
9
+ * @extends Neo.state.Provider
10
+ */
11
+ class MainContainerStateProvider extends StateProvider {
12
+ static config = {
13
+ /**
14
+ * @member {String} className='Neo.examples.table.cellEditing.MainContainerStateProvider'
15
+ * @protected
16
+ */
17
+ className: 'Neo.examples.table.cellEditing.MainContainerStateProvider',
18
+ /**
19
+ * @member {Object} stores
20
+ */
21
+ stores: {
22
+ countries: {
23
+ module : Store,
24
+ autoLoad : true,
25
+ keyProperty: 'code',
26
+ listeners : {load: 'onCountryStoreLoad'},
27
+ url : '../../../resources/examples/data/countries.json',
28
+
29
+ model: {
30
+ fields: [
31
+ {name: 'code'},
32
+ {name: 'name'}
33
+ ]
34
+ }
35
+ },
36
+ mainStore: MainStore
37
+ }
38
+ }
39
+
40
+ /**
41
+ * @param {Record[]} items
42
+ */
43
+ onCountryStoreLoad(items) {
44
+ let me = this,
45
+ mainStore = me.getStore('mainStore'),
46
+ country;
47
+
48
+ // if the main table store is already loaded, the country field renderer had no data
49
+ if (mainStore.getCount() > 0) {
50
+ mainStore.items.forEach(record => {
51
+ country = record.country;
52
+
53
+ // hack resetting the current value to get a new record change
54
+ record[countrySymbol] = null;
55
+
56
+ record.country = country
57
+ })
58
+ }
59
+ }
60
+ }
61
+
62
+ export default Neo.setupClass(MainContainerStateProvider);
@@ -0,0 +1,30 @@
1
+ import Model from '../../../src/data/Model.mjs';
2
+
3
+ /**
4
+ * @class Neo.examples.table.cellEditing.MainModel
5
+ * @extends Neo.data.Model
6
+ */
7
+ class MainModel extends Model {
8
+ static config = {
9
+ className: 'Neo.examples.table.cellEditing.MainModel',
10
+
11
+ fields: [{
12
+ name: 'country',
13
+ type: 'String'
14
+ }, {
15
+ name: 'firstname',
16
+ type: 'String'
17
+ }, {
18
+ name: 'githubId',
19
+ type: 'String'
20
+ }, {
21
+ name: 'randomNumber',
22
+ type: 'Int'
23
+ }, {
24
+ name: 'randomDate',
25
+ type: 'Date'
26
+ }]
27
+ }
28
+ }
29
+
30
+ export default Neo.setupClass(MainModel);
@@ -0,0 +1,54 @@
1
+ import Model from './MainModel.mjs';
2
+ import Store from '../../../src/data/Store.mjs';
3
+
4
+ /**
5
+ * @class Neo.examples.table.cellEditing.MainStore
6
+ * @extends Neo.data.Store
7
+ */
8
+ class MainStore extends Store {
9
+ static config = {
10
+ className : 'Neo.examples.table.cellEditing.MainStore',
11
+ keyProperty: 'githubId',
12
+ model : Model,
13
+
14
+ data: [{
15
+ country : 'DE',
16
+ firstname : 'Tobias',
17
+ githubId : 'tobiu',
18
+ randomDate : '2024-12-20',
19
+ randomNumber: 100
20
+ }, {
21
+ country : 'US',
22
+ firstname : 'Rich',
23
+ githubId : 'rwaters',
24
+ randomDate : '2024-12-18',
25
+ randomNumber: 90
26
+ }, {
27
+ country : 'DE',
28
+ firstname : 'Nils',
29
+ githubId : 'mrsunshine',
30
+ randomDate : '2024-12-19',
31
+ randomNumber: 70
32
+ }, {
33
+ country : 'US',
34
+ firstname : 'Gerard',
35
+ githubId : 'camtnbikerrwc',
36
+ randomDate : '2024-12-17',
37
+ randomNumber: 80
38
+ }, {
39
+ country : 'SK',
40
+ firstname : 'Jozef',
41
+ githubId : 'jsakalos',
42
+ randomDate : '2024-12-16',
43
+ randomNumber: 60
44
+ }, {
45
+ country : 'DE',
46
+ firstname : 'Bastian',
47
+ githubId : 'bhaustein',
48
+ randomDate : '2024-12-15',
49
+ randomNumber: 50
50
+ }]
51
+ }
52
+ }
53
+
54
+ export default Neo.setupClass(MainStore);
@@ -0,0 +1,6 @@
1
+ import MainContainer from './MainContainer.mjs';
2
+
3
+ export const onStart = () => Neo.app({
4
+ mainView: MainContainer,
5
+ name : 'Neo.examples.table.cellEditing'
6
+ });
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE HTML>
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ <meta charset="UTF-8">
6
+ <title>Neo Table CellEditing</title>
7
+ </head>
8
+ <body>
9
+ <script src="../../../src/MicroLoader.mjs" type="module"></script>
10
+ </body>
11
+ </html>
@@ -0,0 +1,6 @@
1
+ {
2
+ "appPath" : "examples/table/cellEditing/app.mjs",
3
+ "basePath" : "../../../",
4
+ "environment": "development",
5
+ "mainPath" : "./Main.mjs"
6
+ }
@@ -30,7 +30,8 @@ class MainContainerStateProvider extends StateProvider {
30
30
  fields: [
31
31
  {name: 'code'},
32
32
  {name: 'name'}
33
- ]}
33
+ ]
34
+ }
34
35
  },
35
36
  mainStore: MainStore
36
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.0.0-beta.2",
3
+ "version": "8.0.1",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -45,27 +45,27 @@
45
45
  },
46
46
  "homepage": "https://neomjs.com/",
47
47
  "devDependencies": {
48
- "@fortawesome/fontawesome-free": "^6.7.1",
48
+ "@fortawesome/fontawesome-free": "^6.7.2",
49
49
  "autoprefixer": "^10.4.20",
50
- "chalk": "^5.3.0",
50
+ "chalk": "^5.4.1",
51
51
  "clean-webpack-plugin": "^4.0.0",
52
52
  "commander": "^12.1.0",
53
53
  "cssnano": "^7.0.6",
54
54
  "envinfo": "^7.14.0",
55
55
  "fs-extra": "^11.2.0",
56
56
  "highlightjs-line-numbers.js": "^2.9.0",
57
- "inquirer": "^12.1.0",
58
- "marked": "^15.0.3",
57
+ "inquirer": "^12.3.0",
58
+ "marked": "^15.0.4",
59
59
  "monaco-editor": "0.50.0",
60
60
  "neo-jsdoc": "1.0.1",
61
61
  "neo-jsdoc-x": "1.0.5",
62
62
  "postcss": "^8.4.49",
63
- "sass": "^1.81.0",
63
+ "sass": "^1.83.0",
64
64
  "siesta-lite": "5.5.2",
65
65
  "url": "^0.11.4",
66
- "webpack": "^5.96.1",
66
+ "webpack": "^5.97.1",
67
67
  "webpack-cli": "^5.1.4",
68
- "webpack-dev-server": "^5.1.0",
68
+ "webpack-dev-server": "^5.2.0",
69
69
  "webpack-hook-plugin": "^1.0.7",
70
70
  "webpack-node-externals": "^3.0.0"
71
71
  },
@@ -31,17 +31,26 @@
31
31
  padding : var(--button-padding);
32
32
  }
33
33
 
34
- .neo-version,
35
- .portal-home-footer-spacer {
34
+ .neo-version {
36
35
  height: var(--button-height);
37
36
  margin: var(--button-margin);
38
37
  }
39
38
 
39
+ .portal-home-footer-spacer {
40
+ height: calc(2 * var(--button-height));
41
+ margin: calc(2 * var(--button-margin));
42
+ }
43
+
40
44
  .portal-home-footer-section {
41
45
  background-color: transparent;
42
46
  color : white;
43
47
  }
44
48
 
49
+ .portal-home-footer-spacer {
50
+ height: calc(2 * var(--button-height));
51
+ margin: calc(2 * var(--button-margin));
52
+ }
53
+
45
54
  @media (max-width: 800px) {
46
55
  max-height: 18em;
47
56
  min-height: 18em;
@@ -43,19 +43,6 @@
43
43
  z-index : 5;
44
44
  }
45
45
 
46
- .neo-grid-header-cell:nth-child(1) {
47
- position: sticky;
48
- left : 0;
49
- top : 0;
50
- z-index : 200 !important;
51
- }
52
-
53
- .neo-grid-cell:nth-child(1) {
54
- position: sticky;
55
- left : 0;
56
- z-index : 20;
57
- }
58
-
59
46
  .neo-grid-cell, .neo-grid-header-cell {
60
47
  border-bottom: 1px solid var(--grid-container-border-color);
61
48
  border-right : 1px solid var(--grid-container-border-color);
@@ -0,0 +1,11 @@
1
+ .neo-grid-view {
2
+ .neo-grid-cell {
3
+ &:has(.neo-grid-editor) {
4
+ padding: 1px 4px 2px;
5
+ }
6
+ }
7
+
8
+ .neo-grid-editor {
9
+ margin: 0;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ .neo-table-view {
2
+ .neo-table-cell {
3
+ &:has(.neo-table-editor) {
4
+ padding: 1px 4px 2px;
5
+ }
6
+ }
7
+
8
+ .neo-table-editor {
9
+ margin: 0;
10
+ }
11
+ }
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '8.0.0-beta.2'
265
+ * @default '8.0.1'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '8.0.0-beta.2'
270
+ version: '8.0.1'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
package/src/Neo.mjs CHANGED
@@ -5,12 +5,12 @@ const
5
5
  configSymbol = Symbol.for('configSymbol'),
6
6
  getSetCache = Symbol('getSetCache'),
7
7
  typeDetector = {
8
- function: (item) => {
8
+ function: item => {
9
9
  if (item.prototype?.constructor.isClass) {
10
10
  return 'NeoClass'
11
11
  }
12
12
  },
13
- object: (item) => {
13
+ object: item => {
14
14
  if (item.constructor.isClass && item instanceof Neo.core.Base) {
15
15
  return 'NeoInstance'
16
16
  }
@@ -244,9 +244,9 @@ class LivePreview extends Container {
244
244
  index = path.lastIndexOf('../');
245
245
 
246
246
  if (index === 0) {
247
- path = '../../../../src/' + path.slice(index+3);
247
+ path = '../../../../src/' + path.slice(index + 3);
248
248
  } else {
249
- path = path.slice(0, index) + '../../../' + path.slice(index+3);
249
+ path = path.slice(0, index) + '../../../' + path.slice(index + 3);
250
250
  }
251
251
  }
252
252
 
@@ -392,6 +392,21 @@ class DateSelector extends Component {
392
392
  return ClassSystemUtil.beforeSetInstance(value, DateSelectorModel)
393
393
  }
394
394
 
395
+ /**
396
+ * Triggered before the value config gets changed
397
+ * @param {String} value
398
+ * @param {String} oldValue
399
+ * @protected
400
+ */
401
+ beforeSetValue(value, oldValue) {
402
+ // If the value is set as a Date, try to convert it into a string
403
+ if (Neo.typeOf(value) === 'Date') {
404
+ return DateUtil.convertToyyyymmdd(value)
405
+ }
406
+
407
+ return value
408
+ }
409
+
395
410
  /**
396
411
  * Triggered before the weekStartDay config gets changed
397
412
  * @param {String} value
package/src/core/Base.mjs CHANGED
@@ -605,7 +605,7 @@ class Base {
605
605
  timeout(time) {
606
606
  return new Promise(resolve => {
607
607
  let timeoutIds = this.#timeoutIds,
608
- timeoutId = setTimeout(() => {timeoutIds.splice(timeoutIds.indexOf(timeoutId, 1)); resolve()}, time);
608
+ timeoutId = setTimeout(() => {timeoutIds.splice(timeoutIds.indexOf(timeoutId), 1); resolve()}, time);
609
609
 
610
610
  timeoutIds.push(timeoutId)
611
611
  })