diff --git a/src/panels/lovelace/common/create-hui-element.js b/src/panels/lovelace/common/create-hui-element.js index 9906898124..b7bd4f9f2f 100644 --- a/src/panels/lovelace/common/create-hui-element.js +++ b/src/panels/lovelace/common/create-hui-element.js @@ -5,8 +5,10 @@ import '../elements/hui-state-badge-element.js'; import '../elements/hui-state-icon-element.js'; import '../elements/hui-state-label-element.js'; +import fireEvent from '../../../common/dom/fire_event.js'; import createErrorCardConfig from './create-error-card-config.js'; +const CUSTOM_TYPE_PREFIX = 'custom:'; const ELEMENT_TYPES = new Set([ 'icon', 'image', @@ -38,6 +40,21 @@ export default function createHuiElement(config) { return _createErrorElement('No element type configured.', config); } + if (config.type.startsWith(CUSTOM_TYPE_PREFIX)) { + const tag = config.type.substr(CUSTOM_TYPE_PREFIX.length); + + if (customElements.get(tag)) { + return _createElement(tag, config); + } + + const element = _createErrorElement(`Custom element doesn't exist: ${tag}.`, config); + + customElements.whenDefined(tag) + .then(() => fireEvent(element, 'rebuild-view')); + + return element; + } + if (!ELEMENT_TYPES.has(config.type)) { return _createErrorElement(`Unknown element type encountered: ${config.type}.`, config); }