neo.mjs 8.0.0-alpha.2 → 8.0.0-beta.2

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 (186) hide show
  1. package/.github/CODING_GUIDELINES.md +5 -5
  2. package/.github/CONCEPT.md +10 -10
  3. package/apps/ServiceWorker.mjs +2 -2
  4. package/apps/colors/view/Viewport.mjs +9 -9
  5. package/apps/colors/view/ViewportController.mjs +13 -13
  6. package/apps/colors/view/{ViewportModel.mjs → ViewportStateProvider.mjs} +8 -8
  7. package/apps/covid/view/MainContainer.mjs +22 -22
  8. package/apps/covid/view/MainContainerController.mjs +8 -10
  9. package/apps/covid/view/{MainContainerModel.mjs → MainContainerStateProvider.mjs} +7 -7
  10. package/apps/covid/view/TableContainer.mjs +2 -2
  11. package/apps/covid/view/TableContainerController.mjs +1 -1
  12. package/apps/form/view/FormContainerController.mjs +2 -2
  13. package/apps/form/view/SideNavList.mjs +3 -3
  14. package/apps/form/view/Viewport.mjs +7 -7
  15. package/apps/form/view/ViewportController.mjs +4 -4
  16. package/apps/form/view/{ViewportModel.mjs → ViewportStateProvider.mjs} +8 -8
  17. package/apps/portal/index.html +1 -1
  18. package/apps/portal/resources/data/examples_devmode.json +3 -3
  19. package/apps/portal/resources/data/examples_dist_dev.json +3 -3
  20. package/apps/portal/resources/data/examples_dist_prod.json +3 -3
  21. package/apps/portal/view/Viewport.mjs +12 -12
  22. package/apps/portal/view/ViewportController.mjs +2 -2
  23. package/apps/portal/view/ViewportStateProvider.mjs +27 -0
  24. package/apps/portal/view/examples/TabContainer.mjs +11 -11
  25. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  26. package/apps/portal/view/home/parts/MainNeo.mjs +6 -2
  27. package/apps/portal/view/learn/ContentComponent.mjs +2 -2
  28. package/apps/portal/view/learn/ContentTreeList.mjs +1 -1
  29. package/apps/portal/view/learn/MainContainer.mjs +9 -9
  30. package/apps/portal/view/learn/MainContainerController.mjs +12 -12
  31. package/apps/portal/view/learn/{MainContainerModel.mjs → MainContainerStateProvider.mjs} +7 -7
  32. package/apps/portal/view/learn/PageSectionsList.mjs +1 -1
  33. package/apps/realworld/view/article/CreateComponent.mjs +1 -1
  34. package/apps/realworld2/view/HomeContainer.mjs +7 -7
  35. package/apps/sharedcovid/view/GalleryContainer.mjs +2 -2
  36. package/apps/sharedcovid/view/HelixContainer.mjs +2 -2
  37. package/apps/sharedcovid/view/MainContainer.mjs +25 -25
  38. package/apps/sharedcovid/view/MainContainerController.mjs +10 -11
  39. package/apps/sharedcovid/view/{MainContainerModel.mjs → MainContainerStateProvider.mjs} +8 -8
  40. package/apps/sharedcovid/view/TableContainer.mjs +2 -2
  41. package/apps/sharedcovid/view/TableContainerController.mjs +1 -1
  42. package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -2
  43. package/buildScripts/createApp.mjs +2 -2
  44. package/buildScripts/createClass.mjs +15 -17
  45. package/buildScripts/createComponent.mjs +4 -4
  46. package/docs/app/view/ContentTabContainer.mjs +1 -1
  47. package/docs/app/view/MainContainer.mjs +3 -3
  48. package/docs/app/view/MainContainerController.mjs +15 -15
  49. package/examples/ServiceWorker.mjs +2 -2
  50. package/examples/component/mwc/buttons/MainContainer.mjs +2 -2
  51. package/examples/component/mwc/textFields/MainContainer.mjs +2 -2
  52. package/examples/fields/MainContainer.mjs +197 -228
  53. package/examples/preloadingAssets/view/MainContainer.mjs +2 -2
  54. package/examples/{model → stateProvider}/advanced/MainContainer.mjs +12 -12
  55. package/examples/{model → stateProvider}/advanced/MainContainerController.mjs +10 -10
  56. package/examples/stateProvider/advanced/app.mjs +6 -0
  57. package/examples/{model/dialog → stateProvider/advanced}/index.html +1 -1
  58. package/examples/{model/inline → stateProvider/advanced}/neo-config.json +1 -1
  59. package/examples/{model → stateProvider}/dialog/EditUserDialog.mjs +3 -3
  60. package/examples/{model → stateProvider}/dialog/EditUserDialogController.mjs +5 -5
  61. package/examples/{model → stateProvider}/dialog/MainContainer.mjs +7 -7
  62. package/examples/{model → stateProvider}/dialog/MainContainerController.mjs +5 -5
  63. package/examples/{model → stateProvider}/dialog/app.mjs +1 -1
  64. package/examples/{model/multiWindow2 → stateProvider/dialog}/index.html +1 -1
  65. package/examples/{model → stateProvider}/dialog/neo-config.json +1 -1
  66. package/examples/{model → stateProvider}/extendedClass/MainContainer.mjs +13 -13
  67. package/examples/{model/inline → stateProvider/extendedClass}/MainContainerController.mjs +7 -7
  68. package/examples/stateProvider/extendedClass/MainContainerStateProvider.mjs +24 -0
  69. package/examples/stateProvider/extendedClass/app.mjs +6 -0
  70. package/examples/stateProvider/extendedClass/index.html +11 -0
  71. package/examples/stateProvider/extendedClass/neo-config.json +7 -0
  72. package/examples/{model → stateProvider}/inline/MainContainer.mjs +10 -10
  73. package/examples/{model/extendedClass → stateProvider/inline}/MainContainerController.mjs +7 -7
  74. package/examples/{model/extendedClass → stateProvider/inline}/app.mjs +1 -1
  75. package/examples/{model/extendedClass → stateProvider/inline}/index.html +1 -1
  76. package/examples/{model/extendedClass → stateProvider/inline}/neo-config.json +1 -1
  77. package/examples/{model/inlineNoModel → stateProvider/inlineNoStateProvider}/MainContainer.mjs +4 -4
  78. package/examples/{model/inlineNoModel → stateProvider/inlineNoStateProvider}/MainContainerController.mjs +3 -3
  79. package/examples/stateProvider/inlineNoStateProvider/README.md +8 -0
  80. package/examples/stateProvider/inlineNoStateProvider/app.mjs +6 -0
  81. package/examples/{model/inline → stateProvider/inlineNoStateProvider}/index.html +1 -1
  82. package/examples/stateProvider/inlineNoStateProvider/neo-config.json +7 -0
  83. package/examples/{model → stateProvider}/multiWindow/EditUserDialog.mjs +3 -3
  84. package/examples/{model → stateProvider}/multiWindow/EditUserDialogController.mjs +5 -5
  85. package/examples/{model → stateProvider}/multiWindow/MainContainer.mjs +3 -3
  86. package/examples/{model → stateProvider}/multiWindow/MainContainerController.mjs +6 -6
  87. package/examples/{model → stateProvider}/multiWindow/Viewport.mjs +3 -3
  88. package/examples/{model → stateProvider}/multiWindow/ViewportController.mjs +14 -14
  89. package/examples/{model/multiWindow2 → stateProvider/multiWindow}/app.mjs +1 -1
  90. package/examples/{model/advanced → stateProvider/multiWindow}/index.html +1 -1
  91. package/examples/{model → stateProvider}/multiWindow/neo-config.json +1 -1
  92. package/examples/{model → stateProvider}/multiWindow2/Viewport.mjs +3 -3
  93. package/examples/{model/multiWindow → stateProvider/multiWindow2}/app.mjs +1 -1
  94. package/examples/{model/multiWindow → stateProvider/multiWindow2}/index.html +1 -1
  95. package/examples/{model → stateProvider}/multiWindow2/neo-config.json +1 -1
  96. package/examples/{model → stateProvider}/nestedData/MainContainer.mjs +9 -9
  97. package/examples/{model → stateProvider}/nestedData/MainContainerController.mjs +7 -7
  98. package/examples/stateProvider/nestedData/app.mjs +6 -0
  99. package/examples/stateProvider/nestedData/index.html +11 -0
  100. package/examples/stateProvider/nestedData/neo-config.json +7 -0
  101. package/examples/{model → stateProvider}/table/MainContainer.mjs +8 -8
  102. package/examples/stateProvider/table/MainContainerStateProvider.mjs +24 -0
  103. package/examples/{model → stateProvider}/table/MainModel.mjs +2 -2
  104. package/examples/{model → stateProvider}/table/MainStore.mjs +2 -2
  105. package/examples/{model/advanced → stateProvider/table}/app.mjs +1 -1
  106. package/examples/{model/advanced → stateProvider/table}/neo-config.json +1 -1
  107. package/examples/{model → stateProvider}/twoWay/MainContainer.mjs +9 -9
  108. package/examples/{model/inline → stateProvider/twoWay}/app.mjs +1 -1
  109. package/examples/stateProvider/twoWay/index.html +11 -0
  110. package/examples/{model → stateProvider}/twoWay/neo-config.json +1 -1
  111. package/examples/tab/container/MainContainer.mjs +7 -9
  112. package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -3
  113. package/examples/table/nestedRecordFields/MainContainer.mjs +8 -8
  114. package/examples/table/nestedRecordFields/{MainContainerModel.mjs → MainContainerStateProvider.mjs} +10 -10
  115. package/examples/tabs/MainContainer.mjs +3 -3
  116. package/examples/tabs/MainContainer2.mjs +4 -4
  117. package/examples/toolbar/paging/view/MainContainer.mjs +7 -7
  118. package/examples/toolbar/paging/view/{MainContainerModel.mjs → MainContainerStateProvider.mjs} +8 -8
  119. package/examples/treeAccordion/MainContainer.mjs +2 -2
  120. package/examples/videoMove/MainContainer.mjs +14 -7
  121. package/examples/viewport/MainContainer.mjs +3 -3
  122. package/package.json +6 -6
  123. package/resources/data/deck/learnneo/pages/benefits/FormsEngine.md +13 -13
  124. package/resources/data/deck/learnneo/pages/guides/{ViewModels.md → StateProviders.md} +52 -58
  125. package/resources/data/deck/learnneo/tree.json +46 -46
  126. package/resources/data/deck/training/pages/2022-12-27T21-55-23-144Z.md +2 -2
  127. package/resources/data/deck/training/pages/2022-12-28T17-11-34-653Z.md +6 -6
  128. package/resources/data/deck/training/pages/2022-12-29T18-36-08-226Z.md +2 -2
  129. package/resources/data/deck/training/pages/2022-12-29T18-36-56-893Z.md +2 -2
  130. package/resources/data/deck/training/pages/2022-12-29T20-37-08-919Z.md +2 -2
  131. package/resources/data/deck/training/pages/2022-12-29T20-37-20-344Z.md +2 -2
  132. package/resources/data/deck/training/pages/2023-01-01T21-11-58-025Z.md +3 -3
  133. package/resources/data/deck/training/pages/2023-01-16T20-24-09-690Z.md +4 -4
  134. package/resources/data/deck/training/pages/2023-02-05T17-44-53-815Z.md +3 -3
  135. package/resources/data/deck/training/pages/2023-02-05T17-45-40-114Z.md +1 -1
  136. package/src/DefaultConfig.mjs +2 -2
  137. package/src/button/Base.mjs +7 -7
  138. package/src/calendar/view/EditEventContainer.mjs +3 -3
  139. package/src/calendar/view/MainContainer.mjs +27 -27
  140. package/src/calendar/view/{MainContainerModel.mjs → MainContainerStateProvider.mjs} +7 -7
  141. package/src/calendar/view/SettingsContainer.mjs +13 -28
  142. package/src/calendar/view/YearComponent.mjs +5 -5
  143. package/src/calendar/view/calendars/ColorsList.mjs +5 -0
  144. package/src/calendar/view/calendars/EditContainer.mjs +1 -1
  145. package/src/calendar/view/calendars/List.mjs +1 -1
  146. package/src/calendar/view/month/Component.mjs +6 -6
  147. package/src/calendar/view/settings/GeneralContainer.mjs +2 -2
  148. package/src/calendar/view/week/Component.mjs +10 -10
  149. package/src/calendar/view/week/EventDragZone.mjs +1 -1
  150. package/src/code/LivePreview.mjs +10 -10
  151. package/src/component/Base.mjs +123 -105
  152. package/src/container/Base.mjs +4 -4
  153. package/src/controller/Component.mjs +29 -12
  154. package/src/core/Base.mjs +0 -1
  155. package/src/core/Compare.mjs +128 -83
  156. package/src/date/SelectorContainer.mjs +12 -12
  157. package/src/date/{SelectorContainerModel.mjs → SelectorContainerStateProvider.mjs} +7 -7
  158. package/src/form/field/Text.mjs +1 -1
  159. package/src/form/field/Time.mjs +5 -3
  160. package/src/form/field/trigger/Time.mjs +2 -1
  161. package/src/layout/Base.mjs +6 -6
  162. package/src/list/Base.mjs +7 -1
  163. package/src/list/Color.mjs +3 -3
  164. package/src/main/DomEvents.mjs +1 -1
  165. package/src/main/DomUtils.mjs +39 -36
  166. package/src/{model/Component.mjs → state/Provider.mjs} +67 -69
  167. package/src/tab/Container.mjs +3 -5
  168. package/src/toolbar/Base.mjs +26 -8
  169. package/src/tree/Accordion.mjs +15 -13
  170. package/src/util/VNode.mjs +6 -8
  171. package/src/worker/App.mjs +2 -2
  172. package/apps/portal/view/ViewportModel.mjs +0 -27
  173. package/examples/model/extendedClass/MainContainerModel.mjs +0 -24
  174. package/examples/model/inlineNoModel/README.md +0 -8
  175. package/examples/model/inlineNoModel/app.mjs +0 -6
  176. package/examples/model/inlineNoModel/index.html +0 -11
  177. package/examples/model/inlineNoModel/neo-config.json +0 -7
  178. package/examples/model/nestedData/app.mjs +0 -6
  179. package/examples/model/nestedData/index.html +0 -11
  180. package/examples/model/nestedData/neo-config.json +0 -7
  181. package/examples/model/table/MainContainerModel.mjs +0 -24
  182. package/examples/model/table/app.mjs +0 -6
  183. package/examples/model/table/neo-config.json +0 -7
  184. package/examples/model/twoWay/app.mjs +0 -6
  185. package/examples/model/twoWay/index.html +0 -11
  186. /package/examples/{model → stateProvider}/table/index.html +0 -0
@@ -32,7 +32,7 @@ class MainContainer2 extends Container {
32
32
  },
33
33
 
34
34
  items: [{
35
- tabButtonConfig: {
35
+ header: {
36
36
  iconCls: 'fa fa-home',
37
37
  text : 'Tab 1'
38
38
  },
@@ -40,7 +40,7 @@ class MainContainer2 extends Container {
40
40
  innerHTML: 'Tab Content 1'
41
41
  }
42
42
  }, {
43
- tabButtonConfig: {
43
+ header: {
44
44
  iconCls: 'fa fa-play-circle',
45
45
  text : 'Tab 2'
46
46
  },
@@ -88,7 +88,7 @@ class MainContainer2 extends Container {
88
88
  }]
89
89
  }],
90
90
 
91
- tabButtonConfig: {
91
+ header: {
92
92
  iconCls: 'fa fa-user',
93
93
  text : 'Tab 3'
94
94
  }
@@ -128,7 +128,7 @@ class MainContainer2 extends Container {
128
128
  this.tabCount++;
129
129
 
130
130
  tabContainer.insert(3, {
131
- tabButtonConfig: {
131
+ header: {
132
132
  iconCls: 'fa fa-user',
133
133
  text : 'Dynamic Tab ' + this.tabCount
134
134
  },
@@ -1,8 +1,8 @@
1
- import MainContainerController from './MainContainerController.mjs';
2
- import MainContainerModel from './MainContainerModel.mjs';
3
- import PagingToolbar from '../../../../src/toolbar/Paging.mjs';
4
- import UserTableContainer from './UserTableContainer.mjs';
5
- import Viewport from '../../../../src/container/Viewport.mjs';
1
+ import MainContainerController from './MainContainerController.mjs';
2
+ import MainContainerStateProvider from './MainContainerStateProvider.mjs';
3
+ import PagingToolbar from '../../../../src/toolbar/Paging.mjs';
4
+ import UserTableContainer from './UserTableContainer.mjs';
5
+ import Viewport from '../../../../src/container/Viewport.mjs';
6
6
 
7
7
  /**
8
8
  * @class Neo.examples.toolbar.paging.view.MainContainer
@@ -92,9 +92,9 @@ class MainContainer extends Viewport {
92
92
  */
93
93
  layout: {ntype: 'vbox', align: 'stretch'},
94
94
  /**
95
- * @member {Neo.model.Component} model=MainContainerModel
95
+ * @member {Neo.state.Provider} stateProvider=MainContainerStateProvider
96
96
  */
97
- model: MainContainerModel,
97
+ stateProvider: MainContainerStateProvider,
98
98
  /**
99
99
  * @member {Object} style={padding:'20px'}
100
100
  */
@@ -1,17 +1,17 @@
1
- import Model from '../../../../src/model/Component.mjs';
2
- import UserStore from '../store/Users.mjs';
1
+ import StateProvider from '../../../../src/state/Provider.mjs';
2
+ import UserStore from '../store/Users.mjs';
3
3
 
4
4
  /**
5
- * @class Neo.examples.toolbar.paging.view.MainContainerModel
6
- * @extends Neo.model.Component
5
+ * @class Neo.examples.toolbar.paging.view.MainContainerStateProvider
6
+ * @extends Neo.state.Provider
7
7
  */
8
- class MainContainerModel extends Model {
8
+ class MainContainerStateProvider extends StateProvider {
9
9
  static config = {
10
10
  /**
11
- * @member {String} className='Neo.examples.toolbar.paging.view.MainContainerModel'
11
+ * @member {String} className='Neo.examples.toolbar.paging.view.MainContainerStateProvider'
12
12
  * @protected
13
13
  */
14
- className: 'Neo.examples.toolbar.paging.view.MainContainerModel',
14
+ className: 'Neo.examples.toolbar.paging.view.MainContainerStateProvider',
15
15
  /**
16
16
  * @member {Object} stores
17
17
  */
@@ -24,4 +24,4 @@ class MainContainerModel extends Model {
24
24
  }
25
25
  }
26
26
 
27
- export default Neo.setupClass(MainContainerModel);
27
+ export default Neo.setupClass(MainContainerStateProvider);
@@ -3,9 +3,9 @@ import CheckBox from '../../src/form/field/CheckBox.mjs';
3
3
  import ConfigurationViewport from '../ConfigurationViewport.mjs';
4
4
  import NumberField from '../../src/form/field/Number.mjs';
5
5
  import Panel from '../../src/container/Panel.mjs';
6
+ import StateProvider from '../../src/state/Provider.mjs';
6
7
  import Store from '../../src/data/Store.mjs';
7
8
  import ViewController from '../../src/controller/Component.mjs';
8
- import ViewModel from '../../src/model/Component.mjs';
9
9
 
10
10
  /**
11
11
  * @class Neo.examples.treeAccordion.MainContainer
@@ -103,7 +103,7 @@ class MainContainer extends ConfigurationViewport {
103
103
  return Neo.ntype({
104
104
  ntype: 'container',
105
105
 
106
- model: {
106
+ stateProvider: {
107
107
  data: {
108
108
  selection: [{name: 'Please select something'}]
109
109
  }
@@ -13,9 +13,10 @@ class MainContainer extends Viewport {
13
13
  layout : {ntype: 'vbox', align: 'stretch'},
14
14
 
15
15
  items: [{
16
- ntype : 'container',
17
- cls : ['video-wrapper'],
18
- layout: {ntype: 'hbox', align: 'stretch'},
16
+ ntype : 'container',
17
+ cls : ['video-wrapper'],
18
+ layout : {ntype: 'hbox', align: 'stretch'},
19
+ reference: 'video-wrapper',
19
20
 
20
21
  itemDefaults: {
21
22
  ntype : 'container',
@@ -51,9 +52,10 @@ class MainContainer extends Viewport {
51
52
  * @param {Object} data
52
53
  */
53
54
  onMoveVideoButtonClick(data) {
54
- let me = this,
55
- container1 = me.getReference('container-1'),
56
- container2 = me.getReference('container-2');
55
+ let me = this,
56
+ container1 = me.getReference('container-1'),
57
+ container2 = me.getReference('container-2'),
58
+ videoWrapper = me.getReference('video-wrapper');
57
59
 
58
60
  container1.silentVdomUpdate = true;
59
61
  container2.silentVdomUpdate = true;
@@ -64,7 +66,12 @@ class MainContainer extends Viewport {
64
66
  container1.add(container2.removeAt(0, false))
65
67
  }
66
68
 
67
- me.promiseUpdate().then(() => {
69
+ // include 2 level of children:
70
+ // level 1 => container-1, container-2
71
+ // level 2 => video element(s)
72
+ videoWrapper.updateDepth = 3;
73
+
74
+ videoWrapper.promiseUpdate().then(() => {
68
75
  container1.silentVdomUpdate = false;
69
76
  container2.silentVdomUpdate = false
70
77
  })
@@ -68,12 +68,12 @@ class MainContainer extends Viewport {
68
68
  text : 'Left'
69
69
  }],
70
70
 
71
- tabButtonConfig: {
71
+ header: {
72
72
  iconCls: 'fa fa-home',
73
73
  text : 'Tab 1'
74
74
  }
75
75
  }, {
76
- tabButtonConfig: {
76
+ header: {
77
77
  iconCls: 'fa fa-play-circle',
78
78
  text : 'Tab 2'
79
79
  },
@@ -81,7 +81,7 @@ class MainContainer extends Viewport {
81
81
  innerHTML: 'Test 2'
82
82
  }
83
83
  }, {
84
- tabButtonConfig: {
84
+ header: {
85
85
  iconCls: 'fa fa-user',
86
86
  text : 'Tab 3'
87
87
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.0.0-alpha.2",
3
+ "version": "8.0.0-beta.2",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "homepage": "https://neomjs.com/",
47
47
  "devDependencies": {
48
- "@fortawesome/fontawesome-free": "^6.6.0",
48
+ "@fortawesome/fontawesome-free": "^6.7.1",
49
49
  "autoprefixer": "^10.4.20",
50
50
  "chalk": "^5.3.0",
51
51
  "clean-webpack-plugin": "^4.0.0",
@@ -54,13 +54,13 @@
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.0.1",
58
- "marked": "^15.0.0",
57
+ "inquirer": "^12.1.0",
58
+ "marked": "^15.0.3",
59
59
  "monaco-editor": "0.50.0",
60
60
  "neo-jsdoc": "1.0.1",
61
61
  "neo-jsdoc-x": "1.0.5",
62
- "postcss": "^8.4.48",
63
- "sass": "^1.80.6",
62
+ "postcss": "^8.4.49",
63
+ "sass": "^1.81.0",
64
64
  "siesta-lite": "5.5.2",
65
65
  "url": "^0.11.4",
66
66
  "webpack": "^5.96.1",
@@ -147,12 +147,12 @@ class MainView extends FormContainer {
147
147
  }, {
148
148
  module: TabContainer,
149
149
  items : [{
150
- module : FormContainer,
151
- itemDefaults : {module: TextField, labelPosition: 'inline'},
152
- layout : {ntype:'vbox', align:'start'},
153
- reference : 'user-form',
154
- tabButtonConfig: {text: 'User'},
155
- tag : 'div',
150
+ module : FormContainer,
151
+ header : {text: 'User'},
152
+ itemDefaults: {module: TextField, labelPosition: 'inline'},
153
+ layout : {ntype:'vbox', align:'start'},
154
+ reference : 'user-form',
155
+ tag : 'div',
156
156
 
157
157
  items: [{
158
158
  labelText: 'Firstname',
@@ -165,12 +165,12 @@ class MainView extends FormContainer {
165
165
  value : 'Doe'
166
166
  }]
167
167
  }, {
168
- module : FormContainer,
169
- itemDefaults : {module: TextField, labelPosition: 'inline'},
170
- layout : {ntype:'vbox', align:'start'},
171
- reference : 'product-form',
172
- tabButtonConfig: {text: 'Product'},
173
- tag : 'div',
168
+ module : FormContainer,
169
+ header : {text: 'Product'},
170
+ itemDefaults: {module: TextField, labelPosition: 'inline'},
171
+ layout : {ntype:'vbox', align:'start'},
172
+ reference : 'product-form',
173
+ tag : 'div',
174
174
 
175
175
  items: [{
176
176
  labelText: 'Name',
@@ -189,7 +189,7 @@ class MainView extends FormContainer {
189
189
  itemDefaults: {module: Button},
190
190
  layout : {ntype: 'hbox'},
191
191
 
192
- items : [{
192
+ items: [{
193
193
  handler: 'up.getMainFormValues',
194
194
  text : 'Get Main Values'
195
195
  }, {
@@ -1,19 +1,14 @@
1
- View models (VMs) in Neo.mjs are state providers.
2
-
3
1
  While Components can manage their own state using the Class Config System,
4
2
  you want to use VMs as soon as you want to share data properties with multiple child Components.
5
3
 
6
4
  Rules of thumb:
7
- 1. Leaf Components inside the Component Tree (Container items) will most likely not need a VM.
8
- 2. We can define multiple VMs as needed (they do communicate).
5
+ 1. Leaf Components inside the Component Tree (Container items) will not need a state provider.
6
+ 2. We can define multiple state providers as needed (they do communicate).
9
7
  3. We want to define shared state data properties as low inside the component tree as possible.
10
8
 
11
- We often reference a VM as `model.Component` (the class name inside Neo.mjs),
12
- other libraries or frameworks often call them Stores.
13
-
14
- Since we also have Data Stores (tabular data), we chose to use the name VM to avoid confusion.
9
+ Other libraries or frameworks often call state providers "Stores".
15
10
 
16
- ## Inline Models
11
+ ## Inline State Providers
17
12
  ### Direct Bindings
18
13
  <pre data-neo>
19
14
  import Button from '../button/Base.mjs';
@@ -23,7 +18,7 @@ import Label from '../component/Label.mjs';
23
18
  class MainView extends Container {
24
19
  static config = {
25
20
  className: 'Guides.vm1.MainView',
26
- model: {
21
+ stateProvider: {
27
22
  data: {
28
23
  hello: 'Hello',
29
24
  world: 'world!'
@@ -43,11 +38,11 @@ class MainView extends Container {
43
38
  }
44
39
  }, {
45
40
  module : Button,
46
- handler: data => data.component.getModel().setData({hello: 'Hi'}),
41
+ handler: data => data.component.setState({hello: 'Hi'}),
47
42
  text : 'Change Hello'
48
43
  }, {
49
44
  module : Button,
50
- handler: data => data.component.getModel().setData({world: 'Neo.mjs!'}),
45
+ handler: data => data.component.setState({world: 'Neo.mjs!'}),
51
46
  text : 'Change World'
52
47
  }],
53
48
  layout: {ntype: 'vbox', align: 'start'}
@@ -56,7 +51,7 @@ class MainView extends Container {
56
51
  MainView = Neo.setupClass(MainView);
57
52
  </pre>
58
53
 
59
- We use a Container with a VM containing the data props `hello` and `world`.
54
+ We use a Container with a stateProvider containing the data props `hello` and `world`.
60
55
  Inside the Container are 2 Labels which bind their `text` config to a data prop directly.
61
56
 
62
57
  We can easily bind 1:1 to specific data props using the following syntax:</br>
@@ -71,7 +66,7 @@ import Label from '../component/Label.mjs';
71
66
  class MainView extends Container {
72
67
  static config = {
73
68
  className: 'Guides.vm2.MainView',
74
- model: {
69
+ stateProvider: {
75
70
  data: {
76
71
  hello: 'Hello',
77
72
  world: 'world!'
@@ -98,11 +93,11 @@ class MainView extends Container {
98
93
  }
99
94
  }, {
100
95
  module : Button,
101
- handler: data => data.component.getModel().setData({hello: 'Hi'}),
96
+ handler: data => data.component.setState({hello: 'Hi'}),
102
97
  text : 'Change Hello'
103
98
  }, {
104
99
  module : Button,
105
- handler: data => data.component.getModel().setData({world: 'Neo.mjs!'}),
100
+ handler: data => data.component.setState({world: 'Neo.mjs!'}),
106
101
  text : 'Change World'
107
102
  }],
108
103
  layout: {ntype: 'vbox', align: 'start'}
@@ -111,7 +106,7 @@ class MainView extends Container {
111
106
  MainView = Neo.setupClass(MainView);
112
107
  </pre>
113
108
 
114
- We use a Container with a VM containing the data props `hello` and `world`.
109
+ We use a Container with a stateProvider containing the data props `hello` and `world`.
115
110
  Inside the Container are 3 Labels which bind their `text` config to a combination of both data props.
116
111
 
117
112
  We are showcasing 3 different ways how you can define your binding (resulting in the same output).
@@ -124,12 +119,15 @@ We also added 2 Buttons to change the value of each data prop, so that we can se
124
119
  update right away.
125
120
 
126
121
  Let us take a look at the Button handler:</br>
127
- `data.component.getModel().setData({world: 'Neo.mjs!'})`
122
+ `data.component.setState({world: 'Neo.mjs!'})`
123
+
124
+ This is a shortcut syntax for:</br>
125
+ `data.component.getStateProvider().setData({world: 'Neo.mjs!'})`
128
126
 
129
- data.component equals to the Button instance itself. Since the Button instance does not have its own VM,
130
- `getModel()` will return the closest VM inside the parent chain.
127
+ data.component equals to the Button instance itself. Since the Button instance does not have its own stateProvider,
128
+ `getStateProvider()` will return the closest stateProvider inside the parent chain.
131
129
 
132
- ### Nested Inline Models
130
+ ### Nested Inline State Providers
133
131
  <pre data-neo>
134
132
  import Button from '../button/Base.mjs';
135
133
  import Container from '../container/Base.mjs';
@@ -138,7 +136,7 @@ import Label from '../component/Label.mjs';
138
136
  class MainView extends Container {
139
137
  static config = {
140
138
  className: 'Guides.vm3.MainView',
141
- model: {
139
+ stateProvider: {
142
140
  data: {
143
141
  hello: 'Hello'
144
142
  }
@@ -146,7 +144,7 @@ class MainView extends Container {
146
144
  layout: 'fit',
147
145
  items : [{
148
146
  module: Container,
149
- model: {
147
+ stateProvider: {
150
148
  data: {
151
149
  world: 'world!'
152
150
  }
@@ -172,11 +170,11 @@ class MainView extends Container {
172
170
  }
173
171
  }, {
174
172
  module : Button,
175
- handler: data => data.component.getModel().setData({hello: 'Hi'}),
173
+ handler: data => data.component.setState({hello: 'Hi'}),
176
174
  text : 'Change Hello'
177
175
  }, {
178
176
  module : Button,
179
- handler: data => data.component.getModel().setData({world: 'Neo.mjs!'}),
177
+ handler: data => data.component.setState({world: 'Neo.mjs!'}),
180
178
  text : 'Change World'
181
179
  }],
182
180
  layout: {ntype: 'vbox', align: 'start'}
@@ -191,15 +189,15 @@ The output of this demo is supposed to exactly look the same like the previous d
191
189
  This time we nest our Labels into a Container with a fit layout.
192
190
  Just for demo purposes, we want to avoid overnesting inside real apps.
193
191
 
194
- Our top level VM now only contains the `hello` data prop, and we added a second VM inside the nested Container
195
- which contains the `world` data prop.
192
+ Our top level stateProvider now only contains the `hello` data prop, and we added a second stateProvider inside the
193
+ nested Container which contains the `world` data prop.
196
194
 
197
- As a result, the bindings for all 3 Labels contain a combination of data props which live inside different VMs.
195
+ As a result, the bindings for all 3 Labels contain a combination of data props which live inside different stateProviders.
198
196
  As long as these VMs are inside the parent hierarchy this works fine.
199
197
 
200
- The same goes for the Button handlers: `setData()` will find the closest matching data prop inside the VM parent chain.
198
+ The same goes for the Button handlers: `setData()` will find the closest matching data prop inside the stateProvider parent chain.
201
199
 
202
- We can even change data props which live inside different VMs at once. As easy as this:</br>
200
+ We can even change data props which live inside different stateProviders at once. As easy as this:</br>
203
201
  `setData({hello: 'foo', world: 'bar'})`
204
202
 
205
203
  Hint: Modify the example code (Button handler) to try it out right away!
@@ -213,7 +211,7 @@ import Label from '../component/Label.mjs';
213
211
  class MainView extends Container {
214
212
  static config = {
215
213
  className: 'Guides.vm4.MainView',
216
- model: {
214
+ stateProvider: {
217
215
  data: {
218
216
  user: {
219
217
  firstname: 'Tobias',
@@ -235,11 +233,11 @@ class MainView extends Container {
235
233
  }
236
234
  }, {
237
235
  module : Button,
238
- handler: data => data.component.getModel().setData({user: {firstname: 'Max'}}),
236
+ handler: data => data.component.setState({user: {firstname: 'Max'}}),
239
237
  text : 'Change Firstname'
240
238
  }, {
241
239
  module : Button,
242
- handler: data => data.component.getModel().setData({'user.lastname': 'Rahder'}),
240
+ handler: data => data.component.setState({'user.lastname': 'Rahder'}),
243
241
  text : 'Change Lastname'
244
242
  }],
245
243
  layout: {ntype: 'vbox', align: 'start'}
@@ -247,7 +245,7 @@ class MainView extends Container {
247
245
  }
248
246
  MainView = Neo.setupClass(MainView);
249
247
  </pre>
250
- Data props inside VMs can be nested. Our VM contains a `user` data prop as an object,
248
+ Data props inside VMs can be nested. Our stateProvider contains a `user` data prop as an object,
251
249
  which contains the nested props `firstname` and `lastname`.
252
250
 
253
251
  We can bind to these nested props like before:</br>
@@ -256,10 +254,10 @@ We can bind to these nested props like before:</br>
256
254
  Any change of a nested data prop will directly get reflected into the bound components.
257
255
 
258
256
  We can update a nested data prop with passing its path:</br>
259
- `data => data.component.getModel().setData({'user.lastname': 'Rahder'})`
257
+ `data => data.component.setState({'user.lastname': 'Rahder'})`
260
258
 
261
259
  Or we can directly pass the object containing the change(s):</br>
262
- `data => data.component.getModel().setData({user: {firstname: 'Max'}})`
260
+ `data => data.component.setState({user: {firstname: 'Max'}})`
263
261
 
264
262
  Hint: This will not override left out nested data props (lastname in this case).
265
263
 
@@ -277,15 +275,11 @@ class EditUserDialogController extends Controller {
277
275
  }
278
276
 
279
277
  onFirstnameTextFieldChange(data) {
280
- this.getModel().setData({
281
- 'user.firstname': data.value || ''
282
- })
278
+ this.setState({'user.firstname': data.value || ''})
283
279
  }
284
280
 
285
281
  onLastnameTextFieldChange(data) {
286
- this.getModel().setData({
287
- 'user.lastname': data.value || ''
288
- })
282
+ this.setState({'user.lastname': data.value || ''})
289
283
  }
290
284
  }
291
285
  EditUserDialogController = Neo.setupClass(EditUserDialogController);
@@ -327,8 +321,8 @@ class MainContainerController extends Controller {
327
321
  appName : me.component.appName,
328
322
  closeAction : 'hide',
329
323
 
330
- model: {
331
- parent: me.getModel()
324
+ stateProvider: {
325
+ parent: me.getStateProvider()
332
326
  }
333
327
  })
334
328
  } else {
@@ -342,7 +336,7 @@ class MainView extends Viewport {
342
336
  static config = {
343
337
  className : 'Guides.vm5.MainView',
344
338
  controller: MainContainerController,
345
- model: {
339
+ stateProvider: {
346
340
  data: {
347
341
  user: {
348
342
  firstname: 'Tobias',
@@ -386,19 +380,19 @@ class MainView extends Viewport {
386
380
  MainView = Neo.setupClass(MainView);
387
381
  </pre>
388
382
 
389
- ## Class based Models
390
- When your models contain many data props or need custom logic, you can easily move them into their own classes.
383
+ ## Class based State Providers
384
+ When your stateProviders contain many data props or need custom logic, you can easily move them into their own classes.
391
385
 
392
386
  ### Direct Bindings
393
387
  <pre data-neo>
394
- import Button from '../button/Base.mjs';
395
- import Container from '../container/Base.mjs';
396
- import Label from '../component/Label.mjs';
397
- import ViewModel from '../model/Component.mjs';
388
+ import Button from '../button/Base.mjs';
389
+ import Container from '../container/Base.mjs';
390
+ import Label from '../component/Label.mjs';
391
+ import StateProvider from '../state/Provider.mjs';
398
392
 
399
- class MainViewModel extends ViewModel {
393
+ class MainViewStateProvider extends StateProvider {
400
394
  static config = {
401
- className: 'Guides.vm6.MainViewModel',
395
+ className: 'Guides.vm6.MainViewStateProvider',
402
396
  data: {
403
397
  hello: 'Hello',
404
398
  world: 'world!'
@@ -410,12 +404,12 @@ class MainViewModel extends ViewModel {
410
404
  Neo.Main.log({value: `onDataPropertyChange: key: ${key}, value: ${value}, oldValue: ${oldValue}`})
411
405
  }
412
406
  }
413
- MainViewModel = Neo.setupClass(MainViewModel);
407
+ MainViewStateProvider = Neo.setupClass(MainViewStateProvider);
414
408
 
415
409
  class MainView extends Container {
416
410
  static config = {
417
- className: 'Guides.vm6.MainView',
418
- model : MainViewModel, // directly assign the imported module
411
+ className : 'Guides.vm6.MainView',
412
+ stateProvider: MainViewStateProvider, // directly assign the imported module
419
413
 
420
414
  itemDefaults: {
421
415
  module: Label,
@@ -431,11 +425,11 @@ class MainView extends Container {
431
425
  }
432
426
  }, {
433
427
  module : Button,
434
- handler: data => data.component.getModel().setData({hello: 'Hi'}),
428
+ handler: data => data.component.setState({hello: 'Hi'}),
435
429
  text : 'Change Hello'
436
430
  }, {
437
431
  module : Button,
438
- handler: data => data.component.getModel().setData({world: 'Neo.mjs!'}),
432
+ handler: data => data.component.setState({world: 'Neo.mjs!'}),
439
433
  text : 'Change World'
440
434
  }],
441
435
  layout: {ntype: 'vbox', align: 'start'}