diff --git a/src/panels/lovelace/ha-panel-lovelace.js b/src/panels/lovelace/ha-panel-lovelace.js
index 5b416fa325..4dad4d35de 100644
--- a/src/panels/lovelace/ha-panel-lovelace.js
+++ b/src/panels/lovelace/ha-panel-lovelace.js
@@ -21,6 +21,7 @@ class Lovelace extends PolymerElement {
narrow="[[narrow]]"
show-menu="[[showMenu]]"
hass='[[hass]]'
+ route="[[route]]"
config='[[_config]]'
columns='[[_columns]]'
on-config-refresh='_fetchConfig'
@@ -57,6 +58,8 @@ class Lovelace extends PolymerElement {
value: false,
},
+ route: Object,
+
_columns: {
type: Number,
value: 1,
diff --git a/src/panels/lovelace/hui-root.js b/src/panels/lovelace/hui-root.js
index e28f11e02d..43e6288fa2 100644
--- a/src/panels/lovelace/hui-root.js
+++ b/src/panels/lovelace/hui-root.js
@@ -1,6 +1,7 @@
import '@polymer/app-layout/app-header-layout/app-header-layout.js';
import '@polymer/app-layout/app-header/app-header.js';
import '@polymer/app-layout/app-toolbar/app-toolbar.js';
+import '@polymer/app-route/app-route.js';
import '@polymer/paper-icon-button/paper-icon-button.js';
import '@polymer/paper-tabs/paper-tab.js';
import '@polymer/paper-tabs/paper-tabs.js';
@@ -10,6 +11,8 @@ import { html } from '@polymer/polymer/lib/utils/html-tag.js';
import { PolymerElement } from '@polymer/polymer/polymer-element.js';
import EventsMixin from '../../mixins/events-mixin.js';
+import NavigateMixin from '../../mixins/navigate-mixin.js';
+
import '../../layouts/ha-app-layout.js';
import '../../components/ha-start-voice-button.js';
import { loadModule, loadJS } from '../../common/dom/load_resource.js';
@@ -18,7 +21,7 @@ import './hui-view.js';
// JS should only be imported once. Modules and HTML are safe.
const JS_CACHE = {};
-class HUIRoot extends EventsMixin(PolymerElement) {
+class HUIRoot extends NavigateMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
+
@@ -93,13 +97,35 @@ class HUIRoot extends EventsMixin(PolymerElement) {
_curView: {
type: Number,
value: 0,
- }
+ },
+
+ route: {
+ type: Object,
+ observer: '_routeChanged'
+ },
+ routeData: Object
};
}
- ready() {
- super.ready();
- this._selectView(0);
+ _routeChanged(route) {
+ const views = this.config && this.config.views;
+ if (route.path === '' && route.prefix === '/lovelace' && views) {
+ this.navigate(`/lovelace/${views[0].id || 0}`, true);
+ } else if (this.routeData.view) {
+ const view = this.routeData.view;
+ let index = 0;
+ for (let i = 0; i < views.length; i++) {
+ if (views[i].id === view || i === parseInt(view)) {
+ index = i;
+ break;
+ }
+ }
+ if (index !== this._curView) this._selectView(index);
+ }
+ }
+
+ _computeViewId(id, index) {
+ return id || index;
}
_computeTitle(config) {
@@ -119,7 +145,12 @@ class HUIRoot extends EventsMixin(PolymerElement) {
}
_handleViewSelected(ev) {
- this._selectView(ev.detail.selected);
+ const index = ev.detail.selected;
+ if (index !== this._curView) {
+ const id = this.config.views[index].id || index;
+ this.navigate(`/lovelace/${id}`);
+ this._selectView(index);
+ }
}
_selectView(viewIndex) {