From 708b8787c5dcaa67735d0431b6c692cafbf1db04 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 31 Aug 2021 08:59:32 +0200 Subject: [PATCH 01/67] Bump round slider (#9301) --- package.json | 2 +- yarn.lock | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index c13880a872..796cc0fcf0 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@polymer/paper-toast": "^3.0.1", "@polymer/paper-tooltip": "^3.0.1", "@polymer/polymer": "3.4.1", - "@thomasloven/round-slider": "0.5.2", + "@thomasloven/round-slider": "0.5.4", "@vaadin/vaadin-combo-box": "^20.0.1", "@vaadin/vaadin-date-picker": "^20.0.1", "@vibrant/color": "^3.2.1-alpha.1", diff --git a/yarn.lock b/yarn.lock index 3b25b90ef6..e1248e0889 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3454,12 +3454,13 @@ __metadata: languageName: node linkType: hard -"@thomasloven/round-slider@npm:0.5.2": - version: 0.5.2 - resolution: "@thomasloven/round-slider@npm:0.5.2" +"@thomasloven/round-slider@npm:0.5.4": + version: 0.5.4 + resolution: "@thomasloven/round-slider@npm:0.5.4" dependencies: - lit-element: ^2.2.1 - checksum: 83d67623fcddcea6753c26a14740b06e24f85281097f2f93fe9b313f8a129eb4c242eb4fb5c3a574d362aaceb3af5040fb11cc81566ca9d40ea6208d71eb82b2 + lit: ^2.0.0-rc.2 + tslib: ^2.2.0 + checksum: 653a0787288355058cc2f8e64304f4108139dc8da1c09185177727f6177e668216e6639b09a57d01b1253c1bab8f987f5f3e503d94539f80cc42a578de834990 languageName: node linkType: hard @@ -8888,7 +8889,7 @@ fsevents@~2.3.1: "@rollup/plugin-json": ^4.0.3 "@rollup/plugin-node-resolve": ^7.1.3 "@rollup/plugin-replace": ^2.3.2 - "@thomasloven/round-slider": 0.5.2 + "@thomasloven/round-slider": 0.5.4 "@types/chromecast-caf-receiver": 5.0.12 "@types/chromecast-caf-sender": ^1.0.3 "@types/js-yaml": ^4.0.1 @@ -15001,10 +15002,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0": - version: 2.2.0 - resolution: "tslib@npm:2.2.0" - checksum: 2d35468c470410871c5246e43f12dcb6d0fc363b617c176f26443b9530e5c5ee8448966892a42956168d8f495da7865bda33dfe82c26c91991e28999974a618f +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.2.0": + version: 2.3.1 + resolution: "tslib@npm:2.3.1" + checksum: 5ae2f209c5127bad284974c78916f02c72082615f65889a7ed0c7ca6d5f935c30338a0ee7310e1d9652dabc7b7507fd2905035487446d09d45fc1f19de71cf05 languageName: node linkType: hard From ac64d293e7bde5f7f39923f6d819e863e61ac5f3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 31 Aug 2021 21:30:35 -0700 Subject: [PATCH 02/67] Sort tags in trigger (#9921) --- hassio/src/dashboard/hassio-addons.ts | 4 ++-- hassio/src/dialogs/hardware/dialog-hassio-hardware.ts | 4 ++-- src/common/string/compare.ts | 6 +++--- src/components/device/ha-area-devices-picker.ts | 7 +++++-- src/components/device/ha-device-picker.ts | 6 ++++-- src/components/entity/ha-statistic-picker.ts | 4 ++-- src/components/ha-addon-picker.ts | 4 ++-- src/components/ha-blueprint-picker.ts | 4 ++-- src/components/ha-sidebar.ts | 6 +++--- src/components/user/ha-user-picker.ts | 4 ++-- src/data/area_registry.ts | 4 ++-- src/dialogs/config-flow/show-dialog-config-flow.ts | 4 ++-- src/dialogs/quick-bar/ha-quick-bar.ts | 6 +++--- src/onboarding/onboarding-integrations.ts | 4 ++-- src/panels/config/areas/ha-config-areas.ts | 4 ++-- .../automation/trigger/types/ha-automation-trigger-tag.ts | 4 ++++ src/panels/config/cloud/account/cloud-tts-pref.ts | 6 +++--- src/panels/config/cloud/alexa/cloud-alexa.ts | 4 ++-- .../cloud/google-assistant/cloud-google-assistant.ts | 4 ++-- src/panels/config/devices/ha-config-device-page.ts | 4 ++-- src/panels/config/integrations/ha-config-integrations.ts | 4 ++-- .../integration-panels/zha/zha-device-card.ts | 4 ++-- .../lovelace/dashboards/ha-config-lovelace-dashboards.ts | 4 ++-- .../lovelace/resources/ha-config-lovelace-resources.ts | 4 ++-- src/panels/config/person/ha-config-person.ts | 8 ++++---- src/panels/config/zone/ha-config-zone.ts | 6 +++--- src/panels/developer-tools/event/events-list.js | 4 ++-- src/panels/lovelace/common/generate-lovelace-config.ts | 4 ++-- .../editor/view-editor/hui-view-visibility-editor.ts | 4 ++-- .../media-browser/hui-dialog-select-media-player.ts | 6 ++++-- 30 files changed, 76 insertions(+), 65 deletions(-) diff --git a/hassio/src/dashboard/hassio-addons.ts b/hassio/src/dashboard/hassio-addons.ts index 06abd3e4d5..0a5d1308e8 100644 --- a/hassio/src/dashboard/hassio-addons.ts +++ b/hassio/src/dashboard/hassio-addons.ts @@ -3,7 +3,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { atLeastVersion } from "../../../src/common/config/version"; import { navigate } from "../../../src/common/navigate"; -import { compare } from "../../../src/common/string/compare"; +import { stringCompare } from "../../../src/common/string/compare"; import "../../../src/components/ha-card"; import { Supervisor } from "../../../src/data/supervisor/supervisor"; import { haStyle } from "../../../src/resources/styles"; @@ -33,7 +33,7 @@ class HassioAddons extends LitElement { ` : this.supervisor.supervisor.addons - .sort((a, b) => compare(a.name, b.name)) + .sort((a, b) => stringCompare(a.name, b.name)) .map( (addon) => html` diff --git a/hassio/src/dialogs/hardware/dialog-hassio-hardware.ts b/hassio/src/dialogs/hardware/dialog-hassio-hardware.ts index f7ccbd970b..a8d1481c84 100755 --- a/hassio/src/dialogs/hardware/dialog-hassio-hardware.ts +++ b/hassio/src/dialogs/hardware/dialog-hassio-hardware.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../src/common/dom/fire_event"; import "../../../../src/common/search/search-input"; -import { compare } from "../../../../src/common/string/compare"; +import { stringCompare } from "../../../../src/common/string/compare"; import "../../../../src/components/ha-dialog"; import "../../../../src/components/ha-expansion-panel"; import { HassioHardwareInfo } from "../../../../src/data/hassio/hardware"; @@ -27,7 +27,7 @@ const _filterDevices = memoizeOne( .toLocaleLowerCase() .includes(filter)) ) - .sort((a, b) => compare(a.name, b.name)) + .sort((a, b) => stringCompare(a.name, b.name)) ); @customElement("dialog-hassio-hardware") diff --git a/src/common/string/compare.ts b/src/common/string/compare.ts index 4a8b5dc8c2..67ef4c87bd 100644 --- a/src/common/string/compare.ts +++ b/src/common/string/compare.ts @@ -1,4 +1,4 @@ -export const compare = (a: string, b: string) => { +export const stringCompare = (a: string, b: string) => { if (a < b) { return -1; } @@ -9,5 +9,5 @@ export const compare = (a: string, b: string) => { return 0; }; -export const caseInsensitiveCompare = (a: string, b: string) => - compare(a.toLowerCase(), b.toLowerCase()); +export const caseInsensitiveStringCompare = (a: string, b: string) => + stringCompare(a.toLowerCase(), b.toLowerCase()); diff --git a/src/components/device/ha-area-devices-picker.ts b/src/components/device/ha-area-devices-picker.ts index 1bfde63f70..0b64c9aa4b 100644 --- a/src/components/device/ha-area-devices-picker.ts +++ b/src/components/device/ha-area-devices-picker.ts @@ -20,7 +20,7 @@ import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../common/dom/fire_event"; import { computeDomain } from "../../common/entity/compute_domain"; -import { compare } from "../../common/string/compare"; +import { stringCompare } from "../../common/string/compare"; import { AreaRegistryEntry, subscribeAreaRegistry, @@ -226,7 +226,10 @@ export class HaAreaDevicesPicker extends SubscribeMixin(LitElement) { const sorted = Object.keys(devicesByArea) .sort((a, b) => - compare(devicesByArea[a].name || "", devicesByArea[b].name || "") + stringCompare( + devicesByArea[a].name || "", + devicesByArea[b].name || "" + ) ) .map((key) => devicesByArea[key]); diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 1be4bdc3b9..91abfd8918 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -15,7 +15,7 @@ import { ComboBoxLitRenderer } from "lit-vaadin-helpers"; import { mdiCheck } from "@mdi/js"; import { fireEvent } from "../../common/dom/fire_event"; import { computeDomain } from "../../common/entity/compute_domain"; -import { compare } from "../../common/string/compare"; +import { stringCompare } from "../../common/string/compare"; import { AreaRegistryEntry, subscribeAreaRegistry, @@ -242,7 +242,9 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { if (outputDevices.length === 1) { return outputDevices; } - return outputDevices.sort((a, b) => compare(a.name || "", b.name || "")); + return outputDevices.sort((a, b) => + stringCompare(a.name || "", b.name || "") + ); } ); diff --git a/src/components/entity/ha-statistic-picker.ts b/src/components/entity/ha-statistic-picker.ts index aa09f92d25..05b78bb05c 100644 --- a/src/components/entity/ha-statistic-picker.ts +++ b/src/components/entity/ha-statistic-picker.ts @@ -18,7 +18,7 @@ import { customElement, property, query, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../common/dom/fire_event"; import { computeStateName } from "../../common/entity/compute_state_name"; -import { compare } from "../../common/string/compare"; +import { stringCompare } from "../../common/string/compare"; import { getStatisticIds, StatisticsMetaData } from "../../data/history"; import { PolymerChangedEvent } from "../../polymer-types"; import { HomeAssistant } from "../../types"; @@ -165,7 +165,7 @@ export class HaStatisticPicker extends LitElement { } if (output.length > 1) { - output.sort((a, b) => compare(a.name || "", b.name || "")); + output.sort((a, b) => stringCompare(a.name || "", b.name || "")); } output.push({ diff --git a/src/components/ha-addon-picker.ts b/src/components/ha-addon-picker.ts index aad6dd4545..cc212edd14 100644 --- a/src/components/ha-addon-picker.ts +++ b/src/components/ha-addon-picker.ts @@ -4,7 +4,7 @@ import { ComboBoxLitRenderer } from "lit-vaadin-helpers"; import { customElement, property, query, state } from "lit/decorators"; import { isComponentLoaded } from "../common/config/is_component_loaded"; import { fireEvent } from "../common/dom/fire_event"; -import { compare } from "../common/string/compare"; +import { stringCompare } from "../common/string/compare"; import { HassioAddonInfo } from "../data/hassio/addon"; import { fetchHassioSupervisorInfo } from "../data/hassio/supervisor"; import { showAlertDialog } from "../dialogs/generic/show-dialog-box"; @@ -97,7 +97,7 @@ class HaAddonPicker extends LitElement { if (isComponentLoaded(this.hass, "hassio")) { const supervisorInfo = await fetchHassioSupervisorInfo(this.hass); this._addons = supervisorInfo.addons.sort((a, b) => - compare(a.name, b.name) + stringCompare(a.name, b.name) ); } else { showAlertDialog(this, { diff --git a/src/components/ha-blueprint-picker.ts b/src/components/ha-blueprint-picker.ts index 2f3a302c35..73df1d44a2 100644 --- a/src/components/ha-blueprint-picker.ts +++ b/src/components/ha-blueprint-picker.ts @@ -5,7 +5,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../common/dom/fire_event"; -import { compare } from "../common/string/compare"; +import { stringCompare } from "../common/string/compare"; import { Blueprint, Blueprints, fetchBlueprints } from "../data/blueprint"; import { HomeAssistant } from "../types"; @@ -33,7 +33,7 @@ class HaBluePrintPicker extends LitElement { ...(blueprint as Blueprint).metadata, path, })); - return result.sort((a, b) => compare(a.name, b.name)); + return result.sort((a, b) => stringCompare(a.name, b.name)); }); protected render(): TemplateResult { diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index e234408f3e..099e9d23e4 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -29,7 +29,7 @@ import { LocalStorage } from "../common/decorators/local-storage"; import { fireEvent } from "../common/dom/fire_event"; import { toggleAttribute } from "../common/dom/toggle_attribute"; import { computeDomain } from "../common/entity/compute_domain"; -import { compare } from "../common/string/compare"; +import { stringCompare } from "../common/string/compare"; import { computeRTL } from "../common/util/compute_rtl"; import { ActionHandlerDetail } from "../data/lovelace"; import { @@ -96,7 +96,7 @@ const defaultPanelSorter = ( } if (aLovelace && bLovelace) { - return compare(a.title!, b.title!); + return stringCompare(a.title!, b.title!); } if (aLovelace && !bLovelace) { return -1; @@ -118,7 +118,7 @@ const defaultPanelSorter = ( return 1; } // both not built in, sort by title - return compare(a.title!, b.title!); + return stringCompare(a.title!, b.title!); }; const computePanels = memoizeOne( diff --git a/src/components/user/ha-user-picker.ts b/src/components/user/ha-user-picker.ts index 89e779d3cc..837f4a64b8 100644 --- a/src/components/user/ha-user-picker.ts +++ b/src/components/user/ha-user-picker.ts @@ -7,7 +7,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { property } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../common/dom/fire_event"; -import { compare } from "../../common/string/compare"; +import { stringCompare } from "../../common/string/compare"; import { fetchUsers, User } from "../../data/user"; import { HomeAssistant } from "../../types"; import "../ha-icon-button"; @@ -33,7 +33,7 @@ class HaUserPicker extends LitElement { return users .filter((user) => !user.system_generated) - .sort((a, b) => compare(a.name, b.name)); + .sort((a, b) => stringCompare(a.name, b.name)); }); protected render(): TemplateResult { diff --git a/src/data/area_registry.ts b/src/data/area_registry.ts index 563af65b47..bb820261a9 100644 --- a/src/data/area_registry.ts +++ b/src/data/area_registry.ts @@ -1,6 +1,6 @@ import { Connection, createCollection } from "home-assistant-js-websocket"; import { Store } from "home-assistant-js-websocket/dist/store"; -import { compare } from "../common/string/compare"; +import { stringCompare } from "../common/string/compare"; import { debounce } from "../common/util/debounce"; import { HomeAssistant } from "../types"; @@ -46,7 +46,7 @@ const fetchAreaRegistry = (conn: Connection) => }) .then((areas) => (areas as AreaRegistryEntry[]).sort((ent1, ent2) => - compare(ent1.name, ent2.name) + stringCompare(ent1.name, ent2.name) ) ); diff --git a/src/dialogs/config-flow/show-dialog-config-flow.ts b/src/dialogs/config-flow/show-dialog-config-flow.ts index 4e97fb7ab2..e516dfc4fe 100644 --- a/src/dialogs/config-flow/show-dialog-config-flow.ts +++ b/src/dialogs/config-flow/show-dialog-config-flow.ts @@ -1,5 +1,5 @@ import { html } from "lit"; -import { caseInsensitiveCompare } from "../../common/string/compare"; +import { caseInsensitiveStringCompare } from "../../common/string/compare"; import { createConfigFlow, deleteConfigFlow, @@ -29,7 +29,7 @@ export const showConfigFlowDialog = ( ]); return handlers.sort((handlerA, handlerB) => - caseInsensitiveCompare( + caseInsensitiveStringCompare( domainToName(hass.localize, handlerA), domainToName(hass.localize, handlerB) ) diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index 96a4acc3e1..62ff7ce0e4 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -25,7 +25,7 @@ import { computeStateName } from "../../common/entity/compute_state_name"; import { domainIcon } from "../../common/entity/domain_icon"; import { navigate } from "../../common/navigate"; import "../../common/search/search-input"; -import { compare } from "../../common/string/compare"; +import { stringCompare } from "../../common/string/compare"; import { fuzzyFilterSort, ScorableTextItem, @@ -395,7 +395,7 @@ export class QuickBar extends LitElement { }; }) .sort((a, b) => - compare(a.primaryText.toLowerCase(), b.primaryText.toLowerCase()) + stringCompare(a.primaryText.toLowerCase(), b.primaryText.toLowerCase()) ); } @@ -405,7 +405,7 @@ export class QuickBar extends LitElement { ...this._generateServerControlCommands(), ...this._generateNavigationCommands(), ].sort((a, b) => - compare( + stringCompare( a.strings.join(" ").toLowerCase(), b.strings.join(" ").toLowerCase() ) diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index acafb6e191..c44f2ec977 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -9,7 +9,7 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; -import { compare } from "../common/string/compare"; +import { stringCompare } from "../common/string/compare"; import { isComponentLoaded } from "../common/config/is_component_loaded"; import { LocalizeFunc } from "../common/translations/localize"; import { ConfigEntry, getConfigEntries } from "../data/config_entries"; @@ -105,7 +105,7 @@ class OnboardingIntegrations extends LitElement { } ); const content = [...entries, ...discovered] - .sort((a, b) => compare(a[0], b[0])) + .sort((a, b) => stringCompare(a[0], b[0])) .map((item) => item[1]); return html` diff --git a/src/panels/config/areas/ha-config-areas.ts b/src/panels/config/areas/ha-config-areas.ts index dd9378e321..9c35acf0b0 100644 --- a/src/panels/config/areas/ha-config-areas.ts +++ b/src/panels/config/areas/ha-config-areas.ts @@ -1,7 +1,7 @@ import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { PropertyValues } from "lit"; import { customElement, property, state } from "lit/decorators"; -import { compare } from "../../../common/string/compare"; +import { stringCompare } from "../../../common/string/compare"; import { AreaRegistryEntry, subscribeAreaRegistry, @@ -104,7 +104,7 @@ class HaConfigAreas extends HassRouterPage { private _loadData() { getConfigEntries(this.hass).then((configEntries) => { this._configEntries = configEntries.sort((conf1, conf2) => - compare(conf1.title, conf2.title) + stringCompare(conf1.title, conf2.title) ); }); if (this._unsubs) { diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts index b2e2d94e5d..ce891e3a57 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-tag.ts @@ -7,6 +7,7 @@ import { fetchTags, Tag } from "../../../../../data/tag"; import { HomeAssistant } from "../../../../../types"; import { TriggerElement } from "../ha-automation-trigger-row"; import "../../../../../components/ha-paper-dropdown-menu"; +import { caseInsensitiveStringCompare } from "../../../../../common/string/compare"; @customElement("ha-automation-trigger-tag") export class HaTagTrigger extends LitElement implements TriggerElement { @@ -54,6 +55,9 @@ export class HaTagTrigger extends LitElement implements TriggerElement { private async _fetchTags() { this._tags = await fetchTags(this.hass); + this._tags.sort((a, b) => + caseInsensitiveStringCompare(a.name || a.id, b.name || b.id) + ); } private _tagChanged(ev) { diff --git a/src/panels/config/cloud/account/cloud-tts-pref.ts b/src/panels/config/cloud/account/cloud-tts-pref.ts index 1b57e7b113..02ed92d0d4 100644 --- a/src/panels/config/cloud/account/cloud-tts-pref.ts +++ b/src/panels/config/cloud/account/cloud-tts-pref.ts @@ -6,7 +6,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { caseInsensitiveCompare } from "../../../../common/string/compare"; +import { caseInsensitiveStringCompare } from "../../../../common/string/compare"; import "../../../../components/ha-card"; import "../../../../components/ha-svg-icon"; import "../../../../components/ha-switch"; @@ -139,7 +139,7 @@ export class CloudTTSPref extends LitElement { languages.push([lang, label]); } - return languages.sort((a, b) => caseInsensitiveCompare(a[1], b[1])); + return languages.sort((a, b) => caseInsensitiveStringCompare(a[1], b[1])); }); private getSupportedGenders = memoizeOne( @@ -160,7 +160,7 @@ export class CloudTTSPref extends LitElement { } } - return genders.sort((a, b) => caseInsensitiveCompare(a[1], b[1])); + return genders.sort((a, b) => caseInsensitiveStringCompare(a[1], b[1])); } ); diff --git a/src/panels/config/cloud/alexa/cloud-alexa.ts b/src/panels/config/cloud/alexa/cloud-alexa.ts index f3cdda6971..a375552df0 100644 --- a/src/panels/config/cloud/alexa/cloud-alexa.ts +++ b/src/panels/config/cloud/alexa/cloud-alexa.ts @@ -18,7 +18,7 @@ import { generateFilter, isEmptyFilter, } from "../../../../common/entity/entity_filter"; -import { compare } from "../../../../common/string/compare"; +import { stringCompare } from "../../../../common/string/compare"; import "../../../../components/entity/state-info"; import "../../../../components/ha-button-menu"; import "../../../../components/ha-card"; @@ -295,7 +295,7 @@ class CloudAlexa extends LitElement { entities.sort((a, b) => { const stateA = this.hass.states[a.entity_id]; const stateB = this.hass.states[b.entity_id]; - return compare( + return stringCompare( stateA ? computeStateName(stateA) : a.entity_id, stateB ? computeStateName(stateB) : b.entity_id ); diff --git a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts index 29068eeb71..17414d4abc 100644 --- a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts +++ b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts @@ -18,7 +18,7 @@ import { generateFilter, isEmptyFilter, } from "../../../../common/entity/entity_filter"; -import { compare } from "../../../../common/string/compare"; +import { stringCompare } from "../../../../common/string/compare"; import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import "../../../../components/entity/state-info"; import "../../../../components/ha-button-menu"; @@ -330,7 +330,7 @@ class CloudGoogleAssistant extends LitElement { entities.sort((a, b) => { const stateA = this.hass.states[a.entity_id]; const stateB = this.hass.states[b.entity_id]; - return compare( + return stringCompare( stateA ? computeStateName(stateA) : a.entity_id, stateB ? computeStateName(stateB) : b.entity_id ); diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 6bc5ec64a1..983580e237 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -6,7 +6,7 @@ import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import { compare } from "../../../common/string/compare"; +import { stringCompare } from "../../../common/string/compare"; import { slugify } from "../../../common/string/slugify"; import "../../../components/entity/ha-battery-icon"; import "../../../components/ha-icon-next"; @@ -103,7 +103,7 @@ export class HaConfigDevicePage extends LitElement { stateName: this._computeEntityName(entity), })) .sort((ent1, ent2) => - compare( + stringCompare( ent1.stateName || `zzz${ent1.entity_id}`, ent2.stateName || `zzz${ent2.entity_id}` ) diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index f3d0275728..55e691d524 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -18,7 +18,7 @@ import memoizeOne from "memoize-one"; import type { HASSDomEvent } from "../../../common/dom/fire_event"; import { navigate } from "../../../common/navigate"; import "../../../common/search/search-input"; -import { caseInsensitiveCompare } from "../../../common/string/compare"; +import { caseInsensitiveStringCompare } from "../../../common/string/compare"; import type { LocalizeFunc } from "../../../common/translations/localize"; import { extractSearchParam } from "../../../common/url/search-params"; import { nextRender } from "../../../common/util/render-status"; @@ -495,7 +495,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { }) ) .sort((conf1, conf2) => - caseInsensitiveCompare( + caseInsensitiveStringCompare( conf1.localized_domain_name + conf1.title, conf2.localized_domain_name + conf2.title ) diff --git a/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts b/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts index 18b8b17281..0b54648a37 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-device-card.ts @@ -23,7 +23,7 @@ import { updateEntityRegistryEntry, } from "../../../../../data/entity_registry"; import { EntityRegistryStateEntry } from "../../../devices/ha-config-device-page"; -import { compare } from "../../../../../common/string/compare"; +import { stringCompare } from "../../../../../common/string/compare"; import { getIeeeTail } from "./functions"; import { slugify } from "../../../../../common/string/slugify"; @@ -49,7 +49,7 @@ class ZHADeviceCard extends SubscribeMixin(LitElement) { stateName: this._computeEntityName(entity), })) .sort((ent1, ent2) => - compare( + stringCompare( ent1.stateName || `zzz${ent1.entity_id}`, ent2.stateName || `zzz${ent2.entity_id}` ) diff --git a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts index 5159cd3485..e1784189c6 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -4,7 +4,7 @@ import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoize from "memoize-one"; import { navigate } from "../../../../common/navigate"; -import { compare } from "../../../../common/string/compare"; +import { stringCompare } from "../../../../common/string/compare"; import { DataTableColumnContainer, RowClickedEvent, @@ -263,7 +263,7 @@ export class HaConfigLovelaceDashboards extends LitElement { createDashboard: async (values: LovelaceDashboardCreateParams) => { const created = await createDashboard(this.hass!, values); this._dashboards = this._dashboards!.concat(created).sort( - (res1, res2) => compare(res1.url_path, res2.url_path) + (res1, res2) => stringCompare(res1.url_path, res2.url_path) ); }, updateDashboard: async (values) => { diff --git a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts index 6693400d64..b49871d840 100644 --- a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts +++ b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts @@ -5,7 +5,7 @@ import "@polymer/paper-listbox/paper-listbox"; import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoize from "memoize-one"; -import { compare } from "../../../../common/string/compare"; +import { stringCompare } from "../../../../common/string/compare"; import { DataTableColumnContainer, RowClickedEvent, @@ -148,7 +148,7 @@ export class HaConfigLovelaceRescources extends LitElement { createResource: async (values) => { const created = await createResource(this.hass!, values); this._resources = this._resources!.concat(created).sort((res1, res2) => - compare(res1.url, res2.url) + stringCompare(res1.url, res2.url) ); loadLovelaceResources([created], this.hass!.auth.data.hassUrl); }, diff --git a/src/panels/config/person/ha-config-person.ts b/src/panels/config/person/ha-config-person.ts index f04b42b3c5..ef3a1c5156 100644 --- a/src/panels/config/person/ha-config-person.ts +++ b/src/panels/config/person/ha-config-person.ts @@ -3,7 +3,7 @@ import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-item/paper-item-body"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { property, state } from "lit/decorators"; -import { compare } from "../../../common/string/compare"; +import { stringCompare } from "../../../common/string/compare"; import "../../../components/ha-card"; import "../../../components/ha-fab"; import "../../../components/ha-svg-icon"; @@ -156,10 +156,10 @@ class HaConfigPerson extends LitElement { const personData = await fetchPersons(this.hass!); this._storageItems = personData.storage.sort((ent1, ent2) => - compare(ent1.name, ent2.name) + stringCompare(ent1.name, ent2.name) ); this._configItems = personData.config.sort((ent1, ent2) => - compare(ent1.name, ent2.name) + stringCompare(ent1.name, ent2.name) ); this._openDialogIfPersonSpecifiedInRoute(); } @@ -221,7 +221,7 @@ class HaConfigPerson extends LitElement { createEntry: async (values) => { const created = await createPerson(this.hass!, values); this._storageItems = this._storageItems!.concat(created).sort( - (ent1, ent2) => compare(ent1.name, ent2.name) + (ent1, ent2) => stringCompare(ent1.name, ent2.name) ); }, updateEntry: async (values) => { diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index cee6446c71..5c711aa7be 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -18,7 +18,7 @@ import { ifDefined } from "lit/directives/if-defined"; import memoizeOne from "memoize-one"; import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import { navigate } from "../../../common/navigate"; -import { compare } from "../../../common/string/compare"; +import { stringCompare } from "../../../common/string/compare"; import "../../../components/ha-card"; import "../../../components/ha-fab"; import "../../../components/ha-svg-icon"; @@ -289,7 +289,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { private async _fetchData() { this._storageItems = (await fetchZones(this.hass!)).sort((ent1, ent2) => - compare(ent1.name, ent2.name) + stringCompare(ent1.name, ent2.name) ); this._getStates(); } @@ -410,7 +410,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { private async _createEntry(values: ZoneMutableParams) { const created = await createZone(this.hass!, values); this._storageItems = this._storageItems!.concat(created).sort( - (ent1, ent2) => compare(ent1.name, ent2.name) + (ent1, ent2) => stringCompare(ent1.name, ent2.name) ); if (this.narrow) { return; diff --git a/src/panels/developer-tools/event/events-list.js b/src/panels/developer-tools/event/events-list.js index 17a69d7588..89b07d6933 100644 --- a/src/panels/developer-tools/event/events-list.js +++ b/src/panels/developer-tools/event/events-list.js @@ -1,7 +1,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { compare } from "../../../common/string/compare"; +import { stringCompare } from "../../../common/string/compare"; import { EventsMixin } from "../../../mixins/events-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin"; @@ -58,7 +58,7 @@ class EventsList extends EventsMixin(LocalizeMixin(PolymerElement)) { connectedCallback() { super.connectedCallback(); this.hass.callApi("GET", "events").then((events) => { - this.events = events.sort((e1, e2) => compare(e1.event, e2.event)); + this.events = events.sort((e1, e2) => stringCompare(e1.event, e2.event)); }); } diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index d86b800cc3..7ed2709528 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -3,7 +3,7 @@ import { computeDomain } from "../../../common/entity/compute_domain"; import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { splitByGroups } from "../../../common/entity/split_by_groups"; -import { compare } from "../../../common/string/compare"; +import { stringCompare } from "../../../common/string/compare"; import { LocalizeFunc } from "../../../common/translations/localize"; import type { AreaRegistryEntry } from "../../../data/area_registry"; import type { DeviceRegistryEntry } from "../../../data/device_registry"; @@ -262,7 +262,7 @@ export const generateViewConfig = ( computeCards( ungroupedEntitites[domain] .sort((a, b) => - compare( + stringCompare( computeStateName(entities[a]), computeStateName(entities[b]) ) diff --git a/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts b/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts index b546794a29..ad09ab0987 100644 --- a/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts +++ b/src/panels/lovelace/editor/view-editor/hui-view-visibility-editor.ts @@ -11,7 +11,7 @@ import { import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { compare } from "../../../../common/string/compare"; +import { stringCompare } from "../../../../common/string/compare"; import { HaSwitch } from "../../../../components/ha-switch"; import "../../../../components/user/ha-user-badge"; import { LovelaceViewConfig, ShowViewConfig } from "../../../../data/lovelace"; @@ -43,7 +43,7 @@ export class HuiViewVisibilityEditor extends LitElement { @state() private _visible!: boolean | ShowViewConfig[]; private _sortedUsers = memoizeOne((users: User[]) => - users.sort((a, b) => compare(a.name, b.name)) + users.sort((a, b) => stringCompare(a.name, b.name)) ); protected firstUpdated(changedProps: PropertyValues) { diff --git a/src/panels/media-browser/hui-dialog-select-media-player.ts b/src/panels/media-browser/hui-dialog-select-media-player.ts index 42c094c286..7f92faa9ac 100644 --- a/src/panels/media-browser/hui-dialog-select-media-player.ts +++ b/src/panels/media-browser/hui-dialog-select-media-player.ts @@ -6,7 +6,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; import { computeStateName } from "../../common/entity/compute_state_name"; -import { compare } from "../../common/string/compare"; +import { stringCompare } from "../../common/string/compare"; import { createCloseHeading } from "../../components/ha-dialog"; import { UNAVAILABLE_STATES } from "../../data/entity"; import { BROWSER_PLAYER } from "../../data/media-player"; @@ -52,7 +52,9 @@ export class HuiDialogSelectMediaPlayer extends LitElement { )} ${this._params.mediaSources - .sort((a, b) => compare(computeStateName(a), computeStateName(b))) + .sort((a, b) => + stringCompare(computeStateName(a), computeStateName(b)) + ) .map( (source) => html` Date: Wed, 1 Sep 2021 16:23:29 +0200 Subject: [PATCH 03/67] Correct badge warning (and use new styling) (#9926) --- .../view-editor/hui-dialog-edit-view.ts | 27 +++++++++++++------ .../editor/view-editor/hui-view-editor.ts | 13 ++++++--- src/panels/lovelace/views/const.ts | 4 +++ src/panels/lovelace/views/hui-view.ts | 27 +++++++++---------- src/translations/en.json | 16 +++++------ 5 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 src/panels/lovelace/views/const.ts diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index e659c5168c..bd578aa96f 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -7,6 +7,7 @@ import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event"; import { navigate } from "../../../../common/navigate"; import "../../../../components/ha-circular-progress"; import "../../../../components/ha-dialog"; +import "../../../../components/ha-alert"; import "../../../../components/ha-icon-button"; import type { LovelaceBadgeConfig, @@ -31,6 +32,11 @@ import { import "./hui-view-editor"; import "./hui-view-visibility-editor"; import { EditViewDialogParams } from "./show-edit-view-dialog"; +import { + DEFAULT_VIEW_LAYOUT, + PANEL_VIEW_LAYOUT, + VIEWS_NO_BADGE_SUPPORT, +} from "../../views/const"; @customElement("hui-dialog-edit-view") export class HuiDialogEditView extends LitElement { @@ -50,6 +56,15 @@ export class HuiDialogEditView extends LitElement { private _curTabIndex = 0; + get _type(): string { + if (!this._config) { + return DEFAULT_VIEW_LAYOUT; + } + return this._config.panel + ? PANEL_VIEW_LAYOUT + : this._config.type || DEFAULT_VIEW_LAYOUT; + } + public showDialog(params: EditViewDialogParams): void { this._params = params; @@ -107,13 +122,13 @@ export class HuiDialogEditView extends LitElement { content = html` ${this._badges?.length ? html` - ${this._config?.panel + ${VIEWS_NO_BADGE_SUPPORT.includes(this._type) ? html` -

+ ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_badges.panel_mode" + "ui.panel.lovelace.editor.edit_badges.view_no_badges" )} -

+ ` : ""}
@@ -408,10 +423,6 @@ export class HuiDialogEditView extends LitElement { margin: 12px 16px; flex-wrap: wrap; } - .warning { - color: var(--warning-color); - text-align: center; - } @media all and (min-width: 600px) { ha-dialog { diff --git a/src/panels/lovelace/editor/view-editor/hui-view-editor.ts b/src/panels/lovelace/editor/view-editor/hui-view-editor.ts index 7bbf791059..f290c8e9c2 100644 --- a/src/panels/lovelace/editor/view-editor/hui-view-editor.ts +++ b/src/panels/lovelace/editor/view-editor/hui-view-editor.ts @@ -9,6 +9,11 @@ import "../../../../components/ha-switch"; import { LovelaceViewConfig } from "../../../../data/lovelace"; import { HomeAssistant } from "../../../../types"; import "../../components/hui-theme-select-editor"; +import { + DEFAULT_VIEW_LAYOUT, + PANEL_VIEW_LAYOUT, + SIDEBAR_VIEW_LAYOUT, +} from "../../views/const"; import { configElementStyle } from "../config-elements/config-elements-style"; import { EditorTarget } from "../types"; @@ -60,9 +65,11 @@ export class HuiViewEditor extends LitElement { get _type(): string { if (!this._config) { - return "masonry"; + return DEFAULT_VIEW_LAYOUT; } - return this._config.panel ? "panel" : this._config.type || "masonry"; + return this._config.panel + ? PANEL_VIEW_LAYOUT + : this._config.type || DEFAULT_VIEW_LAYOUT; } set config(config: LovelaceViewConfig) { @@ -125,7 +132,7 @@ export class HuiViewEditor extends LitElement { attr-for-selected="type" @iron-select=${this._typeChanged} > - ${["masonry", "sidebar", "panel"].map( + ${[DEFAULT_VIEW_LAYOUT, SIDEBAR_VIEW_LAYOUT, PANEL_VIEW_LAYOUT].map( (type) => html` ${this.hass.localize( `ui.panel.lovelace.editor.edit_view.types.${type}` diff --git a/src/panels/lovelace/views/const.ts b/src/panels/lovelace/views/const.ts new file mode 100644 index 0000000000..5cc4709bbb --- /dev/null +++ b/src/panels/lovelace/views/const.ts @@ -0,0 +1,4 @@ +export const DEFAULT_VIEW_LAYOUT = "masonry"; +export const PANEL_VIEW_LAYOUT = "panel"; +export const SIDEBAR_VIEW_LAYOUT = "sidebar"; +export const VIEWS_NO_BADGE_SUPPORT = [PANEL_VIEW_LAYOUT, SIDEBAR_VIEW_LAYOUT]; diff --git a/src/panels/lovelace/views/hui-view.ts b/src/panels/lovelace/views/hui-view.ts index 53b3394483..685adce5c9 100644 --- a/src/panels/lovelace/views/hui-view.ts +++ b/src/panels/lovelace/views/hui-view.ts @@ -20,9 +20,7 @@ import { showEditCardDialog } from "../editor/card-editor/show-edit-card-dialog" import { confDeleteCard } from "../editor/delete-card"; import { generateLovelaceViewStrategy } from "../strategies/get-strategy"; import type { Lovelace, LovelaceBadge, LovelaceCard } from "../types"; - -const DEFAULT_VIEW_LAYOUT = "masonry"; -const PANEL_VIEW_LAYOUT = "panel"; +import { PANEL_VIEW_LAYOUT, DEFAULT_VIEW_LAYOUT } from "./const"; declare global { // for fire event @@ -131,6 +129,18 @@ export class HUIView extends ReactiveElement { }); this._layoutElement.hass = this.hass; + + const oldHass = changedProperties.get("hass") as + | this["hass"] + | undefined; + + if ( + !oldHass || + this.hass.themes !== oldHass.themes || + this.hass.selectedTheme !== oldHass.selectedTheme + ) { + applyThemesOnElement(this, this.hass.themes, this._viewConfigTheme); + } } if (changedProperties.has("narrow")) { this._layoutElement.narrow = this.narrow; @@ -145,17 +155,6 @@ export class HUIView extends ReactiveElement { this._layoutElement.badges = this._badges; } } - - const oldHass = changedProperties.get("hass") as this["hass"] | undefined; - - if ( - changedProperties.has("hass") && - (!oldHass || - this.hass.themes !== oldHass.themes || - this.hass.selectedTheme !== oldHass.selectedTheme) - ) { - applyThemesOnElement(this, this.hass.themes, this._viewConfigTheme); - } } private async _initializeConfig() { diff --git a/src/translations/en.json b/src/translations/en.json index c7848aa034..29ca709567 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -700,7 +700,7 @@ "control": "Control", "related": "Related", "dismiss": "Dismiss", - "no_unique_id": "This entity (\"{entity_id}\") does not have a unique ID, therefore its settings cannot be managed from the UI. See the {faq_link} for more detail.", + "no_unique_id": "This entity (''{entity_id}'') does not have a unique ID, therefore its settings cannot be managed from the UI. See the {faq_link} for more detail.", "faq": "documentation", "info_customize": "You can overwrite some attributes in the {customize_link} section.", "customize_link": "entity customizations", @@ -873,12 +873,12 @@ "config": { "no_type_provided": "No type provided.", "error_detected": "Configuration errors detected", - "editor_not_available": "No visual editor available for type \"{type}\".", + "editor_not_available": "No visual editor available for type ''{type}''.", "editor_not_supported": "Visual editor is not supported for this configuration", "edit_in_yaml_supported": "You can still edit your config in YAML.", - "key_missing": "Required key \"{key}\" is missing.", - "key_not_expected": "Key \"{key}\" is not expected or not supported by the visual editor.", - "key_wrong_type": "The provided value for \"{key}\" is not supported by the visual editor. We support ({type_correct}) but received ({type_wrong}).", + "key_missing": "Required key ''{key}'' is missing.", + "key_not_expected": "Key ''{key}'' is not expected or not supported by the visual editor.", + "key_wrong_type": "The provided value for ''{key}'' is not supported by the visual editor. We support ({type_correct}) but received ({type_wrong}).", "no_template_editor_support": "Templates not supported in visual editor" }, "supervisor": { @@ -1765,7 +1765,7 @@ }, "add": { "header": "Import a blueprint", - "import_header": "Blueprint \"{name}\"", + "import_header": "Blueprint ''{name}''", "import_introduction_link": "You can import blueprints of other users from Github and the {community_link}. Enter the URL of the blueprint below.", "community_forums": "community forums", "url": "URL of the blueprint", @@ -2884,7 +2884,7 @@ "cards": { "confirm_delete": "Are you sure you want to delete this card?", "actions": { - "action_confirmation": "Are you sure you want to run action \"{action}\"?", + "action_confirmation": "Are you sure you want to run action ''{action}''?", "no_entity_more_info": "No entity provided for more info dialog", "no_entity_toggle": "No entity provided to toggle", "no_navigation_path": "No navigation path specified", @@ -3016,7 +3016,7 @@ } }, "edit_badges": { - "panel_mode": "These badges will not be displayed because this view is in \"Panel Mode\"." + "view_no_badges": "Badges are not be supported by the current view type." }, "edit_card": { "header": "Card Configuration", From 0cbac8bb44563b4eaadf6eea288596467d9d7d6c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 1 Sep 2021 16:23:41 +0200 Subject: [PATCH 04/67] Polyfill `Array.flat` (#9917) --- src/entrypoints/core.ts | 1 + src/resources/array.flat.polyfill.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/resources/array.flat.polyfill.ts diff --git a/src/entrypoints/core.ts b/src/entrypoints/core.ts index 964c2ca99c..3ba33d23b7 100644 --- a/src/entrypoints/core.ts +++ b/src/entrypoints/core.ts @@ -23,6 +23,7 @@ import { subscribePanels } from "../data/ws-panels"; import { subscribeThemes } from "../data/ws-themes"; import { subscribeUser } from "../data/ws-user"; import type { ExternalAuth } from "../external_app/external_auth"; +import "../resources/array.flat.polyfill"; import "../resources/safari-14-attachshadow-patch"; import { HomeAssistant } from "../types"; import { MAIN_WINDOW_NAME } from "../data/main_window"; diff --git a/src/resources/array.flat.polyfill.ts b/src/resources/array.flat.polyfill.ts new file mode 100644 index 0000000000..ad36844222 --- /dev/null +++ b/src/resources/array.flat.polyfill.ts @@ -0,0 +1,26 @@ +/* eslint-disable no-extend-native */ +// @ts-expect-error +if (!Array.prototype.flat) { + Object.defineProperty(Array.prototype, "flat", { + configurable: true, + writable: true, + value: function (...args) { + const depth = typeof args[0] === "undefined" ? 1 : Number(args[0]) || 0; + const result = []; + const forEach = result.forEach; + + const flatDeep = (arr: Array, dpth: number) => { + forEach.call(arr, (val) => { + if (dpth > 0 && Array.isArray(val)) { + flatDeep(val, dpth - 1); + } else { + result.push(val); + } + }); + }; + + flatDeep(this, depth); + return result; + }, + }); +} From 1692f9c2dd3ebecba9de60f6782ac5cb66b48dad Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 2 Sep 2021 00:40:51 +0200 Subject: [PATCH 05/67] Change message to info alert (#9930) --- src/components/ha-alert.ts | 3 ++- src/panels/config/energy/ha-config-energy.ts | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/ha-alert.ts b/src/components/ha-alert.ts index a06f74b6be..b9468a8b92 100644 --- a/src/components/ha-alert.ts +++ b/src/components/ha-alert.ts @@ -5,6 +5,7 @@ import { mdiAlertOutline, mdiCheckboxMarkedCircleOutline, mdiClose, + mdiInformationOutline, } from "@mdi/js"; import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; @@ -13,7 +14,7 @@ import { fireEvent } from "../common/dom/fire_event"; import "./ha-svg-icon"; const ALERT_ICONS = { - info: mdiAlertCircleOutline, + info: mdiInformationOutline, warning: mdiAlertOutline, error: mdiAlertCircleOutline, success: mdiCheckboxMarkedCircleOutline, diff --git a/src/panels/config/energy/ha-config-energy.ts b/src/panels/config/energy/ha-config-energy.ts index c1b6a28c3a..5598aaaf3f 100644 --- a/src/panels/config/energy/ha-config-energy.ts +++ b/src/panels/config/energy/ha-config-energy.ts @@ -13,6 +13,7 @@ import "../../../layouts/hass-loading-screen"; import "../../../layouts/hass-tabs-subpage"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant, Route } from "../../../types"; +import "../../../components/ha-alert"; import { configSections } from "../ha-panel-config"; import "./components/ha-energy-device-settings"; import "./components/ha-energy-grid-settings"; @@ -77,12 +78,10 @@ class HaConfigEnergy extends LitElement { .route=${this.route} .tabs=${configSections.experiences} > - -
- After setting up a new device, it can take up to 2 hours for new - data to arrive in your energy dashboard. -
-
+ + After setting up a new device, it can take up to 2 hours for new data + to arrive in your energy dashboard. +
Date: Thu, 2 Sep 2021 22:13:11 +0200 Subject: [PATCH 06/67] Fix removeBackup function after 2021.9 (#9938) --- src/data/hassio/backup.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/data/hassio/backup.ts b/src/data/hassio/backup.ts index 69771eb363..b19d4c1c66 100644 --- a/src/data/hassio/backup.ts +++ b/src/data/hassio/backup.ts @@ -159,9 +159,11 @@ export const removeBackup = async (hass: HomeAssistant, slug: string) => { await hass.callWS({ type: "supervisor/api", endpoint: `/${ - atLeastVersion(hass.config.version, 2021, 9) ? "backups" : "snapshots" - }/${slug}/remove`, - method: "post", + atLeastVersion(hass.config.version, 2021, 9) + ? `backups/${slug}` + : `snapshots/${slug}/remove` + }`, + method: atLeastVersion(hass.config.version, 2021, 9) ? "delete" : "post", }); return; } From 5e3487ed593bcf715949027fcf405782b5b03578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 3 Sep 2021 11:56:30 +0200 Subject: [PATCH 07/67] Don't build wheels for alpine 3.13 (#9944) --- .github/workflows/release.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 67c22f11a3..74d8e13eda 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -73,7 +73,6 @@ jobs: matrix: arch: ["aarch64", "armhf", "armv7", "amd64", "i386"] tag: - - "3.9-alpine3.13" - "3.9-alpine3.14" steps: - name: Download requirements.txt From 61c8d23a7eaae92d9d53b158c50712df68c3f368 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 3 Sep 2021 19:55:10 +0200 Subject: [PATCH 08/67] Bunch of minor non breaking dep bumps (#9945) --- package.json | 75 ++-- src/data/iconsets.ts | 18 +- yarn.lock | 797 ++++++++++++++++++++++--------------------- 3 files changed, 440 insertions(+), 450 deletions(-) diff --git a/package.json b/package.json index 796cc0fcf0..3d4a638eb7 100644 --- a/package.json +++ b/package.json @@ -22,26 +22,26 @@ "author": "Paulus Schoutsen (http://paulusschoutsen.nl)", "license": "Apache-2.0", "dependencies": { - "@braintree/sanitize-url": "^5.0.1", - "@codemirror/commands": "^0.18.0", - "@codemirror/gutter": "^0.18.0", - "@codemirror/highlight": "^0.18.0", - "@codemirror/history": "^0.18.0", - "@codemirror/legacy-modes": "^0.18.0", - "@codemirror/rectangular-selection": "^0.18.0", - "@codemirror/search": "^0.18.0", - "@codemirror/state": "^0.18.0", - "@codemirror/stream-parser": "^0.18.0", - "@codemirror/text": "^0.18.0", - "@codemirror/view": "^0.18.0", - "@formatjs/intl-getcanonicallocales": "^1.5.10", - "@formatjs/intl-locale": "^2.4.28", - "@formatjs/intl-pluralrules": "^4.0.22", - "@fullcalendar/common": "5.1.0", - "@fullcalendar/core": "5.1.0", - "@fullcalendar/daygrid": "5.1.0", - "@fullcalendar/interaction": "5.1.0", - "@fullcalendar/list": "5.1.0", + "@braintree/sanitize-url": "^5.0.2", + "@codemirror/commands": "^0.19.2", + "@codemirror/gutter": "^0.19.1", + "@codemirror/highlight": "^0.19.2", + "@codemirror/history": "^0.19.0", + "@codemirror/legacy-modes": "^0.19.0", + "@codemirror/rectangular-selection": "^0.19.0", + "@codemirror/search": "^0.19.0", + "@codemirror/state": "^0.19.1", + "@codemirror/stream-parser": "^0.19.1", + "@codemirror/text": "^0.19.2", + "@codemirror/view": "^0.19.4", + "@formatjs/intl-getcanonicallocales": "^1.7.3", + "@formatjs/intl-locale": "^2.4.37", + "@formatjs/intl-pluralrules": "^4.1.3", + "@fullcalendar/common": "5.9.0", + "@fullcalendar/core": "5.9.0", + "@fullcalendar/daygrid": "5.9.0", + "@fullcalendar/interaction": "5.9.0", + "@fullcalendar/list": "5.9.0", "@lit-labs/virtualizer": "patch:@lit-labs/virtualizer@0.6.0#./.yarn/patches/@lit-labs/virtualizer/0.7.0.patch", "@material/chips": "12.0.0-canary.22d29cbb4.0", "@material/data-table": "12.0.0-canary.22d29cbb4.0", @@ -89,8 +89,8 @@ "@polymer/paper-tooltip": "^3.0.1", "@polymer/polymer": "3.4.1", "@thomasloven/round-slider": "0.5.4", - "@vaadin/vaadin-combo-box": "^20.0.1", - "@vaadin/vaadin-date-picker": "^20.0.1", + "@vaadin/vaadin-combo-box": "^20.0.4", + "@vaadin/vaadin-date-picker": "^20.0.4", "@vibrant/color": "^3.2.1-alpha.1", "@vibrant/core": "^3.2.1-alpha.1", "@vibrant/quantizer-mmcq": "^3.2.1-alpha.1", @@ -99,36 +99,35 @@ "chart.js": "^3.3.2", "comlink": "^4.3.1", "core-js": "^3.15.2", - "cropperjs": "^1.5.11", - "date-fns": "^2.22.1", + "cropperjs": "^1.5.12", + "date-fns": "^2.23.0", "deep-clone-simple": "^1.1.1", "deep-freeze": "^0.0.1", "fecha": "^4.2.0", "fuse.js": "^6.0.0", "google-timezones-json": "^1.0.2", - "hls.js": "^1.0.7", + "hls.js": "^1.0.10", "home-assistant-js-websocket": "^5.11.1", - "idb-keyval": "^5.0.5", - "intl-messageformat": "^9.6.16", + "idb-keyval": "^5.1.3", + "intl-messageformat": "^9.9.1", "js-yaml": "^4.1.0", "leaflet": "^1.7.1", "leaflet-draw": "^1.0.4", "lit": "^2.0.0-rc.3", "lit-vaadin-helpers": "^0.1.3", - "marked": "^2.0.5", - "mdn-polyfills": "^5.16.0", + "marked": "^3.0.2", "memoize-one": "^5.2.1", "node-vibrant": "3.2.1-alpha.1", - "proxy-polyfill": "^0.3.1", + "proxy-polyfill": "^0.3.2", "punycode": "^2.1.1", "qrcode": "^1.4.4", "regenerator-runtime": "^0.13.8", "resize-observer-polyfill": "^1.5.1", "roboto-fontface": "^0.10.0", - "sortablejs": "^1.10.2", + "sortablejs": "^1.14.0", "superstruct": "^0.15.2", "tinykeys": "^1.1.3", - "tsparticles": "^1.19.2", + "tsparticles": "^1.34.0", "unfetch": "^4.1.0", "vis-data": "^7.1.2", "vis-network": "^8.5.4", @@ -164,12 +163,12 @@ "@rollup/plugin-replace": "^2.3.2", "@types/chromecast-caf-receiver": "5.0.12", "@types/chromecast-caf-sender": "^1.0.3", - "@types/js-yaml": "^4.0.1", - "@types/leaflet": "^1.7.0", - "@types/leaflet-draw": "^1.0.3", - "@types/marked": "^2.0.3", - "@types/mocha": "^8.2.2", - "@types/sortablejs": "^1.10.6", + "@types/js-yaml": "^4", + "@types/leaflet": "^1", + "@types/leaflet-draw": "^1", + "@types/marked": "^2", + "@types/mocha": "^8", + "@types/sortablejs": "^1", "@types/webspeechapi": "^0.0.29", "@typescript-eslint/eslint-plugin": "^4.28.3", "@typescript-eslint/parser": "^4.28.3", diff --git a/src/data/iconsets.ts b/src/data/iconsets.ts index 5205a1bbed..c2733641a0 100644 --- a/src/data/iconsets.ts +++ b/src/data/iconsets.ts @@ -2,7 +2,6 @@ import { clear, get, set, createStore, promisifyRequest } from "idb-keyval"; import { promiseTimeout } from "../common/util/promise-timeout"; import { iconMetadata } from "../resources/icon-metadata"; import { IconMeta } from "../types"; -import { isSafari } from "../util/is_safari"; export interface Icons { [key: string]: string; @@ -39,22 +38,7 @@ export const getIcon = (iconName: string) => toRead = []; }); - let readIconPromise: Promise; - - if (isSafari && (indexedDB as any).databases) { - let intervalId: number; - readIconPromise = new Promise((resolveTry) => { - const tryIdb = () => (indexedDB as any).databases().finally(resolveTry); - intervalId = window.setInterval(tryIdb, 100); - tryIdb(); - }) - .then(() => readIcons()) - .finally(() => clearInterval(intervalId)); - } else { - readIconPromise = readIcons(); - } - - promiseTimeout(1000, readIconPromise).catch((e) => { + promiseTimeout(1000, readIcons()).catch((e) => { // Firefox in private mode doesn't support IDB // Safari sometime doesn't open the DB so we time out for (const [, , reject_] of toRead) { diff --git a/yarn.lock b/yarn.lock index e1248e0889..ded2e47538 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1308,180 +1308,180 @@ __metadata: languageName: node linkType: hard -"@braintree/sanitize-url@npm:^5.0.1": +"@braintree/sanitize-url@npm:^5.0.2": version: 5.0.2 resolution: "@braintree/sanitize-url@npm:5.0.2" checksum: 16a022d29d584f96f6982443946668bddd2d900140c0b56316bafb17cc2d50bc4b5423104847bd33564c4ec0104bcda71ceb81258928afe60fb9bb35c23ee590 languageName: node linkType: hard -"@codemirror/commands@npm:^0.18.0": - version: 0.18.3 - resolution: "@codemirror/commands@npm:0.18.3" +"@codemirror/commands@npm:^0.19.2": + version: 0.19.2 + resolution: "@codemirror/commands@npm:0.19.2" dependencies: - "@codemirror/language": ^0.18.0 - "@codemirror/matchbrackets": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer-tree: ^0.13.0 - checksum: 058dd0366cf543c4cd104abc0b824f765919314de83fa35422d32bae26f08d9a28a29a85854e17636ad5256f6e3fcf796fb1f442c240dc384022992632bcf9ec + "@codemirror/language": ^0.19.0 + "@codemirror/matchbrackets": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/text": ^0.19.0 + "@codemirror/view": ^0.19.0 + "@lezer/common": ^0.15.0 + checksum: 05e25fd615414b8bdcec11c3aa1481103018428714eab485560c7157b4b2bade04cca9d16236570e9f3ee8b2b11a0a6d82073e89f353015d3875b8fb13aa14ba languageName: node linkType: hard -"@codemirror/gutter@npm:^0.18.0": - version: 0.18.4 - resolution: "@codemirror/gutter@npm:0.18.4" +"@codemirror/gutter@npm:^0.19.1": + version: 0.19.1 + resolution: "@codemirror/gutter@npm:0.19.1" dependencies: - "@codemirror/rangeset": ^0.18.3 - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - checksum: 51f68d69ab1ffcdb9707df982d6c7f3ff2c9632a4190a9a8265bfe898b8fa9e6526aa4c336e004e7df781237574a34b9ed675e63db88bd59b489b0058d647e98 + "@codemirror/rangeset": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/view": ^0.19.0 + checksum: a3baa1c48756d0687f592fb1535d3f8f2bc6b1b0d173d4487b0086193419bd295e9378cb5adbc0ec91b3ebb047891e22fcd03591af4673d5a417813d3002d61c languageName: node linkType: hard -"@codemirror/highlight@npm:^0.18.0": - version: 0.18.3 - resolution: "@codemirror/highlight@npm:0.18.3" +"@codemirror/highlight@npm:^0.19.0, @codemirror/highlight@npm:^0.19.2": + version: 0.19.2 + resolution: "@codemirror/highlight@npm:0.19.2" dependencies: - "@codemirror/language": ^0.18.0 - "@codemirror/rangeset": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer-tree: ^0.13.0 + "@codemirror/language": ^0.19.0 + "@codemirror/rangeset": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/view": ^0.19.0 + "@lezer/common": ^0.15.0 style-mod: ^4.0.0 - checksum: 6096d67af9af3c98f7bdba91aa5ea5907698b351ee74b99d76212e1972a46aefa11f2af7e241af8b28b24aa7b069c3d9483b63656595f645ad2b8ade7bcdf8ba + checksum: dc74758a77b82a3819ce907365c69c240fb146d1490ee43a79abccb9d9db8609fbd9e3dfbe125b7a40ff9543f26d3c884ead3bb46170c31c911c3ca8a1350129 languageName: node linkType: hard -"@codemirror/history@npm:^0.18.0": - version: 0.18.1 - resolution: "@codemirror/history@npm:0.18.1" +"@codemirror/history@npm:^0.19.0": + version: 0.19.0 + resolution: "@codemirror/history@npm:0.19.0" dependencies: - "@codemirror/state": ^0.18.3 - "@codemirror/view": ^0.18.0 - checksum: f17f10da78058d466b97de6ee9c15eecc4665363c9b38decf50f260971a85555f64f3bd7e3ac29cee05ad435fd0480861a62c84a615fdf1353aa4fe92915fd28 + "@codemirror/state": ^0.19.0 + "@codemirror/view": ^0.19.0 + checksum: 862616f482913b765099a5c047ade694e43f7ec1a9cab9532b8b69607ee47fdf629adfe20d8f164e40f72ce8a902c43133c1bc4f890793da3028184fcb892f46 languageName: node linkType: hard -"@codemirror/language@npm:^0.18.0": - version: 0.18.1 - resolution: "@codemirror/language@npm:0.18.1" +"@codemirror/language@npm:^0.19.0": + version: 0.19.2 + resolution: "@codemirror/language@npm:0.19.2" dependencies: - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer: ^0.13.4 - lezer-tree: ^0.13.0 - checksum: 1bcbb3be60c458e16be1a24a17478e0abd19d4b0ae177e46e42bcb5fad7ddea13a76fe2cd3a66de94aa5174a1d9d1bc0a99af3cb229783fe3b12fd3eee79107f + "@codemirror/state": ^0.19.0 + "@codemirror/text": ^0.19.0 + "@codemirror/view": ^0.19.0 + "@lezer/common": ^0.15.0 + "@lezer/lr": ^0.15.0 + checksum: 983d1ffe0173a66c4bddce79be8eb40a88e7c4dca93b3043fbd9527f4398e694183760829c147d652a45a35d69f47143698417446fea74e77b34962a9ac73fc9 languageName: node linkType: hard -"@codemirror/legacy-modes@npm:^0.18.0": - version: 0.18.1 - resolution: "@codemirror/legacy-modes@npm:0.18.1" +"@codemirror/legacy-modes@npm:^0.19.0": + version: 0.19.0 + resolution: "@codemirror/legacy-modes@npm:0.19.0" dependencies: - "@codemirror/stream-parser": ^0.18.0 - checksum: 39dfff4713ee006eb4f11a6a4b0402787b7646e5704c0bf2cd5a6cab360897b8eadcb06dd32570ea7d3437dd3edc520a63ecb88d8dbfb0682356683073285abd + "@codemirror/stream-parser": ^0.19.0 + checksum: 60f761d7a7c5e33205458b00f2a23fd1bb31ca972a0c38d6a3f5d702e105374758a41520ec24236e39648af351f9230e7353a1f11d6317cf6cb5f9a1b18c77aa languageName: node linkType: hard -"@codemirror/matchbrackets@npm:^0.18.0": - version: 0.18.0 - resolution: "@codemirror/matchbrackets@npm:0.18.0" +"@codemirror/matchbrackets@npm:^0.19.0": + version: 0.19.1 + resolution: "@codemirror/matchbrackets@npm:0.19.1" dependencies: - "@codemirror/language": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - lezer-tree: ^0.13.0 - checksum: bf7a7003347f6b09ffba5eb134297995cdacab96d875af7e0837aee55b3d3667cf090998c74148fba72c283cb3970dad0f8fb4cce99ab144f8dcf568629150cf + "@codemirror/language": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/view": ^0.19.0 + "@lezer/common": ^0.15.0 + checksum: a282c857495488e9f06ecd71d1d5533004b36bd0d67d82d37230f697367c019bfda9e71d3df08aa7a0793f353cefa235708d1aacaf7a839282cc201e15e2984c languageName: node linkType: hard -"@codemirror/panel@npm:^0.18.1": - version: 0.18.1 - resolution: "@codemirror/panel@npm:0.18.1" +"@codemirror/panel@npm:^0.19.0": + version: 0.19.0 + resolution: "@codemirror/panel@npm:0.19.0" dependencies: - "@codemirror/state": ^0.18.0 - "@codemirror/view": ^0.18.0 - checksum: a10c67392a29c9e3464fce39aee9033dfb9ba8da46d1cfff411c367f40e9616ce7fe22470ae8d07fcf45f0ffd4f88828aae72cfe701966f124b28e39dbf5832a + "@codemirror/state": ^0.19.0 + "@codemirror/view": ^0.19.0 + checksum: f92e6957407ec7afb404b6d97f02b21a8ba8283d3cbb805796c68d7f77987de94e36afb05dda72674be54ab87d2b8d7e13ff1733c548ed92047c65453877079c languageName: node linkType: hard -"@codemirror/rangeset@npm:^0.18.0, @codemirror/rangeset@npm:^0.18.3": - version: 0.18.4 - resolution: "@codemirror/rangeset@npm:0.18.4" +"@codemirror/rangeset@npm:^0.19.0": + version: 0.19.1 + resolution: "@codemirror/rangeset@npm:0.19.1" dependencies: - "@codemirror/state": ^0.18.0 - checksum: a478558193c6918de8810a1cbf79b398a4d03a4de7c5a3b428231d19a0710ce8566d045eb7c607843b147116a459195de225ad60fe627e8d5982786a24c23df9 + "@codemirror/state": ^0.19.0 + checksum: 0548736c04513fea850c4091696f7a0a9f23fad73adc6c913bbb273f78c1ee602a19044955d3279e1861e4a32a6826d53099cf5aa31781654fe118523230d763 languageName: node linkType: hard -"@codemirror/rectangular-selection@npm:^0.18.0": - version: 0.18.0 - resolution: "@codemirror/rectangular-selection@npm:0.18.0" +"@codemirror/rectangular-selection@npm:^0.19.0": + version: 0.19.0 + resolution: "@codemirror/rectangular-selection@npm:0.19.0" dependencies: - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 - "@codemirror/view": ^0.18.0 - checksum: ddde9fc70c99d290153edda8db89731ff141a1ebf63fc433844c1c92199276956329433c0d539b3d5627a064131408108c005ac316019058f7085935e27756ff + "@codemirror/state": ^0.19.0 + "@codemirror/text": ^0.19.0 + "@codemirror/view": ^0.19.0 + checksum: 956a48dcff8285e1e3ff56593b4fc9e2936090057740ada2ae176aee2a66a8afa2becbebe9497c0d3a73dbd9107f0af3712cd8f945ee352ba6adc39b55af77e2 languageName: node linkType: hard -"@codemirror/search@npm:^0.18.0": - version: 0.18.4 - resolution: "@codemirror/search@npm:0.18.4" +"@codemirror/search@npm:^0.19.0": + version: 0.19.0 + resolution: "@codemirror/search@npm:0.19.0" dependencies: - "@codemirror/panel": ^0.18.1 - "@codemirror/rangeset": ^0.18.0 - "@codemirror/state": ^0.18.6 - "@codemirror/text": ^0.18.0 - "@codemirror/view": ^0.18.0 + "@codemirror/panel": ^0.19.0 + "@codemirror/rangeset": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/text": ^0.19.0 + "@codemirror/view": ^0.19.0 crelt: ^1.0.5 - checksum: 0df286a1530389f2a615998bad97f2c50bbeade116e55c97505a96c979be74ad46c0d65280e955e56b02ae68d248ce95d3a2e4135428a514e32dfce0eaeca94d + checksum: e39ad2a425cb62af8a27a0f6fb96ac5e83d29667c6cd1d8bba0869d5eefcae3490625f562bba1ecb66df2b42b5998377aea4de752fd18cf39c00a2a8c844a175 languageName: node linkType: hard -"@codemirror/state@npm:^0.18.0, @codemirror/state@npm:^0.18.3, @codemirror/state@npm:^0.18.6": - version: 0.18.7 - resolution: "@codemirror/state@npm:0.18.7" +"@codemirror/state@npm:^0.19.0, @codemirror/state@npm:^0.19.1": + version: 0.19.1 + resolution: "@codemirror/state@npm:0.19.1" dependencies: - "@codemirror/text": ^0.18.0 - checksum: 8eaaa0b222053780dd6053045689de025d736f86eca6fa26fcfac0f04de1544e5f03a013de1acacea58290158281a3868fbd0b25422e23c335d9b098fa83ad31 + "@codemirror/text": ^0.19.0 + checksum: b16064b77e55e04caf54674dac6c08412e020fe2c54e869bb453f740a43f5048b168da35ebeacd45e99a5c1471fac8a3bf127b78628b741c8c1b8e578764e5ee languageName: node linkType: hard -"@codemirror/stream-parser@npm:^0.18.0": - version: 0.18.2 - resolution: "@codemirror/stream-parser@npm:0.18.2" +"@codemirror/stream-parser@npm:^0.19.0, @codemirror/stream-parser@npm:^0.19.1": + version: 0.19.1 + resolution: "@codemirror/stream-parser@npm:0.19.1" dependencies: - "@codemirror/highlight": ^0.18.0 - "@codemirror/language": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 - lezer: ^0.13.0 - lezer-tree: ^0.13.0 - checksum: 3ea5c3717b7979c186dac9a3bf04cab74f6c4e8c746634a4821d54ce76588ebbf8290105993693edca8cc37786d9eaae890a33980e326aba6fbe5bdbe45fe340 + "@codemirror/highlight": ^0.19.0 + "@codemirror/language": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/text": ^0.19.0 + "@lezer/common": ^0.15.0 + "@lezer/lr": ^0.15.0 + checksum: 495742e9d3c6000714a64163c85d4a058244d89aa00081ba2ff8b404f9ad9c756441e152a30aaa89860e185ea09a5b3c5fb7cf9a73e8f3ae8cd642cc25d7e37c languageName: node linkType: hard -"@codemirror/text@npm:^0.18.0": - version: 0.18.0 - resolution: "@codemirror/text@npm:0.18.0" - checksum: da2f9555fcd0072d9fc21c5656aa69fdc3512296877e0dba1cbe105de96b9263308aa232da3e7a16c4bfccf33e64b65bf9ce9f152a1c4243aa300fb7fe70812c +"@codemirror/text@npm:^0.19.0, @codemirror/text@npm:^0.19.2": + version: 0.19.2 + resolution: "@codemirror/text@npm:0.19.2" + checksum: 62487297fb147f9bf0c689f9ed86f3c696d6e07c4bb6da6e4d2cc39f8e16d0b85d61f502b052e2e2513d014eeb06b384f2a104191400f3678872f05c2ecd2125 languageName: node linkType: hard -"@codemirror/view@npm:^0.18.0": - version: 0.18.11 - resolution: "@codemirror/view@npm:0.18.11" +"@codemirror/view@npm:^0.19.0, @codemirror/view@npm:^0.19.4": + version: 0.19.4 + resolution: "@codemirror/view@npm:0.19.4" dependencies: - "@codemirror/rangeset": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/text": ^0.18.0 + "@codemirror/rangeset": ^0.19.0 + "@codemirror/state": ^0.19.0 + "@codemirror/text": ^0.19.0 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 9cb61e477482592bfe12de7282e300c31c69b106ac8b5670cddf33e85c643927649204738e9e2843750f32fb06ca1409c5eb14331699a88daf743057a7f58ba7 + checksum: a2d8a07807d349fde359511f8561ed0495322df3d5c35173bf6ef191f17e6d1f604d7482560f3610e238a8ca7f92d4ea54f454a3b4080a193bc887d489f2ba94 languageName: node linkType: hard @@ -1509,122 +1509,135 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:1.9.1": - version: 1.9.1 - resolution: "@formatjs/ecma402-abstract@npm:1.9.1" +"@formatjs/ecma402-abstract@npm:1.9.8": + version: 1.9.8 + resolution: "@formatjs/ecma402-abstract@npm:1.9.8" + dependencies: + "@formatjs/intl-localematcher": 0.2.20 + tslib: ^2.1.0 + checksum: 3d6cd26f1f269cb8cb22f2b313c67de8c50482cabc1b67da12907fc10b083ecafc354b4298670761f7cba69839bea1f6f27fd0f983189a1ad4cff18a2643b227 + languageName: node + linkType: hard + +"@formatjs/fast-memoize@npm:1.2.0": + version: 1.2.0 + resolution: "@formatjs/fast-memoize@npm:1.2.0" dependencies: tslib: ^2.1.0 - checksum: 79ffa9abfbe999d3c55e672ec9edd4434da772298d107ea7d88a6df327d26390c74068b2c1d632325aae97d2f0fcd9c301ee0a7b4da251535eeccad967b4d569 + checksum: 9b01873c6a41f4b256441e549ee2faba1bb620fc8d3121e61c0b743fb03f2175473d7e35eab718e4bb7613d9137c1e1a02992bd48374a209b0ccaf542757e410 languageName: node linkType: hard -"@formatjs/fast-memoize@npm:1.1.1": - version: 1.1.1 - resolution: "@formatjs/fast-memoize@npm:1.1.1" - checksum: 8c607b2b93f5f9ee592b11ebed1978fd02c29cf1f9619863e4819c4b66c575927677d8bc66d4bf0a4af6b84b20c3fee5084c72fd63663cb3227022a892d9e54c - languageName: node - linkType: hard - -"@formatjs/icu-messageformat-parser@npm:2.0.4": - version: 2.0.4 - resolution: "@formatjs/icu-messageformat-parser@npm:2.0.4" +"@formatjs/icu-messageformat-parser@npm:2.0.11": + version: 2.0.11 + resolution: "@formatjs/icu-messageformat-parser@npm:2.0.11" dependencies: - "@formatjs/ecma402-abstract": 1.9.1 - "@formatjs/icu-skeleton-parser": 1.2.5 + "@formatjs/ecma402-abstract": 1.9.8 + "@formatjs/icu-skeleton-parser": 1.2.12 tslib: ^2.1.0 - checksum: b0dd60bcd1c4b68a30ea705eb749f96a78f91ee0c60e74360af3bf830d0ec24df83dbeb17a0dbc86723e02227941cfdbdce55f07c8c5381a183e4a715a7e2f51 + checksum: 4a5259a35c5d9a24d1f33d549faef40c8bb465a4e7a66101f82324ded24b8efd456ad8affa6be9a89613cbaedfb91a2b35073cfe655a5b13855135854db78350 languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.2.5": - version: 1.2.5 - resolution: "@formatjs/icu-skeleton-parser@npm:1.2.5" +"@formatjs/icu-skeleton-parser@npm:1.2.12": + version: 1.2.12 + resolution: "@formatjs/icu-skeleton-parser@npm:1.2.12" dependencies: - "@formatjs/ecma402-abstract": 1.9.1 + "@formatjs/ecma402-abstract": 1.9.8 tslib: ^2.1.0 - checksum: 1e6316f2f33bc454975fbd67ea186acf052cb4c8c551fe4fb19ff3e39dfdf63cdd3a8bc6a15e6c97d9362a03cf63e956d066faf58b5caf6af505b5cae223340b + checksum: 5f94e520046a334e08662809e8f0a84df070e4c3356d0352dd9b26545a63a15063965ffa5dcad478612f4073f2f539ddc57eb4082c1d7fb7257a5c394ad26587 languageName: node linkType: hard -"@formatjs/intl-getcanonicallocales@npm:1.7.0, @formatjs/intl-getcanonicallocales@npm:^1.5.10": - version: 1.7.0 - resolution: "@formatjs/intl-getcanonicallocales@npm:1.7.0" +"@formatjs/intl-getcanonicallocales@npm:1.7.3, @formatjs/intl-getcanonicallocales@npm:^1.7.3": + version: 1.7.3 + resolution: "@formatjs/intl-getcanonicallocales@npm:1.7.3" dependencies: - cldr-core: 38 tslib: ^2.1.0 - checksum: e15099254351362f491c71af1665ca38e41395e230ad9c950e7f36202d7e4e878e9ca3c54abbae1d9cb0746e8f6d6df1fbefde4f37edee264cb5386825554544 + peerDependencies: + "@types/node": 14 || 16 + checksum: bd19cd887f449d6c7c19a71459518b42e53c27664837588c612ecc63c9665e9cb0d3aa2a881f963f76ca03d47604a2dabe460efe9606df179845a927814d5b9b languageName: node linkType: hard -"@formatjs/intl-locale@npm:^2.4.28": - version: 2.4.28 - resolution: "@formatjs/intl-locale@npm:2.4.28" +"@formatjs/intl-locale@npm:^2.4.37": + version: 2.4.37 + resolution: "@formatjs/intl-locale@npm:2.4.37" dependencies: - "@formatjs/ecma402-abstract": 1.9.1 - "@formatjs/intl-getcanonicallocales": 1.7.0 - cldr-core: 38 + "@formatjs/ecma402-abstract": 1.9.8 + "@formatjs/intl-getcanonicallocales": 1.7.3 tslib: ^2.1.0 - checksum: 098b536d1a93c509fc9c26ec8cd038c0d85d832403a8a65c34b5f6035323533458ba5d0f47e2ebd2a59cebf3bd3f781c3a7b3b822a840e416c2af710067f0dd5 + checksum: 58c49b1659b97364b42384adfc35ee2fa02fee7e6deae123b4e1671da76dda2e19bbe8c12d1e6a6e4c93dbbc4cd912251a1f33d1e1c8800dd6c14019f4c1a9f9 languageName: node linkType: hard -"@formatjs/intl-pluralrules@npm:^4.0.22": - version: 4.0.22 - resolution: "@formatjs/intl-pluralrules@npm:4.0.22" +"@formatjs/intl-localematcher@npm:0.2.20": + version: 0.2.20 + resolution: "@formatjs/intl-localematcher@npm:0.2.20" dependencies: - "@formatjs/ecma402-abstract": 1.9.1 tslib: ^2.1.0 - checksum: 7b12933d7474a3b5d49028cc814adfddd0fcaa43000cbaaf79f3144ab4ff17e2a705f5674124a3a73cf9fcb7cfd6915151976673aa52e3e0c8914ab826c40921 + checksum: efd8558da57390388ac197db2f36efbb39bc9677b3152ce59a93ea039145499c3d24c585baf8aaa04112f42ff454147fb2e4d9b6ea122f527341489f54536787 languageName: node linkType: hard -"@fullcalendar/common@npm:5.1.0, @fullcalendar/common@npm:~5.1.0": - version: 5.1.0 - resolution: "@fullcalendar/common@npm:5.1.0" +"@formatjs/intl-pluralrules@npm:^4.1.3": + version: 4.1.3 + resolution: "@formatjs/intl-pluralrules@npm:4.1.3" dependencies: - tslib: ^2.0.0 - checksum: 25777a4ec8b397bb6adcb5d16e6eb2a313c155f8d91da754d81b0846773744d067a2b18c25c67beb77bb86a3fad5ad36d621efb6d66d4ff2dd34c7ec0df11dea + "@formatjs/ecma402-abstract": 1.9.8 + "@formatjs/intl-localematcher": 0.2.20 + tslib: ^2.1.0 + checksum: 8bf1146450a278cbbbc16febe89ba124e9f84e9411177afd6aa4568e78ffb3f4e6af10c935fe91d0dd4bf6fab212031efa6a80119bdf05f0cf62fddcaa570382 languageName: node linkType: hard -"@fullcalendar/core@npm:5.1.0": - version: 5.1.0 - resolution: "@fullcalendar/core@npm:5.1.0" +"@fullcalendar/common@npm:5.9.0, @fullcalendar/common@npm:~5.9.0": + version: 5.9.0 + resolution: "@fullcalendar/common@npm:5.9.0" dependencies: - "@fullcalendar/common": ~5.1.0 + tslib: ^2.1.0 + checksum: bc6b9877dba7a157157924c86451d1e58937ebe9d1081c325a0b089b9d2946082b82cb2a55a17540e772cd644c70ae25b40a46c3e09d7e4aa367fe34fdb94df3 + languageName: node + linkType: hard + +"@fullcalendar/core@npm:5.9.0": + version: 5.9.0 + resolution: "@fullcalendar/core@npm:5.9.0" + dependencies: + "@fullcalendar/common": ~5.9.0 preact: ^10.0.5 - tslib: ^2.0.0 - checksum: c1ac14a287265cbfaf81a2adfa2e42dbfa4c8ab261e18f884b436355ff30bdcf7f1c6f3c61ae429954bbba798d3c3bdc81a6f374a035bc971ad33c0e193fb35f + tslib: ^2.1.0 + checksum: 0cb2b34000c7fab2c5a3b5d2d70643565acb60114465211950e13accc79648fe9e1a9021b6eb64f2750ea763c20464549c75d3859e9ab13578372e40c89a9120 languageName: node linkType: hard -"@fullcalendar/daygrid@npm:5.1.0": - version: 5.1.0 - resolution: "@fullcalendar/daygrid@npm:5.1.0" +"@fullcalendar/daygrid@npm:5.9.0": + version: 5.9.0 + resolution: "@fullcalendar/daygrid@npm:5.9.0" dependencies: - "@fullcalendar/common": ~5.1.0 - tslib: ^2.0.0 - checksum: e6d8888db6bfae6fc43e5b40824cf8f44032f57b579ce928e655a6918cb610e67996c43a4e12857e40bf16284dc111c8a0948d626d7208824bee39a566c1a5f0 + "@fullcalendar/common": ~5.9.0 + tslib: ^2.1.0 + checksum: b8b1cef0d42f2949662b7b7e5c77e6891c5df37e3eb18271a06a7c180dc6051e16a2c22f7167541ebba8faf9185225ff89780a6bb3892ed9e2ba8cfd87bf4839 languageName: node linkType: hard -"@fullcalendar/interaction@npm:5.1.0": - version: 5.1.0 - resolution: "@fullcalendar/interaction@npm:5.1.0" +"@fullcalendar/interaction@npm:5.9.0": + version: 5.9.0 + resolution: "@fullcalendar/interaction@npm:5.9.0" dependencies: - "@fullcalendar/common": ~5.1.0 - tslib: ^2.0.0 - checksum: 721394104ad59fb3f1a58b52f4b01a0880c3d499be657f02087347e178a905e77bd1c96f60c20e94b04acec7fe4fb207a9dce4c5d7bb8778fba9f01876561ce0 + "@fullcalendar/common": ~5.9.0 + tslib: ^2.1.0 + checksum: 459d6c45ffb9c2bd686da46144f156b008f720e4aeaef2e9dddb22e6cf7fb4fe5d4c5c55807aa296dbfb1957f68647014d44a5c789a4867c590f03592477d57a languageName: node linkType: hard -"@fullcalendar/list@npm:5.1.0": - version: 5.1.0 - resolution: "@fullcalendar/list@npm:5.1.0" +"@fullcalendar/list@npm:5.9.0": + version: 5.9.0 + resolution: "@fullcalendar/list@npm:5.9.0" dependencies: - "@fullcalendar/common": ~5.1.0 - tslib: ^2.0.0 - checksum: a35f69441a1ffa8b553865c9123d8907d912edf4f54e90db15d92c8ea658a6c5c7b1168ede18a6337fc0cedd5a77cd824d521ed8bf7b458f0111ee4b139312f2 + "@fullcalendar/common": ~5.9.0 + tslib: ^2.1.0 + checksum: d5637b2217d2eacef4efc63cd7baf2d79e2202b29e29e1b758ba3fc85b47cb9b9157b84ac56791e73c79dafee16f772392392792eb69e0c3562bc14fe6d8548e languageName: node linkType: hard @@ -1847,6 +1860,22 @@ __metadata: languageName: node linkType: hard +"@lezer/common@npm:^0.15.0": + version: 0.15.4 + resolution: "@lezer/common@npm:0.15.4" + checksum: c27d08a62309ab55886620340dacb520d0c76b53757eaede0f6078d575bc4d4bf66a3e3385eb6ef6f1c08df86f5d6d49d47a72225609b477b2e14ae0f2c05b45 + languageName: node + linkType: hard + +"@lezer/lr@npm:^0.15.0": + version: 0.15.2 + resolution: "@lezer/lr@npm:0.15.2" + dependencies: + "@lezer/common": ^0.15.0 + checksum: d3cb73d72376b2db9e06c659c68d0c6023c293453229fd822f23d1209f7e43aa21732870e16253563ccb4185811ad39db09fb21a499351e49e184e4d2a9bee5a + languageName: node + linkType: hard + "@lit-labs/virtualizer@0.6.0": version: 0.6.0 resolution: "@lit-labs/virtualizer@npm:0.6.0" @@ -3632,9 +3661,9 @@ __metadata: linkType: hard "@types/geojson@npm:*": - version: 7946.0.7 - resolution: "@types/geojson@npm:7946.0.7" - checksum: b0a614f58a169069d9978af24c4b816bc7140a722829d8786ad1ff22d8362b429c56170326c836ce661a0307f8e35820a055966c2eedc21b62671a56c472263e + version: 7946.0.8 + resolution: "@types/geojson@npm:7946.0.8" + checksum: 2d9628afd0caac21dd927c90a5be0a361634a2d3b55c78752a9f1754874cf3802aa5cf2248489ace40e97b29a25d718b0d10689ca8e1b42df350222c282a8ef0 languageName: node linkType: hard @@ -3670,10 +3699,10 @@ __metadata: languageName: node linkType: hard -"@types/js-yaml@npm:^4.0.1": - version: 4.0.1 - resolution: "@types/js-yaml@npm:4.0.1" - checksum: fd8985289c713e3b2a494d6c243139c94bdda856af60346cf0c0da25bd6289e0165d367e623202b8cdfab7cef73a424a183282063beb0c0823d152dbec6d4959 +"@types/js-yaml@npm:^4": + version: 4.0.3 + resolution: "@types/js-yaml@npm:4.0.3" + checksum: 24c3afc2e9e656ccdabd3159a4d7fa6cc0ff54777627d29f699818938f791126d5e92f0bdd92ccffeed13c6f801c1cb2c60bb9adcf4b1d46c6843a3bf5abac1b languageName: node linkType: hard @@ -3723,28 +3752,28 @@ __metadata: languageName: node linkType: hard -"@types/leaflet-draw@npm:^1.0.3": - version: 1.0.3 - resolution: "@types/leaflet-draw@npm:1.0.3" +"@types/leaflet-draw@npm:^1": + version: 1.0.5 + resolution: "@types/leaflet-draw@npm:1.0.5" dependencies: "@types/leaflet": "*" - checksum: cf1496a6cccc8c9f9901348fa32e0658a7dbc798e013c8b726dd0bbb93546da4fd4414fec8c1a10aba57084864c1ce0d4d9b4f4f0fa5f6cf75049c49da86b434 + checksum: 9052ecb54fcf25224e6181ce6b6220249d294a8f9e14e5e54c35e3ae5385cea7048023cf09610262e4477d2f368a49c222fc5c2600501ed374ea5d4beb8de91f languageName: node linkType: hard -"@types/leaflet@npm:*, @types/leaflet@npm:^1.7.0": - version: 1.7.0 - resolution: "@types/leaflet@npm:1.7.0" +"@types/leaflet@npm:*, @types/leaflet@npm:^1": + version: 1.7.5 + resolution: "@types/leaflet@npm:1.7.5" dependencies: "@types/geojson": "*" - checksum: 83142a248a527fe787b3bb36d36335053cdaeb98e518f1b57f70b833d3a64642008872445964bf5d447d7c09f1375332e5851bbb15c1486242162b6d5e599161 + checksum: 9a2d1b13db4e9ece90216091003babc9ed8192ea3b5e634cdf7f2015300b7ed7fd4e5d41eec24c8d899e6088d90baa9c16338ca3e6b6d926f37947362cf27ae8 languageName: node linkType: hard -"@types/marked@npm:^2.0.3": - version: 2.0.3 - resolution: "@types/marked@npm:2.0.3" - checksum: bbf1f0589871678e5e6dbb39a40d059a777968d588a59e4f87c83cd87d5b30c63a1b632201ae152565db05ca6ad565d92d3951d95740ce6aa3ca7f4d5e98dd09 +"@types/marked@npm:^2": + version: 2.0.5 + resolution: "@types/marked@npm:2.0.5" + checksum: 2a868ab8cda3b750841345a0a9112804dc4786b342cc8f64792be8cc1c829b694338517e4304e45e4ce5135160102eb940bfa5bb306b5a867ad721b1ad84cd6b languageName: node linkType: hard @@ -3762,10 +3791,10 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:^8.2.2": - version: 8.2.2 - resolution: "@types/mocha@npm:8.2.2" - checksum: 3455211b134b0cfcfc71fee2d4f22a6ac3e313a93bf6c0cd3519c1e85653ffb8c9bb68dcff083b8e9e15b4ea3cb4f50d9916709946c082f072807aeba747575b +"@types/mocha@npm:^8": + version: 8.2.3 + resolution: "@types/mocha@npm:8.2.3" + checksum: 5cba26124eb9d6b9b2fab66111488a54e6254162bac855282cb46f1467c5c4debe78ddeba15ab2264d5e4669fbfd403e433b6363106d2dfbe122d660c1e298e2 languageName: node linkType: hard @@ -3839,10 +3868,10 @@ __metadata: languageName: node linkType: hard -"@types/sortablejs@npm:^1.10.6": - version: 1.10.6 - resolution: "@types/sortablejs@npm:1.10.6" - checksum: 1a98669c88ea125b55df919235f9c55fe177222c5089a3ff5b77f1bc61400c6273849d43d22d77d6f2b0d5d528252bdca52eced3492474071a89758ffaca795d +"@types/sortablejs@npm:^1": + version: 1.10.7 + resolution: "@types/sortablejs@npm:1.10.7" + checksum: 82af7075118a111f7b3ec4c73fbdeacce31f88abf6d18a48e4700b555abe080d37feef7491e5274521cd8a58ef365df16f409fbd1ee81ebb86c25619c9ec8103 languageName: node linkType: hard @@ -3975,67 +4004,67 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-button@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-button@npm:20.0.1" +"@vaadin/vaadin-button@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-button@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-control-state-mixin": 20.0.1 - "@vaadin/vaadin-element-mixin": 20.0.1 - "@vaadin/vaadin-lumo-styles": 20.0.1 - "@vaadin/vaadin-material-styles": 20.0.1 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: 096a669d76f6b3587c7d3849a68aa05123248924a388568b69ae45970b7155af1abca83085a84a66d22e397f0d88acc9c2b289eeff9bc4a758b75fe945fc4a1f + "@vaadin/vaadin-control-state-mixin": ^20.0.4 + "@vaadin/vaadin-element-mixin": ^20.0.4 + "@vaadin/vaadin-lumo-styles": ^20.0.4 + "@vaadin/vaadin-material-styles": ^20.0.4 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 102c86835b4450e7f9cef08310ae323e85ec41f8e6c5b63a5e929f1cde363e75ec8170e85a81d9e390f0cf4ea2daf3168a41ff1d9ca84378d198a420fe4e036a languageName: node linkType: hard -"@vaadin/vaadin-combo-box@npm:^20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-combo-box@npm:20.0.1" +"@vaadin/vaadin-combo-box@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-combo-box@npm:20.0.4" dependencies: "@polymer/iron-a11y-announcer": ^3.0.0 "@polymer/iron-list": ^3.0.0 "@polymer/iron-resizable-behavior": ^3.0.0 "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-control-state-mixin": 20.0.1 - "@vaadin/vaadin-element-mixin": 20.0.1 - "@vaadin/vaadin-item": 20.0.1 - "@vaadin/vaadin-lumo-styles": 20.0.1 - "@vaadin/vaadin-material-styles": 20.0.1 - "@vaadin/vaadin-overlay": 20.0.1 - "@vaadin/vaadin-text-field": 20.0.1 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: ec4cf4d687fe3ee1cf7b2fbbb6c65d5701f30179d41d591ce75664864afc15f6ecd95f9baf595c2179a0a4211a9b46fd42b214d20b60c45bfdd80c05ca5e24b2 + "@vaadin/vaadin-control-state-mixin": ^20.0.4 + "@vaadin/vaadin-element-mixin": ^20.0.4 + "@vaadin/vaadin-item": ^20.0.4 + "@vaadin/vaadin-lumo-styles": ^20.0.4 + "@vaadin/vaadin-material-styles": ^20.0.4 + "@vaadin/vaadin-overlay": ^20.0.4 + "@vaadin/vaadin-text-field": ^20.0.4 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 89fd90012fe980f674c14fdd9069cc9d051783675e13e4270c3f99d849cea507a8b46a0ae79ae9ec6449557172abe0830d20c0a37ce3f84704a8eae83d296d14 languageName: node linkType: hard -"@vaadin/vaadin-control-state-mixin@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-control-state-mixin@npm:20.0.1" +"@vaadin/vaadin-control-state-mixin@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-control-state-mixin@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 - checksum: dfb7c89cdc5f88497194b0f3b61a08c70abf3e5633f302feb4b5a42557fd270f02e59b586a47dd482dffa76dee820422e388c2bee3ca9bfedea48da01592ff74 + checksum: 72e834795af478aef7ecec1ea056328703794477f7032565e0db6801cd9e8feb2205ad3df5fa777f1b1b794b97a73f5fcc440b16fc28da31de6b2f8970e8fc45 languageName: node linkType: hard -"@vaadin/vaadin-date-picker@npm:^20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-date-picker@npm:20.0.1" +"@vaadin/vaadin-date-picker@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-date-picker@npm:20.0.4" dependencies: "@polymer/iron-a11y-announcer": ^3.0.0 "@polymer/iron-a11y-keys-behavior": ^3.0.0 "@polymer/iron-media-query": ^3.0.0 "@polymer/iron-resizable-behavior": ^3.0.0 "@polymer/polymer": ^3.2.0 - "@vaadin/vaadin-button": 20.0.1 - "@vaadin/vaadin-control-state-mixin": 20.0.1 - "@vaadin/vaadin-element-mixin": 20.0.1 - "@vaadin/vaadin-lumo-styles": 20.0.1 - "@vaadin/vaadin-material-styles": 20.0.1 - "@vaadin/vaadin-overlay": 20.0.1 - "@vaadin/vaadin-text-field": 20.0.1 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: 058e1cae51414c664fac5679ebea435ae4f8da716915c8c0aa9f4c7683e7bd48ce94e6f059dea9d7cf67e87554a098ab7cfcd955afdc4d85291ba0c0c6447236 + "@vaadin/vaadin-button": ^20.0.4 + "@vaadin/vaadin-control-state-mixin": ^20.0.4 + "@vaadin/vaadin-element-mixin": ^20.0.4 + "@vaadin/vaadin-lumo-styles": ^20.0.4 + "@vaadin/vaadin-material-styles": ^20.0.4 + "@vaadin/vaadin-overlay": ^20.0.4 + "@vaadin/vaadin-text-field": ^20.0.4 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 45a98ae753c85484b9a810aacc85d4a4da8d723155c1b0fd0d9f2208983caea924490a06d33d1256f10100caca979975c424a1329515cd14d2606ae55d2355ce languageName: node linkType: hard @@ -4046,86 +4075,86 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-element-mixin@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-element-mixin@npm:20.0.1" +"@vaadin/vaadin-element-mixin@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-element-mixin@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 "@vaadin/vaadin-development-mode-detector": ^2.0.0 "@vaadin/vaadin-usage-statistics": ^2.1.0 - checksum: 34f66bc3332a57672645f00ac55327624a55c686eaaa0a19a6a830d93229c7a5e16a2421c8b9919d729540d829e289f68105bd6754c953fe9c94b38ab547416f + checksum: 1050069361ee27c42b7e2dc9442df754c64a7bd9170d751376cacf79eea34a0e20c759b49d6ee79dca454f8533f9f7a8cd62dbdf94c99abd4ed1bbf3a1764c5e languageName: node linkType: hard -"@vaadin/vaadin-item@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-item@npm:20.0.1" +"@vaadin/vaadin-item@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-item@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-element-mixin": 20.0.1 - "@vaadin/vaadin-lumo-styles": 20.0.1 - "@vaadin/vaadin-material-styles": 20.0.1 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: 904a549574c7c7c23a98d5ec4067d262ff612eb561f60a9fea9bdf70eb65fe5d297877139ab2398b746a84eb1bfbb8d3270494c067b44a11ef70625fa9dd0177 + "@vaadin/vaadin-element-mixin": ^20.0.4 + "@vaadin/vaadin-lumo-styles": ^20.0.4 + "@vaadin/vaadin-material-styles": ^20.0.4 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 35f31c93222416cd549627bee48e7f7e45ade22956e1ecd042ab9b5bad726014f1cfd69597c6750bcbc3a0ca0cd3e6dab5c61f0243fc8bfff315551a1fefd498 languageName: node linkType: hard -"@vaadin/vaadin-lumo-styles@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-lumo-styles@npm:20.0.1" +"@vaadin/vaadin-lumo-styles@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-lumo-styles@npm:20.0.4" dependencies: "@polymer/iron-icon": ^3.0.0 "@polymer/iron-iconset-svg": ^3.0.0 "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: bd6be1aa9a2339db332beda63433f301c2f7495070b968da1ff27033c111a8c1cd23c55090832f15b69f04b5b8a65c8ee3feba480eb876fb4fc4d165b4568bdb + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 88ee8089fa8d22276c6c1712f8a8fb11020b604c0ca851f580824894df7b7af87433d54da46ac2a34f12cd588fc5fbbb5009846a2bfffcbe4c4b8a933a8b9f2a languageName: node linkType: hard -"@vaadin/vaadin-material-styles@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-material-styles@npm:20.0.1" +"@vaadin/vaadin-material-styles@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-material-styles@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: 885ba2637157e07fd78829113d3e50eb0346e363435691acd431893b77edf5ae2863fe2a2163eaad4b36e84383b8b73db0e0ebb6f815c7608d3775c0260ae250 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 1d1a63a051c7bb61ce6298225fde526c261b5eda8e9918fd31b99404978dde7fe0293151cac9ea1d09987daa9782f36848c8bb5964f26a40ffad65eec4a11096 languageName: node linkType: hard -"@vaadin/vaadin-overlay@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-overlay@npm:20.0.1" +"@vaadin/vaadin-overlay@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-overlay@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-element-mixin": 20.0.1 - "@vaadin/vaadin-lumo-styles": 20.0.1 - "@vaadin/vaadin-material-styles": 20.0.1 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: c3ef33e5149381e69d4f64b3500ba342dbc7cf244025a071533f971f0c5c49d92d9ca797c635933842642ff2fa248403a20d8f5a758c0434709878b35cf2324f + "@vaadin/vaadin-element-mixin": ^20.0.4 + "@vaadin/vaadin-lumo-styles": ^20.0.4 + "@vaadin/vaadin-material-styles": ^20.0.4 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: eab10f8699d2bf708c6388b0fcd77c0a8b5d383a51aa32919e8fb4db9ba7206ef01ea3ff4c9f9ff1db472413fa1adba628411ee1b2b4abbd87b09ca94621e2c9 languageName: node linkType: hard -"@vaadin/vaadin-text-field@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-text-field@npm:20.0.1" +"@vaadin/vaadin-text-field@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-text-field@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-control-state-mixin": 20.0.1 - "@vaadin/vaadin-element-mixin": 20.0.1 - "@vaadin/vaadin-lumo-styles": 20.0.1 - "@vaadin/vaadin-material-styles": 20.0.1 - "@vaadin/vaadin-themable-mixin": 20.0.1 - checksum: 5bcba688a66a873de5586f6a42d005cd48a0f4d9143c6d23bbd4baaba196427679a74cadcc93a61a878dc33cecb8bef732896f1e8cb6de829dcc68aac9ce6ded + "@vaadin/vaadin-control-state-mixin": ^20.0.4 + "@vaadin/vaadin-element-mixin": ^20.0.4 + "@vaadin/vaadin-lumo-styles": ^20.0.4 + "@vaadin/vaadin-material-styles": ^20.0.4 + "@vaadin/vaadin-themable-mixin": ^20.0.4 + checksum: 82da2af87f7f4bd50ec277e6c40c759c4db89afd5e9f6bfb9fea1c2b127491dd6a67e76f605ec17bdd140ac8c78c03c6dae2bf269450747650c303fc6c5d3490 languageName: node linkType: hard -"@vaadin/vaadin-themable-mixin@npm:20.0.1": - version: 20.0.1 - resolution: "@vaadin/vaadin-themable-mixin@npm:20.0.1" +"@vaadin/vaadin-themable-mixin@npm:^20.0.4": + version: 20.0.4 + resolution: "@vaadin/vaadin-themable-mixin@npm:20.0.4" dependencies: "@polymer/polymer": ^3.0.0 lit-element: ^2.0.0 - checksum: 1a0bcab0dbaec2f6ea03480ccd3957f5eb1145bdbcabb2bc8fe9168c279626ab665b55f4f4f8f1de0a79d272e42034a04a7e88b6e4d5b2e2196b6252be6c952b + checksum: 3841736d5552d3b2ae674090f0c86f22d2edf6f3f92db2800711d2110b52982a1eeceeee3c4b478a6fc650b69362e2b1d0b24ef00628d1a25749bedd2d995d4d languageName: node linkType: hard @@ -5878,13 +5907,6 @@ __metadata: languageName: node linkType: hard -"cldr-core@npm:38": - version: 38.1.0 - resolution: "cldr-core@npm:38.1.0" - checksum: 1210ed72ae104aee8b1b82ebbc37a0901eb3315ee5831e69eb6f1402369cb261984e875bf314deb628843aa0146f2b6ee336f6f3f2399190661fa478f39affe4 - languageName: node - linkType: hard - "clean-css@npm:^4.2.1": version: 4.2.3 resolution: "clean-css@npm:4.2.3" @@ -6395,10 +6417,10 @@ __metadata: languageName: node linkType: hard -"cropperjs@npm:^1.5.11": - version: 1.5.11 - resolution: "cropperjs@npm:1.5.11" - checksum: 450b5cbeba4ce482b9f7aacdd359281099dc883b1189e34ccec0db5bbc731ec9be206cfcf9c03067d96e8c227547407db629b7203189446877196bfa2ce6c948 +"cropperjs@npm:^1.5.12": + version: 1.5.12 + resolution: "cropperjs@npm:1.5.12" + checksum: 020ae86418673b92a49a5e0e5eeb00f669ade12b949d5dd4343afadc4471f25627158e4b6b49bf712d1670ddad688af281071ee236d58340f7cdb61ed909a53b languageName: node linkType: hard @@ -6469,10 +6491,10 @@ __metadata: languageName: node linkType: hard -"date-fns@npm:^2.22.1": - version: 2.22.1 - resolution: "date-fns@npm:2.22.1" - checksum: a89dc6cdf3929b3f0d54d129a3c288df995fc3e6c8099dacc215e5404b4950fc8551d11a58968dfd3b8d576d0c5e637072f615e8f9c3e47d82c81e3952007d5b +"date-fns@npm:^2.23.0": + version: 2.23.0 + resolution: "date-fns@npm:2.23.0" + checksum: 5b23cf7f08a27d0c1633e81304c95ac2bacb1160d86a25d36c40c84853796e442e597a4d75acec3f0920a71f3a65dd55b37565d356fa3fb4c2345225df42d930 languageName: node linkType: hard @@ -8794,10 +8816,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"hls.js@npm:^1.0.7": - version: 1.0.7 - resolution: "hls.js@npm:1.0.7" - checksum: f9ad031f4496f2cc2f0d6e963325ee81305ca39c070219d8ab383c55185dc89c33609ff8e118260e21865682cbe4d10496bfe064cfe1b10ba335a912079e6e61 +"hls.js@npm:^1.0.10": + version: 1.0.10 + resolution: "hls.js@npm:1.0.10" + checksum: 21006e80c318aaf83126542da6e6644cd8bbcbd9dc24bce0ffa26bddf43aaf11783b60809d624c0dc88092f09009afa93136a01e6a67ef2c74344a79f9e39a6b languageName: node linkType: hard @@ -8816,26 +8838,26 @@ fsevents@~2.3.1: "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/preset-env": ^7.14.7 "@babel/preset-typescript": ^7.14.5 - "@braintree/sanitize-url": ^5.0.1 - "@codemirror/commands": ^0.18.0 - "@codemirror/gutter": ^0.18.0 - "@codemirror/highlight": ^0.18.0 - "@codemirror/history": ^0.18.0 - "@codemirror/legacy-modes": ^0.18.0 - "@codemirror/rectangular-selection": ^0.18.0 - "@codemirror/search": ^0.18.0 - "@codemirror/state": ^0.18.0 - "@codemirror/stream-parser": ^0.18.0 - "@codemirror/text": ^0.18.0 - "@codemirror/view": ^0.18.0 - "@formatjs/intl-getcanonicallocales": ^1.5.10 - "@formatjs/intl-locale": ^2.4.28 - "@formatjs/intl-pluralrules": ^4.0.22 - "@fullcalendar/common": 5.1.0 - "@fullcalendar/core": 5.1.0 - "@fullcalendar/daygrid": 5.1.0 - "@fullcalendar/interaction": 5.1.0 - "@fullcalendar/list": 5.1.0 + "@braintree/sanitize-url": ^5.0.2 + "@codemirror/commands": ^0.19.2 + "@codemirror/gutter": ^0.19.1 + "@codemirror/highlight": ^0.19.2 + "@codemirror/history": ^0.19.0 + "@codemirror/legacy-modes": ^0.19.0 + "@codemirror/rectangular-selection": ^0.19.0 + "@codemirror/search": ^0.19.0 + "@codemirror/state": ^0.19.1 + "@codemirror/stream-parser": ^0.19.1 + "@codemirror/text": ^0.19.2 + "@codemirror/view": ^0.19.4 + "@formatjs/intl-getcanonicallocales": ^1.7.3 + "@formatjs/intl-locale": ^2.4.37 + "@formatjs/intl-pluralrules": ^4.1.3 + "@fullcalendar/common": 5.9.0 + "@fullcalendar/core": 5.9.0 + "@fullcalendar/daygrid": 5.9.0 + "@fullcalendar/interaction": 5.9.0 + "@fullcalendar/list": 5.9.0 "@koa/cors": ^3.1.0 "@lit-labs/virtualizer": "patch:@lit-labs/virtualizer@0.6.0#./.yarn/patches/@lit-labs/virtualizer/0.7.0.patch" "@material/chips": 12.0.0-canary.22d29cbb4.0 @@ -8892,17 +8914,17 @@ fsevents@~2.3.1: "@thomasloven/round-slider": 0.5.4 "@types/chromecast-caf-receiver": 5.0.12 "@types/chromecast-caf-sender": ^1.0.3 - "@types/js-yaml": ^4.0.1 - "@types/leaflet": ^1.7.0 - "@types/leaflet-draw": ^1.0.3 - "@types/marked": ^2.0.3 - "@types/mocha": ^8.2.2 - "@types/sortablejs": ^1.10.6 + "@types/js-yaml": ^4 + "@types/leaflet": ^1 + "@types/leaflet-draw": ^1 + "@types/marked": ^2 + "@types/mocha": ^8 + "@types/sortablejs": ^1 "@types/webspeechapi": ^0.0.29 "@typescript-eslint/eslint-plugin": ^4.28.3 "@typescript-eslint/parser": ^4.28.3 - "@vaadin/vaadin-combo-box": ^20.0.1 - "@vaadin/vaadin-date-picker": ^20.0.1 + "@vaadin/vaadin-combo-box": ^20.0.4 + "@vaadin/vaadin-date-picker": ^20.0.4 "@vibrant/color": ^3.2.1-alpha.1 "@vibrant/core": ^3.2.1-alpha.1 "@vibrant/quantizer-mmcq": ^3.2.1-alpha.1 @@ -8915,8 +8937,8 @@ fsevents@~2.3.1: chart.js: ^3.3.2 comlink: ^4.3.1 core-js: ^3.15.2 - cropperjs: ^1.5.11 - date-fns: ^2.22.1 + cropperjs: ^1.5.12 + date-fns: ^2.23.0 deep-clone-simple: ^1.1.1 deep-freeze: ^0.0.1 del: ^4.0.0 @@ -8941,12 +8963,12 @@ fsevents@~2.3.1: gulp-merge-json: ^1.3.1 gulp-rename: ^2.0.0 gulp-zopfli-green: ^3.0.1 - hls.js: ^1.0.7 + hls.js: ^1.0.10 home-assistant-js-websocket: ^5.11.1 html-minifier: ^4.0.0 husky: ^1.3.1 - idb-keyval: ^5.0.5 - intl-messageformat: ^9.6.16 + idb-keyval: ^5.1.3 + intl-messageformat: ^9.9.1 js-yaml: ^4.1.0 leaflet: ^1.7.1 leaflet-draw: ^1.0.4 @@ -8957,8 +8979,7 @@ fsevents@~2.3.1: lodash.template: ^4.5.0 magic-string: ^0.25.7 map-stream: ^0.0.7 - marked: ^2.0.5 - mdn-polyfills: ^5.16.0 + marked: ^3.0.2 memoize-one: ^5.2.1 merge-stream: ^1.0.1 mocha: ^8.4.0 @@ -8966,7 +8987,7 @@ fsevents@~2.3.1: object-hash: ^2.0.3 open: ^7.0.4 prettier: ^2.3.2 - proxy-polyfill: ^0.3.1 + proxy-polyfill: ^0.3.2 punycode: ^2.1.1 qrcode: ^1.4.4 regenerator-runtime: ^0.13.8 @@ -8979,7 +9000,7 @@ fsevents@~2.3.1: rollup-plugin-visualizer: ^4.0.4 serve: ^11.3.2 sinon: ^11.0.0 - sortablejs: ^1.10.2 + sortablejs: ^1.14.0 source-map-url: ^0.4.0 superstruct: ^0.15.2 systemjs: ^6.3.2 @@ -8987,7 +9008,7 @@ fsevents@~2.3.1: tinykeys: ^1.1.3 ts-lit-plugin: ^1.2.1 ts-mocha: ^8.0.0 - tsparticles: ^1.19.2 + tsparticles: ^1.34.0 typescript: ^4.3.5 unfetch: ^4.1.0 vinyl-buffer: ^1.0.1 @@ -9251,10 +9272,12 @@ fsevents@~2.3.1: languageName: node linkType: hard -"idb-keyval@npm:^5.0.5": - version: 5.0.5 - resolution: "idb-keyval@npm:5.0.5" - checksum: 5296e6bab6557fbb30437beb1d9516a25f8d04917e2d08329a302e8d9b0afefedf29f8dbf30725ba6d96d3f274115180a5c85813c4d121b3b0df46ddbcd32b5d +"idb-keyval@npm:^5.1.3": + version: 5.1.3 + resolution: "idb-keyval@npm:5.1.3" + dependencies: + safari-14-idb-fix: ^1.0.4 + checksum: fbf797833a74e46edaa9d29a566fdb37e53b84432eb415ae6e5c83605d2573dd23c8aa4e180c71dc51c17f145494177da5d7849f6b7b163ac7aa59a69642a077 languageName: node linkType: hard @@ -9424,14 +9447,14 @@ fsevents@~2.3.1: languageName: node linkType: hard -"intl-messageformat@npm:^9.6.16": - version: 9.6.16 - resolution: "intl-messageformat@npm:9.6.16" +"intl-messageformat@npm:^9.9.1": + version: 9.9.1 + resolution: "intl-messageformat@npm:9.9.1" dependencies: - "@formatjs/fast-memoize": 1.1.1 - "@formatjs/icu-messageformat-parser": 2.0.4 + "@formatjs/fast-memoize": 1.2.0 + "@formatjs/icu-messageformat-parser": 2.0.11 tslib: ^2.1.0 - checksum: bd777fc97b3d870ef7f9b742a1d003eb5b0b59f4bf5e06bdf2329575fd60112e593cd84d785324face7d56bbc3c89822f57c876e8f11c60b5ecfa85e0a9db213 + checksum: 6895634a36a9839c08d336ad0c615c95d01849b81d337205f81c5c69eaaa0fdd602fcea2bace5cdc74627ea951d4c2a89b7cedfe61ecefef83ca42340f7821ce languageName: node linkType: hard @@ -10425,22 +10448,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"lezer-tree@npm:^0.13.0, lezer-tree@npm:^0.13.2": - version: 0.13.2 - resolution: "lezer-tree@npm:0.13.2" - checksum: e4475892e988bebf6d3763eef75228fba29bc8b7b5870b4232573cda8a369cf0bc1e2ab8e62a613674740033032dcb9a09bae3b0f0572f5729c344ba8f870195 - languageName: node - linkType: hard - -"lezer@npm:^0.13.0, lezer@npm:^0.13.4": - version: 0.13.4 - resolution: "lezer@npm:0.13.4" - dependencies: - lezer-tree: ^0.13.2 - checksum: 0aba6bc36858f1c84e93f8299b08147315a964f91b86802da92f39fd5cde73f9cfb416e0dfa77dc7a3de3200d88b3f2958126d90f0232cb7a7fd1ba0867a39ae - languageName: node - linkType: hard - "liftoff@npm:^3.1.0": version: 3.1.0 resolution: "liftoff@npm:3.1.0" @@ -11073,12 +11080,12 @@ fsevents@~2.3.1: languageName: node linkType: hard -"marked@npm:^2.0.5": - version: 2.0.5 - resolution: "marked@npm:2.0.5" +"marked@npm:^3.0.2": + version: 3.0.2 + resolution: "marked@npm:3.0.2" bin: marked: bin/marked - checksum: 2abd419cf5ea066e0d973fb81310f8a504319b36018436018c45265429395438f8dec891a61ca7cca5bd76ee4c454385781dbe6cdd04dcc78d9c6dc407d66cec + checksum: 6e32c4a1cecb165f4c0a6d5386106c7604af267b51f0f7f803f88e7b9a7a97595bbb36b1117785b25ec48a6942c39a705838c49302d22efdc831214f663a33df languageName: node linkType: hard @@ -11094,13 +11101,6 @@ fsevents@~2.3.1: languageName: node linkType: hard -"mdn-polyfills@npm:^5.16.0": - version: 5.17.0 - resolution: "mdn-polyfills@npm:5.17.0" - checksum: 1974e77d418b1c662e1c388e5f8317e9fd0808f02087e36d7e428ec39ca7ac0032f557a57c1632a2b418ea46326551b6d03abc4dff2dc2108299e792b1f2b1b6 - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -12492,10 +12492,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"pathseg@npm:^1.2.0": - version: 1.2.0 - resolution: "pathseg@npm:1.2.0" - checksum: 30eff04be62903c71c7f4771f690f0fb250c8cd2e6a643fb92c3974e6066f11c4594594e40e65a3d059b5ba72d5410224a88bb5338fd48c024d067b35c7998a6 +"pathseg@npm:^1.2.1": + version: 1.2.1 + resolution: "pathseg@npm:1.2.1" + checksum: 96f0d420d57f7e264ceb330847b5c1f4a9a4fe0731ffa8d3127d109f7056d1950311ba748631aa852b5b2ded0f0687bca0eddfdc03189c34c9d6adb7d1214bf9 languageName: node linkType: hard @@ -12760,10 +12760,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"proxy-polyfill@npm:^0.3.1": - version: 0.3.1 - resolution: "proxy-polyfill@npm:0.3.1" - checksum: 502a2a5333b62dccf2531fb44bcf3627701c663c4f1ffcdc11f2546585f73dcccc9107d14587db5300be93716de7e752cabbef3eedfe184782661aa15060cfea +"proxy-polyfill@npm:^0.3.2": + version: 0.3.2 + resolution: "proxy-polyfill@npm:0.3.2" + checksum: cada180093e8c39394ec52a657a9b3ad1755a01c620d610d4bc5623a17f76933ab4eececc5587919b5dae700e6b8a7363324437c76048439ae8a0ac8e065104f languageName: node linkType: hard @@ -13577,6 +13577,13 @@ fsevents@~2.3.1: languageName: node linkType: hard +"safari-14-idb-fix@npm:^1.0.4": + version: 1.0.4 + resolution: "safari-14-idb-fix@npm:1.0.4" + checksum: 9df9bb1eff8d24900b01d74aed9ab155ae2023ecd73fbb5d0ffbc3ddf46278c9d73a76cbb0025f384ddb937e3da36d7fe2386be98e64c7cf666e876b6dddf0a7 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -14060,10 +14067,10 @@ fsevents@~2.3.1: languageName: node linkType: hard -"sortablejs@npm:^1.10.2": - version: 1.10.2 - resolution: "sortablejs@npm:1.10.2" - checksum: 4815489b3d333c074a05e93d15691d001724be21ec318b283997d0fbef6f8de6e66c38379efaab11de3d963b8c8498b719c03a0390530cc28e749a757aea8312 +"sortablejs@npm:^1.14.0": + version: 1.14.0 + resolution: "sortablejs@npm:1.14.0" + checksum: 2e63a225fd5d75a4032ee5ea7155194d2729a44ff4c1dab027106523699836eb05d272eeb44d528ab9d60cc302e5ef13e611c508f9cb79e005eb4a0b0e251c95 languageName: node linkType: hard @@ -15002,22 +15009,22 @@ fsevents@~2.3.1: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.2.0": +"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.2.0": version: 2.3.1 resolution: "tslib@npm:2.3.1" checksum: 5ae2f209c5127bad284974c78916f02c72082615f65889a7ed0c7ca6d5f935c30338a0ee7310e1d9652dabc7b7507fd2905035487446d09d45fc1f19de71cf05 languageName: node linkType: hard -"tsparticles@npm:^1.19.2": - version: 1.19.2 - resolution: "tsparticles@npm:1.19.2" +"tsparticles@npm:^1.34.0": + version: 1.34.0 + resolution: "tsparticles@npm:1.34.0" dependencies: - pathseg: ^1.2.0 + pathseg: ^1.2.1 dependenciesMeta: pathseg: optional: true - checksum: 5ba36bbc47542f1efd2c95487547b64500d641ad691b93926112ada5912655cf8b7796c1bcdada949a12bb8d7f242b23d27311f764c03d61e15ce73ec8b0effd + checksum: 23e7a0dbab28cdf459e759efd5b02251860efc4096ee728baa92744a731c479c3832c690daeccccde648239a50656e4f5427401290f557a6213cdbc4c95c0af0 languageName: node linkType: hard From 8565a0d91110bb35897ddb953f0c79ed7e35772c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 3 Sep 2021 20:07:22 +0200 Subject: [PATCH 09/67] Remove float value in float form when emptied (#9947) --- src/components/ha-form/ha-form-float.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/ha-form/ha-form-float.ts b/src/components/ha-form/ha-form-float.ts index edf3c13576..698667eca4 100644 --- a/src/components/ha-form/ha-form-float.ts +++ b/src/components/ha-form/ha-form-float.ts @@ -32,17 +32,19 @@ export class HaFormFloat extends LitElement implements HaFormElement { .autoValidate=${this.schema.required} @value-changed=${this._valueChanged} > - ${this.suffix} + ${this.suffix} `; } private get _value() { - return this.data || 0; + return this.data; } private _valueChanged(ev: Event) { - const value = Number((ev.target as PaperInputElement).value); + const value: number | undefined = (ev.target as PaperInputElement).value + ? Number((ev.target as PaperInputElement).value) + : undefined; if (this._value === value) { return; } From 605172a0bc84c169b9380652566b5f6307fa4d2f Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 10:22:01 +0200 Subject: [PATCH 10/67] Align internal and fecha date/time formatting (#9380) --- src/common/datetime/format_date_time.ts | 4 ++-- src/common/datetime/format_time.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/datetime/format_date_time.ts b/src/common/datetime/format_date_time.ts index 0b91a40b81..eddc74aec4 100644 --- a/src/common/datetime/format_date_time.ts +++ b/src/common/datetime/format_date_time.ts @@ -16,7 +16,7 @@ const formatDateTimeMem = memoizeOne( year: "numeric", month: "long", day: "numeric", - hour: "numeric", + hour: useAmPm(locale) ? "numeric" : "2-digit", minute: "2-digit", hour12: useAmPm(locale), }) @@ -34,7 +34,7 @@ const formatDateTimeWithSecondsMem = memoizeOne( year: "numeric", month: "long", day: "numeric", - hour: "numeric", + hour: useAmPm(locale) ? "numeric" : "2-digit", minute: "2-digit", second: "2-digit", hour12: useAmPm(locale), diff --git a/src/common/datetime/format_time.ts b/src/common/datetime/format_time.ts index a20e1feef5..c1511fb8eb 100644 --- a/src/common/datetime/format_time.ts +++ b/src/common/datetime/format_time.ts @@ -13,7 +13,7 @@ export const formatTime = toLocaleTimeStringSupportsOptions const formatTimeMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { - hour: "numeric", + hour: useAmPm(locale) ? "numeric" : "2-digit", minute: "2-digit", hour12: useAmPm(locale), }) @@ -28,7 +28,7 @@ export const formatTimeWithSeconds = toLocaleTimeStringSupportsOptions const formatTimeWithSecondsMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { - hour: "numeric", + hour: useAmPm(locale) ? "numeric" : "2-digit", minute: "2-digit", second: "2-digit", hour12: useAmPm(locale), @@ -45,7 +45,7 @@ const formatTimeWeekdayMem = memoizeOne( (locale: FrontendLocaleData) => new Intl.DateTimeFormat(locale.language, { weekday: "long", - hour: "numeric", + hour: useAmPm(locale) ? "numeric" : "2-digit", minute: "2-digit", hour12: useAmPm(locale), }) From 0187c4faff75e7eec1aed4d9b92ed3b3e9fb3d07 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 10:22:46 +0200 Subject: [PATCH 11/67] Ensure calender follows time format locale (#9966) --- src/panels/calendar/ha-full-calendar.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/panels/calendar/ha-full-calendar.ts b/src/panels/calendar/ha-full-calendar.ts index e49443ea26..33e6d35480 100644 --- a/src/panels/calendar/ha-full-calendar.ts +++ b/src/panels/calendar/ha-full-calendar.ts @@ -23,6 +23,7 @@ import { } from "lit"; import { property, state } from "lit/decorators"; import memoize from "memoize-one"; +import { useAmPm } from "../../common/datetime/use_am_pm"; import { fireEvent } from "../../common/dom/fire_event"; import "../../components/ha-button-toggle-group"; import "../../components/ha-icon-button"; @@ -214,6 +215,11 @@ export class HAFullCalendar extends LitElement { ...defaultFullCalendarConfig, locale: this.hass.language, initialView: this.initialView, + eventTimeFormat: { + hour: useAmPm(this.hass.locale) ? "numeric" : "2-digit", + minute: useAmPm(this.hass.locale) ? "numeric" : "2-digit", + hour12: useAmPm(this.hass.locale), + }, }; config.dateClick = (info) => this._handleDateClick(info); From 9ccb5360b34fc228a71f82d9920751dc2d4f583c Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 10:26:11 +0200 Subject: [PATCH 12/67] Add `icon` to attribute row validation (#9963) --- .../lovelace/editor/config-elements/hui-entities-card-editor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts index 0d6910602d..d3d7c18eb4 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts @@ -132,6 +132,7 @@ const attributeEntitiesRowConfigStruct = object({ prefix: optional(string()), suffix: optional(string()), name: optional(string()), + icon: optional(string()), }); const textEntitiesRowConfigStruct = object({ From d6dbbcb0de4cce06c6d67f57721f16612c40ed91 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 10:27:29 +0200 Subject: [PATCH 13/67] Use dynamic struct validation for entities card rows (#9962) --- src/common/structs/is-custom-type.ts | 2 +- .../hui-entities-card-editor.ts | 69 ++++++++++++++----- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/src/common/structs/is-custom-type.ts b/src/common/structs/is-custom-type.ts index 9b90eb517f..dd5de2f637 100644 --- a/src/common/structs/is-custom-type.ts +++ b/src/common/structs/is-custom-type.ts @@ -1,6 +1,6 @@ import { refine, string } from "superstruct"; -const isCustomType = (value: string) => value.startsWith("custom:"); +export const isCustomType = (value: string) => value.startsWith("custom:"); export const customType = () => refine(string(), "custom element type", isCustomType); diff --git a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts index d3d7c18eb4..5787f21a1a 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts @@ -8,8 +8,9 @@ import { any, array, assert, - boolean, assign, + boolean, + dynamic, literal, number, object, @@ -19,7 +20,10 @@ import { union, } from "superstruct"; import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event"; -import { customType } from "../../../../common/structs/is-custom-type"; +import { + customType, + isCustomType, +} from "../../../../common/structs/is-custom-type"; import { entityId } from "../../../../common/structs/is-entity-id"; import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import "../../../../components/entity/state-badge"; @@ -38,6 +42,7 @@ import "../hui-entities-card-row-editor"; import "../hui-sub-element-editor"; import { processEditorEntities } from "../process-editor-entities"; import { actionConfigStruct } from "../structs/action-struct"; +import { baseLovelaceCardConfig } from "../structs/base-card-struct"; import { entitiesConfigStruct } from "../structs/entities-struct"; import { EditorTarget, @@ -45,7 +50,6 @@ import { SubElementEditorConfig, } from "../types"; import { configElementStyle } from "./config-elements-style"; -import { baseLovelaceCardConfig } from "../structs/base-card-struct"; const buttonEntitiesRowConfigStruct = object({ type: literal("button"), @@ -142,24 +146,53 @@ const textEntitiesRowConfigStruct = object({ icon: optional(string()), }); -const customRowConfigStruct = type({ +const customEntitiesRowConfigStruct = type({ type: customType(), }); -const entitiesRowConfigStruct = union([ - entitiesConfigStruct, - buttonEntitiesRowConfigStruct, - castEntitiesRowConfigStruct, - conditionalEntitiesRowConfigStruct, - dividerEntitiesRowConfigStruct, - sectionEntitiesRowConfigStruct, - webLinkEntitiesRowConfigStruct, - buttonsEntitiesRowConfigStruct, - attributeEntitiesRowConfigStruct, - callServiceEntitiesRowConfigStruct, - textEntitiesRowConfigStruct, - customRowConfigStruct, -]); +const entitiesRowConfigStruct = dynamic((value) => { + if (value && typeof value === "object" && "type" in value) { + if (isCustomType((value as LovelaceRowConfig).type!)) { + return customEntitiesRowConfigStruct; + } + + switch ((value as LovelaceRowConfig).type!) { + case "attribute": { + return attributeEntitiesRowConfigStruct; + } + case "button": { + return buttonEntitiesRowConfigStruct; + } + case "buttons": { + return buttonsEntitiesRowConfigStruct; + } + case "call-service": { + return callServiceEntitiesRowConfigStruct; + } + case "cast": { + return castEntitiesRowConfigStruct; + } + case "conditional": { + return conditionalEntitiesRowConfigStruct; + } + case "divider": { + return dividerEntitiesRowConfigStruct; + } + case "section": { + return sectionEntitiesRowConfigStruct; + } + case "text": { + return textEntitiesRowConfigStruct; + } + case "weblink": { + return webLinkEntitiesRowConfigStruct; + } + } + } + + // No "type" property => has to be the default entity row config struct + return entitiesConfigStruct; +}); const cardConfigStruct = assign( baseLovelaceCardConfig, From b2a87c90a297d7b8e7376ef4f1511c1ea40c70ce Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 10:42:42 +0200 Subject: [PATCH 14/67] Proper editor enum validation of timestamp formats (#9965) --- .../lovelace/components/hui-timestamp-display.ts | 4 ++-- src/panels/lovelace/components/types.ts | 16 ++++++++++------ .../config-elements/hui-entities-card-editor.ts | 3 +++ .../lovelace/editor/structs/entities-struct.ts | 5 +++-- .../entity-rows/hui-sensor-entity-row.ts | 4 ++-- src/panels/lovelace/entity-rows/types.ts | 4 ++-- 6 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/panels/lovelace/components/hui-timestamp-display.ts b/src/panels/lovelace/components/hui-timestamp-display.ts index 086ba6b13d..dbe9869669 100644 --- a/src/panels/lovelace/components/hui-timestamp-display.ts +++ b/src/panels/lovelace/components/hui-timestamp-display.ts @@ -6,7 +6,7 @@ import { formatTime } from "../../../common/datetime/format_time"; import relativeTime from "../../../common/datetime/relative_time"; import { FrontendLocaleData } from "../../../data/translation"; import { HomeAssistant } from "../../../types"; -import { TimestampRenderingFormats } from "./types"; +import { TimestampRenderingFormat } from "./types"; const FORMATS: { [key: string]: (ts: Date, lang: FrontendLocaleData) => string; @@ -23,7 +23,7 @@ class HuiTimestampDisplay extends LitElement { @property() public ts?: Date; - @property() public format?: TimestampRenderingFormats; + @property() public format?: TimestampRenderingFormat; @state() private _relative?: string; diff --git a/src/panels/lovelace/components/types.ts b/src/panels/lovelace/components/types.ts index 4e49ee3e44..8c0684881e 100644 --- a/src/panels/lovelace/components/types.ts +++ b/src/panels/lovelace/components/types.ts @@ -7,9 +7,13 @@ export interface ConditionalBaseConfig extends LovelaceCardConfig { conditions: Condition[]; } -export type TimestampRenderingFormats = - | "relative" - | "total" - | "date" - | "time" - | "datetime"; +export const TIMESTAMP_RENDERING_FORMATS = [ + "relative", + "total", + "date", + "time", + "datetime", +] as const; + +export type TimestampRenderingFormat = + typeof TIMESTAMP_RENDERING_FORMATS[number]; diff --git a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts index 5787f21a1a..46ff0b41a6 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts @@ -11,6 +11,7 @@ import { assign, boolean, dynamic, + enums, literal, number, object, @@ -34,6 +35,7 @@ import "../../../../components/ha-switch"; import type { HomeAssistant } from "../../../../types"; import type { EntitiesCardConfig } from "../../cards/types"; import "../../components/hui-theme-select-editor"; +import { TIMESTAMP_RENDERING_FORMATS } from "../../components/types"; import type { LovelaceRowConfig } from "../../entity-rows/types"; import { headerFooterConfigStructs } from "../../header-footer/structs"; import type { LovelaceCardEditor } from "../../types"; @@ -137,6 +139,7 @@ const attributeEntitiesRowConfigStruct = object({ suffix: optional(string()), name: optional(string()), icon: optional(string()), + format: optional(enums(TIMESTAMP_RENDERING_FORMATS)), }); const textEntitiesRowConfigStruct = object({ diff --git a/src/panels/lovelace/editor/structs/entities-struct.ts b/src/panels/lovelace/editor/structs/entities-struct.ts index fa170e3155..837f621b19 100644 --- a/src/panels/lovelace/editor/structs/entities-struct.ts +++ b/src/panels/lovelace/editor/structs/entities-struct.ts @@ -1,4 +1,5 @@ -import { union, object, string, optional, boolean } from "superstruct"; +import { union, object, string, optional, boolean, enums } from "superstruct"; +import { TIMESTAMP_RENDERING_FORMATS } from "../../components/types"; import { actionConfigStruct } from "./action-struct"; export const entitiesConfigStruct = union([ @@ -8,7 +9,7 @@ export const entitiesConfigStruct = union([ icon: optional(string()), image: optional(string()), secondary_info: optional(string()), - format: optional(string()), + format: optional(enums(TIMESTAMP_RENDERING_FORMATS)), state_color: optional(boolean()), tap_action: optional(actionConfigStruct), hold_action: optional(actionConfigStruct), diff --git a/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts b/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts index 4a9a7f1b4f..cf599ba375 100644 --- a/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-sensor-entity-row.ts @@ -20,11 +20,11 @@ import { hasConfigOrEntityChanged } from "../common/has-changed"; import "../components/hui-generic-entity-row"; import "../components/hui-timestamp-display"; import { createEntityNotFoundWarning } from "../components/hui-warning"; -import { TimestampRenderingFormats } from "../components/types"; +import { TimestampRenderingFormat } from "../components/types"; import { LovelaceRow } from "./types"; interface SensorEntityConfig extends EntitiesCardEntityConfig { - format?: TimestampRenderingFormats; + format?: TimestampRenderingFormat; } @customElement("hui-sensor-entity-row") diff --git a/src/panels/lovelace/entity-rows/types.ts b/src/panels/lovelace/entity-rows/types.ts index 228c7d50a6..47131f09e6 100644 --- a/src/panels/lovelace/entity-rows/types.ts +++ b/src/panels/lovelace/entity-rows/types.ts @@ -1,7 +1,7 @@ import { ActionConfig } from "../../../data/lovelace"; import { HomeAssistant } from "../../../types"; import { Condition } from "../common/validate-condition"; -import { TimestampRenderingFormats } from "../components/types"; +import { TimestampRenderingFormat } from "../components/types"; export interface EntityConfig { entity: string; @@ -92,5 +92,5 @@ export interface AttributeRowConfig extends EntityConfig { attribute: string; prefix?: string; suffix?: string; - format?: TimestampRenderingFormats; + format?: TimestampRenderingFormat; } From bc09febd2c1f00c762e738f37b51856a03fa5f03 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 10:58:05 +0200 Subject: [PATCH 15/67] Use integration manifest for service documentation URL (#9960) --- src/components/ha-service-control.ts | 38 +++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/components/ha-service-control.ts b/src/components/ha-service-control.ts index a93b7aba26..f0b2c8abae 100644 --- a/src/components/ha-service-control.ts +++ b/src/components/ha-service-control.ts @@ -5,15 +5,18 @@ import { HassServiceTarget, } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; -import { customElement, property, state, query } from "lit/decorators"; +import { customElement, property, query, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../common/dom/fire_event"; import { computeDomain } from "../common/entity/compute_domain"; import { computeObjectId } from "../common/entity/compute_object_id"; +import { + fetchIntegrationManifest, + IntegrationManifest, +} from "../data/integration"; import { Selector } from "../data/selector"; import { PolymerChangedEvent } from "../polymer-types"; import { HomeAssistant } from "../types"; -import { documentationUrl } from "../util/documentation-url"; import "./ha-checkbox"; import "./ha-selector/ha-selector"; import "./ha-service-picker"; @@ -53,6 +56,8 @@ export class HaServiceControl extends LitElement { @state() private _checkedKeys = new Set(); + @state() private _manifest?: IntegrationManifest; + @query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor; protected updated(changedProperties: PropertyValues) { @@ -72,6 +77,19 @@ export class HaServiceControl extends LitElement { this.hass.services ); + // Fetch the manifest if we have a service selected and the service domain changed. + // If no service is selected, clear the manifest. + if (this.value?.service) { + if ( + !oldValue?.service || + computeDomain(this.value.service) !== computeDomain(oldValue.service) + ) { + this._fetchManifest(computeDomain(this.value?.service)); + } + } else { + this._manifest = undefined; + } + if ( serviceData && "target" in serviceData && @@ -177,12 +195,9 @@ export class HaServiceControl extends LitElement { >

${serviceData?.description}

- ${this.value?.service + ${this._manifest ? html` Date: Mon, 6 Sep 2021 11:01:18 +0200 Subject: [PATCH 16/67] Prevent index access errors in entity quick bar (#9964) Co-authored-by: Bram Kragten --- src/dialogs/quick-bar/ha-quick-bar.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index 62ff7ce0e4..e556a8bf62 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -299,6 +299,10 @@ export class QuickBar extends LitElement { private _handleSelected(ev: SingleSelectedEvent) { const index = ev.detail.index; + if (index < 0) { + return; + } + const item = ((ev.target as List).items[index] as any).item; this.processItemAndCloseDialog(item, index); } From 1073dbe6ab2073a04e6a991eddbfe599f0dd55d5 Mon Sep 17 00:00:00 2001 From: Sven Naumann Date: Mon, 6 Sep 2021 11:01:28 +0200 Subject: [PATCH 17/67] number slider: change column width check from 350px to 300px (#8310) --- src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts index 034e452231..90b174ab8d 100644 --- a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts @@ -152,7 +152,7 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { return; } - element.hidden = this.parentElement.clientWidth <= 350; + element.hidden = this.parentElement.clientWidth <= 300; } private get _inputElement(): { value: string } { From e7e27e794c32ba3c77c90c380624d6abdc517e20 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 11:19:58 +0200 Subject: [PATCH 18/67] Add refresh button to history panel (#9958) --- src/panels/history/ha-panel-history.ts | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts index 4da57cff25..c1f7ae5fd6 100644 --- a/src/panels/history/ha-panel-history.ts +++ b/src/panels/history/ha-panel-history.ts @@ -1,23 +1,24 @@ +import { mdiRefresh } from "@mdi/js"; import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; +import { + addDays, + endOfToday, + endOfWeek, + endOfYesterday, + startOfToday, + startOfWeek, + startOfYesterday, +} from "date-fns"; import { css, html, LitElement, PropertyValues } from "lit"; import { property, state } from "lit/decorators"; -import { - startOfWeek, - endOfWeek, - startOfToday, - endOfToday, - startOfYesterday, - endOfYesterday, - addDays, -} from "date-fns"; import { computeRTL } from "../../common/util/compute_rtl"; +import "../../components/chart/state-history-charts"; import "../../components/entity/ha-entity-picker"; import "../../components/ha-circular-progress"; import "../../components/ha-date-range-picker"; import type { DateRangePickerRanges } from "../../components/ha-date-range-picker"; import "../../components/ha-menu-button"; -import "../../components/chart/state-history-charts"; import { computeHistory, fetchDate } from "../../data/history"; import "../../layouts/ha-app-layout"; import { haStyle } from "../../resources/styles"; @@ -64,6 +65,12 @@ class HaPanelHistory extends LitElement { .narrow=${this.narrow} >
${this.hass.localize("panel.history")}
+ + + @@ -147,6 +154,10 @@ class HaPanelHistory extends LitElement { } } + private _refreshHistory() { + this._getHistory(); + } + private async _getHistory() { this._isLoading = true; const dateHistory = await fetchDate( From c6e83cb7c08f5dca56af18a82f315b4f279e7835 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 11:26:16 +0200 Subject: [PATCH 19/67] Add state_color support to entity card (#9617) --- src/components/entity/state-badge.ts | 65 +++++------ src/panels/lovelace/cards/hui-button-card.ts | 75 ++++++------- src/panels/lovelace/cards/hui-entity-card.ts | 103 ++++++++++-------- src/panels/lovelace/cards/types.ts | 1 + .../config-elements/hui-entity-card-editor.ts | 36 ++++-- 5 files changed, 159 insertions(+), 121 deletions(-) diff --git a/src/components/entity/state-badge.ts b/src/components/entity/state-badge.ts index 8dea329c93..2decae9151 100644 --- a/src/components/entity/state-badge.ts +++ b/src/components/entity/state-badge.ts @@ -129,38 +129,39 @@ export class StateBadge extends LitElement { } static get styles(): CSSResultGroup { - return css` - :host { - position: relative; - display: inline-block; - width: 40px; - color: var(--paper-item-icon-color, #44739e); - border-radius: 50%; - height: 40px; - text-align: center; - background-size: cover; - line-height: 40px; - vertical-align: middle; - box-sizing: border-box; - } - :host(:focus) { - outline: none; - } - :host(:not([icon]):focus) { - border: 2px solid var(--divider-color); - } - :host([icon]:focus) { - background: var(--divider-color); - } - ha-icon { - transition: color 0.3s ease-in-out, filter 0.3s ease-in-out; - } - .missing { - color: #fce588; - } - - ${iconColorCSS} - `; + return [ + iconColorCSS, + css` + :host { + position: relative; + display: inline-block; + width: 40px; + color: var(--paper-item-icon-color, #44739e); + border-radius: 50%; + height: 40px; + text-align: center; + background-size: cover; + line-height: 40px; + vertical-align: middle; + box-sizing: border-box; + } + :host(:focus) { + outline: none; + } + :host(:not([icon]):focus) { + border: 2px solid var(--divider-color); + } + :host([icon]:focus) { + background: var(--divider-color); + } + ha-icon { + transition: color 0.3s ease-in-out, filter 0.3s ease-in-out; + } + .missing { + color: #fce588; + } + `, + ]; } } diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 931147d268..16bb0346c4 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -250,48 +250,49 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { } static get styles(): CSSResultGroup { - return css` - ha-card { - cursor: pointer; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - padding: 4% 0; - font-size: 1.2rem; - height: 100%; - box-sizing: border-box; - justify-content: center; - position: relative; - } + return [ + iconColorCSS, + css` + ha-card { + cursor: pointer; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 4% 0; + font-size: 1.2rem; + height: 100%; + box-sizing: border-box; + justify-content: center; + position: relative; + } - ha-card:focus { - outline: none; - } + ha-card:focus { + outline: none; + } - ha-icon { - width: 40%; - height: auto; - color: var(--paper-item-icon-color, #44739e); - --mdc-icon-size: 100%; - } + ha-icon { + width: 40%; + height: auto; + color: var(--paper-item-icon-color, #44739e); + --mdc-icon-size: 100%; + } - ha-icon + span { - margin-top: 8px; - } + ha-icon + span { + margin-top: 8px; + } - ha-icon, - span { - outline: none; - } + ha-icon, + span { + outline: none; + } - .state { - font-size: 0.9rem; - color: var(--secondary-text-color); - } - - ${iconColorCSS} - `; + .state { + font-size: 0.9rem; + color: var(--secondary-text-color); + } + `, + ]; } private _computeBrightness(stateObj: HassEntity | LightEntity): string { diff --git a/src/panels/lovelace/cards/hui-entity-card.ts b/src/panels/lovelace/cards/hui-entity-card.ts index 5c46621b55..c87a5fbeee 100644 --- a/src/panels/lovelace/cards/hui-entity-card.ts +++ b/src/panels/lovelace/cards/hui-entity-card.ts @@ -7,13 +7,17 @@ import { TemplateResult, } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { ifDefined } from "lit/directives/if-defined"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { fireEvent } from "../../../common/dom/fire_event"; +import { computeActiveState } from "../../../common/entity/compute_active_state"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; +import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { stateIcon } from "../../../common/entity/state_icon"; import { isValidEntityId } from "../../../common/entity/valid_entity_id"; import { formatNumber } from "../../../common/string/format_number"; +import { iconColorCSS } from "../../../common/style/icon_color_css"; import "../../../components/ha-card"; import "../../../components/ha-icon"; import { UNAVAILABLE_STATES } from "../../../data/entity"; @@ -106,6 +110,7 @@ export class HuiEntityCard extends LitElement implements LovelaceCard { `; } + const domain = computeStateDomain(stateObj); const showUnit = this._config.attribute ? this._config.attribute in stateObj.attributes : !UNAVAILABLE_STATES.includes(stateObj.state); @@ -119,6 +124,13 @@ export class HuiEntityCard extends LitElement implements LovelaceCard {
@@ -189,56 +201,59 @@ export class HuiEntityCard extends LitElement implements LovelaceCard { } static get styles(): CSSResultGroup { - return css` - ha-card { - height: 100%; - display: flex; - flex-direction: column; - justify-content: space-between; - cursor: pointer; - outline: none; - } + return [ + iconColorCSS, + css` + ha-card { + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + cursor: pointer; + outline: none; + } - .header { - display: flex; - padding: 8px 16px 0; - justify-content: space-between; - } + .header { + display: flex; + padding: 8px 16px 0; + justify-content: space-between; + } - .name { - color: var(--secondary-text-color); - line-height: 40px; - font-weight: 500; - font-size: 16px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } + .name { + color: var(--secondary-text-color); + line-height: 40px; + font-weight: 500; + font-size: 16px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } - .icon { - color: var(--state-icon-color, #44739e); - line-height: 40px; - } + .icon { + color: var(--state-icon-color, #44739e); + line-height: 40px; + } - .info { - padding: 0px 16px 16px; - margin-top: -4px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - line-height: 28px; - } + .info { + padding: 0px 16px 16px; + margin-top: -4px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + line-height: 28px; + } - .value { - font-size: 28px; - margin-right: 4px; - } + .value { + font-size: 28px; + margin-right: 4px; + } - .measurement { - font-size: 18px; - color: var(--secondary-text-color); - } - `; + .measurement { + font-size: 18px; + color: var(--secondary-text-color); + } + `, + ]; } } diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index ffc25948da..ac4c4d6289 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -39,6 +39,7 @@ export interface EntityCardConfig extends LovelaceCardConfig { attribute?: string; unit?: string; theme?: string; + state_color?: boolean; } export interface EntitiesCardEntityConfig extends EntityConfig { diff --git a/src/panels/lovelace/editor/config-elements/hui-entity-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-entity-card-editor.ts index 55a033ef11..af18dd6edd 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entity-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-entity-card-editor.ts @@ -1,7 +1,7 @@ import "@polymer/paper-input/paper-input"; import { CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; -import { assert, object, optional, string, assign } from "superstruct"; +import { assert, assign, boolean, object, optional, string } from "superstruct"; import { fireEvent } from "../../../../common/dom/fire_event"; import { stateIcon } from "../../../../common/entity/state_icon"; import "../../../../components/entity/ha-entity-attribute-picker"; @@ -13,9 +13,9 @@ import "../../components/hui-entity-editor"; import "../../components/hui-theme-select-editor"; import { headerFooterConfigStructs } from "../../header-footer/structs"; import { LovelaceCardEditor } from "../../types"; +import { baseLovelaceCardConfig } from "../structs/base-card-struct"; import { EditorTarget, EntitiesEditorEvent } from "../types"; import { configElementStyle } from "./config-elements-style"; -import { baseLovelaceCardConfig } from "../structs/base-card-struct"; const cardConfigStruct = assign( baseLovelaceCardConfig, @@ -26,6 +26,7 @@ const cardConfigStruct = assign( attribute: optional(string()), unit: optional(string()), theme: optional(string()), + state_color: optional(boolean()), footer: optional(headerFooterConfigStructs), }) ); @@ -64,6 +65,10 @@ export class HuiEntityCardEditor return this._config!.unit || ""; } + get _state_color(): boolean { + return this._config!.state_color ?? false; + } + get _theme(): string { return this._config!.theme || ""; } @@ -135,12 +140,27 @@ export class HuiEntityCardEditor @value-changed=${this._valueChanged} >
- +
+ + + + + + +
`; } From 40664997e1bcc9c99913d5bd8073f5bd191b8833 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 6 Sep 2021 11:48:08 +0200 Subject: [PATCH 20/67] Use polyfill from toggleAttribute (#9969) --- src/components/trace/hat-trace-timeline.ts | 3 ++- src/panels/lovelace/cards/hui-grid-card.ts | 6 +++++- .../lovelace/components/hui-energy-period-selector.ts | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/trace/hat-trace-timeline.ts b/src/components/trace/hat-trace-timeline.ts index 64a0e07cfb..0ff605400d 100644 --- a/src/components/trace/hat-trace-timeline.ts +++ b/src/components/trace/hat-trace-timeline.ts @@ -19,6 +19,7 @@ import { ifDefined } from "lit/directives/if-defined"; import { formatDateTimeWithSeconds } from "../../common/datetime/format_date_time"; import relativeTime from "../../common/datetime/relative_time"; import { fireEvent } from "../../common/dom/fire_event"; +import { toggleAttribute } from "../../common/dom/toggle_attribute"; import { LogbookEntry } from "../../data/logbook"; import { ChooseAction, @@ -552,7 +553,7 @@ export class HaAutomationTracer extends LitElement { this.shadowRoot!.querySelectorAll( "ha-timeline[data-path]" ).forEach((el) => { - el.toggleAttribute("selected", this.selectedPath === el.dataset.path); + toggleAttribute(el, "selected", this.selectedPath === el.dataset.path); if (!this.allowPick || el.tabIndex === 0) { return; } diff --git a/src/panels/lovelace/cards/hui-grid-card.ts b/src/panels/lovelace/cards/hui-grid-card.ts index 05d1836a71..02a871f4ea 100644 --- a/src/panels/lovelace/cards/hui-grid-card.ts +++ b/src/panels/lovelace/cards/hui-grid-card.ts @@ -61,7 +61,11 @@ class HuiGridCard extends HuiStackCard { setConfig(config: GridCardConfig) { super.setConfig(config); this.style.setProperty("--grid-card-column-count", String(this.columns)); - this.toggleAttribute("square", this.square); + if (this.square) { + this.setAttribute("square", ""); + } else { + this.removeAttribute("square"); + } } static get styles(): CSSResultGroup { diff --git a/src/panels/lovelace/components/hui-energy-period-selector.ts b/src/panels/lovelace/components/hui-energy-period-selector.ts index 5af6eca46e..d2515d7dd9 100644 --- a/src/panels/lovelace/components/hui-energy-period-selector.ts +++ b/src/panels/lovelace/components/hui-energy-period-selector.ts @@ -33,6 +33,7 @@ import "@material/mwc-icon-button/mwc-icon-button"; import "../../../components/ha-svg-icon"; import "@material/mwc-button/mwc-button"; import "../../../components/ha-button-toggle-group"; +import { toggleAttribute } from "../../../common/dom/toggle_attribute"; const viewButtons: ToggleButton[] = [ { label: "Day", value: "day" }, @@ -55,7 +56,7 @@ export class HuiEnergyPeriodSelector extends SubscribeMixin(LitElement) { public connectedCallback() { super.connectedCallback(); - this.toggleAttribute("narrow", this.offsetWidth < 600); + toggleAttribute(this, "narrow", this.offsetWidth < 600); } public hassSubscribe(): UnsubscribeFunc[] { From 5a1070c30fa35d61bdd98b20acece99ce694b4ac Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 6 Sep 2021 13:13:01 +0200 Subject: [PATCH 21/67] Prevent darkMode overwrite by frontend_default_dark_theme (#9519) --- src/state/themes-mixin.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/state/themes-mixin.ts b/src/state/themes-mixin.ts index 6706c23288..9aa5a0ac2c 100644 --- a/src/state/themes-mixin.ts +++ b/src/state/themes-mixin.ts @@ -97,10 +97,6 @@ export default >(superClass: T) => themeSettings ); - // Now determine value that should be stored in the local storage settings - darkMode = - darkMode || !!(darkPreferred && this.hass.themes.default_dark_theme); - if (darkMode !== this.hass.themes.darkMode) { this._updateHass({ themes: { ...this.hass.themes!, darkMode }, From b3dedae11596f53ba2cce3b83580e7e5f27dcf53 Mon Sep 17 00:00:00 2001 From: Ruben Andrist Date: Mon, 6 Sep 2021 18:34:10 +0200 Subject: [PATCH 22/67] Add ResizeObserver to EntityRow (#9837) Co-authored-by: Bram Kragten --- .../hui-input-number-entity-row.ts | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts index 90b174ab8d..42976dee4f 100644 --- a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts @@ -10,11 +10,13 @@ import { import { customElement, property, state } from "lit/decorators"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-slider"; import { UNAVAILABLE_STATES } from "../../../data/entity"; import { setValue } from "../../../data/input_text"; import { HomeAssistant } from "../../../types"; import { hasConfigOrEntityChanged } from "../common/has-changed"; +import { installResizeObserver } from "../common/install-resize-observer"; import "../components/hui-generic-entity-row"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import { EntityConfig, LovelaceRow } from "./types"; @@ -29,6 +31,8 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { private _updated?: boolean; + private _resizeObserver?: ResizeObserver; + public setConfig(config: EntityConfig): void { if (!config) { throw new Error("Invalid configuration"); @@ -41,6 +45,11 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { if (this._updated && !this._loaded) { this._initialLoad(); } + this._attachObserver(); + } + + public disconnectedCallback(): void { + this._resizeObserver?.disconnect(); } protected firstUpdated(): void { @@ -48,6 +57,7 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { if (this.isConnected && !this._loaded) { this._initialLoad(); } + this._attachObserver(); } protected shouldUpdate(changedProps: PropertyValues): boolean { @@ -120,6 +130,9 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { static get styles(): CSSResultGroup { return css` + :host { + display: block; + } .flex { display: flex; align-items: center; @@ -146,13 +159,30 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { private async _initialLoad(): Promise { this._loaded = true; await this.updateComplete; - const element = this.shadowRoot!.querySelector(".state") as HTMLElement; + this._measureCard(); + } - if (!element || !this.parentElement) { + private _measureCard() { + if (!this.isConnected) { return; } + const element = this.shadowRoot!.querySelector(".state") as HTMLElement; + if (!element) { + return; + } + element.hidden = this.clientWidth <= 300; + } - element.hidden = this.parentElement.clientWidth <= 300; + private async _attachObserver(): Promise { + if (!this._resizeObserver) { + await installResizeObserver(); + this._resizeObserver = new ResizeObserver( + debounce(() => this._measureCard(), 250, false) + ); + } + if (this.isConnected) { + this._resizeObserver.observe(this); + } } private get _inputElement(): { value: string } { From 6ba6b821f59c71780b0b8d3ec95d79494c244c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Tue, 7 Sep 2021 10:21:51 +0300 Subject: [PATCH 23/67] Use SENSOR_DEVICE_CLASS_* constants more (#9982) --- src/common/entity/sensor_icon.ts | 3 ++- src/panels/lovelace/cards/hui-glance-card.ts | 4 +++- src/state-summary/state-card-display.ts | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/common/entity/sensor_icon.ts b/src/common/entity/sensor_icon.ts index 16d5b5c065..fa9bed83ce 100644 --- a/src/common/entity/sensor_icon.ts +++ b/src/common/entity/sensor_icon.ts @@ -2,6 +2,7 @@ import { HassEntity } from "home-assistant-js-websocket"; import { FIXED_DEVICE_CLASS_ICONS, UNIT_C, UNIT_F } from "../const"; import { batteryIcon } from "./battery_icon"; +import { SENSOR_DEVICE_CLASS_BATTERY } from "../../data/sensor"; export const sensorIcon = (stateObj?: HassEntity): string | undefined => { const dclass = stateObj?.attributes.device_class; @@ -10,7 +11,7 @@ export const sensorIcon = (stateObj?: HassEntity): string | undefined => { return FIXED_DEVICE_CLASS_ICONS[dclass]; } - if (dclass === "battery") { + if (dclass === SENSOR_DEVICE_CLASS_BATTERY) { return stateObj ? batteryIcon(stateObj) : "hass:battery"; } diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index d308df7b4e..d0a4b7bc95 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -23,6 +23,7 @@ import { CallServiceActionConfig, MoreInfoActionConfig, } from "../../../data/lovelace"; +import { SENSOR_DEVICE_CLASS_TIMESTAMP } from "../../../data/sensor"; import { HomeAssistant } from "../../../types"; import { actionHandler } from "../common/directives/action-handler-directive"; import { findEntities } from "../common/find-entities"; @@ -316,7 +317,8 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { ? html`
${computeDomain(entityConf.entity) === "sensor" && - stateObj.attributes.device_class === "timestamp" && + stateObj.attributes.device_class === + SENSOR_DEVICE_CLASS_TIMESTAMP && !UNAVAILABLE_STATES.includes(stateObj.state) ? html` ${computeDomain(this.stateObj.entity_id) === "sensor" && - this.stateObj.attributes.device_class === "timestamp" && + this.stateObj.attributes.device_class === + SENSOR_DEVICE_CLASS_TIMESTAMP && !UNAVAILABLE_STATES.includes(this.stateObj.state) ? html` Date: Tue, 7 Sep 2021 00:40:25 -0700 Subject: [PATCH 24/67] Small tweaks for the create automation from blueprint screen (#9980) --- .../automation/blueprint-automation-editor.ts | 156 +++++++++--------- 1 file changed, 80 insertions(+), 76 deletions(-) diff --git a/src/panels/config/automation/blueprint-automation-editor.ts b/src/panels/config/automation/blueprint-automation-editor.ts index a7ccc8c07c..f0179d2fbd 100644 --- a/src/panels/config/automation/blueprint-automation-editor.ts +++ b/src/panels/config/automation/blueprint-automation-editor.ts @@ -53,7 +53,8 @@ export class HaBlueprintAutomationEditor extends LitElement { protected render() { const blueprint = this._blueprint; - return html` + return html` + ${!this.narrow ? html` ${this.config.alias} ` : ""} @@ -118,81 +119,80 @@ export class HaBlueprintAutomationEditor extends LitElement { - - ${this.hass.localize( - "ui.panel.config.automation.editor.blueprint.header" - )} - -
- ${this._blueprints - ? Object.keys(this._blueprints).length - ? html` - - ` - : this.hass.localize( - "ui.panel.config.automation.editor.blueprint.no_blueprints" - ) - : html``} -
+ +
+ ${this._blueprints + ? Object.keys(this._blueprints).length + ? html` + + ` + : this.hass.localize( + "ui.panel.config.automation.editor.blueprint.no_blueprints" + ) + : html``} +
- ${this.config.use_blueprint.path - ? blueprint && "error" in blueprint - ? html`

- There is an error in this Blueprint: ${blueprint.error} -

` - : html`${blueprint?.metadata.description - ? html`` - : ""} - ${blueprint?.metadata?.input && - Object.keys(blueprint.metadata.input).length - ? Object.entries(blueprint.metadata.input).map( - ([key, value]) => - html` - ${value?.name || key} - ${value?.description} - ${value?.selector - ? html`` - : html``} - ` - ) - : html`

- ${this.hass.localize( - "ui.panel.config.automation.editor.blueprint.no_inputs" - )} -

`}` - : ""} -
-
`; + ${this.config.use_blueprint.path + ? blueprint && "error" in blueprint + ? html`

+ There is an error in this Blueprint: ${blueprint.error} +

` + : html`${blueprint?.metadata.description + ? html`` + : ""} + ${blueprint?.metadata?.input && + Object.keys(blueprint.metadata.input).length + ? Object.entries(blueprint.metadata.input).map( + ([key, value]) => + html` + ${value?.name || key} + ${value?.description} + ${value?.selector + ? html`` + : html``} + ` + ) + : html`

+ ${this.hass.localize( + "ui.panel.config.automation.editor.blueprint.no_inputs" + )} +

`}` + : ""} + + `; } private async _getBlueprints() { @@ -267,11 +267,15 @@ export class HaBlueprintAutomationEditor extends LitElement { return [ haStyle, css` + ha-card.blueprint { + max-width: 1040px; + margin: 24px auto; + } .padding { padding: 16px; } .blueprint-picker-container { - padding: 16px; + padding: 0 16px 16px; } h3 { margin: 16px; From 321f441b6356528747f3875a4958e9985ea3b72c Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 7 Sep 2021 10:14:05 +0200 Subject: [PATCH 25/67] Handle unavailable vacuums in more-info (#9974) --- .../more-info/controls/more-info-vacuum.ts | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts index c1841b7a5f..887a69cfb1 100644 --- a/src/dialogs/more-info/controls/more-info-vacuum.ts +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -7,6 +7,7 @@ import "../../../components/ha-attributes"; import "../../../components/ha-icon"; import "../../../components/ha-icon-button"; import "../../../components/ha-paper-dropdown-menu"; +import { UNAVAILABLE } from "../../../data/entity"; import { VacuumEntity, VACUUM_SUPPORT_BATTERY, @@ -98,31 +99,35 @@ class MoreInfoVacuum extends LitElement { "fan_speed,fan_speed_list,status,battery_level,battery_icon"; return html` -
- ${supportsFeature(stateObj, VACUUM_SUPPORT_STATUS) - ? html` -
- ${this.hass!.localize( - "ui.dialogs.more_info_control.vacuum.status" - )}: - - ${stateObj.attributes.status} -
- ` - : ""} - ${supportsFeature(stateObj, VACUUM_SUPPORT_BATTERY) - ? html` -
- - - ${stateObj.attributes.battery_level} % - -
- ` - : ""} -
- + ${stateObj.state !== UNAVAILABLE + ? html`
+ ${supportsFeature(stateObj, VACUUM_SUPPORT_STATUS) + ? html` +
+ ${this.hass!.localize( + "ui.dialogs.more_info_control.vacuum.status" + )}: + + ${stateObj.attributes.status} +
+ ` + : ""} + ${supportsFeature(stateObj, VACUUM_SUPPORT_BATTERY) && + stateObj.attributes.battery_level + ? html` +
+ + ${stateObj.attributes.battery_level} % + + +
+ ` + : ""} +
` + : ""} ${VACUUM_COMMANDS.some((item) => item.isVisible(stateObj)) ? html`
@@ -145,6 +150,7 @@ class MoreInfoVacuum extends LitElement { .title=${this.hass!.localize( `ui.dialogs.more_info_control.vacuum.${item.translationKey}` )} + .disabled=${stateObj.state === UNAVAILABLE} >
` @@ -161,6 +167,7 @@ class MoreInfoVacuum extends LitElement { .label=${this.hass!.localize( "ui.dialogs.more_info_control.vacuum.fan_speed" )} + .disabled=${stateObj.state === UNAVAILABLE} > Date: Tue, 7 Sep 2021 18:24:10 +0300 Subject: [PATCH 26/67] Add date device class (#9983) --- src/common/const.ts | 1 + src/util/hass-attributes-util.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/common/const.ts b/src/common/const.ts index e0d8f67a04..75413b8044 100644 --- a/src/common/const.ts +++ b/src/common/const.ts @@ -60,6 +60,7 @@ export const FIXED_DEVICE_CLASS_ICONS = { current: "hass:current-ac", carbon_dioxide: "mdi:molecule-co2", carbon_monoxide: "mdi:molecule-co", + date: "hass:calendar", energy: "hass:lightning-bolt", gas: "hass:gas-cylinder", humidity: "hass:water-percent", diff --git a/src/util/hass-attributes-util.ts b/src/util/hass-attributes-util.ts index 139287bc4b..d2c185c0cc 100644 --- a/src/util/hass-attributes-util.ts +++ b/src/util/hass-attributes-util.ts @@ -55,6 +55,7 @@ const hassAttributeUtil = { "carbon_dioxide", "carbon_monoxide", "current", + "date", "energy", "humidity", "illuminance", From d0edbec5fb082873a196853618dcdedb4939089f Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 7 Sep 2021 17:25:08 +0200 Subject: [PATCH 27/67] Copy resize observer to "non-input" number entity row (#9973) --- .../hui-input-number-entity-row.ts | 4 +- .../entity-rows/hui-number-entity-row.ts | 40 ++++++++++++++++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts index 42976dee4f..5a60ee4210 100644 --- a/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts @@ -132,6 +132,7 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { return css` :host { display: block; + cursor: pointer; } .flex { display: flex; @@ -150,9 +151,6 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { width: 100%; max-width: 200px; } - :host { - cursor: pointer; - } `; } diff --git a/src/panels/lovelace/entity-rows/hui-number-entity-row.ts b/src/panels/lovelace/entity-rows/hui-number-entity-row.ts index e280a28e61..1e6c76b97c 100644 --- a/src/panels/lovelace/entity-rows/hui-number-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-number-entity-row.ts @@ -10,11 +10,13 @@ import { import { customElement, property, state } from "lit/decorators"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-slider"; import { UNAVAILABLE } from "../../../data/entity"; import { setValue } from "../../../data/input_text"; import { HomeAssistant } from "../../../types"; import { hasConfigOrEntityChanged } from "../common/has-changed"; +import { installResizeObserver } from "../common/install-resize-observer"; import "../components/hui-generic-entity-row"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import { EntityConfig, LovelaceRow } from "./types"; @@ -29,6 +31,8 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { private _updated?: boolean; + private _resizeObserver?: ResizeObserver; + public setConfig(config: EntityConfig): void { if (!config) { throw new Error("Invalid configuration"); @@ -41,6 +45,11 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { if (this._updated && !this._loaded) { this._initialLoad(); } + this._attachObserver(); + } + + public disconnectedCallback(): void { + this._resizeObserver?.disconnect(); } protected firstUpdated(): void { @@ -48,6 +57,7 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { if (this.isConnected && !this._loaded) { this._initialLoad(); } + this._attachObserver(); } protected shouldUpdate(changedProps: PropertyValues): boolean { @@ -120,6 +130,10 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { static get styles(): CSSResultGroup { return css` + :host { + cursor: pointer; + display: block; + } .flex { display: flex; align-items: center; @@ -137,22 +151,36 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { width: 100%; max-width: 200px; } - :host { - cursor: pointer; - } `; } private async _initialLoad(): Promise { this._loaded = true; await this.updateComplete; - const element = this.shadowRoot!.querySelector(".state") as HTMLElement; + this._measureCard(); + } - if (!element || !this.parentElement) { + private _measureCard() { + if (!this.isConnected) { return; } + const element = this.shadowRoot!.querySelector(".state") as HTMLElement; + if (!element) { + return; + } + element.hidden = this.clientWidth <= 300; + } - element.hidden = this.parentElement.clientWidth <= 350; + private async _attachObserver(): Promise { + if (!this._resizeObserver) { + await installResizeObserver(); + this._resizeObserver = new ResizeObserver( + debounce(() => this._measureCard(), 250, false) + ); + } + if (this.isConnected) { + this._resizeObserver.observe(this); + } } private get _inputElement(): { value: string } { From 5f3e980de030fcc39118f9d69194988632f07d4e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 7 Sep 2021 14:49:08 -0700 Subject: [PATCH 28/67] Add gas unit error (#9981) --- src/panels/config/energy/ha-config-energy.ts | 1 + src/translations/en.json | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/panels/config/energy/ha-config-energy.ts b/src/panels/config/energy/ha-config-energy.ts index 5598aaaf3f..46b1e597ed 100644 --- a/src/panels/config/energy/ha-config-energy.ts +++ b/src/panels/config/energy/ha-config-energy.ts @@ -105,6 +105,7 @@ class HaConfigEnergy extends LitElement { Date: Thu, 9 Sep 2021 15:42:14 +0200 Subject: [PATCH 29/67] Adjust dev-tools wording: "Active listeners" (#9991) --- src/panels/developer-tools/event/developer-tools-event.js | 2 +- src/translations/en.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/developer-tools/event/developer-tools-event.js b/src/panels/developer-tools/event/developer-tools-event.js index cbab86c852..399c2be3d9 100644 --- a/src/panels/developer-tools/event/developer-tools-event.js +++ b/src/panels/developer-tools/event/developer-tools-event.js @@ -105,7 +105,7 @@ class HaPanelDevEvent extends EventsMixin(LocalizeMixin(PolymerElement)) {
- [[localize( 'ui.panel.developer-tools.tabs.events.available_events' + [[localize( 'ui.panel.developer-tools.tabs.events.active_listeners' )]]
Date: Thu, 9 Sep 2021 15:42:42 +0200 Subject: [PATCH 30/67] Consistent lower-case spelling of "optional" and "required" (#9990) --- src/translations/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index feeb91a3ea..499e56bb86 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1498,7 +1498,7 @@ }, "state": { "label": "State", - "attribute": "Attribute (Optional)", + "attribute": "Attribute (optional)", "from": "From", "for": "For", "to": "To" @@ -3114,8 +3114,8 @@ "change_type": "Change type" }, "config": { - "required": "Required", - "optional": "Optional" + "required": "required", + "optional": "optional" }, "entities": { "name": "Entities", From aba96674f3e8013223c7f31288f8a9eddb139caa Mon Sep 17 00:00:00 2001 From: Timothy Kist Date: Thu, 9 Sep 2021 16:43:07 +0100 Subject: [PATCH 31/67] Use unicode ellipsis instead of 3 dots "..." (#9997) --- src/translations/en.json | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index 499e56bb86..dae6405e5b 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -381,7 +381,7 @@ "clear": "Clear", "show_areas": "Show areas", "area": "Area", - "add_new": "Add new area...", + "add_new": "Add new area…", "no_areas": "You don't have any areas", "no_match": "No matching areas found", "add_dialog": { @@ -462,11 +462,11 @@ }, "history_charts": { "history_disabled": "History integration disabled", - "loading_history": "Loading state history...", + "loading_history": "Loading state history…", "no_history_found": "No state history found." }, "statistics_charts": { - "loading_statistics": "Loading statistics...", + "loading_statistics": "Loading statistics…", "no_statistics_found": "No statistics found.", "statistic_types": { "min": "min", @@ -904,7 +904,7 @@ }, "notification_toast": { "service_call_failed": "Failed to call service {service}.", - "connection_lost": "Connection lost. Reconnecting...", + "connection_lost": "Connection lost. Reconnecting…", "started": "Home Assistant has started!", "starting": "Home Assistant is starting, not everything will be available until it is finished.", "wrapping_up_startup": "Wrapping up startup, not everything will be available until it is finished.", @@ -1212,7 +1212,7 @@ "description": "View the Home Assistant logs", "details": "Log Details ({level})", "load_full_log": "Load Full Home Assistant Log", - "loading_log": "Loading error log...", + "loading_log": "Loading error log…", "no_errors": "No errors have been reported", "no_issues": "There are no new issues!", "clear": "Clear", @@ -1353,7 +1353,7 @@ }, "server_management": { "heading": "Server management", - "introduction": "Control your Home Assistant server... from Home Assistant.", + "introduction": "Control your Home Assistant server… from Home Assistant.", "restart": "Restart", "confirm_restart": "Are you sure you want to restart Home Assistant?", "stop": "Stop", @@ -1774,9 +1774,9 @@ "community_forums": "community forums", "url": "URL of the blueprint", "raw_blueprint": "Blueprint content", - "importing": "Loading blueprint...", + "importing": "Loading blueprint…", "import_btn": "Preview blueprint", - "saving": "Importing blueprint...", + "saving": "Importing blueprint…", "save_btn": "Import blueprint", "error_no_url": "Please enter the URL of the blueprint.", "unsupported_blueprint": "This blueprint is not supported", @@ -1947,9 +1947,9 @@ "integrations_introduction2": "Check the website for ", "integrations_link_all_features": " all available features", "connected": "Connected", - "connecting": "Connecting...", + "connecting": "Connecting…", "not_connected": "Not Connected", - "fetching_subscription": "Fetching subscription...", + "fetching_subscription": "Fetching subscription…", "tts": { "title": "Text to Speech", "info": "Bring personality to your home by having it speak to you by using our Text-to-Speech services. You can use this in automations and scripts by using the {service} service.", @@ -2021,7 +2021,7 @@ "no_hooks_yet2": " or by creating a ", "no_hooks_yet_link_automation": "webhook automation", "link_learn_more": "Learn more about creating webhook-powered automations.", - "loading": "Loading...", + "loading": "Loading…", "manage": "Manage", "disable_hook_error_msg": "Failed to disable webhook:" } @@ -2098,17 +2098,17 @@ "create": "Create automation with device", "create_disable": "Can't create automation with disabled device", "triggers": { - "caption": "Do something when...", + "caption": "Do something when…", "no_triggers": "No triggers", "unknown_trigger": "Unknown trigger" }, "conditions": { - "caption": "Only do something if...", + "caption": "Only do something if…", "no_conditions": "No conditions", "unknown_condition": "Unknown condition" }, "actions": { - "caption": "When something is triggered...", + "caption": "When something is triggered…", "no_actions": "No actions", "unknown_action": "Unknown action" }, @@ -2494,7 +2494,7 @@ "wakeup_header": "Wake-up Instructions for", "wakeup_instructions_source": "Wake-up instructions are sourced from the OpenZWave community device database.", "start_refresh_button": "Start Refresh", - "refreshing_description": "Refreshing node information...", + "refreshing_description": "Refreshing node information…", "node_status": "Node Status", "step": "Step" }, @@ -2575,7 +2575,7 @@ "update_button": "Update Configuration" }, "add_device_page": { - "spinner": "Searching for ZHA Zigbee devices...", + "spinner": "Searching for ZHA Zigbee devices…", "pairing_mode": "Make sure your devices are in pairing mode. Check the instructions of your device on how to do this.", "discovered_text": "Devices will show up here once discovered.", "no_devices_found": "No devices were found, make sure they are in pairing mode and keep them awake while discovering is running.", @@ -2705,7 +2705,7 @@ }, "network_status": { "network_stopped": "Z-Wave Network Stopped", - "network_starting": "Starting Z-Wave Network...", + "network_starting": "Starting Z-Wave Network…", "network_starting_note": "This may take a while depending on the size of your network.", "network_started": "Z-Wave Network Started", "network_started_note_some_queried": "Awake nodes have been queried. Sleeping nodes will be queried when they wake.", @@ -2879,7 +2879,7 @@ "logs": { "title": "Z-Wave JS Logs", "log_level": "Log Level", - "subscribed_to_logs": "Subscribed to Z-Wave JS Log Messages...", + "subscribed_to_logs": "Subscribed to Z-Wave JS Log Messages…", "log_level_changed": "Log Level changed to: {level}" } } @@ -2924,7 +2924,7 @@ "description": "Home Assistant ran into trouble while loading your configuration and is now running in safe mode. Take a look at the error log to see what went wrong." }, "starting": { - "description": "Home Assistant is starting, please wait..." + "description": "Home Assistant is starting, please wait…" } }, "unused_entities": { @@ -3820,7 +3820,7 @@ "log": "Log" }, "configuration": { - "no_configuration": "This add-on does not expose configuration for you to mess with...", + "no_configuration": "This add-on does not expose configuration for you to mess with…", "audio": { "header": "Audio", "default": "Default", From 360c2cbfa30d3cea2d03826c0f82b5352270d243 Mon Sep 17 00:00:00 2001 From: Michael Irigoyen Date: Fri, 10 Sep 2021 09:49:32 -0500 Subject: [PATCH 32/67] Update Material Design Icons to `v6.1.95` (#10002) * Update MDI to v6, add icon deprecation mapping * Add removed icon path data to build tools * Resolve incorrect MDI icon import name --- build-scripts/removedIcons.json | 103 ++++++- package.json | 4 +- src/components/ha-icon.ts | 330 ++++++++++++++++++++++- src/components/trace/hat-script-graph.ts | 4 +- yarn.lock | 20 +- 5 files changed, 445 insertions(+), 16 deletions(-) diff --git a/build-scripts/removedIcons.json b/build-scripts/removedIcons.json index fe51488c70..3949b1f13e 100644 --- a/build-scripts/removedIcons.json +++ b/build-scripts/removedIcons.json @@ -1 +1,102 @@ -[] +[ + { + "path": "M21.8 14.5C21.3 13.7 20.1 13.4 18.1 13.4C17.4 13.4 16.7 13.4 16 13.5C15.5 13.2 15 12.9 14.6 12.6C13.6 11.8 12.7 10.3 12 8.5C12 8.5 12 8.4 12.1 8.3C12.6 6.2 13.1 3.6 12.1 2.5C11.8 2.2 11.5 2.1 11.1 2.1H10.7C10.1 2.1 9.6 2.7 9.4 3.3C8.8 5.4 9.2 6.6 9.8 8.5C9.4 10 8.9 11.6 8 13.3C7.5 14.4 6.9 15.4 6.5 16.2C5.9 16.5 5.4 16.8 5.1 17C3.2 18.2 2.2 19.6 2.1 20.4C2 20.7 2 21 2.1 21.2V21.3L2.9 21.8C3.1 21.9 3.4 22 3.6 22C4.9 22 6.4 20.5 8.4 17C8.5 17 8.6 16.9 8.7 16.9C10.4 16.4 12.4 16 15.2 15.7C16.8 16.5 18.8 16.9 20 16.9C20.7 16.9 21.2 16.7 21.5 16.4C21.8 16.1 21.9 15.7 22 15.3C22 15 22 14.7 21.8 14.5M3.4 20.9C3.5 20.3 4.2 19.2 5.4 18.2C5.6 18.1 5.8 17.9 6.2 17.7C5 19.6 4.1 20.6 3.4 20.9M10.8 3.2C10.9 3.1 10.9 3 11 3L11.2 3.1C11.5 3.5 11.5 4 11.3 4.9V5.2C11.2 5.6 11.2 6 11 6.5C10.6 5 10.6 3.9 10.8 3.2M8.8 15.8L8.6 15.9C8.7 15.4 9.1 14.8 9.4 14.2C10.1 12.8 10.7 11.5 11 10.3C11.7 11.8 12.5 12.9 13.5 13.8C13.7 14 13.9 14.2 14.2 14.3C12.8 14.5 10.9 15 8.8 15.8M20.9 15.7H20.5C19.8 15.7 18.6 15.4 17.4 14.9C17.5 14.7 17.7 14.7 17.8 14.7C20.1 14.7 20.7 15.1 20.9 15.3C21 15.4 21 15.4 21 15.5C21 15.6 21 15.6 20.9 15.7Z", + "name": "adobe-acrobat" + }, + { + "path": "M14.58,3H22V19.67L14.58,3M9.42,3H2V19.67L9.42,3M12,9.17L16.67,19.67H13.5L12.17,16.33H8.75L12,9.17Z", + "name": "adobe" + }, + { + "path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M10.43,21.87V19.91C10.43,19.22 10,18.57 9.35,18.3C6.91,17.26 5.17,14.83 5.17,12C5.17,8.26 8.22,5.17 12,5.17C15.78,5.17 18.83,8.26 18.83,12C18.83,16.43 15.39,20.61 10.43,21.87Z", + "name": "amazon-alexa" + }, + { + "path": "M15.93,17.09C15.75,17.25 15.5,17.26 15.3,17.15C14.41,16.41 14.25,16.07 13.76,15.36C12.29,16.86 11.25,17.31 9.34,17.31C7.09,17.31 5.33,15.92 5.33,13.14C5.33,10.96 6.5,9.5 8.19,8.76C9.65,8.12 11.68,8 13.23,7.83V7.5C13.23,6.84 13.28,6.09 12.9,5.54C12.58,5.05 11.95,4.84 11.4,4.84C10.38,4.84 9.47,5.37 9.25,6.45C9.2,6.69 9,6.93 8.78,6.94L6.18,6.66C5.96,6.61 5.72,6.44 5.78,6.1C6.38,2.95 9.23,2 11.78,2C13.08,2 14.78,2.35 15.81,3.33C17.11,4.55 17,6.18 17,7.95V12.12C17,13.37 17.5,13.93 18,14.6C18.17,14.85 18.21,15.14 18,15.31L15.94,17.09H15.93M13.23,10.56V10C11.29,10 9.24,10.39 9.24,12.67C9.24,13.83 9.85,14.62 10.87,14.62C11.63,14.62 12.3,14.15 12.73,13.4C13.25,12.47 13.23,11.6 13.23,10.56M20.16,19.54C18,21.14 14.82,22 12.1,22C8.29,22 4.85,20.59 2.25,18.24C2.05,18.06 2.23,17.81 2.5,17.95C5.28,19.58 8.75,20.56 12.33,20.56C14.74,20.56 17.4,20.06 19.84,19.03C20.21,18.87 20.5,19.27 20.16,19.54M21.07,18.5C20.79,18.14 19.22,18.33 18.5,18.42C18.31,18.44 18.28,18.26 18.47,18.12C19.71,17.24 21.76,17.5 22,17.79C22.24,18.09 21.93,20.14 20.76,21.11C20.58,21.27 20.41,21.18 20.5,21C20.76,20.33 21.35,18.86 21.07,18.5Z", + "name": "amazon" + }, + { + "path": "M22.78,17.91C22.94,18.16 23,18.42 23,18.7C23,19.08 22.87,19.39 22.57,19.64C22.27,19.89 21.94,20 21.56,20H19.08L12.42,8H11.58L4.92,20H2.39C1.92,20 1.53,19.8 1.22,19.38C0.91,18.96 0.89,18.5 1.17,18L10.78,1.69C11.09,1.22 11.5,1 12,1C12.53,1 12.92,1.22 13.17,1.69L22.78,17.91M4.78,22.31L12,9.38L19.22,22.31L18.5,23L12,20.34L5.44,23L4.78,22.31Z", + "name": "android-auto" + }, + { + "path": "M15,9A1,1 0 0,1 14,8A1,1 0 0,1 15,7A1,1 0 0,1 16,8A1,1 0 0,1 15,9M9,9A1,1 0 0,1 8,8A1,1 0 0,1 9,7A1,1 0 0,1 10,8A1,1 0 0,1 9,9M16.12,4.37L18.22,2.27L17.4,1.44L15.09,3.75C14.16,3.28 13.11,3 12,3C10.88,3 9.84,3.28 8.91,3.75L6.6,1.44L5.78,2.27L7.88,4.37C6.14,5.64 5,7.68 5,10V11H19V10C19,7.68 17.86,5.64 16.12,4.37M5,16C5,19.86 8.13,23 12,23A7,7 0 0,0 19,16V12H5V16Z", + "name": "android-debug-bridge" + }, + { + "path": "M22,6L15.5,18H2L8.5,6H22Z", + "name": "bandcamp" + }, + { + "path": "M19.92,10.76C19.92,10.76 22.5,12.24 22.5,13.89C22.5,15.5 19.5,16.06 16.18,15.9C16.18,15.9 14.77,17.87 13.42,18.7C14.88,21.44 16,22.5 15.97,22.5C15.97,22.5 15.23,22.69 13,19.04C11.66,19.89 10.17,20.23 9.56,19.7C8.94,19.17 9.42,18.28 9.68,17.85C9.41,18 8,18.83 6.75,18.83C5.26,18.83 5.05,17.72 5.05,17.15C5.05,15 7.12,12 7.12,12C7.12,12 6.16,9.88 6.05,8.22C4.17,8.06 2,8.39 1.53,8.54C1.4,8.54 1.84,8.22 2,8.18C2.15,8.13 3.91,7.67 6,7.67C6,5.93 6.35,4.33 7.41,4.33C8.13,4.33 8.71,5.45 8.71,5.45C8.71,5.45 8.7,1.5 10.74,1.5C12.8,1.5 15,6.11 15,6.11C15,6.11 17.22,6.32 18.85,7.09C19.5,5.73 20.09,5.11 20.81,3C21,3.7 20.2,5.5 19.35,7.3V7.3H19.35C19.35,7.3 21.65,8.5 21.65,9.83C21.65,10.84 19.92,10.76 19.92,10.76M10.68,18.58C11.36,18.69 12.41,18.1 12.4,18.1L11.58,16.57L10.4,17.4C10.39,17.41 9.64,18.38 10.68,18.58M20.15,9.76C20.15,9.1 18.95,8.35 18.81,8.27L17.89,9.75L19.17,10.37C19.59,10.34 20.15,10.35 20.15,9.76M8,5.63C7.7,5.63 7.09,6.07 7.09,7.64L8.83,7.7L8.72,6.3C8.6,6 8.3,5.63 8,5.63M10.18,15.78C8.92,15.13 8.16,14.06 7.54,12.9C7.54,12.9 5.96,15.55 6.97,16.22C8,16.89 9.64,16.16 10.18,15.78M12.97,17.76C14.11,16.89 17.19,14.73 17.45,11.08C14.57,9.44 10.62,8.71 10.62,8.71C10.62,8.71 10.61,8.21 10.7,7.86C11.64,7.97 14.59,8.47 17.03,9.43C16.35,8.28 15.84,7.85 15.37,7.5C16.53,7.76 17.36,9.26 17.36,9.26L18.28,7.96C18.28,7.96 13.91,5.61 10.19,7.42C10.11,10.3 11.59,14.56 11.59,14.56L10.82,14.89C10.3,13.84 9.63,12.09 9,8.67C8.7,9.08 8.17,9.55 8.16,11.09C7.7,9.8 8.66,8.43 8.67,8.42L7.07,8.26C7.17,9.92 8.05,14.2 10.68,15.53C13,14.21 15.5,11.54 16.13,10.77L16.82,11.28L12.35,15.97C13.59,16 14.32,15.72 14.82,15.5C14.1,16.25 12.86,16.32 12.27,16.32C12.28,16.34 12.57,17.07 12.97,17.76M14.03,6.05C14,5.97 12.66,3.69 11.47,3.86C10.69,4.11 10.24,5.43 10.23,6.87C10.76,6.56 12,6 14.03,6.05M16.71,15.07C16.71,15.07 20,15 19.9,13.76C19.9,12.56 17.92,11.33 17.92,11.35C17.93,13.47 16.71,15.07 16.71,15.07Z", + "name": "battlenet" + }, + { + "path": "M12.5 10H10C9.45 10 9 9.55 9 9C9 8.45 9.45 8 10 8H12.5C13.05 8 13.5 8.45 13.5 9C13.5 9.55 13.05 10 12.5 10M15 14C15 13.45 14.55 13 14 13H10C9.45 13 9 13.45 9 14C9 14.55 9.45 15 10 15H14C14.55 15 15 14.55 15 14M22 4V20C22 21.11 21.11 22 20 22H4C2.89 22 2 21.11 2 20V4C2 2.89 2.89 2 4 2H20C21.11 2 22 2.89 22 4M18 12C18 12 18 11 17 11C16.05 11.03 16 10 16 10L16 8C16 6.34 14.66 5 13 5H9C7.34 5 6 6.34 6 8V15C6 16.66 7.34 18 9 18H15C16.66 18 18 16.66 18 15L18 12Z", + "name": "blogger" + }, + { + "path": "M12.6,2.86C15.27,4.1 18,5.39 20.66,6.63C20.81,6.7 21,6.75 21,6.95C21,7.15 20.81,7.19 20.66,7.26C18,8.5 15.3,9.77 12.62,11C12.21,11.21 11.79,11.21 11.38,11C8.69,9.76 6,8.5 3.32,7.25C3.18,7.19 3,7.14 3,6.94C3,6.76 3.18,6.71 3.31,6.65C6,5.39 8.74,4.1 11.44,2.85C11.73,2.72 12.3,2.73 12.6,2.86M12,21.15C11.8,21.15 11.66,21.07 11.38,20.97C8.69,19.73 6,18.47 3.33,17.22C3.19,17.15 3,17.11 3,16.9C3,16.7 3.19,16.66 3.34,16.59C3.78,16.38 4.23,16.17 4.67,15.96C5.12,15.76 5.56,15.76 6,15.97C7.79,16.8 9.57,17.63 11.35,18.46C11.79,18.67 12.23,18.66 12.67,18.46C14.45,17.62 16.23,16.79 18,15.96C18.44,15.76 18.87,15.75 19.29,15.95C19.77,16.16 20.24,16.39 20.71,16.61C20.78,16.64 20.85,16.68 20.91,16.73C21.04,16.83 21.04,17 20.91,17.08C20.83,17.14 20.74,17.19 20.65,17.23C18,18.5 15.33,19.72 12.66,20.95C12.46,21.05 12.19,21.15 12,21.15M12,16.17C11.9,16.17 11.55,16.07 11.36,16C8.68,14.74 6,13.5 3.34,12.24C3.2,12.18 3,12.13 3,11.93C3,11.72 3.2,11.68 3.35,11.61C3.8,11.39 4.25,11.18 4.7,10.97C5.13,10.78 5.56,10.78 6,11C7.78,11.82 9.58,12.66 11.38,13.5C11.79,13.69 12.21,13.69 12.63,13.5C14.43,12.65 16.23,11.81 18.04,10.97C18.45,10.78 18.87,10.78 19.29,10.97C19.76,11.19 20.24,11.41 20.71,11.63C20.77,11.66 20.84,11.69 20.9,11.74C21.04,11.85 21.04,12 20.89,12.12C20.84,12.16 20.77,12.19 20.71,12.22C18,13.5 15.31,14.75 12.61,16C12.42,16.09 12.08,16.17 12,16.17Z", + "name": "buffer" + }, + { + "path": "M20,18H4V6H20M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4M11,17H13V16H14A1,1 0 0,0 15,15V12A1,1 0 0,0 14,11H11V10H15V8H13V7H11V8H10A1,1 0 0,0 9,9V12A1,1 0 0,0 10,13H13V14H9V16H11V17Z", + "name": "cash-usd-outline" + }, + { + "path": "M20 4H4C2.89 4 2 4.89 2 6V18C2 19.11 2.9 20 4 20H20C21.11 20 22 19.11 22 18V6C22 4.89 21.1 4 20 4M15 10H11V11H14C14.55 11 15 11.45 15 12V15C15 15.55 14.55 16 14 16H13V17H11V16H9V14H13V13H10C9.45 13 9 12.55 9 12V9C9 8.45 9.45 8 10 8H11V7H13V8H15V10Z", + "name": "cash-usd" + }, + { + "path": "M10.94 12.09A1.06 1.06 0 1 0 11.91 10.95A1.06 1.06 0 0 0 10.94 12.09M13.54 13.21A2.62 2.62 0 0 1 12.58 13.88L12.57 13.89A11.17 11.17 0 0 0 13.87 16.92A4.83 4.83 0 0 1 12.92 17.3A4.9 4.9 0 0 1 12.24 17.44L12.16 17.45L12.06 17.46L11.87 17.47C11.75 17.47 11.64 17.5 11.5 17.47A5 5 0 0 1 10.79 17.4A5.13 5.13 0 0 1 10.09 17.23A4.78 4.78 0 0 1 9.46 17A5 5 0 0 1 8.93 16.68A4.45 4.45 0 0 1 8.5 16.38C8.38 16.29 8.28 16.19 8.2 16.12L7.95 15.87C7.95 15.87 8 15.97 8.16 16.15C8.24 16.23 8.32 16.34 8.44 16.45A4.93 4.93 0 0 0 8.82 16.82A5.21 5.21 0 0 0 9.33 17.2A5.08 5.08 0 0 0 9.96 17.56A5.43 5.43 0 0 0 10.68 17.85A5.5 5.5 0 0 0 11.46 18.03C11.6 18.06 11.74 18.07 11.88 18.08L12.07 18.1H12.27A5.5 5.5 0 0 0 13.07 18.05A5.61 5.61 0 0 0 14.39 17.7Q14.63 18.03 14.9 18.34L14.87 18.36L14.66 18.5H14.62C14.59 18.53 14.67 18.5 14.66 18.5H14.64L14.58 18.54L14.44 18.61L14.37 18.64L14.33 18.66L14.32 18.67H14.31C14.3 18.68 14.36 18.66 14.33 18.67H14.32L14.17 18.74Q14.09 18.77 14 18.81V18.82L13.93 18.84L13.84 18.87A6.5 6.5 0 0 1 12.25 19.26A6.4 6.4 0 0 1 11.31 19.3H11.19L11.07 19.29L10.81 19.27C10.65 19.24 10.5 19.23 10.33 19.2A6.59 6.59 0 0 1 8.5 18.57C8.35 18.5 8.21 18.43 8.08 18.35C7.95 18.27 7.83 18.19 7.71 18.11A6.64 6.64 0 0 1 7.07 17.6A6.35 6.35 0 0 1 6.57 17.11C6.43 16.96 6.32 16.82 6.22 16.7C6.13 16.58 6.06 16.5 6 16.42L5.94 16.32L6 16.43C6.04 16.5 6.1 16.6 6.18 16.73C6.26 16.86 6.36 17 6.5 17.18A6.5 6.5 0 0 0 6.94 17.73A6.86 6.86 0 0 0 7.55 18.31C7.67 18.41 7.78 18.5 7.91 18.6C8.04 18.7 8.17 18.79 8.31 18.88A7.12 7.12 0 0 0 9.21 19.37A7.2 7.2 0 0 0 10.2 19.74C10.37 19.8 10.55 19.83 10.73 19.87L11 19.92L11.11 19.94L11.25 19.96A7.27 7.27 0 0 0 12.29 20.03A7.38 7.38 0 0 0 14.14 19.77L14.23 19.74L14.28 19.73L14.34 19.71C14.4 19.69 14.46 19.68 14.5 19.66L14.68 19.6L14.85 19.54L15 19.5L15.06 19.45H15.08L15.13 19.43L15.14 19.42L15.17 19.41L15.39 19.3L15.67 19.16C15.86 19.34 16.06 19.5 16.26 19.69C16.26 19.69 17.23 20.69 17.76 20.28C18.26 19.89 17.68 18.68 17.68 18.68A11.2 11.2 0 0 0 13.54 13.21M10.16 11.57L10.15 11.56A11.18 11.18 0 0 0 6.91 11.11A4.72 4.72 0 0 1 7.34 9.39L7.38 9.31L7.42 9.23L7.5 9.06C7.57 8.96 7.62 8.85 7.69 8.75A4.97 4.97 0 0 1 8.14 8.17A5.05 5.05 0 0 1 8.66 7.67A4.77 4.77 0 0 1 9.2 7.27A5.06 5.06 0 0 1 9.74 7A4.88 4.88 0 0 1 10.22 6.78C10.37 6.72 10.5 6.69 10.61 6.66C10.82 6.6 10.95 6.58 10.95 6.58S10.82 6.59 10.6 6.61C10.5 6.63 10.35 6.64 10.19 6.68A4.94 4.94 0 0 0 9.67 6.82A5.34 5.34 0 0 0 9.08 7.05A5.08 5.08 0 0 0 8.45 7.39A5.47 5.47 0 0 0 7.82 7.84A5.55 5.55 0 0 0 7.25 8.41C7.16 8.5 7.08 8.63 7 8.74L6.88 8.89L6.82 8.97L6.76 9.06A5.5 5.5 0 0 0 6.38 9.77A5.61 5.61 0 0 0 5.97 11.14L5.96 11.16C5.7 11.18 5.43 11.21 5.16 11.26V11.12L5.17 10.87V10.82C5.17 10.78 5.16 10.88 5.16 10.87V10.84L5.17 10.77L5.18 10.62L5.19 10.54V10.5H5.2V10.47C5.2 10.46 5.19 10.5 5.19 10.5L5.22 10.32L5.24 10.14L5.25 10.12V10.11L5.24 10.13L5.25 10.12V10.11L5.26 10.07L5.27 9.97A6.5 6.5 0 0 1 6.26 7.59L6.32 7.5L6.39 7.4L6.55 7.19C6.65 7.07 6.74 6.94 6.86 6.82A6.61 6.61 0 0 1 8.37 5.59C8.5 5.5 8.64 5.43 8.77 5.37C8.9 5.29 9.04 5.24 9.17 5.18A6.76 6.76 0 0 1 9.94 4.9A6.5 6.5 0 0 1 10.62 4.74C10.82 4.69 11 4.68 11.15 4.66C11.3 4.64 11.42 4.64 11.5 4.63L11.62 4.62H11.5C11.42 4.62 11.3 4.61 11.15 4.61C11 4.61 10.82 4.61 10.61 4.63A6.41 6.41 0 0 0 9.9 4.73A7.03 7.03 0 0 0 9.08 4.93C8.94 5 8.79 5.03 8.65 5.09C8.5 5.14 8.35 5.21 8.2 5.28A7.26 7.26 0 0 0 7.31 5.78A7.33 7.33 0 0 0 6.47 6.42C6.33 6.54 6.2 6.68 6.07 6.8L5.9 7L5.82 7.09L5.72 7.19A7.25 7.25 0 0 0 5.12 8.04A7.38 7.38 0 0 0 4.36 9.75L4.33 9.84L4.32 9.89L4.3 9.95L4.25 10.13L4.21 10.29L4.18 10.5L4.15 10.63C4.14 10.65 4.14 10.67 4.14 10.7L4.13 10.72V10.78L4.12 10.81L4.09 11.06L4.05 11.5C3.79 11.57 3.53 11.65 3.28 11.74C3.28 11.74 1.93 12.05 2 12.72C2.08 13.35 3.41 13.5 3.41 13.5A11.21 11.21 0 0 0 10.24 12.74A2.62 2.62 0 0 1 10.16 11.57M19.7 10.84A7.19 7.19 0 0 0 19.53 9.79C19.5 9.62 19.43 9.45 19.38 9.27L19.3 9.03L19.26 8.91L19.21 8.77A7.23 7.23 0 0 0 18.75 7.83A7.35 7.35 0 0 0 17.62 6.35L17.55 6.28L17.5 6.25L17.47 6.2L17.33 6.08L17.21 5.97L17.06 5.85L16.94 5.75L16.89 5.7L16.88 5.69H16.87L16.83 5.66L16.8 5.64L16.59 5.5L16.32 5.31Q16.42 4.88 16.5 4.45S16.88 3.11 16.25 2.85C15.67 2.61 14.91 3.72 14.91 3.72A11.21 11.21 0 0 0 12.25 10.05A2.63 2.63 0 0 1 13.32 10.55A11.2 11.2 0 0 0 15.25 8A4.73 4.73 0 0 1 16.08 8.66A4.81 4.81 0 0 1 16.53 9.19L16.58 9.25L16.63 9.33L16.74 9.5C16.8 9.59 16.86 9.69 16.92 9.8A4.89 4.89 0 0 1 17.4 11.16A4.78 4.78 0 0 1 17.5 11.83A4.88 4.88 0 0 1 17.5 12.44A4.76 4.76 0 0 1 17.44 12.96C17.42 13.11 17.39 13.25 17.36 13.36C17.31 13.57 17.27 13.7 17.27 13.7L17.41 13.37C17.45 13.26 17.5 13.14 17.54 13A5.06 5.06 0 0 0 17.67 12.46A5.34 5.34 0 0 0 17.75 11.83A5.04 5.04 0 0 0 17.76 11.11A5.38 5.38 0 0 0 17.43 9.57C17.38 9.44 17.32 9.31 17.27 9.19L17.18 9L17.14 8.93L17.09 8.83A5.53 5.53 0 0 0 15.67 7.16C15.79 6.9 15.89 6.65 16 6.38L16.03 6.41L16.25 6.53L16.28 6.54V6.55H16.29C16.32 6.57 16.24 6.5 16.25 6.53H16.26L16.27 6.54L16.33 6.58L16.45 6.66L16.5 6.71L16.56 6.73L16.57 6.74H16.58L16.56 6.73H16.57L16.71 6.84L16.85 6.94L16.87 6.96L16.86 6.95L16.87 6.96L16.91 7L17 7.05A6.46 6.46 0 0 1 18.6 9.05L18.65 9.15L18.71 9.27L18.82 9.5C18.87 9.65 18.94 9.79 19 9.95A6.69 6.69 0 0 1 19.24 10.9A6.78 6.78 0 0 1 19.35 11.86C19.36 12 19.36 12.17 19.35 12.32C19.35 12.5 19.34 12.62 19.33 12.77A6.79 6.79 0 0 1 19.2 13.58A6.4 6.4 0 0 1 19 14.25C18.96 14.45 18.89 14.62 18.84 14.76C18.78 14.9 18.73 15 18.7 15.07L18.64 15.19L18.71 15.08C18.75 15 18.81 14.91 18.88 14.78C18.95 14.64 19.04 14.5 19.12 14.29A6.5 6.5 0 0 0 19.37 13.62A6.93 6.93 0 0 0 19.59 12.81C19.61 12.66 19.64 12.5 19.66 12.35C19.68 12.19 19.7 12.03 19.7 11.87A7.1 7.1 0 0 0 19.69 10.84", + "name": "concourse-ci" + }, + { + "path": "M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2M15 10H11V11H14A1 1 0 0 1 15 12V15A1 1 0 0 1 14 16H13V17H11V16H9V14H13V13H10A1 1 0 0 1 9 12V9A1 1 0 0 1 10 8H11V7H13V8H15Z", + "name": "currency-usd-circle" + }, + { + "path": "M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M11,17V16H9V14H13V13H10A1,1 0 0,1 9,12V9A1,1 0 0,1 10,8H11V7H13V8H15V10H11V11H14A1,1 0 0,1 15,12V15A1,1 0 0,1 14,16H13V17H11Z", + "name": "currency-usd-circle-outline" + }, + { + "path": "M20,6H4V4H20V6M20,18V20H4V18H7.33L6.26,14H5V8H19V14H17.74L16.67,18H20M7,12H17V10H7V12M9.4,18H14.6L15.67,14H8.33L9.4,18Z", + "name": "douban" + }, + { + "path": "M10,13C10.55,13 11,13.18 11.41,13.57C11.8,13.96 12,14.44 12,15V22C12,22.17 11.91,22.27 11.72,22.27C11.66,22.27 11.58,22.22 11.5,22.13L7,17.67V13H10M12.5,1.88L17,6.33V11H14C13.45,11 13,10.82 12.59,10.43C12.2,10.04 12,9.56 12,9V2C12,1.83 12.09,1.73 12.28,1.73C12.34,1.73 12.42,1.78 12.5,1.88M22,12C22.17,12 22.27,12.09 22.27,12.28C22.27,12.34 22.22,12.42 22.13,12.5L17.67,17H13V14C13,13.45 13.18,13 13.57,12.59C13.96,12.2 14.44,12 15,12H22M6.33,7H11V10C11,10.55 10.82,11 10.43,11.41C10.04,11.8 9.56,12 9,12H2C1.83,12 1.73,11.91 1.73,11.72C1.73,11.66 1.78,11.58 1.88,11.5L6.33,7Z", + "name": "google-photos" + }, + { + "path": "M12,3L22,12H19V20H5V12H2L12,3M9.22,8.93C8.75,9.4 8.5,10.03 8.5,10.75C8.5,12.43 10.54,13.07 11.76,13.46C13.26,13.93 13.47,14.21 13.5,14.25C13.5,15 12.15,15 12,15V15C11.37,15 11.03,14.88 10.86,14.78C10.67,14.67 10.5,14.5 10.5,14H8.5C8.5,15.43 9.24,16.16 9.85,16.5C10.18,16.7 10.57,16.84 11,16.92V18H13V16.91C14.53,16.61 15.5,15.62 15.5,14.25C15.5,12.67 13.88,12.03 12.36,11.55C10.8,11.06 10.53,10.77 10.5,10.75C10.5,10.5 10.57,10.41 10.64,10.34C10.85,10.13 11.36,10 12,10V10C12.68,10 13.5,10.13 13.5,10.75H15.5C15.5,9.34 14.56,8.37 13,8.09V7H11V8.08C10.26,8.21 9.65,8.5 9.22,8.93Z", + "name": "home-currency-usd" + }, + { + "path": "M 2.73675,10.8077C 3.8293,-1.36109 22.5157,-1.36109 21.1971,13.5579L 8.61392,13.5579C 8.61392,17.8527 14.4157,19.209 19.5394,16.3081L 19.5394,20.5276C 13.2478,23.8806 4.9972,21.4318 4.9972,14.0853C 4.9972,8.58476 9.97019,6.8142 9.97019,6.8142C 9.97019,6.8142 8.57624,8.58489 8.53857,10.0542L 15.6967,10.0542C 15.6967,2.93376 5.90137,5.57095 2.73675,10.8077 Z", + "name": "microsoft-edge-legacy" + }, + { + "path": "M22 12Q22 12.43 21.97 12.94 21.95 13.45 21.89 13.97 21.84 14.5 21.76 15 21.68 15.5 21.56 15.89 21.5 16.07 21.38 16.19 21.24 16.3 21.04 16.3 20.95 16.3 20.66 16.23 20.37 16.16 20.03 16.07L19.39 15.88Q19.09 15.79 18.96 15.76 18.75 16.54 18.41 17.38 18.08 18.21 17.65 19 17.22 19.8 16.7 20.5 16.18 21.25 15.61 21.82L15.43 21.95Q15.33 22 15.21 22 15 22 14.84 21.84L10.1 17.11H2.85Q2.5 17.11 2.25 16.86 2 16.61 2 16.26V7.74Q2 7.39 2.25 7.14 2.5 6.89 2.85 6.89H10.1L14.83 2.16Q15 2 15.21 2 15.33 2 15.42 2.05 15.5 2.09 15.59 2.18 15.85 2.44 16.08 2.71 16.3 3 16.5 3.28 18.23 5.55 18.96 8.28 19.14 8.23 19.44 8.14 19.74 8.05 20.06 7.96 20.37 7.87 20.65 7.8 20.92 7.74 21.04 7.74 21.24 7.74 21.38 7.85 21.5 7.97 21.56 8.15 21.68 8.56 21.77 9.05 21.85 9.55 21.91 10.06 21.96 10.57 22 11.08V12M9.82 9.37Q9.82 9.06 9.62 8.85 9.4 8.64 9.1 8.64 8.9 8.64 8.72 8.74 8.55 8.85 8.45 9.03L7.15 11.47L5.89 9.03Q5.77 8.8 5.57 8.72 5.37 8.64 5.13 8.64 4.82 8.64 4.61 8.85 4.4 9.06 4.4 9.36 4.4 9.57 4.5 9.73L6.25 12.87Q6.27 12.91 6.29 12.97 6.3 13.03 6.3 13.08V14.63Q6.3 15 6.56 15.19 6.81 15.36 7.15 15.36 7.39 15.36 7.54 15.27 7.68 15.18 7.76 15.03 7.84 14.88 7.87 14.69 7.9 14.5 7.9 14.28 7.9 14 7.88 13.76 7.86 13.5 7.86 13.28 7.86 13.14 7.87 13.03 7.88 12.93 7.93 12.85L9.73 9.73Q9.83 9.55 9.83 9.37M15.17 3.63L11.8 7Q12 7.12 12.1 7.31 12.22 7.5 12.22 7.74V10.07L17.72 8.61Q17.34 7.19 16.71 6 16.08 4.77 15.17 3.63M17.73 15.42L12.22 13.95V16.26Q12.22 16.5 12.1 16.69 12 16.88 11.8 17L15.18 20.37Q16.07 19.29 16.72 18.04 17.37 16.79 17.73 15.43V15.42M20.47 14.84Q20.6 14.14 20.66 13.43 20.72 12.73 20.72 12 20.72 11.29 20.66 10.59 20.6 9.89 20.47 9.19 18.4 9.74 16.35 10.29 14.3 10.83 12.22 11.39 12.21 11.55 12.21 11.7V12.32L12.22 12.63Q14.3 13.19 16.35 13.73 18.4 14.27 20.47 14.84Z", + "name": "microsoft-yammer" + }, + { + "path": "M9.78,18.65L10.06,14.42L17.74,7.5C18.08,7.19 17.67,7.04 17.22,7.31L7.74,13.3L3.64,12C2.76,11.75 2.75,11.14 3.84,10.7L19.81,4.54C20.54,4.21 21.24,4.72 20.96,5.84L18.24,18.65C18.05,19.56 17.5,19.78 16.74,19.36L12.6,16.3L10.61,18.23C10.38,18.46 10.19,18.65 9.78,18.65Z", + "name": "telegram" + }, + { + "path": "M14.41,4C14.41,4 14.94,4.39 14.97,4.71C14.97,4.81 14.73,4.85 14.68,4.93C14.62,5 14.7,5.15 14.65,5.21C14.59,5.26 14.5,5.26 14.41,5.41C14.33,5.56 12.07,10.09 11.73,10.63C11.59,11.03 11.47,12.46 11.37,12.66C11.26,12.85 6.34,19.84 6.16,20.05C5.67,20.63 4.31,20.3 3.28,19.56C2.3,18.86 1.74,17.7 2.11,17.16C2.27,16.93 7.15,9.92 7.29,9.75C7.44,9.58 8.75,9 9.07,8.71C9.47,8.22 12.96,4.54 13.07,4.42C13.18,4.3 13.15,4.2 13.18,4.13C13.22,4.06 13.38,4.08 13.43,4C13.5,3.93 13.39,3.71 13.5,3.68C13.59,3.64 13.96,3.67 14.41,4M10.85,4.44L11.74,5.37L10.26,6.94L9.46,5.37C9.38,5.22 9.28,5.22 9.22,5.17C9.17,5.11 9.24,4.97 9.19,4.89C9.13,4.81 8.9,4.83 8.9,4.73C8.9,4.62 9.05,4.28 9.5,3.96C9.5,3.96 10.06,3.6 10.37,3.68C10.47,3.71 10.43,3.95 10.5,4C10.54,4.1 10.7,4.08 10.73,4.15C10.77,4.21 10.73,4.32 10.85,4.44M21.92,17.15C22.29,17.81 21.53,19 20.5,19.7C19.5,20.39 18.21,20.54 17.83,20C17.66,19.78 12.67,12.82 12.56,12.62C12.45,12.43 12.32,11 12.18,10.59L12.15,10.55C12.45,10 13.07,8.77 13.73,7.47C14.3,8.06 14.75,8.56 14.88,8.72C15.21,9 16.53,9.58 16.68,9.75C16.82,9.92 21.78,16.91 21.92,17.15Z", + "name": "untappd" + }, + { + "path": "M15.07 2H8.93C3.33 2 2 3.33 2 8.93V15.07C2 20.67 3.33 22 8.93 22H15.07C20.67 22 22 20.67 22 15.07V8.93C22 3.33 20.67 2 15.07 2M18.15 16.27H16.69C16.14 16.27 15.97 15.82 15 14.83C14.12 14 13.74 13.88 13.53 13.88C13.24 13.88 13.15 13.96 13.15 14.38V15.69C13.15 16.04 13.04 16.26 12.11 16.26C10.57 16.26 8.86 15.32 7.66 13.59C5.85 11.05 5.36 9.13 5.36 8.75C5.36 8.54 5.43 8.34 5.85 8.34H7.32C7.69 8.34 7.83 8.5 7.97 8.9C8.69 11 9.89 12.8 10.38 12.8C10.57 12.8 10.65 12.71 10.65 12.25V10.1C10.6 9.12 10.07 9.03 10.07 8.68C10.07 8.5 10.21 8.34 10.44 8.34H12.73C13.04 8.34 13.15 8.5 13.15 8.88V11.77C13.15 12.08 13.28 12.19 13.38 12.19C13.56 12.19 13.72 12.08 14.05 11.74C15.1 10.57 15.85 8.76 15.85 8.76C15.95 8.55 16.11 8.35 16.5 8.35H17.93C18.37 8.35 18.47 8.58 18.37 8.89C18.19 9.74 16.41 12.25 16.43 12.25C16.27 12.5 16.21 12.61 16.43 12.9C16.58 13.11 17.09 13.55 17.43 13.94C18.05 14.65 18.53 15.24 18.66 15.65C18.77 16.06 18.57 16.27 18.15 16.27Z", + "name": "vk" + }, + { + "path": "M4.8,3C3.8,3 3,3.8 3,4.8V19.2C3,20.2 3.8,21 4.8,21H19.2C20.2,21 21,20.2 21,19.2V4.8C21,3.8 20.2,3 19.2,3M16.07,5H18.11C18.23,5 18.33,5.04 18.37,5.13C18.43,5.22 18.43,5.33 18.37,5.44L13.9,13.36L16.75,18.56C16.81,18.67 16.81,18.78 16.75,18.87C16.7,18.95 16.61,19 16.5,19H14.47C14.16,19 14,18.79 13.91,18.61L11.04,13.35C11.18,13.1 15.53,5.39 15.53,5.39C15.64,5.19 15.77,5 16.07,5M7.09,7.76H9.1C9.41,7.76 9.57,7.96 9.67,8.15L11.06,10.57C10.97,10.71 8.88,14.42 8.88,14.42C8.77,14.61 8.63,14.81 8.32,14.81H6.3C6.18,14.81 6.09,14.76 6.04,14.67C6,14.59 6,14.47 6.04,14.36L8.18,10.57L6.82,8.2C6.77,8.09 6.75,8 6.81,7.89C6.86,7.81 6.96,7.76 7.09,7.76Z", + "name": "xing" + }, + { + "path": "M2,2H22V22H2V2M11.25,17.5H12.75V13.06L16,7H14.5L12,11.66L9.5,7H8L11.25,13.06V17.5Z", + "name": "y-combinator" + } +] diff --git a/package.json b/package.json index 3d4a638eb7..4548694753 100644 --- a/package.json +++ b/package.json @@ -61,8 +61,8 @@ "@material/mwc-tab": "0.22.1", "@material/mwc-tab-bar": "0.22.1", "@material/top-app-bar": "12.0.0-canary.22d29cbb4.0", - "@mdi/js": "5.9.55", - "@mdi/svg": "5.9.55", + "@mdi/js": "6.1.95", + "@mdi/svg": "6.1.95", "@polymer/app-layout": "^3.1.0", "@polymer/iron-flex-layout": "^3.0.1", "@polymer/iron-icon": "^3.0.1", diff --git a/src/components/ha-icon.ts b/src/components/ha-icon.ts index 7fea1da222..59bb2488c8 100644 --- a/src/components/ha-icon.ts +++ b/src/components/ha-icon.ts @@ -29,7 +29,335 @@ interface DeprecatedIcon { }; } -const mdiDeprecatedIcons: DeprecatedIcon = {}; +const mdiDeprecatedIcons: DeprecatedIcon = { + "adobe-acrobat": { + removeIn: "2021.12", + }, + adobe: { + removeIn: "2021.12", + }, + "amazon-alexa": { + removeIn: "2021.12", + }, + amazon: { + removeIn: "2021.12", + }, + "android-auto": { + removeIn: "2021.12", + }, + "android-debug-bridge": { + removeIn: "2021.12", + }, + "apple-airplay": { + newName: "cast-variant", + removeIn: "2021.12", + }, + application: { + newName: "application-outline", + removeIn: "2021.12", + }, + "application-cog": { + newName: "application-cog-outline", + removeIn: "2021.12", + }, + "application-settings": { + newName: "application-settings-outline", + removeIn: "2021.12", + }, + bandcamp: { + removeIn: "2021.12", + }, + battlenet: { + removeIn: "2021.12", + }, + blogger: { + removeIn: "2021.12", + }, + "bolnisi-cross": { + newName: "cross-bolnisi", + removeIn: "2021.12", + }, + "boom-gate-up": { + newName: "boom-gate-arrow-up", + removeIn: "2021.12", + }, + "boom-gate-up-outline": { + newName: "boom-gate-arrow-up-outline", + removeIn: "2021.12", + }, + "boom-gate-down": { + newName: "boom-gate-arrow-down", + removeIn: "2021.12", + }, + "boom-gate-down-outline": { + newName: "boom-gate-arrow-down-outline", + removeIn: "2021.12", + }, + buddhism: { + newName: "dharmachakra", + removeIn: "2021.12", + }, + buffer: { + removeIn: "2021.12", + }, + "cash-usd-outline": { + removeIn: "2021.12", + }, + "cash-usd": { + removeIn: "2021.12", + }, + "cellphone-android": { + newName: "cellphone", + removeIn: "2021.12", + }, + "cellphone-erase": { + newName: "cellphone-remove", + removeIn: "2021.12", + }, + "cellphone-iphone": { + newName: "cellphone", + removeIn: "2021.12", + }, + "celtic-cross": { + newName: "cross-celtic", + removeIn: "2021.12", + }, + christianity: { + newName: "cross", + removeIn: "2021.12", + }, + "christianity-outline": { + newName: "cross-outline", + removeIn: "2021.12", + }, + "concourse-ci": { + removeIn: "2021.12", + }, + "currency-usd-circle": { + removeIn: "2021.12", + }, + "currency-usd-circle-outline": { + removeIn: "2021.12", + }, + "do-not-disturb-off": { + newName: "minus-circle-off", + removeIn: "2021.12", + }, + "do-not-disturb": { + newName: "minus-circle", + removeIn: "2021.12", + }, + douban: { + removeIn: "2021.12", + }, + face: { + newName: "face-man", + removeIn: "2021.12", + }, + "face-outline": { + newName: "face-man-outline", + removeIn: "2021.12", + }, + "face-profile-woman": { + newName: "face-woman-profile", + removeIn: "2021.12", + }, + "face-shimmer": { + newName: "face-man-shimmer", + removeIn: "2021.12", + }, + "face-shimmer-outline": { + newName: "face-man-shimmer-outline", + removeIn: "2021.12", + }, + "file-pdf": { + newName: "file-pdf-box", + removeIn: "2021.12", + }, + "file-pdf-outline": { + newName: "file-pdf-box", + removeIn: "2021.12", + }, + "file-pdf-box-outline": { + newName: "file-pdf-box", + removeIn: "2021.12", + }, + "flash-circle": { + newName: "lightning-bolt-circle", + removeIn: "2021.12", + }, + "floor-lamp-variant": { + newName: "floor-lamp-torchiere-variant", + removeIn: "2021.12", + }, + gif: { + newName: "file-gif-box", + removeIn: "2021.12", + }, + "google-photos": { + removeIn: "2021.12", + }, + gradient: { + newName: "gradient-vertical", + removeIn: "2021.12", + }, + hand: { + newName: "hand-front-right", + removeIn: "2021.12", + }, + "hand-left": { + newName: "hand-back-left", + removeIn: "2021.12", + }, + "hand-right": { + newName: "hand-back-right", + removeIn: "2021.12", + }, + hinduism: { + newName: "om", + removeIn: "2021.12", + }, + "home-currency-usd": { + removeIn: "2021.12", + }, + iframe: { + newName: "application-brackets", + removeIn: "2021.12", + }, + "iframe-outline": { + newName: "application-brackets-outline", + removeIn: "2021.12", + }, + "iframe-array": { + newName: "application-array", + removeIn: "2021.12", + }, + "iframe-array-outline": { + newName: "application-array-outline", + removeIn: "2021.12", + }, + "iframe-braces": { + newName: "application-braces", + removeIn: "2021.12", + }, + "iframe-braces-outline": { + newName: "application-braces-outline", + removeIn: "2021.12", + }, + "iframe-parentheses": { + newName: "application-parentheses", + removeIn: "2021.12", + }, + "iframe-parentheses-outline": { + newName: "application-parentheses-outline", + removeIn: "2021.12", + }, + "iframe-variable": { + newName: "application-variable", + removeIn: "2021.12", + }, + "iframe-variable-outline": { + newName: "application-variable-outline", + removeIn: "2021.12", + }, + islam: { + newName: "star-crescent", + removeIn: "2021.12", + }, + judaism: { + newName: "star-david", + removeIn: "2021.12", + }, + "laptop-chromebook": { + newName: "laptop", + removeIn: "2021.12", + }, + "laptop-mac": { + newName: "laptop", + removeIn: "2021.12", + }, + "laptop-windows": { + newName: "laptop", + removeIn: "2021.12", + }, + "microsoft-edge-legacy": { + removeIn: "2021.12", + }, + "microsoft-yammer": { + removeIn: "2021.12", + }, + "monitor-clean": { + newName: "monitor-shimmer", + removeIn: "2021.12", + }, + "pdf-box": { + newName: "file-pdf-box", + removeIn: "2021.12", + }, + pharmacy: { + newName: "mortar-pestle-plus", + removeIn: "2021.12", + }, + "plus-one": { + newName: "numeric-positive-1", + removeIn: "2021.12", + }, + "poll-box": { + newName: "chart-box", + removeIn: "2021.12", + }, + "poll-box-outline": { + newName: "chart-box-outline", + removeIn: "2021.12", + }, + sparkles: { + newName: "shimmer", + removeIn: "2021.12", + }, + "tablet-ipad": { + newName: "tablet", + removeIn: "2021.12", + }, + teach: { + newName: "human-male-board", + removeIn: "2021.12", + }, + telegram: { + removeIn: "2021.12", + }, + "television-clean": { + newName: "television-shimmer", + removeIn: "2021.12", + }, + "text-subject": { + newName: "text-long", + removeIn: "2021.12", + }, + "twitter-retweet": { + newName: "repeat-variant", + removeIn: "2021.12", + }, + untappd: { + removeIn: "2021.12", + }, + vk: { + removeIn: "2021.12", + }, + "voice-off": { + newName: "account-voice-off", + removeIn: "2021.12", + }, + "xamarian-outline": { + newName: "xamarian", + removeIn: "2021.12", + }, + xing: { + removeIn: "2021.12", + }, + "y-combinator": { + removeIn: "2021.12", + }, +}; const chunks: Chunks = {}; diff --git a/src/components/trace/hat-script-graph.ts b/src/components/trace/hat-script-graph.ts index 33751f2f8e..d0e96a4540 100644 --- a/src/components/trace/hat-script-graph.ts +++ b/src/components/trace/hat-script-graph.ts @@ -5,7 +5,7 @@ import { mdiAsterisk, mdiCallSplit, mdiCheckboxBlankOutline, - mdiCheckBoxOutline, + mdiCheckboxOutline, mdiChevronDown, mdiChevronRight, mdiChevronUp, @@ -167,7 +167,7 @@ export class HatScriptGraph extends LitElement {
Date: Sat, 11 Sep 2021 20:38:35 +0200 Subject: [PATCH 33/67] Remove usage of discovery info (#10015) --- src/auth/ha-authorize.ts | 24 +++++---------------- src/data/discovery.ts | 16 -------------- src/data/onboarding.ts | 21 ++++++++++++++++++ src/onboarding/ha-onboarding.ts | 16 ++++++-------- src/onboarding/onboarding-restore-backup.ts | 19 +++++----------- src/translations/en.json | 1 - 6 files changed, 38 insertions(+), 59 deletions(-) delete mode 100644 src/data/discovery.ts diff --git a/src/auth/ha-authorize.ts b/src/auth/ha-authorize.ts index 9d51431102..cade5741f0 100644 --- a/src/auth/ha-authorize.ts +++ b/src/auth/ha-authorize.ts @@ -8,10 +8,6 @@ import { AuthUrlSearchParams, fetchAuthProviders, } from "../data/auth"; -import { - DiscoveryInformation, - fetchDiscoveryInformation, -} from "../data/discovery"; import { litLocalizeLiteMixin } from "../mixins/lit-localize-lite-mixin"; import { registerServiceWorker } from "../util/register-service-worker"; import "./ha-auth-flow"; @@ -29,8 +25,6 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { @state() private _authProviders?: AuthProvider[]; - @state() private _discovery?: DiscoveryInformation; - constructor() { super(); this.translationFragment = "page-authorize"; @@ -58,17 +52,14 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { // the name with a bold tag. const loggingInWith = document.createElement("div"); loggingInWith.innerText = this.localize( - this._discovery?.location_name - ? "ui.panel.page-authorize.logging_in_to_with" - : "ui.panel.page-authorize.logging_in_with", - "locationName", - "LOCATION", + "ui.panel.page-authorize.logging_in_with", "authProviderName", "NAME" ); - loggingInWith.innerHTML = loggingInWith.innerHTML - .replace("**LOCATION**", `${this._discovery?.location_name}`) - .replace("**NAME**", `${this._authProvider!.name}`); + loggingInWith.innerHTML = loggingInWith.innerHTML.replace( + "**NAME**", + `${this._authProvider!.name}` + ); const inactiveProviders = this._authProviders.filter( (prv) => prv !== this._authProvider @@ -108,7 +99,6 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); this._fetchAuthProviders(); - this._fetchDiscoveryInfo(); if (matchMedia("(prefers-color-scheme: dark)").matches) { applyThemesOnElement( @@ -144,10 +134,6 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { } } - private async _fetchDiscoveryInfo() { - this._discovery = await fetchDiscoveryInformation(); - } - private async _fetchAuthProviders() { // Fetch auth providers try { diff --git a/src/data/discovery.ts b/src/data/discovery.ts deleted file mode 100644 index 40f558365b..0000000000 --- a/src/data/discovery.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface DiscoveryInformation { - uuid: string; - base_url: string | null; - external_url: string | null; - internal_url: string | null; - location_name: string; - installation_type: string; - requires_api_password: boolean; - version: string; -} - -export const fetchDiscoveryInformation = - async (): Promise => { - const response = await fetch("/api/discovery_info", { method: "GET" }); - return response.json(); - }; diff --git a/src/data/onboarding.ts b/src/data/onboarding.ts index 3d9e24ee9b..9e5c751ada 100644 --- a/src/data/onboarding.ts +++ b/src/data/onboarding.ts @@ -1,6 +1,15 @@ import { HomeAssistant } from "../types"; import { handleFetchPromise } from "../util/hass-call-api"; +export interface InstallationType { + installation_type: + | "Home Assistant Operating System" + | "Home Assistant Container" + | "Home Assistant Supervised" + | "Home Assistant Core" + | "Unknown"; +} + // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface OnboardingCoreConfigStepResponse {} @@ -65,3 +74,15 @@ export const onboardIntegrationStep = ( "onboarding/integration", params ); + +export const fetchInstallationType = async (): Promise => { + const response = await fetch("/api/onboarding/installation_type", { + method: "GET", + }); + + if (response.status === 401) { + throw Error("unauthorized"); + } + + return response.json(); +}; diff --git a/src/onboarding/ha-onboarding.ts b/src/onboarding/ha-onboarding.ts index e06665b300..1a0c4f2dd7 100644 --- a/src/onboarding/ha-onboarding.ts +++ b/src/onboarding/ha-onboarding.ts @@ -13,14 +13,12 @@ import { extractSearchParamsObject } from "../common/url/search-params"; import { subscribeOne } from "../common/util/subscribe-one"; import { AuthUrlSearchParams, hassUrl } from "../data/auth"; import { - DiscoveryInformation, - fetchDiscoveryInformation, -} from "../data/discovery"; -import { + InstallationType, fetchOnboardingOverview, OnboardingResponses, OnboardingStep, onboardIntegrationStep, + fetchInstallationType, } from "../data/onboarding"; import { subscribeUser } from "../data/ws-user"; import { litLocalizeLiteMixin } from "../mixins/lit-localize-lite-mixin"; @@ -71,7 +69,7 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { @state() private _steps?: OnboardingStep[]; - @state() private _discoveryInformation?: DiscoveryInformation; + @state() private _installation_type?: InstallationType; protected render(): TemplateResult { const step = this._curStep()!; @@ -92,7 +90,7 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { ? html` ` @@ -130,7 +128,7 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); this._fetchOnboardingSteps(); - this._fetchDiscoveryInformation(); + this._fetchInstallationType(); import("./onboarding-integrations"); import("./onboarding-core-config"); registerServiceWorker(this, false); @@ -174,9 +172,9 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { this._restoring = true; } - private async _fetchDiscoveryInformation(): Promise { + private async _fetchInstallationType(): Promise { try { - const response = await fetchDiscoveryInformation(); + const response = await fetchInstallationType(); this._supervisor = [ "Home Assistant OS", "Home Assistant Supervised", diff --git a/src/onboarding/onboarding-restore-backup.ts b/src/onboarding/onboarding-restore-backup.ts index bc3c2d4265..2f3e1aca52 100644 --- a/src/onboarding/onboarding-restore-backup.ts +++ b/src/onboarding/onboarding-restore-backup.ts @@ -6,14 +6,11 @@ import { showHassioBackupDialog } from "../../hassio/src/dialogs/backup/show-dia import { showBackupUploadDialog } from "../../hassio/src/dialogs/backup/show-dialog-backup-upload"; import type { LocalizeFunc } from "../common/translations/localize"; import "../components/ha-card"; -import { - DiscoveryInformation, - fetchDiscoveryInformation, -} from "../data/discovery"; import { makeDialogManager } from "../dialogs/make-dialog-manager"; import { ProvideHassLitMixin } from "../mixins/provide-hass-lit-mixin"; import { haStyle } from "../resources/styles"; import "./onboarding-loading"; +import { fetchInstallationType, InstallationType } from "../data/onboarding"; declare global { interface HASSDomEvents { @@ -30,7 +27,7 @@ class OnboardingRestoreBackup extends ProvideHassLitMixin(LitElement) { @property({ type: Boolean }) public restoring = false; @property({ attribute: false }) - public discoveryInformation?: DiscoveryInformation; + public installationType?: InstallationType; protected render(): TemplateResult { return this.restoring @@ -64,17 +61,11 @@ class OnboardingRestoreBackup extends ProvideHassLitMixin(LitElement) { private async _checkRestoreStatus(): Promise { if (this.restoring) { try { - const response = await fetchDiscoveryInformation(); - - if ( - !this.discoveryInformation || - this.discoveryInformation.uuid !== response.uuid - ) { - // When the UUID changes, the restore is complete + await fetchInstallationType(); + } catch (err) { + if ((err as Error).message === "unauthorized") { window.location.replace("/"); } - } catch (err) { - // We fully expected issues with fetching info untill restore is complete. } } } diff --git a/src/translations/en.json b/src/translations/en.json index dae6405e5b..92529a281c 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3517,7 +3517,6 @@ "page-authorize": { "initializing": "Initializing", "authorizing_client": "You're about to give {clientId} access to your Home Assistant instance.", - "logging_in_to_with": "Logging in to **{locationName}** with **{authProviderName}**.", "logging_in_with": "Logging in with **{authProviderName}**.", "pick_auth_provider": "Or log in with", "abort_intro": "Login aborted", From 6b6c38c2c8fd1c1d7abc48740286603c074f7ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Hansl=C3=ADk?= Date: Sat, 11 Sep 2021 20:53:38 +0200 Subject: [PATCH 34/67] Better icon for alarm panel state "armed night" (#10012) --- src/panels/lovelace/cards/hui-alarm-panel-card.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts index ba5dcfa649..9326c588e2 100644 --- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts +++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts @@ -28,7 +28,7 @@ const ICONS = { armed_away: "hass:shield-lock", armed_custom_bypass: "hass:security", armed_home: "hass:shield-home", - armed_night: "hass:shield-sun", + armed_night: "hass:shield-moon", armed_vacation: "hass:shield-lock", disarmed: "hass:shield-check", pending: "hass:shield-outline", From 1ac2ffcf023f629234727e0a9db2b497d39da30b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 11 Sep 2021 11:57:48 -0700 Subject: [PATCH 35/67] Bumped version to 20210911.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c0b198d50f..533b4a7b02 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210830.0", + version="20210911.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/frontend", author="The Home Assistant Authors", From 8408d25ceff9e74d7a81dc819d93a467047d9bac Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 12 Sep 2021 01:00:37 -0700 Subject: [PATCH 36/67] Clean up ha state label badge (#10020) --- src/components/entity/ha-state-label-badge.ts | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index 644c3afb32..365e19c0be 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -106,19 +106,24 @@ export class HaStateLabelBadge extends LitElement { private _computeValue(domain: string, entityState: HassEntity) { switch (domain) { + case "alarm_control_panel": case "binary_sensor": case "device_tracker": case "person": - case "updater": + case "scene": case "sun": - case "alarm_control_panel": case "timer": + case "updater": return null; + // @ts-expect-error we don't break and go to default case "sensor": + if (entityState.attributes.device_class === "moon__phase") { + return null; + } + // eslint-disable-next-line: disable=no-fallthrough default: - return entityState.attributes.device_class === "moon__phase" - ? null - : entityState.state === UNKNOWN + return entityState.state === UNKNOWN || + entityState.state === UNAVAILABLE ? "-" : entityState.attributes.unit_of_measurement ? formatNumber(entityState.state, this.hass!.locale) @@ -160,16 +165,19 @@ export class HaStateLabelBadge extends LitElement { case "device_tracker": case "updater": case "person": + case "scene": case "sun": return stateIcon(entityState); case "timer": return entityState.state === "active" ? "hass:timer-outline" : "hass:timer-off-outline"; - default: - return entityState?.attributes.device_class === "moon__phase" + case "sensor": + return entityState.attributes.device_class === "moon__phase" ? stateIcon(entityState) : null; + default: + return null; } } From 58935599516a3fba1592e7c611de99555e0a75e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Hansl=C3=ADk?= Date: Mon, 13 Sep 2021 12:50:57 +0200 Subject: [PATCH 37/67] New icon for "on" state of smoke device (#10013) --- src/common/entity/binary_sensor_icon.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/entity/binary_sensor_icon.ts b/src/common/entity/binary_sensor_icon.ts index ef90cd64ff..da18e0d01f 100644 --- a/src/common/entity/binary_sensor_icon.ts +++ b/src/common/entity/binary_sensor_icon.ts @@ -22,8 +22,9 @@ export const binarySensorIcon = (state?: string, stateObj?: HassEntity) => { case "gas": case "problem": case "safety": - case "smoke": return is_off ? "hass:check-circle" : "hass:alert-circle"; + case "smoke": + return is_off ? "hass:check-circle" : "hass:smoke"; case "heat": return is_off ? "hass:thermometer" : "hass:fire"; case "light": From cb11c6b3eabc9f35fbcb9f6dcc864d1f83589726 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 14 Sep 2021 23:20:09 +0200 Subject: [PATCH 38/67] Check for `null` action nodes before rendering (#10017) --- src/components/trace/hat-script-graph.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/components/trace/hat-script-graph.ts b/src/components/trace/hat-script-graph.ts index d0e96a4540..2c416d8725 100644 --- a/src/components/trace/hat-script-graph.ts +++ b/src/components/trace/hat-script-graph.ts @@ -173,21 +173,25 @@ export class HatScriptGraph extends LitElement { ?track=${track_this} ?active=${this.selected === branch_path} > - ${ensureArray(branch.sequence).map((action, j) => - this.render_action_node( - action, - `${branch_path}/sequence/${j}` - ) - )} + ${branch.sequence !== null + ? ensureArray(branch.sequence).map((action, j) => + this.render_action_node( + action, + `${branch_path}/sequence/${j}` + ) + ) + : ""}
`; }) : ""}
- ${ensureArray(config.default)?.map((action, i) => - this.render_action_node(action, `${path}/default/${i}`) - )} + ${config.default !== null + ? ensureArray(config.default)?.map((action, i) => + this.render_action_node(action, `${path}/default/${i}`) + ) + : ""}
`; From 2240d019f542e22613b45d632a09e9a18d261923 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Thu, 16 Sep 2021 11:15:23 +0200 Subject: [PATCH 39/67] Specify period when fetching statistics (#10040) Co-authored-by: Bram Kragten --- src/data/history.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/data/history.ts b/src/data/history.ts index a8264b42ca..4e55ab711d 100644 --- a/src/data/history.ts +++ b/src/data/history.ts @@ -294,13 +294,15 @@ export const fetchStatistics = ( hass: HomeAssistant, startTime: Date, endTime?: Date, - statistic_ids?: string[] + statistic_ids?: string[], + period: "hour" | "5minute" = "hour" ) => hass.callWS({ type: "history/statistics_during_period", start_time: startTime.toISOString(), end_time: endTime?.toISOString(), statistic_ids, + period, }); export const calculateStatisticSumGrowth = ( From 53b26a43c0358505e7b13581c55aff1dd0baea32 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 20 Sep 2021 12:38:16 +0200 Subject: [PATCH 40/67] Update translation strings for energy validator (#10037) * Update translation strings for energy validator * Update src/translations/en.json Co-authored-by: Bram Kragten * Update en.json * Update src/translations/en.json Co-authored-by: Philip Allgaier Co-authored-by: Bram Kragten Co-authored-by: Philip Allgaier --- src/translations/en.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index 92529a281c..7e0a71e14a 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1117,9 +1117,13 @@ "title": "Unexpected unit of measurement", "description": "The following entities do not have the expected units of measurement ''{currency}/kWh'' or ''{currency}/Wh'':" }, - "entity_unexpected_state_class_total_increasing": { + "entity_unexpected_state_class": { "title": "Unexpected state class", - "description": "The following entities do not have the expected state class 'total_increasing'" + "description": "The following entities do not have the expected state class:" + }, + "entity_state_class_measurement_no_last_reset": { + "title": "Last reset missing", + "description": "The following entities have state class 'measurement' but 'last_reset' is missing:" } } } From bab1e6a95f8e9d61da50e258c1fe9f40ed4ce639 Mon Sep 17 00:00:00 2001 From: Will Adler Date: Mon, 20 Sep 2021 06:51:47 -0400 Subject: [PATCH 41/67] Revise solar-consumed energy dashboard card tooltip, fix typos (#10052) --- .../hui-energy-solar-consumed-gauge-card.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts b/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts index fdb2f5d3b0..6f54631658 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts @@ -77,11 +77,11 @@ class HuiEnergySolarGaugeCard let value: number | undefined; if (productionReturnedToGrid !== null && totalSolarProduction) { - const cosumedSolar = Math.max( + const consumedSolar = Math.max( 0, totalSolarProduction - productionReturnedToGrid ); - value = (cosumedSolar / totalSolarProduction) * 100; + value = (consumedSolar / totalSolarProduction) * 100; } return html` @@ -91,12 +91,13 @@ class HuiEnergySolarGaugeCard - This card represents how much of the solar energy was used by - your home and was not returned to the grid. + This card indicates how much of the solar energy you produced + was used by your home instead of being returned to the grid.

- If you frequently produce more than you consume, try to - conserve this energy by installing a battery or buying an - electric car to charge. + If this number is typically very low, indicating excess solar + production, you might want to consider charging a home battery + or electric car from your solar panels at times of high solar + production.
-
Self consumed solar energy
+
Self-consumed solar energy
` : totalSolarProduction === 0 ? "You have not produced any solar energy" - : "Self consumed solar energy couldn't be calculated"} + : "Self-consumed solar energy couldn't be calculated"} `; } From c0f32153407593ffd177c54e0ea4e42172db9741 Mon Sep 17 00:00:00 2001 From: Will Adler Date: Mon, 20 Sep 2021 06:52:20 -0400 Subject: [PATCH 42/67] Clarify carbon-consumed energy dashboard card tooltip (#10053) --- .../cards/energy/hui-energy-carbon-consumed-gauge-card.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts b/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts index 2f8c98c20e..a64d0864e6 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts @@ -129,9 +129,9 @@ class HuiEnergyCarbonGaugeCard - This card represents how much of the energy consumed by your + This card indicates how much of the energy consumed by your home was generated using non-fossil fuels like solar, wind and - nuclear. + nuclear. The higher, the better! Date: Mon, 20 Sep 2021 12:59:30 +0200 Subject: [PATCH 43/67] Align "option" wording and show user-friendly option index in trace timeline (#10059) --- src/components/trace/ha-trace-path-details.ts | 2 +- src/components/trace/hat-trace-timeline.ts | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/trace/ha-trace-path-details.ts b/src/components/trace/ha-trace-path-details.ts index 57b00ef5ac..5f1e8c56c5 100644 --- a/src/components/trace/ha-trace-path-details.ts +++ b/src/components/trace/ha-trace-path-details.ts @@ -82,7 +82,7 @@ export class HaTracePathDetails extends LitElement { ] as ChooseActionTraceStep[]; if (parentTraceInfo && parentTraceInfo[0]?.result?.choice === "default") { - return "The default node was executed because no choices matched."; + return "The default action was executed because no options matched."; } } diff --git a/src/components/trace/hat-trace-timeline.ts b/src/components/trace/hat-trace-timeline.ts index 0ff605400d..162ac03eca 100644 --- a/src/components/trace/hat-trace-timeline.ts +++ b/src/components/trace/hat-trace-timeline.ts @@ -325,13 +325,15 @@ class ActionRenderer { if (defaultExecuted) { this._renderEntry(choosePath, `${name}: Default action executed`); } else if (chooseTrace.result) { + const choiceNumeric = + chooseTrace.result.choice !== "default" + ? chooseTrace.result.choice + 1 + : undefined; const choiceConfig = this._getDataFromPath( `${this.keys[index]}/choose/${chooseTrace.result.choice}` ) as ChooseActionChoice | undefined; const choiceName = choiceConfig - ? `${ - choiceConfig.alias || `Choice ${chooseTrace.result.choice}` - } executed` + ? `${choiceConfig.alias || `Option ${choiceNumeric}`} executed` : `Error: ${chooseTrace.error}`; this._renderEntry(choosePath, `${name}: ${choiceName}`); } else { From 9c1153ef371e8c33b6b5d54c48161a53b3badeba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Hansl=C3=ADk?= Date: Mon, 20 Sep 2021 13:06:31 +0200 Subject: [PATCH 44/67] Unified alarm panel icons everywhere (#10021) --- src/common/entity/alarm_panel_icon.ts | 24 +++++++++++++++++++ src/common/entity/domain_icon.ts | 14 ++--------- src/components/entity/ha-state-label-badge.ts | 21 ---------------- .../lovelace/cards/hui-alarm-panel-card.ts | 14 ++--------- 4 files changed, 28 insertions(+), 45 deletions(-) create mode 100644 src/common/entity/alarm_panel_icon.ts diff --git a/src/common/entity/alarm_panel_icon.ts b/src/common/entity/alarm_panel_icon.ts new file mode 100644 index 0000000000..aa2590ed67 --- /dev/null +++ b/src/common/entity/alarm_panel_icon.ts @@ -0,0 +1,24 @@ +/** Return an icon representing a alarm panel state. */ + +export const alarmPanelIcon = (state?: string) => { + switch (state) { + case "armed_away": + return "hass:shield-lock"; + case "armed_vacation": + return "hass:shield-airplane"; + case "armed_home": + return "hass:shield-home"; + case "armed_night": + return "hass:shield-moon"; + case "armed_custom_bypass": + return "hass:security"; + case "pending": + return "hass:shield-outline"; + case "triggered": + return "hass:bell-ring"; + case "disarmed": + return "hass:shield-off"; + default: + return "hass:shield"; + } +}; diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts index d44fe8094f..60f27c93aa 100644 --- a/src/common/entity/domain_icon.ts +++ b/src/common/entity/domain_icon.ts @@ -5,6 +5,7 @@ import { HassEntity } from "home-assistant-js-websocket"; * Optionally pass in a state to influence the domain icon. */ import { DEFAULT_DOMAIN_ICON, FIXED_DOMAIN_ICONS } from "../const"; +import { alarmPanelIcon } from "./alarm_panel_icon"; import { binarySensorIcon } from "./binary_sensor_icon"; import { coverIcon } from "./cover_icon"; import { sensorIcon } from "./sensor_icon"; @@ -18,18 +19,7 @@ export const domainIcon = ( switch (domain) { case "alarm_control_panel": - switch (compareState) { - case "armed_home": - return "hass:bell-plus"; - case "armed_night": - return "hass:bell-sleep"; - case "disarmed": - return "hass:bell-outline"; - case "triggered": - return "hass:bell-ring"; - default: - return "hass:bell"; - } + return alarmPanelIcon(compareState); case "binary_sensor": return binarySensorIcon(compareState, stateObj); diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index 365e19c0be..5302d6f917 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -13,7 +13,6 @@ import secondsToDuration from "../../common/datetime/seconds_to_duration"; import { computeStateDisplay } from "../../common/entity/compute_state_display"; import { computeStateDomain } from "../../common/entity/compute_state_domain"; import { computeStateName } from "../../common/entity/compute_state_name"; -import { domainIcon } from "../../common/entity/domain_icon"; import { stateIcon } from "../../common/entity/state_icon"; import { timerTimeRemaining } from "../../data/timer"; import { formatNumber } from "../../common/string/format_number"; @@ -141,26 +140,6 @@ export class HaStateLabelBadge extends LitElement { } switch (domain) { case "alarm_control_panel": - if (entityState.state === "pending") { - return "hass:clock-fast"; - } - if (entityState.state === "armed_away") { - return "hass:nature"; - } - if (entityState.state === "armed_home") { - return "hass:home-variant"; - } - if (entityState.state === "armed_night") { - return "hass:weather-night"; - } - if (entityState.state === "armed_custom_bypass") { - return "hass:shield-home"; - } - if (entityState.state === "triggered") { - return "hass:alert-circle"; - } - // state == 'disarmed' - return domainIcon(domain, entityState); case "binary_sensor": case "device_tracker": case "updater": diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts index 9326c588e2..295b7680ba 100644 --- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts +++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts @@ -12,6 +12,7 @@ import { customElement, property, state, query } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { fireEvent } from "../../../common/dom/fire_event"; +import { alarmPanelIcon } from "../../../common/entity/alarm_panel_icon"; import "../../../components/ha-card"; import "../../../components/ha-label-badge"; import { @@ -24,17 +25,6 @@ import { createEntityNotFoundWarning } from "../components/hui-warning"; import type { LovelaceCard } from "../types"; import { AlarmPanelCardConfig } from "./types"; -const ICONS = { - armed_away: "hass:shield-lock", - armed_custom_bypass: "hass:security", - armed_home: "hass:shield-home", - armed_night: "hass:shield-moon", - armed_vacation: "hass:shield-lock", - disarmed: "hass:shield-check", - pending: "hass:shield-outline", - triggered: "hass:bell-ring", -}; - const BUTTONS = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", "clear"]; @customElement("hui-alarm-panel-card") @@ -162,7 +152,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { > From fcac3fa164125e6597c0459d48bab7698d548634 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 20 Sep 2021 16:32:13 +0200 Subject: [PATCH 45/67] Convert suggest-card dialog to `ha-dialog` (#10000) Co-authored-by: Bram Kragten --- .../card-editor/hui-dialog-create-card.ts | 1 + .../card-editor/hui-dialog-suggest-card.ts | 100 ++++++++++-------- .../card-editor/hui-entity-picker-table.ts | 4 +- .../unused-entities/hui-unused-entities.ts | 4 +- 4 files changed, 58 insertions(+), 51 deletions(-) diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts index 99db254ff3..0c7a2a74c4 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts @@ -55,6 +55,7 @@ export class HuiCreateDialogCard public closeDialog(): boolean { this._params = undefined; this._currTabIndex = 0; + this._selectedEntities = []; fireEvent(this, "dialog-closed", { dialog: this.localName }); return true; } diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts index a005040f11..ac70a4c6b3 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-suggest-card.ts @@ -1,7 +1,8 @@ import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import deepFreeze from "deep-freeze"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; -import { customElement, property, state, query } from "lit/decorators"; +import { customElement, property, query, state } from "lit/decorators"; +import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/dialog/ha-paper-dialog"; import "../../../../components/ha-yaml-editor"; import type { HaYamlEditor } from "../../../../components/ha-yaml-editor"; @@ -47,16 +48,26 @@ export class HuiDialogSuggestCard extends LitElement { } } + public closeDialog(): void { + this._params = undefined; + this._cardConfig = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + protected render(): TemplateResult { if (!this._params) { return html``; } return html` - -

- ${this.hass!.localize("ui.panel.lovelace.editor.suggest_card.header")} -

- + +
${this._cardConfig ? html`
@@ -80,37 +91,39 @@ export class HuiDialogSuggestCard extends LitElement {
` : ""} - -
- - ${this._params.yaml - ? this.hass!.localize("ui.common.close") - : this.hass!.localize("ui.common.cancel")} - - ${!this._params.yaml - ? html` - ${this.hass!.localize( - "ui.panel.lovelace.editor.suggest_card.create_own" - )} - - ${this._saving - ? html` - - ` - : this.hass!.localize( - "ui.panel.lovelace.editor.suggest_card.add" - )} - - ` - : ""}
- + + ${this._params.yaml + ? this.hass!.localize("ui.common.close") + : this.hass!.localize("ui.common.cancel")} + + ${!this._params.yaml + ? html` + ${this.hass!.localize( + "ui.panel.lovelace.editor.suggest_card.create_own" + )} + + ${this._saving + ? html` + + ` + : this.hass!.localize( + "ui.panel.lovelace.editor.suggest_card.add" + )} + + ` + : ""} + `; } @@ -120,17 +133,17 @@ export class HuiDialogSuggestCard extends LitElement { css` @media all and (max-width: 450px), all and (max-height: 500px) { /* overrule the ha-style-dialog max-height on small screens */ - ha-paper-dialog { + ha-dialog { max-height: 100%; height: 100%; } } @media all and (min-width: 850px) { - ha-paper-dialog { + ha-dialog { width: 845px; } } - ha-paper-dialog { + ha-dialog { max-width: 845px; --dialog-z-index: 5; } @@ -154,11 +167,6 @@ export class HuiDialogSuggestCard extends LitElement { ]; } - private _close(): void { - this._params = undefined; - this._cardConfig = undefined; - } - private _pickCard(): void { if ( !this._params?.lovelaceConfig || @@ -174,7 +182,7 @@ export class HuiDialogSuggestCard extends LitElement { path: this._params!.path, entities: this._params!.entities, }); - this._close(); + this.closeDialog(); } private async _save(): Promise { @@ -196,7 +204,7 @@ export class HuiDialogSuggestCard extends LitElement { ); this._saving = false; showSaveSuccessToast(this, this.hass); - this._close(); + this.closeDialog(); } } diff --git a/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts b/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts index 9da5b68ab0..eb5ba784c0 100644 --- a/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts +++ b/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts @@ -68,9 +68,7 @@ export class HuiEntityPickerTable extends LitElement {
${name} ${narrow - ? html` -
${entity.stateObj.entity_id}
- ` + ? html`
${entity.entity_id}
` : ""}
`, diff --git a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts index cc8d2de9db..4b24e74f44 100644 --- a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts +++ b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts @@ -89,9 +89,9 @@ export class HuiUnusedEntities extends LitElement { icon: "", entity_id: entity, stateObj, - name: computeStateName(stateObj), + name: stateObj ? computeStateName(stateObj) : "Unavailable", domain: computeDomain(entity), - last_changed: stateObj!.last_changed, + last_changed: stateObj?.last_changed, }; }) as DataTableRowData[]} @selected-changed=${this._handleSelectedChanged} From 49494c572b1f235070cf43a0243ba50cdd810c28 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 20 Sep 2021 16:32:41 +0200 Subject: [PATCH 46/67] Fix card deletion dialog buttons out of view (#9992) Co-authored-by: Bram Kragten --- src/components/dialog/ha-paper-dialog.ts | 2 +- .../card-editor/hui-dialog-delete-card.ts | 49 ++++++++++--------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/components/dialog/ha-paper-dialog.ts b/src/components/dialog/ha-paper-dialog.ts index 0cb0e92fd7..edaeff9315 100644 --- a/src/components/dialog/ha-paper-dialog.ts +++ b/src/components/dialog/ha-paper-dialog.ts @@ -15,7 +15,7 @@ const haTabFixBehaviorImpl = { }, }; -// paper-dialog that uses the haTabFixBehaviorImpl behvaior +// paper-dialog that uses the haTabFixBehaviorImpl behavior // export class HaPaperDialog extends paperDialogClass {} // @ts-ignore export class HaPaperDialog diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts index 6e8507794e..45247bc6d9 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-delete-card.ts @@ -1,10 +1,9 @@ import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; import deepFreeze from "deep-freeze"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; -import { customElement, property, state, query } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/dialog/ha-paper-dialog"; -import type { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog"; import type { LovelaceCardConfig } from "../../../../data/lovelace"; import { haStyleDialog } from "../../../../resources/styles"; import type { HomeAssistant } from "../../../../types"; @@ -19,16 +18,18 @@ export class HuiDialogDeleteCard extends LitElement { @state() private _cardConfig?: LovelaceCardConfig; - @query("ha-paper-dialog", true) private _dialog!: HaPaperDialog; - public async showDialog(params: DeleteCardDialogParams): Promise { this._params = params; this._cardConfig = params.cardConfig; if (!Object.isFrozen(this._cardConfig)) { this._cardConfig = deepFreeze(this._cardConfig); } - await this.updateComplete; - fireEvent(this._dialog as HTMLElement, "iron-resize"); + } + + public closeDialog(): void { + this._params = undefined; + this._cardConfig = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); } protected render(): TemplateResult { @@ -37,9 +38,12 @@ export class HuiDialogDeleteCard extends LitElement { } return html` - -

${this.hass.localize("ui.panel.lovelace.cards.confirm_delete")}

- + +
${this._cardConfig ? html`
@@ -50,16 +54,18 @@ export class HuiDialogDeleteCard extends LitElement {
` : ""} - -
- - ${this.hass!.localize("ui.common.cancel")} - - - ${this.hass!.localize("ui.common.delete")} -
- + + ${this.hass!.localize("ui.common.cancel")} + + + ${this.hass!.localize("ui.common.delete")} + + `; } @@ -80,17 +86,12 @@ export class HuiDialogDeleteCard extends LitElement { ]; } - private _close(): void { - this._params = undefined; - this._cardConfig = undefined; - } - private _delete(): void { if (!this._params?.deleteCard) { return; } this._params.deleteCard(); - this._close(); + this.closeDialog(); } } From ea5118676708d0c29854c51416e81108d6a0b553 Mon Sep 17 00:00:00 2001 From: Jefferson Bledsoe Date: Wed, 22 Sep 2021 10:38:21 +0100 Subject: [PATCH 47/67] Update delete dashboard dialog to be more descriptive (#10051) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bram Kragten Co-authored-by: Joakim Sørensen --- .../lovelace/dashboards/ha-config-lovelace-dashboards.ts | 9 +++++++-- src/translations/en.json | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts index e1784189c6..6c53171b26 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -279,9 +279,14 @@ export class HaConfigLovelaceDashboards extends LitElement { removeDashboard: async () => { if ( !(await showConfirmationDialog(this, { - text: this.hass!.localize( - "ui.panel.config.lovelace.dashboards.confirm_delete" + title: this.hass!.localize( + "ui.panel.config.lovelace.dashboards.confirm_delete_title", + { dashboard_title: dashboard!.title } ), + text: this.hass!.localize( + "ui.panel.config.lovelace.dashboards.confirm_delete_text" + ), + confirmText: this.hass!.localize("ui.common.delete"), })) ) { return false; diff --git a/src/translations/en.json b/src/translations/en.json index 7e0a71e14a..0c60bfa1f3 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1254,7 +1254,8 @@ "open": "Open", "add_dashboard": "Add dashboard" }, - "confirm_delete": "Are you sure you want to delete this dashboard?", + "confirm_delete_title": "Delete {dashboard_title}?", + "confirm_delete_text": "Your dashboard will be permanently deleted.", "cant_edit_yaml": "Dashboards defined in YAML cannot be edited from the UI. Change them in configuration.yaml.", "cant_edit_default": "The standard Lovelace dashboard cannot be edited from the UI. You can hide it by setting another dashboard as default.", "detail": { From a3a08ff5c715b4b751dc6978f7cd585c6b2c4d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 22 Sep 2021 22:37:21 +0200 Subject: [PATCH 48/67] Add dialog to trigger moving datadisk (#10048) Co-authored-by: Bram Kragten --- .../datadisk/dialog-hassio-datadisk.ts | 191 ++++++++++++++++++ .../datadisk/show-dialog-hassio-datadisk.ts | 17 ++ hassio/src/system/hassio-host-info.ts | 44 ++-- src/data/hassio/host.ts | 39 ++++ src/translations/en.json | 15 +- 5 files changed, 291 insertions(+), 15 deletions(-) create mode 100644 hassio/src/dialogs/datadisk/dialog-hassio-datadisk.ts create mode 100644 hassio/src/dialogs/datadisk/show-dialog-hassio-datadisk.ts diff --git a/hassio/src/dialogs/datadisk/dialog-hassio-datadisk.ts b/hassio/src/dialogs/datadisk/dialog-hassio-datadisk.ts new file mode 100644 index 0000000000..5c32a9e9e3 --- /dev/null +++ b/hassio/src/dialogs/datadisk/dialog-hassio-datadisk.ts @@ -0,0 +1,191 @@ +import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; +import "@polymer/paper-item/paper-item"; +import "@polymer/paper-listbox/paper-listbox"; +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; +import { fireEvent } from "../../../../src/common/dom/fire_event"; +import "../../../../src/components/ha-circular-progress"; +import "../../../../src/components/ha-markdown"; +import { + extractApiErrorMessage, + ignoreSupervisorError, +} from "../../../../src/data/hassio/common"; +import { + DatadiskList, + listDatadisks, + moveDatadisk, +} from "../../../../src/data/hassio/host"; +import { Supervisor } from "../../../../src/data/supervisor/supervisor"; +import { showAlertDialog } from "../../../../src/dialogs/generic/show-dialog-box"; +import { haStyle, haStyleDialog } from "../../../../src/resources/styles"; +import { HomeAssistant } from "../../../../src/types"; +import { HassioDatatiskDialogParams } from "./show-dialog-hassio-datadisk"; + +const calculateMoveTime = memoizeOne((supervisor: Supervisor): number => { + const speed = supervisor.host.disk_life_time !== "" ? 30 : 10; + const moveTime = (supervisor.host.disk_used * 1000) / 60 / speed; + const rebootTime = (supervisor.host.startup_time * 4) / 60; + return Math.ceil((moveTime + rebootTime) / 10) * 10; +}); + +@customElement("dialog-hassio-datadisk") +class HassioDatadiskDialog extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @state() private dialogParams?: HassioDatatiskDialogParams; + + @state() private selectedDevice?: string; + + @state() private devices?: DatadiskList["devices"]; + + @state() private moving = false; + + public showDialog(params: HassioDatatiskDialogParams) { + this.dialogParams = params; + listDatadisks(this.hass).then((data) => { + this.devices = data.devices; + }); + } + + public closeDialog(): void { + this.dialogParams = undefined; + this.selectedDevice = undefined; + this.devices = undefined; + this.moving = false; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this.dialogParams) { + return html``; + } + return html` + + ${this.moving + ? html` +

+ ${this.dialogParams.supervisor.localize( + "dialog.datadisk_move.moving" + )} +

+
+ + +

+ ${this.dialogParams.supervisor.localize( + "dialog.datadisk_move.moving_desc" + )} +

` + : html` +

+ ${this.dialogParams.supervisor.localize( + "dialog.datadisk_move.title" + )} +

+
+ ${this.devices?.length + ? html` + ${this.dialogParams.supervisor.localize( + "dialog.datadisk_move.description", + { + current_path: this.dialogParams.supervisor.os.data_disk, + time: calculateMoveTime(this.dialogParams.supervisor), + } + )} +

+ + + + ${this.devices.map( + (device) => html`${device}` + )} + + + ` + : this.devices === undefined + ? this.dialogParams.supervisor.localize( + "dialog.datadisk_move.loading_devices" + ) + : this.dialogParams.supervisor.localize( + "dialog.datadisk_move.no_devices" + )} + + + ${this.dialogParams.supervisor.localize( + "dialog.datadisk_move.cancel" + )} + + + + ${this.dialogParams.supervisor.localize( + "dialog.datadisk_move.move" + )} + `} +
+ `; + } + + private _select_device(event) { + this.selectedDevice = event.detail.value; + } + + private async _moveDatadisk() { + this.moving = true; + try { + await moveDatadisk(this.hass, this.selectedDevice!); + } catch (err) { + if (this.hass.connection.connected && !ignoreSupervisorError(err)) { + showAlertDialog(this, { + title: this.dialogParams!.supervisor.localize( + "system.host.failed_to_move" + ), + text: extractApiErrorMessage(err), + }); + this.closeDialog(); + } + } + } + + static get styles(): CSSResultGroup { + return [ + haStyle, + haStyleDialog, + css` + paper-dropdown-menu { + width: 100%; + } + ha-circular-progress { + display: block; + margin: 32px; + text-align: center; + } + + .progress-text { + text-align: center; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-hassio-datadisk": HassioDatadiskDialog; + } +} diff --git a/hassio/src/dialogs/datadisk/show-dialog-hassio-datadisk.ts b/hassio/src/dialogs/datadisk/show-dialog-hassio-datadisk.ts new file mode 100644 index 0000000000..c7a7d92b85 --- /dev/null +++ b/hassio/src/dialogs/datadisk/show-dialog-hassio-datadisk.ts @@ -0,0 +1,17 @@ +import { fireEvent } from "../../../../src/common/dom/fire_event"; +import { Supervisor } from "../../../../src/data/supervisor/supervisor"; + +export interface HassioDatatiskDialogParams { + supervisor: Supervisor; +} + +export const showHassioDatadiskDialog = ( + element: HTMLElement, + dialogParams: HassioDatatiskDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-hassio-datadisk", + dialogImport: () => import("./dialog-hassio-datadisk"), + dialogParams, + }); +}; diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 60256bbe64..5592d23ee0 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -1,5 +1,4 @@ import "@material/mwc-button"; -import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import "@material/mwc-list/mwc-list-item"; import { mdiDotsVertical } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; @@ -40,8 +39,9 @@ import { roundWithOneDecimal, } from "../../../src/util/calculate"; import "../components/supervisor-metric"; -import { showNetworkDialog } from "../dialogs/network/show-dialog-network"; +import { showHassioDatadiskDialog } from "../dialogs/datadisk/show-dialog-hassio-datadisk"; import { showHassioHardwareDialog } from "../dialogs/hardware/show-dialog-hassio-hardware"; +import { showNetworkDialog } from "../dialogs/network/show-dialog-network"; import { hassioStyle } from "../resources/hassio-style"; @customElement("hassio-host-info") @@ -180,20 +180,27 @@ class HassioHostInfo extends LitElement { ` : ""} - + - + this._handleMenuAction("hardware")}> ${this.supervisor.localize("system.host.hardware")} ${this.supervisor.host.features.includes("haos") - ? html` - ${this.supervisor.localize("system.host.import_from_usb")} - ` + ? html` this._handleMenuAction("import_from_usb")} + > + ${this.supervisor.localize("system.host.import_from_usb")} + + ${this.supervisor.host.features.includes("os_agent") && + atLeastVersion(this.supervisor.host.agent_version, 1, 2, 0) + ? html` this._handleMenuAction("move_datadisk")} + > + ${this.supervisor.localize("system.host.move_datadisk")} + ` + : ""} ` : ""}
@@ -216,17 +223,26 @@ class HassioHostInfo extends LitElement { return network_info.interfaces.find((a) => a.primary)?.ipv4?.address![0]; }); - private async _handleMenuAction(ev: CustomEvent) { - switch (ev.detail.index) { - case 0: + private async _handleMenuAction(action: string) { + switch (action) { + case "hardware": await this._showHardware(); break; - case 1: + case "import_from_usb": await this._importFromUSB(); break; + case "move_datadisk": + await this._moveDatadisk(); + break; } } + private _moveDatadisk(): void { + showHassioDatadiskDialog(this, { + supervisor: this.supervisor, + }); + } + private async _showHardware(): Promise { let hardware; try { diff --git a/src/data/hassio/host.ts b/src/data/hassio/host.ts index 47d5d8f815..136bd17d57 100644 --- a/src/data/hassio/host.ts +++ b/src/data/hassio/host.ts @@ -3,6 +3,7 @@ import { HomeAssistant } from "../../types"; import { hassioApiResultExtractor, HassioResponse } from "./common"; export type HassioHostInfo = { + agent_version: string; chassis: string; cpe: string; deployment: string; @@ -14,6 +15,8 @@ export type HassioHostInfo = { hostname: string; kernel: string; operating_system: string; + boot_timestamp: number; + startup_time: number; }; export interface HassioHassOSInfo { @@ -22,6 +25,11 @@ export interface HassioHassOSInfo { update_available: boolean; version_latest: string | null; version: string | null; + data_disk: string; +} + +export interface DatadiskList { + devices: string[]; } export const fetchHassioHostInfo = async ( @@ -129,3 +137,34 @@ export const changeHostOptions = async (hass: HomeAssistant, options: any) => { options ); }; + +export const moveDatadisk = async (hass: HomeAssistant, device: string) => { + if (atLeastVersion(hass.config.version, 2021, 2, 4)) { + return hass.callWS({ + type: "supervisor/api", + endpoint: "/os/datadisk/move", + method: "post", + timeout: null, + data: { device }, + }); + } + + return hass.callApi>("POST", "hassio/os/datadisk/move"); +}; + +export const listDatadisks = async ( + hass: HomeAssistant +): Promise => { + if (atLeastVersion(hass.config.version, 2021, 2, 4)) { + return hass.callWS({ + type: "supervisor/api", + endpoint: "/os/datadisk/list", + method: "get", + timeout: null, + }); + } + + return hassioApiResultExtractor( + await hass.callApi>("GET", "/os/datadisk/list") + ); +}; diff --git a/src/translations/en.json b/src/translations/en.json index 0c60bfa1f3..79b310a422 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4104,6 +4104,7 @@ "failed_to_shutdown": "Failed to shutdown the host", "failed_to_set_hostname": "Setting hostname failed", "failed_to_import_from_usb": "Failed to import from USB", + "failed_to_move": "Failed to move datadisk", "used_space": "Used space", "hostname": "Hostname", "change_hostname": "Change Hostname", @@ -4119,7 +4120,8 @@ "confirm_shutdown": "Are you sure you want to shutdown the host?", "shutdown_host": "Shutdown host", "hardware": "Hardware", - "import_from_usb": "Import from USB" + "import_from_usb": "Import from USB", + "move_datadisk": "Move datadisk" }, "core": { "cpu_usage": "Core CPU Usage", @@ -4206,6 +4208,17 @@ "id": "ID", "attributes": "Attributes", "device_path": "Device path" + }, + "datadisk_move": { + "title": "[%key:supervisor::system::host::move_datadisk%]", + "description": "You are currently using ''{current_path}'' as datadisk. Moving data disks will reboot your device and it's estimated to take {time} minutes. Your Home Assistant installation will not be accessible during this period. Do not disconnect the power during the move!", + "select_device": "Select new datadisk", + "no_devices": "No suitable attached devices found", + "moving_desc": "Rebooting and moving datadisk. Please have patience", + "moving": "Moving datadisk", + "loading_devices": "Loading devices", + "cancel": "[%key:ui::common::cancel%]", + "move": "Move" } } } From 2c32f6bcb373113ffd17fc57b3110d95655b9fa5 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 22 Sep 2021 14:20:23 -0700 Subject: [PATCH 49/67] Bumped version to 20210922.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 533b4a7b02..69773e27b4 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210911.0", + version="20210922.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/frontend", author="The Home Assistant Authors", From f04be8efa624b4181e4734125e429bfa53725e6d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 22 Sep 2021 23:12:04 -0700 Subject: [PATCH 50/67] Hide hassio integration during onboarding (#10079) --- src/onboarding/onboarding-integrations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index c44f2ec977..a914d6855d 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -29,7 +29,7 @@ import { HomeAssistant } from "../types"; import "./action-badge"; import "./integration-badge"; -const HIDDEN_DOMAINS = new Set(["met", "rpi_power"]); +const HIDDEN_DOMAINS = new Set(["met", "rpi_power", "hassio"]); @customElement("onboarding-integrations") class OnboardingIntegrations extends LitElement { From 03dc3e52b72a65be81cef23f5251470205a73538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 23 Sep 2021 15:08:51 +0200 Subject: [PATCH 51/67] Add missing unsupported links (#10080) --- hassio/src/system/hassio-supervisor-info.ts | 4 +++- src/translations/en.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 2df2530a6c..76ec87ba1d 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -34,16 +34,18 @@ import { hassioStyle } from "../resources/hassio-style"; const UNSUPPORTED_REASON_URL = { apparmor: "/more-info/unsupported/apparmor", container: "/more-info/unsupported/container", + content_trust: "/more-info/unsupported/content_trust", dbus: "/more-info/unsupported/dbus", docker_configuration: "/more-info/unsupported/docker_configuration", docker_version: "/more-info/unsupported/docker_version", job_conditions: "/more-info/unsupported/job_conditions", lxc: "/more-info/unsupported/lxc", network_manager: "/more-info/unsupported/network_manager", + os_agent: "/more-info/unsupported/content_trust", os: "/more-info/unsupported/os", privileged: "/more-info/unsupported/privileged", + source_mods: "/more-info/unsupported/source_mods", systemd: "/more-info/unsupported/systemd", - content_trust: "/more-info/unsupported/content_trust", }; const UNHEALTHY_REASON_URL = { diff --git a/src/translations/en.json b/src/translations/en.json index 79b310a422..a1c51b98d2 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4079,7 +4079,7 @@ "unsupported_reason": { "apparmor": "AppArmor is not enabled on the host", "container": "Containers known to cause issues", - "content-trust": "Content-trust validation is disabled", + "content_trust": "Content-trust validation is disabled", "dbus": "DBUS", "docker_configuration": "Docker Configuration", "docker_version": "Docker Version", @@ -4087,7 +4087,9 @@ "lxc": "LXC", "network_manager": "Network Manager", "os": "Operating System", + "os_agent": "OS Agent", "privileged": "Supervisor is not privileged", + "source_mods": "Source modifications", "systemd": "Systemd" }, "unhealthy_reason": { From a89caccd326b021ff83b3e07d3a67b81b26d2a3f Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 27 Sep 2021 22:03:57 +0200 Subject: [PATCH 52/67] Statistics dev tools (#10074) * Statistics dev tools * Show all statistics * Update src/data/history.ts Co-authored-by: Paulus Schoutsen * Update history.ts Co-authored-by: Paulus Schoutsen --- src/components/data-table/ha-data-table.ts | 2 +- src/data/history.ts | 39 ++++ .../developer-tools/developer-tools-router.ts | 4 + .../ha-panel-developer-tools.ts | 5 + .../statistics/developer-tools-statistics.ts | 204 ++++++++++++++++++ .../dialog-statistics-fix-units-changed.ts | 122 +++++++++++ ...how-dialog-statistics-fix-units-changed.ts | 21 ++ src/translations/en.json | 17 ++ 8 files changed, 413 insertions(+), 1 deletion(-) create mode 100644 src/panels/developer-tools/statistics/developer-tools-statistics.ts create mode 100644 src/panels/developer-tools/statistics/dialog-statistics-fix-units-changed.ts create mode 100644 src/panels/developer-tools/statistics/show-dialog-statistics-fix-units-changed.ts diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index c1a69b8858..2209d54f59 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -550,7 +550,7 @@ export class HaDataTable extends LitElement { private _handleRowClick(ev: Event) { const target = ev.target as HTMLElement; - if (target.tagName === "HA-CHECKBOX") { + if (["HA-CHECKBOX", "MWC-BUTTON"].includes(target.tagName)) { return; } const rowId = (ev.currentTarget as any).rowId; diff --git a/src/data/history.ts b/src/data/history.ts index 4e55ab711d..0a225f2685 100644 --- a/src/data/history.ts +++ b/src/data/history.ts @@ -76,6 +76,23 @@ export interface StatisticsMetaData { statistic_id: string; } +export type StatisticsValidationResult = + | StatisticsValidationResultUnsupportedUnit + | StatisticsValidationResultUnitsChanged; + +export interface StatisticsValidationResultUnsupportedUnit { + type: "unsupported_unit"; + data: { statistic_id: string; device_class: string; state_unit: string }; +} + +export interface StatisticsValidationResultUnitsChanged { + type: "units_changed"; + data: { statistic_id: string; state_unit: string; metadata_unit: string }; +} +export interface StatisticsValidationResults { + [statisticId: string]: StatisticsValidationResult[]; +} + export const fetchRecent = ( hass: HomeAssistant, entityId: string, @@ -305,6 +322,28 @@ export const fetchStatistics = ( period, }); +export const validateStatistics = (hass: HomeAssistant) => + hass.callWS({ + type: "recorder/validate_statistics", + }); + +export const updateStatisticsMetadata = ( + hass: HomeAssistant, + statistic_id: string, + unit_of_measurement: string | null +) => + hass.callWS({ + type: "recorder/update_statistics_metadata", + statistic_id, + unit_of_measurement, + }); + +export const clearStatistics = (hass: HomeAssistant, statistic_ids: string[]) => + hass.callWS({ + type: "recorder/clear_statistics", + statistic_ids, + }); + export const calculateStatisticSumGrowth = ( values: StatisticValue[] ): number | null => { diff --git a/src/panels/developer-tools/developer-tools-router.ts b/src/panels/developer-tools/developer-tools-router.ts index efc0c01ddc..308a1cc348 100644 --- a/src/panels/developer-tools/developer-tools-router.ts +++ b/src/panels/developer-tools/developer-tools-router.ts @@ -37,6 +37,10 @@ class DeveloperToolsRouter extends HassRouterPage { tag: "developer-tools-template", load: () => import("./template/developer-tools-template"), }, + statistics: { + tag: "developer-tools-statistics", + load: () => import("./statistics/developer-tools-statistics"), + }, }, }; diff --git a/src/panels/developer-tools/ha-panel-developer-tools.ts b/src/panels/developer-tools/ha-panel-developer-tools.ts index 3d05125563..c8c4609515 100644 --- a/src/panels/developer-tools/ha-panel-developer-tools.ts +++ b/src/panels/developer-tools/ha-panel-developer-tools.ts @@ -63,6 +63,11 @@ class PanelDeveloperTools extends LitElement { "ui.panel.developer-tools.tabs.events.title" )} + + ${this.hass.localize( + "ui.panel.developer-tools.tabs.statistics.title" + )} + + html`${entityState + ? computeStateName(entityState) + : data.statistic_id}`, + }, + statistic_id: { + title: "Statistic id", + sortable: true, + filterable: true, + hidden: this.narrow, + width: "30%", + }, + unit_of_measurement: { + title: "Unit", + sortable: true, + filterable: true, + width: "10%", + }, + issues: { + title: "Issue", + sortable: true, + filterable: true, + direction: "asc", + width: "30%", + template: (issues) => + html`${issues + ? issues.map( + (issue) => + this.hass.localize( + `ui.panel.developer-tools.tabs.statistics.issues.${issue.type}`, + issue.data + ) || issue.type + ) + : ""}`, + }, + fix: { + title: "", + template: (_, data: any) => + html`${data.issues + ? html`Fix issue` + : ""}`, + width: "113px", + }, + }; + + protected render() { + return html` + + `; + } + + private _rowClicked(ev) { + const id = ev.detail.id; + if (id in this.hass.states) { + fireEvent(this, "hass-more-info", { entityId: id }); + } + } + + private async _validateStatistics() { + const [statisticIds, issues] = await Promise.all([ + getStatisticIds(this.hass), + validateStatistics(this.hass), + ]); + + this._data = statisticIds.map((statistic) => ({ + ...statistic, + state: this.hass.states[statistic.statistic_id], + issues: issues[statistic.statistic_id], + })); + } + + private _fixIssue(ev) { + const issue = ev.currentTarget.data[0] as StatisticsValidationResult; + if (issue.type === "unsupported_unit") { + showAlertDialog(this, { + title: "Unsupported unit", + text: html`The unit of your entity is not a suppported unit for the + device class of the entity, ${issue.data.device_class}. +
Statistics can not be generated until this entity has a + supported unit.

If this unit was provided by an + integration, this is a bug. Please report an issue.

If you + have set this unit yourself, and want to have statistics generated, + make sure the unit matched the device class. The supported units are + documented in the +
+ developer documentation.`, + }); + return; + } + if (issue.type === "units_changed") { + showFixStatisticsUnitsChangedDialog(this, { + issue, + fixedCallback: () => { + this._validateStatistics(); + }, + }); + return; + } + showAlertDialog(this, { + title: "Fix issue", + text: "Fixing this issue is not supported yet.", + }); + } + + static get styles(): CSSResultGroup { + return [ + haStyle, + css` + .content { + padding: 16px; + } + + th { + padding: 0 8px; + text-align: left; + font-size: var( + --paper-input-container-shared-input-style_-_font-size + ); + } + + :host([rtl]) th { + text-align: right; + } + + tr { + vertical-align: top; + direction: ltr; + } + + tr:nth-child(odd) { + background-color: var(--table-row-background-color, #fff); + } + + tr:nth-child(even) { + background-color: var(--table-row-alternative-background-color, #eee); + } + td { + padding: 4px; + min-width: 200px; + word-break: break-word; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "developer-tools-statistics": HaPanelDevStatistics; + } +} diff --git a/src/panels/developer-tools/statistics/dialog-statistics-fix-units-changed.ts b/src/panels/developer-tools/statistics/dialog-statistics-fix-units-changed.ts new file mode 100644 index 0000000000..671fc81177 --- /dev/null +++ b/src/panels/developer-tools/statistics/dialog-statistics-fix-units-changed.ts @@ -0,0 +1,122 @@ +import "@material/mwc-button/mwc-button"; +import { LitElement, TemplateResult, html, CSSResultGroup } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import "../../../components/ha-dialog"; +import { fireEvent } from "../../../common/dom/fire_event"; +import { haStyle, haStyleDialog } from "../../../resources/styles"; +import { HomeAssistant } from "../../../types"; +import { + clearStatistics, + updateStatisticsMetadata, +} from "../../../data/history"; +import "../../../components/ha-formfield"; +import "../../../components/ha-radio"; +import { DialogStatisticsUnitsChangedParams } from "./show-dialog-statistics-fix-units-changed"; + +@customElement("dialog-statistics-fix-units-changed") +export class DialogStatisticsFixUnitsChanged extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @state() private _params?: DialogStatisticsUnitsChangedParams; + + @state() private _action?: "update" | "clear"; + + public showDialog(params: DialogStatisticsUnitsChangedParams): void { + this._params = params; + this._action = "update"; + } + + public closeDialog(): void { + this._params = undefined; + this._action = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult | void { + if (!this._params) { + return html``; + } + + return html` + +

+ The unit of this entity changed, we can't store values in multiple + units.
If the historic statistic values have a wrong unit, you + can update the units of the old values. The values will not be + updated.
Otherwise you can choose to delete all historic + statistic values, and start over. +

+ +

How do you want to fix this issue?

+ + + + + + + + + ${this.hass.localize( + "ui.panel.developer-tools.tabs.statistics.fix_issue.units_changed.fix" + )} + + + ${this.hass.localize("ui.common.close")} + +
+ `; + } + + private _handleActionChanged(ev): void { + this._action = ev.target.value; + } + + private async _fixIssue(): Promise { + if (this._action === "clear") { + await clearStatistics(this.hass, [this._params!.issue.data.statistic_id]); + } else { + await updateStatisticsMetadata( + this.hass, + this._params!.issue.data.statistic_id, + this._params!.issue.data.state_unit + ); + } + this._params?.fixedCallback(); + this.closeDialog(); + } + + static get styles(): CSSResultGroup { + return [haStyle, haStyleDialog]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-statistics-fix-units-changed": DialogStatisticsFixUnitsChanged; + } +} diff --git a/src/panels/developer-tools/statistics/show-dialog-statistics-fix-units-changed.ts b/src/panels/developer-tools/statistics/show-dialog-statistics-fix-units-changed.ts new file mode 100644 index 0000000000..c341bfdf21 --- /dev/null +++ b/src/panels/developer-tools/statistics/show-dialog-statistics-fix-units-changed.ts @@ -0,0 +1,21 @@ +import { fireEvent } from "../../../common/dom/fire_event"; +import { StatisticsValidationResultUnitsChanged } from "../../../data/history"; + +export const loadFixUnitsDialog = () => + import("./dialog-statistics-fix-units-changed"); + +export interface DialogStatisticsUnitsChangedParams { + issue: StatisticsValidationResultUnitsChanged; + fixedCallback: () => void; +} + +export const showFixStatisticsUnitsChangedDialog = ( + element: HTMLElement, + detailParams: DialogStatisticsUnitsChangedParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-statistics-fix-units-changed", + dialogImport: loadFixUnitsDialog, + dialogParams: detailParams, + }); +}; diff --git a/src/translations/en.json b/src/translations/en.json index a1c51b98d2..2e93ab5ab6 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3732,6 +3732,23 @@ "listeners": "This template listens for the following state changed events:", "entity": "Entity", "domain": "Domain" + }, + "statistics": { + "title": "Statistics", + "entity": "Entity", + "issue": "Issue", + "issues": { + "units_changed": "The unit of this entity changed from ''{metadata_unit}'' to ''{state_unit}''.", + "unsupported_unit": "The unit (''{state_unit}'') of this entity doesn't match a unit of device class ''{device_class}''." + }, + "fix_issue": { + "units_changed": { + "title": "The unit of this entity changed", + "update": "Update the historic statistic values from ''{metadata_unit}'' to ''{state_unit}''", + "clear": "Delete all old statistic data for this entity", + "fix": "Fix issue" + } + } } } }, From 21e14bd64435c61ff13abb613f75d24a860529a3 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 28 Sep 2021 02:55:46 +0200 Subject: [PATCH 53/67] Fix energy device graph when multiple entities have same name (#10092) --- .../energy/hui-energy-devices-graph-card.ts | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts index 797118fafc..1c056b9e11 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts @@ -21,7 +21,11 @@ import { import "../../../../components/chart/ha-chart-base"; import type HaChartBase from "../../../../components/chart/ha-chart-base"; import "../../../../components/ha-card"; -import { EnergyData, getEnergyDataCollection } from "../../../../data/energy"; +import { + DeviceConsumptionEnergyPreference, + EnergyData, + getEnergyDataCollection, +} from "../../../../data/energy"; import { calculateStatisticSumGrowth, fetchStatistics, @@ -48,6 +52,8 @@ export class HuiEnergyDevicesGraphCard @query("ha-chart-base") private _chart?: HaChartBase; + private _deviceConsumptionPrefs: DeviceConsumptionEnergyPreference[] = []; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { @@ -101,7 +107,16 @@ export class HuiEnergyDevicesGraphCard scales: { y: { type: "category", - ticks: { autoSkip: false }, + ticks: { + autoSkip: false, + callback: (index) => { + const devicePref = this._deviceConsumptionPrefs[index]; + const entity = this.hass.states[devicePref.stat_consumption]; + return entity + ? computeStateName(entity) + : devicePref.stat_consumption; + }, + }, }, x: { title: { @@ -134,13 +149,15 @@ export class HuiEnergyDevicesGraphCard ); fireEvent(this, "hass-more-info", { // @ts-ignore - entityId: this._chartData?.datasets[0]?.data[index]?.entity_id, + entityId: this._chartData?.datasets[0]?.data[index]?.label, }); }, }) ); private async _getStatistics(energyData: EnergyData): Promise { + this._deviceConsumptionPrefs = energyData.prefs.device_consumption; + this._data = await fetchStatistics( this.hass, addHours(energyData.start, -1), @@ -180,9 +197,6 @@ export class HuiEnergyDevicesGraphCard ]; energyData.prefs.device_consumption.forEach((device, idx) => { - const entity = this.hass.states[device.stat_consumption]; - const label = entity ? computeStateName(entity) : device.stat_consumption; - const value = device.stat_consumption in this._data! ? calculateStatisticSumGrowth(this._data![device.stat_consumption]) || @@ -191,9 +205,8 @@ export class HuiEnergyDevicesGraphCard data.push({ // @ts-expect-error - y: label, + y: device.stat_consumption, x: value, - entity_id: device.stat_consumption, idx, }); }); From abc4816888c49df0512cf262b7f74819799eee36 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 28 Sep 2021 02:56:56 +0200 Subject: [PATCH 54/67] Only show entities in energy with `energy` device class (#10076) --- src/components/entity/ha-statistic-picker.ts | 28 +++++++++++++++---- .../components/ha-energy-battery-settings.ts | 1 - .../dialogs/dialog-energy-battery-settings.ts | 3 ++ .../dialogs/dialog-energy-device-settings.ts | 2 ++ .../dialog-energy-grid-flow-settings.ts | 2 ++ .../dialogs/dialog-energy-solar-settings.ts | 2 ++ 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/components/entity/ha-statistic-picker.ts b/src/components/entity/ha-statistic-picker.ts index 05b78bb05c..6d83012117 100644 --- a/src/components/entity/ha-statistic-picker.ts +++ b/src/components/entity/ha-statistic-picker.ts @@ -51,6 +51,14 @@ export class HaStatisticPicker extends LitElement { @property({ type: Array, attribute: "include-unit-of-measurement" }) public includeUnitOfMeasurement?: string[]; + /** + * Show only statistics with these device classes. + * @type {Array} + * @attr include-device-classes + */ + @property({ type: Array, attribute: "include-device-classes" }) + public includeDeviceClasses?: string[]; + /** * Show only statistics on entities. * @type {Boolean} @@ -116,6 +124,7 @@ export class HaStatisticPicker extends LitElement { ( statisticIds: StatisticsMetaData[], includeUnitOfMeasurement?: string[], + includeDeviceClasses?: string[], entitiesOnly?: boolean ): Array<{ id: string; name: string; state?: HassEntity }> => { if (!statisticIds.length) { @@ -148,11 +157,18 @@ export class HaStatisticPicker extends LitElement { } return; } - output.push({ - id: meta.statistic_id, - name: computeStateName(entityState), - state: entityState, - }); + if ( + !includeDeviceClasses || + includeDeviceClasses.includes( + entityState!.attributes.device_class || "" + ) + ) { + output.push({ + id: meta.statistic_id, + name: computeStateName(entityState), + state: entityState, + }); + } }); if (!output.length) { @@ -203,6 +219,7 @@ export class HaStatisticPicker extends LitElement { (this.comboBox as any).items = this._getStatistics( this.statisticIds!, this.includeUnitOfMeasurement, + this.includeDeviceClasses, this.entitiesOnly ); } else { @@ -210,6 +227,7 @@ export class HaStatisticPicker extends LitElement { (this.comboBox as any).items = this._getStatistics( this.statisticIds!, this.includeUnitOfMeasurement, + this.includeDeviceClasses, this.entitiesOnly ); }); diff --git a/src/panels/config/energy/components/ha-energy-battery-settings.ts b/src/panels/config/energy/components/ha-energy-battery-settings.ts index d1360fd61d..bff3bd0b50 100644 --- a/src/panels/config/energy/components/ha-energy-battery-settings.ts +++ b/src/panels/config/energy/components/ha-energy-battery-settings.ts @@ -4,7 +4,6 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import { computeStateName } from "../../../../common/entity/compute_state_name"; -import "../../../../components/entity/ha-statistic-picker"; import "../../../../components/ha-card"; import "../../../../components/ha-settings-row"; import { diff --git a/src/panels/config/energy/dialogs/dialog-energy-battery-settings.ts b/src/panels/config/energy/dialogs/dialog-energy-battery-settings.ts index 20eda2eead..629d185ddc 100644 --- a/src/panels/config/energy/dialogs/dialog-energy-battery-settings.ts +++ b/src/panels/config/energy/dialogs/dialog-energy-battery-settings.ts @@ -15,6 +15,7 @@ import "@material/mwc-button/mwc-button"; import "../../../../components/entity/ha-statistic-picker"; const energyUnits = ["kWh"]; +const energyDeviceClasses = ["energy"]; @customElement("dialog-energy-battery-settings") export class DialogEnergyBatterySettings @@ -65,6 +66,7 @@ export class DialogEnergyBatterySettings Date: Mon, 27 Sep 2021 22:28:43 -0700 Subject: [PATCH 55/67] Simplify remote connection preferences (#10071) * Simplify remote connection preferences * Remove unused CSS and strings --- src/data/cloud.ts | 12 +-- .../config/cloud/account/cloud-google-pref.ts | 58 +++++++------- .../config/cloud/account/cloud-remote-pref.ts | 79 ++++++++----------- src/panels/config/ha-panel-config.ts | 9 ++- src/translations/en.json | 6 +- 5 files changed, 76 insertions(+), 88 deletions(-) diff --git a/src/data/cloud.ts b/src/data/cloud.ts index f153ea2041..0082c5ee35 100644 --- a/src/data/cloud.ts +++ b/src/data/cloud.ts @@ -3,8 +3,8 @@ import { PlaceholderContainer } from "../panels/config/automation/thingtalk/dial import { HomeAssistant } from "../types"; import { AutomationConfig } from "./automation"; -interface CloudStatusBase { - logged_in: boolean; +interface CloudStatusNotLoggedIn { + logged_in: false; cloud: "disconnected" | "connecting" | "connected"; } @@ -44,7 +44,9 @@ export interface CloudPreferences { tts_default_voice: [string, string]; } -export type CloudStatusLoggedIn = CloudStatusBase & { +export interface CloudStatusLoggedIn { + logged_in: true; + cloud: "disconnected" | "connecting" | "connected"; email: string; google_registered: boolean; google_entities: EntityFilter; @@ -54,9 +56,9 @@ export type CloudStatusLoggedIn = CloudStatusBase & { remote_domain: string | undefined; remote_connected: boolean; remote_certificate: undefined | CertificateInformation; -}; +} -export type CloudStatus = CloudStatusBase | CloudStatusLoggedIn; +export type CloudStatus = CloudStatusNotLoggedIn | CloudStatusLoggedIn; export interface SubscriptionInfo { human_description: string; diff --git a/src/panels/config/cloud/account/cloud-google-pref.ts b/src/panels/config/cloud/account/cloud-google-pref.ts index 08dc518b76..eb3d3cf6db 100644 --- a/src/panels/config/cloud/account/cloud-google-pref.ts +++ b/src/panels/config/cloud/account/cloud-google-pref.ts @@ -6,6 +6,7 @@ import { property } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/buttons/ha-call-api-button"; import "../../../../components/ha-card"; +import "../../../../components/ha-alert"; import type { HaSwitch } from "../../../../components/ha-switch"; import { CloudStatusLoggedIn, updateCloudPref } from "../../../../data/cloud"; import { showAlertDialog } from "../../../../dialogs/generic/show-dialog-box"; @@ -44,41 +45,40 @@ export class CloudGooglePref extends LitElement {

${google_enabled && !this.cloudStatus.google_registered ? html` -

- ${this.hass.localize( + -

+ > ${this.hass.localize( "ui.panel.config.cloud.account.google.not_configured_text" )} -

- + +
` : ""} ${google_enabled diff --git a/src/panels/config/cloud/account/cloud-remote-pref.ts b/src/panels/config/cloud/account/cloud-remote-pref.ts index f01070f887..dff93050bc 100644 --- a/src/panels/config/cloud/account/cloud-remote-pref.ts +++ b/src/panels/config/cloud/account/cloud-remote-pref.ts @@ -4,6 +4,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-card"; +import "../../../../components/ha-alert"; import "../../../../components/ha-switch"; // eslint-disable-next-line import type { HaSwitch } from "../../../../components/ha-switch"; @@ -53,18 +54,22 @@ export class CloudRemotePref extends LitElement { "ui.panel.config.cloud.account.remote.title" )} > -
- ${this.hass.localize( - `ui.panel.config.cloud.account.remote.${ - remote_connected - ? "connected" - : remote_enabled - ? "reconnecting" - : "not_connected" - }` - )} +
+
+ ${!remote_connected && remote_enabled + ? html` + + ` + : ""} ${this.hass.localize("ui.panel.config.cloud.account.remote.info")} ${this.hass.localize( `ui.panel.config.cloud.account.remote.${ @@ -81,25 +86,6 @@ export class CloudRemotePref extends LitElement { > https://${remote_domain}. - -
-

- ${this.hass.localize( - "ui.panel.config.cloud.account.remote.remote_enabled.caption" - )} -

-
- -
-
-

- ${this.hass.localize( - "ui.panel.config.cloud.account.remote.remote_enabled.description" - )} -

this._updateCloudStatus(), 5000); } } diff --git a/src/translations/en.json b/src/translations/en.json index 2e93ab5ab6..06d42779a4 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1974,15 +1974,11 @@ "title": "Remote Control", "connected": "Connected", "not_connected": "Not Connected", - "reconnecting": "Reconnecting", + "reconnecting": "Not connected. Trying to reconnect.", "access_is_being_prepared": "Remote control is being prepared. We will notify you when it's ready.", "info": "Home Assistant Cloud provides a secure remote connection to your instance while away from home.", "instance_is_available": "Your instance is available at", "instance_will_be_available": "Your instance will be available at", - "remote_enabled": { - "caption": "Automatically connect", - "description": "Enable this option to make sure that your Home Assistant instance is always remotely accessible." - }, "link_learn_how_it_works": "Learn how it works", "certificate_info": "Certificate Info" }, From b6344eb6e889bc4c1b54c0fae677c16fcbbc30b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Tue, 28 Sep 2021 09:09:27 +0200 Subject: [PATCH 56/67] Fix link to os_agent (#10093) --- hassio/src/system/hassio-supervisor-info.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 76ec87ba1d..e3e8129294 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -41,7 +41,7 @@ const UNSUPPORTED_REASON_URL = { job_conditions: "/more-info/unsupported/job_conditions", lxc: "/more-info/unsupported/lxc", network_manager: "/more-info/unsupported/network_manager", - os_agent: "/more-info/unsupported/content_trust", + os_agent: "/more-info/unsupported/os_agent", os: "/more-info/unsupported/os", privileged: "/more-info/unsupported/privileged", source_mods: "/more-info/unsupported/source_mods", From 68095417b9f5103812bf7b35f16acd4bc09497f1 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 29 Sep 2021 00:21:47 +0200 Subject: [PATCH 57/67] Fix tooltip and click action on device energy graph (#10094) --- .../lovelace/cards/energy/hui-energy-devices-graph-card.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts index 1c056b9e11..aa0b91faad 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts @@ -130,6 +130,10 @@ export class HuiEnergyDevicesGraphCard tooltip: { mode: "nearest", callbacks: { + title: (item) => { + const entity = this.hass.states[item[0].label]; + return entity ? computeStateName(entity) : item[0].label; + }, label: (context) => `${context.dataset.label}: ${formatNumber( context.parsed.x, @@ -149,7 +153,7 @@ export class HuiEnergyDevicesGraphCard ); fireEvent(this, "hass-more-info", { // @ts-ignore - entityId: this._chartData?.datasets[0]?.data[index]?.label, + entityId: this._chartData?.datasets[0]?.data[index]?.y, }); }, }) From b26c44b2b9b341d14641963ba371147d08b5e374 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 29 Sep 2021 00:37:32 +0200 Subject: [PATCH 58/67] Add S2 support to Z wave JS (#10090) Co-authored-by: Martin Hjelmare Co-authored-by: kpine --- src/data/zwave_js.ts | 107 ++++ .../zwave_js/dialog-zwave_js-add-node.ts | 507 +++++++++++++----- src/translations/en.json | 65 ++- 3 files changed, 516 insertions(+), 163 deletions(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index d2d69d4dff..b20d4cf6b4 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -2,6 +2,61 @@ import { UnsubscribeFunc } from "home-assistant-js-websocket"; import { HomeAssistant } from "../types"; import { DeviceRegistryEntry } from "./device_registry"; +export enum InclusionStrategy { + /** + * Always uses Security S2 if supported, otherwise uses Security S0 for certain devices which don't work without encryption and uses no encryption otherwise. + * + * Issues a warning if Security S0 or S2 is supported, but the secure bootstrapping fails. + * + * **This is the recommended** strategy and should be used unless there is a good reason not to. + */ + Default = 0, + /** + * Include using SmartStart (requires Security S2). + * Issues a warning if Security S2 is not supported, or the secure bootstrapping fails. + * + * **Should be preferred** over **Default** if supported. + */ + SmartStart, + + /** + * Don't use encryption, even if supported. + * + * **Not recommended**, because S2 should be used where possible. + */ + Insecure, + /** + * Use Security S0, even if a higher security mode is supported. + * + * Issues a warning if Security S0 is not supported or the secure bootstrapping fails. + * + * **Not recommended** because S0 should be used sparingly and S2 preferred whereever possible. + */ + Security_S0, + /** + * Use Security S2 and issue a warning if it is not supported or the secure bootstrapping fails. + * + * **Not recommended** because the *Default* strategy is more versatile and user-friendly. + */ + Security_S2, +} + +export enum SecurityClass { + /** + * Used internally during inclusion of a node. Don't use this! + */ + Temporary = -2, + /** + * `None` is used to indicate that a node is included without security. + * It is not meant as input to methods that accept a security class. + */ + None = -1, + S2_Unauthenticated = 0, + S2_Authenticated = 1, + S2_AccessControl = 2, + S0_Legacy = 7, +} + export interface ZWaveJSNodeIdentifiers { home_id: string; node_id: number; @@ -107,6 +162,16 @@ export enum NodeStatus { Alive, } +export interface RequestedGrant { + /** + * An array of security classes that are requested or to be granted. + * The granted security classes MUST be a subset of the requested ones. + */ + securityClasses: SecurityClass[]; + /** Whether client side authentication is requested or to be granted */ + clientSideAuth: boolean; +} + export const nodeStatus = ["unknown", "asleep", "awake", "dead", "alive"]; export const fetchNetworkStatus = ( @@ -138,6 +203,48 @@ export const setDataCollectionPreference = ( opted_in, }); +export const subscribeAddNode = ( + hass: HomeAssistant, + entry_id: string, + callbackFunction: (message: any) => void, + inclusion_strategy: InclusionStrategy = InclusionStrategy.Default +): Promise => + hass.connection.subscribeMessage((message) => callbackFunction(message), { + type: "zwave_js/add_node", + entry_id: entry_id, + inclusion_strategy, + }); + +export const stopInclusion = (hass: HomeAssistant, entry_id: string) => + hass.callWS({ + type: "zwave_js/stop_inclusion", + entry_id, + }); + +export const grantSecurityClasses = ( + hass: HomeAssistant, + entry_id: string, + security_classes: SecurityClass[], + client_side_auth?: boolean +) => + hass.callWS({ + type: "zwave_js/grant_security_classes", + entry_id, + security_classes, + client_side_auth, + }); + +export const validateDskAndEnterPin = ( + hass: HomeAssistant, + entry_id: string, + pin: string +) => + hass.callWS({ + type: "zwave_js/validate_dsk_and_enter_pin", + entry_id, + pin, + }); + export const fetchNodeStatus = ( hass: HomeAssistant, entry_id: string, diff --git a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts index fdd6dc0615..e06cca3ac8 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts @@ -1,15 +1,30 @@ import "@material/mwc-button/mwc-button"; -import { mdiCheckCircle, mdiCloseCircle } from "@mdi/js"; -import "../../../../../components/ha-switch"; -import "../../../../../components/ha-formfield"; -import { CSSResultGroup, html, LitElement, TemplateResult, css } from "lit"; +import { mdiAlertCircle, mdiCheckCircle, mdiCloseCircle } from "@mdi/js"; +import "@polymer/paper-input/paper-input"; +import type { PaperInputElement } from "@polymer/paper-input/paper-input"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property, query, state } from "lit/decorators"; +import { fireEvent } from "../../../../../common/dom/fire_event"; import "../../../../../components/ha-circular-progress"; -import { customElement, property, state } from "lit/decorators"; import { createCloseHeading } from "../../../../../components/ha-dialog"; -import { haStyleDialog } from "../../../../../resources/styles"; +import "../../../../../components/ha-formfield"; +import "../../../../../components/ha-switch"; +import { + grantSecurityClasses, + InclusionStrategy, + RequestedGrant, + SecurityClass, + stopInclusion, + subscribeAddNode, + validateDskAndEnterPin, +} from "../../../../../data/zwave_js"; +import { haStyle, haStyleDialog } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; import { ZWaveJSAddNodeDialogParams } from "./show-dialog-zwave_js-add-node"; -import { fireEvent } from "../../../../../common/dom/fire_event"; +import "../../../../../components/ha-radio"; +import { HaCheckbox } from "../../../../../components/ha-checkbox"; +import "../../../../../components/ha-alert"; export interface ZWaveJSAddNodeDevice { id: string; @@ -20,23 +35,38 @@ export interface ZWaveJSAddNodeDevice { class DialogZWaveJSAddNode extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @state() private entry_id?: string; + @state() private _entryId?: string; - @state() private _use_secure_inclusion = false; - - @state() private _status = ""; - - @state() private _nodeAdded = false; + @state() private _status?: + | "loading" + | "started" + | "choose_strategy" + | "interviewing" + | "failed" + | "timed_out" + | "finished" + | "validate_dsk_enter_pin" + | "grant_security_classes"; @state() private _device?: ZWaveJSAddNodeDevice; @state() private _stages?: string[]; - private _stoppedTimeout?: any; + @state() private _inclusionStrategy?: InclusionStrategy; + + @state() private _dsk?: string; + + @state() private _error?: string; + + @state() private _requestedGrant?: RequestedGrant; + + @state() private _securityClasses: SecurityClass[] = []; + + @state() private _lowSecurity = false; private _addNodeTimeoutHandle?: number; - private _subscribed?: Promise<() => Promise>; + private _subscribed?: Promise; public disconnectedCallback(): void { super.disconnectedCallback(); @@ -44,11 +74,15 @@ class DialogZWaveJSAddNode extends LitElement { } public async showDialog(params: ZWaveJSAddNodeDialogParams): Promise { - this.entry_id = params.entry_id; + this._entryId = params.entry_id; + this._status = "loading"; + this._startInclusion(); } + @query("#pin-input") private _pinInput?: PaperInputElement; + protected render(): TemplateResult { - if (!this.entry_id) { + if (!this._entryId) { return html``; } @@ -61,46 +95,153 @@ class DialogZWaveJSAddNode extends LitElement { this.hass.localize("ui.panel.config.zwave_js.add_node.title") )} > - ${this._status === "" - ? html` -

- ${this.hass.localize( - "ui.panel.config.zwave_js.add_node.introduction" - )} -

-
+ ${this._status === "loading" + ? html`
+ +
` + : this._status === "choose_strategy" + ? html`

Choose strategy

+
Secure if possible +
+ Requires user interaction during inclusion. Fast and + secure with S2 when supported. Fallback to legacy S0 or no + encryption when necessary. +
`} > - + + +
+ Legacy Secure +
+ Uses the older S0 security that is secure, but slow due to + a lot of overhead. Allows securely including S2 capable + devices which fail to be included with S2. +
`} + > + + +
+ Insecure +
Do not use encryption.
`} + > + +
-

- - - ${this.hass!.localize( - "ui.panel.config.zwave_js.add_node.secure_inclusion_warning" - )} - - -

- - ${this._use_secure_inclusion - ? html`${this.hass.localize( - "ui.panel.config.zwave_js.add_node.start_secure_inclusion" - )}` - : html` ${this.hass.localize( - "ui.panel.config.zwave_js.add_node.start_inclusion" - )}`} + + Search device + ` + : this._status === "validate_dsk_enter_pin" + ? html` +

+ Please enter the 5-digit PIN for your device and verify that + the rest of the device-specific key matches the one that can + be found on your device or the manual. +

+ ${ + this._error + ? html`${this._error}` + : "" + } +
+ + ${this._dsk} +
+ + Submit + +
+ ` + : this._status === "grant_security_classes" + ? html` +

The device has requested the following security classes:

+ ${this._error + ? html`${this._error}` + : ""} +
+ ${this._requestedGrant?.securityClasses + .sort() + .reverse() + .map( + (securityClass) => html`${this.hass.localize( + `ui.panel.config.zwave_js.add_node.security_classes.${SecurityClass[securityClass]}.title` + )} +
+ ${this.hass.localize( + `ui.panel.config.zwave_js.add_node.security_classes.${SecurityClass[securityClass]}.description` + )} +
`} + > + + +
` + )} +
+ + Submit ` - : ``} - ${this._status === "started" + : this._status === "timed_out" + ? html` +

Timed out!

+

+ We have not found any device in inclusion mode. Make sure the + device is active and in inclusion mode. +

+ + Retry + + ` + : this._status === "started" ? html`
@@ -117,6 +258,14 @@ class DialogZWaveJSAddNode extends LitElement { "ui.panel.config.zwave_js.add_node.follow_device_instructions" )}

+

+ +

@@ -125,8 +274,7 @@ class DialogZWaveJSAddNode extends LitElement { )} ` - : ``} - ${this._status === "interviewing" + : this._status === "interviewing" ? html`
@@ -159,8 +307,7 @@ class DialogZWaveJSAddNode extends LitElement { ${this.hass.localize("ui.panel.config.zwave_js.common.close")} ` - : ``} - ${this._status === "failed" + : this._status === "failed" ? html`
` - : ``} - ${this._status === "finished" + : this._status === "finished" ? html`

@@ -208,6 +354,15 @@ class DialogZWaveJSAddNode extends LitElement { "ui.panel.config.zwave_js.add_node.inclusion_finished" )}

+ ${this._lowSecurity + ? html` + There was an error during secure inclusion. You can try + again by excluding the device and adding it again. + ` + : ""}
${this.hass.localize( @@ -236,78 +391,146 @@ class DialogZWaveJSAddNode extends LitElement { ${this.hass.localize("ui.panel.config.zwave_js.common.close")} ` - : ``} + : ""} `; } - private async _secureInclusionToggleChanged(ev): Promise { - const target = ev.target; - this._use_secure_inclusion = target.checked; + private _chooseInclusionStrategy(): void { + this._unsubscribe(); + this._status = "choose_strategy"; + } + + private _handleStrategyChange(ev: CustomEvent): void { + this._inclusionStrategy = (ev.target as any).value; + } + + private _handleSecurityClassChange(ev: CustomEvent): void { + const checkbox = ev.currentTarget as HaCheckbox; + const securityClass = Number(checkbox.value); + if (checkbox.checked && !this._securityClasses.includes(securityClass)) { + this._securityClasses = [...this._securityClasses, securityClass]; + } else if (!checkbox.checked) { + this._securityClasses = this._securityClasses.filter( + (val) => val !== securityClass + ); + } + } + + private _handlePinKeyUp(ev: KeyboardEvent) { + if (ev.key === "Enter") { + this._validateDskAndEnterPin(); + } + } + + private async _validateDskAndEnterPin(): Promise { + this._status = "loading"; + this._error = undefined; + try { + await validateDskAndEnterPin( + this.hass, + this._entryId!, + this._pinInput!.value as string + ); + } catch (err) { + this._error = err.message; + this._status = "validate_dsk_enter_pin"; + } + } + + private async _grantSecurityClasses(): Promise { + this._status = "loading"; + this._error = undefined; + try { + await grantSecurityClasses( + this.hass, + this._entryId!, + this._securityClasses + ); + } catch (err) { + this._error = err.message; + this._status = "grant_security_classes"; + } + } + + private _startManualInclusion() { + if (!this._inclusionStrategy) { + this._inclusionStrategy = InclusionStrategy.Default; + } + this._startInclusion(); } private _startInclusion(): void { if (!this.hass) { return; } - this._subscribed = this.hass.connection.subscribeMessage( - (message) => this._handleMessage(message), - { - type: "zwave_js/add_node", - entry_id: this.entry_id, - secure: this._use_secure_inclusion, - } - ); - this._addNodeTimeoutHandle = window.setTimeout( - () => this._unsubscribe(), - 90000 - ); - } - - private _handleMessage(message: any): void { - if (message.event === "inclusion started") { - this._status = "started"; - } - if (message.event === "inclusion failed") { - this._unsubscribe(); - this._status = "failed"; - } - if (message.event === "inclusion stopped") { - // we get the inclusion stopped event before the node added event - // during a successful inclusion. so we set a timer to wait 3 seconds - // to give the node added event time to come in before assuming it - // timed out or was cancelled and unsubscribing. - this._stoppedTimeout = setTimeout(() => { - if (!this._nodeAdded) { - this._status = ""; - this._unsubscribe(); - this._stoppedTimeout = undefined; + this._lowSecurity = false; + this._subscribed = subscribeAddNode( + this.hass, + this._entryId!, + (message) => { + if (message.event === "inclusion started") { + this._status = "started"; + } + if (message.event === "inclusion failed") { + this._unsubscribe(); + this._status = "failed"; + } + if (message.event === "inclusion stopped") { + // We either found a device, or it failed, either way, cancel the timeout as we are no longer searching + if (this._addNodeTimeoutHandle) { + clearTimeout(this._addNodeTimeoutHandle); + } + this._addNodeTimeoutHandle = undefined; } - }, 3000); - } - if (message.event === "device registered") { - this._device = message.device; - } - if (message.event === "node added") { - this._nodeAdded = true; - if (this._stoppedTimeout) { - clearTimeout(this._stoppedTimeout); - } - this._status = "interviewing"; - } - if (message.event === "interview completed") { - this._status = "finished"; + if (message.event === "validate dsk and enter pin") { + this._status = "validate_dsk_enter_pin"; + this._dsk = message.dsk; + } + + if (message.event === "grant security classes") { + if (this._inclusionStrategy === undefined) { + grantSecurityClasses( + this.hass, + this._entryId!, + message.requested_grant.securityClasses, + message.requested_grant.clientSideAuth + ); + return; + } + this._requestedGrant = message.requested_grant; + this._securityClasses = message.requested_grant.securityClasses; + this._status = "grant_security_classes"; + } + + if (message.event === "device registered") { + this._device = message.device; + } + if (message.event === "node added") { + this._status = "interviewing"; + this._lowSecurity = message.node.low_security; + } + + if (message.event === "interview completed") { + this._unsubscribe(); + this._status = "finished"; + } + + if (message.event === "interview stage completed") { + if (this._stages === undefined) { + this._stages = [message.stage]; + } else { + this._stages = [...this._stages, message.stage]; + } + } + }, + this._inclusionStrategy + ); + this._addNodeTimeoutHandle = window.setTimeout(() => { this._unsubscribe(); - } - - if (message.event === "interview stage completed") { - if (this._stages === undefined) { - this._stages = [message.stage]; - } else { - this._stages = [...this._stages, message.stage]; - } - } + this._status = "timed_out"; + }, 90000); } private _unsubscribe(): void { @@ -315,48 +538,46 @@ class DialogZWaveJSAddNode extends LitElement { this._subscribed.then((unsub) => unsub()); this._subscribed = undefined; } - if (this._status === "started") { - this.hass.callWS({ - type: "zwave_js/stop_inclusion", - entry_id: this.entry_id, - }); - } - if (this._status !== "finished") { - this._status = ""; + if (this._entryId) { + stopInclusion(this.hass, this._entryId); } + this._requestedGrant = undefined; + this._dsk = undefined; + this._securityClasses = []; + this._status = undefined; if (this._addNodeTimeoutHandle) { clearTimeout(this._addNodeTimeoutHandle); } + this._addNodeTimeoutHandle = undefined; } public closeDialog(): void { this._unsubscribe(); - this.entry_id = undefined; - this._status = ""; - this._nodeAdded = false; + this._inclusionStrategy = undefined; + this._entryId = undefined; + this._status = undefined; this._device = undefined; this._stages = undefined; - if (this._stoppedTimeout) { - clearTimeout(this._stoppedTimeout); - this._stoppedTimeout = undefined; - } - this._use_secure_inclusion = false; - fireEvent(this, "dialog-closed", { dialog: this.localName }); } static get styles(): CSSResultGroup { return [ haStyleDialog, + haStyle, css` - .secure_inclusion_field { - margin-top: 48px; + h3 { + margin-top: 0; } .success { color: var(--success-color); } + .warning { + color: var(--warning-color); + } + .failed { color: var(--error-color); } @@ -380,10 +601,22 @@ class DialogZWaveJSAddNode extends LitElement { align-items: center; } + .flex-column { + display: flex; + flex-direction: column; + } + + .flex-column ha-formfield { + padding: 8px 0; + } + ha-svg-icon { width: 68px; height: 48px; } + .secondary { + color: var(--secondary-text-color); + } .flex-container ha-circular-progress, .flex-container ha-svg-icon { diff --git a/src/translations/en.json b/src/translations/en.json index 06d42779a4..e6852688bc 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2753,33 +2753,33 @@ }, "common": { "network": "Network", - "node_id": "Node ID", + "node_id": "Device ID", "home_id": "Home ID", "source": "Source", "close": "Close", - "add_node": "Add Node", - "remove_node": "Remove Node", + "add_node": "Add device", + "remove_node": "Remove device", "reconfigure_server": "Re-configure Server", "heal_network": "Heal Network" }, "dashboard": { "header": "Manage your Z-Wave Network", - "introduction": "Manage your Z-Wave network and Z-Wave nodes", + "introduction": "Manage your Z-Wave network and Z-Wave devices", "driver_version": "Driver Version", "server_version": "Server Version", "home_id": "Home ID", - "nodes_ready": "Nodes ready", + "nodes_ready": "Devices ready", "dump_debug": "Download a dump of your network to help diagnose issues", - "dump_dead_nodes_title": "Some of your nodes are dead", - "dump_dead_nodes_text": "Some of your nodes didn't respond and are assumed dead. These will not be fully exported.", - "dump_not_ready_title": "Not all nodes are ready yet", - "dump_not_ready_text": "If you create an export while not all nodes are ready, you could miss needed data. Give your network some time to query all nodes. Do you want to continue with the dump?", + "dump_dead_nodes_title": "Some of your devices are dead", + "dump_dead_nodes_text": "Some of your devices didn't respond and are assumed dead. These will not be fully exported.", + "dump_not_ready_title": "Not all devices are ready yet", + "dump_not_ready_text": "If you create an export while not all devices are ready, you could miss needed data. Give your network some time to query all devices. Do you want to continue with the dump?", "dump_not_ready_confirm": "Download" }, "device_info": { "zwave_info": "Z-Wave Info", - "node_status": "Node Status", - "node_ready": "Node Ready", + "node_status": "Device Status", + "node_ready": "Device Ready", "device_config": "Configure Device", "reinterview_device": "Re-interview Device", "heal_node": "Heal Device", @@ -2787,7 +2787,7 @@ }, "node_config": { "header": "Z-Wave Device Configuration", - "introduction": "Manage and adjust device (node) specific configuration parameters for the selected device", + "introduction": "Manage and adjust device specific configuration parameters for the selected device", "attribution": "Device configuration parameters and descriptions are provided by the {device_database}", "zwave_js_device_database": "Z-Wave JS Device Database", "battery_device_notice": "Battery devices must be awake to update their config. Please refer to your device manual for instructions on how to wake the device.", @@ -2811,37 +2811,50 @@ "unknown": "Unknown" }, "add_node": { - "title": "Add a Z-Wave Node", - "introduction": "This wizard will guide you through adding a node to your Z-Wave network.", - "use_secure_inclusion": "Use secure inclusion", - "secure_inclusion_warning": "Secure devices require additional bandwidth; too many secure devices can slow down your Z-Wave network. We recommend only using secure inclusion for devices that require it, like locks or garage door openers.", - "start_inclusion": "Start Inclusion", - "start_secure_inclusion": "Start Secure Inclusion", + "title": "Add a Z-Wave Device", "cancel_inclusion": "Cancel Inclusion", "controller_in_inclusion_mode": "Your Z-Wave controller is now in inclusion mode.", "follow_device_instructions": "Follow the directions that came with your device to trigger pairing on the device.", - "inclusion_failed": "The node could not be added. Please check the logs for more information.", - "inclusion_finished": "The node has been added.", + "inclusion_failed": "The device could not be added. Please check the logs for more information.", + "inclusion_finished": "The device has been added.", "view_device": "View Device", "interview_started": "The device is being interviewed. This may take some time.", - "interview_failed": "The device interview failed. Additional information may be available in the logs." + "interview_failed": "The device interview failed. Additional information may be available in the logs.", + "security_classes": { + "S2_Unauthenticated": { + "title": "S2 Unauthenticated", + "description": "Like S2 Authenticated, but without verification that the correct device is included" + }, + "S2_Authenticated": { + "title": "S2 Authenticated", + "description": "Example: Lighting, Sensors and Security Systems" + }, + "S2_AccessControl": { + "title": "S2 Access Control", + "description": "Example: Door Locks and Garage Doors" + }, + "S0_Legacy": { + "title": "S0 Legacy", + "description": "Example: Legacy Door Locks without S2 support" + } + } }, "remove_node": { - "title": "Remove a Z-Wave Node", - "introduction": "Remove a node from your Z-Wave network, and remove the associated device and entities from Home Assistant.", + "title": "Remove a Z-Wave device", + "introduction": "Remove a device from your Z-Wave network, and remove the associated device and entities from Home Assistant.", "start_exclusion": "Start Exclusion", "cancel_exclusion": "Cancel Exclusion", "controller_in_exclusion_mode": "Your Z-Wave controller is now in exclusion mode.", "follow_device_instructions": "Follow the directions that came with your device to trigger exclusion on the device.", - "exclusion_failed": "The node could not be removed. Please check the logs for more information.", - "exclusion_finished": "Node {id} has been removed from your Z-Wave network." + "exclusion_failed": "The device could not be removed. Please check the logs for more information.", + "exclusion_finished": "Device {id} has been removed from your Z-Wave network." }, "remove_failed_node": { "title": "Remove a Failed Z-Wave Device", "introduction": "Remove a failed device from your Z-Wave network. Use this if you are unable to exclude a device normally because it is broken.", "remove_device": "Remove Device", "in_progress": "The device removal is in progress.", - "removal_finished": "Node {id} has been removed from your Z-Wave network.", + "removal_finished": "Device {id} has been removed from your Z-Wave network.", "removal_failed": "The device could not be removed from your Z-Wave network." }, "reinterview_node": { From e4b4dc4ae93397c4c0fb7baba6ab7ebadeae19cb Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 29 Sep 2021 10:33:48 +0200 Subject: [PATCH 59/67] Allow gas to be in kWh (#10075) * Allow gas to be in kWh * Extract some gas unit helpers * Forgot to save a refactor Co-authored-by: Paulus Schoutsen --- src/data/energy.ts | 50 +++++++++++++++++++ .../components/ha-energy-gas-settings.ts | 3 ++ .../dialogs/dialog-energy-gas-settings.ts | 19 +++++-- .../energy/dialogs/show-dialogs-energy.ts | 2 + .../energy/hui-energy-distribution-card.ts | 3 +- .../cards/energy/hui-energy-gas-graph-card.ts | 19 +++++-- .../energy/hui-energy-sources-table-card.ts | 8 ++- 7 files changed, 93 insertions(+), 11 deletions(-) diff --git a/src/data/energy.ts b/src/data/energy.ts index 6e1cb28796..8d203861b6 100644 --- a/src/data/energy.ts +++ b/src/data/energy.ts @@ -453,3 +453,53 @@ export const getEnergySolarForecasts = (hass: HomeAssistant) => hass.callWS({ type: "energy/solar_forecast", }); + +export const ENERGY_GAS_VOLUME_UNITS = ["m³", "ft³"]; +export const ENERGY_GAS_ENERGY_UNITS = ["kWh"]; +export const ENERGY_GAS_UNITS = [ + ...ENERGY_GAS_VOLUME_UNITS, + ...ENERGY_GAS_ENERGY_UNITS, +]; + +export type EnergyGasUnit = "volume" | "energy"; + +export const getEnergyGasUnitCategory = ( + hass: HomeAssistant, + prefs: EnergyPreferences +): EnergyGasUnit | undefined => { + for (const source of prefs.energy_sources) { + if (source.type !== "gas") { + continue; + } + + const entity = hass.states[source.stat_energy_from]; + if (entity) { + return ENERGY_GAS_VOLUME_UNITS.includes( + entity.attributes.unit_of_measurement! + ) + ? "volume" + : "energy"; + } + } + return undefined; +}; + +export const getEnergyGasUnit = ( + hass: HomeAssistant, + prefs: EnergyPreferences +): string | undefined => { + for (const source of prefs.energy_sources) { + if (source.type !== "gas") { + continue; + } + + const entity = hass.states[source.stat_energy_from]; + if (entity?.attributes.unit_of_measurement) { + // Wh is normalized to kWh by stats generation + return entity.attributes.unit_of_measurement === "Wh" + ? "kWh" + : entity.attributes.unit_of_measurement; + } + } + return undefined; +}; diff --git a/src/panels/config/energy/components/ha-energy-gas-settings.ts b/src/panels/config/energy/components/ha-energy-gas-settings.ts index 4b57b0ee3d..09f85ddcc5 100644 --- a/src/panels/config/energy/components/ha-energy-gas-settings.ts +++ b/src/panels/config/energy/components/ha-energy-gas-settings.ts @@ -11,6 +11,7 @@ import { GasSourceTypeEnergyPreference, EnergyPreferencesValidation, EnergyValidationIssue, + getEnergyGasUnitCategory, } from "../../../../data/energy"; import { showConfirmationDialog, @@ -109,6 +110,7 @@ export class EnergyGasSettings extends LitElement { private _addSource() { showEnergySettingsGasDialog(this, { + unit: getEnergyGasUnitCategory(this.hass, this.preferences), saveCallback: async (source) => { await this._savePreferences({ ...this.preferences, @@ -123,6 +125,7 @@ export class EnergyGasSettings extends LitElement { ev.currentTarget.closest(".row").source; showEnergySettingsGasDialog(this, { source: { ...origSource }, + unit: getEnergyGasUnitCategory(this.hass, this.preferences), saveCallback: async (newSource) => { await this._savePreferences({ ...this.preferences, diff --git a/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts b/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts index e711615c41..2f86a6c5b3 100644 --- a/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts +++ b/src/panels/config/energy/dialogs/dialog-energy-gas-settings.ts @@ -5,6 +5,9 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import "../../../../components/ha-dialog"; import { emptyGasEnergyPreference, + ENERGY_GAS_ENERGY_UNITS, + ENERGY_GAS_UNITS, + ENERGY_GAS_VOLUME_UNITS, GasSourceTypeEnergyPreference, } from "../../../../data/energy"; import { HassDialog } from "../../../../dialogs/make-dialog-manager"; @@ -18,8 +21,6 @@ import "../../../../components/ha-radio"; import "../../../../components/ha-formfield"; import type { HaRadio } from "../../../../components/ha-radio"; -const energyUnits = ["m³"]; - @customElement("dialog-energy-gas-settings") export class DialogEnergyGasSettings extends LitElement @@ -77,9 +78,19 @@ export class DialogEnergyGasSettings diff --git a/src/panels/config/energy/dialogs/show-dialogs-energy.ts b/src/panels/config/energy/dialogs/show-dialogs-energy.ts index 28d6d79c62..6feb7e7078 100644 --- a/src/panels/config/energy/dialogs/show-dialogs-energy.ts +++ b/src/panels/config/energy/dialogs/show-dialogs-energy.ts @@ -2,6 +2,7 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import { BatterySourceTypeEnergyPreference, DeviceConsumptionEnergyPreference, + EnergyGasUnit, EnergyInfo, FlowFromGridSourceEnergyPreference, FlowToGridSourceEnergyPreference, @@ -44,6 +45,7 @@ export interface EnergySettingsBatteryDialogParams { export interface EnergySettingsGasDialogParams { source?: GasSourceTypeEnergyPreference; + unit?: EnergyGasUnit; saveCallback: (source: GasSourceTypeEnergyPreference) => Promise; } diff --git a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts index 6990690623..126a933ad2 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts @@ -22,6 +22,7 @@ import { EnergyData, energySourcesByType, getEnergyDataCollection, + getEnergyGasUnit, } from "../../../../data/energy"; import { calculateStatisticsSumGrowth, @@ -309,7 +310,7 @@ class HuiEnergyDistrubutionCard ${formatNumber(gasUsage || 0, this.hass.locale, { maximumFractionDigits: 1, })} - m³ + ${getEnergyGasUnit(this.hass, prefs) || "m³"}
diff --git a/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts index 306b5c89fa..5428cece53 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts @@ -24,6 +24,7 @@ import { labDarken } from "../../../../common/color/lab"; import { EnergyData, getEnergyDataCollection, + getEnergyGasUnit, GasSourceTypeEnergyPreference, } from "../../../../data/energy"; import { computeStateName } from "../../../../common/entity/compute_state_name"; @@ -56,6 +57,8 @@ export class HuiEnergyGasGraphCard @state() private _end = endOfToday(); + @state() private _unit?: string; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { @@ -92,7 +95,8 @@ export class HuiEnergyGasGraphCard .options=${this._createOptions( this._start, this._end, - this.hass.locale + this.hass.locale, + this._unit )} chart-type="bar" > @@ -109,7 +113,12 @@ export class HuiEnergyGasGraphCard } private _createOptions = memoizeOne( - (start: Date, end: Date, locale: FrontendLocaleData): ChartOptions => { + ( + start: Date, + end: Date, + locale: FrontendLocaleData, + unit?: string + ): ChartOptions => { const dayDifference = differenceInDays(end, start); return { parsing: false, @@ -160,7 +169,7 @@ export class HuiEnergyGasGraphCard type: "linear", title: { display: true, - text: "m³", + text: unit, }, ticks: { beginAtZero: true, @@ -175,7 +184,7 @@ export class HuiEnergyGasGraphCard `${context.dataset.label}: ${formatNumber( context.parsed.y, locale - )} m³`, + )} ${unit}`, }, }, filler: { @@ -209,6 +218,8 @@ export class HuiEnergyGasGraphCard (source) => source.type === "gas" ) as GasSourceTypeEnergyPreference[]; + this._unit = getEnergyGasUnit(this.hass, energyData.prefs) || "m³"; + const statisticsData = Object.values(energyData.stats); const datasets: ChartDataset<"bar">[] = []; let endTime: Date; diff --git a/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts b/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts index 46b4adf9c8..14ac805ad9 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts @@ -26,6 +26,7 @@ import { EnergyData, energySourcesByType, getEnergyDataCollection, + getEnergyGasUnit, } from "../../../../data/energy"; import { calculateStatisticSumGrowth } from "../../../../data/history"; import { SubscribeMixin } from "../../../../mixins/subscribe-mixin"; @@ -116,6 +117,8 @@ export class HuiEnergySourcesTableCard flow.stat_cost || flow.entity_energy_price || flow.number_energy_price ); + const gasUnit = getEnergyGasUnit(this.hass, this._data.prefs) || ""; + return html` ${this._config.title ? html`

${this._config.title}

` @@ -445,6 +448,7 @@ export class HuiEnergySourcesTableCard this._data!.stats[source.stat_energy_from] ) || 0; totalGas += energy; + const cost_stat = source.stat_cost || this._data!.info.cost_sensors[source.stat_energy_from]; @@ -479,7 +483,7 @@ export class HuiEnergySourcesTableCard - ${formatNumber(energy, this.hass.locale)} m³ + ${formatNumber(energy, this.hass.locale)} ${gasUnit} ${showCosts ? html` - ${formatNumber(totalGas, this.hass.locale)} m³ + ${formatNumber(totalGas, this.hass.locale)} ${gasUnit} ${showCosts ? html` Date: Wed, 29 Sep 2021 13:40:26 +0100 Subject: [PATCH 60/67] add 'allow-download' to iframe sandbox for chrome (#9490) --- src/panels/iframe/ha-panel-iframe.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/iframe/ha-panel-iframe.js b/src/panels/iframe/ha-panel-iframe.js index eee67cf102..8dcc0e4670 100644 --- a/src/panels/iframe/ha-panel-iframe.js +++ b/src/panels/iframe/ha-panel-iframe.js @@ -24,7 +24,7 @@ class HaPanelIframe extends PolymerElement { diff --git a/src/panels/lovelace/cards/hui-logbook-card.ts b/src/panels/lovelace/cards/hui-logbook-card.ts index e58c64f4eb..c9c4befabb 100644 --- a/src/panels/lovelace/cards/hui-logbook-card.ts +++ b/src/panels/lovelace/cards/hui-logbook-card.ts @@ -254,7 +254,7 @@ export class HuiLogbookCard extends LitElement implements LovelaceCard { ), this._fetchUserPromise, ]); - } catch (err) { + } catch (err: any) { this._error = err.message; } diff --git a/src/panels/lovelace/cards/hui-markdown-card.ts b/src/panels/lovelace/cards/hui-markdown-card.ts index 242990aa50..6f8cc9fde9 100644 --- a/src/panels/lovelace/cards/hui-markdown-card.ts +++ b/src/panels/lovelace/cards/hui-markdown-card.ts @@ -78,13 +78,13 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { } return html` - + `; @@ -155,11 +155,11 @@ export class HuiMarkdownCard extends LitElement implements LovelaceCard { const unsub = await this._unsubRenderTemplate; unsub(); this._unsubRenderTemplate = undefined; - } catch (e) { - if (e.code === "not_found") { + } catch (err: any) { + if (err.code === "not_found") { // If we get here, the connection was probably already closed. Ignore. } else { - throw e; + throw err; } } } diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index 153dbb5f55..7a223f7bb0 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -550,7 +550,7 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { const { foreground, background } = await extractColors(this._image); this._backgroundColor = background.hex; this._foregroundColor = foreground.hex; - } catch (err) { + } catch (err: any) { // eslint-disable-next-line no-console console.error("Error getting Image Colors", err); this._foregroundColor = undefined; diff --git a/src/panels/lovelace/cards/hui-picture-card.ts b/src/panels/lovelace/cards/hui-picture-card.ts index 4983cf736a..20a2a2f315 100644 --- a/src/panels/lovelace/cards/hui-picture-card.ts +++ b/src/panels/lovelace/cards/hui-picture-card.ts @@ -93,15 +93,15 @@ export class HuiPictureCard extends LitElement implements LovelaceCard { tabindex=${ifDefined( hasAction(this._config.tap_action) ? "0" : undefined )} - class="${classMap({ + class=${classMap({ clickable: Boolean( this._config.tap_action || this._config.hold_action || this._config.double_tap_action ), - })}" + })} > - + `; } diff --git a/src/panels/lovelace/cards/hui-plant-status-card.ts b/src/panels/lovelace/cards/hui-plant-status-card.ts index 173ee823c7..ed3dd31f25 100644 --- a/src/panels/lovelace/cards/hui-plant-status-card.ts +++ b/src/panels/lovelace/cards/hui-plant-status-card.ts @@ -111,7 +111,7 @@ class HuiPlantStatusCard extends LitElement implements LovelaceCard { return html` - + ${this._params.yaml ? this.hass!.localize("ui.common.close") : this.hass!.localize("ui.common.cancel")} ${!this._params.yaml ? html` - ${this.hass!.localize( "ui.panel.lovelace.editor.suggest_card.create_own" )} ${this._saving ? html` diff --git a/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts index 7f2a1c00dc..2105938beb 100644 --- a/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-alarm-panel-card-editor.ts @@ -79,10 +79,10 @@ export class HuiAlarmPanelCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} .includeDomains=${includeDomains} - @change="${this._valueChanged}" + @change=${this._valueChanged} allow-custom-entity > Used States ${this._states.map( (entityState, index) => html` @@ -101,7 +101,7 @@ export class HuiAlarmPanelCardEditor ${entityState} @@ -109,10 +109,10 @@ export class HuiAlarmPanelCardEditor ` )} ${states.map( @@ -122,9 +122,9 @@ export class HuiAlarmPanelCardEditor
`; diff --git a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts index 7f43f545e1..9ce0a97cfe 100644 --- a/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-conditional-card-editor.ts @@ -174,7 +174,7 @@ export class HuiConditionalCardEditor "ui.panel.lovelace.editor.card.generic.state" )} (${this.hass!.localize( "ui.panel.lovelace.editor.card.conditional.current_state" - )}: '${this.hass?.states[cond.entity].state}')" + )}: ${this.hass?.states[cond.entity].state})" .value=${cond.state_not !== undefined ? cond.state_not : cond.state} diff --git a/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts index 902e438247..2656a291f2 100644 --- a/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-gauge-card-editor.ts @@ -95,10 +95,10 @@ export class HuiGaugeCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} .includeDomains=${includeDomains} - @change="${this._valueChanged}" + @change=${this._valueChanged} allow-custom-entity > ${this._config!.severity !== undefined @@ -180,9 +180,9 @@ export class HuiGaugeCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.required" )})" - .value="${this._severity ? this._severity.green : 0}" + .value=${this._severity ? this._severity.green : 0} .configValue=${"green"} - @value-changed="${this._severityChanged}" + @value-changed=${this._severityChanged} >
` diff --git a/src/panels/lovelace/editor/config-elements/hui-history-graph-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-history-graph-card-editor.ts index 2be90322cf..9ed7e4279b 100644 --- a/src/panels/lovelace/editor/config-elements/hui-history-graph-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-history-graph-card-editor.ts @@ -74,9 +74,9 @@ export class HuiHistoryGraphCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._title}" - .configValue="${"title"}" - @value-changed="${this._valueChanged}" + .value=${this._title} + .configValue=${"title"} + @value-changed=${this._valueChanged} >
`; diff --git a/src/panels/lovelace/editor/config-elements/hui-humidifier-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-humidifier-card-editor.ts index 874105247d..3763707aa3 100644 --- a/src/panels/lovelace/editor/config-elements/hui-humidifier-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-humidifier-card-editor.ts @@ -63,10 +63,10 @@ export class HuiHumidifierCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} .includeDomains=${includeDomains} - @change="${this._valueChanged}" + @change=${this._valueChanged} allow-custom-entity >
`; diff --git a/src/panels/lovelace/editor/config-elements/hui-iframe-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-iframe-card-editor.ts index ade1266f61..f88fff1f22 100644 --- a/src/panels/lovelace/editor/config-elements/hui-iframe-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-iframe-card-editor.ts @@ -58,9 +58,9 @@ export class HuiIframeCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.required" )})" - .value="${this._url}" - .configValue="${"url"}" - @value-changed="${this._valueChanged}" + .value=${this._url} + .configValue=${"url"} + @value-changed=${this._valueChanged} >

diff --git a/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts index 7d8e994fd0..d73f109fd8 100644 --- a/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-markdown-card-editor.ts @@ -60,9 +60,9 @@ export class HuiMarkdownCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._title}" - .configValue="${"title"}" - @value-changed="${this._valueChanged}" + .value=${this._title} + .configValue=${"title"} + @value-changed=${this._valueChanged} >
`; diff --git a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts index e1de9a0993..012dac5a35 100644 --- a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts @@ -56,10 +56,10 @@ export class HuiMediaControlCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} .includeDomains=${includeDomains} - @change="${this._valueChanged}" + @change=${this._valueChanged} allow-custom-entity >
diff --git a/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts index 37a73d2630..fbdffb08df 100644 --- a/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-picture-entity-card-editor.ts @@ -116,9 +116,9 @@ export class HuiPictureEntityCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} - @value-changed="${this._valueChanged}" + @value-changed=${this._valueChanged} allow-custom-entity > @@ -161,12 +161,12 @@ export class HuiPictureEntityCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .configValue="${"camera_view"}" - @value-changed="${this._valueChanged}" + .configValue=${"camera_view"} + @value-changed=${this._valueChanged} > ${views.map((view) => html` ${view} `)} @@ -177,9 +177,9 @@ export class HuiPictureEntityCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._aspect_ratio}" - .configValue="${"aspect_ratio"}" - @value-changed="${this._valueChanged}" + .value=${this._aspect_ratio} + .configValue=${"aspect_ratio"} + @value-changed=${this._valueChanged} >
@@ -191,9 +191,9 @@ export class HuiPictureEntityCardEditor .dir=${dir} >
@@ -205,18 +205,18 @@ export class HuiPictureEntityCardEditor .dir=${dir} >
diff --git a/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts index eb38a5a36b..6282f172f5 100644 --- a/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-picture-glance-card-editor.ts @@ -118,9 +118,9 @@ export class HuiPictureGlanceCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._title}" - .configValue="${"title"}" - @value-changed="${this._valueChanged}" + .value=${this._title} + .configValue=${"title"} + @value-changed=${this._valueChanged} > @@ -152,12 +152,12 @@ export class HuiPictureGlanceCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .configValue="${"camera_view"}" - @value-changed="${this._valueChanged}" + .configValue=${"camera_view"} + @value-changed=${this._valueChanged} > ${views.map((view) => html` ${view} `)} @@ -168,9 +168,9 @@ export class HuiPictureGlanceCardEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._aspect_ratio}" - .configValue="${"aspect_ratio"}" - @value-changed="${this._valueChanged}" + .value=${this._aspect_ratio} + .configValue=${"aspect_ratio"} + @value-changed=${this._valueChanged} >
@@ -193,10 +193,10 @@ export class HuiPictureGlanceCardEditor "ui.panel.lovelace.editor.card.config.optional" )})" .hass=${this.hass} - .config="${this._tap_action}" - .actions="${actions}" - .configValue="${"tap_action"}" - @value-changed="${this._valueChanged}" + .config=${this._tap_action} + .actions=${actions} + .configValue=${"tap_action"} + @value-changed=${this._valueChanged} >
`; diff --git a/src/panels/lovelace/editor/config-elements/hui-plant-status-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-plant-status-card-editor.ts index 8145feda36..9b4855bb0f 100644 --- a/src/panels/lovelace/editor/config-elements/hui-plant-status-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-plant-status-card-editor.ts @@ -64,10 +64,10 @@ export class HuiPlantStatusCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} .includeDomains=${includeDomains} - @change="${this._valueChanged}" + @change=${this._valueChanged} allow-custom-entity > `; diff --git a/src/panels/lovelace/editor/config-elements/hui-shopping-list-editor.ts b/src/panels/lovelace/editor/config-elements/hui-shopping-list-editor.ts index 2b1ca001a6..76c6d9c32c 100644 --- a/src/panels/lovelace/editor/config-elements/hui-shopping-list-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-shopping-list-editor.ts @@ -63,15 +63,15 @@ export class HuiShoppingListEditor )} (${this.hass.localize( "ui.panel.lovelace.editor.card.config.optional" )})" - .value="${this._title}" - .configValue="${"title"}" - @value-changed="${this._valueChanged}" + .value=${this._title} + .configValue=${"title"} + @value-changed=${this._valueChanged} > `; diff --git a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts index 2c52f0a402..00d131a49b 100644 --- a/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-stack-card-editor.ts @@ -152,7 +152,7 @@ export class HuiStackCardEditor `} diff --git a/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts index b1b9846aa9..38ee6a87ee 100644 --- a/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-thermostat-card-editor.ts @@ -63,10 +63,10 @@ export class HuiThermostatCardEditor "ui.panel.lovelace.editor.card.config.required" )})" .hass=${this.hass} - .value="${this._entity}" + .value=${this._entity} .configValue=${"entity"} .includeDomains=${includeDomains} - @change="${this._valueChanged}" + @change=${this._valueChanged} allow-custom-entity > `; diff --git a/src/panels/lovelace/editor/delete-card.ts b/src/panels/lovelace/editor/delete-card.ts index ebbd6a71bf..9db1af53bd 100644 --- a/src/panels/lovelace/editor/delete-card.ts +++ b/src/panels/lovelace/editor/delete-card.ts @@ -22,7 +22,7 @@ export async function confDeleteCard( await lovelace.saveConfig(insertCard(newLovelace, path, cardConfig)); }; showDeleteSuccessToast(element, hass!, action); - } catch (err) { + } catch (err: any) { showAlertDialog(element, { text: `Deleting failed: ${err.message}`, }); diff --git a/src/panels/lovelace/editor/hui-dialog-save-config.ts b/src/panels/lovelace/editor/hui-dialog-save-config.ts index 0f0a6c341e..fe2e6fad39 100644 --- a/src/panels/lovelace/editor/hui-dialog-save-config.ts +++ b/src/panels/lovelace/editor/hui-dialog-save-config.ts @@ -187,7 +187,7 @@ export class HuiSaveConfig extends LitElement implements HassDialog { lovelace.setEditMode(true); this._saving = false; this.closeDialog(); - } catch (err) { + } catch (err: any) { alert(`Saving failed: ${err.message}`); this._saving = false; } diff --git a/src/panels/lovelace/editor/hui-element-editor.ts b/src/panels/lovelace/editor/hui-element-editor.ts index 492383c54d..68e0d1875c 100644 --- a/src/panels/lovelace/editor/hui-element-editor.ts +++ b/src/panels/lovelace/editor/hui-element-editor.ts @@ -87,7 +87,7 @@ export abstract class HuiElementEditor extends LitElement { try { this._config = load(this.yaml) as any; this._errors = undefined; - } catch (err) { + } catch (err: any) { this._errors = [err.message]; } this._setConfig(); @@ -111,7 +111,7 @@ export abstract class HuiElementEditor extends LitElement { if (!this._errors) { try { this._updateConfigElement(); - } catch (err) { + } catch (err: any) { this._errors = [err.message]; } } @@ -321,7 +321,7 @@ export abstract class HuiElementEditor extends LitElement { // Setup GUI editor and check that it can handle the current config try { this._configElement.setConfig(this.value); - } catch (err) { + } catch (err: any) { const msgs = handleStructError(this.hass, err); throw new GUISupportError( "Config is not supported", @@ -332,7 +332,7 @@ export abstract class HuiElementEditor extends LitElement { } else { this.GUImode = false; } - } catch (err) { + } catch (err: any) { if (err instanceof GUISupportError) { this._warnings = err.warnings ?? [err.message]; this._errors = err.errors || undefined; diff --git a/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts b/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts index 2630466145..7465d3d757 100644 --- a/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts +++ b/src/panels/lovelace/editor/lovelace-editor/hui-dialog-edit-lovelace.ts @@ -63,8 +63,8 @@ export class HuiDialogEditLovelace extends LitElement { )}
@@ -72,8 +72,8 @@ export class HuiDialogEditLovelace extends LitElement { >${this.hass!.localize("ui.common.cancel")} ${this._saving ? html`
`; diff --git a/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts b/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts index f01cf1717a..2ea6f32c6b 100644 --- a/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts +++ b/src/panels/lovelace/editor/select-view/hui-dialog-select-view.ts @@ -120,7 +120,7 @@ export class HuiDialogSelectView extends LitElement { this._urlPath = urlPath; try { this._config = await fetchConfig(this.hass.connection, urlPath, false); - } catch (e) { + } catch (err: any) { this._config = undefined; } } diff --git a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts index 4b24e74f44..52a55d3d92 100644 --- a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts +++ b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts @@ -61,9 +61,9 @@ export class HuiUnusedEntities extends LitElement { ${!this.narrow ? html`
${this.hass.localize( diff --git a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts index bd578aa96f..9f76adeadc 100644 --- a/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts +++ b/src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts @@ -113,8 +113,8 @@ export class HuiDialogEditView extends LitElement { `; break; @@ -145,8 +145,8 @@ export class HuiDialogEditView extends LitElement { : ""} `; break; @@ -154,8 +154,8 @@ export class HuiDialogEditView extends LitElement { content = html` `; break; @@ -176,8 +176,8 @@ export class HuiDialogEditView extends LitElement { ${this.hass!.localize( @@ -202,7 +202,7 @@ export class HuiDialogEditView extends LitElement { ${this.hass!.localize( "ui.panel.lovelace.editor.edit_view.delete" @@ -210,13 +210,13 @@ export class HuiDialogEditView extends LitElement { ` : ""} - ${this.hass!.localize("ui.common.cancel")} ${this._saving ? html` ${user.name} diff --git a/src/panels/lovelace/elements/hui-icon-element.ts b/src/panels/lovelace/elements/hui-icon-element.ts index 9f88b796cc..f382f469df 100644 --- a/src/panels/lovelace/elements/hui-icon-element.ts +++ b/src/panels/lovelace/elements/hui-icon-element.ts @@ -31,8 +31,8 @@ export class HuiIconElement extends LitElement implements LovelaceElement { return html` @@ -113,12 +113,12 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow { auto-validate .disabled=${UNAVAILABLE_STATES.includes(stateObj.state)} pattern="[0-9]+([\\.][0-9]+)?" - .step="${Number(stateObj.attributes.step)}" - .min="${Number(stateObj.attributes.min)}" - .max="${Number(stateObj.attributes.max)}" - .value="${Number(stateObj.state)}" + .step=${Number(stateObj.attributes.step)} + .min=${Number(stateObj.attributes.min)} + .max=${Number(stateObj.attributes.max)} + .value=${Number(stateObj.state)} type="number" - @change="${this._selectedValueChanged}" + @change=${this._selectedValueChanged} id="input" > ${stateObj.attributes.unit_of_measurement} diff --git a/src/panels/lovelace/entity-rows/hui-input-text-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-text-entity-row.ts index 5c52d0b605..65c3ee84aa 100644 --- a/src/panels/lovelace/entity-rows/hui-input-text-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-text-entity-row.ts @@ -53,13 +53,13 @@ class HuiInputTextEntityRow extends LitElement implements LovelaceRow { diff --git a/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts b/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts index 4bc96f298b..faa24d9787 100644 --- a/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-lock-entity-row.ts @@ -50,7 +50,7 @@ class HuiLockEntityRow extends LitElement implements LovelaceRow { return html` diff --git a/src/panels/lovelace/entity-rows/hui-number-entity-row.ts b/src/panels/lovelace/entity-rows/hui-number-entity-row.ts index 1e6c76b97c..339244c1b1 100644 --- a/src/panels/lovelace/entity-rows/hui-number-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-number-entity-row.ts @@ -87,12 +87,12 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { @@ -113,12 +113,12 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow { auto-validate .disabled=${stateObj.state === UNAVAILABLE} pattern="[0-9]+([\\.][0-9]+)?" - .step="${Number(stateObj.attributes.step)}" - .min="${Number(stateObj.attributes.min)}" - .max="${Number(stateObj.attributes.max)}" - .value="${Number(stateObj.state)}" + .step=${Number(stateObj.attributes.step)} + .min=${Number(stateObj.attributes.min)} + .max=${Number(stateObj.attributes.max)} + .value=${Number(stateObj.state)} type="number" - @change="${this._selectedValueChanged}" + @change=${this._selectedValueChanged} id="input" > ${stateObj.attributes.unit_of_measurement} diff --git a/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts b/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts index 3a9b87694c..0331920299 100644 --- a/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-scene-entity-row.ts @@ -52,7 +52,7 @@ class HuiSceneEntityRow extends LitElement implements LovelaceRow { return html` diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index 4389bb4198..1590a44cb3 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -117,8 +117,8 @@ class LovelacePanel extends LitElement { return html` ${this.hass!.localize("ui.panel.lovelace.reload_lovelace")} @@ -131,8 +131,8 @@ class LovelacePanel extends LitElement { return html` `; } @@ -263,7 +263,7 @@ class LovelacePanel extends LitElement { } else { conf = rawConf; } - } catch (err) { + } catch (err: any) { if (err.code !== "config_not_found") { // eslint-disable-next-line console.log(err); @@ -379,7 +379,7 @@ class LovelacePanel extends LitElement { }); this._ignoreNextUpdateEvent = true; await saveConfig(this.hass!, urlPath, newConfig); - } catch (err) { + } catch (err: any) { // eslint-disable-next-line console.error(err); // Rollback the optimistic update @@ -414,7 +414,7 @@ class LovelacePanel extends LitElement { }); this._ignoreNextUpdateEvent = true; await deleteConfig(this.hass!, urlPath); - } catch (err) { + } catch (err: any) { // eslint-disable-next-line console.error(err); // Rollback the optimistic update diff --git a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts index e9de04e022..22e5d904f8 100644 --- a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts @@ -72,10 +72,10 @@ export class HuiPictureHeaderFooter hasDoubleClick: hasAction(this._config!.double_tap_action), })} tabindex=${ifDefined(clickable ? 0 : undefined)} - class="${classMap({ + class=${classMap({ clickable, - })}" - src="${this.hass.hassUrl(this._config.image)}" + })} + src=${this.hass.hassUrl(this._config.image)} /> `; } diff --git a/src/panels/lovelace/hui-editor.ts b/src/panels/lovelace/hui-editor.ts index f989ba7ac9..c2c04b095d 100644 --- a/src/panels/lovelace/hui-editor.ts +++ b/src/panels/lovelace/hui-editor.ts @@ -56,7 +56,7 @@ class LovelaceFullConfigEditor extends LitElement {
${this.hass!.localize( @@ -209,7 +209,7 @@ class LovelaceFullConfigEditor extends LitElement { private async _removeConfig() { try { await this.lovelace!.deleteConfig(); - } catch (err) { + } catch (err: any) { showAlertDialog(this, { text: this.hass.localize( "ui.panel.lovelace.editor.raw_editor.error_remove", @@ -259,7 +259,7 @@ class LovelaceFullConfigEditor extends LitElement { let config: LovelaceConfig; try { config = load(value) as LovelaceConfig; - } catch (err) { + } catch (err: any) { showAlertDialog(this, { text: this.hass.localize( "ui.panel.lovelace.editor.raw_editor.error_parse_yaml", @@ -272,7 +272,7 @@ class LovelaceFullConfigEditor extends LitElement { } try { assert(config, lovelaceStruct); - } catch (err) { + } catch (err: any) { showAlertDialog(this, { text: this.hass.localize( "ui.panel.lovelace.editor.raw_editor.error_invalid_config", @@ -292,7 +292,7 @@ class LovelaceFullConfigEditor extends LitElement { } try { await this.lovelace!.saveConfig(config); - } catch (err) { + } catch (err: any) { showAlertDialog(this, { text: this.hass.localize( "ui.panel.lovelace.editor.raw_editor.error_save_yaml", diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index f8f98751fd..5ab8afac4e 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -119,13 +119,11 @@ class HUIRoot extends LitElement { ? html` @@ -133,28 +131,28 @@ class HUIRoot extends LitElement { ${this.config.title || this.hass!.localize("ui.panel.lovelace.editor.header")}
@@ -162,9 +160,9 @@ class HUIRoot extends LitElement { ${this.lovelace!.config.views.map( (view) => html` ${view.icon ? html` ` : view.title || "Unnamed view"} @@ -297,9 +294,9 @@ class HUIRoot extends LitElement { .label=${this.hass!.localize( "ui.panel.lovelace.editor.menu.open" )} - .title="${this.hass!.localize( + .title=${this.hass!.localize( "ui.panel.lovelace.editor.menu.open" - )}" + )} > @@ -332,7 +329,7 @@ class HUIRoot extends LitElement { "ui.common.refresh" )} graphic="icon" - @request-selected="${this._handleRefresh}" + @request-selected=${this._handleRefresh} > ${this.hass!.localize("ui.common.refresh")} ${this.hass!.localize( @@ -401,7 +398,7 @@ class HUIRoot extends LitElement { ` : ""} ${this.lovelace!.config.views.map( (view) => html` ${this._editMode ? html` ` : ""} ${view.icon ? html` ` : view.title || "Unnamed view"} ${this._editMode ? html` ` : ""} @@ -504,10 +500,10 @@ class HUIRoot extends LitElement { ? html` @@ -518,7 +514,7 @@ class HUIRoot extends LitElement { ` : ""} -
+
`; } diff --git a/src/panels/lovelace/special-rows/hui-cast-row.ts b/src/panels/lovelace/special-rows/hui-cast-row.ts index e60e8e74a4..c384bce228 100644 --- a/src/panels/lovelace/special-rows/hui-cast-row.ts +++ b/src/panels/lovelace/special-rows/hui-cast-row.ts @@ -56,7 +56,7 @@ class HuiCastRow extends LitElement implements LovelaceRow { this._config.dashboard === this._castManager.status.urlPath; return html` - +
${this._config.name}
${this._noHTTPS diff --git a/src/panels/lovelace/special-rows/hui-text-row.ts b/src/panels/lovelace/special-rows/hui-text-row.ts index a88c68a732..6953de6102 100644 --- a/src/panels/lovelace/special-rows/hui-text-row.ts +++ b/src/panels/lovelace/special-rows/hui-text-row.ts @@ -21,7 +21,7 @@ class HuiTextRow extends LitElement implements LovelaceRow { } return html` - +
${this._config.name}
${this._config.text}
`; diff --git a/src/panels/lovelace/special-rows/hui-weblink-row.ts b/src/panels/lovelace/special-rows/hui-weblink-row.ts index 9fe2a9aeed..3ff017470f 100644 --- a/src/panels/lovelace/special-rows/hui-weblink-row.ts +++ b/src/panels/lovelace/special-rows/hui-weblink-row.ts @@ -35,7 +35,7 @@ class HuiWeblinkRow extends LitElement implements LovelaceRow { rel="noreferrer" ?download=${this._config.download} > - +
${this._config.name}
`; diff --git a/src/panels/lovelace/strategies/get-strategy.ts b/src/panels/lovelace/strategies/get-strategy.ts index 66e426147d..0c43803533 100644 --- a/src/panels/lovelace/strategies/get-strategy.ts +++ b/src/panels/lovelace/strategies/get-strategy.ts @@ -59,7 +59,7 @@ const getLovelaceStrategy = async < ); } - return customElements.get(tag); + return customElements.get(tag) as unknown as T; }; interface GenerateMethods { @@ -81,7 +81,7 @@ const generateStrategy = async ( const strategy = (await getLovelaceStrategy(strategyType)) as any; // eslint-disable-next-line @typescript-eslint/return-await return await strategy[generateMethod](info); - } catch (err) { + } catch (err: any) { if (err.message !== "timeout") { // eslint-disable-next-line console.error(err); diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index 60bd581ea8..59a81234d7 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -205,7 +205,7 @@ class HaPanelMy extends LitElement { let url: string; try { url = this._createRedirectUrl(redirect); - } catch (err) { + } catch (err: any) { this._error = "url_error"; return; } @@ -248,7 +248,7 @@ class HaPanelMy extends LitElement { html`${this.hass.localize("ui.panel.my.documentation")}` ); diff --git a/src/panels/profile/ha-change-password-card.ts b/src/panels/profile/ha-change-password-card.ts index 6b06b70365..2bbcd54caf 100644 --- a/src/panels/profile/ha-change-password-card.ts +++ b/src/panels/profile/ha-change-password-card.ts @@ -153,7 +153,7 @@ class HaChangePasswordCard extends LitElement { current_password: this._currentPassword, new_password: this._password, }); - } catch (err) { + } catch (err: any) { this._errorMsg = err.message; return; } finally { diff --git a/src/panels/profile/ha-long-lived-access-tokens-card.ts b/src/panels/profile/ha-long-lived-access-tokens-card.ts index a641da7f5e..dd331c6949 100644 --- a/src/panels/profile/ha-long-lived-access-tokens-card.ts +++ b/src/panels/profile/ha-long-lived-access-tokens-card.ts @@ -119,7 +119,7 @@ class HaLongLivedTokens extends LitElement { showLongLivedAccessTokenDialog(this, { token, name }); fireEvent(this, "hass-refresh-tokens"); - } catch (err) { + } catch (err: any) { showAlertDialog(this, { title: this.hass.localize( "ui.panel.profile.long_lived_access_tokens.create_failed" @@ -148,7 +148,7 @@ class HaLongLivedTokens extends LitElement { refresh_token_id: token.id, }); fireEvent(this, "hass-refresh-tokens"); - } catch (err) { + } catch (err: any) { await showAlertDialog(this, { title: this.hass.localize( "ui.panel.profile.long_lived_access_tokens.delete_failed" diff --git a/src/panels/profile/ha-pick-theme-row.ts b/src/panels/profile/ha-pick-theme-row.ts index 5ae1ecc679..09b6d5e899 100644 --- a/src/panels/profile/ha-pick-theme-row.ts +++ b/src/panels/profile/ha-pick-theme-row.ts @@ -52,10 +52,10 @@ export class HaPickThemeRow extends LitElement { ? this.hass.localize("ui.panel.profile.themes.error_no_theme") : ""} diff --git a/src/panels/profile/ha-refresh-tokens-card.ts b/src/panels/profile/ha-refresh-tokens-card.ts index 0b380b2455..12f801978e 100644 --- a/src/panels/profile/ha-refresh-tokens-card.ts +++ b/src/panels/profile/ha-refresh-tokens-card.ts @@ -127,7 +127,7 @@ class HaRefreshTokens extends LitElement { refresh_token_id: token.id, }); fireEvent(this, "hass-refresh-tokens"); - } catch (err) { + } catch (err: any) { await showAlertDialog(this, { title: this.hass.localize( "ui.panel.profile.refresh_tokens.delete_failed" diff --git a/src/state-summary/state-card-input_select.ts b/src/state-summary/state-card-input_select.ts index 152f9565e5..91b47eede3 100644 --- a/src/state-summary/state-card-input_select.ts +++ b/src/state-summary/state-card-input_select.ts @@ -29,7 +29,7 @@ class StateCardInputSelect extends LitElement { diff --git a/src/state/auth-mixin.ts b/src/state/auth-mixin.ts index 21575adc33..7b210cb2e9 100644 --- a/src/state/auth-mixin.ts +++ b/src/state/auth-mixin.ts @@ -44,7 +44,7 @@ export default >(superClass: T) => this.hass!.connection.close(); clearState(); document.location.href = "/"; - } catch (err) { + } catch (err: any) { // eslint-disable-next-line console.error(err); alert("Log out failed"); diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index 00bfb44bc9..4de7103637 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -81,7 +81,7 @@ export const connectionMixin = >( serviceData, target )) as ServiceCallResponse; - } catch (err) { + } catch (err: any) { if ( err.error?.code === ERR_CONNECTION_LOST && serviceCallWillDisconnect(domain, service) diff --git a/src/util/ha-pref-storage.ts b/src/util/ha-pref-storage.ts index 8c21de00b7..eb9b722914 100644 --- a/src/util/ha-pref-storage.ts +++ b/src/util/ha-pref-storage.ts @@ -17,7 +17,7 @@ export function storeState(hass: HomeAssistant) { const value = hass[key]; STORAGE[key] = JSON.stringify(value === undefined ? null : value); }); - } catch (err) { + } catch (err: any) { // Safari throws exception in private mode } } diff --git a/src/util/hass-attributes-util.ts b/src/util/hass-attributes-util.ts index d2c185c0cc..feaf4c28fb 100644 --- a/src/util/hass-attributes-util.ts +++ b/src/util/hass-attributes-util.ts @@ -189,7 +189,7 @@ export function formatAttributeValue( // If invalid URL, exception will be raised const url = new URL(value); if (url.protocol === "http:" || url.protocol === "https:") - return html`${value}`; } catch (_) { diff --git a/src/util/hass-call-api.ts b/src/util/hass-call-api.ts index 7cb4161f3a..4214ff46a0 100644 --- a/src/util/hass-call-api.ts +++ b/src/util/hass-call-api.ts @@ -8,7 +8,7 @@ export const handleFetchPromise = async ( try { response = await fetchPromise; - } catch (err) { + } catch (err: any) { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw { error: "Request error", @@ -24,7 +24,7 @@ export const handleFetchPromise = async ( if (contentType && contentType.includes("application/json")) { try { body = await response.json(); - } catch (err) { + } catch (err: any) { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw { error: "Unable to parse JSON response", diff --git a/src/util/hass-translation.ts b/src/util/hass-translation.ts index fcf8767d03..156c79fff7 100644 --- a/src/util/hass-translation.ts +++ b/src/util/hass-translation.ts @@ -90,7 +90,7 @@ export function getLocalLanguage() { return language; } } - } catch (e) { + } catch (err: any) { // Ignore parsing error. } } @@ -110,12 +110,8 @@ export function getLocalLanguage() { return "en"; } -export async function getTranslation( - fragment: string | null, - language: string -) { - return commonGetTranslation(fragment, language); -} +export const getTranslation = (fragment: string | null, language: string) => + commonGetTranslation(fragment, language); // Load selected translation into memory immediately so it is ready when Polymer // initializes. diff --git a/test/external_app/external_messaging.spec.ts b/test/external_app/external_messaging.spec.ts index ac1b1b8aa1..0903704572 100644 --- a/test/external_app/external_messaging.spec.ts +++ b/test/external_app/external_messaging.spec.ts @@ -67,7 +67,7 @@ describe("ExternalMessaging", () => { try { await sendMessageProm; assert.fail("Should have raised"); - } catch (err) { + } catch (err: any) { assert.deepEqual(err, { code: "no_auth", message: "There is no authentication.", diff --git a/tsconfig.json b/tsconfig.json index 47ceb96016..d23b0f2d39 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,7 +25,8 @@ "no-unclosed-tag": "error", "no-incompatible-type-binding": "warning", "no-invalid-css": "warning", - "no-missing-element-type-definition": "warning" + "no-missing-element-type-definition": "warning", + "no-property-visibility-mismatch": "error" } } ] diff --git a/yarn.lock b/yarn.lock index 44d1f5ea29..d8a7d889ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,53 +23,53 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.13.11, @babel/compat-data@npm:^7.14.5, @babel/compat-data@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/compat-data@npm:7.14.7" - checksum: dcf7a72cb650206857a98cce1ab0973e67689f19afc3b30cabff6dbddf563f188d54d3b3f92a70c6bc1feb9049d8b2e601540e1d435b6866c77bffad0a441c9f +"@babel/compat-data@npm:^7.13.11, @babel/compat-data@npm:^7.15.0": + version: 7.15.0 + resolution: "@babel/compat-data@npm:7.15.0" + checksum: 65088d87b14966dcdba397c799f312beb1e7a4dac178e7daa922a17ee9b65d8cfd9f35ff8352ccb6e20bb9a169df1171263ef5fd5967aa25d544ea3f62681993 languageName: node linkType: hard -"@babel/core@npm:7.14.6, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14.6": - version: 7.14.6 - resolution: "@babel/core@npm:7.14.6" +"@babel/core@npm:7.15.5, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.15.5": + version: 7.15.5 + resolution: "@babel/core@npm:7.15.5" dependencies: "@babel/code-frame": ^7.14.5 - "@babel/generator": ^7.14.5 - "@babel/helper-compilation-targets": ^7.14.5 - "@babel/helper-module-transforms": ^7.14.5 - "@babel/helpers": ^7.14.6 - "@babel/parser": ^7.14.6 - "@babel/template": ^7.14.5 - "@babel/traverse": ^7.14.5 - "@babel/types": ^7.14.5 + "@babel/generator": ^7.15.4 + "@babel/helper-compilation-targets": ^7.15.4 + "@babel/helper-module-transforms": ^7.15.4 + "@babel/helpers": ^7.15.4 + "@babel/parser": ^7.15.5 + "@babel/template": ^7.15.4 + "@babel/traverse": ^7.15.4 + "@babel/types": ^7.15.4 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.1.2 semver: ^6.3.0 source-map: ^0.5.0 - checksum: 6ede604d8de7a103c087b96a58548a3d27efb9e53de6ecc84f4b4ca947cd91f02b0289fc04557b04eb6e31243dbeabdcdb8fd520a1780f284333f56eb1b58913 + checksum: 8121bf74040d98562b773c1e92a174cd53c99a5158ae5a9ef25645ed35d6f821c64155e394cdb04e7dc77a0871ba42a638f6703b2c44a75bc04564b21cad9e1b languageName: node linkType: hard -"@babel/generator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/generator@npm:7.14.5" +"@babel/generator@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/generator@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 + "@babel/types": ^7.15.4 jsesc: ^2.5.1 source-map: ^0.5.0 - checksum: 7fcfeaf17e8e76ea91c66dc86c776d2112f52ce0315d3f4ca6a74b6eada0be1592d1ea6286d7241d3f634b63717ceef5d180d041a0b3dca9d071ba2e5fa7c77b + checksum: fec8e8fa46723d7edf4087dc07b1f65a64488cba9662458431dd00d2a24f7c41b21e3160cfa1ba3df9373b2bb5e84189a95206c9ce6f14845a3929fc1ab58f57 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-annotate-as-pure@npm:7.14.5" +"@babel/helper-annotate-as-pure@npm:^7.14.5, @babel/helper-annotate-as-pure@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-annotate-as-pure@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: 18cefedda60003c2551dabe0e4ad278ef0507682680892c60e9f7cb75ae1dc9a065cddb3ce9964da76f220bf972af5262619eeac4b84c2b8aba1b031961215cc + "@babel/types": ^7.15.4 + checksum: 94e3b5714748cc4fe419c3e75656b1747f7e985d46a178dbd87e4a97f8f4d0ba94374c6768516cdc9c744d40202f1c2bb7930a7a153274c3d42edb196e945404 languageName: node linkType: hard @@ -83,33 +83,33 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-compilation-targets@npm:7.14.5" +"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-compilation-targets@npm:7.15.4" dependencies: - "@babel/compat-data": ^7.14.5 + "@babel/compat-data": ^7.15.0 "@babel/helper-validator-option": ^7.14.5 browserslist: ^4.16.6 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 02df2c6d1bc5f2336f380945aa266a3a65d057c5eff6be667235a8005048b21f69e4aaebc8e43ccfc2fb406688383ae8e572f257413febf244772e5e7af5fd7f + checksum: a2b9767d5658da90bd79170b4b0d2987930fb6708d48428619f9f4664c47e3f9409801b76c7603446404b453c67e54682cc86840cb1c29aa06c956533ebaf5ba languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.14.5, @babel/helper-create-class-features-plugin@npm:^7.14.6": - version: 7.14.6 - resolution: "@babel/helper-create-class-features-plugin@npm:7.14.6" +"@babel/helper-create-class-features-plugin@npm:^7.14.5, @babel/helper-create-class-features-plugin@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.15.4" dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-function-name": ^7.14.5 - "@babel/helper-member-expression-to-functions": ^7.14.5 - "@babel/helper-optimise-call-expression": ^7.14.5 - "@babel/helper-replace-supers": ^7.14.5 - "@babel/helper-split-export-declaration": ^7.14.5 + "@babel/helper-annotate-as-pure": ^7.15.4 + "@babel/helper-function-name": ^7.15.4 + "@babel/helper-member-expression-to-functions": ^7.15.4 + "@babel/helper-optimise-call-expression": ^7.15.4 + "@babel/helper-replace-supers": ^7.15.4 + "@babel/helper-split-export-declaration": ^7.15.4 peerDependencies: "@babel/core": ^7.0.0 - checksum: 9d9c3c6f469bc5da4e5819979d0f70bf8a824967661743800741b5560cfa3cf811d52ab14dc00dd6e839814f8db39cf3118c08d550c487680969c40c9ccf2e2a + checksum: 42fa8550125cd26ec5ff62f8d5383924b896a35326a31acced93a166661d1a1446199e5d2c8dc3685d70482127dc57cc6c22c5ffccadb58e72bfedf906fba817 languageName: node linkType: hard @@ -152,75 +152,75 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-function-name@npm:7.14.5" +"@babel/helper-function-name@npm:^7.14.5, @babel/helper-function-name@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-function-name@npm:7.15.4" dependencies: - "@babel/helper-get-function-arity": ^7.14.5 - "@babel/template": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: fd8ffa82f7622b6e9a6294fb3b98b42e743ab2a8e3c329367667a960b5b98b48bc5ebf8be7308981f1985b9f3c69e1a3b4a91c8944ae97c31803240da92fb3c8 + "@babel/helper-get-function-arity": ^7.15.4 + "@babel/template": ^7.15.4 + "@babel/types": ^7.15.4 + checksum: 0500e8e40753fdc25252b30609b12df8ebb997a4e5b4c2145774855c026a4338c0510fc7b819035d5f9d76cf3bd63417c0b7b58f0836a10996300f2f925c4e0f languageName: node linkType: hard -"@babel/helper-get-function-arity@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-get-function-arity@npm:7.14.5" +"@babel/helper-get-function-arity@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-get-function-arity@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: a60779918b677a35e177bb4f46babfd54e9790587b6a4f076092a9eff2a940cbeacdeb10c94331b26abfe838769554d72293d16df897246cfccd1444e5e27cb7 + "@babel/types": ^7.15.4 + checksum: 1a3dba8700ec69b5b120401769897a1a0ca2edcf6b546659d49946dcc8b0755c4c58dd8f15739f5cf851d4ca1db76f56759897c6f5b9f76f2fef989dc4f8fd54 languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-hoist-variables@npm:7.14.5" +"@babel/helper-hoist-variables@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-hoist-variables@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: 35af58eebffca10988de7003e044ce2d27212aea72ac6d2c4604137da7f1e193cc694d8d60805d0d0beaf3d990f6f2dcc2622c52e3d3148e37017a29cacf2e56 + "@babel/types": ^7.15.4 + checksum: 1a9ae0a27112b5f4e4ab91da2a1b40a8f91d8ce195e965d900ec3f13b583a1ab36834fb3edc2812523fa1d586ce21c3e6d8ce437d168e23a5d8e7e2e46b50f6f languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.14.5": - version: 7.14.7 - resolution: "@babel/helper-member-expression-to-functions@npm:7.14.7" +"@babel/helper-member-expression-to-functions@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-member-expression-to-functions@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: 1768b849224002d7a8553226ad73e1e957fb6184b68234d5df7a45cf8e4453ed1208967c1cace1a4d973b223ddc881d105e372945ec688f09485dff0e8ed6180 + "@babel/types": ^7.15.4 + checksum: 30cf27e2afbaf1d58d189c5f36951a6af7d2bfccdfdb7d57e91749620d9c3c37d78324a1725079d3ab4a0e5c4e5f3d5f19a275d5dd269baa2aa8852835b05d6d languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-module-imports@npm:7.14.5" +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.14.5, @babel/helper-module-imports@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-module-imports@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: b98279908698a50a22634e683924cb25eb93edf1bf28ac65691dfa82d7a1a4dae4e6b12b8ef9f9a50171ca484620bce544f270873c53505d8a45364c5b665c0c + "@babel/types": ^7.15.4 + checksum: 519681cb9c27fcacd85ef13534020db3a2bac1d53a4d988fd9f3cf1ec223854311d4193c961cc2031c4d1df3b1a35a849b38237302752ae3d29eb00e5b9a904a languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-module-transforms@npm:7.14.5" +"@babel/helper-module-transforms@npm:^7.14.5, @babel/helper-module-transforms@npm:^7.15.4": + version: 7.15.7 + resolution: "@babel/helper-module-transforms@npm:7.15.7" dependencies: - "@babel/helper-module-imports": ^7.14.5 - "@babel/helper-replace-supers": ^7.14.5 - "@babel/helper-simple-access": ^7.14.5 - "@babel/helper-split-export-declaration": ^7.14.5 - "@babel/helper-validator-identifier": ^7.14.5 - "@babel/template": ^7.14.5 - "@babel/traverse": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: f5d64c0242ec8949ee09069a634d28ae750ab22f9533ea90eab9eaf3405032a33b0b329a63fac0a7901482efb8a388a06279f7544225a0bc3c1b92b306ab2b6e + "@babel/helper-module-imports": ^7.15.4 + "@babel/helper-replace-supers": ^7.15.4 + "@babel/helper-simple-access": ^7.15.4 + "@babel/helper-split-export-declaration": ^7.15.4 + "@babel/helper-validator-identifier": ^7.15.7 + "@babel/template": ^7.15.4 + "@babel/traverse": ^7.15.4 + "@babel/types": ^7.15.6 + checksum: 7e09aa7c3cfff4d715891af13a09626962aadb822501fbb587218abe35d82174255f5aa79b67e40b75c1d374a6b5976e6836237ece69c651c7e11e604783a5c9 languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-optimise-call-expression@npm:7.14.5" +"@babel/helper-optimise-call-expression@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-optimise-call-expression@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: c7af558c63eb5449bf2249f1236d892ed54a400cb6c721756cde573b996c12c64dee6b57fa18ad1a0025d152e6f689444f7ea32997a1d56e1af66c3eda18843d + "@babel/types": ^7.15.4 + checksum: 7c929d1a3dbed7ee776dd8a4502b92433bb14ce6217372581db117de294edcf7b8678b1f703b8309c769bb46f2e4f005cdb3958dec508a486b2b03a9a919b542 languageName: node linkType: hard @@ -231,60 +231,60 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-remap-async-to-generator@npm:7.14.5" +"@babel/helper-remap-async-to-generator@npm:^7.14.5, @babel/helper-remap-async-to-generator@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-remap-async-to-generator@npm:7.15.4" dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-wrap-function": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: 022594a15caed0d3bbac52e27eef0f20f9dceb85921b682df55f3bb21dee6fea645b03663e84fdfaadc6b88f4b83b012858520813c15e88728bbc5e16bf3fa29 + "@babel/helper-annotate-as-pure": ^7.15.4 + "@babel/helper-wrap-function": ^7.15.4 + "@babel/types": ^7.15.4 + checksum: 80918caa96fcb679a89887f7997fd1428d77810e3fa11de0c7475594a09c7b96adee872b84202f8301ee707dec43575c6d92799f07959d595d2da1940388d8aa languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-replace-supers@npm:7.14.5" +"@babel/helper-replace-supers@npm:^7.14.5, @babel/helper-replace-supers@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-replace-supers@npm:7.15.4" dependencies: - "@babel/helper-member-expression-to-functions": ^7.14.5 - "@babel/helper-optimise-call-expression": ^7.14.5 - "@babel/traverse": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: 35d33cfe473f9fb5cc1110ee259686179ecd07e00e07d9eb03de998e47f49d59fc2e183cf6be0793fd6bec24510b893415e52ace93ae940f94663c4a02c6fbd0 + "@babel/helper-member-expression-to-functions": ^7.15.4 + "@babel/helper-optimise-call-expression": ^7.15.4 + "@babel/traverse": ^7.15.4 + "@babel/types": ^7.15.4 + checksum: b08a23914a5f7f964aefa4518255006d3a58e4c0cf972527c1fe3c79ebff4d6d50c9f1d370b8d62e0085766a654910e39ba196fab522d794142d2219eea8430d languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-simple-access@npm:7.14.5" +"@babel/helper-simple-access@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-simple-access@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: cd795416bd10dd2f1bdebb36f1af08bf263024fdbf789cfda5dd1fbf4fea1fd0375e21d0bcb910a7d49b09b7480340797dcdfc888fbc895aeae45c145358ad75 + "@babel/types": ^7.15.4 + checksum: 8c3462264d6755c1e190a709fa90667c1691cb61cdca2d3f9119dd93adfd9fbcb292bcc48dbd7e065b8c27d9371f2793799a92aec124a3260288ed112e00c839 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.14.5" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.14.5, @babel/helper-skip-transparent-expression-wrappers@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: d16937eb08d57d2577902fa6d05ac4b1695602babd9dff9890fa8e56b593fdc997ad24de13fdaf15617036bfacf3493ea569898a5ac0538c2a831aa163f18985 + "@babel/types": ^7.15.4 + checksum: ebec4ea6fc93fd39e610f7b274cb63e420fffee1cbe5002e41bdf9d39ce6121d541163124730fb22b242d0f58d3be447b339ec6b323feeda687a978cafabfeaa languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-split-export-declaration@npm:7.14.5" +"@babel/helper-split-export-declaration@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-split-export-declaration@npm:7.15.4" dependencies: - "@babel/types": ^7.14.5 - checksum: 93437025a33747bfd37d6d5a9cdac8f4b6b3e5c0c53c0e24c5444575e731ea64fd5471a51a039fd74ff3378f916ea2d69d9f10274d253ed6f832952be2fd65f0 + "@babel/types": ^7.15.4 + checksum: 6baf45996e1323fdfc30666e9c0b3219d74c54dc71e9130acfa4d9d4c53faa95618ac383a1c82a156555908323384a416b4a29e88b337de98fdb476212134f99 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-validator-identifier@npm:7.14.5" - checksum: 6366bceab4498785defc083a1bd96344f788d90a1aa7a6f18d6813c1d3d134640bfc05690453c0b79bbfc820472cf5b29110dfddaca1f8e2763dfe1bd5df0b88 +"@babel/helper-validator-identifier@npm:^7.14.5, @babel/helper-validator-identifier@npm:^7.14.9, @babel/helper-validator-identifier@npm:^7.15.7": + version: 7.15.7 + resolution: "@babel/helper-validator-identifier@npm:7.15.7" + checksum: f041c28c531d1add5cc345b25d5df3c29c62bce3205b4d4a93dcd164ccf630350acba252d374fad8f5d8ea526995a215829f27183ba7ce7ce141843bf23068a6 languageName: node linkType: hard @@ -295,26 +295,26 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/helper-wrap-function@npm:7.14.5" +"@babel/helper-wrap-function@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helper-wrap-function@npm:7.15.4" dependencies: - "@babel/helper-function-name": ^7.14.5 - "@babel/template": ^7.14.5 - "@babel/traverse": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: d5c4bec02396f00d305ae2b60cfa5f3ec27d196a71b88107745b6be4fe257ebe54deedb6ee3997c8c9a2cc5c2571d567c22e9b866109490a2aa7f79a1a2272e2 + "@babel/helper-function-name": ^7.15.4 + "@babel/template": ^7.15.4 + "@babel/traverse": ^7.15.4 + "@babel/types": ^7.15.4 + checksum: 66422c8abd69ac3b9be44de62fe9e460ae8faa2b692757eeed920523633a1921b29af8867eb5f0832b1f029c489cf01c703ae51fa2dc078ea636abcc52e092bc languageName: node linkType: hard -"@babel/helpers@npm:^7.14.6": - version: 7.14.6 - resolution: "@babel/helpers@npm:7.14.6" +"@babel/helpers@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/helpers@npm:7.15.4" dependencies: - "@babel/template": ^7.14.5 - "@babel/traverse": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: fe4e73975b062a8b8b95f499f4ac1064c9a53d4ee83cc273c2420250f6a46b59f1f5e35050d41ebe04efd7885a28ceea6f4f16d8eb091e24622f2a4a5eb20f23 + "@babel/template": ^7.15.4 + "@babel/traverse": ^7.15.4 + "@babel/types": ^7.15.4 + checksum: e60738110086c183d0ce369ad56949d5dceeb7d73d8fdb892f36d5b8525192e6b97f4563eb77334f47ac27ac43a21f3c4cd53bff342c2a0d5f4008a2b0169c89 languageName: node linkType: hard @@ -329,25 +329,25 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.14.5, @babel/parser@npm:^7.14.6, @babel/parser@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/parser@npm:7.14.7" +"@babel/parser@npm:^7.15.4, @babel/parser@npm:^7.15.5": + version: 7.15.7 + resolution: "@babel/parser@npm:7.15.7" bin: parser: ./bin/babel-parser.js - checksum: 0d7acc8cf9c19ccd0e80ab0608953f32f4375f3867c080211270e7bb4bb94c551fd1fc3f49b3cc92a4eec356cf507801f5c93c4c72996968bdc4c28815fe0550 + checksum: bd828b933118354ecae482240e100205738b9d8bff06cf615493c470cad09198d8c024f3e28053f38f875f90d566a5994c19a4c0329bb0c126a994cb031e90e1 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.14.5" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.15.4" dependencies: "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-skip-transparent-expression-wrappers": ^7.14.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.15.4 "@babel/plugin-proposal-optional-chaining": ^7.14.5 peerDependencies: "@babel/core": ^7.13.0 - checksum: 17331fd4c1de860ac78aa3195eb5bd058c4eb24a8f2c6e719f079f9c86cbdb53d9a8affc2f9f78b6fc257afef03811922c2d16addad5d5f6224d2820da1c9f45 + checksum: 6c4f264951a51b22ae52e97ed8ba272c1b7a068a0b4a3472c24998a9ce0c3174c3157457a7c886664cc5c77f7693b779d07b1def2545a6cfdf66ee5ff2064423 languageName: node linkType: hard @@ -362,16 +362,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.14.7" +"@babel/plugin-proposal-async-generator-functions@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.15.4" dependencies: "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-remap-async-to-generator": ^7.14.5 + "@babel/helper-remap-async-to-generator": ^7.15.4 "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 09343a79385615f8d5f95aaef7c44af5e899c82f030f3d73546c2ffffa567c0949f0405052d7e32f643c0eb2a23590a5050f4606855b3506246d3d60e46f32e3 + checksum: 23fdc2b4fe7482ee4d4de31da5433d660cd7251a417d3a99826f69d8684db2225b640afc16b4014a55ee737eb0e966357f4063ad0128893c6f54e24ffe0318bd languageName: node linkType: hard @@ -387,29 +387,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-class-static-block@npm:7.14.5" +"@babel/plugin-proposal-class-static-block@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-proposal-class-static-block@npm:7.15.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.14.5 + "@babel/helper-create-class-features-plugin": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 "@babel/plugin-syntax-class-static-block": ^7.14.5 peerDependencies: "@babel/core": ^7.12.0 - checksum: 0275d0643dacd08638c2d3c129158ad0c2dea6a26e78fa4b2129811a29460ff9a6459d1955a19bfa3b9ed67ba2bb3c88676823ad207b2de4f0c65e0c3751d75c + checksum: 2c77531cf6637fbebed18cc0485651737a875c507c7ebfc35c702bde9aeac303708c825bcd7c9882ae5c007ab1c44fbea322ac3b26ef3774d89f4e5d494da0fb languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-decorators@npm:7.14.5" +"@babel/plugin-proposal-decorators@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-proposal-decorators@npm:7.15.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.14.5 + "@babel/helper-create-class-features-plugin": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 "@babel/plugin-syntax-decorators": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: caf02b34940b719a4e7648abef2f7397b50bcfb07ae631cc2dcee5d77473679bf4c6e1e5e5a467d0abb0fdaaadabc9d017259cb6e68c5dec8a20e3b7ef406696 + checksum: 02d966e11bf9b4a6984940cc77319f901e21574bca542a294d384ef8b05a6571b2b60c6ac5aa4e97beeec95e3ec6b440c8fc04d1e37996bb1fd366cfe672c0db languageName: node linkType: hard @@ -485,18 +485,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.14.7" +"@babel/plugin-proposal-object-rest-spread@npm:^7.15.6": + version: 7.15.6 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.15.6" dependencies: - "@babel/compat-data": ^7.14.7 - "@babel/helper-compilation-targets": ^7.14.5 + "@babel/compat-data": ^7.15.0 + "@babel/helper-compilation-targets": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.14.5 + "@babel/plugin-transform-parameters": ^7.15.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a35192868166fb5a62003a56ce2c266f74ae680f1d9589652c4495145240dd138a9505301bb5adca069cb874d6f0f733dc2f3d1d05f71a06019735c29c4d1a11 + checksum: fef884b9e2e235c449f317b4fb0f90c23bdfbfec160c3ed105a3bbf2a85a6e449883953f8229ba132ad65090ff38094fca8475225ad462d1bd87f1392f3f60ed languageName: node linkType: hard @@ -537,17 +537,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.14.5" +"@babel/plugin-proposal-private-property-in-object@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.15.4" dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-create-class-features-plugin": ^7.14.5 + "@babel/helper-annotate-as-pure": ^7.15.4 + "@babel/helper-create-class-features-plugin": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a11da6a52eb13d6dcb6ed36993a81e9746404f6e83d32be16142911b7e5768293d8c4c5373d182ef25cb94d0b18c0c27a07f4553be042ee2dc49f7179f8cbfe2 + checksum: 39a0ab24dcc3464997dbac785ad4f69eac26496c6848000f4886da47a18547e635a34b0ca6fd943674f280d4b146d20b7baeb31e05276af8f508f884198dcea9 languageName: node linkType: hard @@ -796,31 +796,31 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.14.5" +"@babel/plugin-transform-block-scoping@npm:^7.15.3": + version: 7.15.3 + resolution: "@babel/plugin-transform-block-scoping@npm:7.15.3" dependencies: "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d317d636d0475317302e9c8b01cf9214fac3ff9353b23d0d16285f196f5c7b95b7864a8e8eaf51a3e1b650649203855f80a58b7a2caef4b0ee9793e7349a0ec5 + checksum: ee28f51711b5f6569a9bb86be5b2a5456f3e6e22e68488ee77f8082fae5563f45c858dc8323e0e51085d880db1be73e28dc5d108c8a855c831fb29310a01b549 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-classes@npm:7.14.5" +"@babel/plugin-transform-classes@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-transform-classes@npm:7.15.4" dependencies: - "@babel/helper-annotate-as-pure": ^7.14.5 - "@babel/helper-function-name": ^7.14.5 - "@babel/helper-optimise-call-expression": ^7.14.5 + "@babel/helper-annotate-as-pure": ^7.15.4 + "@babel/helper-function-name": ^7.15.4 + "@babel/helper-optimise-call-expression": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-replace-supers": ^7.14.5 - "@babel/helper-split-export-declaration": ^7.14.5 + "@babel/helper-replace-supers": ^7.15.4 + "@babel/helper-split-export-declaration": ^7.15.4 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 42fc333a0d8a6a90b5c75e90d2ec21494f711ab7c58f2d074d95726cdd38f137e74653602a82d2d1a3e9bc504b5eff62418d70048514b672c9bd108bfb866e25 + checksum: c795bb3f49eff5a5a7357650fb233e6a84089278d8b917ef46c566dd112de660240e7ffca6ba274d7596034806b9655974082cf99746ea492f3be98613d5fc01 languageName: node linkType: hard @@ -881,14 +881,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-for-of@npm:7.14.5" +"@babel/plugin-transform-for-of@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-transform-for-of@npm:7.15.4" dependencies: "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: aeb76eb11d10b2390996001e2fd529bbaf3695edd306d24e4eba87b8137c10a6afda3896017f88fcf40fd2334cc424c0a111fad34e10c747e81e577e5957e328 + checksum: 908307b89d05bfb464a4a33033f68fdfedf6302a0203d45c2a34abc3a5bacf23767284892b21b52d0cbeb7e10330a1d5d81990000fef1592adbb3556fd96d1d0 languageName: node linkType: hard @@ -939,32 +939,32 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.14.5" +"@babel/plugin-transform-modules-commonjs@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.15.4" dependencies: - "@babel/helper-module-transforms": ^7.14.5 + "@babel/helper-module-transforms": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-simple-access": ^7.14.5 + "@babel/helper-simple-access": ^7.15.4 babel-plugin-dynamic-import-node: ^2.3.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5cc41ee904e421c32f692ce10985190bc8f995df63ee1fd899ea80ce50b4b8408c7f2fddf16e01345244fc5702c8b9c0772afdd934e325c4e468840daa9bee04 + checksum: 4782b0dad09a9a593be94c7d71fc134ba190e04125a0bf7127dfb5f23413438467b50d92f5d91faa2d377cecccfaf9cdd61156a033fc772816772fdddd82e0ad languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.14.5" +"@babel/plugin-transform-modules-systemjs@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.15.4" dependencies: - "@babel/helper-hoist-variables": ^7.14.5 - "@babel/helper-module-transforms": ^7.14.5 + "@babel/helper-hoist-variables": ^7.15.4 + "@babel/helper-module-transforms": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 - "@babel/helper-validator-identifier": ^7.14.5 + "@babel/helper-validator-identifier": ^7.14.9 babel-plugin-dynamic-import-node: ^2.3.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3ca0bb1c0c22a3d705476186afa9fc86398ae4662afc259ff29c1942e3c8770f4bdadaf67418a21816964d4e1eaf07412eeabccccfaa9d45eac735f971ad148b + checksum: c5ba905680781237a8e86ae6434a9ca33e49deb8e7c3ac28d7b8079bc51c39b557aeecb06e97dc519912815fc99cbd75eaa23bfaa5428ee36aef2dfeae617c29 languageName: node linkType: hard @@ -980,14 +980,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.14.7" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.14.9": + version: 7.14.9 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.14.9" dependencies: "@babel/helper-create-regexp-features-plugin": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: 3c68bc77cce387750ecd32d33e9ad0f0968245fbe03b36ec8dddc52bee3ee84757205db3b3b4fc605e055f08769312ef4dbf4a0c8adb8f02eb04b142ffcdf265 + checksum: 81dda376c0af4c07ae252703481e8bd16d49045bd624697ff6b6635326f3f20fca9c574a2f0036bf7f4aa8c36baa9d926912538de486a189a3515bec7f72e16a languageName: node linkType: hard @@ -1014,14 +1014,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-transform-parameters@npm:7.14.5" +"@babel/plugin-transform-parameters@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/plugin-transform-parameters@npm:7.15.4" dependencies: "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 932bc616be7b5542ba2371c85cfcc579a8556b9e5a5ea5535b7f0ec5b68284ed2a3724ae181f1a22719b5ea6539c82f5fcee37d9f45f08ed72eb9e43a0940b56 + checksum: 0d8bf881156669a2a6fa279e80fa2f1f47ec6404a72be87adb3e8fa40e72d26f2413ce942208dd1b0f6deb47332d8d2fd81b5e5d6f744779c7d9b13f85b608a5 languageName: node linkType: hard @@ -1114,16 +1114,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.14.5": - version: 7.14.6 - resolution: "@babel/plugin-transform-typescript@npm:7.14.6" +"@babel/plugin-transform-typescript@npm:^7.15.0": + version: 7.15.4 + resolution: "@babel/plugin-transform-typescript@npm:7.15.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.14.6 + "@babel/helper-create-class-features-plugin": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 "@babel/plugin-syntax-typescript": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cb3117cfc9c8ebf9612b137eb660448e79a876a189fcad6b79641faa7200073bbfd08bf0e63c7ddb3a35b3d31457d6e90cf63565e64446a73866290dc97353fa + checksum: a6fb1f2f831024aff5110fa1be44e5fff96ce11a51178869f09d98675528c6878ff3a95caa42868cb55eae97d23c77e68913aa1737eb38befd2cb49301e2601d languageName: node linkType: hard @@ -1150,29 +1150,29 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.14.7": - version: 7.14.7 - resolution: "@babel/preset-env@npm:7.14.7" +"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.15.6": + version: 7.15.6 + resolution: "@babel/preset-env@npm:7.15.6" dependencies: - "@babel/compat-data": ^7.14.7 - "@babel/helper-compilation-targets": ^7.14.5 + "@babel/compat-data": ^7.15.0 + "@babel/helper-compilation-targets": ^7.15.4 "@babel/helper-plugin-utils": ^7.14.5 "@babel/helper-validator-option": ^7.14.5 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.14.5 - "@babel/plugin-proposal-async-generator-functions": ^7.14.7 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.15.4 + "@babel/plugin-proposal-async-generator-functions": ^7.15.4 "@babel/plugin-proposal-class-properties": ^7.14.5 - "@babel/plugin-proposal-class-static-block": ^7.14.5 + "@babel/plugin-proposal-class-static-block": ^7.15.4 "@babel/plugin-proposal-dynamic-import": ^7.14.5 "@babel/plugin-proposal-export-namespace-from": ^7.14.5 "@babel/plugin-proposal-json-strings": ^7.14.5 "@babel/plugin-proposal-logical-assignment-operators": ^7.14.5 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.14.5 "@babel/plugin-proposal-numeric-separator": ^7.14.5 - "@babel/plugin-proposal-object-rest-spread": ^7.14.7 + "@babel/plugin-proposal-object-rest-spread": ^7.15.6 "@babel/plugin-proposal-optional-catch-binding": ^7.14.5 "@babel/plugin-proposal-optional-chaining": ^7.14.5 "@babel/plugin-proposal-private-methods": ^7.14.5 - "@babel/plugin-proposal-private-property-in-object": ^7.14.5 + "@babel/plugin-proposal-private-property-in-object": ^7.15.4 "@babel/plugin-proposal-unicode-property-regex": ^7.14.5 "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-class-properties": ^7.12.13 @@ -1191,25 +1191,25 @@ __metadata: "@babel/plugin-transform-arrow-functions": ^7.14.5 "@babel/plugin-transform-async-to-generator": ^7.14.5 "@babel/plugin-transform-block-scoped-functions": ^7.14.5 - "@babel/plugin-transform-block-scoping": ^7.14.5 - "@babel/plugin-transform-classes": ^7.14.5 + "@babel/plugin-transform-block-scoping": ^7.15.3 + "@babel/plugin-transform-classes": ^7.15.4 "@babel/plugin-transform-computed-properties": ^7.14.5 "@babel/plugin-transform-destructuring": ^7.14.7 "@babel/plugin-transform-dotall-regex": ^7.14.5 "@babel/plugin-transform-duplicate-keys": ^7.14.5 "@babel/plugin-transform-exponentiation-operator": ^7.14.5 - "@babel/plugin-transform-for-of": ^7.14.5 + "@babel/plugin-transform-for-of": ^7.15.4 "@babel/plugin-transform-function-name": ^7.14.5 "@babel/plugin-transform-literals": ^7.14.5 "@babel/plugin-transform-member-expression-literals": ^7.14.5 "@babel/plugin-transform-modules-amd": ^7.14.5 - "@babel/plugin-transform-modules-commonjs": ^7.14.5 - "@babel/plugin-transform-modules-systemjs": ^7.14.5 + "@babel/plugin-transform-modules-commonjs": ^7.15.4 + "@babel/plugin-transform-modules-systemjs": ^7.15.4 "@babel/plugin-transform-modules-umd": ^7.14.5 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.14.7 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.14.9 "@babel/plugin-transform-new-target": ^7.14.5 "@babel/plugin-transform-object-super": ^7.14.5 - "@babel/plugin-transform-parameters": ^7.14.5 + "@babel/plugin-transform-parameters": ^7.15.4 "@babel/plugin-transform-property-literals": ^7.14.5 "@babel/plugin-transform-regenerator": ^7.14.5 "@babel/plugin-transform-reserved-words": ^7.14.5 @@ -1221,15 +1221,15 @@ __metadata: "@babel/plugin-transform-unicode-escapes": ^7.14.5 "@babel/plugin-transform-unicode-regex": ^7.14.5 "@babel/preset-modules": ^0.1.4 - "@babel/types": ^7.14.5 + "@babel/types": ^7.15.6 babel-plugin-polyfill-corejs2: ^0.2.2 babel-plugin-polyfill-corejs3: ^0.2.2 babel-plugin-polyfill-regenerator: ^0.2.2 - core-js-compat: ^3.15.0 + core-js-compat: ^3.16.0 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ebebc20ada68c92b67375926021d576af3636a279aee7625c1e234880355c8669188483aecfff2d478c1caa9fcf18b569ea329060b479236b04baed2bdf796d5 + checksum: 096902ac397b6ab53bd6c03c59cc451d98b407d1863c185837f0cb56ff45414aa08ae6b950ef179c66a30c0680d4d1846cda0766a990f850ee477022353daf5b languageName: node linkType: hard @@ -1248,16 +1248,16 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/preset-typescript@npm:7.14.5" +"@babel/preset-typescript@npm:^7.15.0": + version: 7.15.0 + resolution: "@babel/preset-typescript@npm:7.15.0" dependencies: "@babel/helper-plugin-utils": ^7.14.5 "@babel/helper-validator-option": ^7.14.5 - "@babel/plugin-transform-typescript": ^7.14.5 + "@babel/plugin-transform-typescript": ^7.15.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c4f60abfa96c380e16f38b9206a1009a5cbc01866da83ca731fa360c0bf7dca11ca930179bba476ab77e270e2567f28439244d4f495dce9d39647a7273c04949 + checksum: 2c480bb0ef76418357d92ccfae67df544a069ca8f59785e8bd0d1d3111bfc671f9f04672583506f1ee62afc3872bf21ed85d6d0c97ba1bc09a6efd1f7c20a10f languageName: node linkType: hard @@ -1270,41 +1270,41 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/template@npm:7.14.5" +"@babel/template@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/template@npm:7.15.4" dependencies: "@babel/code-frame": ^7.14.5 - "@babel/parser": ^7.14.5 - "@babel/types": ^7.14.5 - checksum: 4939199c5b1ca8940e14c87f30f4fab5f35c909bef88447131075349027546927b4e3e08e50db5c2db2024f2c6585a4fe571c739c835ac980f7a4ada2dd8a623 + "@babel/parser": ^7.15.4 + "@babel/types": ^7.15.4 + checksum: 58ca51fdd40bbaaddf2e46513dd05d5823f214cb2877b3f353abf5541a033a1b6570c29c2c80e60f2b55966326e40bebbf53666b261646ccf410b3d984af42ce languageName: node linkType: hard -"@babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.14.5": - version: 7.14.7 - resolution: "@babel/traverse@npm:7.14.7" +"@babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.15.4": + version: 7.15.4 + resolution: "@babel/traverse@npm:7.15.4" dependencies: "@babel/code-frame": ^7.14.5 - "@babel/generator": ^7.14.5 - "@babel/helper-function-name": ^7.14.5 - "@babel/helper-hoist-variables": ^7.14.5 - "@babel/helper-split-export-declaration": ^7.14.5 - "@babel/parser": ^7.14.7 - "@babel/types": ^7.14.5 + "@babel/generator": ^7.15.4 + "@babel/helper-function-name": ^7.15.4 + "@babel/helper-hoist-variables": ^7.15.4 + "@babel/helper-split-export-declaration": ^7.15.4 + "@babel/parser": ^7.15.4 + "@babel/types": ^7.15.4 debug: ^4.1.0 globals: ^11.1.0 - checksum: 11e9162e46bdd6daef8691facbf5c47838f6e312ac775be35c40353c77887338d1b9ce497211d2ae96628a9230551f03eb3df49b4ca53b6f668082f2c157d1a0 + checksum: 831506a92c8ed76dc60504de37663bf5a553d7b1b009a94defc082cddb6c380c5487a1aa9438bcd7b9891a2a72758a63e4f878154aa70699d09b388b1445d774 languageName: node linkType: hard -"@babel/types@npm:^7.14.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/types@npm:7.14.5" +"@babel/types@npm:^7.14.5, @babel/types@npm:^7.15.4, @babel/types@npm:^7.15.6, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.15.6 + resolution: "@babel/types@npm:7.15.6" dependencies: - "@babel/helper-validator-identifier": ^7.14.5 + "@babel/helper-validator-identifier": ^7.14.9 to-fast-properties: ^2.0.0 - checksum: 7c1ab6e8bdf438d44236034cab10f7d0f1971179bc405dca26733a9b89dd87dd692dc49a238a7495075bc41a9a17fb6f08b4d1da45ea6ddcce1e5c8593574aea + checksum: 37f497dde10d238b5eb184efab83b415a86611e3d73dc0434de0cfb851b20ee606a3b7e1525e5b2d522fac1248d0345fea0468006f246262511b80cd3ed2419f languageName: node linkType: hard @@ -1492,9 +1492,9 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^0.4.2": - version: 0.4.2 - resolution: "@eslint/eslintrc@npm:0.4.2" +"@eslint/eslintrc@npm:^0.4.3": + version: 0.4.3 + resolution: "@eslint/eslintrc@npm:0.4.3" dependencies: ajv: ^6.12.4 debug: ^4.1.1 @@ -1505,7 +1505,7 @@ __metadata: js-yaml: ^3.13.1 minimatch: ^3.0.4 strip-json-comments: ^3.1.1 - checksum: 17f90cf07988dd2a5e4f510687c81334141977b8e0fa1b63ef0318b0578466e368fc988c101ddc7df55b6124dff8ecd1be67292c27901265761758ad22608e12 + checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3 languageName: node linkType: hard @@ -3993,14 +3993,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^4.28.3": - version: 4.28.3 - resolution: "@typescript-eslint/eslint-plugin@npm:4.28.3" +"@typescript-eslint/eslint-plugin@npm:^4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/eslint-plugin@npm:4.32.0" dependencies: - "@typescript-eslint/experimental-utils": 4.28.3 - "@typescript-eslint/scope-manager": 4.28.3 + "@typescript-eslint/experimental-utils": 4.32.0 + "@typescript-eslint/scope-manager": 4.32.0 debug: ^4.3.1 functional-red-black-tree: ^1.0.1 + ignore: ^5.1.8 regexpp: ^3.1.0 semver: ^7.3.5 tsutils: ^3.21.0 @@ -4010,66 +4011,66 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 2ac7113dbb0916ee911c3cee552b31b82c3c286ce4be1d2b5b8fbbe64eb05eb8c5187a64aba2fc5d46f2bc2d391887b33e00edbb65f2f25f41342efa346776ef + checksum: f1e856f1f500ac7a06097536d0a5392f33f4a9f0750ffac90c30e40852524579715624ffa791b6fb601320d1d53135b4321b00d0554f6aea12fe55b65ccedd7b languageName: node linkType: hard -"@typescript-eslint/experimental-utils@npm:4.28.3": - version: 4.28.3 - resolution: "@typescript-eslint/experimental-utils@npm:4.28.3" +"@typescript-eslint/experimental-utils@npm:4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/experimental-utils@npm:4.32.0" dependencies: "@types/json-schema": ^7.0.7 - "@typescript-eslint/scope-manager": 4.28.3 - "@typescript-eslint/types": 4.28.3 - "@typescript-eslint/typescript-estree": 4.28.3 + "@typescript-eslint/scope-manager": 4.32.0 + "@typescript-eslint/types": 4.32.0 + "@typescript-eslint/typescript-estree": 4.32.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 peerDependencies: eslint: "*" - checksum: 09b1b196318acbf6efbb9ea93fc73b18a77c1fc04efb24bc77d941666b5a0c48828f2d788079bdfd340828045d15054a4c95fba5367e7c8b1fe53de53736a1db + checksum: bad0072df9f7f7804a3bd9aeccfe6a0b117e47ad7f58d091674a276c84171be2c525c977c304d39c6d0cd31706a2d9a4f797466a505dda7985535cd3ad9b5830 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^4.28.3, @typescript-eslint/parser@npm:^4.4.1": - version: 4.28.3 - resolution: "@typescript-eslint/parser@npm:4.28.3" +"@typescript-eslint/parser@npm:^4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/parser@npm:4.32.0" dependencies: - "@typescript-eslint/scope-manager": 4.28.3 - "@typescript-eslint/types": 4.28.3 - "@typescript-eslint/typescript-estree": 4.28.3 + "@typescript-eslint/scope-manager": 4.32.0 + "@typescript-eslint/types": 4.32.0 + "@typescript-eslint/typescript-estree": 4.32.0 debug: ^4.3.1 peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 3a5d64237e7085235f3b27eece73105bd5a7b51f17c868c086a6062bd8ab6901c908270d41c055f44d9f440c6a1bb3203429693a07436905cc60d3a03cd361e9 + checksum: dd6a30fb04e56a13b53298c7d20cb3954cc6f220c599ba907b5029c2d36230a1d9850c8392d47a3b4c2760a39af5f6ff502a2eaa984a44f93142c83ac231d52d languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:4.28.3": - version: 4.28.3 - resolution: "@typescript-eslint/scope-manager@npm:4.28.3" +"@typescript-eslint/scope-manager@npm:4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/scope-manager@npm:4.32.0" dependencies: - "@typescript-eslint/types": 4.28.3 - "@typescript-eslint/visitor-keys": 4.28.3 - checksum: 9ffb955581311ef46d7aebf23ac544c96164bac00f7657f963680ba7b239b1c021733318ea22ca2965ff9b8f2798dff8ae5d7add0dae4207d3dad86d5e4f0f1f + "@typescript-eslint/types": 4.32.0 + "@typescript-eslint/visitor-keys": 4.32.0 + checksum: 03510d080dee19588a09f41226c93fb67eafe132c2305da4dbcfaf3ccb333a6d1736f7b897d83c85545cb88f532c81849182b1c55cb7ca7ad9148aa5d4671ad2 languageName: node linkType: hard -"@typescript-eslint/types@npm:4.28.3": - version: 4.28.3 - resolution: "@typescript-eslint/types@npm:4.28.3" - checksum: 15f052f92ee429056e7bdd4b0ff3750d72a6ab6c202a46f394dcd7490da7f670d7b516fc5febc96332cced39fdf3fd20c4893ee58fb93ce9b58e2f1e1766d7bb +"@typescript-eslint/types@npm:4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/types@npm:4.32.0" + checksum: e93ce12ee3ee0fa1ac6f6e51f9aec8c4b7b603296dad2d5cb11790710de12fd7bf88fca0f8220e51f18e696aba8764e26ff960fa0cc1aef50055ee1e1e72c207 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:4.28.3": - version: 4.28.3 - resolution: "@typescript-eslint/typescript-estree@npm:4.28.3" +"@typescript-eslint/typescript-estree@npm:4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/typescript-estree@npm:4.32.0" dependencies: - "@typescript-eslint/types": 4.28.3 - "@typescript-eslint/visitor-keys": 4.28.3 + "@typescript-eslint/types": 4.32.0 + "@typescript-eslint/visitor-keys": 4.32.0 debug: ^4.3.1 globby: ^11.0.3 is-glob: ^4.0.1 @@ -4078,17 +4079,17 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 674cdd5e3c24306f906d6479ede454d5f5a2100e22cd5aa08f9bc27953cdb4930384ad3b4434937e31e8e92e6b3cc867f8d56c3b65e2254f7042662deafef583 + checksum: 4525789cd27f4af333c9e2c221511b4ce8c50bd520b5c73958885b718f38d5c7349678286db8dc26de2ca61463651925d37e833456497e493c357acc3ea24b03 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:4.28.3": - version: 4.28.3 - resolution: "@typescript-eslint/visitor-keys@npm:4.28.3" +"@typescript-eslint/visitor-keys@npm:4.32.0": + version: 4.32.0 + resolution: "@typescript-eslint/visitor-keys@npm:4.32.0" dependencies: - "@typescript-eslint/types": 4.28.3 + "@typescript-eslint/types": 4.32.0 eslint-visitor-keys: ^2.0.0 - checksum: b570740ae16901df85febde13b5e34b95dfa13fc51b035875bc087fef356f2db1284ff045812ace06b0e8f821171a7ddaf7606cee672d35df486989e79a0c7df + checksum: 233bf479b6373bae2e61976ed1f2d0fb5c365203984e1233024a2677da0958fb3b19753b67047e8c9a9f4cec7603d1027d73b1302fef0d49c5e92be012d3d92e languageName: node linkType: hard @@ -4933,13 +4934,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -5571,18 +5565,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.5, browserslist@npm:^4.16.6": - version: 4.16.6 - resolution: "browserslist@npm:4.16.6" +"browserslist@npm:^4.14.5, browserslist@npm:^4.16.6, browserslist@npm:^4.17.1": + version: 4.17.1 + resolution: "browserslist@npm:4.17.1" dependencies: - caniuse-lite: ^1.0.30001219 - colorette: ^1.2.2 - electron-to-chromium: ^1.3.723 + caniuse-lite: ^1.0.30001259 + electron-to-chromium: ^1.3.846 escalade: ^3.1.1 - node-releases: ^1.1.71 + nanocolors: ^0.1.5 + node-releases: ^1.1.76 bin: browserslist: cli.js - checksum: 3dffc86892d2dcfcfc66b52519b7e5698ae070b4fc92ab047e760efc4cae0474e9e70bbe10d769c8d3491b655ef3a2a885b88e7196c83cc5dc0a46dfdba8b70c + checksum: 7935fad6ad1ec6986e93854ea11c344b4fb0a8665a1501cf0a91cc832fd6a280ea147d2684b05520b70785c9ec88e746d6f5b0f8f0b70fc501b1684af5fc56dc languageName: node linkType: hard @@ -5825,10 +5819,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001219": - version: 1.0.30001243 - resolution: "caniuse-lite@npm:1.0.30001243" - checksum: 912cf885036847a8b6972cd65170d9f355a08b08cfd6b06bcaa8de965755ee5b35a4bbe4eb73844aac313a42e2038ae0971a5b4c9b94d631db2f073c906ce1d6 +"caniuse-lite@npm:^1.0.30001259": + version: 1.0.30001261 + resolution: "caniuse-lite@npm:1.0.30001261" + checksum: d894662312ecbdd772f0a258c4a45cac93605247b127b25649052353e0b981abfd0b445f469650943b612adc236fd510ae61c1293f3e77c68af7411d1b66574a languageName: node linkType: hard @@ -5870,19 +5864,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^1.0.0": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: ^2.2.1 - escape-string-regexp: ^1.0.2 - has-ansi: ^2.0.0 - strip-ansi: ^3.0.0 - supports-color: ^2.0.0 - checksum: 9d2ea6b98fc2b7878829eec223abcf404622db6c48396a9b9257f6d0ead2acf18231ae368d6a664a83f272b0679158da12e97b5229f794939e555cc574478acd - languageName: node - linkType: hard - "chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -6496,13 +6477,13 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.14.0, core-js-compat@npm:^3.15.0": - version: 3.15.2 - resolution: "core-js-compat@npm:3.15.2" +"core-js-compat@npm:^3.14.0, core-js-compat@npm:^3.16.0": + version: 3.18.1 + resolution: "core-js-compat@npm:3.18.1" dependencies: - browserslist: ^4.16.6 + browserslist: ^4.17.1 semver: 7.0.0 - checksum: ca68b51b4a75241dae44ae75bf01476c0c8505c1c6fe69dc3b3ae3ee0e8d39fadf415df21a2c46ea018c250aa76ba1a664e8cb2b6657a801eed1a2ac738d7968 + checksum: d7afbd879fa1fd6bd20778308bfafc8b4993b13a4c24cb0793baad4b027d13f59fef78b867137b0a570df708ea2d0766a067d8c5b3dc4e5e4747d70dc91e1c98 languageName: node linkType: hard @@ -6724,13 +6705,6 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 - languageName: node - linkType: hard - "deep-clone-simple@npm:^1.1.1": version: 1.1.1 resolution: "deep-clone-simple@npm:1.1.1" @@ -7079,10 +7053,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.3.723": - version: 1.3.769 - resolution: "electron-to-chromium@npm:1.3.769" - checksum: 484767fa6ab1c9a0a2ed39037027ab9f712439d51f4cfb7b314e708e2b3ec9e93b47c83af4f84fe7ce1e24f9e961dbe923ebd65b6ab7638c59865405383421ff +"electron-to-chromium@npm:^1.3.846": + version: 1.3.854 + resolution: "electron-to-chromium@npm:1.3.854" + checksum: c9070a49e6ee26d6088fe89bff10b2e0c31adb22f21f8a854ce7399346fbcdba36bd8de84d4adb5514facc43745e7c8d5992aae6d172263950e4736c3965f938 languageName: node linkType: hard @@ -7315,14 +7289,14 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.0, escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.0, escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 languageName: node linkType: hard -"eslint-config-airbnb-base@npm:^14.2.0, eslint-config-airbnb-base@npm:^14.2.1": +"eslint-config-airbnb-base@npm:^14.2.1": version: 14.2.1 resolution: "eslint-config-airbnb-base@npm:14.2.1" dependencies: @@ -7336,31 +7310,13 @@ __metadata: languageName: node linkType: hard -"eslint-config-airbnb-typescript@npm:^12.3.1": - version: 12.3.1 - resolution: "eslint-config-airbnb-typescript@npm:12.3.1" - dependencies: - "@typescript-eslint/parser": ^4.4.1 - eslint-config-airbnb: ^18.2.0 - eslint-config-airbnb-base: ^14.2.0 - checksum: 2aac9d736c0bcb778a8b6894aa7e061f2454895e0e4cc7bc1247074c4c54d777212f9523539b57b49c2e09abe64f0b95d8571196f04e471db9d764f88aff697a - languageName: node - linkType: hard - -"eslint-config-airbnb@npm:^18.2.0": - version: 18.2.1 - resolution: "eslint-config-airbnb@npm:18.2.1" - dependencies: - eslint-config-airbnb-base: ^14.2.1 - object.assign: ^4.1.2 - object.entries: ^1.1.2 +"eslint-config-airbnb-typescript@npm:^14.0.0": + version: 14.0.0 + resolution: "eslint-config-airbnb-typescript@npm:14.0.0" peerDependencies: - eslint: ^5.16.0 || ^6.8.0 || ^7.2.0 - eslint-plugin-import: ^2.22.1 - eslint-plugin-jsx-a11y: ^6.4.1 - eslint-plugin-react: ^7.21.5 - eslint-plugin-react-hooks: ^4 || ^3 || ^2.3.0 || ^1.7.0 - checksum: ea11cd0006912f7086fb278e03180da4bc2378cf4e93b1dd970775d8e9b50fd11a64209bdc0ed17654d29abe4ccfa19baa4d1e1e5bd3eb660fcf4798ba2810d2 + "@typescript-eslint/eslint-plugin": ^4.29.3 + "@typescript-eslint/parser": ^4.29.3 + checksum: 0544e55cd651e0217a09faa257a86689fdaa056bb6e0217ea38345c3c083ddeb5eb59a23b745884637d8e7c338acaa4459b08c151226c65c61b308c58e8a1d3a languageName: node linkType: hard @@ -7375,13 +7331,13 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.4": - version: 0.3.4 - resolution: "eslint-import-resolver-node@npm:0.3.4" +"eslint-import-resolver-node@npm:^0.3.6": + version: 0.3.6 + resolution: "eslint-import-resolver-node@npm:0.3.6" dependencies: - debug: ^2.6.9 - resolve: ^1.13.1 - checksum: a0db55ec26c5bb385c8681af6b8d6dee16768d5f27dff72c3113407d0f028f28e56dcb1cc3a4689c79396a5f6a9c24bd0cac9a2c9c588c7d7357d24a42bec876 + debug: ^3.2.7 + resolve: ^1.20.0 + checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 languageName: node linkType: hard @@ -7407,13 +7363,13 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.6.1": - version: 2.6.1 - resolution: "eslint-module-utils@npm:2.6.1" +"eslint-module-utils@npm:^2.6.2": + version: 2.6.2 + resolution: "eslint-module-utils@npm:2.6.2" dependencies: debug: ^3.2.7 pkg-dir: ^2.0.0 - checksum: 3cc43a36a0075d300db6a3946203ec92249b6da1539694ef205a43b4ccfbc2eaf4961475d4b89c24b12c187d6bfd882c7c7d0b2ce02adb40c2dedb7fd022a7e2 + checksum: 814591f494e4f4b04c1af0fde2a679e7a7664a5feb51175e02ba96d671e34ec60cb1835d174508eb81c07a6c92c243f84c6349f4169b3bec1a8dbdd36a0934f3 languageName: node linkType: hard @@ -7429,28 +7385,28 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.23.4": - version: 2.23.4 - resolution: "eslint-plugin-import@npm:2.23.4" +"eslint-plugin-import@npm:^2.24.2": + version: 2.24.2 + resolution: "eslint-plugin-import@npm:2.24.2" dependencies: array-includes: ^3.1.3 array.prototype.flat: ^1.2.4 debug: ^2.6.9 doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.4 - eslint-module-utils: ^2.6.1 + eslint-import-resolver-node: ^0.3.6 + eslint-module-utils: ^2.6.2 find-up: ^2.0.0 has: ^1.0.3 - is-core-module: ^2.4.0 + is-core-module: ^2.6.0 minimatch: ^3.0.4 - object.values: ^1.1.3 + object.values: ^1.1.4 pkg-up: ^2.0.0 read-pkg-up: ^3.0.0 resolve: ^1.20.0 - tsconfig-paths: ^3.9.0 + tsconfig-paths: ^3.11.0 peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 - checksum: 8c64bb96fa35607de3da1ddf5d127a5913aebde5677bc276c55fecb3e539a7287569dc697af4f5c523bd2b08bff8f5b525448df5aa7d6256c86436b615be5abc + checksum: df570aec83ffa126fd80596d9fb1b6799d3cde025ceeb159eb28383541ebbb855468c9a2dbc670ab9e91dd0a8f8a82e52fd909a7c61e9ffa585bcce84ae1aec4 languageName: node linkType: hard @@ -7467,39 +7423,45 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-prettier@npm:^3.4.0": - version: 3.4.0 - resolution: "eslint-plugin-prettier@npm:3.4.0" +"eslint-plugin-prettier@npm:^4.0.0": + version: 4.0.0 + resolution: "eslint-plugin-prettier@npm:4.0.0" dependencies: prettier-linter-helpers: ^1.0.0 peerDependencies: - eslint: ">=5.0.0" - prettier: ">=1.13.0" + eslint: ">=7.28.0" + prettier: ">=2.0.0" peerDependenciesMeta: eslint-config-prettier: optional: true - checksum: 30a07e8d12637d2988e371f6a20ff4c86fd7fdc3596d1d18d62c0367804f38e06a65052d0281234aeb2552e4d1908dcb2de20543413e038251a2717a46400a9d + checksum: 03d69177a3c21fa2229c7e427ce604429f0b20ab7f411e2e824912f572a207c7f5a41fd1f0a95b9b8afe121e291c1b1f1dc1d44c7aad4b0837487f9c19f5210d languageName: node linkType: hard -"eslint-plugin-unused-imports@npm:^1.1.2": - version: 1.1.2 - resolution: "eslint-plugin-unused-imports@npm:1.1.2" +"eslint-plugin-unused-imports@npm:^1.1.5": + version: 1.1.5 + resolution: "eslint-plugin-unused-imports@npm:1.1.5" dependencies: eslint-rule-composer: ^0.3.0 - checksum: 7e899ec79e043f9b2a3d634b405f787c65353c25c37f2dd8561e7919518c5450c34a2ff7ff43bb2ecd296a79f5bc9c7ec0010dc026ea6ba983b8a9e538f68fdb + peerDependencies: + "@typescript-eslint/eslint-plugin": ^4.14.2 + eslint: ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + "@typescript-eslint/eslint-plugin": + optional: true + checksum: fd1ef93fd414240594ea2f78cd7334523c244af12a610442c6dbf78b0058915c363ce78032730962f510fdd2792ded0607bc13adea9a724d1c5cec736704c99d languageName: node linkType: hard -"eslint-plugin-wc@npm:^1.3.0": - version: 1.3.0 - resolution: "eslint-plugin-wc@npm:1.3.0" +"eslint-plugin-wc@npm:^1.3.2": + version: 1.3.2 + resolution: "eslint-plugin-wc@npm:1.3.2" dependencies: + is-valid-element-name: ^1.0.0 js-levenshtein-esm: ^1.2.0 - validate-element-name: ^2.1.1 peerDependencies: - eslint: ">= 5" - checksum: 1089d24f10fb16c0573d18d9c6aee2edd75069faea1b0daf51c8fb18b141fb5557586b4243d18b7d991668bead6e4cd7e182526d775a40603a8d2380df93e992 + eslint: ">=5" + checksum: 0661d8b61abc3e29396de3b78cbaa71517dca769f6ad19d43db3055659667b941b2a4e7757865c71924ea5febb2fde7ee4ff6d0f7ba41587ff5136f60f661503 languageName: node linkType: hard @@ -7554,12 +7516,12 @@ __metadata: languageName: node linkType: hard -"eslint@npm:>=0.16.0, eslint@npm:^7.30.0": - version: 7.30.0 - resolution: "eslint@npm:7.30.0" +"eslint@npm:>=0.16.0, eslint@npm:^7.32.0": + version: 7.32.0 + resolution: "eslint@npm:7.32.0" dependencies: "@babel/code-frame": 7.12.11 - "@eslint/eslintrc": ^0.4.2 + "@eslint/eslintrc": ^0.4.3 "@humanwhocodes/config-array": ^0.5.0 ajv: ^6.10.0 chalk: ^4.0.0 @@ -7600,7 +7562,7 @@ __metadata: v8-compile-cache: ^2.0.3 bin: eslint: bin/eslint.js - checksum: 872f90844b164dd61ec1bb949d2e33e7fbd189e0652fabe2cbbd0bdce1e4cd7ed08e72fa213795a453ae39fe24460771800608e765febb9e778deb28b9db3cc1 + checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37 languageName: node linkType: hard @@ -8861,15 +8823,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: ^2.0.0 - checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec - languageName: node - linkType: hard - "has-bigints@npm:^1.0.1": version: 1.0.1 resolution: "has-bigints@npm:1.0.1" @@ -8973,18 +8926,18 @@ fsevents@^1.2.7: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": ^7.14.6 + "@babel/core": ^7.15.5 "@babel/plugin-external-helpers": ^7.14.5 "@babel/plugin-proposal-class-properties": ^7.14.5 - "@babel/plugin-proposal-decorators": ^7.14.5 + "@babel/plugin-proposal-decorators": ^7.15.4 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.14.5 - "@babel/plugin-proposal-object-rest-spread": ^7.14.7 + "@babel/plugin-proposal-object-rest-spread": ^7.15.6 "@babel/plugin-proposal-optional-chaining": ^7.14.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/preset-env": ^7.14.7 - "@babel/preset-typescript": ^7.14.5 + "@babel/preset-env": ^7.15.6 + "@babel/preset-typescript": ^7.15.0 "@braintree/sanitize-url": ^5.0.2 "@codemirror/commands": ^0.19.2 "@codemirror/gutter": ^0.19.1 @@ -9072,8 +9025,8 @@ fsevents@^1.2.7: "@types/mocha": ^8 "@types/sortablejs": ^1 "@types/webspeechapi": ^0.0.29 - "@typescript-eslint/eslint-plugin": ^4.28.3 - "@typescript-eslint/parser": ^4.28.3 + "@typescript-eslint/eslint-plugin": ^4.32.0 + "@typescript-eslint/parser": ^4.32.0 "@vaadin/vaadin-combo-box": ^21.0.2 "@vaadin/vaadin-date-picker": ^21.0.2 "@vibrant/color": ^3.2.1-alpha.1 @@ -9093,16 +9046,17 @@ fsevents@^1.2.7: deep-clone-simple: ^1.1.1 deep-freeze: ^0.0.1 del: ^4.0.0 - eslint: ^7.30.0 - eslint-config-airbnb-typescript: ^12.3.1 + eslint: ^7.32.0 + eslint-config-airbnb-base: ^14.2.1 + eslint-config-airbnb-typescript: ^14.0.0 eslint-config-prettier: ^8.3.0 eslint-import-resolver-webpack: ^0.13.1 eslint-plugin-disable: ^2.0.1 - eslint-plugin-import: ^2.23.4 + eslint-plugin-import: ^2.24.2 eslint-plugin-lit: ^1.5.1 - eslint-plugin-prettier: ^3.4.0 - eslint-plugin-unused-imports: ^1.1.2 - eslint-plugin-wc: ^1.3.0 + eslint-plugin-prettier: ^4.0.0 + eslint-plugin-unused-imports: ^1.1.5 + eslint-plugin-wc: ^1.3.2 fancy-log: ^1.3.3 fs-extra: ^7.0.1 fuse.js: ^6.0.0 @@ -9123,7 +9077,7 @@ fsevents@^1.2.7: js-yaml: ^4.1.0 leaflet: ^1.7.1 leaflet-draw: ^1.0.4 - lint-staged: ^11.0.1 + lint-staged: ^11.1.2 lit: ^2.0.0 lit-analyzer: ^1.2.1 lit-vaadin-helpers: ^0.2.1 @@ -9137,7 +9091,7 @@ fsevents@^1.2.7: node-vibrant: 3.2.1-alpha.1 object-hash: ^2.0.3 open: ^7.0.4 - prettier: ^2.3.2 + prettier: ^2.4.1 proxy-polyfill: ^0.3.2 punycode: ^2.1.1 qrcode: ^1.4.4 @@ -9159,7 +9113,7 @@ fsevents@^1.2.7: tinykeys: ^1.1.3 ts-lit-plugin: ^1.2.1 tsparticles: ^1.34.0 - typescript: ^4.3.5 + typescript: ^4.4.3 unfetch: ^4.1.0 vinyl-buffer: ^1.0.1 vinyl-source-stream: ^2.0.0 @@ -9456,7 +9410,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"ignore@npm:^5.1.4": +"ignore@npm:^5.1.4, ignore@npm:^5.1.8": version: 5.1.8 resolution: "ignore@npm:5.1.8" checksum: 967abadb61e2cb0e5c5e8c4e1686ab926f91bc1a4680d994b91947d3c65d04c3ae126dcdf67f08e0feeb8ff8407d453e641aeeddcc47a3a3cca359f283cf6121 @@ -9766,12 +9720,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-core-module@npm:^2.2.0, is-core-module@npm:^2.4.0": - version: 2.4.0 - resolution: "is-core-module@npm:2.4.0" +"is-core-module@npm:^2.2.0, is-core-module@npm:^2.4.0, is-core-module@npm:^2.6.0": + version: 2.7.0 + resolution: "is-core-module@npm:2.7.0" dependencies: has: ^1.0.3 - checksum: c498902d4c4d0e8eba3a2e8293ccd442158cfe49a71d7cfad136ccf9902b6a41de34ddaa86cdc95c8b7c22f872e59572d8a5d994cbec04c8ecf27ffe75137119 + checksum: 8ec6dc714438ef9dc4dae10c94d21bd5aa67244da7e85bd9e42f0fd298514181214f6bebe358a486477c1242458b170ad7a8c936be0be15d465862fa61d3d1c7 languageName: node linkType: hard @@ -10149,6 +10103,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-valid-element-name@npm:^1.0.0": + version: 1.0.0 + resolution: "is-valid-element-name@npm:1.0.0" + dependencies: + is-potential-custom-element-name: ^1.0.0 + checksum: 915099b633770948b5967e6896f4475252634a2cc455ae1c158f48f6c11f03680e0bdaf0a547912ce6d3dea2cfa28a0e8013a98bb5e41445fc6ef0616824bea7 + languageName: node + linkType: hard + "is-valid-glob@npm:^1.0.0": version: 1.0.0 resolution: "is-valid-glob@npm:1.0.0" @@ -10644,16 +10607,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lint-staged@npm:^11.0.1": - version: 11.0.1 - resolution: "lint-staged@npm:11.0.1" +"lint-staged@npm:^11.1.2": + version: 11.1.2 + resolution: "lint-staged@npm:11.1.2" dependencies: chalk: ^4.1.1 cli-truncate: ^2.1.0 commander: ^7.2.0 cosmiconfig: ^7.0.0 debug: ^4.3.1 - dedent: ^0.7.0 enquirer: ^2.3.6 execa: ^5.0.0 listr2: ^3.8.2 @@ -10665,7 +10627,7 @@ fsevents@^1.2.7: stringify-object: ^3.3.0 bin: lint-staged: bin/lint-staged.js - checksum: 5046fbaa020e573ca31a4b7a3819cdd5383912c53dc55f5e68db4a525eba1fc23312f4cf0162742ef6a358464394e584b718049cd62b883b1d4f06fdfb163022 + checksum: 0050d1836dda879c58561fa4efd100f5cd14fcbf8ee3fdeab7e89ec4219c019543bb5bf2442f760557ebe4bb8b7bfc56a9c98b9384acecfe0f8553f091723e36 languageName: node linkType: hard @@ -11083,15 +11045,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"log-symbols@npm:^1.0.0": - version: 1.0.2 - resolution: "log-symbols@npm:1.0.2" - dependencies: - chalk: ^1.0.0 - checksum: 5214ade9381db5d40528c171fdfd459b75cad7040eb6a347294ae47fa80cfebba4adbc3aa73a1c9da744cbfa240dd93b38f80df8615717affeea6c4bb6b8dfe7 - languageName: node - linkType: hard - "log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" @@ -11290,7 +11243,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"meow@npm:^3.3.0, meow@npm:^3.7.0": +"meow@npm:^3.3.0": version: 3.7.0 resolution: "meow@npm:3.7.0" dependencies: @@ -11701,6 +11654,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"nanocolors@npm:^0.1.5": + version: 0.1.12 + resolution: "nanocolors@npm:0.1.12" + checksum: 2ce58f57006ddd1d2680d05fe21f54d858db8ba81bd13381598ddc546f7637e33c4407da2ea7da40ea1c96794250e7c14a4d00358b48eeae4d917d6a92bafe4c + languageName: node + linkType: hard + "nanoid@npm:3.1.20, nanoid@npm:^3.0.1": version: 3.1.20 resolution: "nanoid@npm:3.1.20" @@ -11846,10 +11806,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"node-releases@npm:^1.1.71": - version: 1.1.71 - resolution: "node-releases@npm:1.1.71" - checksum: a6ab18069e43d70b811fa7f12b397619f2003f78ac2ed0affa30876880ca3036a191d33679d93baac166afa12a7b1b1716e13f3c82c0f0fa09e2c83db3f91faf +"node-releases@npm:^1.1.76": + version: 1.1.76 + resolution: "node-releases@npm:1.1.76" + checksum: 10174cb880fffbb2896954599a2551da66127dd3c65703c827536fe9a4b4431545a9e3378c2006fb5ba59d0f0764ceff87c9f7eb0e84fabf7958411fccd0edd1 languageName: node linkType: hard @@ -12055,14 +12015,13 @@ fsevents@^1.2.7: linkType: hard "object.entries@npm:^1.1.2": - version: 1.1.3 - resolution: "object.entries@npm:1.1.3" + version: 1.1.4 + resolution: "object.entries@npm:1.1.4" dependencies: - call-bind: ^1.0.0 + call-bind: ^1.0.2 define-properties: ^1.1.3 - es-abstract: ^1.18.0-next.1 - has: ^1.0.3 - checksum: 2622ac94f801e6cfddfa2e26719dd200bbc2cb891f00664f0256ebf1ca6626f00882352207ba2d2706c36bbd99d8cfbc84a01b937092239c23a60e1a4ee1d497 + es-abstract: ^1.18.2 + checksum: 1ddd2e28f5ecfe2369fe198439ec0457529f3eec85c7f43870be8de3ec3d98024b014ddb4a769ca48925e47ed76c69a51d8bf2c9886ed43174e3a1d33c2dbe38 languageName: node linkType: hard @@ -12095,7 +12054,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.values@npm:^1.1.3": +"object.values@npm:^1.1.4": version: 1.1.4 resolution: "object.values@npm:1.1.4" dependencies: @@ -12834,12 +12793,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"prettier@npm:^2.3.2": - version: 2.3.2 - resolution: "prettier@npm:2.3.2" +"prettier@npm:^2.4.1": + version: 2.4.1 + resolution: "prettier@npm:2.4.1" bin: prettier: bin-prettier.js - checksum: 17ce5784ac67621c292df58e2da60b2ee150c2d6aebea22a6ad9e52fcd6a5e66c349d0a8436ea3bd8ff9d778920a5f68000d7625b74f43558718a49755aa5259 + checksum: cc6830588b401b0d742862fe9c46bc9118204fb307c3abe0e49e95b35ed23629573807ffdf9cdd65289c252a0bb51fc0171437f6626ee36378dea80f0ee80b91 languageName: node linkType: hard @@ -13548,7 +13507,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0, resolve@^1.9.0": +"resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0, resolve@^1.9.0": version: 1.20.0 resolution: "resolve@npm:1.20.0" dependencies: @@ -13558,7 +13517,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.11.0#~builtin, resolve@patch:resolve@^1.13.1#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.4.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.11.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.4.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": version: 1.20.0 resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin::version=1.20.0&hash=00b1ff" dependencies: @@ -14689,13 +14648,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 602538c5812b9006404370b5a4b885d3e2a1f6567d314f8b4a41974ffe7d08e525bf92ae0f9c7030e3b4c78e4e34ace55d6a67a74f1571bc205959f5972f88f0 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -15116,15 +15068,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tsconfig-paths@npm:^3.9.0": - version: 3.9.0 - resolution: "tsconfig-paths@npm:3.9.0" +"tsconfig-paths@npm:^3.11.0": + version: 3.11.0 + resolution: "tsconfig-paths@npm:3.11.0" dependencies: "@types/json5": ^0.0.29 json5: ^1.0.1 minimist: ^1.2.0 strip-bom: ^3.0.0 - checksum: 243b3b098c76a4ca90ea0431683f3755a4ff175c6123bcba5f7b4bd80fe2ef8fa9bdc8f4d525148a1e71ade7f3e037e7c0313ae177fd12398ab68f05c2c7f25d + checksum: e14aaa6883f316d611db41cbb0fc8779b59c66b31d1e045565ad4540c77ccd3d2bb66f7c261b74ff535d3cc6b4a1ce21dc84774bf2a2a603ed6b0fb96f7e0cc7 languageName: node linkType: hard @@ -15236,13 +15188,13 @@ typescript@^3.8.3: languageName: node linkType: hard -typescript@^4.3.5: - version: 4.3.5 - resolution: "typescript@npm:4.3.5" +typescript@^4.4.3: + version: 4.4.3 + resolution: "typescript@npm:4.4.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: bab033b5e2b0790dd35b77fd005df976ef80b8d84fd2c6e63cc31808151875beae9216e5a315fe7068e8499905c3c354248fe83272cdfc13b7705635f0c66c97 + checksum: 05823f21796d450531a7e4ab299715d38fd9ded0e4ce7400876053f4b5166ca3dde7a68cecfe72d9086039f03c0b6edba36516fb10ed83c5837d9600532ea4c2 languageName: node linkType: hard @@ -15256,13 +15208,13 @@ typescript@^4.3.5: languageName: node linkType: hard -"typescript@patch:typescript@^4.3.5#~builtin": - version: 4.3.5 - resolution: "typescript@patch:typescript@npm%3A4.3.5#~builtin::version=4.3.5&hash=32657b" +"typescript@patch:typescript@^4.4.3#~builtin": + version: 4.4.3 + resolution: "typescript@patch:typescript@npm%3A4.4.3#~builtin::version=4.4.3&hash=32657b" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 4e2edec3c9b7b9a22ad9cbf9371339d9e13bfe44731f0e2d6a5287f991c3b0e3e0ac0c0ebbf9bf6fc2051e30559c789bfc9cf572cd6b836a0222ae141fac1dba + checksum: 28ab98313afab46788ff41014fdb5932430ada6e03cf9e92ac47f406526a2cac1ae2894834e7da61e46b7429318e9c47f45ba8de323332f0cb9af99b72ebae74 languageName: node linkType: hard @@ -15558,19 +15510,6 @@ typescript@^4.3.5: languageName: node linkType: hard -"validate-element-name@npm:^2.1.1": - version: 2.1.1 - resolution: "validate-element-name@npm:2.1.1" - dependencies: - is-potential-custom-element-name: ^1.0.0 - log-symbols: ^1.0.0 - meow: ^3.7.0 - bin: - validate-element-name: cli.js - checksum: c84818e4e5213b555f1dd974d19174ed73f5ae8ae03bca1e3f413b6b1e02798d47e1995e5a24ebb8e430ed9d2bcdf4ee2c768f3a514fa8cb907bebb06f8b047f - languageName: node - linkType: hard - "validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" From 41a7b420373a5ccb0176926a13cb42843626650b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 30 Sep 2021 12:41:35 +0200 Subject: [PATCH 67/67] Bumped version to 20210930.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 69773e27b4..6a5bbd3c16 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210922.0", + version="20210930.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/frontend", author="The Home Assistant Authors",