neo.mjs 6.9.10 → 6.9.11

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 (235) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/learnneo/neo-config.json +5 -1
  3. package/apps/learnneo/store/Content.mjs +1 -1
  4. package/apps/learnneo/view/Viewport.mjs +12 -1
  5. package/apps/learnneo/view/home/ContentTreeList.mjs +8 -5
  6. package/apps/learnneo/view/home/ContentView.mjs +60 -0
  7. package/apps/learnneo/view/home/MainContainer.mjs +22 -14
  8. package/apps/learnneo/view/home/MainContainerController.mjs +57 -18
  9. package/apps/newwebsite/app.mjs +6 -0
  10. package/apps/newwebsite/index.html +10 -0
  11. package/apps/newwebsite/neo-config.json +7 -0
  12. package/apps/newwebsite/view/MainContainer.mjs +59 -0
  13. package/buildScripts/webpack/json/myApps.template.json +1 -0
  14. package/examples/ConfigurationViewport.mjs +12 -9
  15. package/examples/ServiceWorker.mjs +2 -2
  16. package/examples/button/base/neo-config.json +1 -2
  17. package/package.json +2 -2
  18. package/resources/data/{learnneo → deck/learnneo}/p/2023-10-01T18-29-19-158Z.md +3 -6
  19. package/resources/data/deck/learnneo/p/stylesheet.md +40 -0
  20. package/resources/data/{learnneo → deck/learnneo}/t.json +19 -2
  21. package/resources/data/deck/training/p/2022-12-27T21-54-52-300Z.md +11 -0
  22. package/resources/data/deck/training/p/2022-12-27T21-55-23-144Z.md +43 -0
  23. package/resources/data/deck/training/p/2022-12-27T21-55-30-948Z.md +1 -0
  24. package/resources/data/deck/training/p/2022-12-27T21-55-43-542Z.md +84 -0
  25. package/resources/data/deck/training/p/2022-12-27T22-23-55-083Z.md +1 -0
  26. package/resources/data/deck/training/p/2022-12-27T22-24-07-886Z.md +8 -0
  27. package/resources/data/deck/training/p/2022-12-27T22-24-52-295Z.md +8 -0
  28. package/resources/data/deck/training/p/2022-12-27T22-25-03-853Z.md +5 -0
  29. package/resources/data/deck/training/p/2022-12-27T22-43-58-924Z.md +10 -0
  30. package/resources/data/deck/training/p/2022-12-27T22-44-28-881Z.md +3 -0
  31. package/resources/data/deck/training/p/2022-12-27T22-44-41-791Z.md +4 -0
  32. package/resources/data/deck/training/p/2022-12-27T22-45-21-032Z.md +7 -0
  33. package/resources/data/deck/training/p/2022-12-27T22-49-22-078Z.md +4 -0
  34. package/resources/data/deck/training/p/2022-12-27T22-50-20-626Z.md +4 -0
  35. package/resources/data/deck/training/p/2022-12-28T16-58-47-786Z.md +0 -0
  36. package/resources/data/deck/training/p/2022-12-28T16-58-55-192Z.md +9 -0
  37. package/resources/data/deck/training/p/2022-12-28T17-10-18-058Z.md +15 -0
  38. package/resources/data/deck/training/p/2022-12-28T17-10-42-296Z.md +40 -0
  39. package/resources/data/deck/training/p/2022-12-28T17-11-34-653Z.md +41 -0
  40. package/resources/data/deck/training/p/2022-12-28T17-13-09-994Z.md +0 -0
  41. package/resources/data/deck/training/p/2022-12-28T21-32-14-420Z.md +0 -0
  42. package/resources/data/deck/training/p/2022-12-29T01-43-32-431Z.md +7 -0
  43. package/resources/data/deck/training/p/2022-12-29T15-56-54-485Z.md +7 -0
  44. package/resources/data/deck/training/p/2022-12-29T15-57-11-499Z.md +7 -0
  45. package/resources/data/deck/training/p/2022-12-29T16-00-13-223Z.md +7 -0
  46. package/resources/data/deck/training/p/2022-12-29T18-34-25-826Z.md +4 -0
  47. package/resources/data/deck/training/p/2022-12-29T18-36-08-226Z.md +106 -0
  48. package/resources/data/deck/training/p/2022-12-29T18-36-56-893Z.md +112 -0
  49. package/resources/data/deck/training/p/2022-12-29T19-31-30-507Z.md +31 -0
  50. package/resources/data/deck/training/p/2022-12-29T19-31-55-091Z.md +14 -0
  51. package/resources/data/deck/training/p/2022-12-29T20-03-42-628Z.md +9 -0
  52. package/resources/data/deck/training/p/2022-12-29T20-21-20-669Z.md +7 -0
  53. package/resources/data/deck/training/p/2022-12-29T20-37-08-919Z.md +46 -0
  54. package/resources/data/deck/training/p/2022-12-29T20-37-20-344Z.md +43 -0
  55. package/resources/data/deck/training/p/2022-12-30T19-04-30-990Z.md +8 -0
  56. package/resources/data/deck/training/p/2022-12-31T18-43-56-338Z.md +7 -0
  57. package/resources/data/deck/training/p/2022-12-31T18-51-50-682Z.md +1 -0
  58. package/resources/data/deck/training/p/2022-12-31T18-54-04-176Z.md +4 -0
  59. package/resources/data/deck/training/p/2022-12-31T22-11-55-555Z.md +112 -0
  60. package/resources/data/deck/training/p/2022-12-31T23-00-41-222Z.md +6 -0
  61. package/resources/data/deck/training/p/2022-12-31T23-18-55-655Z.md +69 -0
  62. package/resources/data/deck/training/p/2022-12-31T23-25-40-735Z.md +21 -0
  63. package/resources/data/deck/training/p/2022-12-31T23-25-51-014Z.md +7 -0
  64. package/resources/data/deck/training/p/2023-01-01T17-49-18-429Z.md +3 -0
  65. package/resources/data/deck/training/p/2023-01-01T18-44-07-034Z.md +34 -0
  66. package/resources/data/deck/training/p/2023-01-01T18-47-39-766Z.md +15 -0
  67. package/resources/data/deck/training/p/2023-01-01T19-04-22-830Z.md +4 -0
  68. package/resources/data/deck/training/p/2023-01-01T21-11-58-025Z.md +25 -0
  69. package/resources/data/deck/training/p/2023-01-01T21-12-37-340Z.md +23 -0
  70. package/resources/data/deck/training/p/2023-01-01T21-13-13-880Z.md +8 -0
  71. package/resources/data/deck/training/p/2023-01-01T21-14-45-740Z.md +98 -0
  72. package/resources/data/deck/training/p/2023-01-01T21-18-23-886Z.md +26 -0
  73. package/resources/data/deck/training/p/2023-01-01T21-18-31-316Z.md +19 -0
  74. package/resources/data/deck/training/p/2023-01-01T21-18-42-290Z.md +23 -0
  75. package/resources/data/deck/training/p/2023-01-01T21-19-57-020Z.md +24 -0
  76. package/resources/data/deck/training/p/2023-01-01T21-22-31-184Z.md +13 -0
  77. package/resources/data/deck/training/p/2023-01-01T21-22-38-317Z.md +17 -0
  78. package/resources/data/deck/training/p/2023-01-01T21-22-47-693Z.md +20 -0
  79. package/resources/data/deck/training/p/2023-01-01T21-23-17-716Z.md +39 -0
  80. package/resources/data/deck/training/p/2023-01-01T21-23-28-532Z.md +22 -0
  81. package/resources/data/deck/training/p/2023-01-01T21-25-23-899Z.md +3 -0
  82. package/resources/data/deck/training/p/2023-01-01T21-25-59-742Z.md +1 -0
  83. package/resources/data/deck/training/p/2023-01-01T21-26-53-748Z.md +12 -0
  84. package/resources/data/deck/training/p/2023-01-01T23-38-42-863Z.md +2 -0
  85. package/resources/data/deck/training/p/2023-01-03T02-07-19-014Z.md +143 -0
  86. package/resources/data/deck/training/p/2023-01-04T01-52-23-454Z.md +76 -0
  87. package/resources/data/deck/training/p/2023-01-06T23-21-12-009Z.md +127 -0
  88. package/resources/data/deck/training/p/2023-01-06T23-21-31-685Z.md +81 -0
  89. package/resources/data/deck/training/p/2023-01-06T23-21-59-596Z.md +36 -0
  90. package/resources/data/deck/training/p/2023-01-06T23-34-13-897Z.md +87 -0
  91. package/resources/data/deck/training/p/2023-01-06T23-44-02-340Z.md +0 -0
  92. package/resources/data/deck/training/p/2023-01-06T23-46-36-687Z.md +1 -0
  93. package/resources/data/deck/training/p/2023-01-06T23-46-45-783Z.md +33 -0
  94. package/resources/data/deck/training/p/2023-01-08T00-45-11-144Z.md +50 -0
  95. package/resources/data/deck/training/p/2023-01-08T01-06-31-267Z.md +41 -0
  96. package/resources/data/deck/training/p/2023-01-08T01-24-21-088Z.md +95 -0
  97. package/resources/data/deck/training/p/2023-01-08T01-25-12-557Z.md +11 -0
  98. package/resources/data/deck/training/p/2023-01-08T01-46-50-723Z.md +25 -0
  99. package/resources/data/deck/training/p/2023-01-08T02-09-07-802Z.md +18 -0
  100. package/resources/data/deck/training/p/2023-01-08T02-09-19-678Z.md +66 -0
  101. package/resources/data/deck/training/p/2023-01-08T02-11-26-333Z.md +29 -0
  102. package/resources/data/deck/training/p/2023-01-08T17-22-48-841Z.md +14 -0
  103. package/resources/data/deck/training/p/2023-01-08T20-46-11-806Z.md +5 -0
  104. package/resources/data/deck/training/p/2023-01-08T20-47-23-682Z.md +5 -0
  105. package/resources/data/deck/training/p/2023-01-08T20-47-32-064Z.md +13 -0
  106. package/resources/data/deck/training/p/2023-01-08T20-47-57-045Z.md +0 -0
  107. package/resources/data/deck/training/p/2023-01-08T20-48-03-791Z.md +18 -0
  108. package/resources/data/deck/training/p/2023-01-08T20-48-32-466Z.md +9 -0
  109. package/resources/data/deck/training/p/2023-01-08T20-48-51-322Z.md +20 -0
  110. package/resources/data/deck/training/p/2023-01-08T20-49-52-741Z.md +0 -0
  111. package/resources/data/deck/training/p/2023-01-08T20-52-03-556Z.md +0 -0
  112. package/resources/data/deck/training/p/2023-01-08T20-57-36-333Z.md +2 -0
  113. package/resources/data/deck/training/p/2023-01-08T20-57-51-136Z.md +5 -0
  114. package/resources/data/deck/training/p/2023-01-09T00-07-37-951Z.md +0 -0
  115. package/resources/data/deck/training/p/2023-01-09T00-35-40-671Z.md +3 -0
  116. package/resources/data/deck/training/p/2023-01-10T01-29-38-148Z.md +10 -0
  117. package/resources/data/deck/training/p/2023-01-10T01-43-12-166Z.md +31 -0
  118. package/resources/data/deck/training/p/2023-01-10T02-21-54-303Z.md +10 -0
  119. package/resources/data/deck/training/p/2023-01-12T01-50-54-617Z.md +74 -0
  120. package/resources/data/deck/training/p/2023-01-13T19-55-24-735Z.md +14 -0
  121. package/resources/data/deck/training/p/2023-01-13T20-08-27-068Z.md +28 -0
  122. package/resources/data/deck/training/p/2023-01-13T20-23-38-411Z.md +25 -0
  123. package/resources/data/deck/training/p/2023-01-13T20-37-06-267Z.md +13 -0
  124. package/resources/data/deck/training/p/2023-01-13T21-05-57-708Z.md +8 -0
  125. package/resources/data/deck/training/p/2023-01-13T21-48-17-258Z.md +20 -0
  126. package/resources/data/deck/training/p/2023-01-13T22-05-05-799Z.md +14 -0
  127. package/resources/data/deck/training/p/2023-01-13T22-08-30-863Z.md +17 -0
  128. package/resources/data/deck/training/p/2023-01-13T23-01-50-449Z.md +4 -0
  129. package/resources/data/deck/training/p/2023-01-14T00-33-05-958Z.md +62 -0
  130. package/resources/data/deck/training/p/2023-01-14T00-40-27-784Z.md +229 -0
  131. package/resources/data/deck/training/p/2023-01-14T00-41-59-081Z.md +153 -0
  132. package/resources/data/deck/training/p/2023-01-14T13-50-28-199Z.md +19 -0
  133. package/resources/data/deck/training/p/2023-01-14T13-59-20-275Z.md +6 -0
  134. package/resources/data/deck/training/p/2023-01-14T14-03-29-456Z.md +3 -0
  135. package/resources/data/deck/training/p/2023-01-14T14-27-57-678Z.md +7 -0
  136. package/resources/data/deck/training/p/2023-01-14T17-30-18-228Z.md +33 -0
  137. package/resources/data/deck/training/p/2023-01-14T18-28-39-316Z.md +1 -0
  138. package/resources/data/deck/training/p/2023-01-14T18-28-44-115Z.md +4 -0
  139. package/resources/data/deck/training/p/2023-01-14T18-28-49-548Z.md +18 -0
  140. package/resources/data/deck/training/p/2023-01-14T18-40-13-758Z.md +10 -0
  141. package/resources/data/deck/training/p/2023-01-14T19-29-15-291Z.md +12 -0
  142. package/resources/data/deck/training/p/2023-01-15T18-51-52-134Z.md +83 -0
  143. package/resources/data/deck/training/p/2023-01-15T20-03-30-073Z.md +11 -0
  144. package/resources/data/deck/training/p/2023-01-15T22-07-52-073Z.md +16 -0
  145. package/resources/data/deck/training/p/2023-01-15T22-22-13-517Z.md +12 -0
  146. package/resources/data/deck/training/p/2023-01-15T22-28-57-508Z.md +131 -0
  147. package/resources/data/deck/training/p/2023-01-15T22-36-30-913Z.md +115 -0
  148. package/resources/data/deck/training/p/2023-01-16T16-03-40-770Z.md +12 -0
  149. package/resources/data/deck/training/p/2023-01-16T20-21-56-859Z.md +5 -0
  150. package/resources/data/deck/training/p/2023-01-16T20-24-09-690Z.md +24 -0
  151. package/resources/data/deck/training/p/2023-01-20T12-51-22-646Z.md +21 -0
  152. package/resources/data/deck/training/p/2023-01-20T13-06-46-614Z.md +9 -0
  153. package/resources/data/deck/training/p/2023-01-20T13-08-51-600Z.md +7 -0
  154. package/resources/data/deck/training/p/2023-01-20T15-20-13-363Z.md +26 -0
  155. package/resources/data/deck/training/p/2023-01-20T15-34-58-813Z.md +75 -0
  156. package/resources/data/deck/training/p/2023-01-21T16-33-20-458Z.md +33 -0
  157. package/resources/data/deck/training/p/2023-01-21T16-45-28-263Z.md +28 -0
  158. package/resources/data/deck/training/p/2023-01-21T16-56-25-452Z.md +3 -0
  159. package/resources/data/deck/training/p/2023-01-21T17-28-31-493Z.md +6 -0
  160. package/resources/data/deck/training/p/2023-01-21T19-49-51-918Z.md +13 -0
  161. package/resources/data/deck/training/p/2023-01-21T20-08-24-452Z.md +15 -0
  162. package/resources/data/deck/training/p/2023-01-21T20-35-54-947Z.md +20 -0
  163. package/resources/data/deck/training/p/2023-01-21T20-54-47-603Z.md +39 -0
  164. package/resources/data/deck/training/p/2023-01-21T20-56-28-184Z.md +25 -0
  165. package/resources/data/deck/training/p/2023-01-21T20-57-32-927Z.md +4 -0
  166. package/resources/data/deck/training/p/2023-01-21T23-13-33-394Z.md +6 -0
  167. package/resources/data/deck/training/p/2023-01-28T19-11-37-464Z.md +24 -0
  168. package/resources/data/deck/training/p/2023-01-28T20-43-41-188Z.md +9 -0
  169. package/resources/data/deck/training/p/2023-01-28T20-53-56-476Z.md +8 -0
  170. package/resources/data/deck/training/p/2023-01-28T20-58-43-776Z.md +10 -0
  171. package/resources/data/deck/training/p/2023-01-28T22-18-41-259Z.md +33 -0
  172. package/resources/data/deck/training/p/2023-01-28T22-24-34-808Z.md +24 -0
  173. package/resources/data/deck/training/p/2023-01-29T16-25-24-528Z.md +44 -0
  174. package/resources/data/deck/training/p/2023-01-29T21-14-32-588Z.md +12 -0
  175. package/resources/data/deck/training/p/2023-01-31T19-24-53-504Z.md +8 -0
  176. package/resources/data/deck/training/p/2023-01-31T20-33-55-855Z.md +11 -0
  177. package/resources/data/deck/training/p/2023-01-31T20-34-30-261Z.md +7 -0
  178. package/resources/data/deck/training/p/2023-01-31T20-52-53-367Z.md +43 -0
  179. package/resources/data/deck/training/p/2023-02-04T15-18-35-682Z.md +20 -0
  180. package/resources/data/deck/training/p/2023-02-04T15-49-47-597Z.md +14 -0
  181. package/resources/data/deck/training/p/2023-02-04T18-58-57-808Z.md +1 -0
  182. package/resources/data/deck/training/p/2023-02-04T20-07-11-288Z.md +1 -0
  183. package/resources/data/deck/training/p/2023-02-04T20-09-50-169Z.md +1 -0
  184. package/resources/data/deck/training/p/2023-02-04T20-19-42-740Z.md +8 -0
  185. package/resources/data/deck/training/p/2023-02-04T20-23-56-013Z.md +12 -0
  186. package/resources/data/deck/training/p/2023-02-04T20-28-12-391Z.md +20 -0
  187. package/resources/data/deck/training/p/2023-02-05T00-20-32-554Z.md +16 -0
  188. package/resources/data/deck/training/p/2023-02-05T00-35-56-282Z.md +13 -0
  189. package/resources/data/deck/training/p/2023-02-05T15-36-57-182Z.md +24 -0
  190. package/resources/data/deck/training/p/2023-02-05T17-39-51-712Z.md +70 -0
  191. package/resources/data/deck/training/p/2023-02-05T17-44-53-815Z.md +195 -0
  192. package/resources/data/deck/training/p/2023-02-05T17-45-40-114Z.md +92 -0
  193. package/resources/data/deck/training/p/2023-02-05T18-12-14-489Z.md +60 -0
  194. package/resources/data/deck/training/p/2023-02-06T00-14-54-457Z.md +9 -0
  195. package/resources/data/deck/training/p/2023-06-28T18-03-14-313Z.md +8 -0
  196. package/resources/data/deck/training/p/2023-06-28T18-26-17-290Z.md +7 -0
  197. package/resources/data/deck/training/p/2023-06-28T21-16-24-034Z.md +40 -0
  198. package/resources/data/deck/training/p/2023-06-28T21-16-34-972Z.md +16 -0
  199. package/resources/data/deck/training/p/2023-06-28T21-28-28-379Z.md +4 -0
  200. package/resources/data/deck/training/p/2023-06-29T23-15-10-411Z.md +5 -0
  201. package/resources/data/deck/training/p/2023-07-01T15-42-45-193Z.md +433 -0
  202. package/resources/data/deck/training/p/2023-07-01T21-54-31-329Z.md +6 -0
  203. package/resources/data/deck/training/p/2023-07-02T16-14-06-970Z.md +14 -0
  204. package/resources/data/deck/training/p/2023-07-31T00-26-03-842Z.md +4 -0
  205. package/resources/data/deck/training/p/2023-07-31T00-31-51-933Z.md +10 -0
  206. package/resources/data/deck/training/p/2023-07-31T00-37-21-927Z.md +205 -0
  207. package/resources/data/deck/training/p/2023-10-01T18-29-19-158Z.md +76 -0
  208. package/resources/data/deck/training/p/2023-10-07T19-18-28-517Z.md +102 -0
  209. package/resources/data/deck/training/p/2023-10-08T20-20-07-934Z.md +75 -0
  210. package/resources/data/deck/training/p/2023-10-08T20-20-37-336Z.md +29 -0
  211. package/resources/data/deck/training/p/2023-10-08T20-37-30-658Z.md +0 -0
  212. package/resources/data/deck/training/p/2023-10-08T21-58-25-809Z.md +68 -0
  213. package/resources/data/deck/training/p/2023-10-08T22-22-11-013Z.md +0 -0
  214. package/resources/data/deck/training/p/2023-10-14T19-25-08-153Z.md +119 -0
  215. package/resources/data/deck/training/t.json +1 -0
  216. package/resources/scss/src/apps/learnneo/home/{ContentComponent.scss → ContentView.scss} +9 -15
  217. package/resources/scss/theme-neo-light/Global.scss +46 -0
  218. package/resources/scss/theme-neo-light/design-tokens/Core.scss +7 -0
  219. package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +0 -0
  220. package/resources/scss/theme-neo-light/design-tokens/_all.scss +4 -0
  221. package/src/DefaultConfig.mjs +4 -4
  222. package/src/form/field/Text.mjs +2 -2
  223. package/apps/learnneo/view/home/ContentComponent.mjs +0 -24
  224. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-07T19-18-28-517Z.md +0 -0
  225. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-07-934Z.md +0 -0
  226. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-37-336Z.md +0 -0
  227. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-37-30-658Z.md +0 -0
  228. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T21-58-25-809Z.md +0 -0
  229. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T22-22-11-013Z.md +0 -0
  230. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-14T19-25-08-153Z.md +0 -0
  231. /package/resources/data/{learnneo → deck/learnneo}/pages/whyneo.md +0 -0
  232. /package/resources/data/{learnneo → deck/learnneo}/tree.json +0 -0
  233. /package/resources/{deck → data/deck}/whyneo.md +0 -0
  234. /package/resources/scss/src/apps/newwebsite/{MainContainer.css → MainContainer.scss} +0 -0
  235. /package/resources/scss/theme-neo-light/design-tokens/{Components.scss → Component.scss} +0 -0
@@ -0,0 +1,43 @@
1
+
2
+ The code is also _declarative_ — it describes what you're creating.
3
+ It's also an abstraction, because it describes _what's_ in the user interface,
4
+ but not _how_ it's rendered.
5
+
6
+ <pre class="runnable text readonly">
7
+ import Component from '../../../node_modules/neo.mjs/src/component/Base.mjs';
8
+ import TabContainer from '../../../node_modules/neo.mjs/src/tab/Container.mjs';
9
+ import Viewport from '../../../node_modules/neo.mjs/src/container/Viewport.mjs';
10
+
11
+ class MainContainer extends Viewport {
12
+ static config = {
13
+ className: 'Starter.view.MainContainer',
14
+ ntype: 'main',
15
+ autoMount: true,
16
+ style: { padding: '20px' },
17
+ layout: { ntype: 'fit' },
18
+ items: [{
19
+ module: TabContainer,
20
+ itemDefaults: {
21
+ module: Component,
22
+ cls: ['neo-examples-tab-component'],
23
+ style: { padding: '20px' }
24
+ },
25
+ items: [{
26
+ tabButtonConfig: {
27
+ iconCls: 'fa fa-home',
28
+ text: 'Tab 1'
29
+ },
30
+ vdom: { innerHTML: 'Welcome to your new Neo App.' }
31
+ }, {
32
+ tabButtonConfig: {
33
+ iconCls: 'fa fa-play-circle',
34
+ text: 'Tab 2'
35
+ },
36
+ vdom: { innerHTML: 'Have fun creating something awesome!' }
37
+ }]
38
+ }]
39
+ }
40
+ }
41
+ Neo.applyClassConfig(MainContainer);
42
+ export default MainContainer;
43
+ </pre>
@@ -0,0 +1,8 @@
1
+ Neo takes the _declarative_ approach,
2
+ where you configure high-level components. The details of rendering
3
+ those to the run-time environment is handled by the framework (and
4
+ low-level code).
5
+
6
+ Ultimately, components do need to translate into DOM and styling, and
7
+ you may need to do that yourself occastionally, but
8
+ Neo tries to make that the exception, rather than the rule.
@@ -0,0 +1,7 @@
1
+ <img style="float:left;margin-right:1em;" height="600" src="resources/images/intro/LookForSetters.png"/>
2
+
3
+ Once you find the component, expand it and scroll down until you see the grayed-out
4
+ properties &mdash; those are the setter/getter properties.
5
+
6
+ Choose whatever property you're interested in, and click on the ellipses. That
7
+ runs the getter, and if you change the value you'll be running the setter.
@@ -0,0 +1 @@
1
+ <img style="float:left;margin-right:1em;" height="600" src="resources/images/intro/ChangeText.png"/>
@@ -0,0 +1,4 @@
1
+ You can run methods too. And since there's no transpiling, anything you can put in your
2
+ code will run on the command line.
3
+
4
+ <img height="480" src="resources/images/intro/Add.png"/>
@@ -0,0 +1,112 @@
1
+ #Introduction
2
+
3
+ In this lab, you'll generate a starter app, then modify it to use a table to
4
+ show earthquakes in Iceland.
5
+
6
+ #Steps
7
+
8
+ ??Create the application
9
+
10
+ Use a terminal window to navidate to the root of your Neo project, and run the _create-app-training_
11
+ scrip. Name the app _Earthquakes_. **Important:** Rather than taking all defaults, you _must_ choose the GoogleMaps main thread addon.
12
+
13
+ npm run create-app-training
14
+
15
+ When you run the app you should get a runtime error telling you the api key is missing.
16
+
17
+ Google Maps JavaScript API warning: NoApiKeys
18
+
19
+ ??Add the Google Maps API key
20
+
21
+ Edit `apps/earthquakes/neo-config.json` and add an entry for _googleMapsApiKey_.
22
+ <pre style="color:lightgray;">
23
+ {
24
+ "appPath": "../../apps/earthquakes/app.mjs",
25
+ "basePath": "../../",
26
+ "environment": "development",
27
+ "mainPath": "../node_modules/neo.mjs/src/Main.mjs",
28
+ "mainThreadAddons": [
29
+ "DragDrop",
30
+ "GoogleMaps",
31
+ "Stylesheet"
32
+ ],
33
+ <span style="font-weight:bold;color:blue">"googleMapsApiKey": "AIzaSyCRj-EPE3H7PCzZtYCmDzln6sj7uPCGohA",</span>
34
+ "workerBasePath": "../../node_modules/neo.mjs/src/worker/"
35
+ }
36
+ </pre>
37
+
38
+ Refresh your browser window and you should see the starter app without any warnings.
39
+
40
+ ??Add the table and store to the `MainView`
41
+
42
+ Look the main view. It has an empty `items:[]`. Change it so it has one item, which
43
+ is the config for a table and store
44
+
45
+ <pre class="runnable readonly">
46
+ {
47
+ module: Table,
48
+ flex: 1,
49
+ store: {
50
+ module: Store,
51
+ model: {
52
+ fields: [{
53
+ name: "humanReadableLocation",
54
+ }, {
55
+ name: "size",
56
+ ntype: "data-field-float",
57
+ }, {
58
+ name: "timestamp",
59
+ type: "Date",
60
+ }, {
61
+ name: "title",
62
+ calculate: (data, field, item) => item.humanReadableLocation,
63
+ }, {
64
+ name: "position",
65
+ calculate: (data, field, item) => ({
66
+ lat: item.latitude,
67
+ lng: item.longitude,
68
+ }),
69
+ },
70
+ ],
71
+ },
72
+ url: "https://apis.is/earthquake/is",
73
+ responseRoot: "results",
74
+ autoLoad: true,
75
+ },
76
+ columns: [{
77
+ dataField: "timestamp",
78
+ text: "Date",
79
+ renderer: (data) =>
80
+ data.value.toLocaleDateString(undefined, {
81
+ weekday: "long",
82
+ year: "numeric",
83
+ month: "long",
84
+ day: "numeric",
85
+ }),
86
+ }, {
87
+ dataField: "humanReadableLocation",
88
+ text: "Location",
89
+ }, {
90
+ dataField: "size",
91
+ text: "Magnitude",
92
+ align: "right",
93
+ width: 100,
94
+ renderer: (data) => data.value.toLocaleString(),
95
+ }],
96
+ }
97
+ </pre>
98
+
99
+ If you were to save and refresh you'll get a runtime error
100
+
101
+ ReferenceError: Table is not defined
102
+
103
+ That's beause the new code references two classes: _Store_ and _Table_, and those haven't been imported.
104
+
105
+ ??Add imports for `Store` and `Table`
106
+
107
+ At the top of `MainView.mjs` add two imports:
108
+
109
+ import Table from "../../../node_modules/neo.mjs/src/table/Container.mjs";
110
+ import Store from "../../../node_modules/neo.mjs/src/data/Store.mjs";
111
+
112
+ Save and refresh and the app should run.
@@ -0,0 +1,6 @@
1
+ Let's create another starter, but do something more sophisticated: We'll call
2
+ a web service that returns information on earthquakes in Iceland, and show
3
+ that information in a table.
4
+
5
+ Then we'll enhance and refactor the application to showcase some basic principles of Neo.
6
+
@@ -0,0 +1,69 @@
1
+ #Introduction
2
+
3
+ In this lab, you'll refactor the app, making the table its own class, adding the map,
4
+
5
+
6
+ #Steps
7
+
8
+ ??Move the table into its own class
9
+
10
+ Create a new file named `apps/earthquakes/view/earthquakes/Table.mjs` with this content.
11
+
12
+ <pre class="runnable text readonly">
13
+ import Base from '../../../../node_modules/neo.mjs/src/table/Container.mjs';
14
+
15
+ class Table extends Base {
16
+ static config = {
17
+ className: 'Earthquakes.view.earthquakes.Table',
18
+ ntype: 'earthquakes-table',
19
+ columns: [{
20
+ dataField: 'timestamp',
21
+ text: 'Date',
22
+ flex: 1,
23
+ renderer: data => data.value.toLocaleDateString(undefined, {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'})
24
+ }, {
25
+ dataField: 'humanReadableLocation',
26
+ text: 'Location',
27
+ flex: 1,
28
+ }, {
29
+ dataField: 'size',
30
+ text: 'Magnitude',
31
+ align: 'right',
32
+ flex: 1,
33
+ renderer: data => data.value.toLocaleString()
34
+ }]
35
+ }
36
+ }
37
+
38
+ Neo.applyClassConfig(Table);
39
+ export default Table;
40
+ </pre>
41
+
42
+ ??Review the code
43
+
44
+ What's in the code?
45
+
46
+ - The class extends `Neo.table.Container`
47
+ - It has an `ntype`, which we can use when creating an instance, or when debugging
48
+ - Each column has `text` and `dataField` configs, and some have renderers
49
+
50
+ ??Use the new component
51
+
52
+ Edit `apps/earthquakes/view/MainView` and look for the config block for the table.
53
+
54
+ - Import the new class: `import EarthquakesTable from './earthquakes/Table.mjs';`
55
+ - Replace the `module: Table` with `module: EarthquakesTable`
56
+ - Remove the `columns:[]` config
57
+ - Leave the `store` config alone
58
+
59
+ Save and refresh the browser, and your app should run as before.
60
+
61
+ You can confim that the new class _is being loaded_ by using DevTools to try to open `earthquakes/Table` &mdash; if it
62
+ was imported, it'll be listed.
63
+
64
+ You can conrim that an instance _was created_ by using the DevTools console and searching for it via
65
+
66
+ Neo.first('earthquakes-table')
67
+
68
+ That will return a component reference if there's a match.
69
+
@@ -0,0 +1,21 @@
1
+ Neo comes with a Google maps wrapper. Its key properties are:
2
+
3
+
4
+ ##center
5
+
6
+ {lat: 1.1234, lng:23.4456}
7
+
8
+ <br>
9
+
10
+ ##markerStore
11
+
12
+ A store whose records contain
13
+
14
+ {title: 'String', location:{lat: 1.1234, lng:23.4456}}
15
+
16
+ <br>
17
+
18
+
19
+ ##zoom
20
+
21
+ The Google Maps zoom level. It defaults to 8.
@@ -0,0 +1,7 @@
1
+ `Neo.core.Base` is the Neo base class. It mixes in `Neo.core.Observable`.
2
+ This means all Neo classes have the ability to fire events or configure
3
+ event listeners.
4
+
5
+ The API docs have an _events_ section for each class.
6
+
7
+ Tables fire a _select_ event. Google Maps components fire a _markerClick_ event
@@ -0,0 +1,3 @@
1
+ We can use DevTools and our debugging skills to inspect the store.
2
+
3
+ <img height="400" src="resources/images/intro/InspectTheStore.png"/>
@@ -0,0 +1,34 @@
1
+ <pre class="runnable text readonly">
2
+ import Base from '../../../../node_modules/neo.mjs/src/table/Container.mjs';
3
+
4
+ class Table extends Base {
5
+ static config = {
6
+ className: 'Earthquakes.view.earthquakes.Table',
7
+ ntype: 'earthquakes-table',
8
+ columns: [{
9
+ dataField: 'timestamp',
10
+ text: 'Date',
11
+ flex: 1,
12
+ renderer: data => data.value.toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })
13
+ }, {
14
+ dataField: 'humanReadableLocation',
15
+ text: 'Location',
16
+ flex: 1,
17
+ }, {
18
+ dataField: 'size',
19
+ text: 'Magnitude',
20
+ align: 'right',
21
+ flex: 1,
22
+ // width: 100,
23
+ renderer: data => data.value.toLocaleString()
24
+ }]
25
+ }
26
+ }
27
+
28
+ Neo.applyClassConfig(Table);
29
+ export default Table;
30
+
31
+ </pre>
32
+
33
+ Why isn't the store there? Because typically, the code _creating_ the table
34
+ is responsible for providing the store.
@@ -0,0 +1,15 @@
1
+ Let's enhance the app to use a Google Map to show where the earthquakes occurred.
2
+
3
+ <pre style="font-size:1.6em;">
4
+ import GoogleMapsComponent from '../../../node_modules/neo.mjs/src/component/wrapper/GoogleMaps.mjs';
5
+ ...
6
+ {
7
+ module: GoogleMapsComponent,
8
+ flex: 1,
9
+ center: {
10
+ lat: 64.8014187,
11
+ lng: -18.3096357
12
+ },
13
+ zoom: 6,
14
+ }
15
+ </pre>
@@ -0,0 +1,4 @@
1
+ But this design has a problem: even though the table is nicely
2
+ reusable, the stores are duplicated.
3
+
4
+ Duplicating the store config is poor reuse and higher maintenance, and fetching the data twice is inefficient.
@@ -0,0 +1,25 @@
1
+ Configs can hold simple instance properties.
2
+
3
+ <pre class="runnable readonly text">
4
+ class Simple extends Base {
5
+ static config = {
6
+ className: 'Demo.view.component.Simple',
7
+ ntype: 'demo-simple-component',
8
+
9
+ foo: 1, // An instance field
10
+
11
+ }
12
+ }
13
+ ...
14
+ items: [{
15
+ module: Simple
16
+
17
+ tabButtonConfig: {iconCls: 'fa fa-home', text: 'Simple'},
18
+
19
+ }, {
20
+ module: Simple
21
+ foo: 2, // This value is used for the instance
22
+
23
+ tabButtonConfig: {iconCls: 'fa fa-home', text: 'Simple'},
24
+ }],
25
+ </pre>
@@ -0,0 +1,23 @@
1
+ You can create get/set properties by using the underscore suffix.
2
+
3
+ <pre class="runnable readonly text 300">
4
+ class Simple extends Base {
5
+ static getConfig() {
6
+ return {
7
+ className: 'Demo.view.component.Simple',
8
+ ntype: 'demo-simple-component',
9
+
10
+ foo: 1, // An instance field
11
+
12
+ bar_: null, // A get/set field with lifecycle hooks
13
+
14
+ }
15
+ }
16
+ }
17
+ </pre>
18
+
19
+ In the debugger console this shows up as a get/set property.
20
+
21
+ <pre style="color:gray;">
22
+ <span style="color:DarkOrchid">bar</span>: (...)
23
+ </pre>
@@ -0,0 +1,8 @@
1
+ When you use the underscore suffix, Neo generates the get/set, and it also generates
2
+ lifecycle methods that let you intervene as the property is accessed or set.
3
+
4
+ For example, if you define the property `foo_`, Neo will generate these methods.
5
+
6
+ - `beforeSetFoo(value, oldValue)` &mdash; returns the value to be used for the set
7
+ - `afterSetFoo(value, oldValue)`
8
+ - `beforeGetFoo(value)` &mdash; returns a value
@@ -0,0 +1,98 @@
1
+ #Introduction
2
+
3
+ In this lab, you'll generate a starter app.
4
+
5
+ #Steps
6
+
7
+ <details>
8
+ <summary>Create the application</summary>
9
+
10
+ Use a terminal window to navigate to the root of your Neo workspace,
11
+ and run the following command. **Important:** Rather than taking all defaults, you _must_ choose the GoogleMaps option.
12
+
13
+ npm run create-app-training
14
+
15
+ Name the app `Yelp`.
16
+
17
+ If you run the app you'll get a runtime error telling you the api key is missing.
18
+ You add the API key in the next step.
19
+
20
+ Google Maps JavaScript API warning: NoApiKeys
21
+
22
+ ??Add the Google Maps API key
23
+
24
+ Edit `apps/yelp/neo-config.json` and add an entry for _googleMapsApiKey_.
25
+
26
+ <pre style="color:lightgray;">
27
+ {
28
+ "appPath": "../../apps/yelp/app.mjs",
29
+ "basePath": "../../",
30
+ "environment": "development",
31
+ "mainPath": "../node_modules/neo.mjs/src/Main.mjs",
32
+ "mainThreadAddons": [
33
+ "DragDrop",
34
+ "GoogleMaps",
35
+ "Stylesheet"
36
+ ],
37
+ <span style="font-weight:bold;color:limegreen">"googleMapsApiKey": "AIzaSyCRj-EPE3H7PCzZtYCmDzln6sj7uPCGohA",</span>
38
+ "workerBasePath": "../../node_modules/neo.mjs/src/worker/"
39
+ }
40
+ </pre>
41
+
42
+ Refresh your browser window and you should see the starter app without any warnings.
43
+ </details>
44
+
45
+ <details>
46
+ <summary>Change `MainView` to be a panel</summary>
47
+
48
+ Replace the entire contents of `MainView` with this code.
49
+
50
+ <pre class="runnable readonly text">
51
+ import Base from '../../../node_modules/neo.mjs/src/container/Panel.mjs';
52
+ import Controller from './MainViewController.mjs';
53
+ import ViewModel from './MainViewModel.mjs';
54
+
55
+ class MainView extends Base {
56
+ static config = {
57
+ className: 'Junk.view.MainView',
58
+
59
+ controller: {module: Controller},
60
+ model: {module: ViewModel},
61
+
62
+ headers: [{
63
+ dock: 'top',
64
+ html: 'banner'
65
+ }, {
66
+ dock: 'top',
67
+ html: 'filter'
68
+ }, {
69
+ dock: 'right',
70
+ html: 'details',
71
+ width: 300
72
+ }],
73
+ items: [{
74
+ html: 'tab container'
75
+ }]
76
+ }
77
+ }
78
+
79
+ Neo.applyClassConfig(MainView);
80
+
81
+ export default MainView;
82
+ </pre>
83
+
84
+ We'll learn about panels later, but in a nutshell, a panel is a container
85
+ that has a special `headers:[]` config that lets you add components to the
86
+ top, right, bottom, or left edges of the container.
87
+
88
+ What does the code do?
89
+
90
+ - Changes the view to be a panel
91
+ - Adds three docked headers which are placeholders for classes you'll create
92
+ - The banner at the top
93
+ - The filter container at the top
94
+ - The business details container at the right
95
+
96
+ Verify that the app runs.
97
+
98
+ </details>
@@ -0,0 +1,26 @@
1
+ <pre class="runnable readonly text 480">
2
+ {
3
+ ntype : 'container',
4
+ style: {
5
+ marginTop: '30px'
6
+ },
7
+
8
+ layout: {
9
+ ntype: 'vbox',
10
+ align: 'start'
11
+ },
12
+
13
+ items: [{
14
+ module : Button,
15
+ iconCls : 'fa fa-home',
16
+ iconPosition: 'right',
17
+ text : 'Right'
18
+ }, {
19
+ ntype : 'button',
20
+ flex : 1,
21
+ iconCls : 'fa fa-play-circle',
22
+ iconPosition: 'bottom',
23
+ text : 'Bottom'
24
+ }, SomeClass]
25
+ }
26
+ </pre>
@@ -0,0 +1,19 @@
1
+ `itemDefaults:{}` specifies an item config used for every item in
2
+ `items:[]`. Individual items are free to set their own values.
3
+
4
+ <pre class="runnable readonly text 300">
5
+ itemDefaults: {
6
+ module: Button,
7
+ handler: 'onButtonClick',
8
+ flex: 1
9
+ },
10
+ items: [{
11
+ style: { backgroundColor: 'red' },
12
+ }, {
13
+ style: { backgroundColor: 'yellow' },
14
+ }, {
15
+ style: { backgroundColor: 'lightblue' },
16
+ }, {
17
+ module: Label // This is used instead of the default
18
+ }]
19
+ </pre>
@@ -0,0 +1,23 @@
1
+ Items are arranged according to a `layout`.
2
+
3
+ - `layout:'fit'`
4
+ - `layout: 'card'`
5
+ - `layout: 'vbox'`
6
+ - `layout: 'hbox'`
7
+ - `layout: 'flexbox'`
8
+
9
+ When you need to provide more config details, use this form:
10
+
11
+ layout: {
12
+ ntype:'vbox',
13
+ align: 'stretch'
14
+ }
15
+
16
+
17
+ The container base class imports all layouts, which means you
18
+ can use `ntype` (and don't need to explicitly import the layout class).
19
+
20
+ <span style="color: #bbbbbb;">And actually, in the case of layouts, you
21
+ <i style="color: #bbbbbb;">must</i> use ntype. You do not specify layouts
22
+ using the <tt>module</tt> config.
23
+ </span>
@@ -0,0 +1,24 @@
1
+ You can procedurally add or remove items.
2
+
3
+ - `insert(index, item, [silent])`
4
+ - `remove(component, [destroyItem], [silent])`
5
+ - `removeAt(index, [destroyItem], [silent])`
6
+
7
+
8
+
9
+ <pre class="runnable readonly text 100">
10
+ this.add({
11
+ module: Button,
12
+ text: 'New Button'
13
+ });
14
+ </pre>
15
+
16
+ <pre class="runnable readonly text 160">
17
+ this.add([{
18
+ module: Button,
19
+ text: 'One'
20
+ }, {
21
+ module: Button,
22
+ text: 'Two'
23
+ }]);
24
+ </pre>
@@ -0,0 +1,13 @@
1
+ Components and other classes fire _events_. Those events run a callback
2
+ function called the event _listener_ or _handler_.
3
+
4
+ For example, buttons fire _click_ events, tables
5
+ fire _select_ events, and stores fire _load_ events.
6
+
7
+ The usual way to configure to an event is with the `listeners` config.
8
+
9
+ listeners: {
10
+ select: 'onTableSelect'
11
+ },
12
+
13
+
@@ -0,0 +1,17 @@
1
+ The _listeners_ object is a name value pair, where the name is the
2
+ name of the event, and the value is either a function or the string
3
+ name of the function in the view's controller (or controllers up the
4
+ containment hierarchy).
5
+
6
+ listeners: {
7
+ change: data=>console.log(data),
8
+ focusChange: data=>console.log(data)
9
+ },
10
+
11
+
12
+ listeners: {
13
+ change: 'onChange',
14
+ focusChange: 'onFocusChange'
15
+ },
16
+
17
+
@@ -0,0 +1,20 @@
1
+ You can also add listeners procedurally.
2
+
3
+ <pre style="font-size: 14pt">
4
+ this.getReference('mycomp').addListener(string, function);
5
+ </pre>
6
+
7
+ The string is the name of the event, the function is the callback function.
8
+
9
+ The callback function could be an in-line function, or a reference to a function.
10
+
11
+
12
+ <pre style="font-size: 14pt">
13
+ this.getReference('mycomp').addListener('change', data=>console.log(data));
14
+ </pre>
15
+
16
+
17
+
18
+ <pre style="font-size: 14pt">
19
+ this.getReference('mycomp').addListener('change', this.onChange.bind(this));
20
+ </pre>