diff --git a/bundles/org.openhab.ui/web/src/components/app.vue b/bundles/org.openhab.ui/web/src/components/app.vue index 3f41b2883b..df47cbd844 100644 --- a/bundles/org.openhab.ui/web/src/components/app.vue +++ b/bundles/org.openhab.ui/web/src/components/app.vue @@ -498,7 +498,8 @@ export default { ...this.$store.getters.apiEndpoint('ui') ? [this.$oh.api.get('/rest/ui/components/ui:page'), this.$oh.api.get('/rest/ui/components/ui:widget')] : [Promise.resolve([]), Promise.resolve([])], - dayjsLocalePromise + dayjsLocalePromise, + this.$store.dispatch('loadSemantics') ]) }).then((data) => { // store the pages & widgets @@ -513,11 +514,9 @@ export default { if (data[2]) dayjs.locale(data[2].key) - // load the Semantic tags - this.$store.dispatch('loadSemantics').then(() => { - this.ready = true - return Promise.resolve() - }) + // finished with loading + this.ready = true + return Promise.resolve() }) }, pageIsVisible (page) { @@ -705,7 +704,6 @@ export default { if (refreshToken) { this.refreshAccessToken().then(() => { this.loggedIn = true - // this.loadData() this.init = true }).catch((err) => { console.warn('Error while using the stored refresh_token to get a new access_token: ' + err + '. Logging out & cleaning session.') diff --git a/bundles/org.openhab.ui/web/src/js/store/modules/semantics.js b/bundles/org.openhab.ui/web/src/js/store/modules/semantics.js index a263fcdbae..0e08a04e17 100644 --- a/bundles/org.openhab.ui/web/src/js/store/modules/semantics.js +++ b/bundles/org.openhab.ui/web/src/js/store/modules/semantics.js @@ -15,37 +15,47 @@ const getters = { } } +const mutations = { + setSemantics (state, { tags }) { + state.Locations = tags.filter(t => t.uid.startsWith('Location')).map(t => t.name) + state.Equipment = tags.filter(t => t.uid.startsWith('Equipment')).map(t => t.name) + state.Points = tags.filter(t => t.uid.startsWith('Point')).map(t => t.name) + state.Properties = tags.filter(t => t.uid.startsWith('Property')).map(t => t.name) + // Store i18n labels + state.Labels = {} // Clear existing labels + for (const i in tags) { + const t = tags[i] + state.Labels[t.name] = t.label || t.name + } + // Save as i18n messages + i18n.mergeLocaleMessage(i18n.locale, state.Labels) + } +} + const actions = { - loadSemantics () { + loadSemantics (context) { + console.debug('Loading semantic tags ...') if (this.getters.apiEndpoint('tags')) { return api.get('/rest/tags') .then((tags) => { - state.Locations = tags.filter(t => t.uid.startsWith('Location')).map(t => t.name) - state.Equipment = tags.filter(t => t.uid.startsWith('Equipment')).map(t => t.name) - state.Points = tags.filter(t => t.uid.startsWith('Point')).map(t => t.name) - state.Properties = tags.filter(t => t.uid.startsWith('Property')).map(t => t.name) - // Store i18n labels - for (const i in tags) { - const t = tags[i] - state.Labels[t.name] = t.label || t.name - } - // Save as i18n messages - i18n.mergeLocaleMessage(i18n.locale, state.Labels) - + context.commit('setSemantics', { tags }) + console.debug('Successfully loaded semantic tags.') return Promise.resolve() }) - .catch((e) => Promise.reject(e)) + .catch((e) => { + console.error('Failed to load semantic tags:') + console.error(e) + Promise.reject('Failed to load semantic tags: ' + e) + }) } else { return Promise.resolve() } } } -const mutations = {} - export default { state, getters, - actions, - mutations + mutations, + actions } diff --git a/bundles/org.openhab.ui/web/src/pages/home.vue b/bundles/org.openhab.ui/web/src/pages/home.vue index 8c30f03e2d..67b96e788e 100644 --- a/bundles/org.openhab.ui/web/src/pages/home.vue +++ b/bundles/org.openhab.ui/web/src/pages/home.vue @@ -156,7 +156,6 @@ export default { watch: { ready (val, oldVal) { if (val && !oldVal) { - this.loadModel() this.$store.dispatch('startTrackingStates') } } @@ -175,6 +174,12 @@ export default { this.$store.dispatch('stopTrackingStates') }, onPageInit () { + this.$store.subscribe((mutation, state) => { + if (mutation.type === 'setSemantics') { + this.loadModel() + } + }) + if (window.OHApp) { if (window.OHApp.pinToHome) this.showPinToHome = true if (window.OHApp.exitToApp) this.showExitToApp = true diff --git a/bundles/org.openhab.ui/web/src/pages/home/homecards-mixin.js b/bundles/org.openhab.ui/web/src/pages/home/homecards-mixin.js index de47e6ccc0..c546f2360f 100644 --- a/bundles/org.openhab.ui/web/src/pages/home/homecards-mixin.js +++ b/bundles/org.openhab.ui/web/src/pages/home/homecards-mixin.js @@ -114,6 +114,8 @@ export default { item.children.forEach(child => this.sortModel(child)) }, loadModel (page) { + this.modelReady = false + console.debug('Loading semantic model and building semantic homepages ...') this.$oh.api.get('/rest/items?staticDataOnly=true&metadata=semantics,listWidget,widgetOrder') .then((data) => { this.items = data @@ -167,6 +169,7 @@ export default { this.model.equipment = Object.keys(equipment).sort((a, b) => this.$t(a).localeCompare(this.$t(b))).map(k => this.buildModelCard('equipment', equipment[k], k, page)) this.model.properties = Object.keys(properties).sort((a, b) => this.$t(a).localeCompare(this.$t(b))).map(k => this.buildModelCard('property', properties[k], k, page)) this.modelReady = true + console.debug('Successfully loaded semantic model and build semantic homepages.') }) .catch((err) => { console.log('Error while loading model: ' + err)