Display layout page as overview (#235)
Move the UI tiles back to the right panel, and display a placeholder in the home page's overview tab until a layout page with an ID of "overview" has been created. This is (normally?) temporary until a specially-designed overview page has been implemented - discussion on https://github.com/openhab/openhab-webui/issues/155). Various styling fixes & clean up. Move the onboarding cards to separate component (not used for now). Don't display the Back button in a page view if it's shown on the sidebar. Layout pages: switch the "add widget" action sheet from grid to simple list with groups, headers and cancel button. Signed-off-by: Yannick Schaus <github@schaus.net>pull/243/head
parent
8a41670ca4
commit
6d12fe94fe
|
@ -1,4 +1,7 @@
|
||||||
{
|
{
|
||||||
|
"overview.title": "Welcome to openHAB!",
|
||||||
|
"overview.text": "Once your system is configured, create a layout page with the ID <code>\"overview\"</code> to display it here.",
|
||||||
|
|
||||||
"inbox.title": "The Inbox is empty",
|
"inbox.title": "The Inbox is empty",
|
||||||
"inbox.text": "Discovery results from your bindings that can be added as things will appear here.<br><br>You can also start a scan for a certain binding or add things manually with the button below.",
|
"inbox.text": "Discovery results from your bindings that can be added as things will appear here.<br><br>You can also start a scan for a certain binding or add things manually with the button below.",
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
<f7-list-item link="/" class="logo" panel-close v-else>
|
<f7-list-item link="/" class="logo" panel-close v-else>
|
||||||
<img src="../res/img/openhab-logo.png" width="100%">
|
<img src="../res/img/openhab-logo.png" width="100%">
|
||||||
</f7-list-item>
|
</f7-list-item>
|
||||||
<!-- <f7-block-title>Sitemaps</f7-block-title> -->
|
|
||||||
<f7-list>
|
<f7-list>
|
||||||
<!-- <f7-list-item v-for="sitemap in sitemaps" :animate="false" :key="sitemap.name"
|
<!-- <f7-list-item v-for="sitemap in sitemaps" :animate="false" :key="sitemap.name"
|
||||||
:class="{ currentsection: currentUrl.indexOf('/sitemap/' + sitemap.name) >= 0 }"
|
:class="{ currentsection: currentUrl.indexOf('/sitemap/' + sitemap.name) >= 0 }"
|
||||||
|
@ -79,24 +78,18 @@
|
||||||
:class="{ currentsection: currentUrl.indexOf('/about') >= 0 }">
|
:class="{ currentsection: currentUrl.indexOf('/about') >= 0 }">
|
||||||
<f7-icon slot="media" ios="f7:question_circle_fill" aurora="f7:question_circle_fill" md="material:help" color="gray"></f7-icon>
|
<f7-icon slot="media" ios="f7:question_circle_fill" aurora="f7:question_circle_fill" md="material:help" color="gray"></f7-icon>
|
||||||
</f7-list-item>
|
</f7-list-item>
|
||||||
<!-- <f7-list-item v-if="loggedIn" link="/" title="Logout" @click="logout()" panel-close>
|
|
||||||
<f7-icon slot="media" ios="f7:square_arrow_right" md="material:exit_to_app" color="gray"></f7-icon>
|
|
||||||
</f7-list-item> -->
|
|
||||||
<!-- <f7-list-item title="Master-Details" view=".view-main" panel-close>
|
|
||||||
<f7-icon slot="media" ios="f7:exit" md="material:exit_to_app"></f7-icon>
|
|
||||||
</f7-list-item> -->
|
|
||||||
</f7-list>
|
</f7-list>
|
||||||
|
|
||||||
<div class="account" v-if="ready">
|
<div class="account" v-if="ready">
|
||||||
<div class="display-flex justify-content-center">
|
<div class="display-flex justify-content-center">
|
||||||
<f7-button v-if="!loggedIn" large color="gray" icon-size="36" tooltip="Unlock Administration" icon-f7="lock_shield_fill" @click="authorize()" />
|
<f7-button v-if="!loggedIn" large color="gray" icon-size="36" tooltip="Unlock Administration" icon-f7="lock_shield_fill" @click="authorize()" />
|
||||||
</div>
|
</div>
|
||||||
<f7-list v-if="$store.getters.user" class="admin-links" media-list>
|
<f7-list v-if="$store.getters.user" media-list>
|
||||||
<f7-list-item :title="$store.getters.user.name" :footer="serverDisplayUrl" io="f7:person_alt_circle_fill" link="/profile/" no-chevron panel-close view=".view-main"
|
<f7-list-item :title="$store.getters.user.name" :footer="serverDisplayUrl" io="f7:person_alt_circle_fill" link="/profile/" no-chevron panel-close view=".view-main"
|
||||||
:class="{ currentsection: currentUrl.indexOf('/profile') >= 0 }">
|
:class="{ currentsection: currentUrl.indexOf('/profile') >= 0 }">
|
||||||
<f7-icon slot="media" size="36" ios="f7:person_alt_circle_fill" aurora="f7:person_alt_circle_fill" md="f7:person_alt_circle_fill" color="gray"></f7-icon>
|
<f7-icon slot="media" size="36" ios="f7:person_alt_circle_fill" aurora="f7:person_alt_circle_fill" md="f7:person_alt_circle_fill" color="gray"></f7-icon>
|
||||||
</f7-list-item>
|
</f7-list-item>
|
||||||
</f7-list>
|
</f7-list>
|
||||||
<!-- <f7-link v-if="user" color="gray" icon-size="30" :text="accountLabel" tooltip="Sign out" icon-f7="person_alt_circle_fill" @click="logout()" /> -->
|
|
||||||
</div>
|
</div>
|
||||||
</f7-page>
|
</f7-page>
|
||||||
</f7-panel>
|
</f7-panel>
|
||||||
|
@ -108,7 +101,7 @@
|
||||||
</f7-panel>
|
</f7-panel>
|
||||||
|
|
||||||
<!-- Your main view, should have "view-main" class -->
|
<!-- Your main view, should have "view-main" class -->
|
||||||
<f7-view main class="safe-areas" url="/" :master-detail-breakpoint="960" @routeChanged="console.log('hello')"></f7-view>
|
<f7-view main v-show="ready" class="safe-areas" url="/" :master-detail-breakpoint="960" @routeChanged="console.log('hello')"></f7-view>
|
||||||
|
|
||||||
<f7-login-screen id="my-login-screen" :opened="loginScreenOpened">
|
<f7-login-screen id="my-login-screen" :opened="loginScreenOpened">
|
||||||
<f7-view name="login" v-if="$device.cordova">
|
<f7-view name="login" v-if="$device.cordova">
|
||||||
|
@ -155,13 +148,12 @@
|
||||||
height 0
|
height 0
|
||||||
|
|
||||||
.panel-left
|
.panel-left
|
||||||
overflow-y scroll
|
|
||||||
scrollbar-width none /* Firefox */
|
scrollbar-width none /* Firefox */
|
||||||
-ms-overflow-style none /* IE 10+ */
|
-ms-overflow-style none /* IE 10+ */
|
||||||
|
|
||||||
.page
|
.page
|
||||||
background #f5f5f5 !important
|
background #f5f5f5 !important
|
||||||
padding-bottom 4rem
|
padding-bottom calc(var(--f7-tabbar-labels-height) + var(--f7-safe-area-bottom))
|
||||||
.logo
|
.logo
|
||||||
margin-top var(--f7-safe-area-top)
|
margin-top var(--f7-safe-area-top)
|
||||||
list-style none
|
list-style none
|
||||||
|
@ -178,11 +170,18 @@
|
||||||
color var(--f7-color-white) !important
|
color var(--f7-color-white) !important
|
||||||
.account
|
.account
|
||||||
z-index 300
|
z-index 300
|
||||||
height 4rem
|
height calc(var(--f7-tabbar-labels-height) + var(--f7-safe-area-bottom))
|
||||||
background #f5f5f5 !important
|
background #f5f5f5 !important
|
||||||
position fixed
|
position fixed
|
||||||
bottom calc(var(--f7-safe-area-bottom))
|
bottom calc(var(--f7-safe-area-bottom))
|
||||||
width 100%
|
width 100%
|
||||||
|
.list
|
||||||
|
position absolute
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
margin-bottom 0
|
||||||
|
height calc(var(--f7-tabbar-labels-height) + var(--f7-safe-area-bottom))
|
||||||
|
|
||||||
.theme-dark
|
.theme-dark
|
||||||
.panel-left
|
.panel-left
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<f7-card
|
||||||
|
v-show="showSetup"
|
||||||
|
title="Welcome to openHAB!"
|
||||||
|
content="Congratulations, your server is up and running! However, it is not configured yet. Follow the setup wizard and let it guide you through the initial configuration. (Note: the wizard could also be started automatically on launch if no package is detected - services/org.openhab.addons > package)."
|
||||||
|
>
|
||||||
|
<f7-card-footer>
|
||||||
|
<f7-link color="blue" @click="skipSetupWizard()">No thanks</f7-link>
|
||||||
|
<!-- <f7-button color="blue" fill raised login-screen-open="#login-screen">Start Setup Wizard</f7-button> -->
|
||||||
|
<f7-button color="blue" fill raised href="/setup-wizard/">Start Setup Wizard</f7-button>
|
||||||
|
</f7-card-footer>
|
||||||
|
</f7-card>
|
||||||
|
<f7-card title="Suggested Tasks" v-show="showTasks">
|
||||||
|
<f7-card-content :padding="false">
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<f7-link no-link-class color="blue" href="#">Install Bindings & other add-ons</f7-link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<f7-link no-link-class color="blue" href="#">Discover & configure Things</f7-link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<f7-link
|
||||||
|
no-link-class
|
||||||
|
color="blue"
|
||||||
|
href="#"
|
||||||
|
>Design your home's conceptually with the semantic model builder and link the Things to Items</f7-link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<f7-link
|
||||||
|
no-link-class
|
||||||
|
color="blue"
|
||||||
|
href="#"
|
||||||
|
>Connect to openHAB Cloud for remote access and integration with voice assistants</f7-link>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</f7-card-content>
|
||||||
|
<f7-card-footer>
|
||||||
|
<f7-link color="blue" @click="dismissTasks">Dismiss</f7-link>
|
||||||
|
</f7-card-footer>
|
||||||
|
</f7-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: ['showSetup', 'showTasks'],
|
||||||
|
methods: {
|
||||||
|
skipSetupWizard () {
|
||||||
|
this.$f7.dialog.confirm(
|
||||||
|
'Are you sure? You currently only have a minimal set of features available and you will need to install all essential add-ons by hand!',
|
||||||
|
'Skip Setup Wizard',
|
||||||
|
() => {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
dismissTasks () {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -12,6 +12,7 @@
|
||||||
display inline-block
|
display inline-block
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
height calc(2*3rem + 50px)
|
height calc(2*3rem + 50px)
|
||||||
|
z-index 100
|
||||||
.button
|
.button
|
||||||
width calc(100% - var(--f7-typography-margin))
|
width calc(100% - var(--f7-typography-margin))
|
||||||
padding 3rem 0
|
padding 3rem 0
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<f7-page stacked name="HomePage" class="page-home" @page:init="onPageInit">
|
<f7-page stacked name="HomePage" class="page-home" @page:init="onPageInit" @page:afterin="onPageAfterIn" @page:beforeout="onPageBeforeOut">
|
||||||
<f7-navbar :large="$f7.data.themeOptions.homeNavbar !== 'simple'" :large-transparent="true">
|
<f7-navbar :large="$f7.data.themeOptions.homeNavbar !== 'simple'" :large-transparent="true" class="home-nav">
|
||||||
<f7-nav-left>
|
<f7-nav-left>
|
||||||
<f7-link icon-ios="f7:menu" icon-aurora="f7:menu" icon-md="material:menu" panel-open="left"></f7-link>
|
<f7-link icon-ios="f7:menu" icon-aurora="f7:menu" icon-md="material:menu" panel-open="left"></f7-link>
|
||||||
</f7-nav-left>
|
</f7-nav-left>
|
||||||
|
@ -11,9 +11,9 @@
|
||||||
<f7-nav-title>
|
<f7-nav-title>
|
||||||
{{title}}
|
{{title}}
|
||||||
</f7-nav-title>
|
</f7-nav-title>
|
||||||
<!-- <f7-nav-right>
|
<f7-nav-right>
|
||||||
<f7-link icon-ios="f7:sidebar_right" icon-aurora="f7:sidebar_right" icon-md="material:exit_to_app" panel-open="right"></f7-link>
|
<f7-link icon-ios="f7:sidebar_right" icon-aurora="f7:sidebar_right" icon-md="material:exit_to_app" panel-open="right"></f7-link>
|
||||||
</f7-nav-right> -->
|
</f7-nav-right>
|
||||||
</f7-navbar>
|
</f7-navbar>
|
||||||
|
|
||||||
<f7-toolbar tabbar labels bottom>
|
<f7-toolbar tabbar labels bottom>
|
||||||
|
@ -25,31 +25,31 @@
|
||||||
|
|
||||||
<f7-tabs :class="{ 'after-big-title': $f7.data.themeOptions.homeNavbar !== 'simple' }" v-if="items">
|
<f7-tabs :class="{ 'after-big-title': $f7.data.themeOptions.homeNavbar !== 'simple' }" v-if="items">
|
||||||
<f7-tab id="tab-overview" :tab-active="currentTab === 'overview'" @tab:show="() => this.currentTab = 'overview'">
|
<f7-tab id="tab-overview" :tab-active="currentTab === 'overview'" @tab:show="() => this.currentTab = 'overview'">
|
||||||
<overview-tab v-if="currentTab === 'overview'" :items="items" />
|
<overview-tab v-if="currentTab === 'overview'" :context="context" :items="items" />
|
||||||
</f7-tab>
|
</f7-tab>
|
||||||
<f7-tab id="tab-locations" :tab-active="currentTab === 'locations'" @tab:show="() => this.currentTab = 'locations'">
|
<f7-tab id="tab-locations" :tab-active="currentTab === 'locations'" @tab:show="() => this.currentTab = 'locations'">
|
||||||
<locations-tab v-if="currentTab === 'locations'" :semantic-items="semanticItems" />
|
<locations-tab v-if="currentTab === 'locations'" :context="context" :semantic-items="semanticItems" />
|
||||||
</f7-tab>
|
</f7-tab>
|
||||||
<f7-tab id="tab-equipments" :tab-active="currentTab === 'equipments'" @tab:show="() => this.currentTab = 'equipments'">
|
<f7-tab id="tab-equipments" :tab-active="currentTab === 'equipments'" @tab:show="() => this.currentTab = 'equipments'">
|
||||||
<equipments-tab v-if="currentTab === 'equipments'" :semantic-items="semanticItems" />
|
<equipments-tab v-if="currentTab === 'equipments'" :context="context" :semantic-items="semanticItems" />
|
||||||
</f7-tab>
|
</f7-tab>
|
||||||
<f7-tab id="tab-properties" :tab-active="currentTab === 'properties'" @tab:show="() => this.currentTab = 'properties'">
|
<f7-tab id="tab-properties" :tab-active="currentTab === 'properties'" @tab:show="() => this.currentTab = 'properties'">
|
||||||
<properties-tab v-if="currentTab === 'properties'" :semantic-items="semanticItems" />
|
<properties-tab v-if="currentTab === 'properties'" :context="context" :semantic-items="semanticItems" />
|
||||||
</f7-tab>
|
</f7-tab>
|
||||||
</f7-tabs>
|
</f7-tabs>
|
||||||
</f7-page>
|
</f7-page>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="stylus">
|
<style lang="stylus">
|
||||||
.theme-filled .home-title-large .title-large-text
|
.theme-filled .home-nav .home-title-large .title-large-text
|
||||||
color var(--f7-text-color)
|
color var(--f7-text-color)
|
||||||
.theme-filled .navbar-large:not(.navbar-large-collapsed) .link.icon-only
|
.theme-filled .home-nav.navbar-large:not(.navbar-large-collapsed) .link.icon-only
|
||||||
color var(--f7-theme-color)
|
color var(--f7-theme-color)
|
||||||
transition color 0.3s
|
transition color 0.3s
|
||||||
.theme-filled .navbar-large.navbar-large-collapsed .link.icon-only
|
.theme-filled .home-nav.navbar-large.navbar-large-collapsed .link.icon-only
|
||||||
color var(--f7-navbar-link-color)
|
color var(--f7-navbar-link-color)
|
||||||
transition color 0.3s
|
transition color 0.3s
|
||||||
.home-title-large .title-large-text
|
.home-nav .home-title-large .title-large-text
|
||||||
line-height 0.95
|
line-height 0.95
|
||||||
.today
|
.today
|
||||||
position absolute
|
position absolute
|
||||||
|
@ -84,99 +84,12 @@ export default {
|
||||||
semanticItems: {}
|
semanticItems: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
|
||||||
this.$oh.api.get('/rest/items?metadata=semantics').then((data) => {
|
|
||||||
this.items = data
|
|
||||||
// get the location items
|
|
||||||
this.semanticItems.locations = data.filter((item, index, items) => {
|
|
||||||
return item.metadata && item.metadata.semantics &&
|
|
||||||
item.metadata.semantics.value.indexOf('Location_') === 0
|
|
||||||
}).sort((a, b) => {
|
|
||||||
const titleA = a.label || a.name
|
|
||||||
const titleB = b.label || b.name
|
|
||||||
return titleA.localeCompare(titleB)
|
|
||||||
}).map((l) => {
|
|
||||||
return {
|
|
||||||
item: l,
|
|
||||||
properties: data.filter((item, index, items) => {
|
|
||||||
return item.metadata && item.metadata.semantics &&
|
|
||||||
item.metadata.semantics && item.metadata.semantics.config &&
|
|
||||||
item.metadata.semantics.config.relatesTo &&
|
|
||||||
item.metadata.semantics.config.hasLocation === l.name
|
|
||||||
}),
|
|
||||||
equipments: data.filter((item, index, items) => {
|
|
||||||
return item.metadata && item.metadata.semantics &&
|
|
||||||
item.metadata.semantics && item.metadata.semantics.config &&
|
|
||||||
item.metadata.semantics.value.indexOf('Equipment_') === 0 &&
|
|
||||||
item.metadata.semantics.config.hasLocation === l.name
|
|
||||||
}).map((item) => {
|
|
||||||
return {
|
|
||||||
item: item,
|
|
||||||
points: data.filter((item2, index, items) => {
|
|
||||||
return item2.metadata && item2.metadata.semantics &&
|
|
||||||
item2.metadata.semantics && item2.metadata.semantics.config &&
|
|
||||||
item2.metadata.semantics.config.isPointOf === item.name
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// get the equipment items
|
|
||||||
this.semanticItems.equipments = data.filter((item, index, items) => {
|
|
||||||
return item.metadata && item.metadata.semantics &&
|
|
||||||
item.metadata.semantics &&
|
|
||||||
item.metadata.semantics.value.indexOf('Equipment_') === 0
|
|
||||||
}).reduce((prev, item, i, properties) => {
|
|
||||||
const equipmentType = item.metadata.semantics.value.split('_')[1]
|
|
||||||
if (!prev[equipmentType]) prev[equipmentType] = []
|
|
||||||
const equipmentWithPoints = {
|
|
||||||
item: item,
|
|
||||||
points: data.filter((item2, index, items) => {
|
|
||||||
return item2.metadata && item2.metadata.semantics &&
|
|
||||||
item2.metadata.semantics && item2.metadata.semantics.config &&
|
|
||||||
item2.metadata.semantics.config.isPointOf === item.name
|
|
||||||
})
|
|
||||||
}
|
|
||||||
prev[equipmentType].push(equipmentWithPoints)
|
|
||||||
return prev
|
|
||||||
}, {})
|
|
||||||
|
|
||||||
// get the property items
|
|
||||||
this.semanticItems.properties = data.filter((item, index, items) => {
|
|
||||||
return item.metadata && item.metadata.semantics &&
|
|
||||||
item.metadata.semantics && item.metadata.semantics.config &&
|
|
||||||
item.metadata.semantics.config.relatesTo
|
|
||||||
}).reduce((prev, item, i, properties) => {
|
|
||||||
const property = item.metadata.semantics.config.relatesTo.split('_')[1]
|
|
||||||
if (!prev[property]) prev[property] = []
|
|
||||||
prev[property].push(item)
|
|
||||||
return prev
|
|
||||||
}, {})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onPageInit () {
|
|
||||||
this.$f7.panel.get('left').enableVisibleBreakpoint()
|
|
||||||
},
|
|
||||||
skipSetupWizard () {
|
|
||||||
const vm = this
|
|
||||||
this.$f7.dialog.confirm(
|
|
||||||
'Are you sure? You currently only have a minimal set of features available and you will need to install all essential add-ons by hand!',
|
|
||||||
'Skip Setup Wizard',
|
|
||||||
() => {
|
|
||||||
vm.showSetup = false
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
dismissTasks () {
|
|
||||||
this.showTasks = false
|
|
||||||
},
|
|
||||||
displayCards () {
|
|
||||||
setTimeout(() => { this.showCards = true }, 3000)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
|
context () {
|
||||||
|
return {
|
||||||
|
store: this.$store.getters.trackedItems
|
||||||
|
}
|
||||||
|
},
|
||||||
title () {
|
title () {
|
||||||
switch (this.currentTab) {
|
switch (this.currentTab) {
|
||||||
case 'overview':
|
case 'overview':
|
||||||
|
@ -191,6 +104,89 @@ export default {
|
||||||
return 'Home'
|
return 'Home'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onPageAfterIn () {
|
||||||
|
this.$store.dispatch('startTrackingStates')
|
||||||
|
this.load()
|
||||||
|
},
|
||||||
|
onPageBeforeOut () {
|
||||||
|
this.$store.dispatch('stopTrackingStates')
|
||||||
|
},
|
||||||
|
onPageInit () {
|
||||||
|
this.$f7.panel.get('left').enableVisibleBreakpoint()
|
||||||
|
},
|
||||||
|
load () {
|
||||||
|
this.$oh.api.get('/rest/items?metadata=semantics').then((data) => {
|
||||||
|
this.items = data
|
||||||
|
// get the location items
|
||||||
|
this.semanticItems.locations = data.filter((item, index, items) => {
|
||||||
|
return item.metadata && item.metadata.semantics &&
|
||||||
|
item.metadata.semantics.value.indexOf('Location_') === 0
|
||||||
|
}).sort((a, b) => {
|
||||||
|
const titleA = a.label || a.name
|
||||||
|
const titleB = b.label || b.name
|
||||||
|
return titleA.localeCompare(titleB)
|
||||||
|
}).map((l) => {
|
||||||
|
return {
|
||||||
|
item: l,
|
||||||
|
properties: data.filter((item, index, items) => {
|
||||||
|
return item.metadata && item.metadata.semantics &&
|
||||||
|
item.metadata.semantics && item.metadata.semantics.config &&
|
||||||
|
item.metadata.semantics.config.relatesTo &&
|
||||||
|
item.metadata.semantics.config.hasLocation === l.name
|
||||||
|
}),
|
||||||
|
equipments: data.filter((item, index, items) => {
|
||||||
|
return item.metadata && item.metadata.semantics &&
|
||||||
|
item.metadata.semantics && item.metadata.semantics.config &&
|
||||||
|
item.metadata.semantics.value.indexOf('Equipment_') === 0 &&
|
||||||
|
item.metadata.semantics.config.hasLocation === l.name
|
||||||
|
}).map((item) => {
|
||||||
|
return {
|
||||||
|
item: item,
|
||||||
|
points: data.filter((item2, index, items) => {
|
||||||
|
return item2.metadata && item2.metadata.semantics &&
|
||||||
|
item2.metadata.semantics && item2.metadata.semantics.config &&
|
||||||
|
item2.metadata.semantics.config.isPointOf === item.name
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// get the equipment items
|
||||||
|
this.semanticItems.equipments = data.filter((item, index, items) => {
|
||||||
|
return item.metadata && item.metadata.semantics &&
|
||||||
|
item.metadata.semantics &&
|
||||||
|
item.metadata.semantics.value.indexOf('Equipment_') === 0
|
||||||
|
}).reduce((prev, item, i, properties) => {
|
||||||
|
const equipmentType = item.metadata.semantics.value.split('_')[1]
|
||||||
|
if (!prev[equipmentType]) prev[equipmentType] = []
|
||||||
|
const equipmentWithPoints = {
|
||||||
|
item: item,
|
||||||
|
points: data.filter((item2, index, items) => {
|
||||||
|
return item2.metadata && item2.metadata.semantics &&
|
||||||
|
item2.metadata.semantics && item2.metadata.semantics.config &&
|
||||||
|
item2.metadata.semantics.config.isPointOf === item.name
|
||||||
|
})
|
||||||
|
}
|
||||||
|
prev[equipmentType].push(equipmentWithPoints)
|
||||||
|
return prev
|
||||||
|
}, {})
|
||||||
|
|
||||||
|
// get the property items
|
||||||
|
this.semanticItems.properties = data.filter((item, index, items) => {
|
||||||
|
return item.metadata && item.metadata.semantics &&
|
||||||
|
item.metadata.semantics && item.metadata.semantics.config &&
|
||||||
|
item.metadata.semantics.config.relatesTo
|
||||||
|
}).reduce((prev, item, i, properties) => {
|
||||||
|
const property = item.metadata.semantics.config.relatesTo.split('_')[1]
|
||||||
|
if (!prev[property]) prev[property] = []
|
||||||
|
prev[property].push(item)
|
||||||
|
return prev
|
||||||
|
}, {})
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -1,63 +1,40 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
|
<div class="hint-apps" v-if="!overviewPage && !$store.getters.user">
|
||||||
|
<f7-icon class="float-right margin-left" f7="arrow_turn_right_up" size="40"></f7-icon>
|
||||||
|
<p><em class="">Open the apps panel to launch other interfaces</em></p>
|
||||||
|
</div>
|
||||||
<f7-block class="block-narrow">
|
<f7-block class="block-narrow">
|
||||||
<habot v-if="showHABot" />
|
<habot v-if="showHABot" />
|
||||||
<other-apps v-if="showApps" />
|
<other-apps v-if="showApps" />
|
||||||
<f7-col>
|
<f7-col>
|
||||||
<f7-card
|
|
||||||
v-show="showSetup"
|
|
||||||
title="Welcome to openHAB!"
|
|
||||||
content="Congratulations, your server is up and running! However, it is not configured yet. Follow the setup wizard and let it guide you through the initial configuration. (Note: the wizard could also be started automatically on launch if no package is detected - services/org.openhab.addons > package)."
|
|
||||||
>
|
|
||||||
<f7-card-footer>
|
|
||||||
<f7-link color="blue" @click="skipSetupWizard()">No thanks</f7-link>
|
|
||||||
<!-- <f7-button color="blue" fill raised login-screen-open="#login-screen">Start Setup Wizard</f7-button> -->
|
|
||||||
<f7-button color="blue" fill raised href="/setup-wizard/">Start Setup Wizard</f7-button>
|
|
||||||
</f7-card-footer>
|
|
||||||
</f7-card>
|
|
||||||
<f7-card title="Suggested Tasks" v-show="showTasks">
|
|
||||||
<f7-card-content :padding="false">
|
|
||||||
<ol>
|
|
||||||
<li>
|
|
||||||
<f7-link no-link-class color="blue" href="#">Install Bindings & other add-ons</f7-link>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<f7-link no-link-class color="blue" href="#">Discover & configure Things</f7-link>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<f7-link
|
|
||||||
no-link-class
|
|
||||||
color="blue"
|
|
||||||
href="#"
|
|
||||||
>Design your home's conceptually with the semantic model builder and link the Things to Items</f7-link>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<f7-link
|
|
||||||
no-link-class
|
|
||||||
color="blue"
|
|
||||||
href="#"
|
|
||||||
>Connect to openHAB Cloud for remote access and integration with voice assistants</f7-link>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
</f7-card-content>
|
|
||||||
<f7-card-footer>
|
|
||||||
<f7-link color="blue" @click="dismissTasks">Dismiss</f7-link>
|
|
||||||
</f7-card-footer>
|
|
||||||
</f7-card>
|
|
||||||
|
|
||||||
</f7-col>
|
</f7-col>
|
||||||
</f7-block>
|
</f7-block>
|
||||||
|
|
||||||
<f7-block v-if="showCards && !ready" class="text-align-center">
|
<f7-block v-if="!$store" class="text-align-center">
|
||||||
<f7-preloader></f7-preloader>
|
<f7-preloader></f7-preloader>
|
||||||
<div>Loading...</div>
|
<div>Loading...</div>
|
||||||
</f7-block>
|
</f7-block>
|
||||||
|
|
||||||
<div class="demo-expandable-cards" v-if="showCards && ready">
|
<component :is="overviewPage.component" v-if="overviewPage" :context="overviewPageContext" :class="{notready: !ready}" @command="onCommand" />
|
||||||
<h2 class="home-header">
|
<div class="empty" v-else>
|
||||||
<!-- <f7-icon aurora="f7:star_fill" ios="f7:star_fill" md="material:star" size="25" style="vertical-align: sub" /> -->
|
<empty-state-placeholder icon="rocket" title="overview.title" text="overview.text" />
|
||||||
Now
|
<f7-row class="display-flex justify-content-center">
|
||||||
</h2>
|
<f7-button large fill color="blue" external href="https://next.openhab.org/docs/" target="_blank">Documentation</f7-button>
|
||||||
|
<span style="width: 8px"></span>
|
||||||
|
<f7-button large color="blue" external href="https://next.openhab.org/docs/tutorial/" target="_blank">Tutorial</f7-button>
|
||||||
|
</f7-row>
|
||||||
|
|
||||||
|
<div class="hint-signin" v-if="!$store.getters.user">
|
||||||
|
<p class="padding-left"><em>Click on the shield to sign in as an administrator</em></p>
|
||||||
|
<f7-icon f7="arrow_down_left" size="40"></f7-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <h2 class="home-header">
|
||||||
|
Now
|
||||||
|
</h2> -->
|
||||||
|
|
||||||
|
<!-- <div class="demo-expandable-cards" v-if="showCards && ready">
|
||||||
<expandable-card color="teal" header="gauge" />
|
<expandable-card color="teal" header="gauge" />
|
||||||
<h2 class="home-header">Favorites</h2>
|
<h2 class="home-header">Favorites</h2>
|
||||||
<h3 class="home-header">Scenes</h3>
|
<h3 class="home-header">Scenes</h3>
|
||||||
|
@ -67,18 +44,13 @@
|
||||||
<expandable-card color="blue" header="temperature" title="Thermostat Downstairs" />
|
<expandable-card color="blue" header="temperature" title="Thermostat Downstairs" />
|
||||||
<expandable-card color="green" header="gauge" />
|
<expandable-card color="green" header="gauge" />
|
||||||
<expandable-card color="deeppurple" />
|
<expandable-card color="deeppurple" />
|
||||||
<!-- <expandable-card color="gray" /> -->
|
|
||||||
<expandable-card color="black" header="player" title="SONOS Multiroom" />
|
<expandable-card color="black" header="player" title="SONOS Multiroom" />
|
||||||
<expandable-card color="blue" header="image" title="Webcam Front Door" />
|
<expandable-card color="blue" header="image" title="Webcam Front Door" />
|
||||||
<!-- <expandable-card color="orange" />
|
</div> -->
|
||||||
<expandable-card color="deeporange" />
|
|
||||||
<expandable-card color="pink" />
|
|
||||||
<expandable-card color="lightblue" /> -->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<f7-block v-if="showCards && ready">
|
<!-- <f7-block v-if="showCards && ready">
|
||||||
<f7-button small @click="showSetup = true; showTasks = true; showCards = false; showHABot = false">Simulate first-time run</f7-button>
|
<f7-button small @click="showSetup = true; showTasks = true; showCards = false; showHABot = false">Simulate first-time run</f7-button>
|
||||||
</f7-block>
|
</f7-block> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
@ -88,59 +60,63 @@
|
||||||
display block
|
display block
|
||||||
width calc(100% - 30px)
|
width calc(100% - 30px)
|
||||||
margin-left calc(var(--f7-block-padding-horizontal) + var(--f7-safe-area-left))
|
margin-left calc(var(--f7-block-padding-horizontal) + var(--f7-safe-area-left))
|
||||||
|
.hint-apps
|
||||||
|
position absolute
|
||||||
|
top calc(var(--f7-page-navbar-offset, 0px) + var(--f7-page-content-extra-padding-top, 0px))
|
||||||
|
right 1rem
|
||||||
|
width 60%
|
||||||
|
p
|
||||||
|
text-align right
|
||||||
|
.hint-signin
|
||||||
|
position absolute
|
||||||
|
bottom calc(var(--f7-tabbar-labels-height) + var(--f7-safe-area-bottom))
|
||||||
|
width 50%
|
||||||
|
height 10rem
|
||||||
|
left 1rem
|
||||||
|
p
|
||||||
|
margin-left 40px
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ExpandableCard from '../../components/expandable-card.vue'
|
// import ExpandableCard from '../../components/expandable-card.vue'
|
||||||
|
// import OtherApps from '../../components/home/other-apps.vue'
|
||||||
|
|
||||||
|
import OhLayoutPage from '@/components/widgets/layout/oh-layout-page.vue'
|
||||||
import Habot from '../../components/home/habot.vue'
|
import Habot from '../../components/home/habot.vue'
|
||||||
import OtherApps from '../../components/home/other-apps.vue'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: ['items'],
|
props: ['context', 'items'],
|
||||||
components: {
|
components: {
|
||||||
ExpandableCard,
|
OhLayoutPage,
|
||||||
OtherApps,
|
|
||||||
Habot
|
Habot
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
showSetup: false,
|
showSetup: false,
|
||||||
showTasks: false,
|
showTasks: false,
|
||||||
showApps: true,
|
showApps: false,
|
||||||
showCards: false,
|
showCards: false,
|
||||||
showHABot: false,
|
showHABot: false,
|
||||||
ready: true
|
ready: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
computed: {
|
||||||
// if (Object.keys(this.items).length === 0) {
|
overviewPage () {
|
||||||
// this.showSetup = true
|
const page = this.$store.getters.page('overview')
|
||||||
// } else {
|
if (!page) return null
|
||||||
// this.showCards = true
|
if (page.component !== 'oh-layout-page') return null
|
||||||
// this.showHABot = true
|
return page
|
||||||
// setTimeout(() => { this.ready = true }, 1000)
|
},
|
||||||
// }
|
overviewPageContext () {
|
||||||
|
return {
|
||||||
|
component: this.overviewPage,
|
||||||
|
store: this.context.store
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
skipSetupWizard () {
|
onCommand (itemName, command) {
|
||||||
const vm = this
|
this.$store.dispatch('sendCommand', { itemName, command })
|
||||||
this.$f7.dialog.confirm(
|
|
||||||
'Are you sure? You currently only have a minimal set of features available and you will need to install all essential add-ons by hand!',
|
|
||||||
'Skip Setup Wizard',
|
|
||||||
() => {
|
|
||||||
vm.showSetup = false
|
|
||||||
vm.showTasks = true
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
dismissTasks () {
|
|
||||||
this.showTasks = false
|
|
||||||
this.showHABot = true
|
|
||||||
this.showCards = true
|
|
||||||
setTimeout(() => { this.ready = true }, 1000)
|
|
||||||
},
|
|
||||||
displayCards () {
|
|
||||||
setTimeout(() => { this.showCards = true }, 3000)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<f7-page @page:afterin="onPageAfterIn" @page:beforeout="onPageBeforeOut" hide-bars-on-scroll>
|
<f7-page @page:afterin="onPageAfterIn" @page:beforeout="onPageBeforeOut" hide-bars-on-scroll>
|
||||||
<f7-navbar :back-link="(deep) ? 'Back' : undefined">
|
<f7-navbar :back-link="(showBackButton) ? 'Back' : undefined">
|
||||||
<f7-nav-left v-if="!deep">
|
<f7-nav-left v-if="!showBackButton">
|
||||||
<f7-link icon-ios="f7:menu" icon-aurora="f7:menu" icon-md="material:menu" panel-open="left"></f7-link>
|
<f7-link icon-ios="f7:menu" icon-aurora="f7:menu" icon-md="material:menu" panel-open="left"></f7-link>
|
||||||
</f7-nav-left>
|
</f7-nav-left>
|
||||||
<f7-nav-title>{{(ready) ? page.config.label : ''}}</f7-nav-title>
|
<f7-nav-title>{{(ready) ? page.config.label : ''}}</f7-nav-title>
|
||||||
|
@ -82,6 +82,9 @@ export default {
|
||||||
},
|
},
|
||||||
isAdmin () {
|
isAdmin () {
|
||||||
return this.ready && this.$store.getters.isAdmin
|
return this.ready && this.$store.getters.isAdmin
|
||||||
|
},
|
||||||
|
showBackButton () {
|
||||||
|
return this.deep && (!this.page || !this.page.config.sidebar)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
@ -322,20 +322,31 @@ export default {
|
||||||
const standardWidgetOptions = Object.keys(StandardWidgets).map((k) => {
|
const standardWidgetOptions = Object.keys(StandardWidgets).map((k) => {
|
||||||
return {
|
return {
|
||||||
text: StandardWidgets[k].widget.label,
|
text: StandardWidgets[k].widget.label,
|
||||||
|
color: 'blue',
|
||||||
onClick: () => doAddWidget(StandardWidgets[k].widget.name)
|
onClick: () => doAddWidget(StandardWidgets[k].widget.name)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
const customWidgetOptions = this.$store.state.components.widgets.map((w) => {
|
const customWidgetOptions = this.$store.state.components.widgets.map((w) => {
|
||||||
return {
|
return {
|
||||||
text: w.uid,
|
text: w.uid,
|
||||||
|
color: 'blue',
|
||||||
onClick: () => doAddWidget('widget:' + w.uid)
|
onClick: () => doAddWidget('widget:' + w.uid)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
actions = this.$f7.actions.create({
|
actions = this.$f7.actions.create({
|
||||||
grid: true,
|
// grid: true,
|
||||||
buttons: [
|
buttons: [
|
||||||
standardWidgetOptions,
|
[
|
||||||
customWidgetOptions
|
{ label: true, text: 'Standard Library' },
|
||||||
|
...standardWidgetOptions
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{ label: true, text: 'Personal Widgets' },
|
||||||
|
...customWidgetOptions
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{ color: 'red', 'text': 'Cancel', close: true }
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}).open()
|
}).open()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue