neo.mjs 6.9.9 → 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.
- package/apps/ServiceWorker.mjs +2 -2
- package/apps/learnneo/neo-config.json +5 -1
- package/apps/learnneo/store/Content.mjs +1 -1
- package/apps/learnneo/view/Viewport.mjs +12 -1
- package/apps/learnneo/view/home/ContentTreeList.mjs +53 -34
- package/apps/learnneo/view/home/ContentView.mjs +60 -0
- package/apps/learnneo/view/home/MainContainer.mjs +36 -9
- package/apps/learnneo/view/home/MainContainerController.mjs +57 -18
- package/apps/newwebsite/app.mjs +6 -0
- package/apps/newwebsite/index.html +10 -0
- package/apps/newwebsite/neo-config.json +7 -0
- package/apps/newwebsite/view/MainContainer.mjs +59 -0
- package/buildScripts/webpack/json/myApps.template.json +1 -0
- package/examples/ConfigurationViewport.mjs +12 -9
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/button/base/neo-config.json +1 -2
- package/examples/form/field/textarea/MainContainer.mjs +1 -1
- package/package.json +2 -2
- package/resources/data/{learnneo → deck/learnneo}/p/2023-10-01T18-29-19-158Z.md +3 -6
- package/resources/data/deck/learnneo/p/stylesheet.md +40 -0
- package/resources/data/{learnneo → deck/learnneo}/t.json +19 -2
- package/resources/data/deck/training/p/2022-12-27T21-54-52-300Z.md +11 -0
- package/resources/data/deck/training/p/2022-12-27T21-55-23-144Z.md +43 -0
- package/resources/data/deck/training/p/2022-12-27T21-55-30-948Z.md +1 -0
- package/resources/data/deck/training/p/2022-12-27T21-55-43-542Z.md +84 -0
- package/resources/data/deck/training/p/2022-12-27T22-23-55-083Z.md +1 -0
- package/resources/data/deck/training/p/2022-12-27T22-24-07-886Z.md +8 -0
- package/resources/data/deck/training/p/2022-12-27T22-24-52-295Z.md +8 -0
- package/resources/data/deck/training/p/2022-12-27T22-25-03-853Z.md +5 -0
- package/resources/data/deck/training/p/2022-12-27T22-43-58-924Z.md +10 -0
- package/resources/data/deck/training/p/2022-12-27T22-44-28-881Z.md +3 -0
- package/resources/data/deck/training/p/2022-12-27T22-44-41-791Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-27T22-45-21-032Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-27T22-49-22-078Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-27T22-50-20-626Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-28T16-58-47-786Z.md +0 -0
- package/resources/data/deck/training/p/2022-12-28T16-58-55-192Z.md +9 -0
- package/resources/data/deck/training/p/2022-12-28T17-10-18-058Z.md +15 -0
- package/resources/data/deck/training/p/2022-12-28T17-10-42-296Z.md +40 -0
- package/resources/data/deck/training/p/2022-12-28T17-11-34-653Z.md +41 -0
- package/resources/data/deck/training/p/2022-12-28T17-13-09-994Z.md +0 -0
- package/resources/data/deck/training/p/2022-12-28T21-32-14-420Z.md +0 -0
- package/resources/data/deck/training/p/2022-12-29T01-43-32-431Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T15-56-54-485Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T15-57-11-499Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T16-00-13-223Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T18-34-25-826Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-29T18-36-08-226Z.md +106 -0
- package/resources/data/deck/training/p/2022-12-29T18-36-56-893Z.md +112 -0
- package/resources/data/deck/training/p/2022-12-29T19-31-30-507Z.md +31 -0
- package/resources/data/deck/training/p/2022-12-29T19-31-55-091Z.md +14 -0
- package/resources/data/deck/training/p/2022-12-29T20-03-42-628Z.md +9 -0
- package/resources/data/deck/training/p/2022-12-29T20-21-20-669Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T20-37-08-919Z.md +46 -0
- package/resources/data/deck/training/p/2022-12-29T20-37-20-344Z.md +43 -0
- package/resources/data/deck/training/p/2022-12-30T19-04-30-990Z.md +8 -0
- package/resources/data/deck/training/p/2022-12-31T18-43-56-338Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-31T18-51-50-682Z.md +1 -0
- package/resources/data/deck/training/p/2022-12-31T18-54-04-176Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-31T22-11-55-555Z.md +112 -0
- package/resources/data/deck/training/p/2022-12-31T23-00-41-222Z.md +6 -0
- package/resources/data/deck/training/p/2022-12-31T23-18-55-655Z.md +69 -0
- package/resources/data/deck/training/p/2022-12-31T23-25-40-735Z.md +21 -0
- package/resources/data/deck/training/p/2022-12-31T23-25-51-014Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-01T17-49-18-429Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-01T18-44-07-034Z.md +34 -0
- package/resources/data/deck/training/p/2023-01-01T18-47-39-766Z.md +15 -0
- package/resources/data/deck/training/p/2023-01-01T19-04-22-830Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-01T21-11-58-025Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-01T21-12-37-340Z.md +23 -0
- package/resources/data/deck/training/p/2023-01-01T21-13-13-880Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-01T21-14-45-740Z.md +98 -0
- package/resources/data/deck/training/p/2023-01-01T21-18-23-886Z.md +26 -0
- package/resources/data/deck/training/p/2023-01-01T21-18-31-316Z.md +19 -0
- package/resources/data/deck/training/p/2023-01-01T21-18-42-290Z.md +23 -0
- package/resources/data/deck/training/p/2023-01-01T21-19-57-020Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-01T21-22-31-184Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-01T21-22-38-317Z.md +17 -0
- package/resources/data/deck/training/p/2023-01-01T21-22-47-693Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-01T21-23-17-716Z.md +39 -0
- package/resources/data/deck/training/p/2023-01-01T21-23-28-532Z.md +22 -0
- package/resources/data/deck/training/p/2023-01-01T21-25-23-899Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-01T21-25-59-742Z.md +1 -0
- package/resources/data/deck/training/p/2023-01-01T21-26-53-748Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-01T23-38-42-863Z.md +2 -0
- package/resources/data/deck/training/p/2023-01-03T02-07-19-014Z.md +143 -0
- package/resources/data/deck/training/p/2023-01-04T01-52-23-454Z.md +76 -0
- package/resources/data/deck/training/p/2023-01-06T23-21-12-009Z.md +127 -0
- package/resources/data/deck/training/p/2023-01-06T23-21-31-685Z.md +81 -0
- package/resources/data/deck/training/p/2023-01-06T23-21-59-596Z.md +36 -0
- package/resources/data/deck/training/p/2023-01-06T23-34-13-897Z.md +87 -0
- package/resources/data/deck/training/p/2023-01-06T23-44-02-340Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-06T23-46-36-687Z.md +1 -0
- package/resources/data/deck/training/p/2023-01-06T23-46-45-783Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-08T00-45-11-144Z.md +50 -0
- package/resources/data/deck/training/p/2023-01-08T01-06-31-267Z.md +41 -0
- package/resources/data/deck/training/p/2023-01-08T01-24-21-088Z.md +95 -0
- package/resources/data/deck/training/p/2023-01-08T01-25-12-557Z.md +11 -0
- package/resources/data/deck/training/p/2023-01-08T01-46-50-723Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-08T02-09-07-802Z.md +18 -0
- package/resources/data/deck/training/p/2023-01-08T02-09-19-678Z.md +66 -0
- package/resources/data/deck/training/p/2023-01-08T02-11-26-333Z.md +29 -0
- package/resources/data/deck/training/p/2023-01-08T17-22-48-841Z.md +14 -0
- package/resources/data/deck/training/p/2023-01-08T20-46-11-806Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-08T20-47-23-682Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-08T20-47-32-064Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-08T20-47-57-045Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-08T20-48-03-791Z.md +18 -0
- package/resources/data/deck/training/p/2023-01-08T20-48-32-466Z.md +9 -0
- package/resources/data/deck/training/p/2023-01-08T20-48-51-322Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-08T20-49-52-741Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-08T20-52-03-556Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-08T20-57-36-333Z.md +2 -0
- package/resources/data/deck/training/p/2023-01-08T20-57-51-136Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-09T00-07-37-951Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-09T00-35-40-671Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-10T01-29-38-148Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-10T01-43-12-166Z.md +31 -0
- package/resources/data/deck/training/p/2023-01-10T02-21-54-303Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-12T01-50-54-617Z.md +74 -0
- package/resources/data/deck/training/p/2023-01-13T19-55-24-735Z.md +14 -0
- package/resources/data/deck/training/p/2023-01-13T20-08-27-068Z.md +28 -0
- package/resources/data/deck/training/p/2023-01-13T20-23-38-411Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-13T20-37-06-267Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-13T21-05-57-708Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-13T21-48-17-258Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-13T22-05-05-799Z.md +14 -0
- package/resources/data/deck/training/p/2023-01-13T22-08-30-863Z.md +17 -0
- package/resources/data/deck/training/p/2023-01-13T23-01-50-449Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-14T00-33-05-958Z.md +62 -0
- package/resources/data/deck/training/p/2023-01-14T00-40-27-784Z.md +229 -0
- package/resources/data/deck/training/p/2023-01-14T00-41-59-081Z.md +153 -0
- package/resources/data/deck/training/p/2023-01-14T13-50-28-199Z.md +19 -0
- package/resources/data/deck/training/p/2023-01-14T13-59-20-275Z.md +6 -0
- package/resources/data/deck/training/p/2023-01-14T14-03-29-456Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-14T14-27-57-678Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-14T17-30-18-228Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-14T18-28-39-316Z.md +1 -0
- package/resources/data/deck/training/p/2023-01-14T18-28-44-115Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-14T18-28-49-548Z.md +18 -0
- package/resources/data/deck/training/p/2023-01-14T18-40-13-758Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-14T19-29-15-291Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-15T18-51-52-134Z.md +83 -0
- package/resources/data/deck/training/p/2023-01-15T20-03-30-073Z.md +11 -0
- package/resources/data/deck/training/p/2023-01-15T22-07-52-073Z.md +16 -0
- package/resources/data/deck/training/p/2023-01-15T22-22-13-517Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-15T22-28-57-508Z.md +131 -0
- package/resources/data/deck/training/p/2023-01-15T22-36-30-913Z.md +115 -0
- package/resources/data/deck/training/p/2023-01-16T16-03-40-770Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-16T20-21-56-859Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-16T20-24-09-690Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-20T12-51-22-646Z.md +21 -0
- package/resources/data/deck/training/p/2023-01-20T13-06-46-614Z.md +9 -0
- package/resources/data/deck/training/p/2023-01-20T13-08-51-600Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-20T15-20-13-363Z.md +26 -0
- package/resources/data/deck/training/p/2023-01-20T15-34-58-813Z.md +75 -0
- package/resources/data/deck/training/p/2023-01-21T16-33-20-458Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-21T16-45-28-263Z.md +28 -0
- package/resources/data/deck/training/p/2023-01-21T16-56-25-452Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-21T17-28-31-493Z.md +6 -0
- package/resources/data/deck/training/p/2023-01-21T19-49-51-918Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-21T20-08-24-452Z.md +15 -0
- package/resources/data/deck/training/p/2023-01-21T20-35-54-947Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-21T20-54-47-603Z.md +39 -0
- package/resources/data/deck/training/p/2023-01-21T20-56-28-184Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-21T20-57-32-927Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-21T23-13-33-394Z.md +6 -0
- package/resources/data/deck/training/p/2023-01-28T19-11-37-464Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-28T20-43-41-188Z.md +9 -0
- package/resources/data/deck/training/p/2023-01-28T20-53-56-476Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-28T20-58-43-776Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-28T22-18-41-259Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-28T22-24-34-808Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-29T16-25-24-528Z.md +44 -0
- package/resources/data/deck/training/p/2023-01-29T21-14-32-588Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-31T19-24-53-504Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-31T20-33-55-855Z.md +11 -0
- package/resources/data/deck/training/p/2023-01-31T20-34-30-261Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-31T20-52-53-367Z.md +43 -0
- package/resources/data/deck/training/p/2023-02-04T15-18-35-682Z.md +20 -0
- package/resources/data/deck/training/p/2023-02-04T15-49-47-597Z.md +14 -0
- package/resources/data/deck/training/p/2023-02-04T18-58-57-808Z.md +1 -0
- package/resources/data/deck/training/p/2023-02-04T20-07-11-288Z.md +1 -0
- package/resources/data/deck/training/p/2023-02-04T20-09-50-169Z.md +1 -0
- package/resources/data/deck/training/p/2023-02-04T20-19-42-740Z.md +8 -0
- package/resources/data/deck/training/p/2023-02-04T20-23-56-013Z.md +12 -0
- package/resources/data/deck/training/p/2023-02-04T20-28-12-391Z.md +20 -0
- package/resources/data/deck/training/p/2023-02-05T00-20-32-554Z.md +16 -0
- package/resources/data/deck/training/p/2023-02-05T00-35-56-282Z.md +13 -0
- package/resources/data/deck/training/p/2023-02-05T15-36-57-182Z.md +24 -0
- package/resources/data/deck/training/p/2023-02-05T17-39-51-712Z.md +70 -0
- package/resources/data/deck/training/p/2023-02-05T17-44-53-815Z.md +195 -0
- package/resources/data/deck/training/p/2023-02-05T17-45-40-114Z.md +92 -0
- package/resources/data/deck/training/p/2023-02-05T18-12-14-489Z.md +60 -0
- package/resources/data/deck/training/p/2023-02-06T00-14-54-457Z.md +9 -0
- package/resources/data/deck/training/p/2023-06-28T18-03-14-313Z.md +8 -0
- package/resources/data/deck/training/p/2023-06-28T18-26-17-290Z.md +7 -0
- package/resources/data/deck/training/p/2023-06-28T21-16-24-034Z.md +40 -0
- package/resources/data/deck/training/p/2023-06-28T21-16-34-972Z.md +16 -0
- package/resources/data/deck/training/p/2023-06-28T21-28-28-379Z.md +4 -0
- package/resources/data/deck/training/p/2023-06-29T23-15-10-411Z.md +5 -0
- package/resources/data/deck/training/p/2023-07-01T15-42-45-193Z.md +433 -0
- package/resources/data/deck/training/p/2023-07-01T21-54-31-329Z.md +6 -0
- package/resources/data/deck/training/p/2023-07-02T16-14-06-970Z.md +14 -0
- package/resources/data/deck/training/p/2023-07-31T00-26-03-842Z.md +4 -0
- package/resources/data/deck/training/p/2023-07-31T00-31-51-933Z.md +10 -0
- package/resources/data/deck/training/p/2023-07-31T00-37-21-927Z.md +205 -0
- package/resources/data/deck/training/p/2023-10-01T18-29-19-158Z.md +76 -0
- package/resources/data/deck/training/p/2023-10-07T19-18-28-517Z.md +102 -0
- package/resources/data/deck/training/p/2023-10-08T20-20-07-934Z.md +75 -0
- package/resources/data/deck/training/p/2023-10-08T20-20-37-336Z.md +29 -0
- package/resources/data/deck/training/p/2023-10-08T20-37-30-658Z.md +0 -0
- package/resources/data/deck/training/p/2023-10-08T21-58-25-809Z.md +68 -0
- package/resources/data/deck/training/p/2023-10-08T22-22-11-013Z.md +0 -0
- package/resources/data/deck/training/p/2023-10-14T19-25-08-153Z.md +119 -0
- package/resources/data/deck/training/t.json +1 -0
- package/resources/scss/src/apps/learnneo/Viewport.scss +0 -106
- package/resources/scss/src/apps/learnneo/home/ContentTreeList.scss +37 -0
- package/resources/scss/src/apps/learnneo/home/ContentView.scss +55 -0
- package/resources/scss/src/form/field/FileUpload.scss +4 -4
- package/resources/scss/src/form/field/TextArea.scss +1 -1
- package/resources/scss/theme-neo-light/Global.scss +46 -0
- package/resources/scss/theme-neo-light/design-tokens/Core.scss +7 -0
- package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +0 -0
- package/resources/scss/theme-neo-light/design-tokens/_all.scss +4 -0
- package/src/DefaultConfig.mjs +4 -4
- package/src/form/field/FileUpload.mjs +9 -2
- package/src/form/field/TextArea.mjs +19 -34
- package/src/main/DomAccess.mjs +34 -0
- package/test/components/files/form/field/Select.mjs +1 -1
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-07T19-18-28-517Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-07-934Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-37-336Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-37-30-658Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T21-58-25-809Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T22-22-11-013Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-14T19-25-08-153Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/pages/whyneo.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/tree.json +0 -0
- /package/resources/{deck → data/deck}/whyneo.md +0 -0
- /package/resources/scss/src/apps/newwebsite/{MainContainer.css → MainContainer.scss} +0 -0
- /package/resources/scss/theme-neo-light/design-tokens/{Components.scss → Component.scss} +0 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
#Introduction
|
2
|
+
|
3
|
+
In this lab you'll detect changes to city and category.
|
4
|
+
When city changes you'll geocode it to find its latitude and longitude.
|
5
|
+
|
6
|
+
#Steps
|
7
|
+
|
8
|
+
??Remove the view model listener in the main view
|
9
|
+
|
10
|
+
To avoid being overwhelmed with `console.log()` output, edit
|
11
|
+
the main view and remove the `listeners` config in the
|
12
|
+
view model config. From now on on the view model listening logic
|
13
|
+
will be set up in the main view controller.
|
14
|
+
|
15
|
+
??Detect view model property changes
|
16
|
+
|
17
|
+
In the main view controller override the `onComponentConstructed()` method. The method
|
18
|
+
should check for changes to _city_ and if so, call a new method `onCityChange(city)`.
|
19
|
+
|
20
|
+
onComponentConstructed() {
|
21
|
+
const model = this.getModel();
|
22
|
+
this.onCityChange(model.data.city);
|
23
|
+
model.on('dataPropertyChange', data => {
|
24
|
+
if (data.key === 'city') this.onCityChange(data.value);
|
25
|
+
});
|
26
|
+
}
|
27
|
+
onCityChange(city) {
|
28
|
+
if (!city) return;
|
29
|
+
// The code to geocode the city goes here.
|
30
|
+
console.log(city);
|
31
|
+
}
|
32
|
+
|
33
|
+
Save, change the city, and look for the console log in the debugger console.
|
34
|
+
|
35
|
+
??Geocode the city
|
36
|
+
|
37
|
+
Use the following call to `Neo.main.addon.GoogleMaps.geocode`. The details of the
|
38
|
+
call and the response aren't important right now, although if you're curious you
|
39
|
+
can read <a href="https://developers.google.com/maps/documentation/geocoding/requests-geocoding" target="_blank">the Google Maps geocoding API</a>.
|
40
|
+
|
41
|
+
<pre style='padding: 4px; font-size: 13.5pt; border: thin solid gray; color:lightgray'>
|
42
|
+
onCityChange(city) {
|
43
|
+
if (!city) return;
|
44
|
+
<span style='color:firebrick'>Neo.main.addon.GoogleMaps.geocode({ address: city })
|
45
|
+
.then(data => this.getModel().data.center = data.results[0].geometry.location);</span>
|
46
|
+
}
|
47
|
+
</pre>
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
??Stub out a method that will eventually be fetching Yelp data
|
52
|
+
|
53
|
+
Add this method.
|
54
|
+
|
55
|
+
doFetchYelpData() {
|
56
|
+
const model = this.getModel();
|
57
|
+
console.log('Fetch yelp data', model.data.center, model.data.category);
|
58
|
+
}
|
59
|
+
|
60
|
+
And modify `onComponentConstructed()` to check for changes to _center_ and _category_.
|
61
|
+
|
62
|
+
<pre style='padding: 4px; border: thin solid gray; color:lightgray'>
|
63
|
+
onComponentConstructed() {
|
64
|
+
const model = this.getModel();
|
65
|
+
this.onCityChange(model.getData('city'));
|
66
|
+
model.on('dataPropertyChange', data => {
|
67
|
+
if (data.key === 'city') this.onCityChange(data.value);
|
68
|
+
<span style='color:firebrick'>if (data.key === 'center') this.doFetchYelpData();
|
69
|
+
if (data.key === 'category') this.doFetchYelpData();</span>
|
70
|
+
});
|
71
|
+
}
|
72
|
+
</pre>
|
73
|
+
|
74
|
+
Save, refresh, and verify that `doFetchYelpData()` is logging changes to the map center
|
75
|
+
(via changes to city), and category.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Some components, such as `Neo.table.Container`, have a `store` config.
|
2
|
+
|
3
|
+
<pre style="padding: 8px; border: thin solid lightgray; font-size: 11pt; ">
|
4
|
+
{
|
5
|
+
module: EarthquakesTable,
|
6
|
+
listeners: {
|
7
|
+
select: 'onTableSelect'
|
8
|
+
},
|
9
|
+
store: {
|
10
|
+
module: Store,
|
11
|
+
model: {
|
12
|
+
fields: [{
|
13
|
+
name: 'humanReadableLocation'
|
14
|
+
}, {
|
15
|
+
name: 'size',
|
16
|
+
ntype: 'data-field-float',
|
17
|
+
}, {
|
18
|
+
name: 'timestamp',
|
19
|
+
type: 'Date'
|
20
|
+
}, {
|
21
|
+
name: 'title',
|
22
|
+
calculate: (data, field, item) => item.humanReadableLocation
|
23
|
+
}, {
|
24
|
+
name: 'position',
|
25
|
+
calculate: (data, field, item) => ({ lat: item.latitude, lng: item.longitude })
|
26
|
+
}]
|
27
|
+
},
|
28
|
+
url: 'https://apis.is/earthquake/is',
|
29
|
+
responseRoot: 'results',
|
30
|
+
autoLoad: true
|
31
|
+
}
|
32
|
+
}
|
33
|
+
</pre>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
<pre style="padding: 8px; border: thin solid lightgray; font-size: 13pt; ">
|
3
|
+
class MainViewModel extends Base {
|
4
|
+
static getConfig() {
|
5
|
+
return {
|
6
|
+
className: 'Earthquakes.view.MainViewModel',
|
7
|
+
data: {},
|
8
|
+
stores: {
|
9
|
+
earthquakes: {
|
10
|
+
module: Store,
|
11
|
+
model: {
|
12
|
+
...
|
13
|
+
},
|
14
|
+
...
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}</pre>
|
20
|
+
|
21
|
+
<pre style="padding: 8px; border: thin solid lightgray; font-size: 13pt; ">
|
22
|
+
{
|
23
|
+
module: EarthquakesTable,
|
24
|
+
bind: {
|
25
|
+
store: 'stores.earthquakes'
|
26
|
+
},
|
27
|
+
}
|
28
|
+
</pre>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
If the record's value isn't a simple conversion from the value in the feed
|
2
|
+
you can provide a `calculate` method. For example:
|
3
|
+
|
4
|
+
{
|
5
|
+
name: 'position',
|
6
|
+
calculate: (record, field, data) => ({ lat: data.latitude, lng: data.longitude })
|
7
|
+
}
|
8
|
+
|
9
|
+
- _record_ is the record instance
|
10
|
+
- _field_ is the field config
|
11
|
+
- _data_ is the value from the data feed
|
12
|
+
|
13
|
+
You can use `calculate` to convert a value from the feed, or to define a new record value.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
A recod config contains a `fields:[]` that describes the record's fields.
|
2
|
+
|
3
|
+
The field config can have these values:
|
4
|
+
|
5
|
+
| Config Property | Description |
|
6
|
+
|-----------------|--------------------------------------------------------------------|
|
7
|
+
|`name` | Required. The name of the feed value. |
|
8
|
+
|`type` | Date/html/string |
|
9
|
+
|`mapping` | The path to feed property. |
|
10
|
+
| | |
|
11
|
+
|`calculate` | A function used to calculate the value of the field. |
|
12
|
+
| | |
|
13
|
+
|`maxLength` | Limits values to the specific length. |
|
14
|
+
|`minLength` | Limits values to the specific length. |
|
15
|
+
|`nullable` | Flags whether the value can be null/undefined. |
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
<pre>
|
3
|
+
model: {
|
4
|
+
fields: [{
|
5
|
+
name: 'humanReadableLocation'
|
6
|
+
}, {
|
7
|
+
name: 'size',
|
8
|
+
<s>ntype: 'data-field-float'</s>, // Not supported yet
|
9
|
+
}, {
|
10
|
+
name: 'timestamp',
|
11
|
+
type: 'Date'
|
12
|
+
}, {
|
13
|
+
name: 'title',
|
14
|
+
mapping: 'humanReadableLocation'
|
15
|
+
}, {
|
16
|
+
name: 'position',
|
17
|
+
calculate: (rec, field, data) => ({lat: data.latitude, lng: data.longitude })
|
18
|
+
}]
|
19
|
+
},
|
20
|
+
</pre>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
In <a href="https://nameless-tundra-27404.herokuapp.com/go/?fn=yelp&latitude=43.084&longitude=-89.546&term=pizza&limit=1" target="_blank">the Yelp data feed</a> the array of values is nested in _businesses_.
|
2
|
+
|
3
|
+
The url has three query fields we'll change dynamically.
|
4
|
+
|
5
|
+
latitude=43.084&longitude=-89.546&term=pizza
|
6
|
+
<div class="expander" caption="Data">
|
7
|
+
<pre style='color:lightgray'>
|
8
|
+
{
|
9
|
+
"id": "nsw3tlB-hwz4KbPYcuaSww",
|
10
|
+
<span style="color:firebrick">"name": "Novanta"</span>,
|
11
|
+
<span style="color:firebrick">"image_url": "https://s3-media1.fl.yelpcdn.com/bphoto/2QtMzHr1ZNoflLzXKRza9A/o.jpg"</span>,
|
12
|
+
<span style="color:firebrick">"coordinates": {"latitude": 43.0753733442932,"longitude": -89.5296266588608}</span>,
|
13
|
+
<span style="color:firebrick">"rating": 4.5</span>,
|
14
|
+
"location": {
|
15
|
+
<span style="color:firebrick">"display_address": [ "8452 Old Sauk Rd", "Madison, WI 53562" ]</span>,
|
16
|
+
"address1": "8452 Old Sauk Rd",
|
17
|
+
"address2": "",
|
18
|
+
"address3": "",
|
19
|
+
"city": "Madison",
|
20
|
+
"zip_code": "53562",
|
21
|
+
"country": "US",
|
22
|
+
"state": "WI"
|
23
|
+
},
|
24
|
+
"is_closed": false,
|
25
|
+
"url": "https://www.yelp.com/biz/novanta-madison?adjust_creative=hAlq2S6c7S0nxZcdmjtkhA&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=hAlq2S6c7S0nxZcdmjtkhA",
|
26
|
+
"review_count": 329,
|
27
|
+
"categories": [
|
28
|
+
{"alias": "pizza", "title": "Pizza"},{"alias": "italian","title": "Italian"},
|
29
|
+
{"alias": "mediterranean","title": "Mediterranean"}
|
30
|
+
],
|
31
|
+
"transactions": ["pickup","delivery"],
|
32
|
+
"price": "$$",
|
33
|
+
"phone": "+16088317740",
|
34
|
+
"display_phone": "(608) 831-7740",
|
35
|
+
"distance": 1639.6643113166895,
|
36
|
+
"alias": "novanta-madison"
|
37
|
+
}
|
38
|
+
</pre>
|
39
|
+
</div>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
`responseRoot` specifies the value in the feed that holds the array of items
|
2
|
+
used to populate the store.
|
3
|
+
|
4
|
+
For example, the Yelp feed returns a single object which contains a _businesses_
|
5
|
+
property whose value is the array of businesses. Therefore, the store that reads
|
6
|
+
it should specify
|
7
|
+
|
8
|
+
`responseRoot: businesses`.
|
9
|
+
|
10
|
+
{
|
11
|
+
"businesses": [
|
12
|
+
{
|
13
|
+
"id": "nsw3tlB-hwz4KbPYcuaSww",
|
14
|
+
"alias": "novanta-madison",
|
15
|
+
"name": "Novanta",
|
16
|
+
"image_url": "https://s3-media1.fl.yelpcdn.com/bphoto/2QtMzHr1ZNoflLzXKRza9A/o.jpg",
|
17
|
+
"is_closed": false,
|
18
|
+
"url": "https://www.yelp.com/biz/novanta-madison?adjust_creative=hAlq2S6c7S0nxZcdmjtkhA&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_search&utm_source=hAlq2S6c7S0nxZcdmjtkhA",
|
19
|
+
"review_count": 329,
|
20
|
+
"categories": [
|
21
|
+
{
|
22
|
+
"alias": "pizza",
|
23
|
+
"title": "Pizza"
|
24
|
+
},
|
25
|
+
...
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Grids show a store's data as a table of rows and columns.
|
2
|
+
|
3
|
+
<pre style="font-size: 14pt;color:gray;">
|
4
|
+
items: [{
|
5
|
+
module: Table,
|
6
|
+
store: {
|
7
|
+
module: Store,
|
8
|
+
model: {
|
9
|
+
fields: [{ name: <span style="color:blue;">'name'</span> }, { name: <span style="color:blue;">'hp'</span> }, { name: <span style="color:blue;">'attack'</span> }, { name: <span style="color:blue;">'defense'</span> }]
|
10
|
+
},
|
11
|
+
data: [
|
12
|
+
{ <span style="color:blue;">"name"</span>: "Bulbasaur" , "pokedex": 1 , <span style="color:blue;">"hp"</span>: 45 , <span style="color:blue;">"defense"</span>: 49 , <span style="color:blue;">"attack"</span>: 49 , <span style="color:blue;">"speed"</span>: 45 },
|
13
|
+
{ <span style="color:blue;">"name"</span>: "Ivysaur" , "pokedex": 2 , <span style="color:blue;">"hp"</span>: 60 , <span style="color:blue;">"defense"</span>: 63 , <span style="color:blue;">"attack"</span>: 62 , <span style="color:blue;">"speed"</span>: 60 },
|
14
|
+
{ <span style="color:blue;">"name"</span>: "Venusaur" , "pokedex": 3 , <span style="color:blue;">"hp"</span>: 80 , <span style="color:blue;">"defense"</span>: 83 , <span style="color:blue;">"attack"</span>: 82 , <span style="color:blue;">"speed"</span>: 80 },
|
15
|
+
]
|
16
|
+
},
|
17
|
+
columns: [
|
18
|
+
{ dataField: <span style="color:blue;">'name'</span> , text: 'Name' },
|
19
|
+
{ dataField: <span style="color:blue;">'hp'</span> , text: 'HP' },
|
20
|
+
{ dataField: <span style="color:blue;">'attack'</span> , text: 'Attack' },
|
21
|
+
{ dataField: <span style="color:blue;">'defense'</span>, text: 'Defense' },
|
22
|
+
],
|
23
|
+
}]
|
24
|
+
</pre>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Neo implements Tables as a `Neo.table.header.Toolbar` followed by a `Neo.table.View`.
|
2
|
+
|
3
|
+
You don't reference these directly — they are created automatically using
|
4
|
+
the configs you provide for the table.
|
5
|
+
|
6
|
+
If needed, you can provide header configs via `headerToolbarConfig`
|
7
|
+
|
8
|
+
|
9
|
+
And you can provide view configuration via `viewConfig`.
|
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
By default, Neo simply shows the `dataField` value for the record, but you can provide
|
3
|
+
your own value by configuring a `renderer` function.
|
4
|
+
|
5
|
+
An object is passed to the function.
|
6
|
+
|
7
|
+
- dataField
|
8
|
+
- index
|
9
|
+
- record
|
10
|
+
- value — the `record[dataField]` value
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<pre style="font-size: 13pt; color: gray; ">
|
2
|
+
{
|
3
|
+
module: Table,
|
4
|
+
store: {
|
5
|
+
module: Store,
|
6
|
+
model: { fields: [{ name: 'timestamp', type: 'Date' }, { name: 'humanReadableLocation' }, { name: 'quality' }] },
|
7
|
+
data: [
|
8
|
+
{ "timestamp": "2017-10-13T12:07:24.000Z", "latitude": 63.976, "longitude": -21.949, "depth": 1.1, "size": 0.6, "quality": 58.73, "humanReadableLocation": "6,1 km SV af Helgafelli" },
|
9
|
+
{ "timestamp": "2017-10-13T09:50:50.000Z", "latitude": 65.124, "longitude": -16.288, "depth": 7.2, "size": 0.9, "quality": 78.51, "humanReadableLocation": "6,1 km NA af Herðubreiðartöglum" },
|
10
|
+
]
|
11
|
+
},
|
12
|
+
columns: [
|
13
|
+
{ dataField: 'humanReadableLocation', text: 'Location' },
|
14
|
+
{
|
15
|
+
dataField: 'timestamp',
|
16
|
+
text: 'Date',
|
17
|
+
<span style="font-weight: bold; color: #b91010">renderer: data => new Intl.DateTimeFormat('en-US', {
|
18
|
+
year: 'numeric', month: 'long', day: 'numeric', weekday: 'long',
|
19
|
+
hour: 'numeric', minute: 'numeric', second: 'numeric',
|
20
|
+
hour12: false,
|
21
|
+
timeZone: 'America/Los_Angeles'
|
22
|
+
}).format(data.value)</span>
|
23
|
+
},
|
24
|
+
{
|
25
|
+
dataField: 'quality',
|
26
|
+
text: 'quality',
|
27
|
+
<span style="font-weight: bold; color: #b91010">renderer: data => new Intl.NumberFormat('en-US', {
|
28
|
+
minimumFractionDigits: 3
|
29
|
+
}).format(data.value)</span>
|
30
|
+
},
|
31
|
+
]
|
32
|
+
}
|
33
|
+
</pre>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
You can use the _record_ reference to include other values from the record.
|
2
|
+
|
3
|
+
<pre style="font-size: 14pt; color: gray; ">
|
4
|
+
{
|
5
|
+
module: Table,
|
6
|
+
store: {
|
7
|
+
module: Store,
|
8
|
+
model: {
|
9
|
+
fields: [{ name: 'name' }, { name: 'hp' }, { name: 'attack' }, { name: 'defense' }, { name: 'pokedex' }]
|
10
|
+
},
|
11
|
+
data: [
|
12
|
+
{ "name": "Bulbasaur", "pokedex": 1, "hp": 45, "defense": 49, "attack": 49, "speed": 45 },
|
13
|
+
{ "name": "Ivysaur", "pokedex": 2, "hp": 60, "defense": 63, "attack": 62, "speed": 60 },
|
14
|
+
{ "name": "Venusaur", "pokedex": 3, "hp": 80, "defense": 83, "attack": 82, "speed": 80 },
|
15
|
+
]
|
16
|
+
},
|
17
|
+
columns: [
|
18
|
+
{ text: 'Name', <span style="font-weight: bold; color: #b91010">renderer: data => `${data.record.name} (${data.record.pokedex})`</span> }, // Ivysaur (2)
|
19
|
+
{ dataField: 'hp', text: 'HP' },
|
20
|
+
{ dataField: 'attack', text: 'Attack' },
|
21
|
+
{ dataField: 'defense', text: 'Defense' }
|
22
|
+
]
|
23
|
+
}
|
24
|
+
</pre>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<table>
|
2
|
+
<tr>
|
3
|
+
<td><ul>
|
4
|
+
<li>RowModel (default)
|
5
|
+
<li>CellModel
|
6
|
+
<li>ColumnModel
|
7
|
+
</ul></td>
|
8
|
+
<td><ul>
|
9
|
+
<li>CellRowModel
|
10
|
+
<li>CellColumnModel
|
11
|
+
<li>CellColumnRowModel
|
12
|
+
</ul></td>
|
13
|
+
<td>
|
14
|
+
</tr>
|
15
|
+
</table>
|
16
|
+
|
17
|
+
<pre style="font-size:13pt; color: gray">
|
18
|
+
{
|
19
|
+
module: Table,
|
20
|
+
store: {
|
21
|
+
module: Store,
|
22
|
+
model: {
|
23
|
+
fields: [{ name: 'name' }, { name: 'hp' }, { name: 'attack' }, { name: 'defense' }, { name: 'pokedex' }]
|
24
|
+
},
|
25
|
+
data: [
|
26
|
+
{ "name": "Bulbasaur", "pokedex": 1, "hp": 45, "defense": 49, "attack": 49, "speed": 45 },
|
27
|
+
{ "name": "Ivysaur", "pokedex": 2, "hp": 60, "defense": 63, "attack": 62, "speed": 60 },
|
28
|
+
]
|
29
|
+
},
|
30
|
+
<span style="font-weight: bold; color: #b91010">selectionModel: {
|
31
|
+
module: CellModel
|
32
|
+
},</span>
|
33
|
+
columns: [
|
34
|
+
{ text: 'Name', renderer: data => `${data.record.name} (${data.record.pokedex})` },
|
35
|
+
{ dataField: 'hp', text: 'HP' },
|
36
|
+
{ dataField: 'attack', text: 'Attack' },
|
37
|
+
{ dataField: 'defense', text: 'Defense' }
|
38
|
+
],
|
39
|
+
}
|
40
|
+
</pre>
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
The selection model has an `items[]` property that holds the
|
2
|
+
_row id_ for each record.
|
3
|
+
|
4
|
+
Call the table's view `getRecordByRowId()` method to get the corresponding record.
|
5
|
+
|
6
|
+
onSelectedItemsClick(data) {
|
7
|
+
const table = this.getReference('table');
|
8
|
+
const view = table.getView();
|
9
|
+
const records = table.selectionModel.items
|
10
|
+
.map(rowId => view.getRecordByRowId(rowId));
|
11
|
+
console.log(records);
|
12
|
+
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
A `Neo.form.Container` is a simple container that can hold any
|
2
|
+
component, including fields
|
3
|
+
|
4
|
+
Fields are input components, such as text fields, checkboxes, and select fields.
|
5
|
+
|
6
|
+
A form has convenience methods for setting and getting field values, and testing validation.
|
7
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<div class="expander" caption="config">
|
2
|
+
<p>
|
3
|
+
<kbd>name </kbd><br>
|
4
|
+
<kbd>value\_ </kbd><br>
|
5
|
+
<br>
|
6
|
+
<kbd>labelText\_ </kbd><br>
|
7
|
+
<kbd>subLabelText\_ </kbd><br>
|
8
|
+
<kbd>labelPosition\_ </kbd><br>
|
9
|
+
<kbd>placeholderText\_ </kbd><br>
|
10
|
+
<br>
|
11
|
+
<kbd>clearable\_ </kbd><br>
|
12
|
+
<br>
|
13
|
+
<kbd>maxLength\_ </kbd><br>
|
14
|
+
<kbd>minLength\_ </kbd><br>
|
15
|
+
<br>
|
16
|
+
<kbd>readOnly\_ </kbd><br>
|
17
|
+
<kbd>required\_ </kbd><br>
|
18
|
+
<br>
|
19
|
+
<kbd>inputPattern\_ </kbd>— A regular expression that limits keyboard input<br>
|
20
|
+
<kbd>validator </kbd><br>
|
21
|
+
</p>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
|
25
|
+
<div class="expander" caption="Methods">
|
26
|
+
<p>
|
27
|
+
<kbd>clearToOriginalValue()</kbd><br>
|
28
|
+
<kbd>isEmpty() </kbd><br>
|
29
|
+
<kbd>isValid() </kbd><br>
|
30
|
+
<kbd>validate() </kbd><br>
|
31
|
+
|
32
|
+
</p>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div class="expander" caption="Events">
|
36
|
+
<p>
|
37
|
+
<i>change</i><br>
|
38
|
+
<i>clear</i><br>
|
39
|
+
<i>changeClearToOriginalValue</i><br>
|
40
|
+
|
41
|
+
</p>
|
42
|
+
</div>
|
43
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
The `Clear` and `CopyToClipboard` triggers might be used directly,
|
2
|
+
but the others are used via the corresponding pre-configured
|
3
|
+
component.<small><sup>*</sup></small>
|
4
|
+
|
5
|
+
`Neo.form.field.trigger.*`
|
6
|
+
|
7
|
+
|
8
|
+
- `Clear`
|
9
|
+
- `CopyToClipboard`
|
10
|
+
|
11
|
+
|
12
|
+
- `Date`
|
13
|
+
- `Search`
|
14
|
+
- `SpinDown`
|
15
|
+
- `SpinUp`
|
16
|
+
- `Time`
|
17
|
+
|
18
|
+
|
19
|
+
<br><br>
|
20
|
+
<small>* Many triggers require setting up trigger click event handlers.</small>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Most validation configs have a corresponding message
|
2
|
+
which is used when the validation fails.
|
3
|
+
|
4
|
+
|
5
|
+
| Validation Config | Validation Error |
|
6
|
+
| ------------------- | -------------------------- |
|
7
|
+
| `maxLength` | `errorTextMaxLength`<small><sup>*</sup></small>|
|
8
|
+
| `minLength` | `errorTextMinLength` |
|
9
|
+
| `required` | `errorTextRequired` |
|
10
|
+
| `validator` | |
|
11
|
+
|
12
|
+
<br>
|
13
|
+
<br>
|
14
|
+
<small>* Text is limited to the max length.</small>
|
@@ -0,0 +1 @@
|
|
1
|
+
<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="1000" height="600" src="https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2F2Xzb3mL9nwSprFN3lMweja%2FNeo.form.field-Hierarchy%3Fnode-id%3D0%253A1%26t%3DxfeBL4RWaRZGyAic-1%2Fhide-ui" allowfullscreen></iframe>
|
@@ -0,0 +1 @@
|
|
1
|
+
<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="1000" height="600" src="https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2FVz2o2oFk8mFdwJ7nQIzmK0%2FNeo.form.field.Picker%3Fnode-id%3D0%253A1%26t%3DlAG8QtmPJatN3LP2-1" allowfullscreen></iframe>
|
@@ -0,0 +1 @@
|
|
1
|
+
<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="1000" height="600" src="https://www.figma.com/embed?embed_host=share&url=https%3A%2F%2Fwww.figma.com%2Ffile%2FW4rsTDe84bUaVe9Fa8HuRV%2FNeo.form.field.*%3Fnode-id%3D0%253A1%26t%3D7Y1XOS0oVKMWmYnI-1" allowfullscreen></iframe>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{
|
2
|
+
module: TextField,
|
3
|
+
labelText: 'First Name',
|
4
|
+
name: 'fname',
|
5
|
+
},
|
6
|
+
|
7
|
+
|
8
|
+
Text fields let the user type input.
|
9
|
+
|
10
|
+
The `Neo.form.field.Text` class is an important base class. There
|
11
|
+
are many kinds of field, including search fields, passwords fields,
|
12
|
+
and many others.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Use the _validator_ config function for non-trivial validation.
|
2
|
+
|
3
|
+
The function receives a reference to the field.
|
4
|
+
Return `true` for a valid field, or an error string for an invalid field.
|
5
|
+
|
6
|
+
|
7
|
+
The function can be in-line, or a string which names a controller method.
|
8
|
+
|
9
|
+
{
|
10
|
+
module: Text,
|
11
|
+
labelText: 'Name',
|
12
|
+
validator: field => field.value.match(/^\w+$/)?true:'Special characters are not allowed',
|
13
|
+
},
|
14
|
+
|
15
|
+
|
16
|
+
{
|
17
|
+
module: Text,
|
18
|
+
labelText: 'Name',
|
19
|
+
validator: 'nameValidator'
|
20
|
+
},
|
@@ -0,0 +1,16 @@
|
|
1
|
+
- `Neo.form.field.Date`
|
2
|
+
- `Neo.form.field.Time`
|
3
|
+
- `Neo.form.field.Select`
|
4
|
+
- `Neo.form.field.Chip`
|
5
|
+
- `Neo.form.field.Color`
|
6
|
+
|
7
|
+
A picker is a base class that introduces a `tigger:[]` config.
|
8
|
+
|
9
|
+
A trigger is a widget docked on the right of a field. A text
|
10
|
+
field can configure any set of triggers that are needed.
|
11
|
+
(A _clearable_ text field is just a text field with a `Clear` trigger
|
12
|
+
dynamically added.)
|
13
|
+
|
14
|
+
Picker sub-classes are components that are pre-configured to use
|
15
|
+
one of the `Neo.form.field.trigger.*` triggers.
|
16
|
+
|