Show an error screen when panel cannot be resolved (#1303)

* Show an error screen when panel cannot be resolved

* Lint
This commit is contained in:
Paulus Schoutsen 2018-06-19 15:50:52 -04:00 committed by GitHub
parent 87bd9ed48a
commit 4acfa2ba88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4,6 +4,7 @@ import { html } from '@polymer/polymer/lib/utils/html-tag.js';
import { PolymerElement } from '@polymer/polymer/polymer-element.js'; import { PolymerElement } from '@polymer/polymer/polymer-element.js';
import './hass-loading-screen.js'; import './hass-loading-screen.js';
import './hass-error-screen.js';
import { importHref } from '../resources/html-import/import-href'; import { importHref } from '../resources/html-import/import-href';
import dynamicContentUpdater from '../common/dom/dynamic_content_updater.js'; import dynamicContentUpdater from '../common/dom/dynamic_content_updater.js';
@ -109,11 +110,19 @@ class PartialPanelResolver extends NavigateMixin(PolymerElement) {
</style> </style>
<app-route route="{{route}}" pattern="/:panel" data="{{routeData}}" tail="{{routeTail}}"></app-route> <app-route route="{{route}}" pattern="/:panel" data="{{routeData}}" tail="{{routeTail}}"></app-route>
<template is="dom-if" if="[[!resolved]]"> <template is="dom-if" if="[[_equal(_state, 'loading')]]">
<hass-loading-screen narrow="[[narrow]]" show-menu="[[showMenu]]"></hass-loading-screen> <hass-loading-screen narrow="[[narrow]]" show-menu="[[showMenu]]"></hass-loading-screen>
</template> </template>
<template is="dom-if" if="[[_equal(_state, 'error')]]">
<hass-error-screen
title=''
error="Error while loading this panel."
narrow="[[narrow]]"
show-menu="[[showMenu]]"
></hass-error-screen>
</template>
<span id="panel" hidden$="[[!resolved]]"></span> <span id="panel" hidden$="[[!_equal(_state, 'loaded')]]"></span>
`; `;
} }
@ -141,9 +150,9 @@ class PartialPanelResolver extends NavigateMixin(PolymerElement) {
type: Object, type: Object,
observer: 'updateAttributes', observer: 'updateAttributes',
}, },
resolved: { _state: {
type: Boolean, type: String,
value: false, value: 'loading',
}, },
panel: { panel: {
type: Object, type: Object,
@ -161,7 +170,7 @@ class PartialPanelResolver extends NavigateMixin(PolymerElement) {
return; return;
} }
this.resolved = false; this._state = 'loading';
let loadingProm; let loadingProm;
if (panel.url) { if (panel.url) {
@ -184,17 +193,9 @@ class PartialPanelResolver extends NavigateMixin(PolymerElement) {
route: this.routeTail, route: this.routeTail,
panel: panel, panel: panel,
}); });
this.resolved = true; this._state = 'loaded';
},
(err) => {
/* eslint-disable-next-line */
console.error('Error loading panel', err);
// a single retry of importHref in the error callback fixes a webkit refresh issue
if (!this.retrySetPanelForWebkit(panel)) {
this.panelLoadError(panel);
}
}, },
() => { this._state = 'error'; },
); );
} }
@ -202,14 +203,6 @@ class PartialPanelResolver extends NavigateMixin(PolymerElement) {
alert(`Failed to resolve panel ${panel.component_name}`); alert(`Failed to resolve panel ${panel.component_name}`);
} }
retrySetPanelForWebkit(panel) {
if (this._retryingPanelChanged) {
return false;
}
this._retryingPanelChanged = true;
return this.panelChanged(panel);
}
updateAttributes() { updateAttributes() {
var customEl = dom(this.$.panel).lastChild; var customEl = dom(this.$.panel).lastChild;
if (!customEl) return; if (!customEl) return;
@ -222,6 +215,10 @@ class PartialPanelResolver extends NavigateMixin(PolymerElement) {
computeCurrentPanel(hass) { computeCurrentPanel(hass) {
return hass.panels[hass.panelUrl]; return hass.panels[hass.panelUrl];
} }
_equal(a, b) {
return a === b;
}
} }
customElements.define('partial-panel-resolver', PartialPanelResolver); customElements.define('partial-panel-resolver', PartialPanelResolver);