neo.mjs 6.17.1 → 6.18.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.
Files changed (329) hide show
  1. package/apps/ServiceWorker.mjs +3 -5
  2. package/apps/colors/README.md +8 -0
  3. package/apps/colors/app.mjs +6 -0
  4. package/apps/colors/childapps/widget/app.mjs +7 -0
  5. package/apps/colors/childapps/widget/index.html +11 -0
  6. package/apps/colors/childapps/widget/neo-config.json +10 -0
  7. package/apps/colors/childapps/widget/view/Viewport.mjs +19 -0
  8. package/apps/colors/index.html +11 -0
  9. package/apps/colors/model/Color.mjs +43 -0
  10. package/apps/colors/neo-config.json +10 -0
  11. package/apps/colors/remotes-api.json +13 -0
  12. package/apps/colors/store/Colors.mjs +24 -0
  13. package/apps/colors/view/BarChartComponent.mjs +64 -0
  14. package/apps/colors/view/HeaderToolbar.mjs +95 -0
  15. package/apps/colors/view/PieChartComponent.mjs +58 -0
  16. package/apps/colors/view/TableContainer.mjs +91 -0
  17. package/apps/colors/view/Viewport.mjs +57 -0
  18. package/apps/colors/view/ViewportController.mjs +277 -0
  19. package/apps/colors/view/ViewportModel.mjs +53 -0
  20. package/apps/portal/Util.mjs +11 -0
  21. package/apps/portal/childapps/preview/neo-config.json +2 -2
  22. package/apps/portal/neo-config.json +2 -1
  23. package/apps/portal/remotes-api.json +13 -0
  24. package/apps/portal/view/HeaderToolbar.mjs +44 -27
  25. package/apps/portal/view/Viewport.mjs +12 -1
  26. package/apps/portal/view/ViewportController.mjs +89 -1
  27. package/apps/portal/view/home/MainContainer.mjs +27 -60
  28. package/apps/portal/view/home/parts/AfterMath.mjs +58 -0
  29. package/apps/portal/view/home/parts/Colors.mjs +74 -0
  30. package/apps/portal/view/home/parts/Features.mjs +52 -0
  31. package/apps/portal/view/home/parts/Helix.mjs +75 -0
  32. package/apps/portal/view/home/parts/HelloWorld.mjs +82 -0
  33. package/apps/portal/view/home/parts/MainNeo.mjs +55 -0
  34. package/apps/portal/view/home/preview/PageCodeContainer.mjs +55 -0
  35. package/apps/portal/view/learn/LivePreview.mjs +72 -29
  36. package/apps/portal/view/learn/MainContainerController.mjs +10 -90
  37. package/apps/realworld/api/Article.mjs +1 -3
  38. package/apps/realworld/api/Favorite.mjs +1 -3
  39. package/apps/realworld/api/Profile.mjs +1 -3
  40. package/apps/realworld/api/Tag.mjs +1 -3
  41. package/apps/realworld/api/User.mjs +1 -3
  42. package/apps/realworld2/api/Article.mjs +1 -3
  43. package/apps/realworld2/api/Favorite.mjs +1 -3
  44. package/apps/realworld2/api/Profile.mjs +1 -3
  45. package/apps/realworld2/api/Tag.mjs +1 -3
  46. package/apps/realworld2/api/User.mjs +1 -3
  47. package/apps/realworld2/view/article/HelixContainer.mjs +5 -5
  48. package/buildScripts/webpack/json/myApps.template.json +1 -0
  49. package/buildScripts/webpack/webpack.server.config.mjs +4 -1
  50. package/docs/app/view/MainContainer.mjs +5 -0
  51. package/docs/app/view/classdetails/MembersList.mjs +1 -1
  52. package/examples/ServiceWorker.mjs +3 -5
  53. package/examples/component/helix/Viewport.mjs +309 -0
  54. package/examples/component/helix/ViewportController.mjs +122 -0
  55. package/examples/component/helix/app.mjs +2 -2
  56. package/examples/component/helix/neo-config.json +0 -1
  57. package/examples/component/multiWindowHelix/Viewport.mjs +11 -3
  58. package/examples/component/multiWindowHelix/ViewportController.mjs +21 -9
  59. package/examples/component/multiWindowHelix/neo-config.json +0 -1
  60. package/examples/fieldWithPrefix/MainContainer.mjs +1 -6
  61. package/examples/list/animate/MainContainerController.mjs +1 -1
  62. package/examples/worker/task/MyTasks.mjs +1 -3
  63. package/package.json +5 -5
  64. package/resources/data/deck/learnneo/pages/GuideEvents.md +131 -0
  65. package/resources/data/deck/learnneo/pages/WhyNeo-Speed.md +1 -1
  66. package/resources/images/logo/neo_logo_primary.svg +6 -0
  67. package/resources/images/logo/neo_logo_secondary.svg +6 -0
  68. package/resources/images/logo/neo_logo_text_primary.svg +5 -0
  69. package/resources/images/logo/neo_logo_text_secondary.svg +5 -0
  70. package/resources/images/logo/neo_logo_white.svg +6 -0
  71. package/resources/scss/src/apps/colors/BarChartComponent.scss +3 -0
  72. package/resources/scss/src/apps/colors/HeaderToolbar.scss +11 -0
  73. package/resources/scss/src/apps/colors/PieChartComponent.scss +3 -0
  74. package/resources/scss/src/apps/colors/TableContainer.scss +64 -0
  75. package/resources/scss/src/apps/colors/Viewport.scss +9 -0
  76. package/resources/scss/src/apps/portal/HeaderToolbar.scss +189 -17
  77. package/resources/scss/src/apps/portal/home/MainContainer.scss +46 -20
  78. package/resources/scss/src/apps/portal/home/parts/Features.scss +3 -0
  79. package/resources/scss/src/apps/portal/home/preview/PageCodeContainer.scss +115 -0
  80. package/resources/scss/src/component/Base.scss +2 -0
  81. package/resources/scss/src/examples/component/multiWindowHelix/Viewport.scss +3 -0
  82. package/resources/scss/src/form/field/CheckBox.scss +1 -0
  83. package/resources/scss/src/tab/header/Button.scss +2 -1
  84. package/resources/scss/theme-dark/Global.scss +8 -0
  85. package/resources/scss/theme-dark/button/Base.scss +1 -1
  86. package/resources/scss/theme-dark/tab/header/Button.scss +1 -0
  87. package/resources/scss/theme-light/Global.scss +8 -0
  88. package/resources/scss/theme-light/button/Base.scss +1 -1
  89. package/resources/scss/theme-light/tab/header/Button.scss +1 -0
  90. package/resources/scss/theme-neo-light/Global.scss +53 -53
  91. package/resources/scss/theme-neo-light/button/Base.scss +3 -4
  92. package/resources/scss/theme-neo-light/tab/header/Button.scss +6 -8
  93. package/src/DefaultConfig.mjs +2 -2
  94. package/src/Fetch.mjs +1 -3
  95. package/src/Main.mjs +13 -11
  96. package/src/MicroLoader.mjs +2 -2
  97. package/src/Neo.mjs +27 -26
  98. package/src/Xhr.mjs +1 -3
  99. package/src/button/Base.mjs +6 -4
  100. package/src/button/Split.mjs +10 -9
  101. package/src/calendar/view/EditEventContainer.mjs +13 -12
  102. package/src/calendar/view/MainContainer.mjs +40 -40
  103. package/src/calendar/view/MainContainerModel.mjs +5 -5
  104. package/src/calendar/view/SettingsContainer.mjs +11 -11
  105. package/src/calendar/view/YearComponent.mjs +73 -75
  106. package/src/calendar/view/calendars/ColorsList.mjs +2 -2
  107. package/src/calendar/view/calendars/EditContainer.mjs +2 -2
  108. package/src/calendar/view/calendars/List.mjs +12 -13
  109. package/src/calendar/view/month/Component.mjs +72 -73
  110. package/src/calendar/view/settings/GeneralContainer.mjs +5 -5
  111. package/src/calendar/view/settings/MonthContainer.mjs +5 -5
  112. package/src/calendar/view/settings/WeekContainer.mjs +6 -6
  113. package/src/calendar/view/settings/YearContainer.mjs +4 -4
  114. package/src/calendar/view/week/Component.mjs +47 -57
  115. package/src/calendar/view/week/EventDragZone.mjs +43 -50
  116. package/src/calendar/view/week/TimeAxisComponent.mjs +21 -21
  117. package/src/calendar/view/week/plugin/DragDrop.mjs +53 -45
  118. package/src/calendar/view/week/plugin/EventResizable.mjs +8 -3
  119. package/src/collection/Base.mjs +15 -22
  120. package/src/collection/Filter.mjs +4 -9
  121. package/src/collection/Sorter.mjs +6 -7
  122. package/src/component/Base.mjs +149 -87
  123. package/src/component/Canvas.mjs +9 -9
  124. package/src/component/Carousel.mjs +31 -33
  125. package/src/component/Chip.mjs +9 -9
  126. package/src/component/Circle.mjs +84 -91
  127. package/src/component/Clock.mjs +8 -8
  128. package/src/component/DateSelector.mjs +14 -15
  129. package/src/component/Gallery.mjs +82 -80
  130. package/src/component/Helix.mjs +131 -126
  131. package/src/component/Iframe.mjs +1 -1
  132. package/src/component/Label.mjs +1 -1
  133. package/src/component/Legend.mjs +3 -3
  134. package/src/component/Process.mjs +39 -37
  135. package/src/component/Splitter.mjs +9 -11
  136. package/src/component/StatusBadge.mjs +2 -3
  137. package/src/component/Timer.mjs +62 -68
  138. package/src/component/Toast.mjs +11 -11
  139. package/src/component/Video.mjs +7 -8
  140. package/src/component/mwc/Button.mjs +10 -10
  141. package/src/component/mwc/TextField.mjs +17 -17
  142. package/src/component/wrapper/AmChart.mjs +5 -5
  143. package/src/component/wrapper/CesiumJS.mjs +11 -17
  144. package/src/component/wrapper/GoogleMaps.mjs +58 -35
  145. package/src/component/wrapper/MapboxGL.mjs +112 -79
  146. package/src/component/wrapper/MonacoEditor.mjs +1 -6
  147. package/src/container/Accordion.mjs +18 -20
  148. package/src/container/AccordionItem.mjs +12 -11
  149. package/src/container/Base.mjs +29 -28
  150. package/src/container/Panel.mjs +9 -9
  151. package/src/container/Viewport.mjs +30 -1
  152. package/src/controller/Base.mjs +12 -14
  153. package/src/controller/Component.mjs +60 -66
  154. package/src/core/Base.mjs +5 -8
  155. package/src/core/IdGenerator.mjs +1 -3
  156. package/src/core/Observable.mjs +17 -17
  157. package/src/core/Util.mjs +5 -5
  158. package/src/data/Model.mjs +3 -3
  159. package/src/data/RecordFactory.mjs +3 -6
  160. package/src/data/Store.mjs +34 -34
  161. package/src/data/connection/Fetch.mjs +3 -3
  162. package/src/data/connection/WebSocket.mjs +21 -25
  163. package/src/data/connection/Xhr.mjs +31 -28
  164. package/src/date/DayViewComponent.mjs +1 -1
  165. package/src/date/SelectorContainer.mjs +2 -2
  166. package/src/dialog/Base.mjs +27 -25
  167. package/src/dialog/header/Toolbar.mjs +5 -4
  168. package/src/draggable/DragProxyComponent.mjs +7 -4
  169. package/src/draggable/DragZone.mjs +30 -30
  170. package/src/draggable/DropZone.mjs +7 -7
  171. package/src/draggable/list/DragZone.mjs +18 -18
  172. package/src/draggable/tab/header/toolbar/SortZone.mjs +7 -7
  173. package/src/draggable/toolbar/DragZone.mjs +15 -15
  174. package/src/draggable/toolbar/SortZone.mjs +30 -31
  175. package/src/draggable/tree/DragZone.mjs +9 -9
  176. package/src/filter/BooleanContainer.mjs +3 -3
  177. package/src/filter/NumberContainer.mjs +5 -5
  178. package/src/filter/ToggleOperatorsButton.mjs +5 -5
  179. package/src/form/Fieldset.mjs +26 -26
  180. package/src/form/field/Base.mjs +1 -1
  181. package/src/form/field/CheckBox.mjs +15 -16
  182. package/src/form/field/Color.mjs +13 -15
  183. package/src/form/field/ComboBox.mjs +16 -24
  184. package/src/form/field/Country.mjs +1 -1
  185. package/src/form/field/Date.mjs +3 -4
  186. package/src/form/field/Display.mjs +1 -1
  187. package/src/form/field/Email.mjs +2 -2
  188. package/src/form/field/Number.mjs +51 -56
  189. package/src/form/field/Picker.mjs +2 -2
  190. package/src/form/field/Radio.mjs +1 -1
  191. package/src/form/field/Range.mjs +7 -6
  192. package/src/form/field/Text.mjs +29 -36
  193. package/src/form/field/TextArea.mjs +9 -9
  194. package/src/form/field/Time.mjs +30 -30
  195. package/src/form/field/trigger/Base.mjs +19 -13
  196. package/src/form/field/trigger/Clear.mjs +13 -13
  197. package/src/form/field/trigger/CopyToClipboard.mjs +7 -7
  198. package/src/form/field/trigger/Picker.mjs +2 -2
  199. package/src/form/field/trigger/SpinDown.mjs +1 -1
  200. package/src/form/field/trigger/SpinUp.mjs +1 -1
  201. package/src/form/field/trigger/SpinUpDown.mjs +3 -3
  202. package/src/form/field/trigger/Time.mjs +3 -3
  203. package/src/grid/Container.mjs +33 -33
  204. package/src/grid/View.mjs +20 -22
  205. package/src/grid/header/Button.mjs +12 -12
  206. package/src/grid/header/Toolbar.mjs +4 -4
  207. package/src/layout/Base.mjs +5 -4
  208. package/src/layout/Card.mjs +15 -16
  209. package/src/layout/Fit.mjs +22 -8
  210. package/src/layout/Flexbox.mjs +30 -29
  211. package/src/layout/Form.mjs +15 -15
  212. package/src/layout/Grid.mjs +2 -2
  213. package/src/layout/HBox.mjs +3 -2
  214. package/src/layout/VBox.mjs +3 -2
  215. package/src/list/Base.mjs +45 -47
  216. package/src/list/Chip.mjs +4 -4
  217. package/src/list/Circle.mjs +3 -3
  218. package/src/list/Color.mjs +4 -4
  219. package/src/list/Component.mjs +10 -10
  220. package/src/list/plugin/Animate.mjs +18 -13
  221. package/src/main/DomAccess.mjs +92 -56
  222. package/src/main/DomEvents.mjs +38 -39
  223. package/src/main/addon/AmCharts.mjs +37 -37
  224. package/src/main/addon/AnalyticsByGoogle.mjs +4 -4
  225. package/src/main/addon/CesiumJS.mjs +8 -8
  226. package/src/main/addon/CloneNode.mjs +5 -5
  227. package/src/main/addon/Cookie.mjs +4 -4
  228. package/src/main/addon/DragDrop.mjs +35 -34
  229. package/src/main/addon/GoogleMaps.mjs +19 -19
  230. package/src/main/addon/LocalStorage.mjs +3 -3
  231. package/src/main/addon/MapboxGL.mjs +40 -41
  232. package/src/main/addon/MonacoEditor.mjs +5 -5
  233. package/src/main/addon/Mwc.mjs +6 -6
  234. package/src/main/addon/Navigator.mjs +35 -39
  235. package/src/main/addon/Popover.mjs +5 -6
  236. package/src/main/addon/PrefixField.mjs +1 -2
  237. package/src/main/addon/ServiceWorker.mjs +9 -9
  238. package/src/main/addon/Siesta.mjs +3 -2
  239. package/src/main/addon/Stylesheet.mjs +37 -37
  240. package/src/main/addon/WebComponent.mjs +2 -3
  241. package/src/main/addon/WindowPosition.mjs +18 -18
  242. package/src/main/draggable/sensor/Base.mjs +2 -2
  243. package/src/main/draggable/sensor/Mouse.mjs +15 -15
  244. package/src/main/draggable/sensor/Touch.mjs +24 -23
  245. package/src/main/mixin/DeltaUpdates.mjs +10 -12
  246. package/src/main/mixin/TouchDomEvents.mjs +6 -6
  247. package/src/manager/Base.mjs +4 -4
  248. package/src/manager/Component.mjs +41 -41
  249. package/src/manager/DomEvent.mjs +52 -50
  250. package/src/manager/Focus.mjs +14 -16
  251. package/src/manager/Instance.mjs +2 -4
  252. package/src/manager/Store.mjs +4 -8
  253. package/src/manager/Task.mjs +20 -22
  254. package/src/manager/Toast.mjs +14 -16
  255. package/src/manager/rpc/Api.mjs +1 -3
  256. package/src/manager/rpc/Message.mjs +16 -18
  257. package/src/menu/List.mjs +16 -16
  258. package/src/menu/Panel.mjs +4 -4
  259. package/src/model/Component.mjs +5 -5
  260. package/src/plugin/Base.mjs +2 -0
  261. package/src/plugin/Popover.mjs +1 -1
  262. package/src/plugin/PrefixField.mjs +35 -45
  263. package/src/plugin/Resizable.mjs +86 -101
  264. package/src/plugin/Responsive.mjs +175 -0
  265. package/src/remotes/Api.mjs +4 -6
  266. package/src/selection/CircleModel.mjs +12 -16
  267. package/src/selection/DateSelectorModel.mjs +21 -23
  268. package/src/selection/GalleryModel.mjs +49 -63
  269. package/src/selection/HelixModel.mjs +35 -41
  270. package/src/selection/ListModel.mjs +9 -14
  271. package/src/selection/Model.mjs +31 -31
  272. package/src/selection/TreeAccordionModel.mjs +74 -80
  273. package/src/selection/grid/CellColumnModel.mjs +10 -10
  274. package/src/selection/grid/CellColumnRowModel.mjs +10 -10
  275. package/src/selection/grid/CellModel.mjs +26 -28
  276. package/src/selection/grid/CellRowModel.mjs +24 -24
  277. package/src/selection/grid/ColumnModel.mjs +16 -20
  278. package/src/selection/grid/RowModel.mjs +27 -29
  279. package/src/selection/menu/ListModel.mjs +2 -2
  280. package/src/selection/table/CellColumnModel.mjs +12 -12
  281. package/src/selection/table/CellColumnRowModel.mjs +12 -12
  282. package/src/selection/table/CellModel.mjs +26 -29
  283. package/src/selection/table/CellRowModel.mjs +19 -19
  284. package/src/selection/table/ColumnModel.mjs +18 -22
  285. package/src/selection/table/RowModel.mjs +27 -29
  286. package/src/sitemap/Component.mjs +20 -20
  287. package/src/sitemap/Store.mjs +1 -1
  288. package/src/tab/Container.mjs +15 -15
  289. package/src/tab/Strip.mjs +1 -1
  290. package/src/tab/header/Toolbar.mjs +4 -4
  291. package/src/table/Container.mjs +8 -10
  292. package/src/table/View.mjs +29 -34
  293. package/src/table/header/Button.mjs +18 -18
  294. package/src/table/header/Toolbar.mjs +2 -2
  295. package/src/toolbar/Base.mjs +14 -14
  296. package/src/toolbar/Breadcrumb.mjs +11 -11
  297. package/src/toolbar/Paging.mjs +18 -18
  298. package/src/tooltip/Base.mjs +20 -22
  299. package/src/tree/Accordion.mjs +69 -75
  300. package/src/tree/List.mjs +22 -25
  301. package/src/util/Array.mjs +19 -18
  302. package/src/util/ClassSystem.mjs +9 -9
  303. package/src/util/Css.mjs +2 -2
  304. package/src/util/Date.mjs +9 -9
  305. package/src/util/Function.mjs +2 -2
  306. package/src/util/HashHistory.mjs +3 -5
  307. package/src/util/KeyNavigation.mjs +17 -17
  308. package/src/util/Logger.mjs +9 -9
  309. package/src/util/Matrix.mjs +19 -19
  310. package/src/util/String.mjs +9 -9
  311. package/src/util/Style.mjs +11 -11
  312. package/src/util/VDom.mjs +12 -14
  313. package/src/util/VNode.mjs +29 -29
  314. package/src/vdom/Helper.mjs +84 -93
  315. package/src/vdom/VNode.mjs +1 -1
  316. package/src/worker/App.mjs +19 -16
  317. package/src/worker/Base.mjs +14 -15
  318. package/src/worker/Canvas.mjs +1 -3
  319. package/src/worker/Data.mjs +4 -8
  320. package/src/worker/Manager.mjs +27 -32
  321. package/src/worker/Message.mjs +1 -1
  322. package/src/worker/ServiceBase.mjs +38 -42
  323. package/src/worker/Task.mjs +1 -3
  324. package/src/worker/VDom.mjs +2 -4
  325. package/src/worker/mixin/RemoteMethodAccess.mjs +5 -6
  326. package/examples/component/helix/MainContainer.mjs +0 -340
  327. package/resources/images/Neo_Vector.svg +0 -3
  328. package/resources/images/logos/Github-logo-black.svg +0 -1
  329. package/resources/images/logos/Slack-logo-black.svg +0 -17
@@ -0,0 +1,277 @@
1
+ import Component from '../../../src/controller/Component.mjs';
2
+
3
+ /**
4
+ * @class Colors.view.ViewportController
5
+ * @extends Neo.controller.Component
6
+ */
7
+ class ViewportController extends Component {
8
+ static config = {
9
+ /**
10
+ * @member {String} className='Colors.view.ViewportController'
11
+ * @protected
12
+ */
13
+ className: 'Colors.view.ViewportController'
14
+ }
15
+
16
+ /**
17
+ * @member {String[]} connectedApps=[]
18
+ */
19
+ connectedApps = []
20
+ /**
21
+ * @member {Number|null} intervalId
22
+ */
23
+ intervalId = null
24
+ /**
25
+ * @member {Object} widgetIndexMap
26
+ */
27
+ widgetIndexMap = {
28
+ 'bar-chart': 3,
29
+ 'pie-chart': 2,
30
+ table : 1
31
+ }
32
+
33
+ /**
34
+ * @param {String} name The name of the reference
35
+ */
36
+ async createBrowserWindow(name) {
37
+ let me = this,
38
+ {windowId} = me,
39
+ {windowConfigs} = Neo,
40
+ firstWindowId = parseInt(Object.keys(windowConfigs)[0]),
41
+ {basePath} = windowConfigs[firstWindowId],
42
+ url = `${basePath}apps/colors/childapps/widget/index.html?name=${name}`;
43
+
44
+ if (me.getModel().getData('openWidgetsAsPopups')) {
45
+ let widget = me.getReference(name),
46
+ winData = await Neo.Main.getWindowData({windowId} ),
47
+ rect = await me.component.getDomRect(widget.vdom.id), // using the vdom id to always get the top-level node
48
+ {height, left, top, width} = rect;
49
+
50
+ height -= 50; // popup header in Chrome
51
+ left += winData.screenLeft;
52
+ top += (winData.outerHeight - winData.innerHeight + winData.screenTop);
53
+
54
+ await Neo.Main.windowOpen({
55
+ url,
56
+ windowFeatures: `height=${height},left=${left},top=${top},width=${width}`,
57
+ windowName : name
58
+ })
59
+ } else {
60
+ await Neo.Main.windowOpen({url, windowName: '_blank'})
61
+ }
62
+ }
63
+
64
+ /**
65
+ * @param {Object} data
66
+ * @param {String} data.appName
67
+ * @param {Number} data.windowId
68
+ */
69
+ async onAppConnect(data) {
70
+ if (data.appName === 'ColorsWidget') {
71
+ let me = this,
72
+ app = Neo.apps[data.appName],
73
+ mainView = app.mainView,
74
+ {windowId} = data,
75
+ url = await Neo.Main.getByPath({path: 'document.URL', windowId}),
76
+ widgetName = new URL(url).searchParams.get('name'),
77
+ widget = me.getReference(widgetName),
78
+ widgetParent = widget.up();
79
+
80
+ me.connectedApps.push(widgetName);
81
+
82
+ me.getReference(`detach-${widgetName}-button`).disabled = true;
83
+
84
+ widgetParent.remove(widget, false);
85
+ mainView.add(widget)
86
+ }
87
+ }
88
+
89
+ /**
90
+ * @param {Object} data
91
+ * @param {String} data.appName
92
+ * @param {Number} data.windowId
93
+ */
94
+ async onAppDisconnect(data) {
95
+ let me = this,
96
+ {appName, windowId} = data,
97
+ url = await Neo.Main.getByPath({path: 'document.URL', windowId}),
98
+ widgetName = new URL(url).searchParams.get('name'),
99
+ widget = me.getReference(widgetName),
100
+ widgetParent = widget.up();
101
+
102
+ // Closing a non-main app needs to move the widget back into its original position & re-enable the show button
103
+ if (appName === 'ColorsWidget') {
104
+ widgetParent.remove(widget, false);
105
+ me.component.insert(me.widgetIndexMap[widgetName], widget);
106
+
107
+ me.getReference(`detach-${widgetName}-button`).disabled = false
108
+ }
109
+ // Close popup windows when closing or reloading the main window
110
+ else if (appName === 'Colors') {
111
+ Neo.Main.windowClose({names: me.connectedApps, windowId})
112
+ }
113
+ }
114
+
115
+ /**
116
+ * @param {Object} data
117
+ */
118
+ onChangeAmountColors(data) {
119
+ this.updateDataProperty(data, 'amountColors', data.value)
120
+ }
121
+
122
+ /**
123
+ * @param {Object} data
124
+ */
125
+ onChangeAmountColumns(data) {
126
+ this.updateDataProperty(data, 'amountColumns', parseInt(data.value.name))
127
+ }
128
+
129
+ /**
130
+ * @param {Object} data
131
+ */
132
+ onChangeAmountRows(data) {
133
+ this.updateDataProperty(data, 'amountRows', parseInt(data.value.name))
134
+ }
135
+
136
+ /**
137
+ * @param {Object} data
138
+ */
139
+ onChangeOpenWidgetsAsPopups(data) {
140
+ this.getModel().setData('openWidgetsAsPopups', data.value)
141
+ }
142
+
143
+ /**
144
+ *
145
+ */
146
+ onConstructed() {
147
+ super.onConstructed();
148
+
149
+ let me = this;
150
+
151
+ Neo.currentWorker.on({
152
+ connect : me.onAppConnect,
153
+ disconnect: me.onAppDisconnect,
154
+ scope : me
155
+ })
156
+ }
157
+
158
+ /**
159
+ *
160
+ */
161
+ onComponentConstructed() {
162
+ super.onComponentConstructed();
163
+ this.updateWidgets()
164
+ }
165
+
166
+ /**
167
+ * @param {Object} data
168
+ */
169
+ async onDetachBarChartButtonClick(data) {
170
+ await this.createBrowserWindow('bar-chart')
171
+ }
172
+
173
+ /**
174
+ * @param {Object} data
175
+ */
176
+ async onDetachPieChartButtonClick(data) {
177
+ await this.createBrowserWindow('pie-chart')
178
+ }
179
+
180
+ /**
181
+ * @param {Object} data
182
+ */
183
+ async onDetachTableButtonClick(data) {
184
+ await this.createBrowserWindow('table')
185
+ }
186
+
187
+ /**
188
+ * @param {Object} data
189
+ */
190
+ onStopButtonClick(data) {
191
+ let me = this;
192
+
193
+ me.getModel().setData({isUpdating: false});
194
+
195
+ if (me.intervalId) {
196
+ clearInterval(me.intervalId);
197
+ me.intervalId = null
198
+ }
199
+ }
200
+
201
+ /**
202
+ * @param {Object} data
203
+ */
204
+ onStartButtonClick(data) {
205
+ let me = this,
206
+ intervalTime = 1000 / 60; // assuming 60 FPS
207
+
208
+ me.getModel().setData({isUpdating: true});
209
+
210
+ if (!me.intervalId) {
211
+ me.intervalId = setInterval(() => {
212
+ me.updateWidgets()
213
+ }, intervalTime)
214
+ }
215
+ }
216
+
217
+ /**
218
+ * @param {Object} data
219
+ */
220
+ updateCharts(data) {
221
+ this.getReference('bar-chart').chartData = data;
222
+ this.getReference('pie-chart').chartData = data
223
+ }
224
+
225
+ /**
226
+ * If the WebSocket stream is not running, we need to pull new data once to see the new setting visually
227
+ * @param {Object} data The change event data
228
+ * @param {String} name The VM data property name
229
+ * @param {Number|Object|null} value The new VM data property value
230
+ */
231
+ updateDataProperty(data, name, value) {
232
+ let model = this.getModel();
233
+
234
+ model.setData(name, value);
235
+
236
+ if (data.oldValue !== null && !model.getData('isUpdating')) {
237
+ this.updateWidgets()
238
+ }
239
+ }
240
+
241
+ /**
242
+ * @param {Object[]} records
243
+ */
244
+ updateTable(records) {
245
+ let table = this.getReference('table'),
246
+ {store} = table;
247
+
248
+ if (store.getCount()) {
249
+ table.bulkUpdateRecords(records)
250
+ } else {
251
+ store.data = records
252
+ }
253
+ }
254
+
255
+ /**
256
+ *
257
+ */
258
+ updateWidgets() {
259
+ let me = this,
260
+ model = me.getModel();
261
+
262
+ Colors.backend.ColorService.read({
263
+ amountColors : model.getData('amountColors'),
264
+ amountColumns: model.getData('amountColumns'),
265
+ amountRows : model.getData('amountRows')
266
+ }).then(response => {
267
+ let {data} = response;
268
+
269
+ me.updateTable(data.tableData);
270
+ me.updateCharts(data.summaryData)
271
+ })
272
+ }
273
+ }
274
+
275
+ Neo.setupClass(ViewportController);
276
+
277
+ export default ViewportController;
@@ -0,0 +1,53 @@
1
+ import Component from '../../../src/model/Component.mjs';
2
+ import ColorsStore from '../store/Colors.mjs';
3
+
4
+ /**
5
+ * @class Colors.view.ViewportModel
6
+ * @extends Neo.model.Component
7
+ */
8
+ class ViewportModel extends Component {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Colors.view.ViewportModel'
12
+ * @protected
13
+ */
14
+ className: 'Colors.view.ViewportModel',
15
+ /**
16
+ * @member {Object} data
17
+ */
18
+ data: {
19
+ /**
20
+ * @member {Number} data.amountColors=10
21
+ */
22
+ amountColors: 10,
23
+ /**
24
+ * @member {Number} data.amountColumns=10
25
+ */
26
+ amountColumns: 10,
27
+ /**
28
+ * @member {Number} data.amountRows=10
29
+ */
30
+ amountRows: 10,
31
+ /**
32
+ * @member {Boolean} data.isUpdating=false
33
+ */
34
+ isUpdating: false,
35
+ /**
36
+ * @member {Boolean} data.openWidgetsAsPopups=true
37
+ */
38
+ openWidgetsAsPopups: true
39
+ },
40
+ /**
41
+ * @member {Object} stores
42
+ */
43
+ stores: {
44
+ colors: {
45
+ module: ColorsStore
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ Neo.setupClass(ViewportModel);
52
+
53
+ export default ViewportModel;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @param {String|null} searchString
3
+ * @returns {Function}
4
+ */
5
+ export function getSearchParams(searchString) {
6
+ if (searchString?.startsWith('?')) {
7
+ searchString = searchString.substring(1)
8
+ }
9
+
10
+ return searchString ? JSON.parse(`{"${decodeURI(searchString.replace(/&/g, "\",\"").replace(/=/g, "\":\""))}"}`) : {}
11
+ }
@@ -3,7 +3,7 @@
3
3
  "basePath" : "../../../../",
4
4
  "environment" : "development",
5
5
  "mainPath" : "./Main.mjs",
6
- "mainThreadAddons": ["Stylesheet"],
7
- "themes" : ["neo-theme-neo-light"],
6
+ "mainThreadAddons": ["AmCharts", "DragDrop", "Navigator", "Stylesheet"],
7
+ "themes" : ["neo-theme-neo-light", "neo-theme-dark"],
8
8
  "useSharedWorkers": true
9
9
  }
@@ -3,7 +3,8 @@
3
3
  "basePath" : "../../",
4
4
  "environment" : "development",
5
5
  "mainPath" : "./Main.mjs",
6
- "mainThreadAddons": ["DragDrop", "HighlightJS", "IntersectionObserver", "MonacoEditor", "Navigator", "ResizeObserver", "Stylesheet"],
6
+ "mainThreadAddons": ["AmCharts", "DragDrop", "HighlightJS", "IntersectionObserver", "MonacoEditor", "Navigator", "ResizeObserver", "Stylesheet"],
7
+ "remotesApiUrl" : "remotes-api.json",
7
8
  "themes" : ["neo-theme-neo-light", "neo-theme-light", "neo-theme-dark"],
8
9
  "useSharedWorkers": true
9
10
  }
@@ -0,0 +1,13 @@
1
+ {
2
+ "namespace": "Colors.backend",
3
+ "type" : "websocket",
4
+ "url" : "https://still-castle-38841.herokuapp.com/",
5
+
6
+ "services": {
7
+ "ColorService": {
8
+ "methods": {
9
+ "read": {"params": [{"type": "Object"}]}
10
+ }
11
+ }
12
+ }
13
+ }
@@ -26,9 +26,12 @@ class HeaderToolbar extends Base {
26
26
  * @member {Object[]} items
27
27
  */
28
28
  items: [{
29
- cls : ['logo'],
30
- route: '/home',
31
- text : 'neo.mjs'
29
+ cls : ['logo'],
30
+ id : 'neo-logo-button',
31
+ minWidth: 60,
32
+ iconCls : 'neo-logo-blue',
33
+ route : '/home',
34
+ text : 'Neo.mjs'
32
35
  }, '->', {
33
36
  text : 'Learn',
34
37
  route: '/learn'
@@ -40,30 +43,44 @@ class HeaderToolbar extends Base {
40
43
  text : 'Docs',
41
44
  route: '/docs'
42
45
  }, {
43
- cls : ['github-button'],
44
- iconCls: 'fa-brands fa-github',
45
- url : 'https://github.com/neomjs/neo',
46
- tooltip: {
47
- html : 'GitHub',
48
- showDelay: '0',
49
- hideDelay: '0'
50
- }
51
- }, {
52
- iconCls: 'fa-brands fa-slack',
53
- url : 'https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA',
54
- tooltip: {
55
- html : 'Join Slack',
56
- showDelay: '0',
57
- hideDelay: '0'
58
- }
59
- }, {
60
- iconCls: 'fa-brands fa-discord',
61
- url : 'https://discord.gg/6p8paPq',
62
- tooltip: {
63
- html : 'Join Discord',
64
- showDelay: '0',
65
- hideDelay: '0'
66
- }
46
+ ntype : 'container',
47
+ layout: 'hbox',
48
+
49
+ responsive: {
50
+ medium: { cls: ['separate-bar'], layout: 'vbox' },
51
+ large : { cls: ['inline'], layout: 'hbox' }
52
+ },
53
+
54
+ itemDefaults: {
55
+ ntype: 'button',
56
+ ui : 'ghost'
57
+ },
58
+
59
+ items: [{
60
+ iconCls: 'fa-brands fa-github',
61
+ url : 'https://github.com/neomjs/neo',
62
+ tooltip: {
63
+ html : 'GitHub',
64
+ showDelay: '0',
65
+ hideDelay: '0'
66
+ }
67
+ }, {
68
+ iconCls: 'fa-brands fa-slack',
69
+ url : 'https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA',
70
+ tooltip: {
71
+ html : 'Join Slack',
72
+ showDelay: '0',
73
+ hideDelay: '0'
74
+ }
75
+ }, {
76
+ iconCls: 'fa-brands fa-discord',
77
+ url : 'https://discord.gg/6p8paPq',
78
+ tooltip: {
79
+ html : 'Join Discord',
80
+ showDelay: '0',
81
+ hideDelay: '0'
82
+ }
83
+ }]
67
84
  }]
68
85
  }
69
86
  }
@@ -28,6 +28,10 @@ class Viewport extends BaseViewport {
28
28
  * @member {Neo.controller.Component} controller=ViewportController
29
29
  */
30
30
  controller: ViewportController,
31
+ /**
32
+ * @member {Object} layout={ntype:'vbox',align:'stretch'}
33
+ */
34
+ layout: {ntype: 'vbox', align: 'stretch'},
31
35
  /**
32
36
  * @member {Object[]} items
33
37
  */
@@ -50,6 +54,10 @@ class Viewport extends BaseViewport {
50
54
  * @member {Neo.model.Component} model=ViewportModel
51
55
  */
52
56
  model: ViewportModel,
57
+ /**
58
+ * @member {Boolean} monitorSize=true
59
+ */
60
+ monitorSize: true,
53
61
  /**
54
62
  * Values are: large, medium, small, xSmall
55
63
  * @member {String|null} size_=null
@@ -62,7 +70,10 @@ class Viewport extends BaseViewport {
62
70
  */
63
71
  construct(config) {
64
72
  super.construct(config);
65
- this.addDomListeners([{resize: this.onResize, scope: this}])
73
+
74
+ let me = this;
75
+
76
+ me.on('resize', me.onResize, me)
66
77
  }
67
78
 
68
79
  /**
@@ -1,4 +1,5 @@
1
- import Controller from '../../../src/controller/Component.mjs';
1
+ import Controller from '../../../src/controller/Component.mjs';
2
+ import {getSearchParams} from '../Util.mjs';
2
3
 
3
4
  /**
4
5
  * @class Portal.view.ViewportController
@@ -11,6 +12,11 @@ class ViewportController extends Controller {
11
12
  * @protected
12
13
  */
13
14
  className: 'Portal.view.ViewportController',
15
+ /**
16
+ * @member {String} ntype='viewport-controller'
17
+ * @protected
18
+ */
19
+ ntype: 'viewport-controller',
14
20
  /**
15
21
  * @member {String|null} defaultHash='/home'
16
22
  */
@@ -27,6 +33,73 @@ class ViewportController extends Controller {
27
33
  }
28
34
  }
29
35
 
36
+ /**
37
+ * @member {String[]} connectedApps=[]
38
+ */
39
+ connectedApps = []
40
+
41
+ /**
42
+ * @param {Object} data
43
+ * @param {String} data.appName
44
+ * @param {Number} data.windowId
45
+ */
46
+ async onAppConnect(data) {
47
+ let {appName, windowId} = data,
48
+ app = Neo.apps[appName],
49
+ mainView = app.mainView;
50
+
51
+ if (appName === 'PortalPreview') {
52
+ let searchString = await Neo.Main.getByPath({path: 'location.search', windowId}),
53
+ livePreviewId = getSearchParams(searchString).id,
54
+ livePreview = Neo.getComponent(livePreviewId),
55
+ sourceContainer = livePreview.getReference('preview'),
56
+ tabContainer = livePreview.tabContainer,
57
+ sourceView = sourceContainer.removeAt(0, false);
58
+
59
+ livePreview.previewContainer = mainView;
60
+ mainView.add(sourceView);
61
+
62
+ tabContainer.activeIndex = 0; // switch to the source view
63
+
64
+ tabContainer.getTabAtIndex(1).disabled = true
65
+ }
66
+ }
67
+
68
+ /**
69
+ * @param {Object} data
70
+ * @param {String} data.appName
71
+ * @param {Number} data.windowId
72
+ */
73
+ async onAppDisconnect(data) {
74
+ let me = this,
75
+ {appName, windowId} = data,
76
+ app = Neo.apps[appName],
77
+ mainView = app.mainView;
78
+
79
+ // Closing a code preview window needs to drop the preview back into the related main app
80
+ if (appName === 'PortalPreview') {
81
+ let searchString = await Neo.Main.getByPath({path: 'location.search', windowId}),
82
+ livePreviewId = getSearchParams(searchString).id,
83
+ livePreview = Neo.getComponent(livePreviewId),
84
+ sourceContainer = livePreview.getReference('preview'),
85
+ tabContainer = livePreview.tabContainer,
86
+ sourceView = mainView.removeAt(0, false);
87
+
88
+ livePreview.previewContainer = null;
89
+ sourceContainer.add(sourceView);
90
+
91
+ livePreview.disableRunSource = true; // will get reset after the next activeIndex change (async)
92
+ tabContainer.activeIndex = 1; // switch to the source view
93
+
94
+ livePreview.getReference('popout-window-button').disabled = false;
95
+ tabContainer.getTabAtIndex(1).disabled = false
96
+ }
97
+ // Close popup windows when closing or reloading the main window
98
+ else if (appName === 'Portal') {
99
+ Neo.Main.windowClose({names: me.connectedApps, windowId})
100
+ }
101
+ }
102
+
30
103
  /**
31
104
  * @param {Object[]} records
32
105
  */
@@ -50,6 +123,21 @@ class ViewportController extends Controller {
50
123
  this.getReference('blog-list').filterItems(data)
51
124
  }
52
125
 
126
+ /**
127
+ *
128
+ */
129
+ onConstructed() {
130
+ super.onConstructed();
131
+
132
+ let me = this;
133
+
134
+ Neo.currentWorker.on({
135
+ connect : me.onAppConnect,
136
+ disconnect: me.onAppDisconnect,
137
+ scope : me
138
+ });
139
+ }
140
+
53
141
  /**
54
142
  * @param {Object} params
55
143
  * @param {Object} value