mirror of
https://github.com/home-assistant/frontend.git
synced 2026-07-16 00:57:34 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bf4e71b57a |
@@ -51,8 +51,9 @@ class StorageClass {
|
||||
storageKey: string,
|
||||
callback: Callback
|
||||
): UnsubscribeFunc {
|
||||
if (this._listeners[storageKey]) {
|
||||
this._listeners[storageKey].push(callback);
|
||||
const listeners = this._listeners[storageKey];
|
||||
if (listeners) {
|
||||
listeners.push(callback);
|
||||
} else {
|
||||
this._listeners[storageKey] = [callback];
|
||||
}
|
||||
|
||||
@@ -33,13 +33,12 @@ const extractVarFromBase = (
|
||||
varName: string,
|
||||
baseVars: Record<string, string>
|
||||
): string | undefined => {
|
||||
if (baseVars[varName] && baseVars[varName].startsWith("var(")) {
|
||||
const baseVarName = baseVars[varName]
|
||||
.substring(6, baseVars[varName].length - 1)
|
||||
.trim();
|
||||
const value = baseVars[varName];
|
||||
if (value && value.startsWith("var(")) {
|
||||
const baseVarName = value.substring(6, value.length - 1).trim();
|
||||
return extractVarFromBase(baseVarName, baseVars);
|
||||
}
|
||||
return baseVars[varName];
|
||||
return value;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -181,49 +181,49 @@ export class HaSelectorSelector extends LitElement {
|
||||
return true;
|
||||
}
|
||||
|
||||
private _schema = memoizeOne(
|
||||
(choice: string, localize: LocalizeFunc) =>
|
||||
[
|
||||
{
|
||||
name: "type",
|
||||
required: true,
|
||||
selector: {
|
||||
select: {
|
||||
mode: "dropdown",
|
||||
options: Object.keys(SELECTOR_SCHEMAS)
|
||||
.concat("manual")
|
||||
.map((key) => ({
|
||||
label:
|
||||
localize(
|
||||
`ui.components.selectors.selector.types.${key}` as LocalizeKeys
|
||||
) || key,
|
||||
value: key,
|
||||
})),
|
||||
},
|
||||
private _schema = memoizeOne((choice: string, localize: LocalizeFunc) => {
|
||||
const schemas = SELECTOR_SCHEMAS[choice];
|
||||
return [
|
||||
{
|
||||
name: "type",
|
||||
required: true,
|
||||
selector: {
|
||||
select: {
|
||||
mode: "dropdown",
|
||||
options: Object.keys(SELECTOR_SCHEMAS)
|
||||
.concat("manual")
|
||||
.map((key) => ({
|
||||
label:
|
||||
localize(
|
||||
`ui.components.selectors.selector.types.${key}` as LocalizeKeys
|
||||
) || key,
|
||||
value: key,
|
||||
})),
|
||||
},
|
||||
},
|
||||
...(choice === "manual"
|
||||
? ([
|
||||
},
|
||||
...(choice === "manual"
|
||||
? ([
|
||||
{
|
||||
name: "manual",
|
||||
selector: { object: {} },
|
||||
},
|
||||
] as const)
|
||||
: []),
|
||||
...(schemas
|
||||
? schemas.length > 1
|
||||
? [
|
||||
{
|
||||
name: "manual",
|
||||
selector: { object: {} },
|
||||
name: "",
|
||||
type: "expandable",
|
||||
title: localize("ui.components.selectors.selector.options"),
|
||||
schema: schemas,
|
||||
},
|
||||
] as const)
|
||||
: []),
|
||||
...(SELECTOR_SCHEMAS[choice]
|
||||
? SELECTOR_SCHEMAS[choice].length > 1
|
||||
? [
|
||||
{
|
||||
name: "",
|
||||
type: "expandable",
|
||||
title: localize("ui.components.selectors.selector.options"),
|
||||
schema: SELECTOR_SCHEMAS[choice],
|
||||
},
|
||||
]
|
||||
: SELECTOR_SCHEMAS[choice]
|
||||
: []),
|
||||
] as const
|
||||
);
|
||||
]
|
||||
: schemas
|
||||
: []),
|
||||
] as const;
|
||||
});
|
||||
|
||||
protected render() {
|
||||
let data;
|
||||
|
||||
@@ -305,6 +305,10 @@ export class HaServiceControl extends LitElement {
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
const isPrimaryEntity = (entityId: string) => {
|
||||
const entity = this.hass.entities[entityId];
|
||||
return !entity?.entity_category && !entity?.hidden;
|
||||
};
|
||||
const targetEntities =
|
||||
ensureArray(
|
||||
value?.target?.entity_id || value?.data?.entity_id
|
||||
@@ -333,11 +337,7 @@ export class HaServiceControl extends LitElement {
|
||||
targetSelector
|
||||
);
|
||||
targetDevices.push(...expanded.devices);
|
||||
const primaryEntities = expanded.entities.filter(
|
||||
(entityId) =>
|
||||
!this.hass.entities[entityId]?.entity_category &&
|
||||
!this.hass.entities[entityId]?.hidden
|
||||
);
|
||||
const primaryEntities = expanded.entities.filter(isPrimaryEntity);
|
||||
targetEntities.push(primaryEntities);
|
||||
targetAreas.push(...expanded.areas);
|
||||
});
|
||||
@@ -362,11 +362,7 @@ export class HaServiceControl extends LitElement {
|
||||
this.hass.entities,
|
||||
targetSelector
|
||||
);
|
||||
const primaryEntities = expanded.entities.filter(
|
||||
(entityId) =>
|
||||
!this.hass.entities[entityId]?.entity_category &&
|
||||
!this.hass.entities[entityId]?.hidden
|
||||
);
|
||||
const primaryEntities = expanded.entities.filter(isPrimaryEntity);
|
||||
targetEntities.push(...primaryEntities);
|
||||
targetDevices.push(...expanded.devices);
|
||||
});
|
||||
@@ -379,11 +375,7 @@ export class HaServiceControl extends LitElement {
|
||||
this.hass.entities,
|
||||
targetSelector
|
||||
);
|
||||
const primaryEntities = expanded.entities.filter(
|
||||
(entityId) =>
|
||||
!this.hass.entities[entityId]?.entity_category &&
|
||||
!this.hass.entities[entityId]?.hidden
|
||||
);
|
||||
const primaryEntities = expanded.entities.filter(isPrimaryEntity);
|
||||
targetEntities.push(...primaryEntities);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -213,12 +213,14 @@ export const findBatteryEntity = <T extends { entity_id: string }>(
|
||||
entities: T[]
|
||||
): T | undefined => {
|
||||
const batteryEntities = entities
|
||||
.filter(
|
||||
(entity) =>
|
||||
states[entity.entity_id] &&
|
||||
states[entity.entity_id].attributes.device_class === "battery" &&
|
||||
.filter((entity) => {
|
||||
const state = states[entity.entity_id];
|
||||
return (
|
||||
state &&
|
||||
state.attributes.device_class === "battery" &&
|
||||
batteryPriorities.includes(computeDomain(entity.entity_id))
|
||||
)
|
||||
);
|
||||
})
|
||||
.sort(
|
||||
(a, b) =>
|
||||
batteryPriorities.indexOf(computeDomain(a.entity_id)) -
|
||||
@@ -235,11 +237,10 @@ export const findBatteryChargingEntity = <T extends { entity_id: string }>(
|
||||
states: HomeAssistant["states"],
|
||||
entities: T[]
|
||||
): T | undefined =>
|
||||
entities.find(
|
||||
(entity) =>
|
||||
states[entity.entity_id] &&
|
||||
states[entity.entity_id].attributes.device_class === "battery_charging"
|
||||
);
|
||||
entities.find((entity) => {
|
||||
const state = states[entity.entity_id];
|
||||
return state && state.attributes.device_class === "battery_charging";
|
||||
});
|
||||
|
||||
export const computeEntityRegistryName = (
|
||||
hass: HomeAssistant,
|
||||
|
||||
+14
-15
@@ -325,35 +325,34 @@ export const getCategoryIcons = async <
|
||||
domain?: string,
|
||||
force = false
|
||||
): Promise<CategoryType[T] | Record<string, CategoryType[T]> | undefined> => {
|
||||
const categoryResources = resources[category];
|
||||
if (!domain) {
|
||||
if (!force && resources[category].all) {
|
||||
return resources[category].all as Promise<
|
||||
Record<string, CategoryType[T]>
|
||||
>;
|
||||
if (!force && categoryResources.all) {
|
||||
return categoryResources.all as Promise<Record<string, CategoryType[T]>>;
|
||||
}
|
||||
resources[category].all = getHassIcons(connection, category).then((res) => {
|
||||
resources[category].domains = res.resources as any;
|
||||
categoryResources.all = getHassIcons(connection, category).then((res) => {
|
||||
categoryResources.domains = res.resources as any;
|
||||
return res?.resources as Record<string, CategoryType[T]>;
|
||||
}) as any;
|
||||
return resources[category].all as Promise<Record<string, CategoryType[T]>>;
|
||||
return categoryResources.all as Promise<Record<string, CategoryType[T]>>;
|
||||
}
|
||||
if (!force && domain in resources[category].domains) {
|
||||
return resources[category].domains[domain] as Promise<CategoryType[T]>;
|
||||
if (!force && domain in categoryResources.domains) {
|
||||
return categoryResources.domains[domain] as Promise<CategoryType[T]>;
|
||||
}
|
||||
if (resources[category].all && !force) {
|
||||
await resources[category].all;
|
||||
if (domain in resources[category].domains) {
|
||||
return resources[category].domains[domain] as Promise<CategoryType[T]>;
|
||||
if (categoryResources.all && !force) {
|
||||
await categoryResources.all;
|
||||
if (domain in categoryResources.domains) {
|
||||
return categoryResources.domains[domain] as Promise<CategoryType[T]>;
|
||||
}
|
||||
}
|
||||
if (!isComponentLoaded(hassConfig, domain)) {
|
||||
return undefined;
|
||||
}
|
||||
const result = getHassIcons(connection, category, domain);
|
||||
resources[category].domains[domain] = result.then(
|
||||
categoryResources.domains[domain] = result.then(
|
||||
(res) => res?.resources[domain]
|
||||
) as any;
|
||||
return resources[category].domains[domain] as Promise<CategoryType[T]>;
|
||||
return categoryResources.domains[domain] as Promise<CategoryType[T]>;
|
||||
};
|
||||
|
||||
export const getServiceIcons = async (
|
||||
|
||||
@@ -80,27 +80,26 @@ class StepFlowMenu extends LitElement {
|
||||
return html`
|
||||
${description ? html`<div class="content">${description}</div>` : nothing}
|
||||
<div class="options">
|
||||
${options.map(
|
||||
(option) => html`
|
||||
${options.map((option) => {
|
||||
const optionDescription = optionDescriptions[option];
|
||||
return html`
|
||||
<ha-list-item
|
||||
hasMeta
|
||||
.step=${option}
|
||||
@click=${this._handleStep}
|
||||
?twoline=${optionDescriptions[option]}
|
||||
?multiline-secondary=${optionDescriptions[option]}
|
||||
?twoline=${optionDescription}
|
||||
?multiline-secondary=${optionDescription}
|
||||
>
|
||||
<span>${translations[option]}</span>
|
||||
${
|
||||
optionDescriptions[option]
|
||||
? html`<span slot="secondary">
|
||||
${optionDescriptions[option]}
|
||||
</span>`
|
||||
optionDescription
|
||||
? html`<span slot="secondary"> ${optionDescription} </span>`
|
||||
: nothing
|
||||
}
|
||||
<ha-icon-next slot="meta"></ha-icon-next>
|
||||
</ha-list-item>
|
||||
`
|
||||
)}
|
||||
`;
|
||||
})}
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
+28
-46
@@ -321,11 +321,10 @@ export default class HaAutomationAddFromTarget extends LitElement {
|
||||
|
||||
const floorAreas = emptyFloors
|
||||
? undefined
|
||||
: this._floorAreas.map((floor, index) =>
|
||||
index === 0 && !floor.id
|
||||
? this._renderAreas(
|
||||
entries[floor.id || `floor${TARGET_SEPARATOR}`].areas!
|
||||
)
|
||||
: this._floorAreas.map((floor, index) => {
|
||||
const floorEntry = entries[floor.id || `floor${TARGET_SEPARATOR}`];
|
||||
return index === 0 && !floor.id
|
||||
? this._renderAreas(floorEntry.areas!)
|
||||
: this._renderItem(
|
||||
!floor.id
|
||||
? this._i18n.localize(
|
||||
@@ -335,19 +334,14 @@ export default class HaAutomationAddFromTarget extends LitElement {
|
||||
floor.id || `floor${TARGET_SEPARATOR}`,
|
||||
!floor.id,
|
||||
!!floor.id && this._getSelectedTargetId(value) === floor.id,
|
||||
!entries[floor.id || `floor${TARGET_SEPARATOR}`].open &&
|
||||
!!Object.keys(
|
||||
entries[floor.id || `floor${TARGET_SEPARATOR}`].areas!
|
||||
).length,
|
||||
entries[floor.id || `floor${TARGET_SEPARATOR}`].open,
|
||||
!floorEntry.open && !!Object.keys(floorEntry.areas!).length,
|
||||
floorEntry.open,
|
||||
this._renderFloorIcon(floor as FloorNestedComboBoxItem),
|
||||
entries[floor.id || `floor${TARGET_SEPARATOR}`].open
|
||||
? this._renderAreas(
|
||||
entries[floor.id || `floor${TARGET_SEPARATOR}`].areas!
|
||||
)
|
||||
floorEntry.open
|
||||
? this._renderAreas(floorEntry.areas!)
|
||||
: undefined
|
||||
)
|
||||
);
|
||||
);
|
||||
});
|
||||
|
||||
return html`<ha-section-title
|
||||
>${this._i18n.localize(
|
||||
@@ -511,81 +505,69 @@ export default class HaAutomationAddFromTarget extends LitElement {
|
||||
const items: TemplateResult[] = [];
|
||||
|
||||
if (unassignedEntitiesLength) {
|
||||
const open = entries[`device${TARGET_SEPARATOR}`].open;
|
||||
const entry = entries[`device${TARGET_SEPARATOR}`];
|
||||
items.push(
|
||||
this._renderItem(
|
||||
this._i18n.localize("ui.components.target-picker.type.entities"),
|
||||
`device${TARGET_SEPARATOR}`,
|
||||
true,
|
||||
false,
|
||||
!open,
|
||||
open,
|
||||
!entry.open,
|
||||
entry.open,
|
||||
undefined,
|
||||
entries[`device${TARGET_SEPARATOR}`].open
|
||||
? this._renderDomains(
|
||||
entries[`device${TARGET_SEPARATOR}`].devices!,
|
||||
"entity_"
|
||||
)
|
||||
entry.open
|
||||
? this._renderDomains(entry.devices!, "entity_")
|
||||
: undefined
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (unassignedHelpersLength) {
|
||||
const open = entries[`helper${TARGET_SEPARATOR}`].open;
|
||||
const entry = entries[`helper${TARGET_SEPARATOR}`];
|
||||
items.push(
|
||||
this._renderItem(
|
||||
this._i18n.localize("ui.panel.config.automation.editor.helpers"),
|
||||
`helper${TARGET_SEPARATOR}`,
|
||||
true,
|
||||
false,
|
||||
!open,
|
||||
open,
|
||||
!entry.open,
|
||||
entry.open,
|
||||
undefined,
|
||||
entries[`helper${TARGET_SEPARATOR}`].open
|
||||
? this._renderDomains(
|
||||
entries[`helper${TARGET_SEPARATOR}`].devices!,
|
||||
"helper_"
|
||||
)
|
||||
entry.open
|
||||
? this._renderDomains(entry.devices!, "helper_")
|
||||
: undefined
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (unassignedDevicesLength) {
|
||||
const open = entries[`area${TARGET_SEPARATOR}`].open;
|
||||
const entry = entries[`area${TARGET_SEPARATOR}`];
|
||||
items.push(
|
||||
this._renderItem(
|
||||
this._i18n.localize("ui.components.target-picker.type.devices"),
|
||||
`area${TARGET_SEPARATOR}`,
|
||||
true,
|
||||
false,
|
||||
!open,
|
||||
open,
|
||||
!entry.open,
|
||||
entry.open,
|
||||
undefined,
|
||||
entries[`area${TARGET_SEPARATOR}`].open
|
||||
? this._renderDevices(entries[`area${TARGET_SEPARATOR}`].devices!)
|
||||
: undefined
|
||||
entry.open ? this._renderDevices(entry.devices!) : undefined
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (unassignedServicesLength) {
|
||||
const open = entries[`service${TARGET_SEPARATOR}`].open;
|
||||
const entry = entries[`service${TARGET_SEPARATOR}`];
|
||||
items.push(
|
||||
this._renderItem(
|
||||
this._i18n.localize("ui.panel.config.automation.editor.services"),
|
||||
`service${TARGET_SEPARATOR}`,
|
||||
true,
|
||||
false,
|
||||
!open,
|
||||
open,
|
||||
!entry.open,
|
||||
entry.open,
|
||||
undefined,
|
||||
entries[`service${TARGET_SEPARATOR}`].open
|
||||
? this._renderDevices(
|
||||
entries[`service${TARGET_SEPARATOR}`].devices!
|
||||
)
|
||||
: undefined
|
||||
entry.open ? this._renderDevices(entry.devices!) : undefined
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -214,13 +214,14 @@ class HaConfigIntegrationsDashboard extends KeyboardShortcutMixin(
|
||||
|
||||
for (const component of components) {
|
||||
const componentDomain = component.split(".")[0];
|
||||
const manifest = manifests[componentDomain];
|
||||
if (
|
||||
!entryDomains.has(componentDomain) &&
|
||||
manifests[componentDomain] &&
|
||||
!manifests[componentDomain].config_flow &&
|
||||
(!manifests[componentDomain].integration_type ||
|
||||
manifest &&
|
||||
!manifest.config_flow &&
|
||||
(!manifest.integration_type ||
|
||||
["device", "hub", "service", "integration"].includes(
|
||||
manifests[componentDomain].integration_type!
|
||||
manifest.integration_type!
|
||||
))
|
||||
) {
|
||||
domains.add(componentDomain);
|
||||
|
||||
@@ -635,16 +635,13 @@ export class HassioNetwork extends LitElement {
|
||||
const value = source.value as "disabled" | "auto" | "static";
|
||||
const version = (source as any).version as "ipv4" | "ipv6";
|
||||
|
||||
if (
|
||||
!value ||
|
||||
!this._interface ||
|
||||
this._interface[version]!.method === value
|
||||
) {
|
||||
const iface = this._interface?.[version];
|
||||
if (!value || !iface || iface.method === value) {
|
||||
return;
|
||||
}
|
||||
this._dirty = true;
|
||||
|
||||
this._interface[version]!.method = value;
|
||||
iface.method = value;
|
||||
this.requestUpdate("_interface");
|
||||
}
|
||||
|
||||
@@ -662,7 +659,8 @@ export class HassioNetwork extends LitElement {
|
||||
const version = (ev.target as any).version as "ipv4" | "ipv6";
|
||||
const id = source.id;
|
||||
|
||||
if (!value || !this._interface?.[version]) {
|
||||
const iface = this._interface?.[version];
|
||||
if (!value || !iface) {
|
||||
source.reportValidity();
|
||||
return;
|
||||
}
|
||||
@@ -670,31 +668,26 @@ export class HassioNetwork extends LitElement {
|
||||
this._dirty = true;
|
||||
if (id === "address") {
|
||||
const index = (ev.target as any).index as number;
|
||||
const { mask: oldMask } = parseAddress(
|
||||
this._interface[version].address![index]
|
||||
);
|
||||
const { mask: oldMask } = parseAddress(iface.address![index]);
|
||||
const { mask } = parseAddress(value);
|
||||
this._interface[version].address![index] = formatAddress(
|
||||
value,
|
||||
mask || oldMask || ""
|
||||
);
|
||||
iface.address![index] = formatAddress(value, mask || oldMask || "");
|
||||
this.requestUpdate("_interface");
|
||||
} else if (id === "netmask") {
|
||||
const index = (ev.target as any).index as number;
|
||||
const { ip } = parseAddress(this._interface[version].address![index]);
|
||||
this._interface[version].address![index] = formatAddress(ip, value);
|
||||
const { ip } = parseAddress(iface.address![index]);
|
||||
iface.address![index] = formatAddress(ip, value);
|
||||
this.requestUpdate("_interface");
|
||||
} else if (id === "prefix") {
|
||||
const index = (ev.target as any).index as number;
|
||||
const { ip } = parseAddress(this._interface[version].address![index]);
|
||||
this._interface[version].address![index] = `${ip}/${value}`;
|
||||
const { ip } = parseAddress(iface.address![index]);
|
||||
iface.address![index] = `${ip}/${value}`;
|
||||
this.requestUpdate("_interface");
|
||||
} else if (id === "nameserver") {
|
||||
const index = (ev.target as any).index as number;
|
||||
this._interface[version].nameservers![index] = value;
|
||||
iface.nameservers![index] = value;
|
||||
this.requestUpdate("_interface");
|
||||
} else {
|
||||
this._interface[version][id] = value;
|
||||
iface[id] = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -326,13 +326,11 @@ class DialogSystemInformation extends LitElement {
|
||||
const keys: TemplateResult[] = [];
|
||||
|
||||
for (const key of Object.keys(domainInfo.info)) {
|
||||
const infoValue = domainInfo.info[key];
|
||||
let value: unknown;
|
||||
|
||||
if (
|
||||
domainInfo.info[key] &&
|
||||
typeof domainInfo.info[key] === "object"
|
||||
) {
|
||||
const info = domainInfo.info[key] as SystemCheckValueObject;
|
||||
if (infoValue && typeof infoValue === "object") {
|
||||
const info = infoValue as SystemCheckValueObject;
|
||||
|
||||
if (info.type === "pending") {
|
||||
value = html` <ha-spinner size="small"></ha-spinner> `;
|
||||
@@ -363,7 +361,7 @@ class DialogSystemInformation extends LitElement {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
value = domainInfo.info[key];
|
||||
value = infoValue;
|
||||
}
|
||||
|
||||
keys.push(html`
|
||||
@@ -431,10 +429,11 @@ class DialogSystemInformation extends LitElement {
|
||||
];
|
||||
|
||||
for (const key of Object.keys(domainInfo.info)) {
|
||||
const infoValue = domainInfo.info[key];
|
||||
let value: unknown;
|
||||
|
||||
if (domainInfo.info[key] && typeof domainInfo.info[key] === "object") {
|
||||
const info = domainInfo.info[key] as SystemCheckValueObject;
|
||||
if (infoValue && typeof infoValue === "object") {
|
||||
const info = infoValue as SystemCheckValueObject;
|
||||
|
||||
if (info.type === "pending") {
|
||||
value = "pending";
|
||||
@@ -448,7 +447,7 @@ class DialogSystemInformation extends LitElement {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
value = domainInfo.info[key];
|
||||
value = infoValue;
|
||||
}
|
||||
if (first) {
|
||||
parts.push(`${key} | ${value}\n-- | --`);
|
||||
|
||||
@@ -226,21 +226,24 @@ export function generatePowerSourcesGraphData(
|
||||
|
||||
// Draw in reverse order so 0 value lines are overwritten
|
||||
["solar", "battery", "grid"].forEach((key, i) => {
|
||||
if (seriesData[key]) {
|
||||
pushSeries(key, seriesData[key].positive, "positive", 3 - i);
|
||||
const series = seriesData[key];
|
||||
if (series) {
|
||||
pushSeries(key, series.positive, "positive", 3 - i);
|
||||
}
|
||||
});
|
||||
|
||||
// Draw in reverse order but above positive series
|
||||
["battery", "grid"].forEach((key, i) => {
|
||||
if (seriesData[key]) {
|
||||
pushSeries(key, seriesData[key].negative, "negative", 4 - i);
|
||||
const series = seriesData[key];
|
||||
if (series) {
|
||||
pushSeries(key, series.negative, "negative", 4 - i);
|
||||
}
|
||||
});
|
||||
|
||||
Object.keys(statIds).forEach((key) => {
|
||||
if (seriesData[key]) {
|
||||
const { colorHex, rgb } = seriesData[key];
|
||||
const series = seriesData[key];
|
||||
if (series) {
|
||||
const { colorHex, rgb } = series;
|
||||
|
||||
legendData!.push({
|
||||
id: key,
|
||||
|
||||
@@ -250,18 +250,14 @@ export class HuiBadgePicker extends LitElement {
|
||||
const usedEntities = computeUsedEntities(this.lovelace);
|
||||
const unusedEntities = calcUnusedEntities(this.hass, usedEntities);
|
||||
|
||||
this._usedEntities = [...usedEntities].filter(
|
||||
(eid) =>
|
||||
this.hass!.states[eid] &&
|
||||
this.hass!.states[eid].state !== UNAVAILABLE &&
|
||||
this.hass!.states[eid].state !== UNKNOWN
|
||||
);
|
||||
this._unusedEntities = [...unusedEntities].filter(
|
||||
(eid) =>
|
||||
this.hass!.states[eid] &&
|
||||
this.hass!.states[eid].state !== UNAVAILABLE &&
|
||||
this.hass!.states[eid].state !== UNKNOWN
|
||||
);
|
||||
const isAvailable = (eid: string) => {
|
||||
const stateObj = this.hass!.states[eid];
|
||||
return (
|
||||
stateObj && stateObj.state !== UNAVAILABLE && stateObj.state !== UNKNOWN
|
||||
);
|
||||
};
|
||||
this._usedEntities = [...usedEntities].filter(isAvailable);
|
||||
this._unusedEntities = [...unusedEntities].filter(isAvailable);
|
||||
|
||||
this._loadBages();
|
||||
}
|
||||
|
||||
@@ -274,18 +274,14 @@ export class HuiCardPicker extends LitElement {
|
||||
const usedEntities = computeUsedEntities(this.lovelace);
|
||||
const unusedEntities = calcUnusedEntities(this.hass, usedEntities);
|
||||
|
||||
this._usedEntities = [...usedEntities].filter(
|
||||
(eid) =>
|
||||
this.hass!.states[eid] &&
|
||||
this.hass!.states[eid].state !== UNAVAILABLE &&
|
||||
this.hass!.states[eid].state !== UNKNOWN
|
||||
);
|
||||
this._unusedEntities = [...unusedEntities].filter(
|
||||
(eid) =>
|
||||
this.hass!.states[eid] &&
|
||||
this.hass!.states[eid].state !== UNAVAILABLE &&
|
||||
this.hass!.states[eid].state !== UNKNOWN
|
||||
);
|
||||
const isAvailable = (eid: string) => {
|
||||
const stateObj = this.hass!.states[eid];
|
||||
return (
|
||||
stateObj && stateObj.state !== UNAVAILABLE && stateObj.state !== UNKNOWN
|
||||
);
|
||||
};
|
||||
this._usedEntities = [...usedEntities].filter(isAvailable);
|
||||
this._unusedEntities = [...unusedEntities].filter(isAvailable);
|
||||
|
||||
this._loadCards();
|
||||
}
|
||||
|
||||
@@ -608,22 +608,24 @@ class HaPanelMy extends LitElement {
|
||||
}
|
||||
const resultParams = {};
|
||||
for (const [key, type] of Object.entries(this._redirect!.params || {})) {
|
||||
if (!params[key] && type.endsWith("?")) {
|
||||
const value = params[key];
|
||||
if (!value && type.endsWith("?")) {
|
||||
continue;
|
||||
}
|
||||
if (!params[key] || !this._checkParamType(type, params[key])) {
|
||||
if (!value || !this._checkParamType(type, value)) {
|
||||
throw Error();
|
||||
}
|
||||
resultParams[key] = params[key];
|
||||
resultParams[key] = value;
|
||||
}
|
||||
for (const [key, type] of Object.entries(
|
||||
this._redirect!.optional_params || {}
|
||||
)) {
|
||||
if (params[key]) {
|
||||
if (!this._checkParamType(type, params[key])) {
|
||||
const value = params[key];
|
||||
if (value) {
|
||||
if (!this._checkParamType(type, value)) {
|
||||
throw Error();
|
||||
}
|
||||
resultParams[key] = params[key];
|
||||
resultParams[key] = value;
|
||||
}
|
||||
}
|
||||
return Object.keys(resultParams).length
|
||||
@@ -637,11 +639,12 @@ class HaPanelMy extends LitElement {
|
||||
}
|
||||
const resultParams = {};
|
||||
for (const [key, type] of Object.entries(this._redirect!.optional_params)) {
|
||||
if (params[key]) {
|
||||
if (!this._checkParamType(type, params[key])) {
|
||||
const value = params[key];
|
||||
if (value) {
|
||||
if (!this._checkParamType(type, value)) {
|
||||
throw Error();
|
||||
}
|
||||
resultParams[key] = params[key];
|
||||
resultParams[key] = value;
|
||||
}
|
||||
}
|
||||
return Object.keys(resultParams).length
|
||||
|
||||
Reference in New Issue
Block a user