From b9f2f3ddd3133f5eca9a33f197b2612d2eb767bc Mon Sep 17 00:00:00 2001 From: Yannick Schaus Date: Thu, 5 Mar 2020 18:59:42 +0100 Subject: [PATCH] New page types: tabs, maps; misc. fixes (#198) Upgrade to Framework7 5.4.5 Add leaflet/vue2-leaflet dependencies Widgets & pages: - Add OhTabsPage, OhMapPage, OhTab, OhMapMarker, OhMapCircleMarker - Add support for tabbed pages in modals - Add theme, themeOptions, device, JSON to expression evaluation context Page designers: - Add rudimentary designers for tabs, map pages (to refactor) - Import designer components dynamically (split into individual webpack chunks) - Fix masonry menus z-index issues in editor (hopefully) Config parameters: - Add map picker for location contexts Code editor: - Add indent guides Signed-off-by: Yannick Schaus --- bundles/org.openhab.ui/web/package-lock.json | 22 +- bundles/org.openhab.ui/web/package.json | 6 +- .../org.openhab.ui/web/src/components/app.vue | 16 +- .../config/controls/parameter-location.vue | 83 ++- .../config/controls/script-editor.vue | 47 ++ .../components/widgets/layout/oh-masonry.vue | 19 +- .../widgets/layout/oh-placeholder-widget.vue | 2 + .../widgets/map/oh-map-circle-marker.vue | 116 +++++ .../components/widgets/map/oh-map-marker.vue | 104 ++++ .../components/widgets/map/oh-map-page.vue | 95 ++++ .../components/widgets/modals/oh-popover.vue | 20 +- .../components/widgets/modals/oh-popup.vue | 59 ++- .../components/widgets/modals/oh-sheet.vue | 22 +- .../src/components/widgets/widget-mixin.js | 6 +- bundles/org.openhab.ui/web/src/js/routes.js | 49 +- .../web/src/pages/page/layout-page.vue | 79 --- .../web/src/pages/page/page-view.vue | 117 +++++ .../page/{sitemap.vue => sitemap-view.vue} | 0 .../settings/pages/layout/layout-edit.vue | 11 +- .../src/pages/settings/pages/map/map-edit.vue | 477 ++++++++++++++++++ .../src/pages/settings/pages/pages-list.vue | 16 +- .../src/pages/settings/pages/tabs/oh-tab.js | 40 ++ .../pages/settings/pages/tabs/tabs-edit.vue | 456 +++++++++++++++++ 23 files changed, 1710 insertions(+), 152 deletions(-) create mode 100644 bundles/org.openhab.ui/web/src/components/widgets/map/oh-map-circle-marker.vue create mode 100644 bundles/org.openhab.ui/web/src/components/widgets/map/oh-map-marker.vue create mode 100644 bundles/org.openhab.ui/web/src/components/widgets/map/oh-map-page.vue delete mode 100644 bundles/org.openhab.ui/web/src/pages/page/layout-page.vue create mode 100644 bundles/org.openhab.ui/web/src/pages/page/page-view.vue rename bundles/org.openhab.ui/web/src/pages/page/{sitemap.vue => sitemap-view.vue} (100%) create mode 100644 bundles/org.openhab.ui/web/src/pages/settings/pages/map/map-edit.vue create mode 100644 bundles/org.openhab.ui/web/src/pages/settings/pages/tabs/oh-tab.js create mode 100644 bundles/org.openhab.ui/web/src/pages/settings/pages/tabs/tabs-edit.vue diff --git a/bundles/org.openhab.ui/web/package-lock.json b/bundles/org.openhab.ui/web/package-lock.json index 84eb6ace1..aafa89129 100644 --- a/bundles/org.openhab.ui/web/package-lock.json +++ b/bundles/org.openhab.ui/web/package-lock.json @@ -7800,9 +7800,9 @@ } }, "framework7": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/framework7/-/framework7-5.3.2.tgz", - "integrity": "sha512-pqsc0vVDwGOdZ7mFIPXX07tHzdtbAqEcfnw0rtURFdZuOxq9Aic65FGH1aIr2t/tTFebxkQ0XTVK0DKCVMmwBA==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/framework7/-/framework7-5.4.5.tgz", + "integrity": "sha512-PkrEJAjK6bX1R43en81hGmzUiaRGgrY+W+eM4VArcEDXTwUR+goSelGZjYA4mxTLSjJVT9WIosf0VxoWkZYf8w==", "requires": { "dom7": "2.1.3", "path-to-regexp": "6.1.0", @@ -7816,9 +7816,9 @@ "integrity": "sha512-+mB8XhEAaIjjfRNlqW2tk7kYfPrQvDmDVpRFUjeUOiPDqqOybYmC9McvVPwwmqmob4nD3iZFWfs+rAMkVs5vPQ==" }, "framework7-vue": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/framework7-vue/-/framework7-vue-5.3.2.tgz", - "integrity": "sha512-9znW9aChVIzKS0X7T607qMUT0D8OiQc8AVQXx4Qmx/MyrNqBsDISav37aT7dKQ+WyN14VTkq8bcSWoQWkA8DXA==" + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/framework7-vue/-/framework7-vue-5.4.5.tgz", + "integrity": "sha512-QzdSXO4srot2pCLUAdJewdq5KTUE/b7BI3zE8WLfPEroyNlFMitBc83KkJ/h35FwgmAzaNDm3eGXrwTx/OWoyQ==" }, "fresh": { "version": "0.5.2", @@ -10424,6 +10424,11 @@ "invert-kv": "2.0.0" } }, + "leaflet": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.6.0.tgz", + "integrity": "sha512-CPkhyqWUKZKFJ6K8umN5/D2wrJ2+/8UIpXppY7QDnUZW5bZL5+SEI2J7GBpwh4LIupOKqbNSQXgqmrEJopHVNQ==" + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -16645,6 +16650,11 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "vue2-leaflet": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/vue2-leaflet/-/vue2-leaflet-2.5.2.tgz", + "integrity": "sha512-9eN0TxqCkyXbaI7waO3u+n0OAezkxjb811tstG6gRLAZy/ocXlNLC3JqTWE0FwBUlqBbMpyzsIk6LrEhs8oVBQ==" + }, "vuex": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.2.tgz", diff --git a/bundles/org.openhab.ui/web/package.json b/bundles/org.openhab.ui/web/package.json index a9ca4dca8..6507b9ddc 100644 --- a/bundles/org.openhab.ui/web/package.json +++ b/bundles/org.openhab.ui/web/package.json @@ -60,10 +60,11 @@ "dom7": "^2.1.3", "echarts": "^4.6.0", "expression-eval": "^2.1.0", - "framework7": "^5.3.2", + "framework7": "^5.4.5", "framework7-icons": "^3.0.0", - "framework7-vue": "^5.3.2", + "framework7-vue": "^5.4.5", "later-again": "^0.1.1", + "leaflet": "^1.6.0", "moo": "^0.5.1", "nearley": "^2.19.1", "template7": "^1.4.2", @@ -73,6 +74,7 @@ "vue-codemirror": "^4.0.6", "vue-echarts": "^4.1.0", "vue-magic-grid": "0.0.4", + "vue2-leaflet": "^2.5.2", "vuex": "^3.1.2", "yaml": "^1.7.2" }, diff --git a/bundles/org.openhab.ui/web/src/components/app.vue b/bundles/org.openhab.ui/web/src/components/app.vue index f05a9842b..4596f4a78 100644 --- a/bundles/org.openhab.ui/web/src/components/app.vue +++ b/bundles/org.openhab.ui/web/src/components/app.vue @@ -22,7 +22,7 @@ :class="{ currentsection: currentUrl.indexOf('/page/' + page.uid) >= 0 }" :link="'/page/' + page.uid" :title="page.config.label" view=".view-main" panel-close> - + Administration @@ -285,6 +285,20 @@ export default { }) }) }, + pageIcon (page) { + switch (page.component) { + case 'Sitemap': + return 'menu' + case 'oh-layout-page': + return 'rectangle_grid_2x2' + case 'oh-tabs-page': + return 'squares_below_rectangle' + case 'oh-map-page': + return 'map' + default: + return 'tv' + } + }, login () { localStorage.setItem('openhab.ui:serverUrl', this.serverUrl) localStorage.setItem('openhab.ui:username', this.username) diff --git a/bundles/org.openhab.ui/web/src/components/config/controls/parameter-location.vue b/bundles/org.openhab.ui/web/src/components/config/controls/parameter-location.vue index 39770c580..6e31f7ca8 100644 --- a/bundles/org.openhab.ui/web/src/components/config/controls/parameter-location.vue +++ b/bundles/org.openhab.ui/web/src/components/config/controls/parameter-location.vue @@ -10,29 +10,100 @@ @input="updateValue" type="text">
- Map + Map
+ + + + + + + {{configDescription.label}} + + Done + + + + + + + + + + + + + @@ -58,16 +63,18 @@ export default { .magic-grid-item width calc(100% - 2 * var(--oh-grid-gap)) -.oh-columns-grid +.oh-masonry column-count 6 column-width 300px column-gap 0 margin-left auto margin-right auto min-height 300px - .oh-column-item + .oh-masonry-item width 100% display inline-block + .list + z-index inherit &.placeholder width calc(100% - 16px) diff --git a/bundles/org.openhab.ui/web/src/components/widgets/layout/oh-placeholder-widget.vue b/bundles/org.openhab.ui/web/src/components/widgets/layout/oh-placeholder-widget.vue index 97e39cde2..f394409b9 100644 --- a/bundles/org.openhab.ui/web/src/components/widgets/layout/oh-placeholder-widget.vue +++ b/bundles/org.openhab.ui/web/src/components/widgets/layout/oh-placeholder-widget.vue @@ -8,6 +8,8 @@ + + diff --git a/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popover.vue b/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popover.vue index 3d67fbb42..07aaf45b7 100644 --- a/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popover.vue +++ b/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popover.vue @@ -1,9 +1,6 @@ @@ -41,6 +38,21 @@ export default { }, ready () { return this.page || this.widget + }, + componentType () { + if (this.page) { + switch (this.page.component) { + case 'oh-layout-page': + return OhLayoutPage + case 'oh-map-page': + return () => import('@/components/widgets/map/oh-map-page.vue') + default: + return null + } + } else if (this.widget) { + return 'generic-widget-component' + } + return null } } } diff --git a/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popup.vue b/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popup.vue index aab63cf54..42856dedc 100644 --- a/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popup.vue +++ b/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-popup.vue @@ -4,10 +4,16 @@ - - + + + + + + + + + + @@ -23,11 +29,13 @@ import OhLayoutPage from '@/components/widgets/layout/oh-layout-page.vue' export default { components: { - OhLayoutPage + OhLayoutPage, + 'oh-map-page': () => import('@/components/widgets/map/oh-map-page.vue') }, props: ['uid', 'modalParams'], data () { return { + currentTab: 0 } }, computed: { @@ -46,6 +54,47 @@ export default { }, ready () { return this.page || this.widget + }, + componentType () { + if (this.page) { + switch (this.page.component) { + case 'oh-layout-page': + return OhLayoutPage + case 'oh-map-page': + return 'oh-map-page' + default: + return null + } + } else if (this.widget) { + return 'generic-widget-component' + } + return null + } + }, + methods: { + tabContext (tab) { + const page = this.$store.getters.page(tab.config.page.replace('page:', '')) + return { + component: page, + tab: tab, + props: tab.config.pageConfig, + store: this.$store.getters.trackedItems + } + }, + pageComponent (page) { + if (!page) return null + switch (page.component) { + case 'oh-layout-page': + return OhLayoutPage + case 'oh-map-page': + return 'oh-map-page' + default: + return null + } + }, + tabComponent (tab) { + const page = this.$store.getters.page(tab.config.page.replace('page:', '')) + return this.pageComponent(page) } } } diff --git a/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-sheet.vue b/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-sheet.vue index 104238191..111b63d15 100644 --- a/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-sheet.vue +++ b/bundles/org.openhab.ui/web/src/components/widgets/modals/oh-sheet.vue @@ -5,12 +5,7 @@
Close
- - - - + @@ -47,6 +42,21 @@ export default { }, ready () { return this.page || this.widget + }, + componentType () { + if (this.page) { + switch (this.page.component) { + case 'oh-layout-page': + return OhLayoutPage + case 'oh-map-page': + return () => import('@/components/widgets/map/oh-map-page.vue') + default: + return null + } + } else if (this.widget) { + return 'generic-widget-component' + } + return null } } } diff --git a/bundles/org.openhab.ui/web/src/components/widgets/widget-mixin.js b/bundles/org.openhab.ui/web/src/components/widgets/widget-mixin.js index c75bc6944..cae868db8 100644 --- a/bundles/org.openhab.ui/web/src/components/widgets/widget-mixin.js +++ b/bundles/org.openhab.ui/web/src/components/widgets/widget-mixin.js @@ -36,7 +36,11 @@ export default { evalConfig[key] = expr.eval(this.exprAst[key], { items: this.context.store, props: this.context.props, - Math: Math + Math: Math, + theme: this.$theme, + themeOptions: this.$f7.data.themeOptions, + device: this.$device, + JSON: JSON }) } catch (e) { evalConfig[key] = e diff --git a/bundles/org.openhab.ui/web/src/js/routes.js b/bundles/org.openhab.ui/web/src/js/routes.js index 9c0d395d6..8d78a38c4 100644 --- a/bundles/org.openhab.ui/web/src/js/routes.js +++ b/bundles/org.openhab.ui/web/src/js/routes.js @@ -2,8 +2,8 @@ import HomePage from '../pages/home.vue' import AboutPage from '../pages/about.vue' import NotFoundPage from '../pages/not-found.vue' -import SitemapPage from '../pages/page/sitemap.vue' -import LayoutPage from '../pages/page/layout-page.vue' +import SitemapViewPage from '../pages/page/sitemap-view.vue' +import PageViewPage from '../pages/page/page-view.vue' import SetupWizard from '../pages/wizards/setup-wizard.vue' import SetupWizardPage from '../pages/wizards/setup-wizard-page.vue' @@ -33,8 +33,6 @@ import RuleEditPage from '../pages/settings/rules/rule-edit.vue' import RuleConfigureModulePage from '../pages/settings/rules/rule-configure-module.vue' import PagesListPage from '../pages/settings/pages/pages-list.vue' -import SitemapEditPage from '../pages/settings/pages/sitemap/sitemap-edit.vue' -import LayoutEditPage from '../pages/settings/pages/layout/layout-edit.vue' // import SchedulePage from '../pages/settings/schedule/schedule.vue' @@ -62,11 +60,11 @@ export default [ }, { path: '/page/:uid', - component: LayoutPage + component: PageViewPage }, { path: '/sitemap/:sitemapId/:pageId', - component: SitemapPage + component: SitemapViewPage }, { path: '/about/', @@ -121,30 +119,23 @@ export default [ component: PagesListPage, routes: [ { - path: 'sitemap/add', - component: SitemapEditPage, - options: { - props: { - createMode: true - } + path: ':type/:uid', + async (routeTo, routeFrom, resolve, reject) { + // dynamic import component; returns promise + const editorComponent = () => import(`../pages/settings/pages/${routeTo.params.type}/${routeTo.params.type}-edit.vue`) + // resolve promise + editorComponent().then((vc) => { + // resolve with component + resolve({ + component: vc.default + }, + (routeTo.params.uid === 'add') ? { + props: { + createMode: true + } + } : {}) + }) } - }, - { - path: 'sitemap/:uid', - component: SitemapEditPage - }, - { - path: 'layout/add', - component: LayoutEditPage, - options: { - props: { - createMode: true - } - } - }, - { - path: 'layout/:uid', - component: LayoutEditPage } ] }, diff --git a/bundles/org.openhab.ui/web/src/pages/page/layout-page.vue b/bundles/org.openhab.ui/web/src/pages/page/layout-page.vue deleted file mode 100644 index 2ca575b2e..000000000 --- a/bundles/org.openhab.ui/web/src/pages/page/layout-page.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/bundles/org.openhab.ui/web/src/pages/page/page-view.vue b/bundles/org.openhab.ui/web/src/pages/page/page-view.vue new file mode 100644 index 000000000..8b7eaae02 --- /dev/null +++ b/bundles/org.openhab.ui/web/src/pages/page/page-view.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/bundles/org.openhab.ui/web/src/pages/page/sitemap.vue b/bundles/org.openhab.ui/web/src/pages/page/sitemap-view.vue similarity index 100% rename from bundles/org.openhab.ui/web/src/pages/page/sitemap.vue rename to bundles/org.openhab.ui/web/src/pages/page/sitemap-view.vue diff --git a/bundles/org.openhab.ui/web/src/pages/settings/pages/layout/layout-edit.vue b/bundles/org.openhab.ui/web/src/pages/settings/pages/layout/layout-edit.vue index 57cc84153..5cf44f872 100644 --- a/bundles/org.openhab.ui/web/src/pages/settings/pages/layout/layout-edit.vue +++ b/bundles/org.openhab.ui/web/src/pages/settings/pages/layout/layout-edit.vue @@ -1,5 +1,5 @@