Version 2.0!
This commit is contained in:
114
src/lovelace-element.js
Normal file
114
src/lovelace-element.js
Normal file
@@ -0,0 +1,114 @@
|
||||
import { fireEvent } from "./event.js";
|
||||
|
||||
export const CUSTOM_TYPE_PREFIX = "custom:";
|
||||
|
||||
export const DOMAINS_HIDE_MORE_INFO = [
|
||||
"input_number",
|
||||
"input_select",
|
||||
"input_text",
|
||||
"scene",
|
||||
"weblink",
|
||||
];
|
||||
|
||||
function errorElement(error, config) {
|
||||
const el = document.createElement("hui-error-card");
|
||||
el.setConfig({
|
||||
type: "error",
|
||||
error,
|
||||
config,
|
||||
});
|
||||
return el;
|
||||
}
|
||||
|
||||
function _createElement(tag, config) {
|
||||
const el = document.createElement(tag);
|
||||
try {
|
||||
el.setConfig(config);
|
||||
} catch (err) {
|
||||
return errorElement(err, config);
|
||||
}
|
||||
return el;
|
||||
}
|
||||
|
||||
function createLovelaceElement(thing, config) {
|
||||
if(!config || typeof config !== "object" || !config.type)
|
||||
return errorElement(`No ${thing} type configured`, config);
|
||||
|
||||
let tag = config.type;
|
||||
if(tag.startsWith(CUSTOM_TYPE_PREFIX))
|
||||
tag = tag.substr(CUSTOM_TYPE_PREFIX.length);
|
||||
else
|
||||
tag = `hui-${tag}-${thing}`;
|
||||
|
||||
if(customElements.get(tag))
|
||||
return _createElement(tag, config);
|
||||
|
||||
const el = errorElement(`Custom element doesn't exist: ${tag}.`, config);
|
||||
el.style.display = "None";
|
||||
|
||||
const timer = setTimeout(() => {
|
||||
el.style.display = "";
|
||||
}, 2000);
|
||||
|
||||
customElements.whenDefined(tag).then(() => {
|
||||
clearTimeout(timer);
|
||||
fireEvent("ll-rebuild", {}, el);
|
||||
});
|
||||
|
||||
return el;
|
||||
}
|
||||
|
||||
export function createCard(config) {
|
||||
return createLovelaceElement('card', config);
|
||||
}
|
||||
export function createElement(config) {
|
||||
return createLovelaceElement('element', config);
|
||||
}
|
||||
export function createEntityRow(config) {
|
||||
const SPECIAL_TYPES = new Set([
|
||||
"call-service",
|
||||
"divider",
|
||||
"section",
|
||||
"weblink",
|
||||
]);
|
||||
const DEFAULT_ROWS = {
|
||||
alert: "toggle",
|
||||
automation: "toggle",
|
||||
climate: "climate",
|
||||
cover: "cover",
|
||||
fan: "toggle",
|
||||
group: "group",
|
||||
input_boolean: "toggle",
|
||||
input_number: "input-number",
|
||||
input_select: "input-select",
|
||||
input_text: "input-text",
|
||||
light: "toggle",
|
||||
lock: "lock",
|
||||
media_player: "media-player",
|
||||
remote: "toggle",
|
||||
scene: "scene",
|
||||
script: "script",
|
||||
sensor: "sensor",
|
||||
timer: "timer",
|
||||
switch: "toggle",
|
||||
vacuum: "toggle",
|
||||
water_heater: "climate",
|
||||
input_datetime: "input-datetime",
|
||||
};
|
||||
|
||||
if(!config)
|
||||
return errorElement("Invalid configuration given.", config);
|
||||
if(typeof config === "string")
|
||||
config = {entity: config};
|
||||
if(typeof config !== "object" || (!config.entity && !config.type))
|
||||
return errorElement("Invalid configuration given.", config);
|
||||
|
||||
const type = config.type || "default";
|
||||
if(SPECIAL_TYPES.has(type) || type.startsWith(CUSTOM_TYPE_PREFIX))
|
||||
return createLovelaceElement('row', config);
|
||||
|
||||
const domain = config.entity.split(".", 1)[0];
|
||||
Object.assign(config, {type: DEFAULT_ROWS[domain] || "text"});
|
||||
|
||||
return createLovelaceElement('entity-row', config);
|
||||
}
|
||||
Reference in New Issue
Block a user