From 9ac3f745b3519687301eb4ee49e07b9ea6d73922 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 6 Jul 2023 09:42:15 +0200 Subject: [PATCH 001/102] Show "Configured" header on integrations dashboard for clarity (#17115) --- .../integrations/ha-config-integrations-dashboard.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/panels/config/integrations/ha-config-integrations-dashboard.ts b/src/panels/config/integrations/ha-config-integrations-dashboard.ts index 969c44bbbf..d670e5894c 100644 --- a/src/panels/config/integrations/ha-config-integrations-dashboard.ts +++ b/src/panels/config/integrations/ha-config-integrations-dashboard.ts @@ -429,6 +429,13 @@ class HaConfigIntegrationsDashboard extends SubscribeMixin(LitElement) { )} ` : ""} + ${configEntriesInProgress.length || + this._showDisabled || + this._showIgnored + ? html`

+ ${this.hass.localize("ui.panel.config.integrations.configured")} +

` + : ""}
${integrations.length ? integrations.map( From 3d2734eb888034c50271faa93c48e3437436747e Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 6 Jul 2023 00:46:42 -0700 Subject: [PATCH 002/102] Fix sensor card to not crash when it finds no state history (#17181) --- src/panels/lovelace/common/graph/coordinates.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/panels/lovelace/common/graph/coordinates.ts b/src/panels/lovelace/common/graph/coordinates.ts index b63c61af05..56f5251965 100644 --- a/src/panels/lovelace/common/graph/coordinates.ts +++ b/src/panels/lovelace/common/graph/coordinates.ts @@ -119,6 +119,9 @@ export const coordinatesMinimalResponseCompressedState = ( detail: number, limits?: { min?: number; max?: number } ): number[][] | undefined => { + if (!history) { + return undefined; + } const numericHistory: NumericEntityHistoryState[] = history.map((item) => ({ state: Number(item.s), // With minimal response and compressed state, we don't have last_changed, From 155e9d9e95a85a3bb555f238fadd2c00ca7d3d69 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Thu, 6 Jul 2023 03:55:31 -0400 Subject: [PATCH 003/102] Default the ZHA channel change dialog's preferred channel to `auto` (#17178) --- .../integration-panels/zha/dialog-zha-change-channel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/integrations/integration-panels/zha/dialog-zha-change-channel.ts b/src/panels/config/integrations/integration-panels/zha/dialog-zha-change-channel.ts index ab3f5b77d4..13e4bc0d46 100644 --- a/src/panels/config/integrations/integration-panels/zha/dialog-zha-change-channel.ts +++ b/src/panels/config/integrations/integration-panels/zha/dialog-zha-change-channel.ts @@ -45,7 +45,7 @@ class DialogZHAChangeChannel extends LitElement implements HassDialog { public async showDialog(params: ZHAChangeChannelDialogParams): Promise { this._params = params; - this._newChannel = params.currentChannel; + this._newChannel = "auto"; } public closeDialog(): void { From e1be4751a1cc3985611ac93330ef7ebb2d92752e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 16:07:56 -0400 Subject: [PATCH 004/102] Update typescript-eslint monorepo to v5.61.0 (#17195) --- package.json | 4 +- yarn.lock | 109 ++++++++++++++++++++++++--------------------------- 2 files changed, 53 insertions(+), 60 deletions(-) diff --git a/package.json b/package.json index 6790976198..1009f92b03 100644 --- a/package.json +++ b/package.json @@ -184,8 +184,8 @@ "@types/sortablejs": "1.15.1", "@types/tar": "6.1.5", "@types/webspeechapi": "0.0.29", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "@web/dev-server": "0.1.38", "@web/dev-server-rollup": "0.4.1", "babel-loader": "9.1.2", diff --git a/yarn.lock b/yarn.lock index 955781a689..7d184fb0cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4695,16 +4695,16 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.60.1" +"@typescript-eslint/eslint-plugin@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.61.0" dependencies: "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.60.1 - "@typescript-eslint/type-utils": 5.60.1 - "@typescript-eslint/utils": 5.60.1 + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/type-utils": 5.61.0 + "@typescript-eslint/utils": 5.61.0 debug: ^4.3.4 - grapheme-splitter: ^1.0.4 + graphemer: ^1.4.0 ignore: ^5.2.0 natural-compare-lite: ^1.4.0 semver: ^7.3.7 @@ -4715,43 +4715,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 6ea3fdc64b216ee709318bfce1573cd8d90836150f0075aaa8755c347541af9ec026043e538a3264d28d1b32ff49b1fd7c6163826b8513f19f0957fefccf7752 + checksum: d9e891fb43ccb75322fc40d58d02479f98bd3c962db71075438868b13f579643d714a24b5477a827be7ca2e7e9f6058c406241b6696a6395c6fcbd6de76e015c languageName: node linkType: hard -"@typescript-eslint/parser@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/parser@npm:5.60.1" +"@typescript-eslint/parser@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/parser@npm:5.61.0" dependencies: - "@typescript-eslint/scope-manager": 5.60.1 - "@typescript-eslint/types": 5.60.1 - "@typescript-eslint/typescript-estree": 5.60.1 + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 08f1552ab0da178524a8de3654d2fb7c8ecb9efdad8e771c9cbf4af555c42e77d17b2c182d139a531cc76c3cabd091d1d25024c2c215cb809dca8b147c8a493c + checksum: 2422bca03ecc6830700aaa739ec46b8e9ab6c0a47a67f140dc6b62a42a8b98997e73bce52c6a010b8a9b461211c46ba865d5b7f680a7823cf5c245d3b61f7fd5 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/scope-manager@npm:5.60.1" +"@typescript-eslint/scope-manager@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/scope-manager@npm:5.61.0" dependencies: - "@typescript-eslint/types": 5.60.1 - "@typescript-eslint/visitor-keys": 5.60.1 - checksum: 32c0786123f12fbb861aba3527471134a2e9978c7f712e0d7650080651870903482aed72a55f81deba9493118c1ca3c57edaaaa75d7acd9892818e3e9cc341ef + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 + checksum: 6dfbb42c4b7d796ae3c395398bdfd2e5a4ae8aaf1448381278ecc39a1d1045af2cb452da5a00519d265bc1a5997523de22d5021acb4dbe1648502fe61512d3c6 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/type-utils@npm:5.60.1" +"@typescript-eslint/type-utils@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/type-utils@npm:5.61.0" dependencies: - "@typescript-eslint/typescript-estree": 5.60.1 - "@typescript-eslint/utils": 5.60.1 + "@typescript-eslint/typescript-estree": 5.61.0 + "@typescript-eslint/utils": 5.61.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -4759,23 +4759,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: f8d5f87b5441d5c671f69631efd103f5f45e0cb7dbe0131a5b4234a5208ac845041219e8baaa3adc341e82a602165dd6fabf4fd06964d0109d0875425c8ac918 + checksum: f0203fd48c6218f004dd73a9a71ba4cf97f015d0f13a7b3c821a3ba7ec814839bae270a1db589184ca7091fe54815a3171d1993e8a25200bf33e131bd6e855d4 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/types@npm:5.60.1" - checksum: 766b6c857493b72a8f515e6a8e409476a317b7a7f0401fbcdf18f417839fca004dcaf06f58eb5ba00777e3ca9c68cd2f56fda79f3a8eb8a418095b5b1f625712 +"@typescript-eslint/types@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/types@npm:5.61.0" + checksum: d311ca2141f6bcb5f0f8f97ddbc218c9911e0735aaa30f0f2e64d518fb33568410754e1b04bf157175f8783504f8ec62a7ab53a66a18507f43edb1e21fe69e90 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.60.1" +"@typescript-eslint/typescript-estree@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.61.0" dependencies: - "@typescript-eslint/types": 5.60.1 - "@typescript-eslint/visitor-keys": 5.60.1 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -4784,35 +4784,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5bb9d08c3cbc303fc64647878cae37283c4cfa9e3ed00da02ee25dc2e46798a1ad6964c9f04086f0134716671357e6569a65ea0ae75f0f3ff94ae67666385c6f + checksum: efe25a1b2774939c02cb9b388cf72efa672811f1c39a87ddd617937f63c2320551ce459ba69c6d022e33322594d40b9f2d2c6bc9937387718adc40dc5e57ea8e languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/utils@npm:5.60.1" +"@typescript-eslint/utils@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/utils@npm:5.61.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.60.1 - "@typescript-eslint/types": 5.60.1 - "@typescript-eslint/typescript-estree": 5.60.1 + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0 eslint-scope: ^5.1.1 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 00c1adaa09d5d5be947e98962a78c21ed08c3ac46dd5ddd7b78f6102537d50afd4578a42a3e09a24dd51f5bc493f0b968627b4423647540164b2d2380afa9246 + checksum: 24efc1964e6c92db96fe0d9a390550e4f27e8f353e51a9b46bda03e6692ea5d40f398d539235a4ff0894e9e45dfcfb51df953ade2ae9d17a1421449625ce6f5a languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.60.1": - version: 5.60.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.60.1" +"@typescript-eslint/visitor-keys@npm:5.61.0": + version: 5.61.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.61.0" dependencies: - "@typescript-eslint/types": 5.60.1 + "@typescript-eslint/types": 5.61.0 eslint-visitor-keys: ^3.3.0 - checksum: 137f6a6f8efb398969087147b59f99f7d0deed044d89d7efce3631bb90bc32e3a13a5cee6a65e1c9830862c5c4402ac1a9b2c9e31fe46d1716602af2813bffae + checksum: a8d589f61ddfc380787218da4d347e8f9aef0f82f4a93f1daee46786bda889a90961c7ec1b470db5e3261438a728fdfd956f5bda6ee2de22c4be2d2152d6e270 languageName: node linkType: hard @@ -9354,13 +9354,6 @@ __metadata: languageName: node linkType: hard -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 - languageName: node - linkType: hard - "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -9714,8 +9707,8 @@ __metadata: "@types/sortablejs": 1.15.1 "@types/tar": 6.1.5 "@types/webspeechapi": 0.0.29 - "@typescript-eslint/eslint-plugin": 5.60.1 - "@typescript-eslint/parser": 5.60.1 + "@typescript-eslint/eslint-plugin": 5.61.0 + "@typescript-eslint/parser": 5.61.0 "@vaadin/combo-box": 24.1.2 "@vaadin/vaadin-themable-mixin": 24.1.2 "@vibrant/color": 3.2.1-alpha.1 From 0b31d9b94396813ce50ff191e0ad1300a8681be7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 19:51:37 -0400 Subject: [PATCH 005/102] Update dependency @octokit/plugin-retry to v5.0.5 (#17196) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1009f92b03..3ae3a81725 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,7 @@ "@babel/preset-typescript": "7.22.5", "@koa/cors": "4.0.0", "@octokit/auth-oauth-device": "5.0.2", - "@octokit/plugin-retry": "5.0.4", + "@octokit/plugin-retry": "5.0.5", "@octokit/rest": "19.0.13", "@open-wc/dev-server-hmr": "0.1.4", "@rollup/plugin-babel": "6.0.3", diff --git a/yarn.lock b/yarn.lock index 7d184fb0cb..53d45385ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3345,16 +3345,16 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-retry@npm:5.0.4": - version: 5.0.4 - resolution: "@octokit/plugin-retry@npm:5.0.4" +"@octokit/plugin-retry@npm:5.0.5": + version: 5.0.5 + resolution: "@octokit/plugin-retry@npm:5.0.5" dependencies: "@octokit/request-error": ^4.0.1 "@octokit/types": ^10.0.0 bottleneck: ^2.15.3 peerDependencies: "@octokit/core": ">=3" - checksum: 0c5645613f7ff758ac126da11ba20b4d49e4067676e30808f5ee3ee471adbd2ccfdea2200adfa5a4663b207964b3d60987f4c5e8682fb275bf134b33f2ef5178 + checksum: c0bf1735e8af38fddccfe69bb1b97f2c194df88cd201309992e19a6d2c82b6d8e0515ca8d81acbc5861a03a49f0178bb026a230d107a53239ed3b7de43cf6e11 languageName: node linkType: hard @@ -9670,7 +9670,7 @@ __metadata: "@mdi/js": 7.2.96 "@mdi/svg": 7.2.96 "@octokit/auth-oauth-device": 5.0.2 - "@octokit/plugin-retry": 5.0.4 + "@octokit/plugin-retry": 5.0.5 "@octokit/rest": 19.0.13 "@open-wc/dev-server-hmr": 0.1.4 "@polymer/app-layout": 3.1.0 From 6b66b7f1faec34a4661ce45587e93c9d434ea2fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 19:57:08 -0400 Subject: [PATCH 006/102] Update dependency hls.js to v1.4.8 (#17197) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3ae3a81725..ada7d02931 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "deep-freeze": "0.0.1", "fuse.js": "6.6.2", "google-timezones-json": "1.1.0", - "hls.js": "1.4.7", + "hls.js": "1.4.8", "home-assistant-js-websocket": "8.1.0", "idb-keyval": "6.2.1", "intl-messageformat": "10.5.0", diff --git a/yarn.lock b/yarn.lock index 53d45385ba..95b7400d78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9595,10 +9595,10 @@ __metadata: languageName: node linkType: hard -"hls.js@npm:1.4.7": - version: 1.4.7 - resolution: "hls.js@npm:1.4.7" - checksum: ca58d97d49048fa6f437b834b807d26f5b47750aae57a573f179155e63e39159aa304f3ef13504b42c19969984918b17557e9311a779b0b04641bd6b668b45db +"hls.js@npm:1.4.8": + version: 1.4.8 + resolution: "hls.js@npm:1.4.8" + checksum: abbd3985e5339dea9b0cd244080b914ad9fb6b092e926a41f9bc9affe3383e4ed1ccda32515ef35b78580feb13373cabfdb7d23c3fb1c7ef9cd02f62f3302353 languageName: node linkType: hard @@ -9755,7 +9755,7 @@ __metadata: gulp-merge-json: 2.1.2 gulp-rename: 2.0.0 gulp-zopfli-green: 6.0.1 - hls.js: 1.4.7 + hls.js: 1.4.8 home-assistant-js-websocket: 8.1.0 html-minifier-terser: 7.2.0 husky: 8.0.3 From 6a22503285706f9995498965080bc198b5799dae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Jul 2023 11:00:31 -0400 Subject: [PATCH 007/102] Update dependency magic-string to v0.30.1 (#17202) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index ada7d02931..a552f37428 100644 --- a/package.json +++ b/package.json @@ -220,7 +220,7 @@ "lint-staged": "13.2.3", "lit-analyzer": "2.0.0-pre.3", "lodash.template": "4.5.0", - "magic-string": "0.30.0", + "magic-string": "0.30.1", "map-stream": "0.0.7", "merge-stream": "2.0.0", "mocha": "10.2.0", diff --git a/yarn.lock b/yarn.lock index 95b7400d78..a69dd7b4dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2021,7 +2021,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.15": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -9771,7 +9771,7 @@ __metadata: lit-analyzer: 2.0.0-pre.3 lodash.template: 4.5.0 luxon: 3.3.0 - magic-string: 0.30.0 + magic-string: 0.30.1 map-stream: 0.0.7 marked: 4.3.0 memoize-one: 6.0.0 @@ -11663,12 +11663,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:0.30.0": - version: 0.30.0 - resolution: "magic-string@npm:0.30.0" +"magic-string@npm:0.30.1": + version: 0.30.1 + resolution: "magic-string@npm:0.30.1" dependencies: - "@jridgewell/sourcemap-codec": ^1.4.13 - checksum: 7bdf22e27334d8a393858a16f5f840af63a7c05848c000fd714da5aa5eefa09a1bc01d8469362f25cc5c4a14ec01b46557b7fff8751365522acddf21e57c488d + "@jridgewell/sourcemap-codec": ^1.4.15 + checksum: 7bc7e4493e32a77068f3753bf8652d4ab44142122eb7fb9fa871af83bef2cd2c57518a6769701cd5d0379bd624a13bc8c72ca25ac5655b27e5a61adf1fd38db2 languageName: node linkType: hard From 3191801fa7c4bb5487dd08346f94bb304a9b669b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Jul 2023 11:04:15 -0400 Subject: [PATCH 008/102] Update babel monorepo to v7.22.6 (#17201) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 10 +-- yarn.lock | 201 +++++++++++++++++++++++++++------------------------ 2 files changed, 110 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index a552f37428..18060e79ab 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "license": "Apache-2.0", "type": "module", "dependencies": { - "@babel/runtime": "7.22.5", + "@babel/runtime": "7.22.6", "@braintree/sanitize-url": "6.0.2", "@codemirror/autocomplete": "6.8.1", "@codemirror/commands": "6.2.4", @@ -152,10 +152,10 @@ "xss": "1.0.14" }, "devDependencies": { - "@babel/core": "7.22.5", - "@babel/plugin-proposal-decorators": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.5", - "@babel/preset-env": "7.22.5", + "@babel/core": "7.22.6", + "@babel/plugin-proposal-decorators": "7.22.6", + "@babel/plugin-transform-runtime": "7.22.6", + "@babel/preset-env": "7.22.6", "@babel/preset-typescript": "7.22.5", "@koa/cors": "4.0.0", "@octokit/auth-oauth-device": "5.0.2", diff --git a/yarn.lock b/yarn.lock index a69dd7b4dc..b64d9a2ce9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,45 +54,45 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/compat-data@npm:7.22.5" - checksum: eb1a47ebf79ae268b4a16903e977be52629339806e248455eb9973897c503a04b701f36a9de64e19750d6e081d0561e77a514c8dc470babbeba59ae94298ed18 +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/compat-data@npm:7.22.6" + checksum: b88631143a2ebdb75e5bac47984e950983294f1739c2133f32569c6f2fcee85f83634bb6cf4378afb44fa8eb7877d11e48811d1e6a52afa161f82276ffdc3fb4 languageName: node linkType: hard -"@babel/core@npm:7.22.5, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3": - version: 7.22.5 - resolution: "@babel/core@npm:7.22.5" +"@babel/core@npm:7.22.6, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3": + version: 7.22.6 + resolution: "@babel/core@npm:7.22.6" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.5 "@babel/generator": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-module-transforms": ^7.22.5 - "@babel/helpers": ^7.22.5 - "@babel/parser": ^7.22.5 + "@babel/helpers": ^7.22.6 + "@babel/parser": ^7.22.6 "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 + "@babel/traverse": ^7.22.6 "@babel/types": ^7.22.5 + "@nicolo-ribaudo/semver-v6": ^6.3.3 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.2 - semver: ^6.3.0 - checksum: 173ae426958c90c7bbd7de622c6f13fcab8aef0fac3f138e2d47bc466d1cd1f86f71ca82ae0acb9032fd8794abed8efb56fea55c031396337eaec0d673b69d56 + checksum: 6113ff87c0b707f9c2216285cd3e0a02088ecee427a75a6f3f865da7db25a4863ceb34950248df6ad86f6dd5c608b0f7220f972533f1cc27ff6a9b4380d6ef2c languageName: node linkType: hard -"@babel/generator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/generator@npm:7.22.5" +"@babel/generator@npm:^7.22.5, @babel/generator@npm:^7.22.7": + version: 7.22.7 + resolution: "@babel/generator@npm:7.22.7" dependencies: "@babel/types": ^7.22.5 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: efa64da70ca88fe69f05520cf5feed6eba6d30a85d32237671488cc355fdc379fe2c3246382a861d49574c4c2f82a317584f8811e95eb024e365faff3232b49d + checksum: cee15558888bdf5564e19cfaf95101b2910fa425f30cc1a25ac9b8621bd62b63544eb1b36ad89c80b5e41915699219f78712cab128d1f7e3da6a21fbf4143927 languageName: node linkType: hard @@ -114,24 +114,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-compilation-targets@npm:7.22.5" +"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-compilation-targets@npm:7.22.6" dependencies: - "@babel/compat-data": ^7.22.5 + "@babel/compat-data": ^7.22.6 "@babel/helper-validator-option": ^7.22.5 - browserslist: ^4.21.3 + "@nicolo-ribaudo/semver-v6": ^6.3.3 + browserslist: ^4.21.9 lru-cache: ^5.1.1 - semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: a479460615acffa0f4fd0a29b740eafb53a93694265207d23a6038ccd18d183a382cacca515e77b7c9b042c3ba80b0aca0da5f1f62215140e81660d2cf721b68 + checksum: c7788c48099c4f0edf2adeb367a941a930d39ed7453140ceb10d7114c4091922adf56d3cdd832050fd4501f25e872886390629042ddd365d3bce2ecad69ed394 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.5" +"@babel/helper-create-class-features-plugin@npm:^7.22.5, @babel/helper-create-class-features-plugin@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.6" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.5 @@ -140,11 +140,11 @@ __metadata: "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-replace-supers": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 - semver: ^6.3.0 + "@babel/helper-split-export-declaration": ^7.22.6 + "@nicolo-ribaudo/semver-v6": ^6.3.3 peerDependencies: "@babel/core": ^7.0.0 - checksum: f1e91deae06dbee6dd956c0346bca600adfbc7955427795d9d8825f0439a3c3290c789ba2b4a02a1cdf6c1a1bd163dfa16d3d5e96b02a8efb639d2a774e88ed9 + checksum: 10412e8a509a607cde6137288d3f12b1f91acd374e29e6dd6a277b67217e9f4c932a0acd89eeda837c8432916df775a8af6321aeb8d8b131ccdbf7688208dda1 languageName: node linkType: hard @@ -299,12 +299,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-split-export-declaration@npm:7.22.5" +"@babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-split-export-declaration@npm:7.22.6" dependencies: "@babel/types": ^7.22.5 - checksum: d10e05a02f49c1f7c578cea63d2ac55356501bbf58856d97ac9bfde4957faee21ae97c7f566aa309e38a256eef58b58e5b670a7f568b362c00e93dfffe072650 + checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 languageName: node linkType: hard @@ -341,14 +341,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helpers@npm:7.22.5" +"@babel/helpers@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helpers@npm:7.22.6" dependencies: "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 + "@babel/traverse": ^7.22.6 "@babel/types": ^7.22.5 - checksum: a96e785029dff72f171190943df895ab0f76e17bf3881efd630bc5fae91215042d1c2e9ed730e8e4adf4da6f28b24bd1f54ed93b90ffbca34c197351872a084e + checksum: 5c1f33241fe7bf7709868c2105134a0a86dca26a0fbd508af10a89312b1f77ca38ebae43e50be3b208613c5eacca1559618af4ca236f0abc55d294800faeff30 languageName: node linkType: hard @@ -363,12 +363,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/parser@npm:7.22.5" +"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.6, @babel/parser@npm:^7.22.7": + version: 7.22.7 + resolution: "@babel/parser@npm:7.22.7" bin: parser: ./bin/babel-parser.js - checksum: 470ebba516417ce8683b36e2eddd56dcfecb32c54b9bb507e28eb76b30d1c3e618fd0cfeee1f64d8357c2254514e1a19e32885cfb4e73149f4ae875436a6d59c + checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 languageName: node linkType: hard @@ -396,18 +396,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-proposal-decorators@npm:7.22.5" +"@babel/plugin-proposal-decorators@npm:7.22.6": + version: 7.22.6 + resolution: "@babel/plugin-proposal-decorators@npm:7.22.6" dependencies: - "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-replace-supers": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 "@babel/plugin-syntax-decorators": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b3807b92b6ffcaba7519a9b2bb59e4b5530873234cd170ff5727414939334fbcae17bbe523df846a103e2fc8ed2d2890d0d9408f073cfc1e90c28ab565c358e5 + checksum: 568399236163108830e8a4b514369ecd0f08c39510f29ee208bfcc9e3847d2144478c30fa259aaa70640f181e749d1169ca06b06bde9af301407c35d5dba8b06 languageName: node linkType: hard @@ -749,22 +749,22 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-classes@npm:7.22.5" +"@babel/plugin-transform-classes@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/plugin-transform-classes@npm:7.22.6" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-function-name": ^7.22.5 "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-replace-supers": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 124b1b79180524cc9d08155cecde92c7f2ab0db02cbe0f8befa187ef3c7320909ce1a6d6daf5ce73e8330f9b40cf9991f424c6e572b8dddc1f14e2758fa80d20 + checksum: 8380e855c01033dbc7460d9acfbc1fc37c880350fa798c2de8c594ef818ade0e4c96173ec72f05f2a4549d8d37135e18cb62548352d51557b45a0fb4388d2f3f languageName: node linkType: hard @@ -1057,16 +1057,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.22.5" +"@babel/plugin-transform-optional-chaining@npm:^7.22.5, @babel/plugin-transform-optional-chaining@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.22.6" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 57b9c05fb22ae881b8a334b184fc6ee966661ed5d1eb4eed8c2fb9a12e68150d90b229efcb1aa777e246999830844fee06d7365f8bb4bb262fdcd23876ff3ea2 + checksum: 9713f7920ed04090c149fc5ec024dd1638e8b97aa4ae3753b93072d84103b8de380afb96d6cf03e53b285420db4f705f3ac13149c6fd54f322b61dc19e33c54f languageName: node linkType: hard @@ -1141,19 +1141,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-runtime@npm:7.22.5" +"@babel/plugin-transform-runtime@npm:7.22.6": + version: 7.22.6 + resolution: "@babel/plugin-transform-runtime@npm:7.22.6" dependencies: "@babel/helper-module-imports": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 + "@nicolo-ribaudo/semver-v6": ^6.3.3 babel-plugin-polyfill-corejs2: ^0.4.3 babel-plugin-polyfill-corejs3: ^0.8.1 babel-plugin-polyfill-regenerator: ^0.5.0 - semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 52cf177045b5f61a6cfc36b45aa7629586dc00a28371a09ef03e877a627f520efd51817ad8cceabaaa25f266e069859b36a5ac5018afeaa7f37aafa9325df4d8 + checksum: 489e54d9d8a2ff54b50fa2ffb1c0456d93746ea4ac5fd950df17dbdcf04801acd59106828c30766691608044f561cd3d8883bfc0ee22e8db86e09616293c8cbd languageName: node linkType: hard @@ -1274,12 +1274,12 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.22.5, @babel/preset-env@npm:^7.11.0": - version: 7.22.5 - resolution: "@babel/preset-env@npm:7.22.5" +"@babel/preset-env@npm:7.22.6, @babel/preset-env@npm:^7.11.0": + version: 7.22.6 + resolution: "@babel/preset-env@npm:7.22.6" dependencies: - "@babel/compat-data": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.5 + "@babel/compat-data": ^7.22.6 + "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-validator-option": ^7.22.5 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.5 @@ -1310,7 +1310,7 @@ __metadata: "@babel/plugin-transform-block-scoping": ^7.22.5 "@babel/plugin-transform-class-properties": ^7.22.5 "@babel/plugin-transform-class-static-block": ^7.22.5 - "@babel/plugin-transform-classes": ^7.22.5 + "@babel/plugin-transform-classes": ^7.22.6 "@babel/plugin-transform-computed-properties": ^7.22.5 "@babel/plugin-transform-destructuring": ^7.22.5 "@babel/plugin-transform-dotall-regex": ^7.22.5 @@ -1335,7 +1335,7 @@ __metadata: "@babel/plugin-transform-object-rest-spread": ^7.22.5 "@babel/plugin-transform-object-super": ^7.22.5 "@babel/plugin-transform-optional-catch-binding": ^7.22.5 - "@babel/plugin-transform-optional-chaining": ^7.22.5 + "@babel/plugin-transform-optional-chaining": ^7.22.6 "@babel/plugin-transform-parameters": ^7.22.5 "@babel/plugin-transform-private-methods": ^7.22.5 "@babel/plugin-transform-private-property-in-object": ^7.22.5 @@ -1353,14 +1353,14 @@ __metadata: "@babel/plugin-transform-unicode-sets-regex": ^7.22.5 "@babel/preset-modules": ^0.1.5 "@babel/types": ^7.22.5 + "@nicolo-ribaudo/semver-v6": ^6.3.3 babel-plugin-polyfill-corejs2: ^0.4.3 babel-plugin-polyfill-corejs3: ^0.8.1 babel-plugin-polyfill-regenerator: ^0.5.0 - core-js-compat: ^3.30.2 - semver: ^6.3.0 + core-js-compat: ^3.31.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6d9d09010ababef2ab48c8830770b2a8f45d6cce51db0924a98b0d95a5b1248a99ee07ee61cb5446d8b05b562db99a8af30b3ed194546419fb9b2889b8fd1ed3 + checksum: 0e56f737a737de8dab192ac65c5c26a05872094a6b90ed4c23d620e483adf1d6c9a385d6973c8d752f0f54e2a1d6330bdd4cddf474619fc4815fb44ece82bae5 languageName: node linkType: hard @@ -1401,12 +1401,12 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.22.5, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4": - version: 7.22.5 - resolution: "@babel/runtime@npm:7.22.5" +"@babel/runtime@npm:7.22.6, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4": + version: 7.22.6 + resolution: "@babel/runtime@npm:7.22.6" dependencies: regenerator-runtime: ^0.13.11 - checksum: 12a50b7de2531beef38840d17af50c55a094253697600cee255311222390c68eed704829308d4fd305e1b3dfbce113272e428e9d9d45b1730e0fede997eaceb1 + checksum: e585338287c4514a713babf4fdb8fc2a67adcebab3e7723a739fc62c79cfda875b314c90fd25f827afb150d781af97bc16c85bfdbfa2889f06053879a1ddb597 languageName: node linkType: hard @@ -1421,21 +1421,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/traverse@npm:7.22.5" +"@babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6": + version: 7.22.8 + resolution: "@babel/traverse@npm:7.22.8" dependencies: "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.5 + "@babel/generator": ^7.22.7 "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-function-name": ^7.22.5 "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 - "@babel/parser": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.22.7 "@babel/types": ^7.22.5 debug: ^4.1.0 globals: ^11.1.0 - checksum: 560931422dc1761f2df723778dcb4e51ce0d02e560cf2caa49822921578f49189a5a7d053b78a32dca33e59be886a6b2200a6e24d4ae9b5086ca0ba803815694 + checksum: a381369bc3eedfd13ed5fef7b884657f1c29024ea7388198149f0edc34bd69ce3966e9f40188d15f56490a5e12ba250ccc485f2882b53d41b054fccefb233e33 languageName: node linkType: hard @@ -3183,6 +3183,15 @@ __metadata: languageName: node linkType: hard +"@nicolo-ribaudo/semver-v6@npm:^6.3.3": + version: 6.3.3 + resolution: "@nicolo-ribaudo/semver-v6@npm:6.3.3" + bin: + semver: bin/semver.js + checksum: 8290855b1591477d2298364541fda64fafd4acc110b387067a71c9b05f4105c0a4ac079857ae9cd107c42ee884e8724a406b5116f069575e02d7ab87a35a5272 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -6371,7 +6380,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.5, browserslist@npm:^4.21.3, browserslist@npm:^4.21.5": +"browserslist@npm:^4.14.5, browserslist@npm:^4.21.9": version: 4.21.9 resolution: "browserslist@npm:4.21.9" dependencies: @@ -7144,12 +7153,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.30.1, core-js-compat@npm:^3.30.2": - version: 3.31.0 - resolution: "core-js-compat@npm:3.31.0" +"core-js-compat@npm:^3.30.1, core-js-compat@npm:^3.31.0": + version: 3.31.1 + resolution: "core-js-compat@npm:3.31.1" dependencies: - browserslist: ^4.21.5 - checksum: 5c76ac5e4ab39480391f93a5aef14a2cfa188cda7bd6a7b8532de1f8bc5d89099a5025b2640d2ef70a2928614792363dcbcf8bd254aa7b2e11b85aeed7ac460f + browserslist: ^4.21.9 + checksum: 9a16d6992621f4e099169297381a28d5712cdef7df1fa85352a7c285a5885d5d7a117ec2eae9ad715ed88c7cc774787a22cdb8aceababf6775fbc8b0cbeccdb7 languageName: node linkType: hard @@ -9606,12 +9615,12 @@ __metadata: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": 7.22.5 - "@babel/plugin-proposal-decorators": 7.22.5 - "@babel/plugin-transform-runtime": 7.22.5 - "@babel/preset-env": 7.22.5 + "@babel/core": 7.22.6 + "@babel/plugin-proposal-decorators": 7.22.6 + "@babel/plugin-transform-runtime": 7.22.6 + "@babel/preset-env": 7.22.6 "@babel/preset-typescript": 7.22.5 - "@babel/runtime": 7.22.5 + "@babel/runtime": 7.22.6 "@braintree/sanitize-url": 6.0.2 "@codemirror/autocomplete": 6.8.1 "@codemirror/commands": 6.2.4 From 1beab0449f72f2c0a976d9fba4558801cfae4e04 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sat, 8 Jul 2023 19:23:30 +0200 Subject: [PATCH 009/102] Fix missing translations of password field in cloud signup (#17213) --- src/panels/config/cloud/register/cloud-register.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panels/config/cloud/register/cloud-register.ts b/src/panels/config/cloud/register/cloud-register.ts index 790ddcca5a..dfab49cfbe 100644 --- a/src/panels/config/cloud/register/cloud-register.ts +++ b/src/panels/config/cloud/register/cloud-register.ts @@ -148,7 +148,9 @@ export class CloudRegister extends LitElement { Date: Sat, 8 Jul 2023 11:03:21 -0700 Subject: [PATCH 010/102] Don't automatically capitalize climate states (#17217) * Don't auto-capitalize climate states * more states --- src/components/ha-climate-state.ts | 1 - src/components/ha-humidifier-state.ts | 1 - src/components/ha-water_heater-state.js | 1 - 3 files changed, 3 deletions(-) diff --git a/src/components/ha-climate-state.ts b/src/components/ha-climate-state.ts index 7a1617e4ee..b90b51fee1 100644 --- a/src/components/ha-climate-state.ts +++ b/src/components/ha-climate-state.ts @@ -172,7 +172,6 @@ class HaClimateState extends LitElement { .state-label { font-weight: bold; - text-transform: capitalize; } .unit { diff --git a/src/components/ha-humidifier-state.ts b/src/components/ha-humidifier-state.ts index fbf9cfe519..45af8a3384 100644 --- a/src/components/ha-humidifier-state.ts +++ b/src/components/ha-humidifier-state.ts @@ -119,7 +119,6 @@ class HaHumidifierState extends LitElement { .state-label { font-weight: bold; - text-transform: capitalize; } .unit { diff --git a/src/components/ha-water_heater-state.js b/src/components/ha-water_heater-state.js index d4dc750640..4f2220fc58 100644 --- a/src/components/ha-water_heater-state.js +++ b/src/components/ha-water_heater-state.js @@ -29,7 +29,6 @@ class HaWaterHeaterState extends LocalizeMixin(PolymerElement) { .state-label { font-weight: bold; - text-transform: capitalize; } .label { From 4ea88613bd8eed5fee073017b74a1f05ff612e41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 8 Jul 2023 20:22:26 -0400 Subject: [PATCH 011/102] Update dependency lit to v2.7.6 (#17220) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 18060e79ab..920c08a051 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "js-yaml": "4.1.0", "leaflet": "1.9.4", "leaflet-draw": "1.0.4", - "lit": "2.7.5", + "lit": "2.7.6", "luxon": "3.3.0", "marked": "4.3.0", "memoize-one": "6.0.0", diff --git a/yarn.lock b/yarn.lock index b64d9a2ce9..5af89de19f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9776,7 +9776,7 @@ __metadata: leaflet: 1.9.4 leaflet-draw: 1.0.4 lint-staged: 13.2.3 - lit: 2.7.5 + lit: 2.7.6 lit-analyzer: 2.0.0-pre.3 lodash.template: 4.5.0 luxon: 3.3.0 @@ -11439,14 +11439,14 @@ __metadata: languageName: node linkType: hard -"lit@npm:2.7.5, lit@npm:^2.0.0, lit@npm:^2.0.0-rc.2, lit@npm:^2.2.1, lit@npm:^2.7.0, lit@npm:^2.7.4, lit@npm:^2.7.5": - version: 2.7.5 - resolution: "lit@npm:2.7.5" +"lit@npm:2.7.6, lit@npm:^2.0.0, lit@npm:^2.0.0-rc.2, lit@npm:^2.2.1, lit@npm:^2.7.0, lit@npm:^2.7.4, lit@npm:^2.7.5": + version: 2.7.6 + resolution: "lit@npm:2.7.6" dependencies: "@lit/reactive-element": ^1.6.0 lit-element: ^3.3.0 lit-html: ^2.7.0 - checksum: 61a3f87c57136618f47a30b36cdfb592fcba42dcfbdb104d2b5ca291148c2d9a32fcb713bb91090bd08d6897a00e73f8425da6e3626aa080eaf410a32397ae69 + checksum: 984a7fb9c0fa387f20177a07de22ea1c9cdc01a7dc7cb1c400d1df5b43a8956908460482a3259ea173555c6f0f13457d2ddc5c84d4c365007afd86e7ca58b384 languageName: node linkType: hard From 13d686bd67769df62f8e182329e895b496af67e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 00:09:31 -0400 Subject: [PATCH 012/102] Update dependency core-js to v3.31.1 (#17224) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 920c08a051..04ea09eb7f 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "app-datepicker": "5.1.1", "chart.js": "3.3.2", "comlink": "4.4.1", - "core-js": "3.31.0", + "core-js": "3.31.1", "cropperjs": "1.5.13", "date-fns": "2.30.0", "date-fns-tz": "2.0.0", diff --git a/yarn.lock b/yarn.lock index 5af89de19f..3892518a94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7162,10 +7162,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:3.31.0": - version: 3.31.0 - resolution: "core-js@npm:3.31.0" - checksum: f7cf9b3010f7ca99c026d95b61743baca1a85512742ed2b67e8f65a72ac4f4fe0b90b00057783e886bdd39d3a295f42f845d33e7cba3973ed263df978343ab79 +"core-js@npm:3.31.1": + version: 3.31.1 + resolution: "core-js@npm:3.31.1" + checksum: 14519213a63c55cf188bdd2f4dece54583feaf6b90e75d6c65e07f509cd487055bf64898aeda7c97c36029ac1ea2f2ed8e4b02281553f6a257e7143a32a14015 languageName: node linkType: hard @@ -9734,7 +9734,7 @@ __metadata: chai: 4.3.7 chart.js: 3.3.2 comlink: 4.4.1 - core-js: 3.31.0 + core-js: 3.31.1 cropperjs: 1.5.13 date-fns: 2.30.0 date-fns-tz: 2.0.0 From 487ff4afcf14564a6f15efb00743ff229ef35729 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 17:35:21 -0400 Subject: [PATCH 013/102] Update babel monorepo (#17233) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 8 ++-- yarn.lock | 133 +++++++++++++++++++++++++-------------------------- 2 files changed, 70 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index 04ea09eb7f..5bc8f63e8a 100644 --- a/package.json +++ b/package.json @@ -152,10 +152,10 @@ "xss": "1.0.14" }, "devDependencies": { - "@babel/core": "7.22.6", - "@babel/plugin-proposal-decorators": "7.22.6", - "@babel/plugin-transform-runtime": "7.22.6", - "@babel/preset-env": "7.22.6", + "@babel/core": "7.22.8", + "@babel/plugin-proposal-decorators": "7.22.7", + "@babel/plugin-transform-runtime": "7.22.7", + "@babel/preset-env": "7.22.7", "@babel/preset-typescript": "7.22.5", "@koa/cors": "4.0.0", "@octokit/auth-oauth-device": "5.0.2", diff --git a/yarn.lock b/yarn.lock index 3892518a94..2178e03aa9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,37 +54,37 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6": +"@babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6": version: 7.22.6 resolution: "@babel/compat-data@npm:7.22.6" checksum: b88631143a2ebdb75e5bac47984e950983294f1739c2133f32569c6f2fcee85f83634bb6cf4378afb44fa8eb7877d11e48811d1e6a52afa161f82276ffdc3fb4 languageName: node linkType: hard -"@babel/core@npm:7.22.6, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3": - version: 7.22.6 - resolution: "@babel/core@npm:7.22.6" +"@babel/core@npm:7.22.8, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3": + version: 7.22.8 + resolution: "@babel/core@npm:7.22.8" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.5 + "@babel/generator": ^7.22.7 "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-module-transforms": ^7.22.5 "@babel/helpers": ^7.22.6 - "@babel/parser": ^7.22.6 + "@babel/parser": ^7.22.7 "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.6 + "@babel/traverse": ^7.22.8 "@babel/types": ^7.22.5 "@nicolo-ribaudo/semver-v6": ^6.3.3 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.2 - checksum: 6113ff87c0b707f9c2216285cd3e0a02088ecee427a75a6f3f865da7db25a4863ceb34950248df6ad86f6dd5c608b0f7220f972533f1cc27ff6a9b4380d6ef2c + checksum: 75ed701c14ad17070382ae1dd166f7534b31f2c71e00995a5f261ee2398ee96335b0736573b8ff24ab6e3e6f5814ee2a48fa11ab90fabcd3dfc70ea87c5f30a6 languageName: node linkType: hard -"@babel/generator@npm:^7.22.5, @babel/generator@npm:^7.22.7": +"@babel/generator@npm:^7.22.7": version: 7.22.7 resolution: "@babel/generator@npm:7.22.7" dependencies: @@ -114,7 +114,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": +"@babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-compilation-targets@npm:7.22.6" dependencies: @@ -161,19 +161,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.0": - version: 0.4.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.0" +"@babel/helper-define-polyfill-provider@npm:^0.4.1": + version: 0.4.1 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.1" dependencies: - "@babel/helper-compilation-targets": ^7.17.7 - "@babel/helper-plugin-utils": ^7.16.7 + "@babel/helper-compilation-targets": ^7.22.6 + "@babel/helper-plugin-utils": ^7.22.5 debug: ^4.1.1 lodash.debounce: ^4.0.8 resolve: ^1.14.2 - semver: ^6.1.2 peerDependencies: "@babel/core": ^7.4.0-0 - checksum: 5dca4c5e78457c5ced366bea601efa4e8c69bf5d53b0fe540283897575c49b1b88191c8ef062110de9046e886703ed3270fcda3a87f0886cdbb549204d3ff63f + checksum: 712b440cdd343ac7c4617225f91b0a9db5a7b1c96356b720e011af64ad6c4da9c66889f8d2962a0a2ae2e4ccb6a9b4a210c4a3c8c8ff103846b3d93b61bc6634 languageName: node linkType: hard @@ -246,7 +245,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.22.5 resolution: "@babel/helper-plugin-utils@npm:7.22.5" checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 @@ -363,7 +362,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.6, @babel/parser@npm:^7.22.7": +"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.7": version: 7.22.7 resolution: "@babel/parser@npm:7.22.7" bin: @@ -396,9 +395,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:7.22.6": - version: 7.22.6 - resolution: "@babel/plugin-proposal-decorators@npm:7.22.6" +"@babel/plugin-proposal-decorators@npm:7.22.7": + version: 7.22.7 + resolution: "@babel/plugin-proposal-decorators@npm:7.22.7" dependencies: "@babel/helper-create-class-features-plugin": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 @@ -407,7 +406,7 @@ __metadata: "@babel/plugin-syntax-decorators": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 568399236163108830e8a4b514369ecd0f08c39510f29ee208bfcc9e3847d2144478c30fa259aaa70640f181e749d1169ca06b06bde9af301407c35d5dba8b06 + checksum: d9d6f7cc8b3f1450963d3f26909af025836189b81e43c48ad455db5db2319beaf4ad2fda5aa12a1afcf856de11ecd5ee6894a9e906e8de8ee445c79102b50d26 languageName: node linkType: hard @@ -675,9 +674,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.5" +"@babel/plugin-transform-async-generator-functions@npm:^7.22.7": + version: 7.22.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.7" dependencies: "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 @@ -685,7 +684,7 @@ __metadata: "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 32890b69ec5627eb46ee8e084bddc6b98d85b66cae5e015f3a23924611a759789d2ff836406605f5293b5c2bad306b20cb1f5b7a46ed549b07bfec634bcd31f9 + checksum: 57cd2cce3fb696dadf00e88f168683df69e900b92dadeae07429243c43bc21d5ccdc0c2db61cf5c37bd0fbd893fc455466bef6babe4aa5b79d9cb8ba89f40ae7 languageName: node linkType: hard @@ -1141,19 +1140,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.22.6": - version: 7.22.6 - resolution: "@babel/plugin-transform-runtime@npm:7.22.6" +"@babel/plugin-transform-runtime@npm:7.22.7": + version: 7.22.7 + resolution: "@babel/plugin-transform-runtime@npm:7.22.7" dependencies: "@babel/helper-module-imports": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 "@nicolo-ribaudo/semver-v6": ^6.3.3 - babel-plugin-polyfill-corejs2: ^0.4.3 - babel-plugin-polyfill-corejs3: ^0.8.1 - babel-plugin-polyfill-regenerator: ^0.5.0 + babel-plugin-polyfill-corejs2: ^0.4.4 + babel-plugin-polyfill-corejs3: ^0.8.2 + babel-plugin-polyfill-regenerator: ^0.5.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 489e54d9d8a2ff54b50fa2ffb1c0456d93746ea4ac5fd950df17dbdcf04801acd59106828c30766691608044f561cd3d8883bfc0ee22e8db86e09616293c8cbd + checksum: 1b41c44d5c44c98df3885b4f541c4edbef507bbdb1c889eed9878d9aabb29b6f589192ae712454c20ced22c79cfb2911403023daf03d20902434a258632d4773 languageName: node linkType: hard @@ -1274,9 +1273,9 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.22.6, @babel/preset-env@npm:^7.11.0": - version: 7.22.6 - resolution: "@babel/preset-env@npm:7.22.6" +"@babel/preset-env@npm:7.22.7, @babel/preset-env@npm:^7.11.0": + version: 7.22.7 + resolution: "@babel/preset-env@npm:7.22.7" dependencies: "@babel/compat-data": ^7.22.6 "@babel/helper-compilation-targets": ^7.22.6 @@ -1304,7 +1303,7 @@ __metadata: "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 "@babel/plugin-transform-arrow-functions": ^7.22.5 - "@babel/plugin-transform-async-generator-functions": ^7.22.5 + "@babel/plugin-transform-async-generator-functions": ^7.22.7 "@babel/plugin-transform-async-to-generator": ^7.22.5 "@babel/plugin-transform-block-scoped-functions": ^7.22.5 "@babel/plugin-transform-block-scoping": ^7.22.5 @@ -1354,13 +1353,13 @@ __metadata: "@babel/preset-modules": ^0.1.5 "@babel/types": ^7.22.5 "@nicolo-ribaudo/semver-v6": ^6.3.3 - babel-plugin-polyfill-corejs2: ^0.4.3 - babel-plugin-polyfill-corejs3: ^0.8.1 - babel-plugin-polyfill-regenerator: ^0.5.0 + babel-plugin-polyfill-corejs2: ^0.4.4 + babel-plugin-polyfill-corejs3: ^0.8.2 + babel-plugin-polyfill-regenerator: ^0.5.1 core-js-compat: ^3.31.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0e56f737a737de8dab192ac65c5c26a05872094a6b90ed4c23d620e483adf1d6c9a385d6973c8d752f0f54e2a1d6330bdd4cddf474619fc4815fb44ece82bae5 + checksum: eabde70e450dd54f57997b0f92317f69f268e9a1f85b13f5ef5540d2a38cfae5620bd8e48ddffb547c55fbd2f17673276e6eb9411d6b5fb82e3422faf44cb6cf languageName: node linkType: hard @@ -1421,7 +1420,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6": +"@babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.22.8": version: 7.22.8 resolution: "@babel/traverse@npm:7.22.8" dependencies: @@ -6118,39 +6117,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.3": - version: 0.4.3 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.3" +"babel-plugin-polyfill-corejs2@npm:^0.4.4": + version: 0.4.4 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.4" dependencies: - "@babel/compat-data": ^7.17.7 - "@babel/helper-define-polyfill-provider": ^0.4.0 - semver: ^6.1.1 + "@babel/compat-data": ^7.22.6 + "@babel/helper-define-polyfill-provider": ^0.4.1 + "@nicolo-ribaudo/semver-v6": ^6.3.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 09ba40b9f8ac66a733628b2f12722bb764bdcc4f9600b93d60f1994418a8f84bc4b1ed9ab07c9d288debbf6210413fdff0721a3a43bd89c7f77adf76b0310adc + checksum: 0273f3d74ccbf78086a3b14bb11b1fb94933830f51c576a24229d75b3b91c8b357c3a381d4ab3146abf9b052fa4c33ec9368dd010ada9ee355e1d03ff64e1ff0 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.1": - version: 0.8.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.1" +"babel-plugin-polyfill-corejs3@npm:^0.8.2": + version: 0.8.2 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.2" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.0 - core-js-compat: ^3.30.1 + "@babel/helper-define-polyfill-provider": ^0.4.1 + core-js-compat: ^3.31.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c23a581973c141a4687126cf964981180ef27e3eb0b34b911161db4f5caf9ba7ff60bee0ebe46d650ba09e03a6a3ac2cd6a6ae5f4f5363a148470e5cd8447df2 + checksum: 0bc3e9e0114eba18f4fea8a9ff5a6016cae73b74cb091290c3f75fd7b9e34e712ee26f95b52d796f283970d7c6256fb01196e3608e8db03f620e3389d56d37c6 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.0": - version: 0.5.0 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.0" +"babel-plugin-polyfill-regenerator@npm:^0.5.1": + version: 0.5.1 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.1" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.0 + "@babel/helper-define-polyfill-provider": ^0.4.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ef2bcffc7c9a5e4426fc2dbf89bf3a46999a8415c21cd741c3ab3cb4b5ab804aaa3d71ef733f0eda1bcc0b91d9d80f98d33983a66dab9b8bed166ec38f8f8ad1 + checksum: 85a56d28b34586fbe482225fb6a9592fc793a459c5eea987a3427fb723c7aa2f76916348a9fc5e9ca48754ebf6086cfbb9226f4cd0cf9c6257f94553622562ed languageName: node linkType: hard @@ -7153,7 +7152,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.30.1, core-js-compat@npm:^3.31.0": +"core-js-compat@npm:^3.31.0": version: 3.31.1 resolution: "core-js-compat@npm:3.31.1" dependencies: @@ -9615,10 +9614,10 @@ __metadata: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": 7.22.6 - "@babel/plugin-proposal-decorators": 7.22.6 - "@babel/plugin-transform-runtime": 7.22.6 - "@babel/preset-env": 7.22.6 + "@babel/core": 7.22.8 + "@babel/plugin-proposal-decorators": 7.22.7 + "@babel/plugin-transform-runtime": 7.22.7 + "@babel/preset-env": 7.22.7 "@babel/preset-typescript": 7.22.5 "@babel/runtime": 7.22.6 "@braintree/sanitize-url": 6.0.2 @@ -14073,7 +14072,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": +"semver@npm:^6.0.0, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" bin: From fdf5abd0f946ae16b25a7a16a899af547dae4ee1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 17:37:14 -0400 Subject: [PATCH 014/102] Update dependency @codemirror/view to v6.14.1 (#17225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5bc8f63e8a..7e4a279f46 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@codemirror/legacy-modes": "6.3.2", "@codemirror/search": "6.5.0", "@codemirror/state": "6.2.1", - "@codemirror/view": "6.14.0", + "@codemirror/view": "6.14.1", "@egjs/hammerjs": "2.0.17", "@formatjs/intl-datetimeformat": "6.10.0", "@formatjs/intl-displaynames": "6.5.0", diff --git a/yarn.lock b/yarn.lock index 2178e03aa9..00d5cede15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1526,14 +1526,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:6.14.0, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0": - version: 6.14.0 - resolution: "@codemirror/view@npm:6.14.0" +"@codemirror/view@npm:6.14.1, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0": + version: 6.14.1 + resolution: "@codemirror/view@npm:6.14.1" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: f8fbb8e8cf1bc23de8cd64b1e645112d13f72cd2f1609fb9047d616908c2189ff518b89f21484371e7a37ba1804288452558e96488791f0c850f62b8e28dc163 + checksum: 19114ee05b3795ebe07a69cf00c36e8351b3500ce105b8412d90e757d459f71370ead3de852f0fda069041803276e6c38e6f1f943f77e85c9b5c279ab7fa1c4a languageName: node linkType: hard @@ -9627,7 +9627,7 @@ __metadata: "@codemirror/legacy-modes": 6.3.2 "@codemirror/search": 6.5.0 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.14.0 + "@codemirror/view": 6.14.1 "@egjs/hammerjs": 2.0.17 "@formatjs/intl-datetimeformat": 6.10.0 "@formatjs/intl-displaynames": 6.5.0 From 0974d86bfd0be12e9914e44c678b763f3423b7d7 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Sun, 9 Jul 2023 15:39:51 -0700 Subject: [PATCH 015/102] Localize the statistics search label (#17223) * Localize the statistics search label * switch to common search --- src/components/search-input.ts | 2 +- src/layouts/hass-tabs-subpage-data-table.ts | 3 +-- .../developer-tools/statistics/developer-tools-statistics.ts | 1 + src/translations/en.json | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/search-input.ts b/src/components/search-input.ts index 0a2c8598d5..2f4298ecaa 100644 --- a/src/components/search-input.ts +++ b/src/components/search-input.ts @@ -33,7 +33,7 @@ class SearchInput extends LitElement { return html` ${!this.narrow ? html`
Date: Sun, 9 Jul 2023 19:40:21 -0400 Subject: [PATCH 016/102] Update dependency @lit-labs/virtualizer to v2.0.4 (#17219) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7e4a279f46..4838f73498 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@lezer/highlight": "1.1.6", "@lit-labs/context": "0.3.3", "@lit-labs/motion": "1.0.3", - "@lit-labs/virtualizer": "2.0.3", + "@lit-labs/virtualizer": "2.0.4", "@lrnwebcomponents/simple-tooltip": "7.0.11", "@material/chips": "=14.0.0-canary.53b3cad2f.0", "@material/data-table": "=14.0.0-canary.53b3cad2f.0", diff --git a/yarn.lock b/yarn.lock index 00d5cede15..3dcac07cfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2104,13 +2104,13 @@ __metadata: languageName: node linkType: hard -"@lit-labs/virtualizer@npm:2.0.3": - version: 2.0.3 - resolution: "@lit-labs/virtualizer@npm:2.0.3" +"@lit-labs/virtualizer@npm:2.0.4": + version: 2.0.4 + resolution: "@lit-labs/virtualizer@npm:2.0.4" dependencies: lit: ^2.7.0 tslib: ^2.0.3 - checksum: 594b89aca53210a6c0127c331fd05b795074df41aba086b63cb13ad5990e6962b86ca8403fe3a673e3bf46735e2def75d5412afe582702346fbd92a3331d34e1 + checksum: a830318c50a4bc404829ab5ca3b81fa1bd72cd63bd0195c3e224dfe16cdc0c54335cd6ced222310b4a8aed438ca9ef8481e29e030b7f1a784345ffd7503439a0 languageName: node linkType: hard @@ -9647,7 +9647,7 @@ __metadata: "@lezer/highlight": 1.1.6 "@lit-labs/context": 0.3.3 "@lit-labs/motion": 1.0.3 - "@lit-labs/virtualizer": 2.0.3 + "@lit-labs/virtualizer": 2.0.4 "@lrnwebcomponents/simple-tooltip": 7.0.11 "@material/chips": =14.0.0-canary.53b3cad2f.0 "@material/data-table": =14.0.0-canary.53b3cad2f.0 From e01ad86da9fd410f1083eec3b081db8983f074e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 09:51:30 +0200 Subject: [PATCH 017/102] Bump actions/setup-node from 3.6.0 to 3.7.0 (#17246) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cast_deployment.yaml | 4 ++-- .github/workflows/ci.yaml | 8 ++++---- .github/workflows/demo_deployment.yaml | 4 ++-- .github/workflows/design_deployment.yaml | 2 +- .github/workflows/design_preview.yaml | 2 +- .github/workflows/nightly.yaml | 2 +- .github/workflows/release.yaml | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/cast_deployment.yaml b/.github/workflows/cast_deployment.yaml index 120658dd0c..b1cde578e8 100644 --- a/.github/workflows/cast_deployment.yaml +++ b/.github/workflows/cast_deployment.yaml @@ -26,7 +26,7 @@ jobs: ref: dev - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn @@ -62,7 +62,7 @@ jobs: ref: master - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 16656927e6..94f4e6413a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,7 +26,7 @@ jobs: - name: Check out files from GitHub uses: actions/checkout@v3.5.3 - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn @@ -49,7 +49,7 @@ jobs: - name: Check out files from GitHub uses: actions/checkout@v3.5.3 - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn @@ -67,7 +67,7 @@ jobs: - name: Check out files from GitHub uses: actions/checkout@v3.5.3 - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn @@ -85,7 +85,7 @@ jobs: - name: Check out files from GitHub uses: actions/checkout@v3.5.3 - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn diff --git a/.github/workflows/demo_deployment.yaml b/.github/workflows/demo_deployment.yaml index 77c4b98f5c..cbf8b92d88 100644 --- a/.github/workflows/demo_deployment.yaml +++ b/.github/workflows/demo_deployment.yaml @@ -27,7 +27,7 @@ jobs: ref: dev - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn @@ -63,7 +63,7 @@ jobs: ref: master - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn diff --git a/.github/workflows/design_deployment.yaml b/.github/workflows/design_deployment.yaml index 8b5aec8a39..096dfd752b 100644 --- a/.github/workflows/design_deployment.yaml +++ b/.github/workflows/design_deployment.yaml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@v3.5.3 - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn diff --git a/.github/workflows/design_preview.yaml b/.github/workflows/design_preview.yaml index a257f9ec98..d5b5bde6fd 100644 --- a/.github/workflows/design_preview.yaml +++ b/.github/workflows/design_preview.yaml @@ -24,7 +24,7 @@ jobs: uses: actions/checkout@v3.5.3 - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index 76f0415496..70c397083e 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -28,7 +28,7 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index a269b30074..9c181a1690 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -34,7 +34,7 @@ jobs: python-version: ${{ env.PYTHON_VERSION }} - name: Setup Node - uses: actions/setup-node@v3.6.0 + uses: actions/setup-node@v3.7.0 with: node-version-file: ".nvmrc" cache: yarn From f35b493d2e19e8d10ae9699ccde6f97fda4c1bac Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Mon, 10 Jul 2023 12:15:27 +0300 Subject: [PATCH 018/102] humidifier cards: support null target humidity (#17240) remove target humidity if not provided --- src/panels/lovelace/cards/hui-humidifier-card.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-humidifier-card.ts b/src/panels/lovelace/cards/hui-humidifier-card.ts index 57e9ee8ee5..3aae9d2bf5 100644 --- a/src/panels/lovelace/cards/hui-humidifier-card.ts +++ b/src/panels/lovelace/cards/hui-humidifier-card.ts @@ -100,7 +100,7 @@ export class HuiHumidifierCard extends LitElement implements LovelaceCard { stateObj.attributes.humidity !== null && Number.isFinite(Number(stateObj.attributes.humidity)) ? stateObj.attributes.humidity - : stateObj.attributes.min_humidity; + : null; const setHumidity = this._setHum ? this._setHum : targetHumidity; @@ -111,6 +111,7 @@ export class HuiHumidifierCard extends LitElement implements LovelaceCard { : html` Date: Mon, 10 Jul 2023 12:30:03 +0200 Subject: [PATCH 019/102] Remove unused device class translations (#17253) --- src/data/logbook.ts | 67 ++--------------------------------------- src/data/translation.ts | 1 - 2 files changed, 2 insertions(+), 66 deletions(-) diff --git a/src/data/logbook.ts b/src/data/logbook.ts index f5caa718b7..37b0737bea 100644 --- a/src/data/logbook.ts +++ b/src/data/logbook.ts @@ -71,71 +71,8 @@ export const getLogbookDataForContext = async ( hass: HomeAssistant, startDate: string, contextId?: string -): Promise => { - await hass.loadBackendTranslation("device_class"); - return getLogbookDataFromServer( - hass, - startDate, - undefined, - undefined, - contextId - ); -}; - -export const getLogbookData = async ( - hass: HomeAssistant, - startDate: string, - endDate: string, - entityIds?: string[], - deviceIds?: string[] -): Promise => { - await hass.loadBackendTranslation("device_class"); - return deviceIds?.length - ? getLogbookDataFromServer( - hass, - startDate, - endDate, - entityIds, - undefined, - deviceIds - ) - : getLogbookDataCache(hass, startDate, endDate, entityIds); -}; - -const getLogbookDataCache = async ( - hass: HomeAssistant, - startDate: string, - endDate: string, - entityId?: string[] -) => { - const ALL_ENTITIES = "*"; - - const entityIdKey = entityId ? entityId.toString() : ALL_ENTITIES; - const cacheKey = `${startDate}${endDate}`; - - if (!DATA_CACHE[cacheKey]) { - DATA_CACHE[cacheKey] = {}; - } - - if (entityIdKey in DATA_CACHE[cacheKey]) { - return DATA_CACHE[cacheKey][entityIdKey]!; - } - - if (entityId && DATA_CACHE[cacheKey][ALL_ENTITIES]) { - const entities = await DATA_CACHE[cacheKey][ALL_ENTITIES]!; - return entities.filter( - (entity) => entity.entity_id && entityId.includes(entity.entity_id) - ); - } - - DATA_CACHE[cacheKey][entityIdKey] = getLogbookDataFromServer( - hass, - startDate, - endDate, - entityId - ); - return DATA_CACHE[cacheKey][entityIdKey]!; -}; +): Promise => + getLogbookDataFromServer(hass, startDate, undefined, undefined, contextId); const getLogbookDataFromServer = ( hass: HomeAssistant, diff --git a/src/data/translation.ts b/src/data/translation.ts index b64e557b6b..99a7f7b521 100644 --- a/src/data/translation.ts +++ b/src/data/translation.ts @@ -67,7 +67,6 @@ export type TranslationCategory = | "device_automation" | "mfa_setup" | "system_health" - | "device_class" | "application_credentials" | "issues" | "selector"; From a1771cc919404302ed0a37277f1d2700bb1bb29c Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Mon, 10 Jul 2023 13:08:15 +0200 Subject: [PATCH 020/102] Clearly show if there are no ignored or disabled integrations (#17251) --- .../ha-config-integrations-dashboard.ts | 48 +++++++++++-------- src/translations/en.json | 2 + 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/panels/config/integrations/ha-config-integrations-dashboard.ts b/src/panels/config/integrations/ha-config-integrations-dashboard.ts index d670e5894c..2e60ec2935 100644 --- a/src/panels/config/integrations/ha-config-integrations-dashboard.ts +++ b/src/panels/config/integrations/ha-config-integrations-dashboard.ts @@ -383,16 +383,20 @@ class HaConfigIntegrationsDashboard extends SubscribeMixin(LitElement) { )}
- ${ignoredConfigEntries.map( - (entry: ConfigEntryExtended) => html` - - ` - )} + ${ignoredConfigEntries.length > 0 + ? ignoredConfigEntries.map( + (entry: ConfigEntryExtended) => html` + + ` + ) + : html`${this.hass.localize( + "ui.panel.config.integrations.no_ignored_integrations" + )}`}
` : ""} ${configEntriesInProgress.length @@ -417,16 +421,20 @@ class HaConfigIntegrationsDashboard extends SubscribeMixin(LitElement) { ${this.hass.localize("ui.panel.config.integrations.disabled")}
- ${disabledConfigEntries.map( - (entry: ConfigEntryExtended) => html` - - ` - )} + ${disabledConfigEntries.length > 0 + ? disabledConfigEntries.map( + (entry: ConfigEntryExtended) => html` + + ` + ) + : html`${this.hass.localize( + "ui.panel.config.integrations.no_disabled_integrations" + )}`}
` : ""} ${configEntriesInProgress.length || diff --git a/src/translations/en.json b/src/translations/en.json index b8324e57e7..44bf822d05 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3377,6 +3377,8 @@ "confirm_new": "Do you want to set up {integration}?", "add_integration": "Add integration", "no_integrations": "Seems like you don't have any integrations configured yet. Click on the button below to add your first integration!", + "no_disabled_integrations": "No disabled integrations", + "no_ignored_integrations": "No ignored integrations", "note_about_integrations": "No integrations matched your search, the integration you want to set up might not be available to set up via the UI yet.", "note_about_website_reference": "More are available on the ", "home_assistant_website": "Home Assistant website", From 456eba1d88841e9724b008c9a738cea32dd4780c Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Mon, 10 Jul 2023 07:08:46 -0400 Subject: [PATCH 021/102] Add pull request labeler (#17199) --- .github/dependabot.yml | 3 +++ .github/labeler.yml | 31 +++++++++++++++++++++++++++++++ .github/release-drafter.yml | 2 +- .github/workflows/labeler.yaml | 15 +++++++++++++++ renovate.json | 2 +- 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/labeler.yaml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b7b4ca2ddc..44500cfd3c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,3 +6,6 @@ updates: interval: weekly time: "06:00" open-pull-requests-limit: 10 + labels: + - Dependencies + - GitHub Actions diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 0000000000..0ad85a9bb6 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,31 @@ +Build: + - build-scripts/** + - .browserslistrc + - gulpfile.js + +Cast: + - cast/src/** + - src/cast/** + +Demo: + - demo/src/** + - src/fake_data/** + +Design: + - gallery/src/** + - src/fake_data/** + +Dependencies: + - package.json + - renovate.json + - yarn.lock + - .yarn/** + - .yarnrc.yml + - .nvmrc + +GitHub Actions: + - .github/workflows/** + - .github/*.yml + +Supervisor: + - hassio/src/** diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 0d507d1104..82a06ab923 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -2,7 +2,7 @@ categories: - title: 'Dependency updates' collapse-after: 3 labels: - - 'dependencies' + - 'Dependencies' template: | ## What's Changed diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml new file mode 100644 index 0000000000..079d25cf06 --- /dev/null +++ b/.github/workflows/labeler.yaml @@ -0,0 +1,15 @@ +name: "Pull Request Labeler" + +on: pull_request_target + +jobs: + triage: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - name: Apply labels + uses: actions/labeler@v4.2.0 + with: + sync-labels: true diff --git a/renovate.json b/renovate.json index 291e6a4a26..e1dabc5a5b 100644 --- a/renovate.json +++ b/renovate.json @@ -2,7 +2,7 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ ":ignoreModulesAndTests", - ":label(dependencies)", + ":label(Dependencies)", ":pinVersions", ":prConcurrentLimit10", ":semanticCommitsDisabled", From 3bf8739a7c2013540884ff3479f5ece560dd5093 Mon Sep 17 00:00:00 2001 From: Till Date: Mon, 10 Jul 2023 13:12:15 +0200 Subject: [PATCH 022/102] Fix missing autocomplete in energy settings (#17218) --- src/components/entity/ha-statistic-picker.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/entity/ha-statistic-picker.ts b/src/components/entity/ha-statistic-picker.ts index fc40f169ea..f5c1d7ff22 100644 --- a/src/components/entity/ha-statistic-picker.ts +++ b/src/components/entity/ha-statistic-picker.ts @@ -263,7 +263,9 @@ export class HaStatisticPicker extends LitElement { .renderer=${this._rowRenderer} .disabled=${this.disabled} .allowCustomValue=${this.allowCustomEntity} - .filteredItems=${this._statistics} + .filteredItems=${this.value && this._statistics.length === 0 + ? undefined + : this._statistics} item-value-path="id" item-id-path="id" item-label-path="name" From d66a8a65b6408f39c3d3c5654e612fcee6fcf173 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 10 Jul 2023 04:13:46 -0700 Subject: [PATCH 023/102] Fix a browser hang with charts in grids (#17244) --- src/components/chart/state-history-charts.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/components/chart/state-history-charts.ts b/src/components/chart/state-history-charts.ts index 0ce32a583e..2ed678b01c 100644 --- a/src/components/chart/state-history-charts.ts +++ b/src/components/chart/state-history-charts.ts @@ -184,7 +184,17 @@ export class StateHistoryCharts extends LitElement { }; protected shouldUpdate(changedProps: PropertyValues): boolean { - return !(changedProps.size === 1 && changedProps.has("hass")); + if (changedProps.size === 1 && changedProps.has("hass")) { + return false; + } + if ( + changedProps.size === 1 && + changedProps.has("_maxYWidth") && + changedProps.get("_maxYWidth") === this._maxYWidth + ) { + return false; + } + return true; } protected willUpdate() { From f98eaf0c2d3cbf823f2ff6ad734778debc2779f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 13:15:43 +0200 Subject: [PATCH 024/102] Update vaadinWebComponents monorepo to v24.1.3 (#17250) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 166 +++++++++++++++++++++++++-------------------------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/package.json b/package.json index 4838f73498..ec33e72712 100644 --- a/package.json +++ b/package.json @@ -94,8 +94,8 @@ "@polymer/paper-toast": "3.0.1", "@polymer/polymer": "3.5.1", "@thomasloven/round-slider": "0.6.0", - "@vaadin/combo-box": "24.1.2", - "@vaadin/vaadin-themable-mixin": "24.1.2", + "@vaadin/combo-box": "24.1.3", + "@vaadin/vaadin-themable-mixin": "24.1.3", "@vibrant/color": "3.2.1-alpha.1", "@vibrant/core": "3.2.1-alpha.1", "@vibrant/quantizer-mmcq": "3.2.1-alpha.1", diff --git a/yarn.lock b/yarn.lock index 3dcac07cfd..7c4f7bb89a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4824,126 +4824,126 @@ __metadata: languageName: node linkType: hard -"@vaadin/a11y-base@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/a11y-base@npm:24.1.2" +"@vaadin/a11y-base@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/a11y-base@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~24.1.2 + "@vaadin/component-base": ~24.1.3 lit: ^2.0.0 - checksum: 66ce2a3f46a5cd7ba917018e09d39f7b97c611415edbc079dc0b309612d089fcb7aaaf28224c4f924c187664a651275c02698ffcb2fde6c19cdc9b8c562fff7f + checksum: f2e365ea5d77bec664e02499dde31ff12b7e636bc726d33944afd428cf8c613f5d0adb1fb29237caebba0937bafe1a8027e950246ecba822545c3a9079e56aaa languageName: node linkType: hard -"@vaadin/combo-box@npm:24.1.2": - version: 24.1.2 - resolution: "@vaadin/combo-box@npm:24.1.2" +"@vaadin/combo-box@npm:24.1.3": + version: 24.1.3 + resolution: "@vaadin/combo-box@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.2 - "@vaadin/component-base": ~24.1.2 - "@vaadin/field-base": ~24.1.2 - "@vaadin/input-container": ~24.1.2 - "@vaadin/item": ~24.1.2 - "@vaadin/lit-renderer": ~24.1.2 - "@vaadin/overlay": ~24.1.2 - "@vaadin/vaadin-lumo-styles": ~24.1.2 - "@vaadin/vaadin-material-styles": ~24.1.2 - "@vaadin/vaadin-themable-mixin": ~24.1.2 - checksum: 6f165bb337517c249d6796d8c42c3f24a4d58ad103de8fd983d2aa8cfa245f6082879713dc4ce4a69b1f163d0ec18737a8499e57880a23eb31cf9df974df9fd9 + "@vaadin/a11y-base": ~24.1.3 + "@vaadin/component-base": ~24.1.3 + "@vaadin/field-base": ~24.1.3 + "@vaadin/input-container": ~24.1.3 + "@vaadin/item": ~24.1.3 + "@vaadin/lit-renderer": ~24.1.3 + "@vaadin/overlay": ~24.1.3 + "@vaadin/vaadin-lumo-styles": ~24.1.3 + "@vaadin/vaadin-material-styles": ~24.1.3 + "@vaadin/vaadin-themable-mixin": ~24.1.3 + checksum: a31da1b4694a6d322156bb59af06b07bfdb6b7cbb8bb91ecc96d20969b42cfd70353faa2f44bc63e9ed97cfd20e29e8399402d885a70a0620588de9a73146e1d languageName: node linkType: hard -"@vaadin/component-base@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/component-base@npm:24.1.2" +"@vaadin/component-base@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/component-base@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 "@vaadin/vaadin-development-mode-detector": ^2.0.0 "@vaadin/vaadin-usage-statistics": ^2.1.0 lit: ^2.0.0 - checksum: 20299afe5c3247056d986b6bae2f680511e50ae47123ff41324c6110c5b77d6c61d7735475e19b4f3df52de57745ca567a5fdbaba2059883b8ffc444f9e2ac5e + checksum: 069c50059ea57c48e4ca02dee2e5624decadce90304c62bd32195beb368afd59a67e88c669fe6f31fb840bd8b3c5c7901d83787f50816cbb55b01f4488556700 languageName: node linkType: hard -"@vaadin/field-base@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/field-base@npm:24.1.2" +"@vaadin/field-base@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/field-base@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.2 - "@vaadin/component-base": ~24.1.2 + "@vaadin/a11y-base": ~24.1.3 + "@vaadin/component-base": ~24.1.3 lit: ^2.0.0 - checksum: 73112c1e524e8704d55ab3befaa0d6dcfa8e5c1621ea1e2bd7765cc88b2c567386cc75f2525b0900f7e9097e4fd90aa9e4eae5da3c79210ab9251a4d5f67ddb3 + checksum: bc06b5b4da182c2917108657557de379ffe79b38fd61d0dc28f872420b48c63eceed92410618513a0c19a35be06cc07367bf7d1cc570f8489b2adf5bc5355a6b languageName: node linkType: hard -"@vaadin/icon@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/icon@npm:24.1.2" +"@vaadin/icon@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/icon@npm:24.1.3" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~24.1.2 - "@vaadin/vaadin-lumo-styles": ~24.1.2 - "@vaadin/vaadin-themable-mixin": ~24.1.2 + "@vaadin/component-base": ~24.1.3 + "@vaadin/vaadin-lumo-styles": ~24.1.3 + "@vaadin/vaadin-themable-mixin": ~24.1.3 lit: ^2.0.0 - checksum: 976c81e9d7377e0fdce562db1324d8e7a0b564244aaf724c96d799fd0391bf67bb24487afb5296e786e7ad50dd3ab06f68b6054239a4d0342e0c27468a80f5ba + checksum: 0901f6e558d440f672e6ca80995f6fdcc4ec06fe1f8cf57f305a029213138299b472c1bf23755d5b539335bd6ff0c9d218a55d4f1de3c068da6427322b6e9634 languageName: node linkType: hard -"@vaadin/input-container@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/input-container@npm:24.1.2" +"@vaadin/input-container@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/input-container@npm:24.1.3" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~24.1.2 - "@vaadin/vaadin-lumo-styles": ~24.1.2 - "@vaadin/vaadin-material-styles": ~24.1.2 - "@vaadin/vaadin-themable-mixin": ~24.1.2 - checksum: 42f4dbb673aca9c1aa03198d6a2ca69d09d053824e1270d3ba44eb752cd3ad69f10bd4ecca46abda6f0761e6e2f367828c1e717a85e5f9bd29c1abc3063da48f + "@vaadin/component-base": ~24.1.3 + "@vaadin/vaadin-lumo-styles": ~24.1.3 + "@vaadin/vaadin-material-styles": ~24.1.3 + "@vaadin/vaadin-themable-mixin": ~24.1.3 + checksum: 429387239df99d36685b31d1264e4c4d04b2085c80da43cd0ae01836bce2ad7cbddcc557eca517b39686581622f8589b0d08f90026ad4d5cf34993b85eb96de2 languageName: node linkType: hard -"@vaadin/item@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/item@npm:24.1.2" +"@vaadin/item@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/item@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.2 - "@vaadin/component-base": ~24.1.2 - "@vaadin/vaadin-lumo-styles": ~24.1.2 - "@vaadin/vaadin-material-styles": ~24.1.2 - "@vaadin/vaadin-themable-mixin": ~24.1.2 - checksum: 000364ba1977bf29f88e1cfcde33e8fa0500a85094e104a89ae8933aebea35b52bee6da7cfe95ef8f016c13ee3632882f3c92964771ad23227494dc0361d9e59 + "@vaadin/a11y-base": ~24.1.3 + "@vaadin/component-base": ~24.1.3 + "@vaadin/vaadin-lumo-styles": ~24.1.3 + "@vaadin/vaadin-material-styles": ~24.1.3 + "@vaadin/vaadin-themable-mixin": ~24.1.3 + checksum: f6b89f9efb1c25a41f387a2585c5ef7d51058607a33f431456d539aa48b0fb3d655aee069a47418632c046c2064f08157113779979041a68b5b9ce9ef3504a2b languageName: node linkType: hard -"@vaadin/lit-renderer@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/lit-renderer@npm:24.1.2" +"@vaadin/lit-renderer@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/lit-renderer@npm:24.1.3" dependencies: lit: ^2.0.0 - checksum: 702291d1fcb02b28f5f82501247726a0055dd7c5067ea124c62c582208536ba929d5c0d78cb174105ae12b95c8cd1ffb934409c58be7e46072aadffdc4d010f1 + checksum: 2a906603ab8775de8be91323b9b5c820730531231c7ba82c655cba4bca411ef1aeb8679a440f888bf6b9577463ff54584bb61a668ee468dfd7d9755aee088337 languageName: node linkType: hard -"@vaadin/overlay@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/overlay@npm:24.1.2" +"@vaadin/overlay@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/overlay@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.2 - "@vaadin/component-base": ~24.1.2 - "@vaadin/vaadin-lumo-styles": ~24.1.2 - "@vaadin/vaadin-material-styles": ~24.1.2 - "@vaadin/vaadin-themable-mixin": ~24.1.2 - checksum: 228723c7928a940ddf957ce32249665ac713567b580217facdb3b77ab3604a65999f078e86d29300da46e7fb9621f98beffb4a23629a27be86297c47d24fba80 + "@vaadin/a11y-base": ~24.1.3 + "@vaadin/component-base": ~24.1.3 + "@vaadin/vaadin-lumo-styles": ~24.1.3 + "@vaadin/vaadin-material-styles": ~24.1.3 + "@vaadin/vaadin-themable-mixin": ~24.1.3 + checksum: e210a9b8cbb3edebea48dea196b95cc1369d2ceddeb0ba6bfb094b31147514f6e6a08c6f3a86d99e36a5e7b08e9913f5df3f89384e6907abca4eb3de2f33e68b languageName: node linkType: hard @@ -4954,34 +4954,34 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-lumo-styles@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/vaadin-lumo-styles@npm:24.1.2" +"@vaadin/vaadin-lumo-styles@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/vaadin-lumo-styles@npm:24.1.3" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/icon": ~24.1.2 - "@vaadin/vaadin-themable-mixin": ~24.1.2 - checksum: 1f389d3799e7411dd81b836e36a73f28fd471b98a3799a6d48297d968ca5f955142146152672522eb37c6ea52b4adcdf3874f5ae9e4a90efee0e4be0197c3c33 + "@vaadin/icon": ~24.1.3 + "@vaadin/vaadin-themable-mixin": ~24.1.3 + checksum: 54d94bde98a2c15e7410ada28f082e43c8db9d1d5ce0a5255f02467ff7db706c805d425c5d172d545fe844a4ced147f8828b50a6cff7bea8732d6cecf4fc1211 languageName: node linkType: hard -"@vaadin/vaadin-material-styles@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/vaadin-material-styles@npm:24.1.2" +"@vaadin/vaadin-material-styles@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/vaadin-material-styles@npm:24.1.3" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-themable-mixin": ~24.1.2 - checksum: 93662d887bc128fdaf1012efa9c361c0ac2397c748d20b6d21ec8c85eed0541aedcfeeb85c043456cea1e3867037662c8860772c2ab3eba2e25f083d777f229d + "@vaadin/vaadin-themable-mixin": ~24.1.3 + checksum: c1af4802118864fc37a0019c4369de9f05c570382982f1cc79e96f46617860e2db453d707d3671e133d66ca3040d741ec3a414af44eabb1375fb3cf15d951e2a languageName: node linkType: hard -"@vaadin/vaadin-themable-mixin@npm:24.1.2, @vaadin/vaadin-themable-mixin@npm:~24.1.2": - version: 24.1.2 - resolution: "@vaadin/vaadin-themable-mixin@npm:24.1.2" +"@vaadin/vaadin-themable-mixin@npm:24.1.3, @vaadin/vaadin-themable-mixin@npm:~24.1.3": + version: 24.1.3 + resolution: "@vaadin/vaadin-themable-mixin@npm:24.1.3" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 lit: ^2.0.0 - checksum: 7019857bc05976e1032610bb5af74754339e65e6ad279808c245636f44187196931f21b7b35fe39370098ac745683611168abe9929cd0d40d9ddf1120c9b39fb + checksum: b6a57ec5ce54907f61be82413494639500fd8ef9ae2dff58628369b9581bc442b88b4356c7ef9f9202ca1cc67677f1d489df56cd0ec2ea96a357976e583f582d languageName: node linkType: hard @@ -9717,8 +9717,8 @@ __metadata: "@types/webspeechapi": 0.0.29 "@typescript-eslint/eslint-plugin": 5.61.0 "@typescript-eslint/parser": 5.61.0 - "@vaadin/combo-box": 24.1.2 - "@vaadin/vaadin-themable-mixin": 24.1.2 + "@vaadin/combo-box": 24.1.3 + "@vaadin/vaadin-themable-mixin": 24.1.3 "@vibrant/color": 3.2.1-alpha.1 "@vibrant/core": 3.2.1-alpha.1 "@vibrant/quantizer-mmcq": 3.2.1-alpha.1 From 35a427afad34b08962de2d7da0f1847f62454826 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 10 Jul 2023 13:17:35 +0200 Subject: [PATCH 025/102] Update download-translations.js --- build-scripts/gulp/download-translations.js | 1 + 1 file changed, 1 insertion(+) diff --git a/build-scripts/gulp/download-translations.js b/build-scripts/gulp/download-translations.js index 9c2f2ddd12..a8cf9b536b 100644 --- a/build-scripts/gulp/download-translations.js +++ b/build-scripts/gulp/download-translations.js @@ -68,6 +68,7 @@ gulp.task("convert-backend-translations", function () { }); gulp.task("check-translations-html", function () { + // We exclude backend translations because they are not compliant with the HTML rule for now return gulp.src([`${inDirFrontend}/*.json`]).pipe(checkHtml()); }); From 228b75ae835f6b27148579e5fcd397a08997b69b Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 10 Jul 2023 13:33:50 +0200 Subject: [PATCH 026/102] Simplify script/automation action description with nested conditions/triggers (#17252) --- src/data/script_i18n.ts | 82 +++++++++------------------------------- src/translations/en.json | 9 +++-- 2 files changed, 23 insertions(+), 68 deletions(-) diff --git a/src/data/script_i18n.ts b/src/data/script_i18n.ts index 3cd8a36818..c6d4122b00 100644 --- a/src/data/script_i18n.ts +++ b/src/data/script_i18n.ts @@ -1,17 +1,18 @@ +import { ensureArray } from "../common/array/ensure-array"; import { formatDuration } from "../common/datetime/format_duration"; import secondsToDuration from "../common/datetime/seconds_to_duration"; -import { ensureArray } from "../common/array/ensure-array"; import { computeStateName } from "../common/entity/compute_state_name"; +import { formatListWithAnds } from "../common/string/format-list"; import { isTemplate } from "../common/string/has-template"; import { HomeAssistant } from "../types"; import { Condition } from "./automation"; -import { describeCondition, describeTrigger } from "./automation_i18n"; +import { describeCondition } from "./automation_i18n"; import { localizeDeviceAutomationAction } from "./device_automation"; import { computeDeviceName } from "./device_registry"; import { + EntityRegistryEntry, computeEntityRegistryName, entityRegistryById, - EntityRegistryEntry, } from "./entity_registry"; import { domainToName } from "./integration"; import { @@ -21,7 +22,6 @@ import { DelayAction, DeviceAction, EventAction, - getActionType, IfAction, ParallelAction, PlayMediaAction, @@ -30,8 +30,8 @@ import { StopAction, VariablesAction, WaitForTriggerAction, + getActionType, } from "./script"; -import { formatListWithAnds } from "../common/string/format-list"; const actionTranslationBaseKey = "ui.panel.config.automation.editor.actions.type"; @@ -273,12 +273,9 @@ const tryDescribeAction = ( `${actionTranslationBaseKey}.wait_for_trigger.description.wait_for_a_trigger` ); } - const triggerNames = triggers.map((trigger) => - describeTrigger(trigger, hass, entityRegistry) - ); return hass.localize( - `${actionTranslationBaseKey}.wait_for_trigger.description.wait_for_triggers_with_name`, - { triggers: formatListWithAnds(hass.locale, triggerNames) } + `${actionTranslationBaseKey}.wait_for_trigger.description.wait_for_triggers`, + { count: triggers.length } ); } @@ -326,52 +323,13 @@ const tryDescribeAction = ( if (actionType === "if") { const config = action as IfAction; - let ifConditions: string[] = []; - if (Array.isArray(config.if)) { - const conditions = ensureArray(config.if); - conditions.forEach((condition) => { - ifConditions.push(describeCondition(condition, hass, entityRegistry)); - }); - } else { - ifConditions = [config.if]; + if (config.else !== undefined) { + return hass.localize( + `${actionTranslationBaseKey}.if.description.if_else` + ); } - let elseActions: string[] = []; - if (config.else) { - if (Array.isArray(config.else)) { - const actions = ensureArray(config.else); - actions.forEach((currentAction) => { - elseActions.push( - describeAction(hass, entityRegistry, currentAction, undefined) - ); - }); - } else { - elseActions = [ - describeAction(hass, entityRegistry, config.else, undefined), - ]; - } - } - - let thenActions: string[] = []; - if (Array.isArray(config.then)) { - const actions = ensureArray(config.then); - actions.forEach((currentAction) => { - thenActions.push( - describeAction(hass, entityRegistry, currentAction, undefined) - ); - }); - } else { - thenActions = [ - describeAction(hass, entityRegistry, config.then, undefined), - ]; - } - - return hass.localize(`${actionTranslationBaseKey}.if.description.full`, { - hasElse: config.else !== undefined, - action: formatListWithAnds(hass.locale, thenActions), - conditions: formatListWithAnds(hass.locale, ifConditions), - elseAction: formatListWithAnds(hass.locale, elseActions), - }); + return hass.localize(`${actionTranslationBaseKey}.if.description.if`); } if (actionType === "choose") { @@ -400,20 +358,16 @@ const tryDescribeAction = ( { count: count } ); } else if ("while" in config.repeat) { - const conditions = ensureArray(config.repeat.while).map((condition) => - describeCondition(condition, hass, entityRegistry) - ); + const conditions = ensureArray(config.repeat.while); chosenAction = hass.localize( - `${actionTranslationBaseKey}.repeat.description.while`, - { conditions: formatListWithAnds(hass.locale, conditions) } + `${actionTranslationBaseKey}.repeat.description.while_count`, + { count: conditions.length } ); } else if ("until" in config.repeat) { - const conditions = ensureArray(config.repeat.until).map((condition) => - describeCondition(condition, hass, entityRegistry) - ); + const conditions = ensureArray(config.repeat.until); chosenAction = hass.localize( - `${actionTranslationBaseKey}.repeat.description.until`, - { conditions: formatListWithAnds(hass.locale, conditions) } + `${actionTranslationBaseKey}.repeat.description.until_count`, + { count: conditions.length } ); } else if ("for_each" in config.repeat) { const items = ensureArray(config.repeat.for_each).map((item) => diff --git a/src/translations/en.json b/src/translations/en.json index 44bf822d05..05ff2b775e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2621,7 +2621,7 @@ "continue_timeout": "[%key:ui::panel::config::automation::editor::actions::type::wait_template::continue_timeout%]", "description": { "wait_for_a_trigger": "Wait for a trigger", - "wait_for_triggers_with_name": "Wait for ''{triggers}''" + "wait_for_triggers": "Wait for {count} {count, plural,\n one {trigger}\n other {triggers}\n}" } }, "condition": { @@ -2679,8 +2679,8 @@ "description": { "full": "Repeat an action {chosenAction}", "count": "{count} {count, plural,\n one {time}\n other {times}\n}", - "while": "while ''{conditions}'' is true", - "until": "until ''{conditions}'' is true", + "while_count": "while {count} {count, plural,\n one {condition matches}\n other {conditions match}\n} ", + "until_count": "until {count} {count, plural,\n one {condition matches}\n other {conditions match}\n} ", "for_each": "for every item: {items}" } }, @@ -2705,7 +2705,8 @@ "else": "Else", "add_else": "Add else", "description": { - "full": "Perform ''{action}'' if ''{conditions}''{hasElse, select, \n true { otherwise ''{elseAction}''} \n other {}\n } " + "if": "Conditionally execute an action", + "if_else": "Conditionally execute an action and default to another action" } }, "stop": { From bffdfcf61c4833293e9782aef4bdcc7c7921152a Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 10 Jul 2023 15:01:16 +0200 Subject: [PATCH 027/102] Fix notification error when calling service (#17255) --- src/state/connection-mixin.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index 8ba5091a02..ac5b27773f 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -123,9 +123,10 @@ export const connectionMixin = >( `${domain}/${service}` ) + ` ${ - err.message || err.error?.code === ERR_CONNECTION_LOST + err.message || + (err.error?.code === ERR_CONNECTION_LOST ? "connection lost" - : "unknown error" + : "unknown error") }`; fireEvent(this as any, "hass-notification", { message }); throw err; From b1a909d30299486532f7ef683566295d3a282676 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 14:09:07 -0400 Subject: [PATCH 028/102] Update dependency babel-loader to v9.1.3 (#17262) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 105 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 82 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index ec33e72712..8662b23c01 100644 --- a/package.json +++ b/package.json @@ -188,7 +188,7 @@ "@typescript-eslint/parser": "5.61.0", "@web/dev-server": "0.1.38", "@web/dev-server-rollup": "0.4.1", - "babel-loader": "9.1.2", + "babel-loader": "9.1.3", "babel-plugin-template-html-minifier": "4.1.0", "chai": "4.3.7", "del": "7.0.0", diff --git a/yarn.lock b/yarn.lock index 7c4f7bb89a..f4dadab622 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6104,16 +6104,16 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:9.1.2": - version: 9.1.2 - resolution: "babel-loader@npm:9.1.2" +"babel-loader@npm:9.1.3": + version: 9.1.3 + resolution: "babel-loader@npm:9.1.3" dependencies: - find-cache-dir: ^3.3.2 + find-cache-dir: ^4.0.0 schema-utils: ^4.0.0 peerDependencies: "@babel/core": ^7.12.0 webpack: ">=5" - checksum: f0edb8e157f9806b810ba3f2c8ca8fa489d377ae5c2b7b00c2ace900a6925641ce4ec520b9c12f70e37b94aa5366e7003e0f6271b26821643e109966ce741cb7 + checksum: b168dde5b8cf11206513371a79f86bb3faa7c714e6ec9fffd420876b61f3d7f5f4b976431095ef6a14bc4d324505126deb91045fd41e312ba49f4deaa166fe28 languageName: node linkType: hard @@ -6989,6 +6989,13 @@ __metadata: languageName: node linkType: hard +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818 + languageName: node + linkType: hard + "common-tags@npm:^1.8.0": version: 1.8.2 resolution: "common-tags@npm:1.8.2" @@ -8673,14 +8680,13 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.3.2": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" +"find-cache-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "find-cache-dir@npm:4.0.0" dependencies: - commondir: ^1.0.1 - make-dir: ^3.0.2 - pkg-dir: ^4.1.0 - checksum: 1e61c2e64f5c0b1c535bd85939ae73b0e5773142713273818cc0b393ee3555fb0fd44e1a5b161b8b6c3e03e98c2fcc9c227d784850a13a90a8ab576869576817 + common-path-prefix: ^3.0.0 + pkg-dir: ^7.0.0 + checksum: 52a456a80deeb27daa3af6e06059b63bdb9cc4af4d845fc6d6229887e505ba913cd56000349caa60bc3aa59dacdb5b4c37903d4ba34c75102d83cab330b70d2f languageName: node linkType: hard @@ -8730,6 +8736,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^6.3.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: ^7.1.0 + path-exists: ^5.0.0 + checksum: 9a21b7f9244a420e54c6df95b4f6fc3941efd3c3e5476f8274eb452f6a85706e7a6a90de71353ee4f091fcb4593271a6f92810a324ec542650398f928783c280 + languageName: node + linkType: hard + "findup-sync@npm:^2.0.0": version: 2.0.0 resolution: "findup-sync@npm:2.0.0" @@ -9728,7 +9744,7 @@ __metadata: "@webcomponents/scoped-custom-element-registry": 0.0.9 "@webcomponents/webcomponentsjs": 2.8.0 app-datepicker: 5.1.1 - babel-loader: 9.1.2 + babel-loader: 9.1.3 babel-plugin-template-html-minifier: 4.1.0 chai: 4.3.7 chart.js: 3.3.2 @@ -11503,6 +11519,15 @@ __metadata: languageName: node linkType: hard +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: ^6.0.0 + checksum: c1b653bdf29beaecb3d307dfb7c44d98a2a98a02ebe353c9ad055d1ac45d6ed4e1142563d222df9b9efebc2bcb7d4c792b507fad9e7150a04c29530b7db570f8 + languageName: node + linkType: hard + "lodash._reinterpolate@npm:^3.0.0": version: 3.0.0 resolution: "lodash._reinterpolate@npm:3.0.0" @@ -11698,15 +11723,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^3.0.2": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: ^6.0.0 - checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - "make-fetch-happen@npm:^11.0.3": version: 11.1.1 resolution: "make-fetch-happen@npm:11.1.1" @@ -12715,6 +12731,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: ^1.0.0 + checksum: 01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b + languageName: node + linkType: hard + "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -12733,6 +12758,15 @@ __metadata: languageName: node linkType: hard +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: ^4.0.0 + checksum: 2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 + languageName: node + linkType: hard + "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" @@ -12945,6 +12979,13 @@ __metadata: languageName: node linkType: hard +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: 8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 + languageName: node + linkType: hard + "path-is-absolute@npm:1.0.1, path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -13134,7 +13175,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": +"pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -13143,6 +13184,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^7.0.0": + version: 7.0.0 + resolution: "pkg-dir@npm:7.0.0" + dependencies: + find-up: ^6.3.0 + checksum: 94298b20a446bfbbd66604474de8a0cdd3b8d251225170970f15d9646f633e056c80520dd5b4c1d1050c9fed8f6a9e5054b141c93806439452efe72e57562c03 + languageName: node + linkType: hard + "plugin-error@npm:0.1.2": version: 0.1.2 resolution: "plugin-error@npm:0.1.2" @@ -14072,7 +14122,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.0": +"semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" bin: @@ -16887,3 +16937,10 @@ __metadata: checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.0.0 + resolution: "yocto-queue@npm:1.0.0" + checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 + languageName: node + linkType: hard From bf4cf310f3fe1e1c75d285ed930f8780b1e948c1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 10 Jul 2023 14:37:15 -0400 Subject: [PATCH 029/102] Bump HAWS to 8.2.0 (#17263) --- package.json | 2 +- src/entrypoints/core.ts | 1 + src/onboarding/ha-onboarding.ts | 2 ++ yarn.lock | 10 +++++----- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8662b23c01..869d279cb6 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "fuse.js": "6.6.2", "google-timezones-json": "1.1.0", "hls.js": "1.4.8", - "home-assistant-js-websocket": "8.1.0", + "home-assistant-js-websocket": "8.2.0", "idb-keyval": "6.2.1", "intl-messageformat": "10.5.0", "js-yaml": "4.1.0", diff --git a/src/entrypoints/core.ts b/src/entrypoints/core.ts index cc92ddd5bc..d9467f11ca 100644 --- a/src/entrypoints/core.ts +++ b/src/entrypoints/core.ts @@ -65,6 +65,7 @@ const authProm = isExternal : () => getAuth({ hassUrl, + limitHassInstance: true, saveTokens, loadTokens: () => Promise.resolve(loadTokens()), }); diff --git a/src/onboarding/ha-onboarding.ts b/src/onboarding/ha-onboarding.ts index 956914856d..88b12140f1 100644 --- a/src/onboarding/ha-onboarding.ts +++ b/src/onboarding/ha-onboarding.ts @@ -211,6 +211,7 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { // First step is already done, so we need to get auth somewhere else. const auth = await getAuth({ hassUrl, + limitHassInstance: true, }); history.replaceState(null, "", location.pathname); await this._connectHass(auth); @@ -237,6 +238,7 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { try { const auth = await getAuth({ hassUrl, + limitHassInstance: true, authCode: result.auth_code, }); await this._connectHass(auth); diff --git a/yarn.lock b/yarn.lock index f4dadab622..be693c0a47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9780,7 +9780,7 @@ __metadata: gulp-rename: 2.0.0 gulp-zopfli-green: 6.0.1 hls.js: 1.4.8 - home-assistant-js-websocket: 8.1.0 + home-assistant-js-websocket: 8.2.0 html-minifier-terser: 7.2.0 husky: 8.0.3 idb-keyval: 6.2.1 @@ -9854,10 +9854,10 @@ __metadata: languageName: unknown linkType: soft -"home-assistant-js-websocket@npm:8.1.0": - version: 8.1.0 - resolution: "home-assistant-js-websocket@npm:8.1.0" - checksum: 74f9afc5affe491921d7fd9e743c1a6841cb0409c2c5454fff266d14ea893f5be476cb85f584ff1836722de77cfe2777d4133890f00fc1983ad448eba50f6240 +"home-assistant-js-websocket@npm:8.2.0": + version: 8.2.0 + resolution: "home-assistant-js-websocket@npm:8.2.0" + checksum: 4eacdfe8d1bd35492ff77079779e2e0a1967b20a46b168752d8c037bf155fa5d2a8e898e7d1aee5514976d93589d26fe2d6c1975e4fcb039b0beff852564c64c languageName: node linkType: hard From e46f0224c68ed3736f3a85e7802d03733f4500a0 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 11 Jul 2023 02:37:04 +0200 Subject: [PATCH 030/102] Add support for service translations (#17264) * Add support for service translations * Add selector translation support --- src/components/ha-service-control.ts | 50 ++++++++++++++++--- src/components/ha-service-description.js | 27 ---------- src/components/ha-service-picker.ts | 12 ++++- src/data/script_i18n.ts | 6 ++- src/data/translation.ts | 3 +- src/panels/config/ha-panel-config.ts | 1 + .../zha/zha-add-devices-page.ts | 7 --- .../integration-panels/zha/zha-device-card.ts | 1 - .../zha/zha-device-pairing-status-card.ts | 1 - src/panels/lovelace/common/handle-action.ts | 7 ++- 10 files changed, 67 insertions(+), 48 deletions(-) delete mode 100644 src/components/ha-service-description.js diff --git a/src/components/ha-service-control.ts b/src/components/ha-service-control.ts index 21e5289e5f..5abd368056 100644 --- a/src/components/ha-service-control.ts +++ b/src/components/ha-service-control.ts @@ -89,6 +89,10 @@ export class HaServiceControl extends LitElement { @query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor; protected willUpdate(changedProperties: PropertyValues) { + if (!this.hasUpdated) { + this.hass.loadBackendTranslation("services"); + this.hass.loadBackendTranslation("selector"); + } if (!changedProperties.has("value")) { return; } @@ -342,6 +346,20 @@ export class HaServiceControl extends LitElement { const filteredFields = this._filterFields(serviceData, this._value); + const domain = this._value?.service + ? computeDomain(this._value.service) + : undefined; + const serviceName = this._value?.service + ? computeObjectId(this._value.service) + : undefined; + + const description = + (serviceName && + this.hass.localize( + `component.${domain}.services.${serviceName}.description` + )) || + serviceData?.description; + return html`
- ${serviceData?.description - ? html`

${serviceData?.description}

` - : ""} + ${description ? html`

${description}

` : ""} ${this._manifest ? html` ` @@ -437,8 +455,18 @@ export class HaServiceControl extends LitElement { @change=${this._checkboxChanged} slot="prefix" >`} - ${dataField.name || dataField.key} - ${dataField?.description} + ${this.hass.localize( + `component.${domain}.services.${serviceName}.fields.${dataField.key}.name` + ) || + dataField.name || + dataField.key} + ${this.hass.localize( + `component.${domain}.services.${serviceName}.fields.${dataField.key}.description` + ) || dataField?.description} ` : ""; })}`; } + private _localizeValueCallback = (key: string) => { + if (!this._value?.service) { + return ""; + } + return this.hass.localize( + `component.${computeDomain(this._value.service)}.selector.${key}` + ); + }; + private _checkboxChanged(ev) { const checked = ev.currentTarget.checked; const key = ev.currentTarget.key; diff --git a/src/components/ha-service-description.js b/src/components/ha-service-description.js deleted file mode 100644 index c2d3359bcc..0000000000 --- a/src/components/ha-service-description.js +++ /dev/null @@ -1,27 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -class HaServiceDescription extends PolymerElement { - static get template() { - return html` [[_getDescription(hass, domain, service)]] `; - } - - static get properties() { - return { - hass: Object, - domain: String, - service: String, - }; - } - - _getDescription(hass, domain, service) { - const domainServices = hass.services[domain]; - if (!domainServices) return ""; - const serviceObject = domainServices[service]; - if (!serviceObject) return ""; - return serviceObject.description; - } -} - -customElements.define("ha-service-description", HaServiceDescription); diff --git a/src/components/ha-service-picker.ts b/src/components/ha-service-picker.ts index 76532a331d..9ef0dc670a 100644 --- a/src/components/ha-service-picker.ts +++ b/src/components/ha-service-picker.ts @@ -27,6 +27,12 @@ class HaServicePicker extends LitElement { @state() private _filter?: string; + protected willUpdate() { + if (!this.hasUpdated) { + this.hass.loadBackendTranslation("services"); + } + } + protected render() { return html` ( if (config.service) { const [domain, serviceName] = config.service.split(".", 2); - const service = hass.services[domain][serviceName]; + const service = + hass.localize(`component.${domain}.services.${serviceName}.name`) || + hass.services[domain][serviceName]?.name; return hass.localize( `${actionTranslationBaseKey}.service.description.service_based_on_name`, { name: service - ? `${domainToName(hass.localize, domain)}: ${service.name}` + ? `${domainToName(hass.localize, domain)}: ${service}` : config.service, targets: formatListWithAnds(hass.locale, targets), } diff --git a/src/data/translation.ts b/src/data/translation.ts index 99a7f7b521..bc8165578a 100644 --- a/src/data/translation.ts +++ b/src/data/translation.ts @@ -69,7 +69,8 @@ export type TranslationCategory = | "system_health" | "application_credentials" | "issues" - | "selector"; + | "selector" + | "services"; export const fetchTranslationPreferences = (hass: HomeAssistant) => fetchFrontendUserData(hass.connection, "language"); diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index 7004f32a5f..2db32736be 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -574,6 +574,7 @@ class HaPanelConfig extends SubscribeMixin(HassRouterPage) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); this.hass.loadBackendTranslation("title"); + this.hass.loadBackendTranslation("services"); if (isComponentLoaded(this.hass, "cloud")) { this._updateCloudStatus(); this.addEventListener("connection-status", (ev) => { diff --git a/src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts b/src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts index 31d30b88fd..f75b9607bb 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-add-devices-page.ts @@ -10,7 +10,6 @@ import { } from "lit"; import { customElement, property, state } from "lit/decorators"; import "../../../../../components/ha-circular-progress"; -import "../../../../../components/ha-service-description"; import { DEVICE_MESSAGE_TYPES, LOG_OUTPUT, @@ -259,12 +258,6 @@ class ZHAAddDevicesPage extends LitElement { right: 0; color: var(--primary-color); } - ha-service-description { - margin-top: 16px; - margin-left: 16px; - display: block; - color: grey; - } .search-button { margin-top: 16px; margin-left: 16px; 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 7bbc64fa67..5d4f476491 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 @@ -11,7 +11,6 @@ import "../../../../../components/buttons/ha-call-service-button"; import "../../../../../components/entity/state-badge"; import "../../../../../components/ha-area-picker"; import "../../../../../components/ha-card"; -import "../../../../../components/ha-service-description"; import { updateDeviceRegistryEntry } from "../../../../../data/device_registry"; import { EntityRegistryEntry, diff --git a/src/panels/config/integrations/integration-panels/zha/zha-device-pairing-status-card.ts b/src/panels/config/integrations/integration-panels/zha/zha-device-pairing-status-card.ts index 42768533ce..c4a8668ebd 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-device-pairing-status-card.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-device-pairing-status-card.ts @@ -6,7 +6,6 @@ import "../../../../../components/buttons/ha-call-service-button"; import "../../../../../components/entity/state-badge"; import "../../../../../components/ha-area-picker"; import "../../../../../components/ha-card"; -import "../../../../../components/ha-service-description"; import { CONFIGURED, INCOMPLETE_PAIRING_STATUSES, diff --git a/src/panels/lovelace/common/handle-action.ts b/src/panels/lovelace/common/handle-action.ts index 83deadf5db..febf1c848f 100644 --- a/src/panels/lovelace/common/handle-action.ts +++ b/src/panels/lovelace/common/handle-action.ts @@ -60,9 +60,12 @@ export const handleAction = async ( const [domain, service] = actionConfig.service.split(".", 2); const serviceDomains = hass.services; if (domain in serviceDomains && service in serviceDomains[domain]) { - const localize = await hass.loadBackendTranslation("title"); + await hass.loadBackendTranslation("title"); + const localize = await hass.loadBackendTranslation("services"); serviceName = `${domainToName(localize, domain)}: ${ - serviceDomains[domain][service].name || service + localize(`component.${domain}.services.${serviceName}.name`) || + serviceDomains[domain][service].name || + service }`; } } From 2298d2b7ca0f37de86e1a1f15a4cd83181b6e683 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:42:49 -0400 Subject: [PATCH 031/102] Bump semver from 5.7.1 to 5.7.2 (#17271) Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index be693c0a47..e5ef3782ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14114,11 +14114,11 @@ __metadata: linkType: hard "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.7.1": - version: 5.7.1 - resolution: "semver@npm:5.7.1" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 languageName: node linkType: hard From 9f55c06dfcd8b8699580cb7e315e88d5742812be Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:44:18 -0400 Subject: [PATCH 032/102] Update dependency glob to v10.3.2 (#17270) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 869d279cb6..1b34ac076a 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "esprima": "4.0.1", "fancy-log": "2.0.0", "fs-extra": "11.1.1", - "glob": "10.3.1", + "glob": "10.3.2", "gulp": "4.0.2", "gulp-flatmap": "1.0.2", "gulp-json-transform": "0.4.8", diff --git a/yarn.lock b/yarn.lock index e5ef3782ab..15c20c02af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9204,18 +9204,18 @@ __metadata: languageName: node linkType: hard -"glob@npm:10.3.1, glob@npm:^10.2.2": - version: 10.3.1 - resolution: "glob@npm:10.3.1" +"glob@npm:10.3.2, glob@npm:^10.2.2": + version: 10.3.2 + resolution: "glob@npm:10.3.2" dependencies: foreground-child: ^3.1.0 jackspeak: ^2.0.3 minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 - path-scurry: ^1.10.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 bin: glob: dist/cjs/src/bin.js - checksum: 19c8c2805658b1002fecf0722cd609a33153d756a0d5260676bd0e9c5e6ef889ec9cce6d3dac0411aa90bce8de3d14f25b6f5589a3292582cccbfeddd0e98cc4 + checksum: 3b4f455192d18eb1cf41a9193c825f594a70323b522f290d4b75191d3e399791f9da1febef339392a9828c03a3bf2b96e0b32cc8efb0068c2b11df585026a367 languageName: node linkType: hard @@ -9771,7 +9771,7 @@ __metadata: fancy-log: 2.0.0 fs-extra: 11.1.1 fuse.js: 6.6.2 - glob: 10.3.1 + glob: 10.3.2 google-timezones-json: 1.1.0 gulp: 4.0.2 gulp-flatmap: 1.0.2 @@ -12076,10 +12076,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2": - version: 6.0.2 - resolution: "minipass@npm:6.0.2" - checksum: d140b91f4ab2e5ce5a9b6c468c0e82223504acc89114c1a120d4495188b81fedf8cade72a9f4793642b4e66672f990f1e0d902dd858485216a07cd3c8a62fac9 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": + version: 7.0.1 + resolution: "minipass@npm:7.0.1" + checksum: fedd1293f6a1b4e406c242a1cecfb75d0a81422bb2c365d999e33a88642fb68d70a89d95b550e08c640b3c0d9162829310e0c58b9b846b9218de25779818c709 languageName: node linkType: hard @@ -13037,13 +13037,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.0": - version: 1.10.0 - resolution: "path-scurry@npm:1.10.0" +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" dependencies: lru-cache: ^9.1.1 || ^10.0.0 - minipass: ^5.0.0 || ^6.0.2 - checksum: 3b66a4a6ab66e45755b577c966ecf0da92d3e068b3c992d8f69aa2cc908ef4eda9358253e9b4f86cad43d3ad810ec445be164105975f5cb3fdab68459c59dc6e + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 languageName: node linkType: hard From 9866a3217e95c9324a0a9554cda787a07d206ad4 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 11 Jul 2023 14:35:37 +0200 Subject: [PATCH 033/102] Prevent items in add integration dialog from flickering (#17260) --- src/panels/config/integrations/dialog-add-integration.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/panels/config/integrations/dialog-add-integration.ts b/src/panels/config/integrations/dialog-add-integration.ts index 02935336c0..eed4036670 100644 --- a/src/panels/config/integrations/dialog-add-integration.ts +++ b/src/panels/config/integrations/dialog-add-integration.ts @@ -443,6 +443,7 @@ class AddIntegrationDialog extends LitElement { })} @click=${this._integrationPicked} .items=${integrations} + .keyFunction=${this._keyFunction} .renderItem=${this._renderRow} > @@ -450,6 +451,9 @@ class AddIntegrationDialog extends LitElement { : html``} `; } + private _keyFunction = (integration: IntegrationListItem) => + integration.domain; + private _renderRow = (integration: IntegrationListItem) => { if (!integration) { return nothing; From 04ec380ce062798a655618d4d15fb2882c50ebe3 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Tue, 11 Jul 2023 05:38:36 -0700 Subject: [PATCH 034/102] Prune empty value_template field from numeric_state (#17272) --- .../ha-automation-condition-numeric_state.ts | 16 ++++++++++------ .../types/ha-automation-trigger-numeric_state.ts | 4 ++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts b/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts index 0a9003c72e..a7458813db 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts @@ -237,15 +237,19 @@ export default class HaNumericStateCondition extends LitElement { private _valueChanged(ev: CustomEvent): void { ev.stopPropagation(); - const newTrigger = ev.detail.value; + const newCondition = ev.detail.value; - this._inputAboveIsEntity = newTrigger.mode_above === "input"; - this._inputBelowIsEntity = newTrigger.mode_below === "input"; + this._inputAboveIsEntity = newCondition.mode_above === "input"; + this._inputBelowIsEntity = newCondition.mode_below === "input"; - delete newTrigger.mode_above; - delete newTrigger.mode_below; + delete newCondition.mode_above; + delete newCondition.mode_below; - fireEvent(this, "value-changed", { value: newTrigger }); + if (newCondition.value_template === "") { + delete newCondition.value_template; + } + + fireEvent(this, "value-changed", { value: newCondition }); } private _computeLabelCallback = ( diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts index 29cb0362cd..62315025a4 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts @@ -288,6 +288,10 @@ export class HaNumericStateTrigger extends LitElement { delete newTrigger.mode_above; delete newTrigger.mode_below; + if (newTrigger.value_template === "") { + delete newTrigger.value_template; + } + fireEvent(this, "value-changed", { value: newTrigger }); } From 33b9786ae77f0b1fa31fc06f1a8f9bf6c711c774 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 11 Jul 2023 14:54:38 +0200 Subject: [PATCH 035/102] =?UTF-8?q?`start=5Fpause`=20is=20only=20supported?= =?UTF-8?q?=20on=20entities=20that=20don't=20have=20`STATE`=20sup=E2=80=A6?= =?UTF-8?q?=20(#17147)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `start_pause` is only support on entities that don't have `STATE` support * Update hui-vacuum-commands-tile-feature.ts * Add comment --- src/dialogs/more-info/controls/more-info-vacuum.ts | 10 +++++++--- .../tile-features/hui-vacuum-commands-tile-feature.ts | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts index c470b33cba..d1ca0ae75c 100644 --- a/src/dialogs/more-info/controls/more-info-vacuum.ts +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -43,9 +43,11 @@ const VACUUM_COMMANDS: VacuumCommand[] = [ icon: mdiPause, serviceName: "pause", isVisible: (stateObj) => - // We need also to check if Start is supported because if not we show play-pause - supportsFeature(stateObj, VacuumEntityFeature.START) && - supportsFeature(stateObj, VacuumEntityFeature.PAUSE), + // We need also to check if Start is supported because if not we show start-pause + // Start-pause service is only available for old vacuum entities, new entities have the `STATE` feature + supportsFeature(stateObj, VacuumEntityFeature.PAUSE) && + (supportsFeature(stateObj, VacuumEntityFeature.STATE) || + supportsFeature(stateObj, VacuumEntityFeature.START)), }, { translationKey: "start_pause", @@ -53,6 +55,8 @@ const VACUUM_COMMANDS: VacuumCommand[] = [ serviceName: "start_pause", isVisible: (stateObj) => // If start is supported, we don't show this button + // This service is only available for old vacuum entities, new entities have the `STATE` feature + !supportsFeature(stateObj, VacuumEntityFeature.STATE) && !supportsFeature(stateObj, VacuumEntityFeature.START) && supportsFeature(stateObj, VacuumEntityFeature.PAUSE), }, diff --git a/src/panels/lovelace/tile-features/hui-vacuum-commands-tile-feature.ts b/src/panels/lovelace/tile-features/hui-vacuum-commands-tile-feature.ts index 3c4119511c..f4079030dd 100644 --- a/src/panels/lovelace/tile-features/hui-vacuum-commands-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-vacuum-commands-tile-feature.ts @@ -63,6 +63,8 @@ export const VACUUM_COMMANDS_BUTTONS: Record< > = { start_pause: (stateObj) => { const startPauseOnly = + // This service is only available for old vacuum entities, new entities have the `STATE` feature + !supportsFeature(stateObj, VacuumEntityFeature.STATE) && !supportsFeature(stateObj, VacuumEntityFeature.START) && supportsFeature(stateObj, VacuumEntityFeature.PAUSE); From 606b96f6fdb034358f74a2e6badd94bb72228826 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 11 Jul 2023 15:00:12 +0200 Subject: [PATCH 036/102] Fix history issue when closing more info dialog by clicking update (#17257) * Fix history issue when closing more info dialog by clicking update * Remove hideMoreInfoDialog function --- src/dialogs/more-info/show-ha-more-info-dialog.ts | 3 --- .../editor-tabs/settings/entity-settings-helper-tab.ts | 3 +-- src/panels/config/entities/entity-registry-settings.ts | 3 +-- src/panels/config/entities/ha-config-entities.ts | 10 +--------- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/dialogs/more-info/show-ha-more-info-dialog.ts b/src/dialogs/more-info/show-ha-more-info-dialog.ts index b5a4197979..de6d688fec 100644 --- a/src/dialogs/more-info/show-ha-more-info-dialog.ts +++ b/src/dialogs/more-info/show-ha-more-info-dialog.ts @@ -5,6 +5,3 @@ export const showMoreInfoDialog = ( element: HTMLElement, params: MoreInfoDialogParams ) => fireEvent(element, "hass-more-info", params); - -export const hideMoreInfoDialog = (element: HTMLElement) => - fireEvent(element, "hass-more-info", { entityId: null }); diff --git a/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts b/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts index 26ba5b9639..dd42f8b34e 100644 --- a/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts +++ b/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts @@ -16,7 +16,6 @@ import { } from "../../../../../data/entity_registry"; import { HELPERS_CRUD } from "../../../../../data/helpers_crud"; import { showConfirmationDialog } from "../../../../../dialogs/generic/show-dialog-box"; -import { hideMoreInfoDialog } from "../../../../../dialogs/more-info/show-ha-more-info-dialog"; import { haStyle } from "../../../../../resources/styles"; import type { HomeAssistant } from "../../../../../types"; import type { Helper } from "../../../helpers/const"; @@ -151,7 +150,7 @@ export class EntityRegistrySettingsHelper extends LitElement { } const result = await this._registryEditor!.updateEntry(); if (result.close) { - hideMoreInfoDialog(this); + fireEvent(this, "close-dialog"); } } catch (err: any) { this._error = err.message || "Unknown error"; diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index c8c32701f8..f8ed357167 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -22,7 +22,6 @@ import { showAlertDialog, showConfirmationDialog, } from "../../../dialogs/generic/show-dialog-box"; -import { hideMoreInfoDialog } from "../../../dialogs/more-info/show-ha-more-info-dialog"; import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; @@ -200,7 +199,7 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { try { const result = await this._registryEditor!.updateEntry(); if (result.close) { - hideMoreInfoDialog(this); + fireEvent(this, "close-dialog"); } } catch (err: any) { this._error = err.message || "Unknown error"; diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index fb4673059b..67b0b4e5bb 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -55,10 +55,7 @@ import { showAlertDialog, showConfirmationDialog, } from "../../../dialogs/generic/show-dialog-box"; -import { - hideMoreInfoDialog, - showMoreInfoDialog, -} from "../../../dialogs/more-info/show-ha-more-info-dialog"; +import { showMoreInfoDialog } from "../../../dialogs/more-info/show-ha-more-info-dialog"; import "../../../layouts/hass-loading-screen"; import "../../../layouts/hass-tabs-subpage-data-table"; import type { HaTabsSubpageDataTable } from "../../../layouts/hass-tabs-subpage-data-table"; @@ -487,11 +484,6 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { ]; } - public disconnectedCallback() { - super.disconnectedCallback(); - hideMoreInfoDialog(this); - } - protected render() { if (!this.hass || this._entities === undefined) { return html` `; From 52d717a86bec0531b8c9ed1f2cc636fb7d13c5a8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 09:10:21 -0400 Subject: [PATCH 037/102] Update dependency glob to v10.3.3 (#17281) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 1b34ac076a..5d40650f5f 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "esprima": "4.0.1", "fancy-log": "2.0.0", "fs-extra": "11.1.1", - "glob": "10.3.2", + "glob": "10.3.3", "gulp": "4.0.2", "gulp-flatmap": "1.0.2", "gulp-json-transform": "0.4.8", diff --git a/yarn.lock b/yarn.lock index 15c20c02af..d8f866b844 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9204,9 +9204,9 @@ __metadata: languageName: node linkType: hard -"glob@npm:10.3.2, glob@npm:^10.2.2": - version: 10.3.2 - resolution: "glob@npm:10.3.2" +"glob@npm:10.3.3, glob@npm:^10.2.2": + version: 10.3.3 + resolution: "glob@npm:10.3.3" dependencies: foreground-child: ^3.1.0 jackspeak: ^2.0.3 @@ -9215,7 +9215,7 @@ __metadata: path-scurry: ^1.10.1 bin: glob: dist/cjs/src/bin.js - checksum: 3b4f455192d18eb1cf41a9193c825f594a70323b522f290d4b75191d3e399791f9da1febef339392a9828c03a3bf2b96e0b32cc8efb0068c2b11df585026a367 + checksum: 29190d3291f422da0cb40b77a72fc8d2c51a36524e99b8bf412548b7676a6627489528b57250429612b6eec2e6fe7826d328451d3e694a9d15e575389308ec53 languageName: node linkType: hard @@ -9771,7 +9771,7 @@ __metadata: fancy-log: 2.0.0 fs-extra: 11.1.1 fuse.js: 6.6.2 - glob: 10.3.2 + glob: 10.3.3 google-timezones-json: 1.1.0 gulp: 4.0.2 gulp-flatmap: 1.0.2 From 5ed348aa56e24d72456681afd578678a23ea41a4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 12 Jul 2023 11:54:33 -0400 Subject: [PATCH 038/102] Add download button to assist sentence parser dev tool (#17265) * Add download button to assist sentence parser dev tool * Use outlined button * BLOCK --- src/components/ha-button.ts | 1 + .../assist/developer-tools-assist.ts | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/components/ha-button.ts b/src/components/ha-button.ts index 959f679431..df7bdf46e5 100644 --- a/src/components/ha-button.ts +++ b/src/components/ha-button.ts @@ -12,6 +12,7 @@ export class HaButton extends Button { margin-inline-start: 0px; margin-inline-end: 8px; direction: var(--direction); + display: block; } .mdc-button { height: var(--button-height, 36px); diff --git a/src/panels/developer-tools/assist/developer-tools-assist.ts b/src/panels/developer-tools/assist/developer-tools-assist.ts index 9080e13394..32d5dcfcd6 100644 --- a/src/panels/developer-tools/assist/developer-tools-assist.ts +++ b/src/panels/developer-tools/assist/developer-tools-assist.ts @@ -1,3 +1,4 @@ +import { mdiDownload } from "@mdi/js"; import { dump } from "js-yaml"; import { CSSResultGroup, LitElement, css, html, nothing } from "lit"; import { customElement, property, query, state } from "lit/decorators"; @@ -16,6 +17,7 @@ import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { formatLanguageCode } from "../../../common/language/format_language"; import { storage } from "../../../common/decorators/storage"; +import { fileDownload } from "../../../util/file_download"; type SentenceParsingResult = { sentence: string; @@ -146,6 +148,16 @@ class HaPanelDevAssist extends SubscribeMixin(LitElement) {
+ ${this._results.length + ? html` +
+ + + Download Results + +
+ ` + : ""} ${this._results.map((r) => { const { sentence, result, language } = r; const matched = result != null; @@ -182,6 +194,15 @@ class HaPanelDevAssist extends SubscribeMixin(LitElement) { `; } + private _download() { + fileDownload( + `data:text/plain;charset=utf-8,${encodeURIComponent( + JSON.stringify({ results: this._results }, null, 2) + )}`, + `intent_results.json` + ); + } + static get styles(): CSSResultGroup { return [ haStyle, @@ -208,6 +229,10 @@ class HaPanelDevAssist extends SubscribeMixin(LitElement) { .form { margin-bottom: 16px; } + .result-toolbar { + text-align: center; + margin-bottom: 16px; + } .result { margin-bottom: 16px; } From 3a4d2db8ffd83a3eaf9fadd7d9f16999c8452486 Mon Sep 17 00:00:00 2001 From: Domantas Petrauskas Date: Thu, 13 Jul 2023 10:34:20 +0300 Subject: [PATCH 039/102] Fix overflow on sensor card (#17284) --- src/panels/lovelace/cards/hui-sensor-card.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 71b7282ce6..ee7937e544 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -76,6 +76,9 @@ class HuiSensorCard extends HuiEntityCard { return [ HuiEntityCard.styles, css` + ha-card { + overflow: hidden; + } .info { direction: ltr; text-align: var(--float-start); From 158a816f7a36e5e6ef7c6e290282d44d7dd509de Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 13 Jul 2023 04:20:51 -0700 Subject: [PATCH 040/102] Consistently treat `standby` as a non-active state for media_player (#17289) Consistently treat standby as an off state for media_player --- src/data/media-player.ts | 3 ++- .../more-info/controls/more-info-media_player.ts | 8 ++++---- src/panels/lovelace/cards/hui-media-control-card.ts | 6 ++++-- .../entity-rows/hui-media-player-entity-row.ts | 12 ++++++------ 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/data/media-player.ts b/src/data/media-player.ts index c666c0ec52..0e3ca09160 100644 --- a/src/data/media-player.ts +++ b/src/data/media-player.ts @@ -33,6 +33,7 @@ import type { HassEntityBase, } from "home-assistant-js-websocket"; import { supportsFeature } from "../common/entity/supports-feature"; +import { stateActive } from "../common/entity/state_active"; import { MediaPlayerItemId } from "../components/media-player/ha-media-player-browse"; import type { HomeAssistant, TranslationDict } from "../types"; import { isUnavailableState } from "./entity"; @@ -270,7 +271,7 @@ export const computeMediaControls = ( return undefined; } - if (state === "off") { + if (!stateActive(stateObj)) { return supportsFeature(stateObj, MediaPlayerEntityFeature.TURN_ON) ? [ { diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts index b02fc75e9d..047605cd8a 100644 --- a/src/dialogs/more-info/controls/more-info-media_player.ts +++ b/src/dialogs/more-info/controls/more-info-media_player.ts @@ -15,12 +15,12 @@ import { stopPropagation } from "../../../common/dom/stop_propagation"; import { computeAttributeValueDisplay } from "../../../common/entity/compute_attribute_display"; import { supportsFeature } from "../../../common/entity/supports-feature"; import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import { stateActive } from "../../../common/entity/state_active"; import "../../../components/ha-icon-button"; import "../../../components/ha-select"; import "../../../components/ha-slider"; import "../../../components/ha-svg-icon"; import { showMediaBrowserDialog } from "../../../components/media-player/show-media-browser-dialog"; -import { UNAVAILABLE, UNKNOWN } from "../../../data/entity"; import { computeMediaControls, handleMediaControlClick, @@ -83,7 +83,7 @@ class MoreInfoMediaPlayer extends LitElement {
${(supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_SET) || supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_BUTTONS)) && - ![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state) + stateActive(stateObj) ? html`
${supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_MUTE) @@ -141,7 +141,7 @@ class MoreInfoMediaPlayer extends LitElement {
` : ""} - ${![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state) && + ${stateActive(stateObj) && supportsFeature(stateObj, MediaPlayerEntityFeature.SELECT_SOURCE) && stateObj.attributes.source_list?.length ? html` @@ -176,7 +176,7 @@ class MoreInfoMediaPlayer extends LitElement {
` : ""} - ${![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state) && + ${stateActive(stateObj) && supportsFeature(stateObj, MediaPlayerEntityFeature.SELECT_SOUND_MODE) && stateObj.attributes.sound_mode_list?.length ? html` diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index 4a5af932ce..aa8074d220 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -17,6 +17,7 @@ import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { supportsFeature } from "../../../common/entity/supports-feature"; import { extractColors } from "../../../common/image/extract_color"; +import { stateActive } from "../../../common/entity/state_active"; import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-card"; import "../../../components/ha-icon-button"; @@ -169,10 +170,11 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { const entityState = stateObj.state; - const isOffState = entityState === "off"; + const isOffState = + !stateActive(stateObj) && !isUnavailableState(entityState); const isUnavailable = isUnavailableState(entityState) || - (entityState === "off" && + (isOffState && !supportsFeature(stateObj, MediaPlayerEntityFeature.TURN_ON)); const hasNoImage = !this._image; const controls = computeMediaControls(stateObj, false); diff --git a/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts b/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts index f2f481ad46..ab2de02d9a 100644 --- a/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-media-player-entity-row.ts @@ -24,10 +24,11 @@ import { customElement, property, state } from "lit/decorators"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import { supportsFeature } from "../../../common/entity/supports-feature"; import { computeRTLDirection } from "../../../common/util/compute_rtl"; +import { stateActive } from "../../../common/entity/state_active"; import { debounce } from "../../../common/util/debounce"; import "../../../components/ha-icon-button"; import "../../../components/ha-slider"; -import { isUnavailableState, UNAVAILABLE, UNKNOWN } from "../../../data/entity"; +import { isUnavailableState } from "../../../data/entity"; import { computeMediaDescription, ControlButton, @@ -199,7 +200,7 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow { >
${supportsFeature(stateObj, MediaPlayerEntityFeature.TURN_ON) && - entityState === "off" && + !stateActive(stateObj) && !isUnavailableState(entityState) ? html` ${(supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_SET) || supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_BUTTONS)) && - ![UNAVAILABLE, UNKNOWN, "off"].includes(entityState) + stateActive(stateObj) ? html`
@@ -330,7 +330,7 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow { this.hass!.callService( "media_player", - stateObj.state === "off" ? "turn_on" : "turn_off", + stateActive(stateObj) ? "turn_off" : "turn_on", { entity_id: this._config!.entity, } From e2ec3b63ce8e196634879eaacc06b1c441a81721 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 13 Jul 2023 16:33:12 +0200 Subject: [PATCH 041/102] Fix autocorrect and spellcheck for ha-textfield (#17274) --- src/components/ha-combo-box.ts | 2 +- src/components/ha-textfield.ts | 19 +++++++++++++++++++ .../entity-registry-settings-editor.ts | 4 ++++ .../state/developer-tools-state.js | 2 +- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/components/ha-combo-box.ts b/src/components/ha-combo-box.ts index 4b6c9b1ed5..ca549b7567 100644 --- a/src/components/ha-combo-box.ts +++ b/src/components/ha-combo-box.ts @@ -173,7 +173,7 @@ export class HaComboBox extends LitElement { autocapitalize="none" autocomplete="off" autocorrect="off" - spellcheck="false" + input-spellcheck="false" .suffix=${html`
Date: Thu, 13 Jul 2023 16:33:56 +0200 Subject: [PATCH 042/102] Add condition selector for blueprint (#17278) --- .../ha-selector/ha-selector-condition.ts | 48 +++++++++++++++++++ src/components/ha-selector/ha-selector.ts | 5 +- src/data/selector.ts | 6 +++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/components/ha-selector/ha-selector-condition.ts diff --git a/src/components/ha-selector/ha-selector-condition.ts b/src/components/ha-selector/ha-selector-condition.ts new file mode 100644 index 0000000000..fe76180793 --- /dev/null +++ b/src/components/ha-selector/ha-selector-condition.ts @@ -0,0 +1,48 @@ +import { css, CSSResultGroup, html, LitElement } from "lit"; +import { customElement, property } from "lit/decorators"; +import { Condition } from "../../data/automation"; +import { ConditionSelector } from "../../data/selector"; +import "../../panels/config/automation/condition/ha-automation-condition"; +import { HomeAssistant } from "../../types"; + +@customElement("ha-selector-condition") +export class HaConditionSelector extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public selector!: ConditionSelector; + + @property() public value?: Condition; + + @property() public label?: string; + + @property({ type: Boolean, reflect: true }) public disabled = false; + + protected render() { + return html` + + `; + } + + static get styles(): CSSResultGroup { + return css` + ha-automation-condition { + display: block; + margin-bottom: 16px; + } + :host([disabled]) ha-automation-condition { + opacity: var(--light-disabled-opacity); + pointer-events: none; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-selector-condition": HaConditionSelector; + } +} diff --git a/src/components/ha-selector/ha-selector.ts b/src/components/ha-selector/ha-selector.ts index 2e7e5143d8..9c831c0a10 100644 --- a/src/components/ha-selector/ha-selector.ts +++ b/src/components/ha-selector/ha-selector.ts @@ -3,9 +3,9 @@ import { customElement, property } from "lit/decorators"; import memoizeOne from "memoize-one"; import { dynamicElement } from "../../common/dom/dynamic-element-directive"; import { - Selector, - handleLegacyEntitySelector, handleLegacyDeviceSelector, + handleLegacyEntitySelector, + Selector, } from "../../data/selector"; import type { HomeAssistant } from "../../types"; @@ -17,6 +17,7 @@ const LOAD_ELEMENTS = { assist_pipeline: () => import("./ha-selector-assist-pipeline"), boolean: () => import("./ha-selector-boolean"), color_rgb: () => import("./ha-selector-color-rgb"), + condition: () => import("./ha-selector-condition"), config_entry: () => import("./ha-selector-config-entry"), conversation_agent: () => import("./ha-selector-conversation-agent"), constant: () => import("./ha-selector-constant"), diff --git a/src/data/selector.ts b/src/data/selector.ts index acbac41a43..f046a5a1fd 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -19,6 +19,7 @@ export type Selector = | BooleanSelector | ColorRGBSelector | ColorTempSelector + | ConditionSelector | ConversationAgentSelector | ConfigEntrySelector | ConstantSelector @@ -96,6 +97,11 @@ export interface ColorTempSelector { } | null; } +export interface ConditionSelector { + // eslint-disable-next-line @typescript-eslint/ban-types + condition: {} | null; +} + export interface ConversationAgentSelector { conversation_agent: { language?: string } | null; } From 56e82eab03f329e315ab117e6ee9cf0464085a6b Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 13 Jul 2023 16:34:42 +0200 Subject: [PATCH 043/102] Add icon to edit card overflow menu (#17293) --- .../lovelace/components/hui-card-options.ts | 171 ++++++++++-------- src/translations/en.json | 8 +- 2 files changed, 104 insertions(+), 75 deletions(-) diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index ec04f21acd..6f52d6135f 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -1,7 +1,15 @@ import "@material/mwc-button"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; -import "@material/mwc-list/mwc-list-item"; -import { mdiArrowDown, mdiArrowUp, mdiDotsVertical } from "@mdi/js"; +import { + mdiArrowDown, + mdiArrowUp, + mdiContentCopy, + mdiContentCut, + mdiContentDuplicate, + mdiDelete, + mdiDotsVertical, + mdiFileMoveOutline, +} from "@mdi/js"; import deepClone from "deep-clone-simple"; import { CSSResultGroup, @@ -17,11 +25,13 @@ import { storage } from "../../../common/decorators/storage"; import { fireEvent } from "../../../common/dom/fire_event"; import "../../../components/ha-button-menu"; import "../../../components/ha-icon-button"; +import "../../../components/ha-list-item"; import { LovelaceCardConfig, saveConfig } from "../../../data/lovelace"; import { showAlertDialog, showPromptDialog, } from "../../../dialogs/generic/show-dialog-box"; +import { haStyle } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { showSaveSuccessToast } from "../../../util/toast-saved-success"; import { computeCardSize } from "../common/compute-card-size"; @@ -122,31 +132,51 @@ export class HuiCardOptions extends LitElement { )} .path=${mdiDotsVertical} > - + + ${this.hass!.localize( "ui.panel.lovelace.editor.edit_card.move" - )} - ${this.hass!.localize( + )} + + + + ${this.hass!.localize( "ui.panel.lovelace.editor.edit_card.duplicate" - )} - ${this.hass!.localize( + )} + + + + ${this.hass!.localize( "ui.panel.lovelace.editor.edit_card.copy" - )} - ${this.hass!.localize( - "ui.panel.lovelace.editor.edit_card.cut" - )} - + )} + + + + ${this.hass!.localize("ui.panel.lovelace.editor.edit_card.cut")} + +
  • + + ${this.hass!.localize( "ui.panel.lovelace.editor.edit_card.delete" - )}
    + )} +
    @@ -155,65 +185,64 @@ export class HuiCardOptions extends LitElement { } static get styles(): CSSResultGroup { - return css` - :host(:hover) { - outline: 2px solid var(--primary-color); - } + return [ + haStyle, + css` + :host(:hover) { + outline: 2px solid var(--primary-color); + } - :host(:not(.panel)) ::slotted(*) { - display: block; - } + :host(:not(.panel)) ::slotted(*) { + display: block; + } - :host(.panel) .card { - height: calc(100% - 59px); - } + :host(.panel) .card { + height: calc(100% - 59px); + } - ha-card { - border-top-right-radius: 0; - border-top-left-radius: 0; - } + ha-card { + border-top-right-radius: 0; + border-top-left-radius: 0; + } - .card-actions { - display: flex; - justify-content: space-between; - align-items: center; - } + .card-actions { + display: flex; + justify-content: space-between; + align-items: center; + } - .right { - display: flex; - align-items: center; - } + .right { + display: flex; + align-items: center; + } - .position-badge { - display: block; - width: 24px; - line-height: 24px; - box-sizing: border-box; - border-radius: 50%; - font-weight: 500; - text-align: center; - font-size: 14px; - background-color: var(--app-header-edit-background-color, #455a64); - color: var(--app-header-edit-text-color, white); - } + .position-badge { + display: block; + width: 24px; + line-height: 24px; + box-sizing: border-box; + border-radius: 50%; + font-weight: 500; + text-align: center; + font-size: 14px; + background-color: var(--app-header-edit-background-color, #455a64); + color: var(--app-header-edit-text-color, white); + } - ha-icon-button { - color: var(--primary-text-color); - } + ha-icon-button { + color: var(--primary-text-color); + } - ha-icon-button.move-arrow[disabled] { - color: var(--disabled-text-color); - } + ha-icon-button.move-arrow[disabled] { + color: var(--disabled-text-color); + } - mwc-list-item { - cursor: pointer; - white-space: nowrap; - } - - mwc-list-item.delete-item { - color: var(--error-color); - } - `; + ha-list-item { + cursor: pointer; + white-space: nowrap; + } + `, + ]; } private _handleAction(ev: CustomEvent) { diff --git a/src/translations/en.json b/src/translations/en.json index 05ff2b775e..ea9e09b5ef 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4548,10 +4548,10 @@ "add": "Add Card", "edit": "Edit", "clear": "Clear", - "delete": "Delete card", - "copy": "Copy card", - "cut": "Cut card", - "duplicate": "Duplicate card", + "delete": "Delete", + "copy": "Copy", + "cut": "Cut", + "duplicate": "Duplicate", "move": "Move to view", "move_up": "Move card up", "move_down": "Move card down", From df765515ec072bc687d7a0a66a277a025769360a Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 13 Jul 2023 16:35:53 +0200 Subject: [PATCH 044/102] Use icon button to switch between code and editor (#17294) --- .../hui-conditional-card-editor.ts | 16 +++++++------ .../config-elements/hui-stack-card-editor.ts | 24 +++++++++++-------- .../lovelace/editor/hui-sub-element-editor.ts | 14 +++++------ 3 files changed, 30 insertions(+), 24 deletions(-) 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 b2c8566af6..b63913d45b 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 @@ -1,7 +1,7 @@ import "@material/mwc-list/mwc-list-item"; import "@material/mwc-tab-bar/mwc-tab-bar"; import "@material/mwc-tab/mwc-tab"; -import { mdiContentCopy } from "@mdi/js"; +import { mdiCodeBraces, mdiContentCopy, mdiListBoxOutline } from "@mdi/js"; import deepClone from "deep-clone-simple"; import type { MDCTabBarActivatedEvent } from "@material/tab-bar"; import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; @@ -92,6 +92,8 @@ export class HuiConditionalCardEditor return nothing; } + const isGuiMode = !this._cardEditorEl || this._GUImode; + return html` - - ${this.hass!.localize( - !this._cardEditorEl || this._GUImode + .label=${this.hass!.localize( + isGuiMode ? "ui.panel.lovelace.editor.edit_card.show_code_editor" : "ui.panel.lovelace.editor.edit_card.show_visual_editor" )} - + .path=${isGuiMode ? mdiCodeBraces : mdiListBoxOutline} + >
    @@ -114,17 +118,17 @@ export class HuiStackCardEditor ${selected < numcards ? html`
    - - ${this.hass!.localize( - !this._cardEditorEl || this._GUImode + .label=${this.hass!.localize( + isGuiMode ? "ui.panel.lovelace.editor.edit_card.show_code_editor" : "ui.panel.lovelace.editor.edit_card.show_visual_editor" )} - + .path=${isGuiMode ? mdiCodeBraces : mdiListBoxOutline} + >
    - - ${this.hass.localize( + .disabled=${!this._guiModeAvailable} + .label=${this.hass!.localize( this._guiMode ? "ui.panel.lovelace.editor.edit_card.show_code_editor" : "ui.panel.lovelace.editor.edit_card.show_visual_editor" )} - + .path=${this._guiMode ? mdiCodeBraces : mdiListBoxOutline} + >
    ${this.config.type === "row" ? html` From 510f9dbb1256c6cb92ae513ac061ebc291e8d2c7 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 13 Jul 2023 16:36:18 +0200 Subject: [PATCH 045/102] Don't show paste from clipboard card when user search for a card (#17295) --- src/panels/lovelace/editor/card-editor/hui-card-picker.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index 415b89b993..500a6a12b9 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -123,7 +123,7 @@ export class HuiCardPicker extends LitElement { })} >
    - ${this._clipboard + ${this._clipboard && !this._filter ? html` ${until( this._renderCardElement( @@ -402,6 +402,9 @@ export class HuiCardPicker extends LitElement { background: var(--primary-background-color, #fafafa); cursor: pointer; position: relative; + overflow: hidden; + border: var(--ha-card-border-width, 1px) solid + var(--ha-card-border-color, var(--divider-color)); } .card-header { @@ -451,8 +454,6 @@ export class HuiCardPicker extends LitElement { height: 100%; z-index: 1; box-sizing: border-box; - border: var(--ha-card-border-width, 1px) solid - var(--ha-card-border-color, var(--divider-color)); border-radius: var(--ha-card-border-radius, 12px); } From 8bb2cbe7672474f1785be270110f8ad5e50ce2cf Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 13 Jul 2023 16:42:08 +0200 Subject: [PATCH 046/102] Refactor lock and alarm panel code dialog (#17254) --- src/data/lock.ts | 31 ++++++++++++++ .../lock/ha-more-info-lock-toggle.ts | 33 ++++----------- .../more-info/controls/more-info-lock.ts | 41 ++++--------------- 3 files changed, 47 insertions(+), 58 deletions(-) diff --git a/src/data/lock.ts b/src/data/lock.ts index a6c9914559..df79b4e223 100644 --- a/src/data/lock.ts +++ b/src/data/lock.ts @@ -2,6 +2,8 @@ import { HassEntityAttributeBase, HassEntityBase, } from "home-assistant-js-websocket"; +import { showEnterCodeDialogDialog } from "../dialogs/enter-code/show-enter-code-dialog"; +import { HomeAssistant } from "../types"; export const FORMAT_TEXT = "text"; export const FORMAT_NUMBER = "number"; @@ -18,3 +20,32 @@ interface LockEntityAttributes extends HassEntityAttributeBase { export interface LockEntity extends HassEntityBase { attributes: LockEntityAttributes; } + +type ProtectedLockService = "lock" | "unlock" | "open"; + +export const callProtectedLockService = async ( + element: HTMLElement, + hass: HomeAssistant, + stateObj: LockEntity, + service: ProtectedLockService +) => { + let code: string | undefined; + + if (stateObj!.attributes.code_format) { + const response = await showEnterCodeDialogDialog(element, { + codeFormat: "text", + codePattern: stateObj!.attributes.code_format, + title: hass.localize(`ui.dialogs.more_info_control.lock.${service}`), + submitText: hass.localize(`ui.dialogs.more_info_control.lock.${service}`), + }); + if (!response) { + throw new Error("Code dialog closed"); + } + code = response; + } + + await hass.callService("lock", service, { + entity_id: stateObj!.entity_id, + code, + }); +}; diff --git a/src/dialogs/more-info/components/lock/ha-more-info-lock-toggle.ts b/src/dialogs/more-info/components/lock/ha-more-info-lock-toggle.ts index aafecef40d..0f5691e408 100644 --- a/src/dialogs/more-info/components/lock/ha-more-info-lock-toggle.ts +++ b/src/dialogs/more-info/components/lock/ha-more-info-lock-toggle.ts @@ -15,9 +15,8 @@ import "../../../../components/ha-control-button"; import "../../../../components/ha-control-switch"; import { UNAVAILABLE, UNKNOWN } from "../../../../data/entity"; import { forwardHaptic } from "../../../../data/haptics"; -import { LockEntity } from "../../../../data/lock"; +import { callProtectedLockService, LockEntity } from "../../../../data/lock"; import { HomeAssistant } from "../../../../types"; -import { showEnterCodeDialogDialog } from "../../../enter-code/show-enter-code-dialog"; @customElement("ha-more-info-lock-toggle") export class HaMoreInfoLockToggle extends LitElement { @@ -68,30 +67,12 @@ export class HaMoreInfoLockToggle extends LitElement { return; } forwardHaptic("light"); - - let code: string | undefined; - - if (this.stateObj.attributes.code_format) { - const response = await showEnterCodeDialogDialog(this, { - codeFormat: "text", - codePattern: this.stateObj.attributes.code_format, - title: this.hass.localize( - `ui.dialogs.more_info_control.lock.${turnOn ? "lock" : "unlock"}` - ), - submitText: this.hass.localize( - `ui.dialogs.more_info_control.lock.${turnOn ? "lock" : "unlock"}` - ), - }); - if (response == null) { - throw new Error("cancel"); - } - code = response; - } - - await this.hass.callService("lock", turnOn ? "lock" : "unlock", { - entity_id: this.stateObj.entity_id, - code, - }); + callProtectedLockService( + this, + this.hass, + this.stateObj, + turnOn ? "lock" : "unlock" + ); } protected render(): TemplateResult { diff --git a/src/dialogs/more-info/controls/more-info-lock.ts b/src/dialogs/more-info/controls/more-info-lock.ts index 5fa6ec5df3..24c8d0cece 100644 --- a/src/dialogs/more-info/controls/more-info-lock.ts +++ b/src/dialogs/more-info/controls/more-info-lock.ts @@ -1,6 +1,6 @@ import "@material/web/iconbutton/outlined-icon-button"; import { mdiDoorOpen, mdiLock, mdiLockOff } from "@mdi/js"; -import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; +import { CSSResultGroup, LitElement, css, html, nothing } from "lit"; import { customElement, property } from "lit/decorators"; import { styleMap } from "lit/directives/style-map"; import { domainIcon } from "../../../common/entity/domain_icon"; @@ -8,9 +8,12 @@ import { stateColorCss } from "../../../common/entity/state_color"; import { supportsFeature } from "../../../common/entity/supports-feature"; import "../../../components/ha-attributes"; import { UNAVAILABLE } from "../../../data/entity"; -import { LockEntity, LockEntityFeature } from "../../../data/lock"; +import { + LockEntity, + LockEntityFeature, + callProtectedLockService, +} from "../../../data/lock"; import type { HomeAssistant } from "../../../types"; -import { showEnterCodeDialogDialog } from "../../enter-code/show-enter-code-dialog"; import { moreInfoControlStyle } from "../components/ha-more-info-control-style"; import "../components/ha-more-info-state-header"; import "../components/lock/ha-more-info-lock-toggle"; @@ -22,41 +25,15 @@ class MoreInfoLock extends LitElement { @property({ attribute: false }) public stateObj?: LockEntity; private async _open() { - this._callService("open"); + callProtectedLockService(this, this.hass, this.stateObj!, "open"); } private async _lock() { - this._callService("lock"); + callProtectedLockService(this, this.hass, this.stateObj!, "lock"); } private async _unlock() { - this._callService("unlock"); - } - - private async _callService(service: "open" | "lock" | "unlock") { - let code: string | undefined; - - if (this.stateObj!.attributes.code_format) { - const response = await showEnterCodeDialogDialog(this, { - codeFormat: "text", - codePattern: this.stateObj!.attributes.code_format, - title: this.hass.localize( - `ui.dialogs.more_info_control.lock.${service}` - ), - submitText: this.hass.localize( - `ui.dialogs.more_info_control.lock.${service}` - ), - }); - if (!response) { - return; - } - code = response; - } - - this.hass.callService("lock", service, { - entity_id: this.stateObj!.entity_id, - code, - }); + callProtectedLockService(this, this.hass, this.stateObj!, "unlock"); } protected render() { From 1fe02e8d6c12c29932d7dcc0efca2170ef0297aa Mon Sep 17 00:00:00 2001 From: Denis Shulyaka Date: Thu, 13 Jul 2023 18:04:04 +0300 Subject: [PATCH 047/102] Add current humidity to humidifier history chart (#17288) * Add current humidity to humidifier history chart * state-humidifier-on-color --- .../chart/state-history-chart-line.ts | 85 +++++++++++++++++-- src/data/history.ts | 2 + src/resources/ha-style.ts | 2 +- src/translations/en.json | 3 + 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/src/components/chart/state-history-chart-line.ts b/src/components/chart/state-history-chart-line.ts index b90d57fb62..37f831c192 100644 --- a/src/components/chart/state-history-chart-line.ts +++ b/src/components/chart/state-history-chart-line.ts @@ -328,23 +328,94 @@ class StateHistoryChartLine extends LitElement { } }); } else if (domain === "humidifier") { + const hasAction = states.states.some( + (entityState) => entityState.attributes?.action + ); + const hasCurrent = states.states.some( + (entityState) => entityState.attributes?.current_humidity + ); + + const hasHumidifying = + hasAction && + states.states.some( + (entityState: LineChartState) => + entityState.attributes?.action === "humidifying" + ); + const hasDrying = + hasAction && + states.states.some( + (entityState: LineChartState) => + entityState.attributes?.action === "drying" + ); + addDataSet( `${this.hass.localize("ui.card.humidifier.target_humidity_entity", { name: name, })}` ); - addDataSet( - `${this.hass.localize("ui.card.humidifier.on_entity", { - name: name, - })}`, - true - ); + + if (hasCurrent) { + addDataSet( + `${this.hass.localize( + "ui.card.humidifier.current_humidity_entity", + { + name: name, + } + )}` + ); + } + + // If action attribute is available, we used it to shade the area below the humidity. + // If action attribute is not available, we shade the area when the device is on + if (hasHumidifying) { + addDataSet( + `${this.hass.localize("ui.card.humidifier.humidifying", { + name: name, + })}`, + true, + computedStyles.getPropertyValue("--state-humidifier-on-color") + ); + } else if (hasDrying) { + addDataSet( + `${this.hass.localize("ui.card.humidifier.drying", { + name: name, + })}`, + true, + computedStyles.getPropertyValue("--state-humidifier-on-color") + ); + } else { + addDataSet( + `${this.hass.localize("ui.card.humidifier.on_entity", { + name: name, + })}`, + true + ); + } states.states.forEach((entityState) => { if (!entityState.attributes) return; const target = safeParseFloat(entityState.attributes.humidity); + // If the current humidity is not available, then we fill up to the target humidity + const current = hasCurrent + ? safeParseFloat(entityState.attributes?.current_humidity) + : target; const series = [target]; - series.push(entityState.state === "on" ? target : null); + + if (hasCurrent) { + series.push(current); + } + + if (hasHumidifying) { + series.push( + entityState.attributes?.action === "humidifying" ? current : null + ); + } else if (hasDrying) { + series.push( + entityState.attributes?.action === "drying" ? current : null + ); + } else { + series.push(entityState.state === "on" ? current : null); + } pushData(new Date(entityState.last_changed), series); }); } else { diff --git a/src/data/history.ts b/src/data/history.ts index 8202f44167..653dbef356 100644 --- a/src/data/history.ts +++ b/src/data/history.ts @@ -29,6 +29,8 @@ const LINE_ATTRIBUTES_TO_KEEP = [ "hvac_action", "humidity", "mode", + "action", + "current_humidity", ]; export interface LineChartState { diff --git a/src/resources/ha-style.ts b/src/resources/ha-style.ts index 4bdac11926..aefe6e6479 100644 --- a/src/resources/ha-style.ts +++ b/src/resources/ha-style.ts @@ -156,7 +156,7 @@ documentContainer.innerHTML = ` --state-device_tracker-active-color: var(--blue-color); --state-device_tracker-home-color: var(--green-color); --state-fan-active-color: var(--cyan-color); - --state-humidifier-active-color: var(--blue-color); + --state-humidifier-on-color: var(--blue-color); --state-light-active-color: var(--amber-color); --state-lock-jammed-color: var(--red-color); --state-lock-locked-color: var(--green-color); diff --git a/src/translations/en.json b/src/translations/en.json index ea9e09b5ef..b55a6dc042 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -134,6 +134,9 @@ "state": "State", "mode": "Mode", "target_humidity_entity": "{name} target humidity", + "current_humidity_entity": "{name} current humidity", + "humidifying": "{name} humidifying", + "drying": "{name} drying", "on_entity": "{name} on" }, "light": { From 9b3710f8bdf7c5c63dc2089b6f95b5237656af3b Mon Sep 17 00:00:00 2001 From: Simon Lamon <32477463+silamon@users.noreply.github.com> Date: Thu, 13 Jul 2023 18:32:36 +0200 Subject: [PATCH 048/102] Use translation keys for Network configuration pages (#17261) * Network labels * Remove quotes * Update translations to include data and linting * IPV6 => IPv6 --- src/panels/config/network/dialog-ip-detail.ts | 77 ++++++++++++++++--- .../config/network/ha-config-network.ts | 11 ++- .../config/network/supervisor-network.ts | 6 +- src/translations/en.json | 14 +++- 4 files changed, 91 insertions(+), 17 deletions(-) diff --git a/src/panels/config/network/dialog-ip-detail.ts b/src/panels/config/network/dialog-ip-detail.ts index 6d1d3e24a4..e998e9c059 100644 --- a/src/panels/config/network/dialog-ip-detail.ts +++ b/src/panels/config/network/dialog-ip-detail.ts @@ -41,20 +41,49 @@ class DialogIPDetail extends LitElement { @closed=${this.closeDialog} scrimClickAction escapeKeyAction - .heading=${createCloseHeading(this.hass, "IP Information")} + .heading=${createCloseHeading( + this.hass, + this.hass.localize("ui.dialogs.dialog-ip-detail.ip_information") + )} > ${ipv4 ? html`
    -

    IPv4

    +

    + ${this.hass.localize("ui.dialogs.dialog-ip-detail.ipv4")} +

    ${ipv4.address - ? html`
    IP Address: ${ipv4.address?.join(", ")}
    ` + ? html`
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.ip_address", + { address: ipv4.address?.join(", ") } + )} +
    ` + : ""} + ${ipv4.gateway + ? html`
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.gateway", + { gateway: ipv4.gateway } + )} +
    ` + : ""} + ${ipv4.method + ? html`
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.method", + { method: ipv4.method } + )} +
    ` : ""} - ${ipv4.gateway ? html`
    Gateway: ${ipv4.gateway}
    ` : ""} - ${ipv4.method ? html`
    Method: ${ipv4.method}
    ` : ""} ${ipv4.nameservers?.length ? html` -
    Name Servers: ${ipv4.nameservers?.join(", ")}
    +
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.nameservers", + { nameservers: ipv4.nameservers?.join(", ") } + )} +
    ` : ""}
    @@ -63,15 +92,41 @@ class DialogIPDetail extends LitElement { ${ipv6 ? html`
    -

    IPv6

    +

    + ${this.hass.localize("ui.dialogs.dialog-ip-detail.ipv6")} +

    ${ipv6.address - ? html`
    IP Address: ${ipv6.address?.join(", ")}
    ` + ? html`
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.ip_address", + { address: ipv6.address?.join(", ") } + )} +
    ` + : ""} + ${ipv6.gateway + ? html`
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.gateway", + { gateway: ipv6.gateway } + )} +
    ` + : ""} + ${ipv6.method + ? html`
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.method", + { method: ipv6.method } + )} +
    ` : ""} - ${ipv6.gateway ? html`
    Gateway: ${ipv6.gateway}
    ` : ""} - ${ipv6.method ? html`
    Method: ${ipv6.method}
    ` : ""} ${ipv6.nameservers?.length ? html` -
    Name Servers: ${ipv6.nameservers?.join(", ")}
    +
    + ${this.hass.localize( + "ui.dialogs.dialog-ip-detail.nameservers", + { nameservers: ipv6.nameservers?.join(", ") } + )} +
    ` : ""}
    diff --git a/src/panels/config/network/ha-config-network.ts b/src/panels/config/network/ha-config-network.ts index 0d799b281d..25952cd43e 100644 --- a/src/panels/config/network/ha-config-network.ts +++ b/src/panels/config/network/ha-config-network.ts @@ -40,7 +40,10 @@ class ConfigNetwork extends LitElement { } return html` - +
    ${this._error ? html` @@ -50,9 +53,9 @@ class ConfigNetwork extends LitElement { ` : ""}

    - Configure which network adapters integrations will use. Currently - this setting only affects multicast traffic. A restart is required - for these settings to apply. + ${this.hass.localize( + "ui.panel.config.network.network_adapter_info" + )}

    - IP Information + ${this.hass.localize( + "ui.panel.config.network.ip_information" + )}
    `; } diff --git a/src/translations/en.json b/src/translations/en.json index b55a6dc042..10dfbe298f 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1385,6 +1385,15 @@ "message_example": "Hello. How can I assist?", "message_placeholder": "Enter a sentence to speak.", "play": "Play" + }, + "dialog-ip-detail": { + "ip_information": "[%key:ui::panel::config::network::ip_information%]", + "ipv4": "IPv4", + "ipv6": "IPv6", + "ip_address": "IP Address: {address}", + "gateway": "Gateway: {gateway}", + "method": "Method: {method}", + "nameservers": "Name Servers: {nameservers}" } }, "duration": { @@ -4193,7 +4202,10 @@ "description": "The name your instance will have on your network", "failed_to_set_hostname": "Setting hostname failed" } - } + }, + "network_adapter": "Network Adapter", + "network_adapter_info": "Configure which network adapters integrations will use. Currently this setting only affects multicast traffic. A restart is required for these settings to apply.", + "ip_information": "IP Information" }, "storage": { "caption": "Storage", From 27bfa130f399c4f2743742d4b841df9927a87dc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 18:56:45 -0400 Subject: [PATCH 049/102] Update typescript-eslint monorepo to v5.62.0 (#17298) --- package.json | 4 +-- yarn.lock | 100 +++++++++++++++++++++++++-------------------------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/package.json b/package.json index 5d40650f5f..e989a0c1c4 100644 --- a/package.json +++ b/package.json @@ -184,8 +184,8 @@ "@types/sortablejs": "1.15.1", "@types/tar": "6.1.5", "@types/webspeechapi": "0.0.29", - "@typescript-eslint/eslint-plugin": "5.61.0", - "@typescript-eslint/parser": "5.61.0", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", "@web/dev-server": "0.1.38", "@web/dev-server-rollup": "0.4.1", "babel-loader": "9.1.3", diff --git a/yarn.lock b/yarn.lock index d8f866b844..386d399b47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4703,14 +4703,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.61.0" +"@typescript-eslint/eslint-plugin@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" dependencies: "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.61.0 - "@typescript-eslint/type-utils": 5.61.0 - "@typescript-eslint/utils": 5.61.0 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/type-utils": 5.62.0 + "@typescript-eslint/utils": 5.62.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.0 @@ -4723,43 +4723,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: d9e891fb43ccb75322fc40d58d02479f98bd3c962db71075438868b13f579643d714a24b5477a827be7ca2e7e9f6058c406241b6696a6395c6fcbd6de76e015c + checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 languageName: node linkType: hard -"@typescript-eslint/parser@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/parser@npm:5.61.0" +"@typescript-eslint/parser@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/parser@npm:5.62.0" dependencies: - "@typescript-eslint/scope-manager": 5.61.0 - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/typescript-estree": 5.61.0 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/typescript-estree": 5.62.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2422bca03ecc6830700aaa739ec46b8e9ab6c0a47a67f140dc6b62a42a8b98997e73bce52c6a010b8a9b461211c46ba865d5b7f680a7823cf5c245d3b61f7fd5 + checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/scope-manager@npm:5.61.0" +"@typescript-eslint/scope-manager@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/scope-manager@npm:5.62.0" dependencies: - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/visitor-keys": 5.61.0 - checksum: 6dfbb42c4b7d796ae3c395398bdfd2e5a4ae8aaf1448381278ecc39a1d1045af2cb452da5a00519d265bc1a5997523de22d5021acb4dbe1648502fe61512d3c6 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 + checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/type-utils@npm:5.61.0" +"@typescript-eslint/type-utils@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/type-utils@npm:5.62.0" dependencies: - "@typescript-eslint/typescript-estree": 5.61.0 - "@typescript-eslint/utils": 5.61.0 + "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/utils": 5.62.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -4767,23 +4767,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: f0203fd48c6218f004dd73a9a71ba4cf97f015d0f13a7b3c821a3ba7ec814839bae270a1db589184ca7091fe54815a3171d1993e8a25200bf33e131bd6e855d4 + checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/types@npm:5.61.0" - checksum: d311ca2141f6bcb5f0f8f97ddbc218c9911e0735aaa30f0f2e64d518fb33568410754e1b04bf157175f8783504f8ec62a7ab53a66a18507f43edb1e21fe69e90 +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.61.0" +"@typescript-eslint/typescript-estree@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" dependencies: - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/visitor-keys": 5.61.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -4792,35 +4792,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: efe25a1b2774939c02cb9b388cf72efa672811f1c39a87ddd617937f63c2320551ce459ba69c6d022e33322594d40b9f2d2c6bc9937387718adc40dc5e57ea8e + checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/utils@npm:5.61.0" +"@typescript-eslint/utils@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/utils@npm:5.62.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.61.0 - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/typescript-estree": 5.61.0 + "@typescript-eslint/scope-manager": 5.62.0 + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/typescript-estree": 5.62.0 eslint-scope: ^5.1.1 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 24efc1964e6c92db96fe0d9a390550e4f27e8f353e51a9b46bda03e6692ea5d40f398d539235a4ff0894e9e45dfcfb51df953ade2ae9d17a1421449625ce6f5a + checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.61.0": - version: 5.61.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.61.0" +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" dependencies: - "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/types": 5.62.0 eslint-visitor-keys: ^3.3.0 - checksum: a8d589f61ddfc380787218da4d347e8f9aef0f82f4a93f1daee46786bda889a90961c7ec1b470db5e3261438a728fdfd956f5bda6ee2de22c4be2d2152d6e270 + checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 languageName: node linkType: hard @@ -9731,8 +9731,8 @@ __metadata: "@types/sortablejs": 1.15.1 "@types/tar": 6.1.5 "@types/webspeechapi": 0.0.29 - "@typescript-eslint/eslint-plugin": 5.61.0 - "@typescript-eslint/parser": 5.61.0 + "@typescript-eslint/eslint-plugin": 5.62.0 + "@typescript-eslint/parser": 5.62.0 "@vaadin/combo-box": 24.1.3 "@vaadin/vaadin-themable-mixin": 24.1.3 "@vibrant/color": 3.2.1-alpha.1 From 5e197334f6ab57404fa2592b2e744d9a5e162f27 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 04:57:20 +0000 Subject: [PATCH 050/102] Update octokit monorepo to v6 (major) (#17269) Update octokit monorepo to v6 Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +-- yarn.lock | 89 +++++++++++++++++++++++++++++----------------------- 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index e989a0c1c4..64074c8452 100644 --- a/package.json +++ b/package.json @@ -158,8 +158,8 @@ "@babel/preset-env": "7.22.7", "@babel/preset-typescript": "7.22.5", "@koa/cors": "4.0.0", - "@octokit/auth-oauth-device": "5.0.2", - "@octokit/plugin-retry": "5.0.5", + "@octokit/auth-oauth-device": "6.0.0", + "@octokit/plugin-retry": "6.0.0", "@octokit/rest": "19.0.13", "@open-wc/dev-server-hmr": "0.1.4", "@rollup/plugin-babel": "6.0.3", diff --git a/yarn.lock b/yarn.lock index 386d399b47..dde0a03496 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3227,15 +3227,15 @@ __metadata: languageName: node linkType: hard -"@octokit/auth-oauth-device@npm:5.0.2": - version: 5.0.2 - resolution: "@octokit/auth-oauth-device@npm:5.0.2" +"@octokit/auth-oauth-device@npm:6.0.0": + version: 6.0.0 + resolution: "@octokit/auth-oauth-device@npm:6.0.0" dependencies: - "@octokit/oauth-methods": ^3.0.1 - "@octokit/request": ^7.0.0 - "@octokit/types": ^10.0.0 + "@octokit/oauth-methods": ^4.0.0 + "@octokit/request": ^8.0.0 + "@octokit/types": ^11.0.0 universal-user-agent: ^6.0.0 - checksum: b625a2d7604351e52df46d3fdad04d1eb2ec68f80bce065047691ea83044967ef1e7dd0a70e9f8aab818d8c5ecf7f2550d2aa029ffdba85e0ff8c0ce2e25736a + checksum: ba6e46a42a68ca0e6d345b10de257b4e0764e6abeedfa3b7bd27bbe4336cbabf3dc081c97eb860939e4fbcb9827c62be5c4396023342db4717f254f06cdbba43 languageName: node linkType: hard @@ -3272,14 +3272,14 @@ __metadata: languageName: node linkType: hard -"@octokit/endpoint@npm:^8.0.0": - version: 8.0.1 - resolution: "@octokit/endpoint@npm:8.0.1" +"@octokit/endpoint@npm:^9.0.0": + version: 9.0.0 + resolution: "@octokit/endpoint@npm:9.0.0" dependencies: - "@octokit/types": ^10.0.0 + "@octokit/types": ^11.0.0 is-plain-object: ^5.0.0 universal-user-agent: ^6.0.0 - checksum: 0cff7c972d8304cb59c4cc28016c15bca05e6d7e9e2d9b00af88ce05bf9abdfdb17025f38080162a71ea15b21c740bcb5079361396f18a24bbe55134c504a581 + checksum: 0e402c4d0fbe5b8053630cedb30dde5074bb6410828a05dc93d7e0fdd6c17f9a44b66586ef1a4e4ee0baa8d34ef7d6f535e2f04d9ea42909b7fc7ff55ce56a48 languageName: node linkType: hard @@ -3301,16 +3301,16 @@ __metadata: languageName: node linkType: hard -"@octokit/oauth-methods@npm:^3.0.1": - version: 3.0.1 - resolution: "@octokit/oauth-methods@npm:3.0.1" +"@octokit/oauth-methods@npm:^4.0.0": + version: 4.0.0 + resolution: "@octokit/oauth-methods@npm:4.0.0" dependencies: "@octokit/oauth-authorization-url": ^6.0.2 - "@octokit/request": ^7.0.0 - "@octokit/request-error": ^4.0.1 - "@octokit/types": ^10.0.0 + "@octokit/request": ^8.0.2 + "@octokit/request-error": ^5.0.0 + "@octokit/types": ^11.0.0 btoa-lite: ^1.0.0 - checksum: ad327084f97d2f3be270d8957545dbd06c35df3e99d8e58702217beb7ac3574c361b49dfe28ba5d96b7f1911ac9c8e26ae07d6180a0598eef8b7fab4b0fe4ad5 + checksum: 623f3031f56f5bfd6f142f9215bf47ba418b2f7fd9eb72d3e68cdd2b2c81345021b692edd18ad055df85e71e35497002e1fc4816235ed520dd71e677885c99cc languageName: node linkType: hard @@ -3353,16 +3353,16 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-retry@npm:5.0.5": - version: 5.0.5 - resolution: "@octokit/plugin-retry@npm:5.0.5" +"@octokit/plugin-retry@npm:6.0.0": + version: 6.0.0 + resolution: "@octokit/plugin-retry@npm:6.0.0" dependencies: - "@octokit/request-error": ^4.0.1 - "@octokit/types": ^10.0.0 + "@octokit/request-error": ^5.0.0 + "@octokit/types": ^11.0.0 bottleneck: ^2.15.3 peerDependencies: - "@octokit/core": ">=3" - checksum: c0bf1735e8af38fddccfe69bb1b97f2c194df88cd201309992e19a6d2c82b6d8e0515ca8d81acbc5861a03a49f0178bb026a230d107a53239ed3b7de43cf6e11 + "@octokit/core": ">=5" + checksum: 84c047309d6b3ad8d796cd6aca9a73c61ebea3894a01067ec6bd40d6ba9aaab779a1085749c04f90b25c0fc3a100c6553474d830e5c2e0dde4ffc42b5e0a2e89 languageName: node linkType: hard @@ -3377,14 +3377,14 @@ __metadata: languageName: node linkType: hard -"@octokit/request-error@npm:^4.0.1": - version: 4.0.2 - resolution: "@octokit/request-error@npm:4.0.2" +"@octokit/request-error@npm:^5.0.0": + version: 5.0.0 + resolution: "@octokit/request-error@npm:5.0.0" dependencies: - "@octokit/types": ^10.0.0 + "@octokit/types": ^11.0.0 deprecation: ^2.0.0 once: ^1.4.0 - checksum: 9510078f718be08cf74e7b04b45f67aa545a388787192ff1cd3ca0d066499963d641bf1fea76ef47d2657a55f0cf3e612e46bbf4f33a96436415d30a2e3bb00a + checksum: 2012eca66f6b8fa4038b3bfe81d65a7134ec58e2caf45d229aca13b9653ab260abd95229bd1a8c11180ee0bcf738e2556831a85de28f39b175175653c3b79fdd languageName: node linkType: hard @@ -3402,16 +3402,16 @@ __metadata: languageName: node linkType: hard -"@octokit/request@npm:^7.0.0": - version: 7.0.0 - resolution: "@octokit/request@npm:7.0.0" +"@octokit/request@npm:^8.0.0, @octokit/request@npm:^8.0.2": + version: 8.1.0 + resolution: "@octokit/request@npm:8.1.0" dependencies: - "@octokit/endpoint": ^8.0.0 - "@octokit/request-error": ^4.0.1 - "@octokit/types": ^10.0.0 + "@octokit/endpoint": ^9.0.0 + "@octokit/request-error": ^5.0.0 + "@octokit/types": ^11.1.0 is-plain-object: ^5.0.0 universal-user-agent: ^6.0.0 - checksum: d3b8ac25c3702bb69c5b345f7a9f16b158209db7e244cc2d60dbcbfbaf1edec8252d78885de3607ee85eb86db7c1d2e07fa2515ba6e25cf2880440c0df5e918a + checksum: 00f71e1ca0bff84a1a903ca9f79a7837aac830cae3560d44f03272d062ef98e5a8170fdab8a47169c41db88e6894717cc71387604486d559f9eae409fab93f6f languageName: node linkType: hard @@ -3443,6 +3443,15 @@ __metadata: languageName: node linkType: hard +"@octokit/types@npm:^11.0.0, @octokit/types@npm:^11.1.0": + version: 11.1.0 + resolution: "@octokit/types@npm:11.1.0" + dependencies: + "@octokit/openapi-types": ^18.0.0 + checksum: 72627a94ddaf7bc14db06572bcde67649aad608cd86548818380db9305f4c0ca9ca078a62dd883858a267e8ec8fd596a0fce416aa04197c439b9548efef609a7 + languageName: node + linkType: hard + "@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.3": version: 9.3.2 resolution: "@octokit/types@npm:9.3.2" @@ -9693,8 +9702,8 @@ __metadata: "@material/web": =1.0.0-pre.12 "@mdi/js": 7.2.96 "@mdi/svg": 7.2.96 - "@octokit/auth-oauth-device": 5.0.2 - "@octokit/plugin-retry": 5.0.5 + "@octokit/auth-oauth-device": 6.0.0 + "@octokit/plugin-retry": 6.0.0 "@octokit/rest": 19.0.13 "@open-wc/dev-server-hmr": 0.1.4 "@polymer/app-layout": 3.1.0 From 7546d1950e1170f6d6b7cfd3b71491cbf6d0d712 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Fri, 14 Jul 2023 01:01:00 -0700 Subject: [PATCH 051/102] Make action-choose options collapsible (#17239) * Make action-choose options collapsible * padding changes --- .../types/ha-automation-action-choose.ts | 182 ++++++++++++++---- src/translations/en.json | 2 + 2 files changed, 142 insertions(+), 42 deletions(-) diff --git a/src/panels/config/automation/action/types/ha-automation-action-choose.ts b/src/panels/config/automation/action/types/ha-automation-action-choose.ts index 879d8d8ca5..2d25f72f39 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-choose.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-choose.ts @@ -1,5 +1,6 @@ +import { consume } from "@lit-labs/context"; import { mdiDelete, mdiPlus } from "@mdi/js"; -import { CSSResultGroup, LitElement, css, html } from "lit"; +import { CSSResultGroup, LitElement, PropertyValues, css, html } from "lit"; import { customElement, property, state } from "lit/decorators"; import { ensureArray } from "../../../../../common/array/ensure-array"; import { fireEvent } from "../../../../../common/dom/fire_event"; @@ -10,6 +11,9 @@ import { Action, ChooseAction } from "../../../../../data/script"; import { haStyle } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; import { ActionElement } from "../ha-automation-action-row"; +import { describeCondition } from "../../../../../data/automation_i18n"; +import { fullEntitiesContext } from "../../../../../data/context"; +import { EntityRegistryEntry } from "../../../../../data/entity_registry"; @customElement("ha-automation-action-choose") export class HaChooseAction extends LitElement implements ActionElement { @@ -23,62 +27,145 @@ export class HaChooseAction extends LitElement implements ActionElement { @state() private _showDefault = false; + @state() private expandedUpdateFlag = false; + + @state() + @consume({ context: fullEntitiesContext, subscribe: true }) + _entityReg!: EntityRegistryEntry[]; + public static get defaultConfig() { return { choose: [{ conditions: [], sequence: [] }] }; } + protected willUpdate(changedProperties: PropertyValues) { + if (!changedProperties.has("action")) { + return; + } + + const oldCnt = + changedProperties.get("action") === undefined || + changedProperties.get("action").choose === undefined + ? 0 + : ensureArray(changedProperties.get("action").choose).length; + const newCnt = this.action.choose + ? ensureArray(this.action.choose).length + : 0; + if (newCnt === oldCnt + 1) { + this.expand(newCnt - 1); + } + } + + private expand(i: number) { + this.updateComplete.then(() => { + this.shadowRoot!.querySelectorAll("ha-expansion-panel")[i].expanded = + true; + this.expandedUpdateFlag = !this.expandedUpdateFlag; + }); + } + + private isExpanded(i: number) { + const nodes = this.shadowRoot!.querySelectorAll("ha-expansion-panel"); + if (nodes[i]) { + return nodes[i].expanded; + } + return false; + } + + private _expandedChanged() { + this.expandedUpdateFlag = !this.expandedUpdateFlag; + } + + private _getDescription(option, idx: number) { + if (this.isExpanded(idx)) { + return ""; + } + if (!option.conditions || option.conditions.length === 0) { + return this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.no_conditions" + ); + } + let str = ""; + if (typeof option.conditions[0] === "string") { + str += option.conditions[0]; + } else { + str += describeCondition( + option.conditions[0], + this.hass, + this._entityReg + ); + } + if (option.conditions.length > 1) { + str += this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.option_description_additional", + "numberOfAdditionalConditions", + option.conditions.length - 1 + ); + } + return str; + } + protected render() { const action = this.action; return html` ${(action.choose ? ensureArray(action.choose) : []).map( (option, idx) => html` - -
    -

    + +

    ${this.hass.localize( "ui.panel.config.automation.editor.actions.type.choose.option", "number", idx + 1 )}: -

    -

    - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.type.choose.conditions" - )}: + ${this._getDescription(option, idx)}

    - (option.conditions)} - .reOrderMode=${this.reOrderMode} - .disabled=${this.disabled} - .hass=${this.hass} + + -

    - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.type.choose.sequence" - )}: -

    - -

    + @click=${this._removeOption} + .label=${this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.remove_option" + )} + .path=${mdiDelete} + > +
    +

    + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.conditions" + )}: +

    + ( + option.conditions + )} + .reOrderMode=${this.reOrderMode} + .disabled=${this.disabled} + .hass=${this.hass} + .idx=${idx} + @value-changed=${this._conditionChanged} + > +

    + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.sequence" + )}: +

    + +
    +
    ` )} Date: Fri, 14 Jul 2023 12:10:52 -0400 Subject: [PATCH 052/102] Update dependency @octokit/rest to v20 (#17307) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 192 ++++++++++++--------------------------------------- 2 files changed, 47 insertions(+), 147 deletions(-) diff --git a/package.json b/package.json index 64074c8452..2611334d32 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "@koa/cors": "4.0.0", "@octokit/auth-oauth-device": "6.0.0", "@octokit/plugin-retry": "6.0.0", - "@octokit/rest": "19.0.13", + "@octokit/rest": "20.0.1", "@open-wc/dev-server-hmr": "0.1.4", "@rollup/plugin-babel": "6.0.3", "@rollup/plugin-commonjs": "25.0.2", diff --git a/yarn.lock b/yarn.lock index dde0a03496..77a5aaaa45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3239,36 +3239,25 @@ __metadata: languageName: node linkType: hard -"@octokit/auth-token@npm:^3.0.0": - version: 3.0.4 - resolution: "@octokit/auth-token@npm:3.0.4" - checksum: 42f533a873d4192e6df406b3176141c1f95287423ebdc4cf23a38bb77ee00ccbc0e60e3fbd5874234fc2ed2e67bbc6035e3b0561dacc1d078adb5c4ced3579e3 +"@octokit/auth-token@npm:^4.0.0": + version: 4.0.0 + resolution: "@octokit/auth-token@npm:4.0.0" + checksum: d78f4dc48b214d374aeb39caec4fdbf5c1e4fd8b9fcb18f630b1fe2cbd5a880fca05445f32b4561f41262cb551746aeb0b49e89c95c6dd99299706684d0cae2f languageName: node linkType: hard -"@octokit/core@npm:^4.2.1": - version: 4.2.4 - resolution: "@octokit/core@npm:4.2.4" +"@octokit/core@npm:^5.0.0": + version: 5.0.0 + resolution: "@octokit/core@npm:5.0.0" dependencies: - "@octokit/auth-token": ^3.0.0 - "@octokit/graphql": ^5.0.0 - "@octokit/request": ^6.0.0 - "@octokit/request-error": ^3.0.0 - "@octokit/types": ^9.0.0 + "@octokit/auth-token": ^4.0.0 + "@octokit/graphql": ^7.0.0 + "@octokit/request": ^8.0.2 + "@octokit/request-error": ^5.0.0 + "@octokit/types": ^11.0.0 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: ac8ab47440a31b0228a034aacac6994b64d6b073ad5b688b4c5157fc5ee0d1af1c926e6087bf17fd7244ee9c5998839da89065a90819bde4a97cb77d4edf58a6 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^7.0.0": - version: 7.0.6 - resolution: "@octokit/endpoint@npm:7.0.6" - dependencies: - "@octokit/types": ^9.0.0 - is-plain-object: ^5.0.0 - universal-user-agent: ^6.0.0 - checksum: 7caebf30ceec50eb7f253341ed419df355232f03d4638a95c178ee96620400db7e4a5e15d89773fe14db19b8653d4ab4cc81b2e93ca0c760b4e0f7eb7ad80301 + checksum: 1a5d1112a2403d146aa1db7aaf81a31192ef6b0310a1e6f68c3e439fded22bd4b3a930f5071585e6ca0f2f5e7fc4a1aac68910525b71b03732c140e362d26a33 languageName: node linkType: hard @@ -3283,14 +3272,14 @@ __metadata: languageName: node linkType: hard -"@octokit/graphql@npm:^5.0.0": - version: 5.0.6 - resolution: "@octokit/graphql@npm:5.0.6" +"@octokit/graphql@npm:^7.0.0": + version: 7.0.1 + resolution: "@octokit/graphql@npm:7.0.1" dependencies: - "@octokit/request": ^6.0.0 - "@octokit/types": ^9.0.0 + "@octokit/request": ^8.0.1 + "@octokit/types": ^11.0.0 universal-user-agent: ^6.0.0 - checksum: 7be545d348ef31dcab0a2478dd64d5746419a2f82f61459c774602bcf8a9b577989c18001f50b03f5f61a3d9e34203bdc021a4e4d75ff2d981e8c9c09cf8a65c + checksum: 7ee907987b1b8312c6f870c44455cbd3eed805bb1a4095038f4e7e62ee2e006bd766f2a71dfbe56b870cd8f7558309c602f00d3e252fe59578f4acf6249a4f17 languageName: node linkType: hard @@ -3321,35 +3310,34 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-paginate-rest@npm:^6.1.2": - version: 6.1.2 - resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" +"@octokit/plugin-paginate-rest@npm:^8.0.0": + version: 8.0.0 + resolution: "@octokit/plugin-paginate-rest@npm:8.0.0" dependencies: - "@octokit/tsconfig": ^1.0.2 - "@octokit/types": ^9.2.3 + "@octokit/types": ^11.0.0 peerDependencies: - "@octokit/core": ">=4" - checksum: a7b3e686c7cbd27ec07871cde6e0b1dc96337afbcef426bbe3067152a17b535abd480db1861ca28c88d93db5f7bfdbcadd0919ead19818c28a69d0e194038065 + "@octokit/core": ">=5" + checksum: b5d7cee50523862c6ce7be057f7200e14ee4dcded462f27304c822c960a37efa23ed51080ea879f5d1e56e78f74baa17d2ce32eed5d726794abc35755777e32c languageName: node linkType: hard -"@octokit/plugin-request-log@npm:^1.0.4": - version: 1.0.4 - resolution: "@octokit/plugin-request-log@npm:1.0.4" +"@octokit/plugin-request-log@npm:^4.0.0": + version: 4.0.0 + resolution: "@octokit/plugin-request-log@npm:4.0.0" peerDependencies: - "@octokit/core": ">=3" - checksum: 2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c + "@octokit/core": ">=5" + checksum: 2a8a6619640942092009a9248ceeb163ce01c978e2d7b2a7eb8686bd09a04b783c4cd9071eebb16652d233587abcde449a02ce4feabc652f0a171615fb3e9946 languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^7.1.2": - version: 7.2.3 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.2.3" +"@octokit/plugin-rest-endpoint-methods@npm:^9.0.0": + version: 9.0.0 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:9.0.0" dependencies: - "@octokit/types": ^10.0.0 + "@octokit/types": ^11.0.0 peerDependencies: - "@octokit/core": ">=3" - checksum: 21dfb98514dbe900c29cddb13b335bbce43d613800c6b17eba3c1fd31d17e69c1960f3067f7bf864bb38fdd5043391f4a23edee42729d8c7fbabd00569a80336 + "@octokit/core": ">=5" + checksum: 8795cb29be042c839098886a03c2ec6051e3fd7a29f16f4f8a487aa2d85ceb00df8a4432499a43af550369bd730ce9b1b9d7eeff768745b80a3e67698ca9a5dd languageName: node linkType: hard @@ -3366,17 +3354,6 @@ __metadata: languageName: node linkType: hard -"@octokit/request-error@npm:^3.0.0": - version: 3.0.3 - resolution: "@octokit/request-error@npm:3.0.3" - dependencies: - "@octokit/types": ^9.0.0 - deprecation: ^2.0.0 - once: ^1.4.0 - checksum: 5db0b514732686b627e6ed9ef1ccdbc10501f1b271a9b31f784783f01beee70083d7edcfeb35fbd7e569fa31fdd6762b1ff6b46101700d2d97e7e48e749520d0 - languageName: node - linkType: hard - "@octokit/request-error@npm:^5.0.0": version: 5.0.0 resolution: "@octokit/request-error@npm:5.0.0" @@ -3388,21 +3365,7 @@ __metadata: languageName: node linkType: hard -"@octokit/request@npm:^6.0.0": - version: 6.2.8 - resolution: "@octokit/request@npm:6.2.8" - dependencies: - "@octokit/endpoint": ^7.0.0 - "@octokit/request-error": ^3.0.0 - "@octokit/types": ^9.0.0 - is-plain-object: ^5.0.0 - node-fetch: ^2.6.7 - universal-user-agent: ^6.0.0 - checksum: 3747106f50d7c462131ff995b13defdd78024b7becc40283f4ac9ea0af2391ff33a0bb476a05aa710346fe766d20254979079a1d6f626112015ba271fe38f3e2 - languageName: node - linkType: hard - -"@octokit/request@npm:^8.0.0, @octokit/request@npm:^8.0.2": +"@octokit/request@npm:^8.0.0, @octokit/request@npm:^8.0.1, @octokit/request@npm:^8.0.2": version: 8.1.0 resolution: "@octokit/request@npm:8.1.0" dependencies: @@ -3415,31 +3378,15 @@ __metadata: languageName: node linkType: hard -"@octokit/rest@npm:19.0.13": - version: 19.0.13 - resolution: "@octokit/rest@npm:19.0.13" +"@octokit/rest@npm:20.0.1": + version: 20.0.1 + resolution: "@octokit/rest@npm:20.0.1" dependencies: - "@octokit/core": ^4.2.1 - "@octokit/plugin-paginate-rest": ^6.1.2 - "@octokit/plugin-request-log": ^1.0.4 - "@octokit/plugin-rest-endpoint-methods": ^7.1.2 - checksum: ca1553e3fe46efabffef60e68e4a228d4cc0f0d545daf7f019560f666d3e934c6f3a6402a42bbd786af4f3c0a6e69380776312f01b7d52998fe1bbdd1b068f69 - languageName: node - linkType: hard - -"@octokit/tsconfig@npm:^1.0.2": - version: 1.0.2 - resolution: "@octokit/tsconfig@npm:1.0.2" - checksum: 74d56f3e9f326a8dd63700e9a51a7c75487180629c7a68bbafee97c612fbf57af8347369bfa6610b9268a3e8b833c19c1e4beb03f26db9a9dce31f6f7a19b5b1 - languageName: node - linkType: hard - -"@octokit/types@npm:^10.0.0": - version: 10.0.0 - resolution: "@octokit/types@npm:10.0.0" - dependencies: - "@octokit/openapi-types": ^18.0.0 - checksum: 8aafba2ff0cd2435fb70c291bf75ed071c0fa8a865cf6169648732068a35dec7b85a345851f18920ec5f3e94ee0e954988485caac0da09ec3f6781cc44fe153a + "@octokit/core": ^5.0.0 + "@octokit/plugin-paginate-rest": ^8.0.0 + "@octokit/plugin-request-log": ^4.0.0 + "@octokit/plugin-rest-endpoint-methods": ^9.0.0 + checksum: 9fb2e154a498e00598379b09d76cc7b67b3801e9c97d753f1a76e1163924188bf4cb1411ec152a038ae91e97b86d7146ff220b05adfb6e500e2300c87e14100a languageName: node linkType: hard @@ -3452,15 +3399,6 @@ __metadata: languageName: node linkType: hard -"@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.3": - version: 9.3.2 - resolution: "@octokit/types@npm:9.3.2" - dependencies: - "@octokit/openapi-types": ^18.0.0 - checksum: f55d096aaed3e04b8308d4422104fb888f355988056ba7b7ef0a4c397b8a3e54290d7827b06774dbe0c9ce55280b00db486286954f9c265aa6b03091026d9da8 - languageName: node - linkType: hard - "@open-wc/dedupe-mixin@npm:^1.3.0": version: 1.4.0 resolution: "@open-wc/dedupe-mixin@npm:1.4.0" @@ -9704,7 +9642,7 @@ __metadata: "@mdi/svg": 7.2.96 "@octokit/auth-oauth-device": 6.0.0 "@octokit/plugin-retry": 6.0.0 - "@octokit/rest": 19.0.13 + "@octokit/rest": 20.0.1 "@open-wc/dev-server-hmr": 0.1.4 "@polymer/app-layout": 3.1.0 "@polymer/iron-flex-layout": 3.0.1 @@ -12315,20 +12253,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": - version: 2.6.11 - resolution: "node-fetch@npm:2.6.11" - dependencies: - whatwg-url: ^5.0.0 - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 249d0666a9497553384d46b5ab296ba223521ac88fed4d8a17d6ee6c2efb0fc890f3e8091cafe7f9fba8151a5b8d925db2671543b3409a56c3cd522b468b47b3 - languageName: node - linkType: hard - "node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -15296,13 +15220,6 @@ __metadata: languageName: node linkType: hard -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 - languageName: node - linkType: hard - "ts-lit-plugin@npm:2.0.0-pre.1": version: 2.0.0-pre.1 resolution: "ts-lit-plugin@npm:2.0.0-pre.1" @@ -16082,13 +15999,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c - languageName: node - linkType: hard - "webidl-conversions@npm:^4.0.2": version: 4.0.2 resolution: "webidl-conversions@npm:4.0.2" @@ -16322,16 +16232,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c - languageName: node - linkType: hard - "whatwg-url@npm:^7.0.0": version: 7.1.0 resolution: "whatwg-url@npm:7.1.0" From cb0bc762b124b83ce2dcb2c290c5dd6d2e38e7e6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 17:40:17 +0000 Subject: [PATCH 053/102] Update dependency prettier to v3 (#17215) * Update dependency prettier to v3 * Update config and remove .prettierignore * Reformat --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- .prettierignore | 9 - gallery/src/pages/automation/editor-action.ts | 21 +- .../src/pages/automation/editor-condition.ts | 21 +- .../src/pages/automation/editor-trigger.ts | 21 +- gallery/src/pages/components/ha-selector.ts | 35 +- gallery/src/pages/components/ha-tip.ts | 5 +- .../src/addon-view/info/hassio-addon-info.ts | 15 +- .../components/supervisor-backup-content.ts | 44 +- .../dialogs/network/dialog-hassio-network.ts | 37 +- .../registries/dialog-hassio-registries.ts | 9 +- .../dialog-hassio-repositories.ts | 9 +- hassio/src/system/hassio-core-info.ts | 15 +- hassio/src/system/hassio-host-info.ts | 15 +- hassio/src/system/hassio-supervisor-info.ts | 15 +- package.json | 6 +- prettier.config.js | 3 + src/common/translations/localize.ts | 2 +- src/components/chart/ha-chart-base.ts | 58 +-- .../device/ha-area-devices-picker.ts | 11 +- .../device/ha-device-automation-picker.ts | 2 +- src/components/device/ha-device-picker.ts | 11 +- src/components/entity/ha-entities-picker.ts | 6 +- src/components/entity/ha-statistic-picker.ts | 42 +- src/components/entity/state-badge.ts | 4 +- src/components/ha-addon-picker.ts | 25 +- src/components/ha-analytics.ts | 65 ++- src/components/ha-area-picker.ts | 13 +- src/components/ha-button-toggle-group.ts | 4 +- src/components/ha-config-entry-picker.ts | 45 +- src/components/ha-control-button.ts | 3 +- src/components/ha-control-circular-slider.ts | 10 +- src/components/ha-control-select.ts | 4 +- src/components/ha-control-slider.ts | 7 +- src/components/ha-control-switch.ts | 3 +- src/components/ha-form/ha-form-grid.ts | 21 +- src/components/ha-form/types.ts | 2 +- src/components/ha-gauge.ts | 12 +- src/components/ha-hs-color-picker.ts | 4 +- src/components/ha-mount-picker.ts | 41 +- .../ha-selector/ha-selector-select.ts | 25 +- src/components/ha-service-picker.ts | 13 +- src/components/ha-temp-color-picker.ts | 4 +- src/components/ha-tts-voice-picker.ts | 7 +- .../media-player/ha-media-player-browse.ts | 17 +- src/components/user/ha-users-picker.ts | 66 +-- src/data/config.ts | 2 +- src/data/frontend.ts | 6 +- src/data/selector.ts | 58 ++- .../config-flow/step-flow-create-entry.ts | 37 +- .../lights/dialog-light-color-favorite.ts | 31 +- .../lights/light-color-rgb-picker.ts | 4 +- .../controls/more-info-configurator.ts | 13 +- .../more-info/controls/more-info-fan.ts | 33 +- .../controls/more-info-media_player.ts | 27 +- .../notifications/notification-drawer.ts | 13 +- .../ha-voice-command-dialog.ts | 32 +- src/layouts/hass-tabs-subpage.ts | 39 +- src/panels/calendar/ha-panel-calendar.ts | 33 +- .../dialog-add-application-credential.ts | 7 +- .../config/areas/ha-config-area-page.ts | 17 +- .../types/ha-automation-action-choose.ts | 113 ++--- .../config/automation/ha-automation-picker.ts | 127 +++--- .../thingtalk/ha-thingtalk-placeholders.ts | 199 +++++---- .../config/blueprint/ha-blueprint-overview.ts | 9 +- .../core/ha-config-system-navigation.ts | 5 +- .../ha-device-automation-card.ts | 29 +- .../config/devices/ha-config-device-page.ts | 61 ++- .../components/ha-energy-battery-settings.ts | 13 +- .../components/ha-energy-device-settings.ts | 13 +- .../components/ha-energy-gas-settings.ts | 13 +- .../components/ha-energy-solar-settings.ts | 13 +- .../components/ha-energy-water-settings.ts | 13 +- .../dialogs/dialog-energy-solar-settings.ts | 49 +-- .../entity-registry-settings-editor.ts | 8 +- .../config/entities/ha-config-entities.ts | 17 +- .../hardware/dialog-hardware-available.ts | 89 ++-- .../config/helpers/forms/ha-counter-form.ts | 9 +- .../helpers/forms/ha-input_boolean-form.ts | 9 +- .../helpers/forms/ha-input_button-form.ts | 9 +- .../helpers/forms/ha-input_datetime-form.ts | 9 +- .../helpers/forms/ha-input_number-form.ts | 9 +- .../helpers/forms/ha-input_select-form.ts | 9 +- .../helpers/forms/ha-input_text-form.ts | 9 +- .../config/helpers/forms/ha-schedule-form.ts | 9 +- .../config/helpers/forms/ha-timer-form.ts | 9 +- .../config/helpers/ha-config-helpers.ts | 13 +- .../ha-config-integration-page.ts | 33 +- .../ha-config-integrations-dashboard.ts | 2 +- .../integrations/ha-domain-integrations.ts | 45 +- .../zha/zha-config-dashboard.ts | 39 +- .../zha/zha-groups-dashboard.ts | 5 +- .../zwave_js/dialog-zwave_js-add-node.ts | 41 +- .../dialog-zwave_js-node-statistics.ts | 2 +- .../zwave_js/zwave_js-node-config.ts | 52 +-- .../ha-config-lovelace-dashboards.ts | 11 +- .../resources/ha-config-lovelace-resources.ts | 11 +- .../config/network/supervisor-network.ts | 37 +- .../repairs/dialog-system-information.ts | 46 +-- src/panels/config/scene/ha-scene-dashboard.ts | 92 ++--- src/panels/config/scene/ha-scene-editor.ts | 73 ++-- src/panels/config/script/ha-script-picker.ts | 91 ++-- src/panels/config/tags/ha-config-tags.ts | 66 +-- src/panels/config/users/ha-config-users.ts | 5 +- .../debug/assist-render-pipeline-run.ts | 13 +- .../ha-config-voice-assistants-expose.ts | 9 +- .../event/event-subscribe-card.ts | 37 +- .../service/developer-tools-service.ts | 19 +- .../template/developer-tools-template.ts | 38 +- .../developer-yaml-config.ts | 35 +- .../energy/hui-energy-distribution-card.ts | 24 +- .../energy/hui-energy-sources-table-card.ts | 391 +++++++++--------- .../lovelace/cards/hui-media-control-card.ts | 20 +- .../lovelace/cards/hui-shopping-list-card.ts | 100 ++--- src/panels/lovelace/cards/hui-tile-card.ts | 4 +- .../common/process-config-entities.ts | 2 +- .../components/hui-energy-period-selector.ts | 4 +- .../create-element/create-element-base.ts | 4 +- .../hui-statistics-graph-card-editor.ts | 9 +- .../hui-dialog-create-headerfooter.ts | 39 +- .../entity-rows/hui-select-entity-row.ts | 25 +- .../lovelace/strategies/get-strategy.ts | 2 +- .../ha-long-lived-access-tokens-card.ts | 38 +- src/panels/profile/ha-mfa-modules-card.ts | 31 +- src/panels/profile/ha-refresh-tokens-card.ts | 104 ++--- src/state-summary/state-card-select.ts | 25 +- src/state/url-sync-mixin.ts | 2 +- yarn.lock | 12 +- 127 files changed, 1842 insertions(+), 1820 deletions(-) delete mode 100644 .prettierignore create mode 100644 prettier.config.js diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 68fe46e32c..0000000000 --- a/.prettierignore +++ /dev/null @@ -1,9 +0,0 @@ -build -translations/* -node_modules/* -hass_frontend/* -pip-selfcheck.json - -# vscode -.vscode/* -!.vscode/extensions.json diff --git a/gallery/src/pages/automation/editor-action.ts b/gallery/src/pages/automation/editor-action.ts index 376f547d72..28f9bb16e2 100644 --- a/gallery/src/pages/automation/editor-action.ts +++ b/gallery/src/pages/automation/editor-action.ts @@ -85,17 +85,16 @@ class DemoHaAutomationEditorAction extends LitElement { .value=${this.data[sampleIdx]} > ${["light", "dark"].map( - (slot) => - html` - - ` + (slot) => html` + + ` )} ` diff --git a/gallery/src/pages/automation/editor-condition.ts b/gallery/src/pages/automation/editor-condition.ts index 7504d9dc46..3a43eda71e 100644 --- a/gallery/src/pages/automation/editor-condition.ts +++ b/gallery/src/pages/automation/editor-condition.ts @@ -121,17 +121,16 @@ class DemoHaAutomationEditorCondition extends LitElement { .value=${this.data[sampleIdx]} > ${["light", "dark"].map( - (slot) => - html` - - ` + (slot) => html` + + ` )} ` diff --git a/gallery/src/pages/automation/editor-trigger.ts b/gallery/src/pages/automation/editor-trigger.ts index cdc9ed2c83..30c9721256 100644 --- a/gallery/src/pages/automation/editor-trigger.ts +++ b/gallery/src/pages/automation/editor-trigger.ts @@ -167,17 +167,16 @@ class DemoHaAutomationEditorTrigger extends LitElement { .value=${this.data[sampleIdx]} > ${["light", "dark"].map( - (slot) => - html` - - ` + (slot) => html` + + ` )} ` diff --git a/gallery/src/pages/components/ha-selector.ts b/gallery/src/pages/components/ha-selector.ts index 9ac7959635..4cdc97013b 100644 --- a/gallery/src/pages/components/ha-selector.ts +++ b/gallery/src/pages/components/ha-selector.ts @@ -497,24 +497,23 @@ class DemoHaSelector extends LitElement implements ProvideHassElement { ${["light", "dark"].map((slot) => Object.entries(info.input).map( - ([key, value]) => - html` - - ${value?.name || key} - ${value?.description} - - - ` + ([key, value]) => html` + + ${value?.name || key} + ${value?.description} + + + ` ) )} diff --git a/gallery/src/pages/components/ha-tip.ts b/gallery/src/pages/components/ha-tip.ts index 1f349efa7e..b9e9e5fc73 100644 --- a/gallery/src/pages/components/ha-tip.ts +++ b/gallery/src/pages/components/ha-tip.ts @@ -20,9 +20,8 @@ export class DemoHaTip extends LitElement {
    ${tips.map( - (tip) => html`${tip}` + (tip) => + html`${tip}` )}
    diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index 5800d2e1b0..fee9340720 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -544,14 +544,13 @@ class HassioAddonInfo extends LitElement { ${this.addon.hostname} ${metrics.map( - (metric) => - html` - - ` + (metric) => html` + + ` )}` : ""}
    diff --git a/hassio/src/components/supervisor-backup-content.ts b/hassio/src/components/supervisor-backup-content.ts index ded21bf63a..81b4f6fbf1 100644 --- a/hassio/src/components/supervisor-backup-content.ts +++ b/hassio/src/components/supervisor-backup-content.ts @@ -384,28 +384,30 @@ export class SupervisorBackupContent extends LitElement { : undefined; let checkedItems = 0; this[section].forEach((item) => { - templates.push(html` + `} > - `} - > - - - `); + + + ` + ); if (item.checked) { checkedItems++; diff --git a/hassio/src/dialogs/network/dialog-hassio-network.ts b/hassio/src/dialogs/network/dialog-hassio-network.ts index 943e92972c..f3a77f8b40 100644 --- a/hassio/src/dialogs/network/dialog-hassio-network.ts +++ b/hassio/src/dialogs/network/dialog-hassio-network.ts @@ -168,25 +168,24 @@ export class DialogHassioNetwork ${this._accessPoints.accesspoints .filter((ap) => ap.ssid) .map( - (ap) => - html` - - ${ap.ssid} - - ${ap.mac} - - ${this.supervisor.localize( - "dialog.network.signal_strength" - )}: - ${ap.signal} - - - ` + (ap) => html` + + ${ap.ssid} + + ${ap.mac} - + ${this.supervisor.localize( + "dialog.network.signal_strength" + )}: + ${ap.signal} + + + ` )} ` diff --git a/hassio/src/dialogs/registries/dialog-hassio-registries.ts b/hassio/src/dialogs/registries/dialog-hassio-registries.ts index e26753e5dc..d623ebf3b8 100644 --- a/hassio/src/dialogs/registries/dialog-hassio-registries.ts +++ b/hassio/src/dialogs/registries/dialog-hassio-registries.ts @@ -157,10 +157,11 @@ class HassioRegistriesDialog extends LitElement { } public focus(): void { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts b/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts index aeac743f31..bf42ff4499 100644 --- a/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts +++ b/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts @@ -209,10 +209,11 @@ class HassioRepositoriesDialog extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/hassio/src/system/hassio-core-info.ts b/hassio/src/system/hassio-core-info.ts index 254d602e87..7754728757 100644 --- a/hassio/src/system/hassio-core-info.ts +++ b/hassio/src/system/hassio-core-info.ts @@ -81,14 +81,13 @@ class HassioCoreInfo extends LitElement {
    ${metrics.map( - (metric) => - html` - - ` + (metric) => html` + + ` )}
    diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index cfb039d935..4e84c0f23f 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -154,14 +154,13 @@ class HassioHostInfo extends LitElement { ` : ""} ${metrics.map( - (metric) => - html` - - ` + (metric) => html` + + ` )} diff --git a/hassio/src/system/hassio-supervisor-info.ts b/hassio/src/system/hassio-supervisor-info.ts index 1dbca65417..d083bfb613 100644 --- a/hassio/src/system/hassio-supervisor-info.ts +++ b/hassio/src/system/hassio-supervisor-info.ts @@ -178,14 +178,13 @@ class HassioSupervisorInfo extends LitElement {
    ${metrics.map( - (metric) => - html` - - ` + (metric) => html` + + ` )}
    diff --git a/package.json b/package.json index 2611334d32..c7be5ec960 100644 --- a/package.json +++ b/package.json @@ -227,7 +227,7 @@ "object-hash": "3.0.0", "open": "9.1.0", "pinst": "3.0.0", - "prettier": "2.8.8", + "prettier": "3.0.0", "rollup": "2.79.1", "rollup-plugin-string": "3.0.0", "rollup-plugin-terser": "7.0.2", @@ -256,9 +256,5 @@ "sortablejs@1.15.0": "patch:sortablejs@npm%3A1.15.0#./.yarn/patches/sortablejs-npm-1.15.0-f3a393abcc.patch", "leaflet-draw@1.0.4": "patch:leaflet-draw@npm%3A1.0.4#./.yarn/patches/leaflet-draw-npm-1.0.4-0ca0ebcf65.patch" }, - "prettier": { - "trailingComma": "es5", - "arrowParens": "always" - }, "packageManager": "yarn@3.6.1" } diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000000..e8646cb474 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,3 @@ +export default { + trailingComma: "es5", +}; diff --git a/src/common/translations/localize.ts b/src/common/translations/localize.ts index 8117af0ffe..15773a5cb5 100644 --- a/src/common/translations/localize.ts +++ b/src/common/translations/localize.ts @@ -38,7 +38,7 @@ export type LocalizeKeys = // Tweaked from https://www.raygesualdo.com/posts/flattening-object-keys-with-typescript-types export type FlattenObjectKeys< T extends Record, - Key extends keyof T = keyof T + Key extends keyof T = keyof T, > = Key extends string ? T[Key] extends Record ? `${Key}.${FlattenObjectKeys}` diff --git a/src/components/chart/ha-chart-base.ts b/src/components/chart/ha-chart-base.ts index 902d567885..389fd8dab6 100644 --- a/src/components/chart/ha-chart-base.ts +++ b/src/components/chart/ha-chart-base.ts @@ -108,23 +108,24 @@ export default class HaChartBase extends LitElement { ? html`
      ${this.data.datasets.map( - (dataset, index) => html`
    • -
      + html`
    -
    ${dataset.label}
    - ` + .title=${dataset.label} + > +
    +
    ${dataset.label}
    + ` )} ` @@ -156,18 +157,19 @@ export default class HaChartBase extends LitElement {
      ${this._tooltip.body.map( - (item, i) => html`
    • -
      - ${item.lines.join("\n")} -
    • ` + (item, i) => + html`
    • +
      + ${item.lines.join("\n")} +
    • ` )}
    diff --git a/src/components/device/ha-area-devices-picker.ts b/src/components/device/ha-area-devices-picker.ts index d7c4a1d0b3..8964ff566c 100644 --- a/src/components/device/ha-area-devices-picker.ts +++ b/src/components/device/ha-area-devices-picker.ts @@ -36,12 +36,11 @@ interface AreaDevices { devices: string[]; } -const rowRenderer: ComboBoxLitRenderer = ( - item -) => html` - ${item.name} - ${item.devices.length} devices -`; +const rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.name} + ${item.devices.length} devices + `; @customElement("ha-area-devices-picker") export class HaAreaDevicesPicker extends SubscribeMixin(LitElement) { diff --git a/src/components/device/ha-device-automation-picker.ts b/src/components/device/ha-device-automation-picker.ts index 0189fc5d4c..87257aba4f 100644 --- a/src/components/device/ha-device-automation-picker.ts +++ b/src/components/device/ha-device-automation-picker.ts @@ -17,7 +17,7 @@ const NO_AUTOMATION_KEY = "NO_AUTOMATION"; const UNKNOWN_AUTOMATION_KEY = "UNKNOWN_AUTOMATION"; export abstract class HaDeviceAutomationPicker< - T extends DeviceAutomation + T extends DeviceAutomation, > extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index fb837d15b2..8b8d5bf8a0 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -45,12 +45,11 @@ export type HaDevicePickerDeviceFilterFunc = ( export type HaDevicePickerEntityFilterFunc = (entity: HassEntity) => boolean; -const rowRenderer: ComboBoxLitRenderer = (item) => html` - ${item.name} - ${item.area} -`; +const rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.name} + ${item.area} + `; @customElement("ha-device-picker") export class HaDevicePicker extends SubscribeMixin(LitElement) { diff --git a/src/components/entity/ha-entities-picker.ts b/src/components/entity/ha-entities-picker.ts index 8eae3577bb..21aebdfd2c 100644 --- a/src/components/entity/ha-entities-picker.ts +++ b/src/components/entity/ha-entities-picker.ts @@ -130,9 +130,9 @@ class HaEntitiesPickerLight extends LitElement { private _getEntityFilter = memoizeOne( ( - value: string[] | undefined, - entityFilter: HaEntityPickerEntityFilterFunc | undefined - ): HaEntityPickerEntityFilterFunc => + value: string[] | undefined, + entityFilter: HaEntityPickerEntityFilterFunc | undefined + ): HaEntityPickerEntityFilterFunc => (stateObj: HassEntity) => (!value || !value.includes(stateObj.entity_id)) && (!entityFilter || entityFilter(stateObj)) diff --git a/src/components/entity/ha-statistic-picker.ts b/src/components/entity/ha-statistic-picker.ts index f5c1d7ff22..e9a9388243 100644 --- a/src/components/entity/ha-statistic-picker.ts +++ b/src/components/entity/ha-statistic-picker.ts @@ -87,26 +87,28 @@ export class HaStatisticPicker extends LitElement { private _statistics: StatisticItem[] = []; - private _rowRenderer: ComboBoxLitRenderer = ( - item - ) => html` - ${item.state - ? html`` - : ""} - ${item.name} - ${item.id === "" || item.id === "__missing" - ? html`
    ${this.hass.localize( - "ui.components.statistic-picker.learn_more" - )}` - : item.id} - `; + private _rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.state + ? html`` + : ""} + ${item.name} + ${item.id === "" || item.id === "__missing" + ? html`${this.hass.localize( + "ui.components.statistic-picker.learn_more" + )}` + : item.id} + `; private _getStatistics = memoizeOne( ( diff --git a/src/components/entity/state-badge.ts b/src/components/entity/state-badge.ts index 2b6f936497..1c91fce31b 100644 --- a/src/components/entity/state-badge.ts +++ b/src/components/entity/state-badge.ts @@ -211,7 +211,9 @@ export class StateBadge extends LitElement { background: var(--divider-color); } ha-state-icon { - transition: color 0.3s ease-in-out, filter 0.3s ease-in-out; + transition: + color 0.3s ease-in-out, + filter 0.3s ease-in-out; } .missing { color: #fce588; diff --git a/src/components/ha-addon-picker.ts b/src/components/ha-addon-picker.ts index 099da62e9f..c169ecc532 100644 --- a/src/components/ha-addon-picker.ts +++ b/src/components/ha-addon-picker.ts @@ -11,19 +11,18 @@ import "./ha-combo-box"; import type { HaComboBox } from "./ha-combo-box"; import "./ha-list-item"; -const rowRenderer: ComboBoxLitRenderer = ( - item -) => html` - ${item.name} - ${item.slug} - ${item.icon - ? html`` - : ""} -`; +const rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.name} + ${item.slug} + ${item.icon + ? html`` + : ""} + `; @customElement("ha-addon-picker") class HaAddonPicker extends LitElement { diff --git a/src/components/ha-analytics.ts b/src/components/ha-analytics.ts index 9faec6a273..15e356582d 100644 --- a/src/components/ha-analytics.ts +++ b/src/components/ha-analytics.ts @@ -53,39 +53,38 @@ export class HaAnalytics extends LitElement { ${ADDITIONAL_PREFERENCES.map( - (preference) => - html` - - - ${this.localize( - `ui.panel.${this.translationKeyPanel}.analytics.preferences.${preference}.title` - )} - - - ${this.localize( - `ui.panel.${this.translationKeyPanel}.analytics.preferences.${preference}.description` - )} - - - - - ${!baseEnabled - ? html` - - ${this.localize( - `ui.panel.${this.translationKeyPanel}.analytics.need_base_enabled` - )} - - ` - : ""} - - - ` + (preference) => html` + + + ${this.localize( + `ui.panel.${this.translationKeyPanel}.analytics.preferences.${preference}.title` + )} + + + ${this.localize( + `ui.panel.${this.translationKeyPanel}.analytics.preferences.${preference}.description` + )} + + + + + ${!baseEnabled + ? html` + + ${this.localize( + `ui.panel.${this.translationKeyPanel}.analytics.need_base_enabled` + )} + + ` + : ""} + + + ` )} diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts index 1ea409aafe..5d56c69082 100644 --- a/src/components/ha-area-picker.ts +++ b/src/components/ha-area-picker.ts @@ -34,13 +34,12 @@ import "./ha-svg-icon"; type ScorableAreaRegistryEntry = ScorableTextItem & AreaRegistryEntry; -const rowRenderer: ComboBoxLitRenderer = ( - item -) => html` - ${item.name} -`; +const rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.name} + `; @customElement("ha-area-picker") export class HaAreaPicker extends LitElement { diff --git a/src/components/ha-button-toggle-group.ts b/src/components/ha-button-toggle-group.ts index 8534cfba0b..e4dd2e9524 100644 --- a/src/components/ha-button-toggle-group.ts +++ b/src/components/ha-button-toggle-group.ts @@ -94,7 +94,9 @@ export class HaButtonToggleGroup extends LitElement { opacity: 0; pointer-events: none; content: ""; - transition: opacity 15ms linear, background-color 15ms linear; + transition: + opacity 15ms linear, + background-color 15ms linear; } ha-icon-button[active]::before, mwc-button[active]::before { diff --git a/src/components/ha-config-entry-picker.ts b/src/components/ha-config-entry-picker.ts index fb99d62b5a..65f2064931 100644 --- a/src/components/ha-config-entry-picker.ts +++ b/src/components/ha-config-entry-picker.ts @@ -47,29 +47,28 @@ class HaConfigEntryPicker extends LitElement { this._getConfigEntries(); } - private _rowRenderer: ComboBoxLitRenderer = ( - item - ) => html` - ${item.title || - this.hass.localize( - "ui.panel.config.integrations.config_entry.unnamed_entry" - )} - ${item.localized_domain_name} - - `; + private _rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.title || + this.hass.localize( + "ui.panel.config.integrations.config_entry.unnamed_entry" + )} + ${item.localized_domain_name} + + `; protected render() { if (!this._configEntries) { diff --git a/src/components/ha-control-button.ts b/src/components/ha-control-button.ts index 8c8f467f76..1eee1286e6 100644 --- a/src/components/ha-control-button.ts +++ b/src/components/ha-control-button.ts @@ -122,7 +122,8 @@ export class HaControlButton extends LitElement { height: 100%; width: 100%; background-color: var(--control-button-background-color); - transition: background-color 180ms ease-in-out, + transition: + background-color 180ms ease-in-out, opacity 180ms ease-in-out; opacity: var(--control-button-background-opacity); } diff --git a/src/components/ha-control-circular-slider.ts b/src/components/ha-control-circular-slider.ts index 97bc2ea566..5b3caf3bef 100644 --- a/src/components/ha-control-circular-slider.ts +++ b/src/components/ha-control-circular-slider.ts @@ -566,7 +566,9 @@ export class HaControlCircularSlider extends LitElement { fill: none; stroke: var(--control-circular-slider-background); opacity: var(--control-circular-slider-background-opacity); - transition: stroke 180ms ease-in-out, opacity 180ms ease-in-out; + transition: + stroke 180ms ease-in-out, + opacity 180ms ease-in-out; stroke-linecap: round; stroke-width: 24px; } @@ -576,9 +578,11 @@ export class HaControlCircularSlider extends LitElement { fill: none; stroke-linecap: round; stroke-width: 24px; - transition: stroke-width 300ms ease-in-out, + transition: + stroke-width 300ms ease-in-out, stroke-dasharray 300ms ease-in-out, - stroke-dashoffset 300ms ease-in-out, stroke 180ms ease-in-out, + stroke-dashoffset 300ms ease-in-out, + stroke 180ms ease-in-out, opacity 180ms ease-in-out; } diff --git a/src/components/ha-control-select.ts b/src/components/ha-control-select.ts index 1a48c0574c..855fc338a1 100644 --- a/src/components/ha-control-select.ts +++ b/src/components/ha-control-select.ts @@ -283,7 +283,9 @@ export class HaControlSelect extends LitElement { width: 100%; background-color: var(--control-select-color); opacity: 0; - transition: background-color ease-in-out 180ms, opacity ease-in-out 80ms; + transition: + background-color ease-in-out 180ms, + opacity ease-in-out 80ms; } .option.focused::before, .option:hover::before { diff --git a/src/components/ha-control-slider.ts b/src/components/ha-control-slider.ts index 3f4abcf4e3..c3450c6014 100644 --- a/src/components/ha-control-slider.ts +++ b/src/components/ha-control-slider.ts @@ -327,7 +327,8 @@ export class HaControlSlider extends LitElement { height: 100%; width: 100%; background-color: var(--control-slider-color); - transition: transform 180ms ease-in-out, + transition: + transform 180ms ease-in-out, background-color 180ms ease-in-out; } .slider .slider-track-bar.show-handle { @@ -427,7 +428,9 @@ export class HaControlSlider extends LitElement { position: absolute; background-color: white; border-radius: var(--handle-size); - transition: left 180ms ease-in-out, bottom 180ms ease-in-out; + transition: + left 180ms ease-in-out, + bottom 180ms ease-in-out; top: 0; bottom: 0; left: calc(var(--value, 0) * (100% - var(--cursor-size))); diff --git a/src/components/ha-control-switch.ts b/src/components/ha-control-switch.ts index ae15ce98b7..759ee93f9d 100644 --- a/src/components/ha-control-switch.ts +++ b/src/components/ha-control-switch.ts @@ -208,7 +208,8 @@ export class HaControlSwitch extends LitElement { border-radius: calc( var(--control-switch-border-radius) - var(--control-switch-padding) ); - transition: transform 180ms ease-in-out, + transition: + transform 180ms ease-in-out, background-color 180ms ease-in-out; background-color: var(--control-switch-off-color); color: white; diff --git a/src/components/ha-form/ha-form-grid.ts b/src/components/ha-form/ha-form-grid.ts index f74377c12a..a3fbcb079a 100644 --- a/src/components/ha-form/ha-form-grid.ts +++ b/src/components/ha-form/ha-form-grid.ts @@ -55,17 +55,16 @@ export class HaFormGrid extends LitElement implements HaFormElement { protected render(): TemplateResult { return html` ${this.schema.schema.map( - (item) => - html` - - ` + (item) => html` + + ` )} `; } diff --git a/src/components/ha-form/types.ts b/src/components/ha-form/types.ts index 287b904780..e2e032312d 100644 --- a/src/components/ha-form/types.ts +++ b/src/components/ha-form/types.ts @@ -98,7 +98,7 @@ export interface HaFormTimeSchema extends HaFormBaseSchema { // Type utility to unionize a schema array by flattening any grid schemas export type SchemaUnion< SchemaArray extends readonly HaFormSchema[], - Schema = SchemaArray[number] + Schema = SchemaArray[number], > = Schema extends HaFormGridSchema | HaFormExpandableSchema ? SchemaUnion : Schema; diff --git a/src/components/ha-gauge.ts b/src/components/ha-gauge.ts index 1895e419db..e6faa19773 100644 --- a/src/components/ha-gauge.ts +++ b/src/components/ha-gauge.ts @@ -138,12 +138,12 @@ export class Gauge extends LitElement { : this.valueText || formatNumber(this.value, this.locale, this.formatOptions) }${ - this._segment_label - ? "" - : this.label === "%" - ? blankBeforePercent(this.locale) + "%" - : ` ${this.label}` - } + this._segment_label + ? "" + : this.label === "%" + ? blankBeforePercent(this.locale) + "%" + : ` ${this.label}` + } `; } diff --git a/src/components/ha-hs-color-picker.ts b/src/components/ha-hs-color-picker.ts index ba5d038526..cef11cfc38 100644 --- a/src/components/ha-hs-color-picker.ts +++ b/src/components/ha-hs-color-picker.ts @@ -406,7 +406,9 @@ class HaHsColorPicker extends LitElement { filter: url(#marker-shadow); } .container:not(.pressed) circle { - transition: transform 100ms ease-in-out, fill 100ms ease-in-out; + transition: + transform 100ms ease-in-out, + fill 100ms ease-in-out; } .container:not(.pressed) .cursor { transition: transform 200ms ease-in-out; diff --git a/src/components/ha-mount-picker.ts b/src/components/ha-mount-picker.ts index fd47688001..6a35dea416 100644 --- a/src/components/ha-mount-picker.ts +++ b/src/components/ha-mount-picker.ts @@ -81,28 +81,25 @@ class HaMountPicker extends LitElement { ? dataDiskOption : nothing} ${this._filterMounts(this._mounts, this.usage).map( - (mount) => html` - ${mount.name} - ${mount.server}${mount.port - ? `:${mount.port}` - : nothing}${mount.type === SupervisorMountType.NFS - ? mount.path - : `:${mount.share}`} - - ` + (mount) => + html` + ${mount.name} + ${mount.server}${mount.port + ? `:${mount.port}` + : nothing}${mount.type === SupervisorMountType.NFS + ? mount.path + : `:${mount.share}`} + + ` )} ${this.usage === SupervisorMountUsage.BACKUP && this._mounts.default_backup_mount diff --git a/src/components/ha-selector/ha-selector-select.ts b/src/components/ha-selector/ha-selector-select.ts index e8bd3ac4b4..71747c4d27 100644 --- a/src/components/ha-selector/ha-selector-select.ts +++ b/src/components/ha-selector/ha-selector-select.ts @@ -112,19 +112,18 @@ export class HaSelectSelector extends LitElement { ${value?.length ? html` ${value.map( - (item, idx) => - html` - - ${options.find((option) => option.value === item) - ?.label || item} - - - ` + (item, idx) => html` + + ${options.find((option) => option.value === item)?.label || + item} + + + ` )} ` : ""} diff --git a/src/components/ha-service-picker.ts b/src/components/ha-service-picker.ts index 9ef0dc670a..db4dec62d7 100644 --- a/src/components/ha-service-picker.ts +++ b/src/components/ha-service-picker.ts @@ -10,12 +10,13 @@ import "./ha-combo-box"; const rowRenderer: ComboBoxLitRenderer<{ service: string; name: string }> = ( item -) => html` - ${item.name} - ${item.name === item.service ? "" : item.service} -`; +) => + html` + ${item.name} + ${item.name === item.service ? "" : item.service} + `; @customElement("ha-service-picker") class HaServicePicker extends LitElement { diff --git a/src/components/ha-temp-color-picker.ts b/src/components/ha-temp-color-picker.ts index b2f2b26dfc..4e0d109109 100644 --- a/src/components/ha-temp-color-picker.ts +++ b/src/components/ha-temp-color-picker.ts @@ -418,7 +418,9 @@ class HaTempColorPicker extends LitElement { filter: url(#marker-shadow); } .container:not(.pressed) circle { - transition: transform 100ms ease-in-out, fill 100ms ease-in-out; + transition: + transform 100ms ease-in-out, + fill 100ms ease-in-out; } .container:not(.pressed) .cursor { transition: transform 200ms ease-in-out; diff --git a/src/components/ha-tts-voice-picker.ts b/src/components/ha-tts-voice-picker.ts index 8cbe24dffd..cfea9c3c5c 100644 --- a/src/components/ha-tts-voice-picker.ts +++ b/src/components/ha-tts-voice-picker.ts @@ -62,9 +62,10 @@ export class HaTTSVoicePicker extends LitElement { ` : nothing} ${this._voices.map( - (voice) => html` - ${voice.name} - ` + (voice) => + html` + ${voice.name} + ` )} `; diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index ae617af86b..2600758eac 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -930,7 +930,9 @@ export class HaMediaPlayerBrowse extends LitElement { margin-right: 16px; background-size: cover; border-radius: 2px; - transition: width 0.4s, height 0.4s; + transition: + width 0.4s, + height 0.4s; } .header-info { display: flex; @@ -977,7 +979,9 @@ export class HaMediaPlayerBrowse extends LitElement { overflow: hidden; text-overflow: ellipsis; margin-bottom: 0; - transition: height 0.5s, margin 0.5s; + transition: + height 0.5s, + margin 0.5s; } .not-shown { @@ -1121,7 +1125,9 @@ export class HaMediaPlayerBrowse extends LitElement { top: auto; bottom: 0px; right: 8px; - transition: bottom 0.1s ease-out, opacity 0.1s ease-out; + transition: + bottom 0.1s ease-out, + opacity 0.1s ease-out; } .child .play:hover { @@ -1220,7 +1226,10 @@ export class HaMediaPlayerBrowse extends LitElement { position: relative; background-position: center; border-radius: 0; - transition: width 0.4s, height 0.4s, padding-bottom 0.4s; + transition: + width 0.4s, + height 0.4s, + padding-bottom 0.4s; } ha-fab { position: absolute; diff --git a/src/components/user/ha-users-picker.ts b/src/components/user/ha-users-picker.ts index a78de5ed4c..aeda071a88 100644 --- a/src/components/user/ha-users-picker.ts +++ b/src/components/user/ha-users-picker.ts @@ -40,38 +40,40 @@ class HaUsersPickerLight extends LitElement { const notSelectedUsers = this._notSelectedUsers(this.users, this.value); return html` - ${guard([notSelectedUsers], () => - this.value?.map( - (user_id, idx) => html` -
    - - - > -
    - ` - ) + ${guard( + [notSelectedUsers], + () => + this.value?.map( + (user_id, idx) => html` +
    + + + > +
    + ` + ) )} + T extends Partial<{ [key in ValidKeys]: unknown }>, >( hass: HomeAssistant, config: T diff --git a/src/data/frontend.ts b/src/data/frontend.ts index 8760859c65..9e0095e7a9 100644 --- a/src/data/frontend.ts +++ b/src/data/frontend.ts @@ -14,7 +14,7 @@ declare global { export type ValidUserDataKey = keyof FrontendUserData; export const fetchFrontendUserData = async < - UserDataKey extends ValidUserDataKey + UserDataKey extends ValidUserDataKey, >( conn: Connection, key: UserDataKey @@ -29,7 +29,7 @@ export const fetchFrontendUserData = async < }; export const saveFrontendUserData = async < - UserDataKey extends ValidUserDataKey + UserDataKey extends ValidUserDataKey, >( conn: Connection, key: UserDataKey, @@ -42,7 +42,7 @@ export const saveFrontendUserData = async < }); export const getOptimisticFrontendUserDataCollection = < - UserDataKey extends ValidUserDataKey + UserDataKey extends ValidUserDataKey, >( conn: Connection, userDataKey: UserDataKey diff --git a/src/data/selector.ts b/src/data/selector.ts index f046a5a1fd..71805ef7d4 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -145,21 +145,20 @@ export interface DeviceSelector { } export interface LegacyDeviceSelector { - device: - | DeviceSelector["device"] & { - /** - * @deprecated Use filter instead - */ - integration?: DeviceSelectorFilter["integration"]; - /** - * @deprecated Use filter instead - */ - manufacturer?: DeviceSelectorFilter["manufacturer"]; - /** - * @deprecated Use filter instead - */ - model?: DeviceSelectorFilter["model"]; - }; + device: DeviceSelector["device"] & { + /** + * @deprecated Use filter instead + */ + integration?: DeviceSelectorFilter["integration"]; + /** + * @deprecated Use filter instead + */ + manufacturer?: DeviceSelectorFilter["manufacturer"]; + /** + * @deprecated Use filter instead + */ + model?: DeviceSelectorFilter["model"]; + }; } export interface DurationSelector { @@ -185,21 +184,20 @@ export interface EntitySelector { } export interface LegacyEntitySelector { - entity: - | EntitySelector["entity"] & { - /** - * @deprecated Use filter instead - */ - integration?: EntitySelectorFilter["integration"]; - /** - * @deprecated Use filter instead - */ - domain?: EntitySelectorFilter["domain"]; - /** - * @deprecated Use filter instead - */ - device_class?: EntitySelectorFilter["device_class"]; - }; + entity: EntitySelector["entity"] & { + /** + * @deprecated Use filter instead + */ + integration?: EntitySelectorFilter["integration"]; + /** + * @deprecated Use filter instead + */ + domain?: EntitySelectorFilter["domain"]; + /** + * @deprecated Use filter instead + */ + device_class?: EntitySelectorFilter["device_class"]; + }; } export interface StatisticSelector { diff --git a/src/dialogs/config-flow/step-flow-create-entry.ts b/src/dialogs/config-flow/step-flow-create-entry.ts index a43477d8c0..1ceb034b7a 100644 --- a/src/dialogs/config-flow/step-flow-create-entry.ts +++ b/src/dialogs/config-flow/step-flow-create-entry.ts @@ -48,26 +48,25 @@ class StepFlowCreateEntry extends LitElement {

    ${this.devices.map( - (device) => - html` -
    -
    - ${computeDeviceName(device, this.hass)}
    - ${!device.model && !device.manufacturer - ? html` ` - : html`${device.model} - ${device.manufacturer - ? html`(${device.manufacturer})` - : ""}`} -
    - + (device) => html` +
    +
    + ${computeDeviceName(device, this.hass)}
    + ${!device.model && !device.manufacturer + ? html` ` + : html`${device.model} + ${device.manufacturer + ? html`(${device.manufacturer})` + : ""}`}
    - ` + +
    + ` )}
    `} diff --git a/src/dialogs/more-info/components/lights/dialog-light-color-favorite.ts b/src/dialogs/more-info/components/lights/dialog-light-color-favorite.ts index 410ba70c04..8549c90682 100644 --- a/src/dialogs/more-info/components/lights/dialog-light-color-favorite.ts +++ b/src/dialogs/more-info/components/lights/dialog-light-color-favorite.ts @@ -150,22 +150,21 @@ class DialogLightColorFavorite extends LitElement { ? html`
    ${this._modes.map( - (value) => - html` - - - - ` + (value) => html` + + + + ` )}
    ` diff --git a/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts b/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts index cf50ae5c04..90b18f4223 100644 --- a/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts +++ b/src/dialogs/more-info/components/lights/light-color-rgb-picker.ts @@ -415,7 +415,7 @@ class LightRgbColorPicker extends LitElement { number, number, number, - number + number, ]; this._applyColor({ rgbww_color }); } else if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGBW)) { @@ -427,7 +427,7 @@ class LightRgbColorPicker extends LitElement { number, number, number, - number + number, ]; this._applyColor({ rgbw_color }); } diff --git a/src/dialogs/more-info/controls/more-info-configurator.ts b/src/dialogs/more-info/controls/more-info-configurator.ts index 0e68a22c7e..76c2fb9f5b 100644 --- a/src/dialogs/more-info/controls/more-info-configurator.ts +++ b/src/dialogs/more-info/controls/more-info-configurator.ts @@ -36,12 +36,13 @@ export class MoreInfoConfigurator extends LitElement { ` : ""} ${this.stateObj.attributes.fields.map( - (field) => html`` + (field) => + html`` )} ${this.stateObj.attributes.submit_caption ? html`

    diff --git a/src/dialogs/more-info/controls/more-info-fan.ts b/src/dialogs/more-info/controls/more-info-fan.ts index 588397c5ce..ae841e996c 100644 --- a/src/dialogs/more-info/controls/more-info-fan.ts +++ b/src/dialogs/more-info/controls/more-info-fan.ts @@ -299,23 +299,22 @@ class MoreInfoFan extends LitElement { > ${this.stateObj.attributes.preset_modes?.map( - (mode) => - html` - - ${computeAttributeValueDisplay( - this.hass.localize, - this.stateObj!, - this.hass.locale, - this.hass.config, - this.hass.entities, - "preset_mode", - mode - )} - - ` + (mode) => html` + + ${computeAttributeValueDisplay( + this.hass.localize, + this.stateObj!, + this.hass.locale, + this.hass.config, + this.hass.entities, + "preset_mode", + mode + )} + + ` )} ` diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts index 047605cd8a..1d9fcbe0fc 100644 --- a/src/dialogs/more-info/controls/more-info-media_player.ts +++ b/src/dialogs/more-info/controls/more-info-media_player.ts @@ -156,20 +156,19 @@ class MoreInfoMediaPlayer extends LitElement { @closed=${stopPropagation} > ${stateObj.attributes.source_list!.map( - (source) => - html` - ${computeAttributeValueDisplay( - this.hass.localize, - stateObj, - this.hass.locale, - this.hass.config, - this.hass.entities, - "source", - source - )} - ` + (source) => html` + ${computeAttributeValueDisplay( + this.hass.localize, + stateObj, + this.hass.locale, + this.hass.config, + this.hass.entities, + "source", + source + )} + ` )} diff --git a/src/dialogs/notifications/notification-drawer.ts b/src/dialogs/notifications/notification-drawer.ts index b11a45a345..57407a62ad 100644 --- a/src/dialogs/notifications/notification-drawer.ts +++ b/src/dialogs/notifications/notification-drawer.ts @@ -108,12 +108,13 @@ export class HuiNotificationDrawer extends LitElement {

    ${notifications.length ? html`${notifications.map( - (notification) => html`
    - -
    ` + (notification) => + html`
    + +
    ` )} ${this._notifications.length > 1 ? html`
    diff --git a/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts b/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts index de68790067..b479b07a22 100644 --- a/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts +++ b/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts @@ -158,20 +158,24 @@ export class HaVoiceCommandDialog extends LitElement { > ${this._pipelines?.map( - (pipeline) => html` - ${pipeline.name}${pipeline.id === this._preferredPipeline - ? html` - - ` - : nothing} - ` + (pipeline) => + html` + ${pipeline.name}${pipeline.id === this._preferredPipeline + ? html` + + ` + : nothing} + ` )} ${this.hass.user?.is_admin ? html`
  • diff --git a/src/layouts/hass-tabs-subpage.ts b/src/layouts/hass-tabs-subpage.ts index bbc978fd7d..e8c470df3b 100644 --- a/src/layouts/hass-tabs-subpage.ts +++ b/src/layouts/hass-tabs-subpage.ts @@ -94,26 +94,25 @@ class HassTabsSubpage extends LitElement { } return shownTabs.map( - (page) => - html` - - - ${page.iconPath - ? html`` - : ""} - - - ` + (page) => html` + + + ${page.iconPath + ? html`` + : ""} + + + ` ); } ); diff --git a/src/panels/calendar/ha-panel-calendar.ts b/src/panels/calendar/ha-panel-calendar.ts index 878d6348fa..c2562d1357 100644 --- a/src/panels/calendar/ha-panel-calendar.ts +++ b/src/panels/calendar/ha-panel-calendar.ts @@ -79,23 +79,22 @@ class PanelCalendar extends LitElement { ${this.hass.localize("ui.components.calendar.my_calendars")}
    ${this._calendars.map( - (selCal) => - html` -
    - - - -
    - ` + (selCal) => html` +
    + + + +
    + ` )}
    = (item) => html` - ${item.name} -`; +const rowRenderer: ComboBoxLitRenderer = (item) => + html` + ${item.name} + `; @customElement("dialog-add-application-credential") export class DialogAddApplicationCredential extends LitElement { diff --git a/src/panels/config/areas/ha-config-area-page.ts b/src/panels/config/areas/ha-config-area-page.ts index 4edc723c0e..8a326e6867 100644 --- a/src/panels/config/areas/ha-config-area-page.ts +++ b/src/panels/config/areas/ha-config-area-page.ts @@ -283,15 +283,14 @@ class HaConfigAreaPage extends SubscribeMixin(LitElement) { .header=${this.hass.localize("ui.panel.config.devices.caption")} >${devices.length ? devices.map( - (device) => - html` - - - ${device.name} - - - - ` + (device) => html` + + + ${device.name} + + + + ` ) : html` html` - -

    - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.type.choose.option", - "number", - idx + 1 - )}: - ${this._getDescription(option, idx)} -

    + (option, idx) => + html` + +

    + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.option", + "number", + idx + 1 + )}: + ${this._getDescription(option, idx)} +

    - -
    -

    - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.type.choose.conditions" - )}: -

    - ( - option.conditions + -

    - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.type.choose.sequence" - )}: -

    - -
    -
    -
    ` + .path=${mdiDelete} + > +
    +

    + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.conditions" + )}: +

    + ( + option.conditions + )} + .reOrderMode=${this.reOrderMode} + .disabled=${this.disabled} + .hass=${this.hass} + .idx=${idx} + @value-changed=${this._conditionChanged} + > +

    + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.type.choose.sequence" + )}: +

    + +
    +
    +
    ` )} - html` - this._showInfo(automation), - }, - { - path: mdiPlay, - label: this.hass.localize( - "ui.panel.config.automation.editor.run" - ), - action: () => this._runActions(automation), - }, - { - path: mdiTransitConnection, - label: this.hass.localize( - "ui.panel.config.automation.editor.show_trace" - ), - action: () => this._showTrace(automation), - }, - { - divider: true, - }, - { - path: mdiContentDuplicate, - label: this.hass.localize( - "ui.panel.config.automation.picker.duplicate" - ), - action: () => this.duplicate(automation), - }, - { - path: - automation.state === "off" - ? mdiPlayCircleOutline - : mdiStopCircleOutline, - label: - automation.state === "off" - ? this.hass.localize( - "ui.panel.config.automation.editor.enable" - ) - : this.hass.localize( - "ui.panel.config.automation.editor.disable" - ), - action: () => this._toggle(automation), - }, - { - label: this.hass.localize( - "ui.panel.config.automation.picker.delete" - ), - path: mdiDelete, - action: () => this._deleteConfirm(automation), - warning: true, - }, - ]} - > - - `, + template: (_: string, automation: any) => html` + this._showInfo(automation), + }, + { + path: mdiPlay, + label: this.hass.localize( + "ui.panel.config.automation.editor.run" + ), + action: () => this._runActions(automation), + }, + { + path: mdiTransitConnection, + label: this.hass.localize( + "ui.panel.config.automation.editor.show_trace" + ), + action: () => this._showTrace(automation), + }, + { + divider: true, + }, + { + path: mdiContentDuplicate, + label: this.hass.localize( + "ui.panel.config.automation.picker.duplicate" + ), + action: () => this.duplicate(automation), + }, + { + path: + automation.state === "off" + ? mdiPlayCircleOutline + : mdiStopCircleOutline, + label: + automation.state === "off" + ? this.hass.localize( + "ui.panel.config.automation.editor.enable" + ) + : this.hass.localize( + "ui.panel.config.automation.editor.disable" + ), + action: () => this._toggle(automation), + }, + { + label: this.hass.localize( + "ui.panel.config.automation.picker.delete" + ), + path: mdiDelete, + action: () => this._deleteConfirm(automation), + warning: true, + }, + ]} + > + + `, }; return columns; } diff --git a/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts b/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts index 9731a96394..3be3fbe024 100644 --- a/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts +++ b/src/panels/config/automation/thingtalk/ha-thingtalk-placeholders.ts @@ -133,110 +133,107 @@ export class ThingTalkPlaceholders extends SubscribeMixin(LitElement) {
    ${this._error ? html`
    ${this._error}
    ` : ""} ${Object.entries(this.placeholders).map( - ([type, placeholders]) => - html` -

    - ${this.hass.localize( - `ui.panel.config.automation.editor.${type}s.name` - )}: -

    - ${placeholders.map((placeholder) => { - if (placeholder.fields.includes("device_id")) { - const extraInfo = getPath(this._extraInfo, [ - type, - placeholder.index, - ]); - return html` - - ${extraInfo && extraInfo.manualEntity - ? html` -

    - ${this.hass.localize( - `ui.panel.config.automation.thingtalk.link_devices.ambiguous_entities` - )} -

    - ${Object.keys(extraInfo.manualEntity).map( - (idx) => html` - { - const devId = - this._placeholderValues[type][ - placeholder.index - ][idx].device_id; - return this._deviceEntityLookup[ - devId - ].includes(entityState.entity_id); - }} - > - ` - )} - ` - : ""} - `; - } - if (placeholder.fields.includes("entity_id")) { - return html` - - `; - } + ([type, placeholders]) => html` +

    + ${this.hass.localize( + `ui.panel.config.automation.editor.${type}s.name` + )}: +

    + ${placeholders.map((placeholder) => { + if (placeholder.fields.includes("device_id")) { + const extraInfo = getPath(this._extraInfo, [ + type, + placeholder.index, + ]); return html` -
    - ${this.hass.localize( - `ui.panel.config.automation.thingtalk.link_devices.unknown_placeholder` - )}
    - ${placeholder.domains}
    - ${placeholder.fields.map( - (field) => html` ${field}
    ` + + > + ${extraInfo && extraInfo.manualEntity + ? html` +

    + ${this.hass.localize( + `ui.panel.config.automation.thingtalk.link_devices.ambiguous_entities` + )} +

    + ${Object.keys(extraInfo.manualEntity).map( + (idx) => html` + { + const devId = + this._placeholderValues[type][ + placeholder.index + ][idx].device_id; + return this._deviceEntityLookup[ + devId + ].includes(entityState.entity_id); + }} + > + ` + )} + ` + : ""} `; - })} - ` + } + if (placeholder.fields.includes("entity_id")) { + return html` + + `; + } + return html` +
    + ${this.hass.localize( + `ui.panel.config.automation.thingtalk.link_devices.unknown_placeholder` + )}
    + ${placeholder.domains}
    + ${placeholder.fields.map((field) => html` ${field}
    `)} +
    + `; + })} + ` )}
    diff --git a/src/panels/config/blueprint/ha-blueprint-overview.ts b/src/panels/config/blueprint/ha-blueprint-overview.ts index 44fd7f79c8..c926a2c581 100644 --- a/src/panels/config/blueprint/ha-blueprint-overview.ts +++ b/src/panels/config/blueprint/ha-blueprint-overview.ts @@ -125,11 +125,10 @@ class HaBlueprintOverview extends LitElement { direction: "asc", grows: true, template: narrow - ? (name, entity: any) => - html` - ${name}
    -
    ${entity.path}
    - ` + ? (name, entity: any) => html` + ${name}
    +
    ${entity.path}
    + ` : undefined, }, type: { diff --git a/src/panels/config/core/ha-config-system-navigation.ts b/src/panels/config/core/ha-config-system-navigation.ts index 9225670215..ade0cf81a8 100644 --- a/src/panels/config/core/ha-config-system-navigation.ts +++ b/src/panels/config/core/ha-config-system-navigation.ts @@ -181,9 +181,8 @@ class HaConfigSystemNavigation extends LitElement { const hardwareInfo: HardwareInfo = await this.hass.callWS({ type: "hardware/info", }); - this._boardName = hardwareInfo?.hardware.find( - (hw) => hw.board !== null - )?.name; + this._boardName = hardwareInfo?.hardware.find((hw) => hw.board !== null) + ?.name; } else if (isHassioLoaded) { const osData: HassioHassOSInfo = await fetchHassioHassOsInfo(this.hass); if (osData.board) { diff --git a/src/panels/config/devices/device-detail/ha-device-automation-card.ts b/src/panels/config/devices/device-detail/ha-device-automation-card.ts index 9bf3e433ea..7ea0ec1026 100644 --- a/src/panels/config/devices/device-detail/ha-device-automation-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-automation-card.ts @@ -20,7 +20,7 @@ declare global { } export abstract class HaDeviceAutomationCard< - T extends DeviceAutomation + T extends DeviceAutomation, > extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -76,20 +76,19 @@ export abstract class HaDeviceAutomationCard<
    ${automations.map( - (automation, idx) => - html` - - ${this._localizeDeviceAutomation( - this.hass, - this.entityReg!, - automation - )} - - ` + (automation, idx) => html` + + ${this._localizeDeviceAutomation( + this.hass, + this.entityReg!, + automation + )} + + ` )} ${!this._showSecondary && automations.length < this.automations.length diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 2cd52f253c..2c2051065e 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -376,32 +376,30 @@ export class HaConfigDevicePage extends LitElement { const firstDeviceAction = actions.shift(); if (device.disabled_by) { - deviceInfo.push( - html` - - ${this.hass.localize( - "ui.panel.config.devices.enabled_cause", - "type", - this.hass.localize( - `ui.panel.config.devices.type.${device.entry_type || "device"}` - ), - "cause", - this.hass.localize( - `ui.panel.config.devices.disabled_by.${device.disabled_by}` - ) - )} - - ${device.disabled_by === "user" - ? html` -
    - - ${this.hass.localize("ui.common.enable")} - -
    - ` - : ""} - ` - ); + deviceInfo.push(html` + + ${this.hass.localize( + "ui.panel.config.devices.enabled_cause", + "type", + this.hass.localize( + `ui.panel.config.devices.type.${device.entry_type || "device"}` + ), + "cause", + this.hass.localize( + `ui.panel.config.devices.disabled_by.${device.disabled_by}` + ) + )} + + ${device.disabled_by === "user" + ? html` +
    + + ${this.hass.localize("ui.common.enable")} + +
    + ` + : ""} + `); } this._renderIntegrationInfo(device, integrations, deviceInfo); @@ -751,12 +749,11 @@ export class HaConfigDevicePage extends LitElement { ? html`
    ${this._deviceAlerts.map( - (alert) => - html` - - ${alert.text} - - ` + (alert) => html` + + ${alert.text} + + ` )}
    ` 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 dc4923f27a..9d27716a8a 100644 --- a/src/panels/config/energy/components/ha-energy-battery-settings.ts +++ b/src/panels/config/energy/components/ha-energy-battery-settings.ts @@ -76,13 +76,12 @@ export class EnergyBatterySettings extends LitElement { >

    ${batteryValidation.map( - (result) => - html` - - ` + (result) => html` + + ` )}

    diff --git a/src/panels/config/energy/components/ha-energy-device-settings.ts b/src/panels/config/energy/components/ha-energy-device-settings.ts index 52012f4106..dc2df5472f 100644 --- a/src/panels/config/energy/components/ha-energy-device-settings.ts +++ b/src/panels/config/energy/components/ha-energy-device-settings.ts @@ -68,13 +68,12 @@ export class EnergyDeviceSettings extends LitElement { >

    ${this.validationResult?.device_consumption.map( - (result) => - html` - - ` + (result) => html` + + ` )}

    ${this.hass.localize( 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 14f6653f05..135d686ebc 100644 --- a/src/panels/config/energy/components/ha-energy-gas-settings.ts +++ b/src/panels/config/energy/components/ha-energy-gas-settings.ts @@ -74,13 +74,12 @@ export class EnergyGasSettings extends LitElement { >

    ${gasValidation.map( - (result) => - html` - - ` + (result) => html` + + ` )}

    ${this.hass.localize("ui.panel.config.energy.gas.gas_consumption")} diff --git a/src/panels/config/energy/components/ha-energy-solar-settings.ts b/src/panels/config/energy/components/ha-energy-solar-settings.ts index 4fe65f0188..ccc7e492e7 100644 --- a/src/panels/config/energy/components/ha-energy-solar-settings.ts +++ b/src/panels/config/energy/components/ha-energy-solar-settings.ts @@ -79,13 +79,12 @@ export class EnergySolarSettings extends LitElement { >

    ${solarValidation.map( - (result) => - html` - - ` + (result) => html` + + ` )}

    diff --git a/src/panels/config/energy/components/ha-energy-water-settings.ts b/src/panels/config/energy/components/ha-energy-water-settings.ts index a997629695..278b3f747e 100644 --- a/src/panels/config/energy/components/ha-energy-water-settings.ts +++ b/src/panels/config/energy/components/ha-energy-water-settings.ts @@ -75,13 +75,12 @@ export class EnergyWaterSettings extends LitElement { >

    ${waterValidation.map( - (result) => - html` - - ` + (result) => html` + + ` )}

    ${this.hass.localize( diff --git a/src/panels/config/energy/dialogs/dialog-energy-solar-settings.ts b/src/panels/config/energy/dialogs/dialog-energy-solar-settings.ts index 2cc14377b5..dd05a30612 100644 --- a/src/panels/config/energy/dialogs/dialog-energy-solar-settings.ts +++ b/src/panels/config/energy/dialogs/dialog-energy-solar-settings.ts @@ -139,31 +139,32 @@ export class DialogEnergySolarSettings ${this._forecast ? html`
    ${this._configEntries?.map( - (entry) => html` + html` + ${entry.title} +
    `} > - ${entry.title} -

    `} - > - - - ` + + + ` )} ${this.hass.localize( diff --git a/src/panels/config/entities/entity-registry-settings-editor.ts b/src/panels/config/entities/entity-registry-settings-editor.ts index 96d1214370..940ea5de59 100644 --- a/src/panels/config/entities/entity-registry-settings-editor.ts +++ b/src/panels/config/entities/entity-registry-settings-editor.ts @@ -892,11 +892,9 @@ export class EntityRegistrySettingsEditor extends LitElement { "ui.dialogs.entity_registry.editor.use_device_area" )} ${this.hass.devices[this.entry.device_id].area_id - ? `(${ - this.hass.areas[ - this.hass.devices[this.entry.device_id].area_id! - ]?.name - })` + ? `(${this.hass.areas[ + this.hass.devices[this.entry.device_id].area_id! + ]?.name})` : ""} - html` - ${name}
    -
    - ${entity.entity_id} | - ${this.hass.localize(`component.${entity.platform}.title`) || - entity.platform} -
    - ` + ? (name, entity: EntityRow) => html` + ${name}
    +
    + ${entity.entity_id} | + ${this.hass.localize(`component.${entity.platform}.title`) || + entity.platform} +
    + ` : undefined, }, entity_id: { diff --git a/src/panels/config/hardware/dialog-hardware-available.ts b/src/panels/config/hardware/dialog-hardware-available.ts index d60d801b19..817ee0db12 100644 --- a/src/panels/config/hardware/dialog-hardware-available.ts +++ b/src/panels/config/hardware/dialog-hardware-available.ts @@ -110,51 +110,50 @@ class DialogHardwareAvailable extends LitElement implements HassDialog {
    ${devices.map( - (device) => - html` - -
    - - ${this.hass.localize( - "ui.panel.config.hardware.available_hardware.subsystem" - )}: - - ${device.subsystem} -
    -
    - - ${this.hass.localize( - "ui.panel.config.hardware.available_hardware.device_path" - )}: - - ${device.dev_path} -
    - ${device.by_id - ? html` -
    - - ${this.hass.localize( - "ui.panel.config.hardware.available_hardware.id" - )}: - - ${device.by_id} -
    - ` - : ""} -
    - - ${this.hass.localize( - "ui.panel.config.hardware.available_hardware.attributes" - )}: - -
    ${dump(device.attributes, { indent: 2 })}
    -
    -
    - ` + (device) => html` + +
    + + ${this.hass.localize( + "ui.panel.config.hardware.available_hardware.subsystem" + )}: + + ${device.subsystem} +
    +
    + + ${this.hass.localize( + "ui.panel.config.hardware.available_hardware.device_path" + )}: + + ${device.dev_path} +
    + ${device.by_id + ? html` +
    + + ${this.hass.localize( + "ui.panel.config.hardware.available_hardware.id" + )}: + + ${device.by_id} +
    + ` + : ""} +
    + + ${this.hass.localize( + "ui.panel.config.hardware.available_hardware.attributes" + )}: + +
    ${dump(device.attributes, { indent: 2 })}
    +
    +
    + ` )} `; diff --git a/src/panels/config/helpers/forms/ha-counter-form.ts b/src/panels/config/helpers/forms/ha-counter-form.ts index 92c844af88..c2b03630ab 100644 --- a/src/panels/config/helpers/forms/ha-counter-form.ts +++ b/src/panels/config/helpers/forms/ha-counter-form.ts @@ -53,10 +53,11 @@ class HaCounterForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-input_boolean-form.ts b/src/panels/config/helpers/forms/ha-input_boolean-form.ts index 82912b4552..870d83cf22 100644 --- a/src/panels/config/helpers/forms/ha-input_boolean-form.ts +++ b/src/panels/config/helpers/forms/ha-input_boolean-form.ts @@ -31,10 +31,11 @@ class HaInputBooleanForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-input_button-form.ts b/src/panels/config/helpers/forms/ha-input_button-form.ts index a67b65d5d3..0b8ec14ede 100644 --- a/src/panels/config/helpers/forms/ha-input_button-form.ts +++ b/src/panels/config/helpers/forms/ha-input_button-form.ts @@ -31,10 +31,11 @@ class HaInputButtonForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-input_datetime-form.ts b/src/panels/config/helpers/forms/ha-input_datetime-form.ts index 61e70d735a..c44fe057c8 100644 --- a/src/panels/config/helpers/forms/ha-input_datetime-form.ts +++ b/src/panels/config/helpers/forms/ha-input_datetime-form.ts @@ -45,10 +45,11 @@ class HaInputDateTimeForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-input_number-form.ts b/src/panels/config/helpers/forms/ha-input_number-form.ts index f090713f72..0c83b7861c 100644 --- a/src/panels/config/helpers/forms/ha-input_number-form.ts +++ b/src/panels/config/helpers/forms/ha-input_number-form.ts @@ -60,10 +60,11 @@ class HaInputNumberForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-input_select-form.ts b/src/panels/config/helpers/forms/ha-input_select-form.ts index 378c6aa179..55217382bd 100644 --- a/src/panels/config/helpers/forms/ha-input_select-form.ts +++ b/src/panels/config/helpers/forms/ha-input_select-form.ts @@ -43,10 +43,11 @@ class HaInputSelectForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-input_text-form.ts b/src/panels/config/helpers/forms/ha-input_text-form.ts index d8ba12b444..90252e2ab0 100644 --- a/src/panels/config/helpers/forms/ha-input_text-form.ts +++ b/src/panels/config/helpers/forms/ha-input_text-form.ts @@ -50,10 +50,11 @@ class HaInputTextForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-schedule-form.ts b/src/panels/config/helpers/forms/ha-schedule-form.ts index 1656fafb00..5a503eef1b 100644 --- a/src/panels/config/helpers/forms/ha-schedule-form.ts +++ b/src/panels/config/helpers/forms/ha-schedule-form.ts @@ -98,10 +98,11 @@ class HaScheduleForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/forms/ha-timer-form.ts b/src/panels/config/helpers/forms/ha-timer-form.ts index 1d427ef7af..4108f7fa43 100644 --- a/src/panels/config/helpers/forms/ha-timer-form.ts +++ b/src/panels/config/helpers/forms/ha-timer-form.ts @@ -39,10 +39,11 @@ class HaTimerForm extends LitElement { } public focus() { - this.updateComplete.then(() => - ( - this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement - )?.focus() + this.updateComplete.then( + () => + ( + this.shadowRoot?.querySelector("[dialogInitialFocus]") as HTMLElement + )?.focus() ); } diff --git a/src/panels/config/helpers/ha-config-helpers.ts b/src/panels/config/helpers/ha-config-helpers.ts index 41d5f03441..55b9cb1bb7 100644 --- a/src/panels/config/helpers/ha-config-helpers.ts +++ b/src/panels/config/helpers/ha-config-helpers.ts @@ -96,13 +96,12 @@ export class HaConfigHelpers extends SubscribeMixin(LitElement) { filterable: true, grows: true, direction: "asc", - template: (name, item: any) => - html` - ${name} - ${narrow - ? html`
    ${item.entity_id}
    ` - : ""} - `, + template: (name, item: any) => html` + ${name} + ${narrow + ? html`
    ${item.entity_id}
    ` + : ""} + `, }, }; if (!narrow) { diff --git a/src/panels/config/integrations/ha-config-integration-page.ts b/src/panels/config/integrations/ha-config-integration-page.ts index 45292826bc..9248d0c805 100644 --- a/src/panels/config/integrations/ha-config-integration-page.ts +++ b/src/panels/config/integrations/ha-config-integration-page.ts @@ -410,22 +410,23 @@ class HaConfigIntegrationPage extends SubscribeMixin(LitElement) { ${discoveryFlows.map( - (flow) => html` - ${flow.localized_title} - - ` + (flow) => + html` + ${flow.localized_title} + + ` )} ` diff --git a/src/panels/config/integrations/ha-config-integrations-dashboard.ts b/src/panels/config/integrations/ha-config-integrations-dashboard.ts index 2e60ec2935..77e7ab18fd 100644 --- a/src/panels/config/integrations/ha-config-integrations-dashboard.ts +++ b/src/panels/config/integrations/ha-config-integrations-dashboard.ts @@ -150,7 +150,7 @@ class HaConfigIntegrationsDashboard extends SubscribeMixin(LitElement) { ): [ [string, ConfigEntryExtended[]][], ConfigEntryExtended[], - ConfigEntryExtended[] + ConfigEntryExtended[], ] => { let filteredConfigEntries: ConfigEntryExtended[]; const ignored: ConfigEntryExtended[] = []; diff --git a/src/panels/config/integrations/ha-domain-integrations.ts b/src/panels/config/integrations/ha-domain-integrations.ts index 0a96aa0856..ed4fc8c160 100644 --- a/src/panels/config/integrations/ha-domain-integrations.ts +++ b/src/panels/config/integrations/ha-domain-integrations.ts @@ -44,29 +44,30 @@ class HaDomainIntegrations extends LitElement { ${this.hass.localize("ui.panel.config.integrations.discovered")} ${this.flowsInProgress.map( - (flow) => html` - - ${localizeConfigFlowTitle(this.hass.localize, flow)} + html` - - ` + + ${localizeConfigFlowTitle(this.hass.localize, flow)} + + ` )}
  • ${this.integration && diff --git a/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts index 6fe1e65f6b..13b2f85c66 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts @@ -223,25 +223,26 @@ class ZHAConfigDashboard extends LitElement { ${this._configuration ? Object.entries(this._configuration.schemas).map( - ([section, schema]) => html` -
    - -
    -
    ` + ([section, schema]) => + html` +
    + +
    +
    ` ) : ""} diff --git a/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts b/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts index 0b756fe41d..b57fbcf6ea 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-groups-dashboard.ts @@ -94,8 +94,9 @@ export class ZHAGroupsDashboard extends LitElement { title: this.hass.localize("ui.panel.config.zha.groups.group_id"), type: "numeric", width: "15%", - template: (groupId: number) => - html` ${formatAsPaddedHex(groupId)} `, + template: (groupId: number) => html` + ${formatAsPaddedHex(groupId)} + `, sortable: true, }, members: { 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 d6a1b460a9..7ffc6554b2 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 @@ -228,27 +228,28 @@ class DialogZWaveJSAddNode extends LitElement { .sort() .reverse() .map( - (securityClass) => html`${this.hass.localize( - `ui.panel.config.zwave_js.security_classes.${SecurityClass[securityClass]}.title` - )} -
    - ${this.hass.localize( - `ui.panel.config.zwave_js.security_classes.${SecurityClass[securityClass]}.description` - )} -
    `} - > - + html`${this.hass.localize( + `ui.panel.config.zwave_js.security_classes.${SecurityClass[securityClass]}.title` + )} +
    + ${this.hass.localize( + `ui.panel.config.zwave_js.security_classes.${SecurityClass[securityClass]}.description` + )} +
    `} > -
    -
    ` + + + ` )}
    html`
    -

    - ${this.hass.localize( - "ui.panel.config.zwave_js.node_config.endpoint", - "endpoint", - endpoint - )} -

    - - ${configParamEntries - .sort(([_, paramA], [__, paramB]) => - paramA.property !== paramB.property - ? paramA.property - paramB.property - : paramA.property_key! - paramB.property_key! - ) - .map( - ([id, item]) => html` - ${this._generateConfigBox(id, item)} - ` + ([endpoint, configParamEntries]) => + html`
    +

    + ${this.hass.localize( + "ui.panel.config.zwave_js.node_config.endpoint", + "endpoint", + endpoint )} - -

    ` + + + ${configParamEntries + .sort(([_, paramA], [__, paramB]) => + paramA.property !== paramB.property + ? paramA.property - paramB.property + : paramA.property_key! - paramB.property_key! + ) + .map( + ([id, item]) => + html` + ${this._generateConfigBox(id, item)} + ` + )} + +
    ` )} 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 3430181210..7af4aa2587 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -123,12 +123,11 @@ export class HaConfigLovelaceDashboards extends LitElement { sortable: true, filterable: true, width: "20%", - template: (mode) => - html` - ${this.hass.localize( - `ui.panel.config.lovelace.dashboards.conf_mode.${mode}` - ) || mode} - `, + template: (mode) => html` + ${this.hass.localize( + `ui.panel.config.lovelace.dashboards.conf_mode.${mode}` + ) || mode} + `, }; if (dashboards.some((dashboard) => dashboard.filename)) { columns.filename = { 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 411d288fbe..1d9cc10c8c 100644 --- a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts +++ b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts @@ -58,12 +58,11 @@ export class HaConfigLovelaceRescources extends LitElement { sortable: true, filterable: true, width: "30%", - template: (type) => - html` - ${this.hass.localize( - `ui.panel.config.lovelace.resources.types.${type}` - ) || type} - `, + template: (type) => html` + ${this.hass.localize( + `ui.panel.config.lovelace.resources.types.${type}` + ) || type} + `, }, }) ); diff --git a/src/panels/config/network/supervisor-network.ts b/src/panels/config/network/supervisor-network.ts index a2cd8ffe30..114649620d 100644 --- a/src/panels/config/network/supervisor-network.ts +++ b/src/panels/config/network/supervisor-network.ts @@ -139,25 +139,24 @@ export class HassioNetwork extends LitElement { ${this._accessPoints.accesspoints .filter((ap) => ap.ssid) .map( - (ap) => - html` - - ${ap.ssid} - - ${ap.mac} - - ${this.hass.localize( - "ui.panel.config.network.supervisor.signal_strength" - )}: - ${ap.signal} - - - ` + (ap) => html` + + ${ap.ssid} + + ${ap.mac} - + ${this.hass.localize( + "ui.panel.config.network.supervisor.signal_strength" + )}: + ${ap.signal} + + + ` )} ` diff --git a/src/panels/config/repairs/dialog-system-information.ts b/src/panels/config/repairs/dialog-system-information.ts index bc3b1e0181..c96ac4c574 100644 --- a/src/panels/config/repairs/dialog-system-information.ts +++ b/src/panels/config/repairs/dialog-system-information.ts @@ -305,13 +305,11 @@ class DialogSystemInformation extends LitElement { const sections: TemplateResult[] = []; if (!this._systemInfo) { - sections.push( - html` -
    - -
    - ` - ); + sections.push(html` +
    + +
    + `); } else { const domains = Object.keys(this._systemInfo).sort(sortKeys); for (const domain of domains) { @@ -371,24 +369,22 @@ class DialogSystemInformation extends LitElement { `); } if (domain !== "homeassistant") { - sections.push( - html` -
    -

    ${domainToName(this.hass.localize, domain)}

    - ${!domainInfo.manage_url - ? "" - : html` - - - ${this.hass.localize( - "ui.panel.config.info.system_health.manage" - )} - - - `} -
    - ` - ); + sections.push(html` +
    +

    ${domainToName(this.hass.localize, domain)}

    + ${!domainInfo.manage_url + ? "" + : html` + + + ${this.hass.localize( + "ui.panel.config.info.system_health.manage" + )} + + + `} +
    + `); } sections.push(html` diff --git a/src/panels/config/scene/ha-scene-dashboard.ts b/src/panels/config/scene/ha-scene-dashboard.ts index df9f6be040..3a7a7790b8 100644 --- a/src/panels/config/scene/ha-scene-dashboard.ts +++ b/src/panels/config/scene/ha-scene-dashboard.ts @@ -90,8 +90,9 @@ class HaSceneDashboard extends LitElement { "ui.panel.config.scene.picker.headers.state" ), type: "icon", - template: (_, scene) => - html` `, + template: (_, scene) => html` + + `, }, name: { title: this.hass.localize( @@ -151,50 +152,49 @@ class HaSceneDashboard extends LitElement { title: "", width: "72px", type: "overflow-menu", - template: (_: string, scene: any) => - html` - this._showInfo(scene), - }, - { - path: mdiPlay, - label: this.hass.localize( - "ui.panel.config.scene.picker.activate" - ), - action: () => this._activateScene(scene), - }, - { - divider: true, - }, - { - path: mdiContentDuplicate, - label: this.hass.localize( - "ui.panel.config.scene.picker.duplicate" - ), - action: () => this._duplicate(scene), - disabled: !scene.attributes.id, - }, - { - label: this.hass.localize( - "ui.panel.config.scene.picker.delete" - ), - path: mdiDelete, - action: () => this._deleteConfirm(scene), - warning: scene.attributes.id, - disabled: !scene.attributes.id, - }, - ]} - > - - `, + template: (_: string, scene: any) => html` + this._showInfo(scene), + }, + { + path: mdiPlay, + label: this.hass.localize( + "ui.panel.config.scene.picker.activate" + ), + action: () => this._activateScene(scene), + }, + { + divider: true, + }, + { + path: mdiContentDuplicate, + label: this.hass.localize( + "ui.panel.config.scene.picker.duplicate" + ), + action: () => this._duplicate(scene), + disabled: !scene.attributes.id, + }, + { + label: this.hass.localize( + "ui.panel.config.scene.picker.delete" + ), + path: mdiDelete, + action: () => this._deleteConfirm(scene), + warning: scene.attributes.id, + disabled: !scene.attributes.id, + }, + ]} + > + + `, }; return columns; diff --git a/src/panels/config/scene/ha-scene-editor.ts b/src/panels/config/scene/ha-scene-editor.ts index 4a93bb65e7..ffb3b25c42 100644 --- a/src/panels/config/scene/ha-scene-editor.ts +++ b/src/panels/config/scene/ha-scene-editor.ts @@ -324,43 +324,42 @@ export class HaSceneEditor extends SubscribeMixin( ${devices.map( - (device) => - html` - -

    - ${device.name} - -

    - ${device.entities.map((entityId) => { - const entityStateObj = this.hass.states[entityId]; - if (!entityStateObj) { - return nothing; - } - return html` - - - - ${computeStateName(entityStateObj)} - - - `; - })} -
    - ` + (device) => html` + +

    + ${device.name} + +

    + ${device.entities.map((entityId) => { + const entityStateObj = this.hass.states[entityId]; + if (!entityStateObj) { + return nothing; + } + return html` + + + + ${computeStateName(entityStateObj)} + + + `; + })} +
    + ` )} - html` - this._showInfo(script), - }, - { - path: mdiPlay, - label: this.hass.localize("ui.panel.config.script.picker.run"), - action: () => this._runScript(script), - }, - { - path: mdiTransitConnection, - label: this.hass.localize( - "ui.panel.config.script.picker.show_trace" - ), - action: () => this._showTrace(script), - }, - { - divider: true, - }, - { - path: mdiContentDuplicate, - label: this.hass.localize( - "ui.panel.config.script.picker.duplicate" - ), - action: () => this._duplicate(script), - }, - { - label: this.hass.localize( - "ui.panel.config.script.picker.delete" - ), - path: mdiDelete, - action: () => this._deleteConfirm(script), - warning: true, - }, - ]} - > - - `, + template: (_: string, script: any) => html` + this._showInfo(script), + }, + { + path: mdiPlay, + label: this.hass.localize("ui.panel.config.script.picker.run"), + action: () => this._runScript(script), + }, + { + path: mdiTransitConnection, + label: this.hass.localize( + "ui.panel.config.script.picker.show_trace" + ), + action: () => this._showTrace(script), + }, + { + divider: true, + }, + { + path: mdiContentDuplicate, + label: this.hass.localize( + "ui.panel.config.script.picker.duplicate" + ), + action: () => this._duplicate(script), + }, + { + label: this.hass.localize("ui.panel.config.script.picker.delete"), + path: mdiDelete, + action: () => this._deleteConfirm(script), + warning: true, + }, + ]} + > + + `, }; return columns; diff --git a/src/panels/config/tags/ha-config-tags.ts b/src/panels/config/tags/ha-config-tags.ts index e566aff75d..61a61c8af7 100644 --- a/src/panels/config/tags/ha-config-tags.ts +++ b/src/panels/config/tags/ha-config-tags.ts @@ -70,18 +70,19 @@ export class HaConfigTags extends SubscribeMixin(LitElement) { sortable: true, filterable: true, grows: true, - template: (name, tag: any) => html`${name} - ${narrow - ? html`
    - ${tag.last_scanned_datetime - ? html`` - : this.hass.localize("ui.panel.config.tag.never_scanned")} -
    ` - : ""}`, + template: (name, tag: any) => + html`${name} + ${narrow + ? html`
    + ${tag.last_scanned_datetime + ? html`` + : this.hass.localize("ui.panel.config.tag.never_scanned")} +
    ` + : ""}`, }, }; if (!narrow) { @@ -106,33 +107,38 @@ export class HaConfigTags extends SubscribeMixin(LitElement) { title: "", label: this.hass.localize("ui.panel.config.tag.headers.write"), type: "icon-button", - template: (_write, tag: any) => html` `, + template: (_write, tag: any) => + html` `, }; } columns.automation = { title: "", type: "icon-button", - template: (_automation, tag: any) => html` `, + template: (_automation, tag: any) => + html` `, }; columns.edit = { title: "", type: "icon-button", - template: (_settings, tag: any) => html` `, + template: (_settings, tag: any) => + html` `, }; return columns; } diff --git a/src/panels/config/users/ha-config-users.ts b/src/panels/config/users/ha-config-users.ts index 54c949f7d7..a125ef8b81 100644 --- a/src/panels/config/users/ha-config-users.ts +++ b/src/panels/config/users/ha-config-users.ts @@ -77,8 +77,9 @@ export class HaConfigUsers extends LitElement { width: "20%", direction: "asc", hidden: narrow, - template: (groupIds: User["group_ids"]) => - html` ${localize(`groups.${groupIds[0]}`)} `, + template: (groupIds: User["group_ids"]) => html` + ${localize(`groups.${groupIds[0]}`)} + `, }, is_active: { title: this.hass.localize( diff --git a/src/panels/config/voice-assistants/debug/assist-render-pipeline-run.ts b/src/panels/config/voice-assistants/debug/assist-render-pipeline-run.ts index f30d5cf5d7..14da1d1e7d 100644 --- a/src/panels/config/voice-assistants/debug/assist-render-pipeline-run.ts +++ b/src/panels/config/voice-assistants/debug/assist-render-pipeline-run.ts @@ -101,13 +101,12 @@ const renderProgress = ( const renderData = (data: Record, keys: Record) => Object.entries(keys).map( - ([key, label]) => - html` -
    -
    ${label}
    -
    ${data[key]}
    -
    - ` + ([key, label]) => html` +
    +
    ${label}
    +
    ${data[key]}
    +
    + ` ); const dataMinusKeysRender = ( diff --git a/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts b/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts index 98363e9bed..e6f171f367 100644 --- a/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts +++ b/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts @@ -150,11 +150,10 @@ export class VoiceAssistantsExpose extends LitElement { filterable: true, direction: "asc", grows: true, - template: (name, entry) => - html` - ${name}
    -
    ${entry.entity_id}
    - `, + template: (name, entry) => html` + ${name}
    +
    ${entry.entity_id}
    + `, }, area: { title: this.hass.localize( diff --git a/src/panels/developer-tools/event/event-subscribe-card.ts b/src/panels/developer-tools/event/event-subscribe-card.ts index d1d7afc0aa..d6fc035474 100644 --- a/src/panels/developer-tools/event/event-subscribe-card.ts +++ b/src/panels/developer-tools/event/event-subscribe-card.ts @@ -70,25 +70,24 @@ class EventSubscribeCard extends LitElement { ${repeat( this._events, (event) => event.id, - (event) => - html` -
    - ${this.hass!.localize( - "ui.panel.developer-tools.tabs.events.event_fired", - "name", - event.id - )} - ${formatTime( - new Date(event.event.time_fired), - this.hass!.locale, - this.hass!.config - )}: - -
    - ` + (event) => html` +
    + ${this.hass!.localize( + "ui.panel.developer-tools.tabs.events.event_fired", + "name", + event.id + )} + ${formatTime( + new Date(event.event.time_fired), + this.hass!.locale, + this.hass!.config + )}: + +
    + ` )}
    diff --git a/src/panels/developer-tools/service/developer-tools-service.ts b/src/panels/developer-tools/service/developer-tools-service.ts index 66da2d5f0e..d0600df766 100644 --- a/src/panels/developer-tools/service/developer-tools-service.ts +++ b/src/panels/developer-tools/service/developer-tools-service.ts @@ -66,8 +66,8 @@ class HaPanelDevService extends LitElement { data: {}, }; if (this._yamlMode) { - this.updateComplete.then(() => - this._yamlEditor?.setValue(this._serviceData) + this.updateComplete.then( + () => this._yamlEditor?.setValue(this._serviceData) ); } } else if (!this._serviceData?.service) { @@ -79,8 +79,8 @@ class HaPanelDevService extends LitElement { data: {}, }; if (this._yamlMode) { - this.updateComplete.then(() => - this._yamlEditor?.setValue(this._serviceData) + this.updateComplete.then( + () => this._yamlEditor?.setValue(this._serviceData) ); } } @@ -248,11 +248,12 @@ class HaPanelDevService extends LitElement { ? fields : this._filterSelectorFields(fields) ).map( - (field) => html` - - - - ` + (field) => + html` + + + + ` )}
    ${field.key}
    ${field.description}${field.example}
    ${field.key}
    ${field.description}${field.example}
    ${this._yamlMode diff --git a/src/panels/developer-tools/template/developer-tools-template.ts b/src/panels/developer-tools/template/developer-tools-template.ts index fe0a0c158c..c7618b38d5 100644 --- a/src/panels/developer-tools/template/developer-tools-template.ts +++ b/src/panels/developer-tools/template/developer-tools-template.ts @@ -202,30 +202,28 @@ class HaPanelDevTemplate extends LitElement { ${this._templateResult.listeners.domains .sort() .map( - (domain) => - html` -
  • - ${this.hass.localize( - "ui.panel.developer-tools.tabs.templates.domain" - )}: ${domain} -
  • - ` + (domain) => html` +
  • + ${this.hass.localize( + "ui.panel.developer-tools.tabs.templates.domain" + )}: ${domain} +
  • + ` )} ${this._templateResult.listeners.entities .sort() .map( - (entity_id) => - html` -
  • - ${this.hass.localize( - "ui.panel.developer-tools.tabs.templates.entity" - )}: ${entity_id} -
  • - ` + (entity_id) => html` +
  • + ${this.hass.localize( + "ui.panel.developer-tools.tabs.templates.entity" + )}: ${entity_id} +
  • + ` )} ` diff --git a/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts b/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts index 8b67a7e7a5..50bc2e2d60 100644 --- a/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts +++ b/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts @@ -142,24 +142,23 @@ export class DeveloperYamlConfig extends LitElement { ${this._reloadableDomains.map( - (domain) => - html` -
    - ${this.hass.localize( - `ui.panel.developer-tools.tabs.yaml.section.reloading.${domain}` - ) || - this.hass.localize( - "ui.panel.developer-tools.tabs.yaml.section.reloading.reload", - "domain", - domainToName(this.hass.localize, domain) - )} - -
    - ` + (domain) => html` +
    + ${this.hass.localize( + `ui.panel.developer-tools.tabs.yaml.section.reloading.${domain}` + ) || + this.hass.localize( + "ui.panel.developer-tools.tabs.yaml.section.reloading.reload", + "domain", + domainToName(this.hass.localize, domain) + )} + +
    + ` )} 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 378f6e7a5f..e621bdea72 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts @@ -446,8 +446,8 @@ class HuiEnergyDistrubutionCard cy="40" r="38" stroke-dasharray="${homeSolarCircumference} ${ - CIRCLE_CIRCUMFERENCE - homeSolarCircumference - }" + CIRCLE_CIRCUMFERENCE - homeSolarCircumference + }" shape-rendering="geometricPrecision" stroke-dashoffset="-${ CIRCLE_CIRCUMFERENCE - homeSolarCircumference @@ -461,8 +461,8 @@ class HuiEnergyDistrubutionCard cy="40" r="38" stroke-dasharray="${homeBatteryCircumference} ${ - CIRCLE_CIRCUMFERENCE - homeBatteryCircumference - }" + CIRCLE_CIRCUMFERENCE - homeBatteryCircumference + }" stroke-dashoffset="-${ CIRCLE_CIRCUMFERENCE - homeBatteryCircumference - @@ -478,8 +478,8 @@ class HuiEnergyDistrubutionCard cy="40" r="38" stroke-dasharray="${homeLowCarbonCircumference} ${ - CIRCLE_CIRCUMFERENCE - homeLowCarbonCircumference - }" + CIRCLE_CIRCUMFERENCE - homeLowCarbonCircumference + }" stroke-dashoffset="-${ CIRCLE_CIRCUMFERENCE - homeLowCarbonCircumference - @@ -611,8 +611,8 @@ class HuiEnergyDistrubutionCard id="return" class="return" d="M${hasBattery ? 45 : 47},0 v15 c0,${ - hasBattery ? "35 -10,30 -30,30" : "40 -10,35 -30,35" - } h-20" + hasBattery ? "35 -10,30 -30,30" : "40 -10,35 -30,35" + } h-20" vector-effect="non-scaling-stroke" > ` : ""} @@ -621,8 +621,8 @@ class HuiEnergyDistrubutionCard id="solar" class="solar" d="M${hasBattery ? 55 : 53},0 v15 c0,${ - hasBattery ? "35 10,30 30,30" : "40 10,35 30,35" - } h20" + hasBattery ? "35 10,30 30,30" : "40 10,35 30,35" + } h20" vector-effect="non-scaling-stroke" >` : ""} @@ -1024,7 +1024,9 @@ class HuiEnergyDistrubutionCard } .circle svg circle { animation: rotate-in 0.6s ease-in; - transition: stroke-dashoffset 0.4s, stroke-dasharray 0.4s; + transition: + stroke-dashoffset 0.4s, + stroke-dasharray 0.4s; fill: none; } @keyframes rotate-in { 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 a6570a4485..734a4067ae 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 @@ -452,217 +452,220 @@ export class HuiEnergySourcesTableCard ` : ""} ${types.grid?.map( - (source) => html`${source.flow_from.map((flow, idx) => { - const energy = - calculateStatisticSumGrowth( - this._data!.stats[flow.stat_energy_from] - ) || 0; - totalGrid += energy; - - const compareEnergy = - (compare && + (source) => + html`${source.flow_from.map((flow, idx) => { + const energy = calculateStatisticSumGrowth( - this._data!.statsCompare[flow.stat_energy_from] - )) || - 0; - totalGridCompare += compareEnergy; + this._data!.stats[flow.stat_energy_from] + ) || 0; + totalGrid += energy; - const cost_stat = - flow.stat_cost || - this._data!.info.cost_sensors[flow.stat_energy_from]; - const cost = cost_stat - ? calculateStatisticSumGrowth( - this._data!.stats[cost_stat] - ) || 0 - : null; - if (cost !== null) { - totalGridCost += cost; - } + const compareEnergy = + (compare && + calculateStatisticSumGrowth( + this._data!.statsCompare[flow.stat_energy_from] + )) || + 0; + totalGridCompare += compareEnergy; - const costCompare = - compare && cost_stat + const cost_stat = + flow.stat_cost || + this._data!.info.cost_sensors[flow.stat_energy_from]; + const cost = cost_stat ? calculateStatisticSumGrowth( - this._data!.statsCompare[cost_stat] + this._data!.stats[cost_stat] ) || 0 : null; - if (costCompare !== null) { - totalGridCostCompare += costCompare; - } + if (cost !== null) { + totalGridCost += cost; + } - const modifiedColor = - idx > 0 - ? this.hass.themes.darkMode - ? labBrighten(rgb2lab(hex2rgb(consumptionColor)), idx) - : labDarken(rgb2lab(hex2rgb(consumptionColor)), idx) - : undefined; - const color = modifiedColor - ? rgb2hex(lab2rgb(modifiedColor)) - : consumptionColor; + const costCompare = + compare && cost_stat + ? calculateStatisticSumGrowth( + this._data!.statsCompare[cost_stat] + ) || 0 + : null; + if (costCompare !== null) { + totalGridCostCompare += costCompare; + } - return html` - -
    - - - ${getStatisticLabel( - this.hass, - flow.stat_energy_from, - this._data?.statsMetadata[flow.stat_energy_from] - )} - - ${compare - ? html` 0 + ? this.hass.themes.darkMode + ? labBrighten(rgb2lab(hex2rgb(consumptionColor)), idx) + : labDarken(rgb2lab(hex2rgb(consumptionColor)), idx) + : undefined; + const color = modifiedColor + ? rgb2hex(lab2rgb(modifiedColor)) + : consumptionColor; + + return html` + +
    + + + ${getStatisticLabel( + this.hass, + flow.stat_energy_from, + this._data?.statsMetadata[flow.stat_energy_from] + )} + + ${compare + ? html` + ${formatNumber(compareEnergy, this.hass.locale)} + kWh + + ${showCosts + ? html` + ${costCompare !== null + ? formatNumber( + costCompare, + this.hass.locale, + { + style: "currency", + currency: this.hass.config.currency!, + } + ) + : ""} + ` + : ""}` + : ""} + + ${formatNumber(energy, this.hass.locale)} kWh + + ${showCosts + ? html` - ${formatNumber(compareEnergy, this.hass.locale)} kWh - - ${showCosts - ? html` - ${costCompare !== null - ? formatNumber( - costCompare, - this.hass.locale, - { - style: "currency", - currency: this.hass.config.currency!, - } - ) - : ""} - ` - : ""}` - : ""} - - ${formatNumber(energy, this.hass.locale)} kWh - - ${showCosts - ? html` - ${cost !== null - ? formatNumber(cost, this.hass.locale, { - style: "currency", - currency: this.hass.config.currency!, - }) - : ""} - ` - : ""} - `; - })} - ${source.flow_to.map((flow, idx) => { - const energy = - (calculateStatisticSumGrowth( - this._data!.stats[flow.stat_energy_to] - ) || 0) * -1; - totalGrid += energy; - const cost_stat = - flow.stat_compensation || - this._data!.info.cost_sensors[flow.stat_energy_to]; - const cost = cost_stat - ? (calculateStatisticSumGrowth( - this._data!.stats[cost_stat] - ) || 0) * -1 - : null; - if (cost !== null) { - totalGridCost += cost; - } - - const energyCompare = - ((compare && - calculateStatisticSumGrowth( - this._data!.statsCompare[flow.stat_energy_to] - )) || - 0) * -1; - totalGridCompare += energyCompare; - - const costCompare = - compare && cost_stat + ${cost !== null + ? formatNumber(cost, this.hass.locale, { + style: "currency", + currency: this.hass.config.currency!, + }) + : ""} + ` + : ""} + `; + })} + ${source.flow_to.map((flow, idx) => { + const energy = + (calculateStatisticSumGrowth( + this._data!.stats[flow.stat_energy_to] + ) || 0) * -1; + totalGrid += energy; + const cost_stat = + flow.stat_compensation || + this._data!.info.cost_sensors[flow.stat_energy_to]; + const cost = cost_stat ? (calculateStatisticSumGrowth( - this._data!.statsCompare[cost_stat] + this._data!.stats[cost_stat] ) || 0) * -1 : null; - if (costCompare !== null) { - totalGridCostCompare += costCompare; - } + if (cost !== null) { + totalGridCost += cost; + } - const modifiedColor = - idx > 0 - ? this.hass.themes.darkMode - ? labBrighten(rgb2lab(hex2rgb(returnColor)), idx) - : labDarken(rgb2lab(hex2rgb(returnColor)), idx) - : undefined; - const color = modifiedColor - ? rgb2hex(lab2rgb(modifiedColor)) - : returnColor; + const energyCompare = + ((compare && + calculateStatisticSumGrowth( + this._data!.statsCompare[flow.stat_energy_to] + )) || + 0) * -1; + totalGridCompare += energyCompare; - return html` - -
    - - - ${getStatisticLabel( - this.hass, - flow.stat_energy_to, - this._data?.statsMetadata[flow.stat_energy_to] - )} - - ${compare - ? html` 0 + ? this.hass.themes.darkMode + ? labBrighten(rgb2lab(hex2rgb(returnColor)), idx) + : labDarken(rgb2lab(hex2rgb(returnColor)), idx) + : undefined; + const color = modifiedColor + ? rgb2hex(lab2rgb(modifiedColor)) + : returnColor; + + return html` + +
    + + + ${getStatisticLabel( + this.hass, + flow.stat_energy_to, + this._data?.statsMetadata[flow.stat_energy_to] + )} + + ${compare + ? html` + ${formatNumber(energyCompare, this.hass.locale)} + kWh + + ${showCosts + ? html` + ${costCompare !== null + ? formatNumber( + costCompare, + this.hass.locale, + { + style: "currency", + currency: this.hass.config.currency!, + } + ) + : ""} + ` + : ""}` + : ""} + + ${formatNumber(energy, this.hass.locale)} kWh + + ${showCosts + ? html` - ${formatNumber(energyCompare, this.hass.locale)} kWh - - ${showCosts - ? html` - ${costCompare !== null - ? formatNumber( - costCompare, - this.hass.locale, - { - style: "currency", - currency: this.hass.config.currency!, - } - ) - : ""} - ` - : ""}` - : ""} - - ${formatNumber(energy, this.hass.locale)} kWh - - ${showCosts - ? html` - ${cost !== null - ? formatNumber(cost, this.hass.locale, { - style: "currency", - currency: this.hass.config.currency!, - }) - : ""} - ` - : ""} - `; - })}` + ${cost !== null + ? formatNumber(cost, this.hass.locale, { + style: "currency", + currency: this.hass.config.currency!, + }) + : ""} + ` + : ""} + `; + })}` )} ${types.grid ? html` diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index aa8074d220..fcd449cdf0 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -609,7 +609,9 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { right: 0; opacity: 1; - transition: width 0.8s, opacity 0.8s linear 0.8s; + transition: + width 0.8s, + opacity 0.8s linear 0.8s; } .image { @@ -621,8 +623,12 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { right: 0; height: 100%; opacity: 1; - transition: width 0.8s, background-image 0.8s, background-color 0.8s, - background-size 0.8s, opacity 0.8s linear 0.8s; + transition: + width 0.8s, + background-image 0.8s, + background-color 0.8s, + background-size 0.8s, + opacity 0.8s linear 0.8s; } .no-image .image { @@ -640,13 +646,17 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { height: 100%; background-image: url("/static/images/card_media_player_bg.png"); width: 50%; - transition: opacity 0.8s, background-color 0.8s; + transition: + opacity 0.8s, + background-color 0.8s; } .off .image, .off .color-gradient { opacity: 0; - transition: opacity 0s, width 0.8s; + transition: + opacity 0s, + width 0.8s; width: 0; } diff --git a/src/panels/lovelace/cards/hui-shopping-list-card.ts b/src/panels/lovelace/cards/hui-shopping-list-card.ts index 0a6b08d6d3..1b7dc10a56 100644 --- a/src/panels/lovelace/cards/hui-shopping-list-card.ts +++ b/src/panels/lovelace/cards/hui-shopping-list-card.ts @@ -147,10 +147,12 @@ class HuiShoppingListCard ${this._reordering ? html`
    - ${guard([this._uncheckedItems, this._renderEmptySortable], () => - this._renderEmptySortable - ? "" - : this._renderItems(this._uncheckedItems!) + ${guard( + [this._uncheckedItems, this._renderEmptySortable], + () => + this._renderEmptySortable + ? "" + : this._renderItems(this._uncheckedItems!) )}
    ` @@ -178,23 +180,22 @@ class HuiShoppingListCard ${repeat( this._checkedItems!, (item) => item.id, - (item) => - html` -
    - - -
    - ` + (item) => html` +
    + + +
    + ` )} ` : ""} @@ -207,35 +208,34 @@ class HuiShoppingListCard ${repeat( items, (item) => item.id, - (item) => - html` -
    - - - ${this._reordering - ? html` - - - ` - : ""} -
    - ` + (item) => html` +
    + + + ${this._reordering + ? html` + + + ` + : ""} +
    + ` )} `; } diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 3471b6348b..f9b10c65a9 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -453,7 +453,9 @@ export class HuiTileCard extends LitElement implements LovelaceCard { height: 100%; z-index: 0; overflow: hidden; - transition: box-shadow 180ms ease-in-out, border-color 180ms ease-in-out; + transition: + box-shadow 180ms ease-in-out, + border-color 180ms ease-in-out; } ha-card.active { --tile-color: var(--state-icon-color); diff --git a/src/panels/lovelace/common/process-config-entities.ts b/src/panels/lovelace/common/process-config-entities.ts index 1d4519ea5f..49ce41ad27 100644 --- a/src/panels/lovelace/common/process-config-entities.ts +++ b/src/panels/lovelace/common/process-config-entities.ts @@ -3,7 +3,7 @@ import { isValidEntityId } from "../../../common/entity/valid_entity_id"; import { EntityConfig, LovelaceRowConfig } from "../entity-rows/types"; export const processConfigEntities = < - T extends EntityConfig | LovelaceRowConfig + T extends EntityConfig | LovelaceRowConfig, >( entities: Array, checkEntityId = true diff --git a/src/panels/lovelace/components/hui-energy-period-selector.ts b/src/panels/lovelace/components/hui-energy-period-selector.ts index 9cd6666cd3..dd923698ff 100644 --- a/src/panels/lovelace/components/hui-energy-period-selector.ts +++ b/src/panels/lovelace/components/hui-energy-period-selector.ts @@ -343,7 +343,9 @@ export class HuiEnergyPeriodSelector extends SubscribeMixin(LitElement) { opacity: 0; pointer-events: none; content: ""; - transition: opacity 15ms linear, background-color 15ms linear; + transition: + opacity 15ms linear, + background-color 15ms linear; opacity: var(--mdc-icon-button-ripple-opacity, 0.12); } ha-icon-button.active::before { diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 792b8fd2e3..a92d49ba8b 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -185,7 +185,7 @@ export const createLovelaceElement = ( }; export const tryCreateLovelaceElement = < - T extends keyof CreateElementConfigTypes + T extends keyof CreateElementConfigTypes, >( tagSuffix: T, config: CreateElementConfigTypes[T]["config"], @@ -246,7 +246,7 @@ export const tryCreateLovelaceElement = < }; export const getLovelaceElementClass = async < - T extends keyof CreateElementConfigTypes + T extends keyof CreateElementConfigTypes, >( type: string, tagSuffix: T, diff --git a/src/panels/lovelace/editor/config-elements/hui-statistics-graph-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-statistics-graph-card-editor.ts index 8cb52183c5..3ed3b6d8af 100644 --- a/src/panels/lovelace/editor/config-elements/hui-statistics-graph-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-statistics-graph-card-editor.ts @@ -246,10 +246,11 @@ export class HuiStatisticsGraphCardEditor ); const configured_stat_types = this._config!.stat_types ? ensureArray(this._config.stat_types) - : stat_types.filter((stat_type) => - this._metaDatas?.some((metaData) => - statisticsMetaHasType(metaData, stat_type) - ) + : stat_types.filter( + (stat_type) => + this._metaDatas?.some((metaData) => + statisticsMetaHasType(metaData, stat_type) + ) ); const data = { chart_type: "line", diff --git a/src/panels/lovelace/editor/header-footer-editor/hui-dialog-create-headerfooter.ts b/src/panels/lovelace/editor/header-footer-editor/hui-dialog-create-headerfooter.ts index d1b5423e5e..092dd02134 100644 --- a/src/panels/lovelace/editor/header-footer-editor/hui-dialog-create-headerfooter.ts +++ b/src/panels/lovelace/editor/header-footer-editor/hui-dialog-create-headerfooter.ts @@ -56,26 +56,25 @@ export class HuiCreateDialogHeaderFooter >
    ${headerFooterElements.map( - (headerFooter, index) => - html` - - -
    - ${this.hass!.localize( - `ui.panel.lovelace.editor.header-footer.types.${headerFooter.type}.name` - )} -
    -
    - ` + (headerFooter, index) => html` + + +
    + ${this.hass!.localize( + `ui.panel.lovelace.editor.header-footer.types.${headerFooter.type}.name` + )} +
    +
    + ` )}
    diff --git a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts index 2d7d3c51e1..31b51927c1 100644 --- a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts @@ -75,19 +75,18 @@ class HuiSelectEntityRow extends LitElement implements LovelaceRow { > ${stateObj.attributes.options ? stateObj.attributes.options.map( - (option) => - html` - - ${computeStateDisplay( - this.hass!.localize, - stateObj, - this.hass!.locale, - this.hass!.config, - this.hass!.entities, - option - )} - - ` + (option) => html` + + ${computeStateDisplay( + this.hass!.localize, + stateObj, + this.hass!.locale, + this.hass!.config, + this.hass!.entities, + option + )} + + ` ) : ""} diff --git a/src/panels/lovelace/strategies/get-strategy.ts b/src/panels/lovelace/strategies/get-strategy.ts index 4e13f6ef36..59ae47b141 100644 --- a/src/panels/lovelace/strategies/get-strategy.ts +++ b/src/panels/lovelace/strategies/get-strategy.ts @@ -32,7 +32,7 @@ const strategies: Record< }; const getLovelaceStrategy = async < - T extends LovelaceDashboardStrategy | LovelaceViewStrategy + T extends LovelaceDashboardStrategy | LovelaceViewStrategy, >( strategyType: string ): Promise => { 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 5edcbfb34d..c622ad0d7e 100644 --- a/src/panels/profile/ha-long-lived-access-tokens-card.ts +++ b/src/panels/profile/ha-long-lived-access-tokens-card.ts @@ -61,23 +61,27 @@ class HaLongLivedTokens extends LitElement { )}

    ` : accessTokens!.map( - (token) => html` - ${token.client_name} -
    - ${this.hass.localize( - "ui.panel.profile.long_lived_access_tokens.created", - "date", - relativeTime(new Date(token.created_at), this.hass.locale) - )} -
    - -
    ` + (token) => + html` + ${token.client_name} +
    + ${this.hass.localize( + "ui.panel.profile.long_lived_access_tokens.created", + "date", + relativeTime( + new Date(token.created_at), + this.hass.locale + ) + )} +
    + +
    ` )}
    diff --git a/src/panels/profile/ha-mfa-modules-card.ts b/src/panels/profile/ha-mfa-modules-card.ts index c6fed2b149..ce3f94c0a2 100644 --- a/src/panels/profile/ha-mfa-modules-card.ts +++ b/src/panels/profile/ha-mfa-modules-card.ts @@ -17,21 +17,22 @@ class HaMfaModulesCard extends LitElement { return html` ${this.mfaModules.map( - (module) => html` - ${module.name} - ${module.id} - ${module.enabled - ? html`${this.hass.localize( - "ui.panel.profile.mfa.disable" - )}` - : html`${this.hass.localize( - "ui.panel.profile.mfa.enable" - )}`} - ` + (module) => + html` + ${module.name} + ${module.id} + ${module.enabled + ? html`${this.hass.localize( + "ui.panel.profile.mfa.disable" + )}` + : html`${this.hass.localize( + "ui.panel.profile.mfa.enable" + )}`} + ` )} `; diff --git a/src/panels/profile/ha-refresh-tokens-card.ts b/src/panels/profile/ha-refresh-tokens-card.ts index b271002a63..6217936dcb 100644 --- a/src/panels/profile/ha-refresh-tokens-card.ts +++ b/src/panels/profile/ha-refresh-tokens-card.ts @@ -50,57 +50,61 @@ class HaRefreshTokens extends LitElement { ${this.hass.localize("ui.panel.profile.refresh_tokens.description")} ${refreshTokens?.length ? refreshTokens!.map( - (token) => html` - ${this.hass.localize( - "ui.panel.profile.refresh_tokens.token_title", - { clientId: token.client_id } - )} - -
    - ${this.hass.localize( - "ui.panel.profile.refresh_tokens.created_at", - { - date: relativeTime( - new Date(token.created_at), - this.hass.locale - ), - } - )} -
    -
    - ${token.last_used_at - ? this.hass.localize( - "ui.panel.profile.refresh_tokens.last_used", - { - date: relativeTime( - new Date(token.last_used_at), - this.hass.locale - ), - location: token.last_used_ip, - } - ) - : this.hass.localize( - "ui.panel.profile.refresh_tokens.not_used" - )} -
    -
    - ${token.is_current - ? html` - ${this.hass.localize( - "ui.panel.profile.refresh_tokens.current_token_tooltip" + (token) => + html` + ${this.hass.localize( + "ui.panel.profile.refresh_tokens.token_title", + { clientId: token.client_id } + )} + +
    + ${this.hass.localize( + "ui.panel.profile.refresh_tokens.created_at", + { + date: relativeTime( + new Date(token.created_at), + this.hass.locale + ), + } + )} +
    +
    + ${token.last_used_at + ? this.hass.localize( + "ui.panel.profile.refresh_tokens.last_used", + { + date: relativeTime( + new Date(token.last_used_at), + this.hass.locale + ), + location: token.last_used_ip, + } + ) + : this.hass.localize( + "ui.panel.profile.refresh_tokens.not_used" )} - ` - : ""} - -
    -
    ` +
    +
    + ${token.is_current + ? html` + ${this.hass.localize( + "ui.panel.profile.refresh_tokens.current_token_tooltip" + )} + ` + : ""} + +
    +
    ` ) : ""} diff --git a/src/state-summary/state-card-select.ts b/src/state-summary/state-card-select.ts index 354136c67e..4e6b48c9dc 100644 --- a/src/state-summary/state-card-select.ts +++ b/src/state-summary/state-card-select.ts @@ -29,19 +29,18 @@ class StateCardSelect extends LitElement { @closed=${stopPropagation} > ${this.stateObj.attributes.options.map( - (option) => - html` - - ${computeStateDisplay( - this.hass.localize, - this.stateObj, - this.hass.locale, - this.hass.config, - this.hass.entities, - option - )} - - ` + (option) => html` + + ${computeStateDisplay( + this.hass.localize, + this.stateObj, + this.hass.locale, + this.hass.config, + this.hass.entities, + option + )} + + ` )} `; diff --git a/src/state/url-sync-mixin.ts b/src/state/url-sync-mixin.ts index 387bf8fd9b..70b908feac 100644 --- a/src/state/url-sync-mixin.ts +++ b/src/state/url-sync-mixin.ts @@ -19,7 +19,7 @@ export let historyPromise: Promise | undefined; let historyResolve: undefined | (() => void); export const urlSyncMixin = < - T extends Constructor + T extends Constructor, >( superClass: T ) => diff --git a/yarn.lock b/yarn.lock index 77a5aaaa45..e4275e4f19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9752,7 +9752,7 @@ __metadata: object-hash: 3.0.0 open: 9.1.0 pinst: 3.0.0 - prettier: 2.8.8 + prettier: 3.0.0 proxy-polyfill: 0.3.2 punycode: 2.3.0 qr-scanner: 1.4.2 @@ -13208,12 +13208,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:2.8.8": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" +"prettier@npm:3.0.0": + version: 3.0.0 + resolution: "prettier@npm:3.0.0" bin: - prettier: bin-prettier.js - checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 + prettier: bin/prettier.cjs + checksum: 6a832876a1552dc58330d2467874e5a0b46b9ccbfc5d3531eb69d15684743e7f83dc9fbd202db6270446deba9c82b79d24383d09924c462b457136a759425e33 languageName: node linkType: hard From d756daded45d21e7bb3ea6917d7a6b3d5e801f10 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:21:56 -0400 Subject: [PATCH 054/102] Update dependency eslint-plugin-unused-imports to v3 (#17312) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index c7be5ec960..bce5b25ebb 100644 --- a/package.json +++ b/package.json @@ -201,7 +201,7 @@ "eslint-plugin-import": "2.27.5", "eslint-plugin-lit": "1.8.3", "eslint-plugin-lit-a11y": "3.0.0", - "eslint-plugin-unused-imports": "2.0.0", + "eslint-plugin-unused-imports": "3.0.0", "eslint-plugin-wc": "1.5.0", "esprima": "4.0.1", "fancy-log": "2.0.0", diff --git a/yarn.lock b/yarn.lock index e4275e4f19..a998a0d667 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8069,18 +8069,18 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-unused-imports@npm:2.0.0": - version: 2.0.0 - resolution: "eslint-plugin-unused-imports@npm:2.0.0" +"eslint-plugin-unused-imports@npm:3.0.0": + version: 3.0.0 + resolution: "eslint-plugin-unused-imports@npm:3.0.0" dependencies: eslint-rule-composer: ^0.3.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 + "@typescript-eslint/eslint-plugin": ^6.0.0 eslint: ^8.0.0 peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true - checksum: 8aa1e03e75da2a62a354065e0cb8fe370118c6f8d9720a32fe8c1da937de6adb81a4fed7d0d391d115ac9453b49029fb19f970d180a2cf3dba451fd4c20f0dc4 + checksum: 51666f62cc8dccba2895ced83f3c1e0b78b68c357e17360e156c4db548bfdeda34cbd8725192fb4903f22d5069400fb22ded6039631df01ee82fd618dc307247 languageName: node linkType: hard @@ -9712,7 +9712,7 @@ __metadata: eslint-plugin-import: 2.27.5 eslint-plugin-lit: 1.8.3 eslint-plugin-lit-a11y: 3.0.0 - eslint-plugin-unused-imports: 2.0.0 + eslint-plugin-unused-imports: 3.0.0 eslint-plugin-wc: 1.5.0 esprima: 4.0.1 fancy-log: 2.0.0 From e81cac0d037647e01349d8ff9601e33cbf726ada Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 15 Jul 2023 16:08:15 -0400 Subject: [PATCH 055/102] Update babel monorepo to v7.22.9 (#17317) --- package.json | 6 +-- yarn.lock | 101 +++++++++++++++++++++++++-------------------------- 2 files changed, 53 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index bce5b25ebb..4c870d67a2 100644 --- a/package.json +++ b/package.json @@ -152,10 +152,10 @@ "xss": "1.0.14" }, "devDependencies": { - "@babel/core": "7.22.8", + "@babel/core": "7.22.9", "@babel/plugin-proposal-decorators": "7.22.7", - "@babel/plugin-transform-runtime": "7.22.7", - "@babel/preset-env": "7.22.7", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", "@babel/preset-typescript": "7.22.5", "@koa/cors": "4.0.0", "@octokit/auth-oauth-device": "6.0.0", diff --git a/yarn.lock b/yarn.lock index a998a0d667..2689d26906 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,45 +54,45 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/compat-data@npm:7.22.6" - checksum: b88631143a2ebdb75e5bac47984e950983294f1739c2133f32569c6f2fcee85f83634bb6cf4378afb44fa8eb7877d11e48811d1e6a52afa161f82276ffdc3fb4 +"@babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/compat-data@npm:7.22.9" + checksum: bed77d9044ce948b4327b30dd0de0779fa9f3a7ed1f2d31638714ed00229fa71fc4d1617ae0eb1fad419338d3658d0e9a5a083297451e09e73e078d0347ff808 languageName: node linkType: hard -"@babel/core@npm:7.22.8, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3": - version: 7.22.8 - resolution: "@babel/core@npm:7.22.8" +"@babel/core@npm:7.22.9, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3": + version: 7.22.9 + resolution: "@babel/core@npm:7.22.9" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.7 - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-module-transforms": ^7.22.5 + "@babel/generator": ^7.22.9 + "@babel/helper-compilation-targets": ^7.22.9 + "@babel/helper-module-transforms": ^7.22.9 "@babel/helpers": ^7.22.6 "@babel/parser": ^7.22.7 "@babel/template": ^7.22.5 "@babel/traverse": ^7.22.8 "@babel/types": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.2 - checksum: 75ed701c14ad17070382ae1dd166f7534b31f2c71e00995a5f261ee2398ee96335b0736573b8ff24ab6e3e6f5814ee2a48fa11ab90fabcd3dfc70ea87c5f30a6 + semver: ^6.3.1 + checksum: 7bf069aeceb417902c4efdaefab1f7b94adb7dea694a9aed1bda2edf4135348a080820529b1a300c6f8605740a00ca00c19b2d5e74b5dd489d99d8c11d5e56d1 languageName: node linkType: hard -"@babel/generator@npm:^7.22.7": - version: 7.22.7 - resolution: "@babel/generator@npm:7.22.7" +"@babel/generator@npm:^7.22.7, @babel/generator@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/generator@npm:7.22.9" dependencies: "@babel/types": ^7.22.5 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: cee15558888bdf5564e19cfaf95101b2910fa425f30cc1a25ac9b8621bd62b63544eb1b36ad89c80b5e41915699219f78712cab128d1f7e3da6a21fbf4143927 + checksum: 7c9d2c58b8d5ac5e047421a6ab03ec2ff5d9a5ff2c2212130a0055e063ac349e0b19d435537d6886c999771aef394832e4f54cd9fc810100a7f23d982f6af06b languageName: node linkType: hard @@ -114,18 +114,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-compilation-targets@npm:7.22.6" +"@babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-compilation-targets@npm:7.22.9" dependencies: - "@babel/compat-data": ^7.22.6 + "@babel/compat-data": ^7.22.9 "@babel/helper-validator-option": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 browserslist: ^4.21.9 lru-cache: ^5.1.1 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: c7788c48099c4f0edf2adeb367a941a930d39ed7453140ceb10d7114c4091922adf56d3cdd832050fd4501f25e872886390629042ddd365d3bce2ecad69ed394 + checksum: ea0006c6a93759025f4a35a25228ae260538c9f15023e8aac2a6d45ca68aef4cf86cfc429b19af9a402cbdd54d5de74ad3fbcf6baa7e48184dc079f1a791e178 languageName: node linkType: hard @@ -220,19 +220,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-transforms@npm:7.22.5" +"@babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-module-transforms@npm:7.22.9" dependencies: "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-module-imports": ^7.22.5 "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 "@babel/helper-validator-identifier": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 8985dc0d971fd17c467e8b84fe0f50f3dd8610e33b6c86e5b3ca8e8859f9448bcc5c84e08a2a14285ef388351c0484797081c8f05a03770bf44fc27bf4900e68 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 2751f77660518cf4ff027514d6f4794f04598c6393be7b04b8e46c6e21606e11c19f3f57ab6129a9c21bacdf8b3ffe3af87bb401d972f34af2d0ffde02ac3001 languageName: node linkType: hard @@ -298,7 +297,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6": +"@babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" dependencies: @@ -1140,19 +1139,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.22.7": - version: 7.22.7 - resolution: "@babel/plugin-transform-runtime@npm:7.22.7" +"@babel/plugin-transform-runtime@npm:7.22.9": + version: 7.22.9 + resolution: "@babel/plugin-transform-runtime@npm:7.22.9" dependencies: "@babel/helper-module-imports": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 babel-plugin-polyfill-corejs2: ^0.4.4 babel-plugin-polyfill-corejs3: ^0.8.2 babel-plugin-polyfill-regenerator: ^0.5.1 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1b41c44d5c44c98df3885b4f541c4edbef507bbdb1c889eed9878d9aabb29b6f589192ae712454c20ced22c79cfb2911403023daf03d20902434a258632d4773 + checksum: 2fe5e41f83015ca174feda841d77aa9012fc855c907f9b360a11927f41b100537c8c83487771769147668e797eec26d5294e972b997f4759133cc43a22a43eec languageName: node linkType: hard @@ -1273,12 +1272,12 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.22.7, @babel/preset-env@npm:^7.11.0": - version: 7.22.7 - resolution: "@babel/preset-env@npm:7.22.7" +"@babel/preset-env@npm:7.22.9, @babel/preset-env@npm:^7.11.0": + version: 7.22.9 + resolution: "@babel/preset-env@npm:7.22.9" dependencies: - "@babel/compat-data": ^7.22.6 - "@babel/helper-compilation-targets": ^7.22.6 + "@babel/compat-data": ^7.22.9 + "@babel/helper-compilation-targets": ^7.22.9 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-validator-option": ^7.22.5 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.5 @@ -1352,14 +1351,14 @@ __metadata: "@babel/plugin-transform-unicode-sets-regex": ^7.22.5 "@babel/preset-modules": ^0.1.5 "@babel/types": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 babel-plugin-polyfill-corejs2: ^0.4.4 babel-plugin-polyfill-corejs3: ^0.8.2 babel-plugin-polyfill-regenerator: ^0.5.1 core-js-compat: ^3.31.0 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: eabde70e450dd54f57997b0f92317f69f268e9a1f85b13f5ef5540d2a38cfae5620bd8e48ddffb547c55fbd2f17673276e6eb9411d6b5fb82e3422faf44cb6cf + checksum: 6caa2897bbda30c6932aed0a03827deb1337c57108050c9f97dc9a857e1533c7125b168b6d70b9d191965bf05f9f233f0ad20303080505dff7ce39740aaa759d languageName: node linkType: hard @@ -9577,10 +9576,10 @@ __metadata: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": 7.22.8 + "@babel/core": 7.22.9 "@babel/plugin-proposal-decorators": 7.22.7 - "@babel/plugin-transform-runtime": 7.22.7 - "@babel/preset-env": 7.22.7 + "@babel/plugin-transform-runtime": 7.22.9 + "@babel/preset-env": 7.22.9 "@babel/preset-typescript": 7.22.5 "@babel/runtime": 7.22.6 "@braintree/sanitize-url": 6.0.2 @@ -14055,12 +14054,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver.js + checksum: ae47d06de28836adb9d3e25f22a92943477371292d9b665fb023fae278d345d508ca1958232af086d85e0155aee22e313e100971898bbb8d5d89b8b1d4054ca2 languageName: node linkType: hard From c173ffd181af6c9a417cb85f10d4d4f2d756b0f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 16 Jul 2023 12:41:06 -0400 Subject: [PATCH 056/102] Update dependency google-timezones-json to v1.2.0 (#17321) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 4c870d67a2..5ba38c1c9f 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "deep-clone-simple": "1.1.1", "deep-freeze": "0.0.1", "fuse.js": "6.6.2", - "google-timezones-json": "1.1.0", + "google-timezones-json": "1.2.0", "hls.js": "1.4.8", "home-assistant-js-websocket": "8.2.0", "idb-keyval": "6.2.1", diff --git a/yarn.lock b/yarn.lock index 2689d26906..c0847954be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9301,10 +9301,10 @@ __metadata: languageName: node linkType: hard -"google-timezones-json@npm:1.1.0": - version: 1.1.0 - resolution: "google-timezones-json@npm:1.1.0" - checksum: 4abbf1b50a9c199fec4dbf7113803dbcb7c87794a4e52189dc0187e4c8a26a7dffd133bc4e2674e1f30f357e5f2060153effe267a013613c362cc098176dc8a0 +"google-timezones-json@npm:1.2.0": + version: 1.2.0 + resolution: "google-timezones-json@npm:1.2.0" + checksum: 2945d2ed900511cb5111c9066dd84a8330feed5166b195a854f9ac9550c9f9e2d10d62743e08a4571c6005a9a08045b2375c60dc9539c403830a0a25cd0d1690 languageName: node linkType: hard @@ -9718,7 +9718,7 @@ __metadata: fs-extra: 11.1.1 fuse.js: 6.6.2 glob: 10.3.3 - google-timezones-json: 1.1.0 + google-timezones-json: 1.2.0 gulp: 4.0.2 gulp-flatmap: 1.0.2 gulp-json-transform: 0.4.8 From bcfdb27e2585e8d8232fadad2a3e7649478b0b12 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 16 Jul 2023 12:43:16 -0400 Subject: [PATCH 057/102] Update dependency eslint-config-airbnb-typescript to v17.1.0 (#17320) --- package.json | 2 +- yarn.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 5ba38c1c9f..2c0286be0f 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "del": "7.0.0", "eslint": "8.44.0", "eslint-config-airbnb-base": "15.0.0", - "eslint-config-airbnb-typescript": "17.0.0", + "eslint-config-airbnb-typescript": "17.1.0", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-webpack": "0.13.2", "eslint-plugin-disable": "2.0.3", diff --git a/yarn.lock b/yarn.lock index c0847954be..588ad665ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7928,17 +7928,17 @@ __metadata: languageName: node linkType: hard -"eslint-config-airbnb-typescript@npm:17.0.0": - version: 17.0.0 - resolution: "eslint-config-airbnb-typescript@npm:17.0.0" +"eslint-config-airbnb-typescript@npm:17.1.0": + version: 17.1.0 + resolution: "eslint-config-airbnb-typescript@npm:17.1.0" dependencies: eslint-config-airbnb-base: ^15.0.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.13.0 - "@typescript-eslint/parser": ^5.0.0 + "@typescript-eslint/eslint-plugin": ^5.13.0 || ^6.0.0 + "@typescript-eslint/parser": ^5.0.0 || ^6.0.0 eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 - checksum: e598ae7bcc3629bbc847a749f8c1ad69e6ef111335b60d88bde91d1bb335077b06688868257fe2fcc95c3687a0d6e3e1f91e0534cc633f5a118239e52bb05a54 + checksum: cfd26a2782e322ebfdfbf9a64262332c7653f297c4a32d7b951079eb18bb9502a83d67b3f7ef2cc1c5374ae06098eb454ed010784b3416e7274839083022a08c languageName: node linkType: hard @@ -9704,7 +9704,7 @@ __metadata: del: 7.0.0 eslint: 8.44.0 eslint-config-airbnb-base: 15.0.0 - eslint-config-airbnb-typescript: 17.0.0 + eslint-config-airbnb-typescript: 17.1.0 eslint-config-prettier: 8.8.0 eslint-import-resolver-webpack: 0.13.2 eslint-plugin-disable: 2.0.3 From 3d0f2adf9fa673db324c87413da878eac0a76bf2 Mon Sep 17 00:00:00 2001 From: Skyler Carlson <43375685+skycarl@users.noreply.github.com> Date: Sun, 16 Jul 2023 11:09:48 -0700 Subject: [PATCH 058/102] Update wording in UI when restoring partial backup (#17319) --- hassio/src/dialogs/backup/dialog-hassio-backup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hassio/src/dialogs/backup/dialog-hassio-backup.ts b/hassio/src/dialogs/backup/dialog-hassio-backup.ts index cded8cf5ba..230ecc1f22 100644 --- a/hassio/src/dialogs/backup/dialog-hassio-backup.ts +++ b/hassio/src/dialogs/backup/dialog-hassio-backup.ts @@ -194,7 +194,7 @@ class HassioBackupDialog } if ( !(await showConfirmationDialog(this, { - title: "Are you sure you want partially to restore this backup?", + title: "Are you sure you want to restore this partial backup?", confirmText: "restore", dismissText: "cancel", })) From 4b40405cc4b118151550579bc022a52305b9bc03 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 16 Jul 2023 20:52:13 -0400 Subject: [PATCH 059/102] Update tsparticles to v2.11.0 (#17318) --- package.json | 4 +- yarn.lock | 106 +++++++++++++++++++++++++-------------------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/package.json b/package.json index 2c0286be0f..d710a9254d 100644 --- a/package.json +++ b/package.json @@ -135,8 +135,8 @@ "sortablejs": "1.15.0", "superstruct": "1.0.3", "tinykeys": "2.1.0", - "tsparticles-engine": "2.10.1", - "tsparticles-preset-links": "2.10.1", + "tsparticles-engine": "2.11.0", + "tsparticles-preset-links": "2.11.0", "unfetch": "5.0.0", "vis-data": "7.1.6", "vis-network": "9.1.6", diff --git a/yarn.lock b/yarn.lock index 588ad665ec..9af9d5432e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9773,8 +9773,8 @@ __metadata: terser-webpack-plugin: 5.3.9 tinykeys: 2.1.0 ts-lit-plugin: 2.0.0-pre.1 - tsparticles-engine: 2.10.1 - tsparticles-preset-links: 2.10.1 + tsparticles-engine: 2.11.0 + tsparticles-preset-links: 2.11.0 typescript: 5.1.6 unfetch: 5.0.0 vinyl-buffer: 1.0.1 @@ -15262,89 +15262,89 @@ __metadata: languageName: node linkType: hard -"tsparticles-engine@npm:2.10.1, tsparticles-engine@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-engine@npm:2.10.1" - checksum: 5662c453b1e4c37c608435393a8c5ae03bd9b301dc488a3909bdddf321f38c486b6076d61641add3e2d8764c6e8eb28021e1b424da3240b6efa723c6e8bcbc43 +"tsparticles-engine@npm:2.11.0, tsparticles-engine@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-engine@npm:2.11.0" + checksum: 1aad1c3969b38dec5b468220eba7a1a26982fd8b13567f37970fe8d1cd6e7609da8622e8b16599b6359ecc681a33e9672a8a697e5ea9f146b15cc709b9fa78d9 languageName: node linkType: hard -"tsparticles-interaction-particles-links@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-interaction-particles-links@npm:2.10.1" +"tsparticles-interaction-particles-links@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-interaction-particles-links@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: 994fcac1cfcae34409095437db7684cc9f74b4e084995da310ea7f1a63c0a97030cac8fde47a7a54b5e8644e26a3b72fb5e6d229e10758eb1e6fcf52800b8e83 + tsparticles-engine: ^2.11.0 + checksum: 38bfca50c5c8b55ef3cc55975a5be80479e283dbe04247f165635281f37f9b9fb6b884e5e996ca99e0da3725e4777100ddef2a04dab6216896649f48a89faf04 languageName: node linkType: hard -"tsparticles-move-base@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-move-base@npm:2.10.1" +"tsparticles-move-base@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-move-base@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: 26fb88e7622dfbede4d0177d01645917b01611bf8be32508588e7d8d6e28fcaf58daf900095a7947382d59fe9fcd420563cc6fc6a50c67c9c7ea7236c601d9b7 + tsparticles-engine: ^2.11.0 + checksum: a049e1ecd23f8b3fd19b236040085e415765b299e919647acc18e43eb2b6d51176c97ae3095f313cd0959096638d6d6ad4337d5c9cff8d98d1b8dadbad02eaff languageName: node linkType: hard -"tsparticles-preset-links@npm:2.10.1": - version: 2.10.1 - resolution: "tsparticles-preset-links@npm:2.10.1" +"tsparticles-preset-links@npm:2.11.0": + version: 2.11.0 + resolution: "tsparticles-preset-links@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - tsparticles-interaction-particles-links: ^2.10.1 - tsparticles-move-base: ^2.10.1 - tsparticles-shape-circle: ^2.10.1 - tsparticles-updater-color: ^2.10.1 - tsparticles-updater-opacity: ^2.10.1 - tsparticles-updater-out-modes: ^2.10.1 - tsparticles-updater-size: ^2.10.1 - checksum: 0678ad77ae9022f3ceac6b462ad4e049e2a0f5559b035690698609df081d7d6307fb93c38d07f3fe6e0f517635bd6a4831b705b7ba6fc33f79a22d4a3ddf65fe + tsparticles-engine: ^2.11.0 + tsparticles-interaction-particles-links: ^2.11.0 + tsparticles-move-base: ^2.11.0 + tsparticles-shape-circle: ^2.11.0 + tsparticles-updater-color: ^2.11.0 + tsparticles-updater-opacity: ^2.11.0 + tsparticles-updater-out-modes: ^2.11.0 + tsparticles-updater-size: ^2.11.0 + checksum: 4f50e70d25cce142fc1a692dc736819c3e42c6bf3c4d10eaf6667536750ed487ee8e6173914ade73fd26ea9cee0557e84e3bf305efc73fb6288803cd803a22a3 languageName: node linkType: hard -"tsparticles-shape-circle@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-shape-circle@npm:2.10.1" +"tsparticles-shape-circle@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-shape-circle@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: 49c2a865745c6217b08006c11f134e64792e1d62abbc1dc6f2484165b6b13b6bd7205cd10171418697680e513bd3c8d128c7d9877c61540722250bb8e1693f02 + tsparticles-engine: ^2.11.0 + checksum: a83098b8d39b8ed89d1ced0f7b2e560d53b8d0f85f3993cd539b8a72d12d84cc9ef67ccc663ac580489129f33638c1791506c40d69ac0afcf8cb2e999688b2c1 languageName: node linkType: hard -"tsparticles-updater-color@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-updater-color@npm:2.10.1" +"tsparticles-updater-color@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-updater-color@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: 6858b429fd59f244251584346d47748216774a9012a6ffb9a614f87ca83b957a6da2b0dffb1c9e5238c84c043c29a23eb828568baf4ddde76c73707a1a0652ba + tsparticles-engine: ^2.11.0 + checksum: bfbac9a31d1ccbc179c646016f45b6ca6990d1b23b654130e38ec8df95402241d20e18d8a5b061e66c82eef4380901ed964ccbe3143d5b8ff757bd91014134e6 languageName: node linkType: hard -"tsparticles-updater-opacity@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-updater-opacity@npm:2.10.1" +"tsparticles-updater-opacity@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-updater-opacity@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: f5a418dfe922db99cd6ee75a7accb901eebb4e4f34ef411be46a1d88c8893816b4f8487f7b100a0a1cda749fdecf1d052efaae994a8639a464b6d6829ec9ee8b + tsparticles-engine: ^2.11.0 + checksum: e8bf67196b529fabc838140ffe2997c58e27ab569e70a9815b10db93e8d5496f4f07e04b600b832d1a22239970eca29b2619e30f00cb0f2cc0428bd73c3582f0 languageName: node linkType: hard -"tsparticles-updater-out-modes@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-updater-out-modes@npm:2.10.1" +"tsparticles-updater-out-modes@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-updater-out-modes@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: 0f78d2aae5fa03f1af32dbe9eab326d6ef59b4e63226a84a5f8ce91efb1beecd13e0465068de9c9cd70ba830c212552fbe3b01fd21c674368ba39071af335e9b + tsparticles-engine: ^2.11.0 + checksum: 8f14fb9756c98e48d0d613b439bbb6c21d385b95cf78cebcc8077da15f42b2d9c219d7b51e9ed8f2643eb00a9871d2cdb91fc96922376827bf69171d030fc7ac languageName: node linkType: hard -"tsparticles-updater-size@npm:^2.10.1": - version: 2.10.1 - resolution: "tsparticles-updater-size@npm:2.10.1" +"tsparticles-updater-size@npm:^2.11.0": + version: 2.11.0 + resolution: "tsparticles-updater-size@npm:2.11.0" dependencies: - tsparticles-engine: ^2.10.1 - checksum: c77ce515aa765f4e069d232ca7407105d86c432042593fffdd6ae33948f84a654cba7e41c0aef00c2327ed3b5715ab07e057153b93afe5c7a2a5917eee786e85 + tsparticles-engine: ^2.11.0 + checksum: b14aecf4000441fe3e7f37cacd9f9074bb8fcd96b7ed0eb1be16274da8a843d005bca37949043867378138c6e65ccdd76c849ba2528a1c4cf92ad6488b4da7d8 languageName: node linkType: hard From 2564fb91db71b90dbf2aa2f9415ff820d022ca94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 07:55:20 -0400 Subject: [PATCH 060/102] Bump actions/labeler from 4.2.0 to 4.3.0 (#17327) --- .github/workflows/labeler.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yaml b/.github/workflows/labeler.yaml index 079d25cf06..166fcb1aa8 100644 --- a/.github/workflows/labeler.yaml +++ b/.github/workflows/labeler.yaml @@ -10,6 +10,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Apply labels - uses: actions/labeler@v4.2.0 + uses: actions/labeler@v4.3.0 with: sync-labels: true From 486cfd1d9161915030002443f8430b21f9993b05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 09:37:41 -0400 Subject: [PATCH 061/102] Update dependency hls.js to v1.4.9 (#17326) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index d710a9254d..a764067d01 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "deep-freeze": "0.0.1", "fuse.js": "6.6.2", "google-timezones-json": "1.2.0", - "hls.js": "1.4.8", + "hls.js": "1.4.9", "home-assistant-js-websocket": "8.2.0", "idb-keyval": "6.2.1", "intl-messageformat": "10.5.0", diff --git a/yarn.lock b/yarn.lock index 9af9d5432e..24255aad24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9565,10 +9565,10 @@ __metadata: languageName: node linkType: hard -"hls.js@npm:1.4.8": - version: 1.4.8 - resolution: "hls.js@npm:1.4.8" - checksum: abbd3985e5339dea9b0cd244080b914ad9fb6b092e926a41f9bc9affe3383e4ed1ccda32515ef35b78580feb13373cabfdb7d23c3fb1c7ef9cd02f62f3302353 +"hls.js@npm:1.4.9": + version: 1.4.9 + resolution: "hls.js@npm:1.4.9" + checksum: 51e469eb99e7093a1b71a7531731d9da8609104730f1030797d25c4e25d9d7d8a6d22603921cb9a9ee6ab26b28c569e91c68a37be92dc1f34bc58e0c5af65b99 languageName: node linkType: hard @@ -9725,7 +9725,7 @@ __metadata: gulp-merge-json: 2.1.2 gulp-rename: 2.0.0 gulp-zopfli-green: 6.0.1 - hls.js: 1.4.8 + hls.js: 1.4.9 home-assistant-js-websocket: 8.2.0 html-minifier-terser: 7.2.0 husky: 8.0.3 From 4c9066a4b07392013797a133224e405dd0ea3872 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 12:37:31 -0400 Subject: [PATCH 062/102] Update dependency eslint to v8.45.0 (#17330) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index a764067d01..45e3c8e65c 100644 --- a/package.json +++ b/package.json @@ -192,7 +192,7 @@ "babel-plugin-template-html-minifier": "4.1.0", "chai": "4.3.7", "del": "7.0.0", - "eslint": "8.44.0", + "eslint": "8.45.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "17.1.0", "eslint-config-prettier": "8.8.0", diff --git a/yarn.lock b/yarn.lock index 24255aad24..383f42846b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8136,9 +8136,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.44.0": - version: 8.44.0 - resolution: "eslint@npm:8.44.0" +"eslint@npm:8.45.0": + version: 8.45.0 + resolution: "eslint@npm:8.45.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.4.0 @@ -8165,7 +8165,6 @@ __metadata: globals: ^13.19.0 graphemer: ^1.4.0 ignore: ^5.2.0 - import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 @@ -8177,11 +8176,10 @@ __metadata: natural-compare: ^1.4.0 optionator: ^0.9.3 strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: d06309ce4aafb9d27d558c8e5e5aa5cba3bbec3ce8ceccbc7d4b7a35f2b67fd40189159155553270e2e6febeb69bd8a3b60d6241c8f5ddc2ef1702ccbd328501 + checksum: 3e6dcce5cc43c5e301662db88ee26d1d188b22c177b9f104d7eefd1191236980bd953b3670fe2fac287114b26d7c5420ab48407d7ea1c3a446d6313c000009da languageName: node linkType: hard @@ -9702,7 +9700,7 @@ __metadata: deep-clone-simple: 1.1.1 deep-freeze: 0.0.1 del: 7.0.0 - eslint: 8.44.0 + eslint: 8.45.0 eslint-config-airbnb-base: 15.0.0 eslint-config-airbnb-typescript: 17.1.0 eslint-config-prettier: 8.8.0 @@ -10089,7 +10087,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -14828,7 +14826,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 From 4946c00d34d14f613356a5f5937c8284afeff589 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 17 Jul 2023 18:57:43 +0200 Subject: [PATCH 063/102] Add last_used option for pipeline and explicit default (#17329) * Add last-used option for pipeline and explicit default * Default to last used --- src/components/ha-assist-pipeline-picker.ts | 24 +++++++++++++++---- .../ha-selector-assist-pipeline.ts | 21 +++++++++------- src/data/selector.ts | 4 +++- .../ha-voice-command-dialog.ts | 19 +++++++++++---- .../show-ha-voice-command-dialog.ts | 15 ++++++++---- src/external_app/external_messaging.ts | 4 ++-- src/panels/lovelace/common/handle-action.ts | 4 ++-- .../lovelace/components/hui-action-editor.ts | 4 +++- src/panels/lovelace/hui-root.ts | 4 ++-- .../shopping-list/ha-panel-shopping-list.ts | 2 +- src/translations/en.json | 3 ++- 11 files changed, 73 insertions(+), 31 deletions(-) diff --git a/src/components/ha-assist-pipeline-picker.ts b/src/components/ha-assist-pipeline-picker.ts index 0d51bc1444..80a69b2d27 100644 --- a/src/components/ha-assist-pipeline-picker.ts +++ b/src/components/ha-assist-pipeline-picker.ts @@ -16,7 +16,8 @@ import "./ha-list-item"; import "./ha-select"; import type { HaSelect } from "./ha-select"; -const PREFERRED = "__PREFERRED_PIPELINE_OPTION__"; +const PREFERRED = "preferred"; +const LAST_USED = "last_used"; @customElement("ha-assist-pipeline-picker") export class HaAssistPipelinePicker extends LitElement { @@ -30,15 +31,21 @@ export class HaAssistPipelinePicker extends LitElement { @property({ type: Boolean }) public required = false; + @property() public includeLastUsed = false; + @state() _pipelines?: AssistPipeline[]; @state() _preferredPipeline: string | null = null; + private get _default() { + return this.includeLastUsed ? LAST_USED : PREFERRED; + } + protected render() { if (!this._pipelines) { return nothing; } - const value = this.value ?? PREFERRED; + const value = this.value ?? this._default; return html` + ${this.includeLastUsed + ? html` + + ${this.hass!.localize( + "ui.components.pipeline-picker.last_used" + )} + + ` + : null} ${this.hass!.localize("ui.components.pipeline-picker.preferred", { preferred: this._pipelines.find( @@ -93,11 +109,11 @@ export class HaAssistPipelinePicker extends LitElement { !this.hass || target.value === "" || target.value === this.value || - (this.value === undefined && target.value === PREFERRED) + (this.value === undefined && target.value === this._default) ) { return; } - this.value = target.value === PREFERRED ? undefined : target.value; + this.value = target.value === this._default ? undefined : target.value; fireEvent(this, "value-changed", { value: this.value }); } } diff --git a/src/components/ha-selector/ha-selector-assist-pipeline.ts b/src/components/ha-selector/ha-selector-assist-pipeline.ts index 74a143b819..9a00519f07 100644 --- a/src/components/ha-selector/ha-selector-assist-pipeline.ts +++ b/src/components/ha-selector/ha-selector-assist-pipeline.ts @@ -21,14 +21,19 @@ export class HaAssistPipelineSelector extends LitElement { @property({ type: Boolean }) public required = true; protected render() { - return html``; + return html` + + `; } static styles = css` diff --git a/src/data/selector.ts b/src/data/selector.ts index 71805ef7d4..0a24bc2def 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -278,7 +278,9 @@ export interface ObjectSelector { export interface AssistPipelineSelector { // eslint-disable-next-line @typescript-eslint/ban-types - assist_pipeline: {} | null; + assist_pipeline: { + include_last_used?: boolean; + } | null; } export interface SelectOption { diff --git a/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts b/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts index b479b07a22..7bf95f7c33 100644 --- a/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts +++ b/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts @@ -87,9 +87,16 @@ export class HaVoiceCommandDialog extends LitElement { private _pipelinePromise?: Promise; - public async showDialog(params?: VoiceCommandDialogParams): Promise { - if (params?.pipeline_id) { - this._pipelineId = params?.pipeline_id; + public async showDialog( + params: Required + ): Promise { + if (params.pipeline_id === "last_used") { + // Do not set pipeline id (retrieve from storage) + } else if (params.pipeline_id === "preferred") { + await this._loadPipelines(); + this._pipelineId = this._preferredPipeline; + } else { + this._pipelineId = params.pipeline_id; } this._conversation = [ @@ -103,7 +110,11 @@ export class HaVoiceCommandDialog extends LitElement { this._scrollMessagesBottom(); await this._pipelinePromise; - if (params?.start_listening && this._pipeline?.stt_engine) { + if ( + params?.start_listening && + this._pipeline?.stt_engine && + AudioRecorder.isSupported + ) { this._toggleListening(); } } diff --git a/src/dialogs/voice-command-dialog/show-ha-voice-command-dialog.ts b/src/dialogs/voice-command-dialog/show-ha-voice-command-dialog.ts index c755877cd3..3c29fb8d16 100644 --- a/src/dialogs/voice-command-dialog/show-ha-voice-command-dialog.ts +++ b/src/dialogs/voice-command-dialog/show-ha-voice-command-dialog.ts @@ -4,21 +4,22 @@ import { HomeAssistant } from "../../types"; const loadVoiceCommandDialog = () => import("./ha-voice-command-dialog"); export interface VoiceCommandDialogParams { - pipeline_id?: string; + pipeline_id: "last_used" | "preferred" | string; start_listening?: boolean; } export const showVoiceCommandDialog = ( element: HTMLElement, hass: HomeAssistant, - dialogParams?: VoiceCommandDialogParams + dialogParams: VoiceCommandDialogParams ): void => { if (hass.auth.external?.config.hasAssist) { hass.auth.external!.fireMessage({ type: "assist/show", payload: { - pipeline_id: dialogParams?.pipeline_id, - start_listening: dialogParams?.start_listening, + pipeline_id: dialogParams.pipeline_id, + // Start listening by default for app + start_listening: dialogParams.start_listening ?? true, }, }); return; @@ -26,6 +27,10 @@ export const showVoiceCommandDialog = ( fireEvent(element, "show-dialog", { dialogTag: "ha-voice-command-dialog", dialogImport: loadVoiceCommandDialog, - dialogParams, + dialogParams: { + pipeline_id: dialogParams.pipeline_id, + // Don't start listening by default for web + start_listening: dialogParams.start_listening ?? false, + }, }); }; diff --git a/src/external_app/external_messaging.ts b/src/external_app/external_messaging.ts index 5c10155138..1b6e9d87f6 100644 --- a/src/external_app/external_messaging.ts +++ b/src/external_app/external_messaging.ts @@ -98,8 +98,8 @@ interface EMOutgoingMessageSidebarShow extends EMMessage { interface EMOutgoingMessageAssistShow extends EMMessage { type: "assist/show"; payload?: { - pipeline_id?: string; - start_listening?: boolean; + pipeline_id: "preferred" | "last_used" | string; + start_listening: boolean; }; } diff --git a/src/panels/lovelace/common/handle-action.ts b/src/panels/lovelace/common/handle-action.ts index febf1c848f..bd849bd428 100644 --- a/src/panels/lovelace/common/handle-action.ts +++ b/src/panels/lovelace/common/handle-action.ts @@ -164,8 +164,8 @@ export const handleAction = async ( } case "assist": { showVoiceCommandDialog(node, hass, { - start_listening: actionConfig.start_listening, - pipeline_id: actionConfig.pipeline_id, + start_listening: actionConfig.start_listening ?? false, + pipeline_id: actionConfig.pipeline_id ?? "last_used", }); break; } diff --git a/src/panels/lovelace/components/hui-action-editor.ts b/src/panels/lovelace/components/hui-action-editor.ts index 20d5e0f597..6ae48d59f1 100644 --- a/src/panels/lovelace/components/hui-action-editor.ts +++ b/src/panels/lovelace/components/hui-action-editor.ts @@ -38,7 +38,9 @@ const ASSIST_SCHEMA = [ { name: "pipeline_id", selector: { - assist_pipeline: {}, + assist_pipeline: { + include_last_used: true, + }, }, }, { diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index 0447b6f646..b023483ab9 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -567,7 +567,7 @@ class HUIRoot extends LitElement { if (searchParams.edit === "1") { this.lovelace!.setEditMode(true); } else if (searchParams.conversation === "1") { - showVoiceCommandDialog(this, this.hass); + this._showVoiceCommandDialog(); window.history.replaceState( null, "", @@ -793,7 +793,7 @@ class HUIRoot extends LitElement { } private _showVoiceCommandDialog(): void { - showVoiceCommandDialog(this, this.hass); + showVoiceCommandDialog(this, this.hass, { pipeline_id: "last_used" }); } private _handleEnableEditMode(ev: CustomEvent): void { diff --git a/src/panels/shopping-list/ha-panel-shopping-list.ts b/src/panels/shopping-list/ha-panel-shopping-list.ts index 94f675a601..a9cfb23eaf 100644 --- a/src/panels/shopping-list/ha-panel-shopping-list.ts +++ b/src/panels/shopping-list/ha-panel-shopping-list.ts @@ -76,7 +76,7 @@ class PanelShoppingList extends LitElement { } private _showVoiceCommandDialog(): void { - showVoiceCommandDialog(this, this.hass); + showVoiceCommandDialog(this, this.hass, { pipeline_id: "last_used" }); } static get styles(): CSSResultGroup { diff --git a/src/translations/en.json b/src/translations/en.json index 9079fcf245..d7673cff1e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -398,7 +398,8 @@ }, "pipeline-picker": { "pipeline": "Assistant", - "preferred": "Preferred assistant ({preferred})" + "preferred": "Preferred assistant ({preferred})", + "last_used": "Last used assistant" }, "theme-picker": { "theme": "Theme", From 0ce93263e97a8fa5b57a1d7ea0009f801f66dff1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:26:40 +0000 Subject: [PATCH 064/102] Update typescript-eslint monorepo to v6 (major) (#17299) * Update typescript-eslint monorepo to v6 * Remove duplicate values from log severity enum * Rename ActionHandler interface to avoid class conflict --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 4 +- src/data/integration.ts | 2 - .../directives/action-handler-directive.ts | 12 +- yarn.lock | 186 +++++++++--------- 4 files changed, 102 insertions(+), 102 deletions(-) diff --git a/package.json b/package.json index 45e3c8e65c..ff26d3047e 100644 --- a/package.json +++ b/package.json @@ -184,8 +184,8 @@ "@types/sortablejs": "1.15.1", "@types/tar": "6.1.5", "@types/webspeechapi": "0.0.29", - "@typescript-eslint/eslint-plugin": "5.62.0", - "@typescript-eslint/parser": "5.62.0", + "@typescript-eslint/eslint-plugin": "6.0.0", + "@typescript-eslint/parser": "6.0.0", "@web/dev-server": "0.1.38", "@web/dev-server-rollup": "0.4.1", "babel-loader": "9.1.3", diff --git a/src/data/integration.ts b/src/data/integration.ts index af9478925a..20a73d8235 100644 --- a/src/data/integration.ts +++ b/src/data/integration.ts @@ -54,10 +54,8 @@ export interface IntegrationLogInfo { export enum LogSeverity { CRITICAL = 50, - FATAL = 50, ERROR = 40, WARNING = 30, - WARN = 30, INFO = 20, DEBUG = 10, NOTSET = 0, diff --git a/src/panels/lovelace/common/directives/action-handler-directive.ts b/src/panels/lovelace/common/directives/action-handler-directive.ts index f7c5bc2d74..1d2b3c87a5 100644 --- a/src/panels/lovelace/common/directives/action-handler-directive.ts +++ b/src/panels/lovelace/common/directives/action-handler-directive.ts @@ -21,7 +21,7 @@ const isTouch = // @ts-ignore navigator.msMaxTouchPoints > 0; -interface ActionHandler extends HTMLElement { +interface ActionHandlerType extends HTMLElement { holdTime: number; bind(element: Element, options?: ActionHandlerOptions): void; } @@ -43,7 +43,7 @@ declare global { } } -class ActionHandler extends HTMLElement implements ActionHandler { +class ActionHandler extends HTMLElement implements ActionHandlerType { public holdTime = 500; public ripple: Ripple; @@ -240,23 +240,23 @@ class ActionHandler extends HTMLElement implements ActionHandler { customElements.define("action-handler", ActionHandler); -const getActionHandler = (): ActionHandler => { +const getActionHandler = (): ActionHandlerType => { const body = document.body; if (body.querySelector("action-handler")) { - return body.querySelector("action-handler") as ActionHandler; + return body.querySelector("action-handler") as ActionHandlerType; } const actionhandler = document.createElement("action-handler"); body.appendChild(actionhandler); - return actionhandler as ActionHandler; + return actionhandler as ActionHandlerType; }; export const actionHandlerBind = ( element: ActionHandlerElement, options?: ActionHandlerOptions ) => { - const actionhandler: ActionHandler = getActionHandler(); + const actionhandler: ActionHandlerType = getActionHandler(); if (!actionhandler) { return; } diff --git a/yarn.lock b/yarn.lock index 383f42846b..995136e32b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1552,7 +1552,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.3.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -1563,7 +1563,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.0": version: 4.5.1 resolution: "@eslint-community/regexpp@npm:4.5.1" checksum: 6d901166d64998d591fab4db1c2f872981ccd5f6fe066a1ad0a93d4e11855ecae6bfb76660869a469563e8882d4307228cebd41142adb409d182f2966771e57e @@ -4327,7 +4327,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.12 resolution: "@types/json-schema@npm:7.0.12" checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 @@ -4649,124 +4649,128 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" +"@typescript-eslint/eslint-plugin@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.0.0" dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/type-utils": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@eslint-community/regexpp": ^4.5.0 + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/type-utils": 6.0.0 + "@typescript-eslint/utils": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 debug: ^4.3.4 + grapheme-splitter: ^1.0.4 graphemer: ^1.4.0 - ignore: ^5.2.0 + ignore: ^5.2.4 + natural-compare: ^1.4.0 natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 + semver: ^7.5.0 + ts-api-utils: ^1.0.1 peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 + checksum: 863f30b8ceb24d104fc8a41774e4f597a35525533aa99721198293b51628a2d986dcc6413893f27eb9db5a49c2fd2cc91d3aece8ed23d590f3eb4e9939c3d6ad languageName: node linkType: hard -"@typescript-eslint/parser@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" +"@typescript-eslint/parser@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/parser@npm:6.0.0" dependencies: - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/typescript-estree": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 debug: ^4.3.4 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 + checksum: a22f0c8f67eb244134f9d79d78faf1b6e2c0965495d78eef94a5680868f3d0fd9446a3ce5dc1e36dde02587da5d962944f3d83679c712d0b819ac99cdb9f7143 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" +"@typescript-eslint/scope-manager@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/scope-manager@npm:6.0.0" dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 + checksum: 450015be6454f953d0ea0da020ab47597e96a7a15c1002eed16c57430783bd7b045513d57a126606fb35e8971f1ce65fbefd845e3b5496bf75284cbe1681d0b9 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" +"@typescript-eslint/type-utils@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/type-utils@npm:6.0.0" dependencies: - "@typescript-eslint/typescript-estree": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@typescript-eslint/typescript-estree": 6.0.0 + "@typescript-eslint/utils": 6.0.0 debug: ^4.3.4 - tsutils: ^3.21.0 + ts-api-utils: ^1.0.1 peerDependencies: - eslint: "*" + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 + checksum: 53f46237891cfa738f6a4bc766a4dbb8d745b1cb9cbe2d2b40f2a4abcf0327d4aa92d9ce5361e87cd26d82e0159f358e28b0c67759eb053c4fd752654dc9dcb1 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 +"@typescript-eslint/types@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/types@npm:6.0.0" + checksum: a2e232b66b0b057152f4a94d7e0be75f32e389c9c1ec9ed9901ed5aab6e5df08c07bde9865710e315d835e4400ec2232f9c3c525b6edf8a85675ebfbfb69d3a5 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" +"@typescript-eslint/typescript-estree@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.0.0" dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 + semver: ^7.5.0 + ts-api-utils: ^1.0.1 peerDependenciesMeta: typescript: optional: true - checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 + checksum: 6214ff9cc3c4fd7fe03f846e96a498ecf85916083bb60d419bc5a12142cff912670032b1de5ea52ab353ca7eeb4e1cc8fa475a22958b010043c88e274df49859 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" +"@typescript-eslint/utils@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/utils@npm:6.0.0" dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 + "@eslint-community/eslint-utils": ^4.3.0 + "@types/json-schema": ^7.0.11 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/typescript-estree": 6.0.0 eslint-scope: ^5.1.1 - semver: ^7.3.7 + semver: ^7.5.0 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 + eslint: ^7.0.0 || ^8.0.0 + checksum: 94b9b616282f6fa1ae50ba371a482a3c8c50268ef8039b4e86d29c445e95025c819358a5cc9955c4668482d97ef026e7a49e7f4b3a4685347136ef5bbd297e4d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@typescript-eslint/visitor-keys@npm:6.0.0": + version: 6.0.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.0.0" dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: ^3.3.0 - checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + "@typescript-eslint/types": 6.0.0 + eslint-visitor-keys: ^3.4.1 + checksum: b0d9848a4490174db1d25b5f336548bb11dde4e0ce664c3dc341bed89fb3a3ada091aeb7f5d2d371433815332d93339c6cb77f7a24469c329c3d055b15237bfa languageName: node linkType: hard @@ -9322,6 +9326,13 @@ __metadata: languageName: node linkType: hard +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 + languageName: node + linkType: hard + "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -9675,8 +9686,8 @@ __metadata: "@types/sortablejs": 1.15.1 "@types/tar": 6.1.5 "@types/webspeechapi": 0.0.29 - "@typescript-eslint/eslint-plugin": 5.62.0 - "@typescript-eslint/parser": 5.62.0 + "@typescript-eslint/eslint-plugin": 6.0.0 + "@typescript-eslint/parser": 6.0.0 "@vaadin/combo-box": 24.1.3 "@vaadin/vaadin-themable-mixin": 24.1.3 "@vibrant/color": 3.2.1-alpha.1 @@ -10064,7 +10075,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.2.0": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.2.4 resolution: "ignore@npm:5.2.4" checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef @@ -14061,14 +14072,14 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": - version: 7.5.2 - resolution: "semver@npm:7.5.2" +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.0": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: 3fdf5d1e6f170fe8bcc41669e31787649af91af7f54f05c71d0865bb7aa27e8b92f68b3e6b582483e2c1c648008bc84249d2cd86301771fe5cbf7621d1fe5375 + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard @@ -15217,6 +15228,15 @@ __metadata: languageName: node linkType: hard +"ts-api-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "ts-api-utils@npm:1.0.1" + peerDependencies: + typescript: ">=4.2.0" + checksum: 78794fc7270d295b36c1ac613465b5dc7e7226907a533125b30f177efef9dd630d4e503b00be31b44335eb2ebf9e136ebe97353f8fc5d383885d5fead9d54c09 + languageName: node + linkType: hard + "ts-lit-plugin@npm:2.0.0-pre.1": version: 2.0.0-pre.1 resolution: "ts-lit-plugin@npm:2.0.0-pre.1" @@ -15246,13 +15266,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - "tslib@npm:^2.0.1, tslib@npm:^2.0.2, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.5.3 resolution: "tslib@npm:2.5.3" @@ -15353,17 +15366,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" From d7e58a00caa3434c1d2ed42940b12a4bcdd15a5c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 18 Jul 2023 09:56:07 +0200 Subject: [PATCH 065/102] Add support for registering config panels (#17296) --- src/data/integration.ts | 10 +++++----- .../integrations/ha-config-integration-page.ts | 15 +++++++++++---- src/types.ts | 1 + 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/data/integration.ts b/src/data/integration.ts index 20a73d8235..151140bebd 100644 --- a/src/data/integration.ts +++ b/src/data/integration.ts @@ -4,11 +4,11 @@ import { HomeAssistant } from "../types"; import { debounce } from "../common/util/debounce"; export const integrationsWithPanel = { - matter: "/config/matter", - mqtt: "/config/mqtt", - thread: "/config/thread", - zha: "/config/zha/dashboard", - zwave_js: "/config/zwave_js/dashboard", + matter: "config/matter", + mqtt: "config/mqtt", + thread: "config/thread", + zha: "config/zha/dashboard", + zwave_js: "config/zwave_js/dashboard", }; export type IntegrationType = diff --git a/src/panels/config/integrations/ha-config-integration-page.ts b/src/panels/config/integrations/ha-config-integration-page.ts index 9248d0c805..b05b15b3ba 100644 --- a/src/panels/config/integrations/ha-config-integration-page.ts +++ b/src/panels/config/integrations/ha-config-integration-page.ts @@ -135,6 +135,13 @@ class HaConfigIntegrationPage extends SubscribeMixin(LitElement) { window.location.hash.substring(1) ); + private _configPanel = memoizeOne( + (domain: string, panels: HomeAssistant["panels"]): string | undefined => + Object.values(panels).find( + (panel) => panel.config_panel_domain === domain + )?.url_path || integrationsWithPanel[domain] + ); + private _domainConfigEntries = memoizeOne( (domain: string, configEntries?: ConfigEntry[]): ConfigEntry[] => configEntries @@ -638,6 +645,8 @@ class HaConfigIntegrationPage extends SubscribeMixin(LitElement) { } } + const configPanel = this._configPanel(item.domain, this.hass.panels); + return html` ${this.hass.localize("ui.common.enable")}
    ` - : item.domain in integrationsWithPanel && + : configPanel && (item.domain !== "matter" || isDevVersion(this.hass.config.version)) ? html` ${this.hass.localize( "ui.panel.config.integrations.config_entry.configure" diff --git a/src/types.ts b/src/types.ts index 7dcfee537f..bfdf9768e2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -120,6 +120,7 @@ export interface PanelInfo | null> { icon: string | null; title: string | null; url_path: string; + config_panel_domain?: string; } export interface Panels { From bc3295d8519fda0d20c16ccc079f0ee9a0fb1b59 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 18 Jul 2023 11:57:20 +0200 Subject: [PATCH 066/102] Add prefix support to text selector (#17335) --- src/components/ha-selector/ha-selector-text.ts | 1 + src/data/selector.ts | 1 + src/panels/config/script/ha-script-editor.ts | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/ha-selector/ha-selector-text.ts b/src/components/ha-selector/ha-selector-text.ts index fb8033790a..2c89b3c588 100644 --- a/src/components/ha-selector/ha-selector-text.ts +++ b/src/components/ha-selector/ha-selector-text.ts @@ -65,6 +65,7 @@ export class HaTextSelector extends LitElement { .type=${this._unmaskedPassword ? "text" : this.selector.text?.type} @input=${this._handleChange} .label=${this.label || ""} + .prefix=${this.selector.text?.prefix} .suffix=${this.selector.text?.type === "password" ? // reserve some space for the icon. html`
    ` diff --git a/src/data/selector.ts b/src/data/selector.ts index 0a24bc2def..5708470a45 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -329,6 +329,7 @@ export interface StringSelector { | "time" | "datetime-local" | "color"; + prefix?: string; suffix?: string; autocomplete?: string; } | null; diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index 177a5ac8a3..c9f1048e63 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -122,7 +122,9 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) { { name: "id", selector: { - text: {}, + text: { + prefix: "script.", + }, }, }, ] as const) From d56273ec25ff661d8889e6971eeabc08ac5e466b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 18 Jul 2023 15:00:41 +0200 Subject: [PATCH 067/102] Use nominatim from openstreetmap for location search in onboarding (#17287) * Use nominatim from openstreetmap for location search in onboarding * Update text, add user agent * Handle errors better, add email address * remove detect text * Use `ui.common.search` * Update attribution location * Apply suggestions from code review Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> * Update src/translations/en.json Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> * Remove unused style * Increase line-height * Apply suggestions --------- Co-authored-by: Paul Bottein Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com> --- src/auth/ha-authorize.ts | 4 + src/components/map/ha-locations-editor.ts | 41 +- src/components/map/ha-map.ts | 26 +- src/data/currency.ts | 254 ++++++++++ src/data/openstreetmap.ts | 69 +++ src/html/onboarding.html.template | 3 +- src/onboarding/onboarding-analytics.ts | 6 +- src/onboarding/onboarding-core-config.ts | 220 +++------ src/onboarding/onboarding-integrations.ts | 4 + src/onboarding/onboarding-location.ts | 542 ++++++++++++++++++++++ src/onboarding/onboarding-name.ts | 111 +++++ src/translations/en.json | 10 +- 12 files changed, 1121 insertions(+), 169 deletions(-) create mode 100644 src/data/currency.ts create mode 100644 src/data/openstreetmap.ts create mode 100644 src/onboarding/onboarding-location.ts create mode 100644 src/onboarding/onboarding-name.ts diff --git a/src/auth/ha-authorize.ts b/src/auth/ha-authorize.ts index deadcf765e..91fed8ef07 100644 --- a/src/auth/ha-authorize.ts +++ b/src/auth/ha-authorize.ts @@ -182,6 +182,10 @@ export class HaAuthorize extends litLocalizeLiteMixin(LitElement) { display: block; margin-top: 24px; } + p { + font-size: 14px; + line-height: 20px; + } `; } } diff --git a/src/components/map/ha-locations-editor.ts b/src/components/map/ha-locations-editor.ts index 9995094c95..76edc2606f 100644 --- a/src/components/map/ha-locations-editor.ts +++ b/src/components/map/ha-locations-editor.ts @@ -1,8 +1,9 @@ -import { +import type { Circle, DivIcon, DragEndEvent, LatLng, + LatLngExpression, Marker, MarkerOptions, } from "leaflet"; @@ -22,6 +23,8 @@ import type { HomeAssistant } from "../../types"; import "../ha-input-helper-text"; import "./ha-map"; import type { HaMap } from "./ha-map"; +import { HaIcon } from "../ha-icon"; +import { HaSvgIcon } from "../ha-svg-icon"; declare global { // for fire event @@ -40,6 +43,7 @@ export interface MarkerLocation { name?: string; id: string; icon?: string; + iconPath?: string; radius_color?: string; location_editable?: boolean; radius_editable?: boolean; @@ -81,11 +85,21 @@ export class HaLocationsEditor extends LitElement { ); } - public fitMap(): void { - this.map.fitMap(); + public fitMap(options?: { zoom?: number; pad?: number }): void { + this.map.fitMap(options); } - public async fitMarker(id: string): Promise { + public fitBounds( + boundingbox: LatLngExpression[], + options?: { zoom?: number; pad?: number } + ) { + this.map.fitBounds(boundingbox, options); + } + + public async fitMarker( + id: string, + options?: { zoom?: number } + ): Promise { if (!this.Leaflet) { await this._loadPromise; } @@ -104,7 +118,10 @@ export class HaLocationsEditor extends LitElement { if (circle) { this.map.leafletMap.fitBounds(circle.getBounds()); } else { - this.map.leafletMap.setView(marker.getLatLng(), this.zoom); + this.map.leafletMap.setView( + marker.getLatLng(), + options?.zoom || this.zoom + ); } } } @@ -199,15 +216,21 @@ export class HaLocationsEditor extends LitElement { this.locations.forEach((location: MarkerLocation) => { let icon: DivIcon | undefined; - if (location.icon) { + if (location.icon || location.iconPath) { // create icon const el = document.createElement("div"); el.className = "named-icon"; - if (location.name) { + if (location.name !== undefined) { el.innerText = location.name; } - const iconEl = document.createElement("ha-icon"); - iconEl.setAttribute("icon", location.icon); + let iconEl: HaIcon | HaSvgIcon; + if (location.icon) { + iconEl = document.createElement("ha-icon"); + iconEl.setAttribute("icon", location.icon); + } else { + iconEl = document.createElement("ha-svg-icon"); + iconEl.setAttribute("path", location.iconPath!); + } el.prepend(iconEl); icon = this.Leaflet!.divIcon({ diff --git a/src/components/map/ha-map.ts b/src/components/map/ha-map.ts index 507657ce15..8ff0b4275c 100644 --- a/src/components/map/ha-map.ts +++ b/src/components/map/ha-map.ts @@ -1,7 +1,8 @@ -import { +import type { Circle, CircleMarker, LatLngTuple, + LatLngExpression, Layer, Map, Marker, @@ -162,7 +163,7 @@ export class HaMap extends ReactiveElement { this._loaded = true; } - public fitMap(): void { + public fitMap(options?: { zoom?: number; pad?: number }): void { if (!this.leafletMap || !this.Leaflet || !this.hass) { return; } @@ -173,7 +174,7 @@ export class HaMap extends ReactiveElement { this.hass.config.latitude, this.hass.config.longitude ), - this.zoom + options?.zoom || this.zoom ); return; } @@ -196,11 +197,22 @@ export class HaMap extends ReactiveElement { ); }); - if (!this.layers) { - bounds = bounds.pad(0.5); - } + bounds = bounds.pad(options?.pad ?? 0.5); - this.leafletMap.fitBounds(bounds, { maxZoom: this.zoom }); + this.leafletMap.fitBounds(bounds, { maxZoom: options?.zoom || this.zoom }); + } + + public fitBounds( + boundingbox: LatLngExpression[], + options?: { zoom?: number; pad?: number } + ) { + if (!this.leafletMap || !this.Leaflet || !this.hass) { + return; + } + const bounds = this.Leaflet.latLngBounds(boundingbox).pad( + options?.pad ?? 0.5 + ); + this.leafletMap.fitBounds(bounds, { maxZoom: options?.zoom || this.zoom }); } private _drawLayers(prevLayers: Layer[] | undefined): void { diff --git a/src/data/currency.ts b/src/data/currency.ts new file mode 100644 index 0000000000..a263641615 --- /dev/null +++ b/src/data/currency.ts @@ -0,0 +1,254 @@ +// From http://country.io/currency.json + +export const countryCurrency = { + BD: "BDT", + BE: "EUR", + BF: "XOF", + BG: "BGN", + BA: "BAM", + BB: "BBD", + WF: "XPF", + BL: "EUR", + BM: "BMD", + BN: "BND", + BO: "BOB", + BH: "BHD", + BI: "BIF", + BJ: "XOF", + BT: "BTN", + JM: "JMD", + BV: "NOK", + BW: "BWP", + WS: "WST", + BQ: "USD", + BR: "BRL", + BS: "BSD", + JE: "GBP", + BY: "BYN", + BZ: "BZD", + RU: "RUB", + RW: "RWF", + RS: "RSD", + TL: "USD", + RE: "EUR", + TM: "TMT", + TJ: "TJS", + RO: "RON", + TK: "NZD", + GW: "XOF", + GU: "USD", + GT: "GTQ", + GS: "GBP", + GR: "EUR", + GQ: "XAF", + GP: "EUR", + JP: "JPY", + GY: "GYD", + GG: "GBP", + GF: "EUR", + GE: "GEL", + GD: "XCD", + GB: "GBP", + GA: "XAF", + SV: "USD", + GN: "GNF", + GM: "GMD", + GL: "DKK", + GI: "GIP", + GH: "GHS", + OM: "OMR", + TN: "TND", + JO: "JOD", + HR: "EUR", + HT: "HTG", + HU: "HUF", + HK: "HKD", + HN: "HNL", + HM: "AUD", + VE: "VEF", + PR: "USD", + PS: "ILS", + PW: "USD", + PT: "EUR", + SJ: "NOK", + PY: "PYG", + IQ: "IQD", + PA: "PAB", + PF: "XPF", + PG: "PGK", + PE: "PEN", + PK: "PKR", + PH: "PHP", + PN: "NZD", + PL: "PLN", + PM: "EUR", + ZM: "ZMK", + EH: "MAD", + EE: "EUR", + EG: "EGP", + ZA: "ZAR", + EC: "USD", + IT: "EUR", + VN: "VND", + SB: "SBD", + ET: "ETB", + SO: "SOS", + ZW: "ZWL", + SA: "SAR", + ES: "EUR", + ER: "ERN", + ME: "EUR", + MD: "MDL", + MG: "MGA", + MF: "EUR", + MA: "MAD", + MC: "EUR", + UZ: "UZS", + MM: "MMK", + ML: "XOF", + MO: "MOP", + MN: "MNT", + MH: "USD", + MK: "MKD", + MU: "MUR", + MT: "EUR", + MW: "MWK", + MV: "MVR", + MQ: "EUR", + MP: "USD", + MS: "XCD", + MR: "MRO", + IM: "GBP", + UG: "UGX", + TZ: "TZS", + MY: "MYR", + MX: "MXN", + IL: "ILS", + FR: "EUR", + IO: "USD", + SH: "SHP", + FI: "EUR", + FJ: "FJD", + FK: "FKP", + FM: "USD", + FO: "DKK", + NI: "NIO", + NL: "EUR", + NO: "NOK", + NA: "NAD", + VU: "VUV", + NC: "XPF", + NE: "XOF", + NF: "AUD", + NG: "NGN", + NZ: "NZD", + NP: "NPR", + NR: "AUD", + NU: "NZD", + CK: "NZD", + XK: "EUR", + CI: "XOF", + CH: "CHF", + CO: "COP", + CN: "CNY", + CM: "XAF", + CL: "CLP", + CC: "AUD", + CA: "CAD", + CG: "XAF", + CF: "XAF", + CD: "CDF", + CZ: "CZK", + CY: "EUR", + CX: "AUD", + CR: "CRC", + CW: "ANG", + CV: "CVE", + CU: "CUP", + SZ: "SZL", + SY: "SYP", + SX: "ANG", + KG: "KGS", + KE: "KES", + SS: "SSP", + SR: "SRD", + KI: "AUD", + KH: "KHR", + KN: "XCD", + KM: "KMF", + ST: "STD", + SK: "EUR", + KR: "KRW", + SI: "EUR", + KP: "KPW", + KW: "KWD", + SN: "XOF", + SM: "EUR", + SL: "SLL", + SC: "SCR", + KZ: "KZT", + KY: "KYD", + SG: "SGD", + SE: "SEK", + SD: "SDG", + DO: "DOP", + DM: "XCD", + DJ: "DJF", + DK: "DKK", + VG: "USD", + DE: "EUR", + YE: "YER", + DZ: "DZD", + US: "USD", + UY: "UYU", + YT: "EUR", + UM: "USD", + LB: "LBP", + LC: "XCD", + LA: "LAK", + TV: "AUD", + TW: "TWD", + TT: "TTD", + TR: "TRY", + LK: "LKR", + LI: "CHF", + LV: "EUR", + TO: "TOP", + LT: "EUR", + LU: "EUR", + LR: "LRD", + LS: "LSL", + TH: "THB", + TF: "EUR", + TG: "XOF", + TD: "XAF", + TC: "USD", + LY: "LYD", + VA: "EUR", + VC: "XCD", + AE: "AED", + AD: "EUR", + AG: "XCD", + AF: "AFN", + AI: "XCD", + VI: "USD", + IS: "ISK", + IR: "IRR", + AM: "AMD", + AL: "ALL", + AO: "AOA", + AQ: "", + AS: "USD", + AR: "ARS", + AU: "AUD", + AT: "EUR", + AW: "AWG", + IN: "INR", + AX: "EUR", + AZ: "AZN", + IE: "EUR", + ID: "IDR", + UA: "UAH", + QA: "QAR", + MZ: "MZN", +}; diff --git a/src/data/openstreetmap.ts b/src/data/openstreetmap.ts new file mode 100644 index 0000000000..3428d46f74 --- /dev/null +++ b/src/data/openstreetmap.ts @@ -0,0 +1,69 @@ +import { HomeAssistant } from "../types"; + +export interface OpenStreetMapPlace { + place_id: number; + licence: string; + osm_type: string; + osm_id: number; + lat: string; + lon: string; + place_rank: number; + category: string; + type: string; + importance: number; + addresstype: string; + name: string | null; + display_name: string; + address: { + house_number?: string; + road?: string; + neighbourhood?: string; + city?: string; + municipality?: string; + state?: string; + country?: string; + postcode?: string; + country_code: string; + [key: string]: string | undefined; + }; + boundingbox: number[]; +} + +export const searchPlaces = ( + address: string, + hass: HomeAssistant, + addressdetails?: boolean, + limit?: number +): Promise => + fetch( + `https://nominatim.openstreetmap.org/search.php?q=${address}&format=jsonv2${ + limit ? `&limit=${limit}` : "" + }${addressdetails ? "&addressdetails=1" : ""}&accept-language=${ + hass.locale.language + }&email=abuse@home-assistant.io`, + { headers: { "User-Agent": `HomeAssistant/${hass.config.version}` } } + ).then((res) => { + if (res.ok) { + return res.json(); + } + throw new Error(res.statusText); + }); + +export const reverseGeocode = ( + location: [number, number], + hass: HomeAssistant, + zoom?: number +): Promise => + fetch( + `https://nominatim.openstreetmap.org/reverse.php?lat=${location[0]}&lon=${ + location[1] + }&accept-language=${hass.locale.language}&zoom=${ + zoom ?? 18 + }&format=jsonv2&email=abuse@home-assistant.io`, + { headers: { "User-Agent": `HomeAssistant/${hass.config.version}` } } + ).then((res) => { + if (res.ok) { + return res.json(); + } + throw new Error(res.statusText); + }); diff --git a/src/html/onboarding.html.template b/src/html/onboarding.html.template index 7e34e0bc7a..1824f4727b 100644 --- a/src/html/onboarding.html.template +++ b/src/html/onboarding.html.template @@ -11,13 +11,14 @@ } body { height: auto; + padding: 64px 0; } .content { box-sizing: border-box; padding: 20px 16px; border-radius: var(--ha-card-border-radius, 12px); max-width: 432px; - margin: 64px auto 0; + margin: 0 auto; box-shadow: var( --ha-card-box-shadow, rgba(0, 0, 0, 0.25) 0px 54px 55px, diff --git a/src/onboarding/onboarding-analytics.ts b/src/onboarding/onboarding-analytics.ts index 09c19a6f98..aeddcb4cc7 100644 --- a/src/onboarding/onboarding-analytics.ts +++ b/src/onboarding/onboarding-analytics.ts @@ -82,10 +82,13 @@ class OnboardingAnalytics extends LitElement { static get styles(): CSSResultGroup { return css` + p { + font-size: 14px; + line-height: 20px; + } .error { color: var(--error-color); } - .footer { margin-top: 16px; display: flex; @@ -93,7 +96,6 @@ class OnboardingAnalytics extends LitElement { align-items: center; flex-direction: row-reverse; } - a { color: var(--primary-color); } diff --git a/src/onboarding/onboarding-core-config.ts b/src/onboarding/onboarding-core-config.ts index 46621294f4..3ea32cd556 100644 --- a/src/onboarding/onboarding-core-config.ts +++ b/src/onboarding/onboarding-core-config.ts @@ -5,10 +5,10 @@ import { html, LitElement, nothing, + PropertyValues, TemplateResult, } from "lit"; -import { customElement, property, query, state } from "lit/decorators"; -import memoizeOne from "memoize-one"; +import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; import type { LocalizeFunc } from "../common/translations/localize"; import "../components/ha-alert"; @@ -22,22 +22,13 @@ import "../components/ha-textfield"; import type { HaTextField } from "../components/ha-textfield"; import "../components/ha-timezone-picker"; import "../components/map/ha-locations-editor"; -import type { - HaLocationsEditor, - MarkerLocation, -} from "../components/map/ha-locations-editor"; -import { - ConfigUpdateValues, - detectCoreConfig, - saveCoreConfig, -} from "../data/core"; +import { ConfigUpdateValues, saveCoreConfig } from "../data/core"; +import { countryCurrency } from "../data/currency"; import { onboardCoreConfigStep } from "../data/onboarding"; import type { HomeAssistant, ValueChangedEvent } from "../types"; import { getLocalLanguage } from "../util/common-translation"; - -const amsterdam: [number, number] = [52.3731339, 4.8903147]; -const mql = matchMedia("(prefers-color-scheme: dark)"); -const locationMarkerId = "location"; +import "./onboarding-location"; +import "./onboarding-name"; @customElement("onboarding-core-config") class OnboardingCoreConfig extends LitElement { @@ -57,19 +48,29 @@ class OnboardingCoreConfig extends LitElement { @state() private _currency?: ConfigUpdateValues["currency"]; - @state() private _timeZone? = - Intl.DateTimeFormat?.().resolvedOptions?.().timeZone; + @state() private _timeZone?: ConfigUpdateValues["time_zone"]; - @state() private _language: ConfigUpdateValues["language"] = - getLocalLanguage(); + @state() private _language: ConfigUpdateValues["language"]; @state() private _country?: ConfigUpdateValues["country"]; @state() private _error?: string; - @query("ha-locations-editor", true) private map!: HaLocationsEditor; - protected render(): TemplateResult { + if (!this._name) { + return html``; + } + if (!this._location) { + return html``; + } return html` ${ this._error @@ -78,55 +79,11 @@ class OnboardingCoreConfig extends LitElement { }

    - ${this.onboardingLocalize( - "ui.panel.page-onboarding.core-config.intro", - "name", - this.hass.user!.name - )} + ${this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.intro_core_config" + )}

    - - -
    -

    - ${this.onboardingLocalize( - "ui.panel.page-onboarding.core-config.intro_location" - )} -

    - -
    -
    - ${this.onboardingLocalize( - "ui.panel.page-onboarding.core-config.intro_location_detect" - )} -
    - - ${this.onboardingLocalize( - "ui.panel.page-onboarding.core-config.button_detect" - )} - -
    -
    - -
    - -
    -
    this.renderRoot.querySelector("ha-textfield")!.focus(), - 100 - ); - this.addEventListener("keypress", (ev) => { - if (ev.key === "Enter") { + this.addEventListener("keyup", (ev) => { + if (this._location && ev.key === "Enter") { this._save(ev); } }); } - private get _nameValue() { - return this._name !== undefined - ? this._name - : this.onboardingLocalize( - "ui.panel.page-onboarding.core-config.location_name_default" - ); - } - - private get _locationValue() { - return this._location || amsterdam; - } - private get _elevationValue() { return this._elevation !== undefined ? this._elevation : 0; } @@ -324,17 +279,6 @@ class OnboardingCoreConfig extends LitElement { return this._currency !== undefined ? this._currency : ""; } - private _markerLocation = memoizeOne( - (location: [number, number]): MarkerLocation[] => [ - { - id: locationMarkerId, - latitude: location[0], - longitude: location[1], - location_editable: true, - }, - ] - ); - private _handleValueChanged(ev: ValueChangedEvent) { const target = ev.currentTarget as HTMLElement; this[`_${target.getAttribute("name")}`] = ev.detail.value; @@ -345,8 +289,25 @@ class OnboardingCoreConfig extends LitElement { this[`_${target.name}`] = target.value; } - private _locationChanged(ev) { - this._location = ev.detail.location; + private _nameChanged(ev: CustomEvent) { + this._name = ev.detail.value; + } + + private async _locationChanged(ev) { + this._location = ev.detail.value.location; + this._country = ev.detail.value.country; + this._elevation = ev.detail.value.elevation; + this._currency = ev.detail.value.currency; + this._language = ev.detail.value.language || getLocalLanguage(); + this._timeZone = + ev.detail.value.timezone || + Intl.DateTimeFormat?.().resolvedOptions?.().timeZone; + this._unitSystem = ev.detail.value.unit_system; + await this.updateComplete; + setTimeout( + () => this.renderRoot.querySelector("ha-textfield")!.focus(), + 100 + ); } private _unitSystemChanged(ev: CustomEvent) { @@ -355,55 +316,17 @@ class OnboardingCoreConfig extends LitElement { | "us_customary"; } - private async _detect() { - this._working = true; - try { - const values = await detectCoreConfig(this.hass); - - if (values.latitude && values.longitude) { - this.map.addEventListener( - "markers-updated", - () => { - this.map.fitMarker(locationMarkerId); - }, - { - once: true, - } - ); - this._location = [Number(values.latitude), Number(values.longitude)]; - } - if (values.elevation) { - this._elevation = String(values.elevation); - } - if (values.unit_system) { - this._unitSystem = values.unit_system; - } - if (values.time_zone) { - this._timeZone = values.time_zone; - } - if (values.currency) { - this._currency = values.currency; - } - if (values.country) { - this._country = values.country; - } - this._language = getLocalLanguage(); - } catch (err: any) { - this._error = `Failed to detect location information: ${err.message}`; - } finally { - this._working = false; - } - } - private async _save(ev) { + if (!this._location) { + return; + } ev.preventDefault(); this._working = true; try { - const location = this._locationValue; await saveCoreConfig(this.hass, { - location_name: this._nameValue, - latitude: location[0], - longitude: location[1], + location_name: this._name, + latitude: this._location[0], + longitude: this._location[1], elevation: Number(this._elevationValue), unit_system: this._unitSystemValue, time_zone: this._timeZoneValue || "UTC", @@ -436,12 +359,13 @@ class OnboardingCoreConfig extends LitElement { color: var(--secondary-text-color); } - ha-textfield { - display: block; + p { + font-size: 14px; + line-height: 20px; } - ha-locations-editor { - height: 200px; + ha-textfield { + display: block; } .flex { diff --git a/src/onboarding/onboarding-integrations.ts b/src/onboarding/onboarding-integrations.ts index 56622a750f..c2c145359a 100644 --- a/src/onboarding/onboarding-integrations.ts +++ b/src/onboarding/onboarding-integrations.ts @@ -211,6 +211,10 @@ class OnboardingIntegrations extends SubscribeMixin(LitElement) { static get styles(): CSSResultGroup { return css` + p { + font-size: 14px; + line-height: 20px; + } .badges { margin-top: 24px; display: flex; diff --git a/src/onboarding/onboarding-location.ts b/src/onboarding/onboarding-location.ts new file mode 100644 index 0000000000..e75a64b100 --- /dev/null +++ b/src/onboarding/onboarding-location.ts @@ -0,0 +1,542 @@ +import "@material/mwc-button/mwc-button"; +import { mdiCrosshairsGps, mdiMapMarker, mdiMapSearchOutline } from "@mdi/js"; +import { + css, + CSSResultGroup, + html, + LitElement, + nothing, + TemplateResult, +} from "lit"; +import { customElement, property, query, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; +import type { LocalizeFunc } from "../common/translations/localize"; +import "../components/ha-alert"; +import "../components/ha-formfield"; +import "../components/ha-radio"; +import "../components/ha-textfield"; +import type { HaTextField } from "../components/ha-textfield"; +import "../components/map/ha-locations-editor"; +import type { + HaLocationsEditor, + MarkerLocation, +} from "../components/map/ha-locations-editor"; +import { ConfigUpdateValues, detectCoreConfig } from "../data/core"; +import { showConfirmationDialog } from "../dialogs/generic/show-dialog-box"; +import type { HomeAssistant } from "../types"; +import { fireEvent } from "../common/dom/fire_event"; +import { + OpenStreetMapPlace, + reverseGeocode, + searchPlaces, +} from "../data/openstreetmap"; + +const AMSTERDAM: [number, number] = [52.3731339, 4.8903147]; +const mql = matchMedia("(prefers-color-scheme: dark)"); +const LOCATION_MARKER_ID = "location"; + +@customElement("onboarding-location") +class OnboardingLocation extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public onboardingLocalize!: LocalizeFunc; + + @state() private _working = false; + + @state() private _location?: [number, number]; + + @state() private _places?: OpenStreetMapPlace[] | null; + + @state() private _error?: string; + + @state() private _search = false; + + @state() private _highlightedMarker?: number; + + private _elevation?: string; + + private _unitSystem?: ConfigUpdateValues["unit_system"]; + + private _currency?: ConfigUpdateValues["currency"]; + + private _timeZone?: ConfigUpdateValues["time_zone"]; + + private _country?: ConfigUpdateValues["country"]; + + @query("ha-locations-editor", true) private map!: HaLocationsEditor; + + protected render(): TemplateResult { + const addressAttribution = this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.location_address", + { + openstreetmap: html`OpenStreetMap`, + osm_privacy_policy: html`${this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.osm_privacy_policy" + )}`, + } + ); + + return html` + ${this._error + ? html`${this._error}` + : nothing} + +

    + ${this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.intro_location" + )} +

    + + + ${this._working + ? html` + + ` + : html` + + `} + + ${this._places !== undefined + ? html` + + ${this._places?.length + ? this._places.map((place) => { + const primary = [ + place.name || place.address[place.category], + place.address.house_number, + place.address.road || place.address.waterway, + place.address.village || place.address.town, + place.address.suburb || place.address.subdivision, + place.address.city || place.address.municipality, + ] + .filter(Boolean) + .join(", "); + const secondary = [ + place.address.county || + place.address.state_district || + place.address.region, + place.address.state, + place.address.country, + ] + .filter(Boolean) + .join(", "); + return html` + ${primary || secondary} + ${primary ? secondary : ""} + `; + }) + : html`${this._places === null ? "" : "No results"}`} + + ` + : nothing} +

    ${addressAttribution}

    + + + + `; + } + + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + setTimeout( + () => this.renderRoot.querySelector("ha-textfield")!.focus(), + 100 + ); + this.addEventListener("keyup", (ev) => { + if (ev.key === "Enter") { + this._save(ev); + } + }); + } + + protected updated(changedProps) { + if (changedProps.has("_highlightedMarker") && this._highlightedMarker) { + const place = this._places?.find( + (plc) => plc.place_id === this._highlightedMarker + ); + if (place?.boundingbox?.length === 4) { + this.map.fitBounds( + [ + [place.boundingbox[0], place.boundingbox[2]], + [place.boundingbox[1], place.boundingbox[3]], + ], + { zoom: 16, pad: 0 } + ); + } else { + this.map.fitMarker(String(this._highlightedMarker), { zoom: 16 }); + } + } + } + + private _markerLocations = memoizeOne( + ( + location?: [number, number], + places?: OpenStreetMapPlace[] | null, + highlightedMarker?: number + ): MarkerLocation[] => { + if (!places) { + return [ + { + id: LOCATION_MARKER_ID, + latitude: (location || AMSTERDAM)[0], + longitude: (location || AMSTERDAM)[1], + location_editable: true, + }, + ]; + } + return places?.length + ? places.map((place) => ({ + id: String(place.place_id), + iconPath: + place.place_id === highlightedMarker ? undefined : mdiMapMarker, + latitude: + location && place.place_id === highlightedMarker + ? location[0] + : Number(place.lat), + longitude: + location && place.place_id === highlightedMarker + ? location[1] + : Number(place.lon), + location_editable: place.place_id === highlightedMarker, + })) + : []; + } + ); + + private _locationChanged(ev) { + this._location = ev.detail.location; + if (ev.detail.id !== LOCATION_MARKER_ID) { + this._reverseGeocode(); + } + } + + private _markerClicked(ev) { + if (ev.detail.id === LOCATION_MARKER_ID) { + return; + } + this._highlightedMarker = ev.detail.id; + const place = this._places!.find((plc) => plc.place_id === ev.detail.id)!; + this._location = [Number(place.lat), Number(place.lon)]; + this._country = place.address.country_code.toUpperCase(); + } + + private _itemClicked(ev) { + this._highlightedMarker = ev.currentTarget.placeId; + const place = this._places!.find( + (plc) => plc.place_id === ev.currentTarget.placeId + )!; + this._location = [Number(place.lat), Number(place.lon)]; + this._country = place.address.country_code.toUpperCase(); + } + + private async _addressSearch(ev: KeyboardEvent) { + ev.stopPropagation(); + this._search = (ev.currentTarget as HaTextField).value.length > 0; + if (ev.key !== "Enter") { + return; + } + this._searchAddress((ev.currentTarget as HaTextField).value); + } + + private async _searchAddress(address: string) { + this._working = true; + this._location = undefined; + this._highlightedMarker = undefined; + this._error = undefined; + this._places = null; + this.map.addEventListener( + "markers-updated", + () => { + setTimeout(() => { + if ((this._places?.length || 0) > 2) { + this.map.fitMap({ pad: 0.5 }); + } + }, 500); + }, + { + once: true, + } + ); + try { + this._places = await searchPlaces(address, this.hass, true, 3); + if (this._places?.length === 1) { + this._highlightedMarker = this._places[0].place_id; + this._location = [ + Number(this._places[0].lat), + Number(this._places[0].lon), + ]; + this._country = this._places[0].address.country_code.toUpperCase(); + } + } catch (e: any) { + this._places = undefined; + this._error = e.message; + } finally { + this._working = false; + } + } + + private async _reverseGeocode() { + if (!this._location) { + return; + } + this._places = null; + const reverse = await reverseGeocode(this._location, this.hass); + this._country = reverse.address.country_code.toUpperCase(); + this._places = [reverse]; + this._highlightedMarker = reverse.place_id; + } + + private async _handleButtonClick(ev) { + if (this._search) { + this._searchAddress(ev.target.parentElement.value); + return; + } + this._detectLocation(); + } + + private _detectLocation() { + if (window.isSecureContext && navigator.geolocation) { + this._working = true; + const options = { + enableHighAccuracy: true, + timeout: 5000, + maximumAge: 0, + }; + navigator.geolocation.getCurrentPosition( + async (result) => { + this.map.addEventListener( + "markers-updated", + () => { + this.map.fitMarker(LOCATION_MARKER_ID); + }, + { + once: true, + } + ); + this._location = [result.coords.latitude, result.coords.longitude]; + if (result.coords.altitude) { + this._elevation = String(result.coords.altitude); + } + try { + await this._reverseGeocode(); + } finally { + this._working = false; + } + }, + () => { + // GPS is not available, get location based on IP + this._working = false; + this._whoAmI(); + }, + options + ); + } else { + this._whoAmI(); + } + } + + private async _whoAmI() { + const confirm = await showConfirmationDialog(this, { + title: this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.title_location_detect" + ), + text: this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.intro_location_detect" + ), + }); + if (!confirm) { + return; + } + this._working = true; + try { + const values = await detectCoreConfig(this.hass); + + if (values.latitude && values.longitude) { + this.map.addEventListener( + "markers-updated", + () => { + this.map.fitMarker(LOCATION_MARKER_ID); + }, + { + once: true, + } + ); + this._location = [Number(values.latitude), Number(values.longitude)]; + } + if (values.elevation) { + this._elevation = String(values.elevation); + } + if (values.unit_system) { + this._unitSystem = values.unit_system; + } + if (values.time_zone) { + this._timeZone = values.time_zone; + } + if (values.currency) { + this._currency = values.currency; + } + if (values.country) { + this._country = values.country; + } + } catch (err: any) { + this._error = `Failed to detect location information: ${err.message}`; + } finally { + this._working = false; + } + } + + private async _save(ev) { + if (!this._location) { + return; + } + ev.preventDefault(); + fireEvent(this, "value-changed", { + value: { + location: this._location!, + country: this._country, + elevation: this._elevation, + unit_system: this._unitSystem, + time_zone: this._timeZone, + currency: this._currency, + }, + }); + } + + static get styles(): CSSResultGroup { + return css` + p { + font-size: 14px; + line-height: 20px; + } + ha-textfield { + display: block; + } + ha-textfield > ha-icon-button { + position: absolute; + top: 10px; + right: 10px; + --mdc-icon-button-size: 36px; + --mdc-icon-size: 20px; + color: var(--secondary-text-color); + inset-inline-start: initial; + inset-inline-end: 10px; + direction: var(--direction); + } + ha-textfield > ha-circular-progress { + position: relative; + left: 12px; + } + ha-locations-editor { + display: block; + height: 300px; + margin-top: 8px; + border-radius: var(--mdc-shape-small, 4px); + overflow: hidden; + } + mwc-list { + width: 100%; + border: 1px solid var(--divider-color); + box-sizing: border-box; + border-top-width: 0; + border-bottom-left-radius: var(--mdc-shape-small, 4px); + border-bottom-right-radius: var(--mdc-shape-small, 4px); + --mdc-list-vertical-padding: 0; + } + ha-list-item { + height: 72px; + } + .footer { + margin-top: 16px; + text-align: right; + } + .attribution { + /* textfield helper style */ + margin: 0; + padding: 4px 16px 12px 16px; + color: var(--mdc-text-field-label-ink-color, rgba(0, 0, 0, 0.6)); + font-family: var( + --mdc-typography-caption-font-family, + var(--mdc-typography-font-family, Roboto, sans-serif) + ); + font-size: var(--mdc-typography-caption-font-size, 0.75rem); + font-weight: var(--mdc-typography-caption-font-weight, 400); + letter-spacing: var( + --mdc-typography-caption-letter-spacing, + 0.0333333333em + ); + text-decoration: var(--mdc-typography-caption-text-decoration, inherit); + text-transform: var(--mdc-typography-caption-text-transform, inherit); + } + .attribution a { + color: inherit; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "onboarding-location": OnboardingLocation; + } +} diff --git a/src/onboarding/onboarding-name.ts b/src/onboarding/onboarding-name.ts new file mode 100644 index 0000000000..6d8d023137 --- /dev/null +++ b/src/onboarding/onboarding-name.ts @@ -0,0 +1,111 @@ +import "@material/mwc-button/mwc-button"; +import { CSSResultGroup, LitElement, TemplateResult, css, html } from "lit"; +import { customElement, property } from "lit/decorators"; +import { fireEvent } from "../common/dom/fire_event"; +import type { LocalizeFunc } from "../common/translations/localize"; +import "../components/ha-alert"; +import "../components/ha-formfield"; +import "../components/ha-radio"; +import "../components/ha-textfield"; +import "../components/map/ha-locations-editor"; +import { ConfigUpdateValues } from "../data/core"; +import type { HomeAssistant } from "../types"; + +@customElement("onboarding-name") +class OnboardingName extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public onboardingLocalize!: LocalizeFunc; + + private _name?: ConfigUpdateValues["location_name"]; + + protected render(): TemplateResult { + return html` +

    + ${this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.intro", + { name: this.hass.user!.name } + )} +

    + + + +

    + ${this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.intro_core" + )} +

    + + + `; + } + + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + setTimeout( + () => this.renderRoot.querySelector("ha-textfield")!.focus(), + 100 + ); + this.addEventListener("keyup", (ev) => { + if (ev.key === "Enter") { + this._save(ev); + } + }); + } + + private get _nameValue() { + return this._name !== undefined + ? this._name + : this.onboardingLocalize( + "ui.panel.page-onboarding.core-config.location_name_default" + ); + } + + private _nameChanged(ev) { + this._name = ev.target.value; + } + + private async _save(ev) { + ev.preventDefault(); + fireEvent(this, "value-changed", { + value: this._nameValue, + }); + } + + static get styles(): CSSResultGroup { + return css` + ha-textfield { + display: block; + } + p { + font-size: 14px; + line-height: 20px; + } + .footer { + margin-top: 16px; + text-align: right; + } + a { + color: var(--primary-color); + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "onboarding-name": OnboardingName; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index d7673cff1e..04ba3cae2e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -5589,10 +5589,16 @@ }, "core-config": { "intro": "Hello {name}, welcome to Home Assistant. How would you like to name your home?", - "intro_location": "We would like to know where you live. This information will help with displaying information and setting up sun-based automations. This data is never shared outside of your network.", - "intro_location_detect": "We can help you fill in this information by making a one-time request to an external service.", + "intro_core": "We will set up the basics together. You can always change this later in the settings.", + "intro_location": "Let's set up the location of your home so that you can display information such as the local weather and use sun-based or presence-based automations. This data is never shared outside of your network.", + "location_address": "Powered by {openstreetmap} ({osm_privacy_policy}).", + "osm_privacy_policy": "Privacy policy", + "title_location_detect": "Do you want us to detect your location?", + "intro_location_detect": "We can detect your location by making a one-time request to an external service.", + "intro_core_config": "We filled out some details about your location. Please check if they are correct and continue.", "location_name": "Name of your Home Assistant installation", "location_name_default": "Home", + "address_label": "Search address", "button_detect": "Detect", "finish": "Next" }, From 000288aecbf4cf163bc411834fa6893f6207a2bb Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 18 Jul 2023 15:01:00 +0200 Subject: [PATCH 068/102] Change button to plus and minus to inc/dec position (#17194) --- .../lovelace/components/hui-card-options.ts | 28 +++++++++---------- src/translations/en.json | 4 +-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/panels/lovelace/components/hui-card-options.ts b/src/panels/lovelace/components/hui-card-options.ts index 6f52d6135f..7e3a567839 100644 --- a/src/panels/lovelace/components/hui-card-options.ts +++ b/src/panels/lovelace/components/hui-card-options.ts @@ -1,14 +1,14 @@ import "@material/mwc-button"; import { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import { - mdiArrowDown, - mdiArrowUp, mdiContentCopy, mdiContentCut, mdiContentDuplicate, mdiDelete, mdiDotsVertical, mdiFileMoveOutline, + mdiMinus, + mdiPlus, } from "@mdi/js"; import deepClone from "deep-clone-simple"; import { @@ -96,14 +96,12 @@ export class HuiCardOptions extends LitElement { ? html` ` : nothing} @@ -291,7 +291,7 @@ export class HuiCardOptions extends LitElement { this._clipboard = deepClone(cardConfig); } - private _cardUp(): void { + private _decreaseCardPosiion(): void { const lovelace = this.lovelace!; const path = this.path!; lovelace.saveConfig( @@ -299,7 +299,7 @@ export class HuiCardOptions extends LitElement { ); } - private _cardDown(): void { + private _increaseCardPosition(): void { const lovelace = this.lovelace!; const path = this.path!; lovelace.saveConfig( diff --git a/src/translations/en.json b/src/translations/en.json index 04ba3cae2e..28579d89f7 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4571,11 +4571,11 @@ "cut": "Cut", "duplicate": "Duplicate", "move": "Move to view", - "move_up": "Move card up", - "move_down": "Move card down", "move_before": "Move card before", "move_after": "Move card after", "change_position": "Change card position", + "decrease_position": "Decrease card position", + "increase_position": "Increase card position", "options": "More options", "search_cards": "Search cards" }, From 4a044fc40ec0c4969c92c4951ea4f7457d8b17b0 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 18 Jul 2023 15:22:20 +0200 Subject: [PATCH 069/102] Improve default theme wording (#17336) * Improve default theme wording * Remove home assistant translation --- src/components/ha-theme-picker.ts | 18 ++++++++---------- src/panels/profile/ha-pick-theme-row.ts | 21 +++++++++++---------- src/translations/en.json | 6 ++---- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/components/ha-theme-picker.ts b/src/components/ha-theme-picker.ts index 8835a5b186..ef619737b2 100644 --- a/src/components/ha-theme-picker.ts +++ b/src/components/ha-theme-picker.ts @@ -42,17 +42,15 @@ export class HaThemePicker extends LitElement { fixedMenuPosition naturalMenuWidth > - ${this.hass!.localize( - "ui.components.theme-picker.no_theme" - )} + + ${this.hass!.localize("ui.components.theme-picker.no_theme")} + ${this.includeDefault - ? html`${this.hass!.localize( - "ui.components.theme-picker.default" - )}` + ? html` + + Home Assistant + + ` : nothing} ${Object.keys(this.hass!.themes.themes) .sort() diff --git a/src/panels/profile/ha-pick-theme-row.ts b/src/panels/profile/ha-pick-theme-row.ts index 1677ff7e15..725955fe98 100644 --- a/src/panels/profile/ha-pick-theme-row.ts +++ b/src/panels/profile/ha-pick-theme-row.ts @@ -23,8 +23,8 @@ import { import { HomeAssistant } from "../../types"; import { documentationUrl } from "../../util/documentation-url"; -const BACKEND_SELECTED_THEME = "Backend-selected"; -const DEFAULT_THEME = "default"; +const USE_DEFAULT_THEME = "__USE_DEFAULT_THEME__"; +const HOME_ASSISTANT_THEME = "default"; @customElement("ha-pick-theme-row") export class HaPickThemeRow extends LitElement { @@ -68,15 +68,15 @@ export class HaPickThemeRow extends LitElement { - - ${this.hass.localize("ui.panel.profile.themes.backend-selected")} + + ${this.hass.localize("ui.panel.profile.themes.use_default")} - - ${this.hass.localize("ui.panel.profile.themes.default")} + + Home Assistant ${this._themeNames.map( (theme) => html` @@ -85,7 +85,8 @@ export class HaPickThemeRow extends LitElement { )} - ${curTheme === DEFAULT_THEME || this._supportsModeSelection(curTheme) + ${curTheme === HOME_ASSISTANT_THEME || + this._supportsModeSelection(curTheme) ? html`
    - ${curTheme === DEFAULT_THEME + ${curTheme === HOME_ASSISTANT_THEME ? html`
    Date: Tue, 18 Jul 2023 09:23:39 -0400 Subject: [PATCH 070/102] Use the user-provided name when sorting devices (#17297) --- src/components/device/ha-device-picker.ts | 24 +++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 8b8d5bf8a0..3b54cec2d5 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -230,19 +230,23 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { ); } - const outputDevices = inputDevices.map((device) => ({ - id: device.id, - name: computeDeviceName( + const outputDevices = inputDevices.map((device) => { + const name = computeDeviceName( device, this.hass, deviceEntityLookup[device.id] - ), - area: - device.area_id && areaLookup[device.area_id] - ? areaLookup[device.area_id].name - : this.hass.localize("ui.components.device-picker.no_area"), - strings: [device.name || ""], - })); + ); + + return { + id: device.id, + name: name, + area: + device.area_id && areaLookup[device.area_id] + ? areaLookup[device.area_id].name + : this.hass.localize("ui.components.device-picker.no_area"), + strings: [name || ""], + }; + }); if (!outputDevices.length) { return [ { From 38b68bffa6cb862463560444301be90928a52c92 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 18 Jul 2023 16:08:04 +0200 Subject: [PATCH 071/102] Hide no theme option when required (#17338) --- src/components/ha-theme-picker.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/ha-theme-picker.ts b/src/components/ha-theme-picker.ts index ef619737b2..104c327cad 100644 --- a/src/components/ha-theme-picker.ts +++ b/src/components/ha-theme-picker.ts @@ -42,9 +42,13 @@ export class HaThemePicker extends LitElement { fixedMenuPosition naturalMenuWidth > - - ${this.hass!.localize("ui.components.theme-picker.no_theme")} - + ${!this.required + ? html` + + ${this.hass!.localize("ui.components.theme-picker.no_theme")} + + ` + : nothing} ${this.includeDefault ? html` From 493f1d1b505de1862f60708a6002a54106565f2b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 16:45:10 +0200 Subject: [PATCH 072/102] Update dependency @material/web to v1.0.0-pre.13 (#17303) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ff26d3047e..ddfc3fd498 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@material/mwc-top-app-bar": "0.27.0", "@material/mwc-top-app-bar-fixed": "0.27.0", "@material/top-app-bar": "=14.0.0-canary.53b3cad2f.0", - "@material/web": "=1.0.0-pre.12", + "@material/web": "=1.0.0-pre.13", "@mdi/js": "7.2.96", "@mdi/svg": "7.2.96", "@polymer/app-layout": "3.1.0", diff --git a/yarn.lock b/yarn.lock index 995136e32b..46ebff1f32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3156,14 +3156,14 @@ __metadata: languageName: node linkType: hard -"@material/web@npm:=1.0.0-pre.12": - version: 1.0.0-pre.12 - resolution: "@material/web@npm:1.0.0-pre.12" +"@material/web@npm:=1.0.0-pre.13": + version: 1.0.0-pre.13 + resolution: "@material/web@npm:1.0.0-pre.13" dependencies: lit: ^2.7.4 safevalues: ^0.4.3 tslib: ^2.4.0 - checksum: 21132f90e004c84745bd9ba15aacc0ec74ee5c67e8dd610da14220cf0fa129882a82c409094b39226a82f9eaae0c1fbea9a6df07a6a056fc2ef5b771a14b078a + checksum: f477ea3a50991d90bfd1491d35b26393deab43a735053b873e50e53fa34e599c552acc19e3fcaebcb44cbabcf08529b6970ec11a552e2a93146fe0a230e3a4b3 languageName: node linkType: hard @@ -9645,7 +9645,7 @@ __metadata: "@material/mwc-top-app-bar": 0.27.0 "@material/mwc-top-app-bar-fixed": 0.27.0 "@material/top-app-bar": =14.0.0-canary.53b3cad2f.0 - "@material/web": =1.0.0-pre.12 + "@material/web": =1.0.0-pre.13 "@mdi/js": 7.2.96 "@mdi/svg": 7.2.96 "@octokit/auth-oauth-device": 6.0.0 From c71fd055a483373626e911dd9a0bfe4f4fecb05f Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Tue, 18 Jul 2023 11:16:33 -0400 Subject: [PATCH 073/102] Expand use of prettier to all tracked files (#17311) --- .github/release-drafter.yml | 4 +- .github/workflows/codeql-analysis.yml | 60 ++--- .prettierignore | 3 + .vscode/launch.json | 6 +- .vscode/tasks.json | 2 +- cast/public/service_worker.js | 2 +- demo/public/service_worker.js | 2 +- .../Text/remove-delete-add-create.markdown | 58 +++-- gallery/src/pages/brand/logo.markdown | 3 +- .../src/pages/components/ha-alert.markdown | 46 ++-- .../src/pages/components/ha-dialogs.markdown | 30 ++- .../src/pages/components/ha-gauge.markdown | 1 - .../src/pages/components/ha-switch.markdown | 2 +- gallery/src/pages/concepts/home.markdown | 5 +- .../date-time/date-time-numeric.markdown | 2 +- .../date-time/date-time-seconds.markdown | 2 +- .../date-time/date-time-short-year.markdown | 2 +- .../pages/date-time/date-time-short.markdown | 2 +- .../src/pages/date-time/date-time.markdown | 2 +- gallery/src/pages/date-time/date.markdown | 2 +- .../src/pages/date-time/time-seconds.markdown | 2 +- .../src/pages/date-time/time-weekday.markdown | 2 +- gallery/src/pages/date-time/time.markdown | 2 +- .../src/pages/lovelace/introduction.markdown | 1 + .../user-test/configuration-menu.markdown | 222 ++++++++++-------- .../src/pages/user-test/user-types.markdown | 2 +- lint-staged.config.js | 2 +- package.json | 4 +- 28 files changed, 258 insertions(+), 215 deletions(-) create mode 100644 .prettierignore diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 82a06ab923..26ef3a0753 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,8 +1,8 @@ categories: - - title: 'Dependency updates' + - title: "Dependency updates" collapse-after: 3 labels: - - 'Dependencies' + - "Dependencies" template: | ## What's Changed diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index fda71956ed..bd200e208e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -17,44 +17,44 @@ jobs: matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['javascript'] + language: ["javascript"] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection steps: - - name: Checkout repository - uses: actions/checkout@v3.5.3 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 + - name: Checkout repository + uses: actions/checkout@v3.5.3 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 - # If this run was triggered by a pull request event, then checkout - # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..bd7a779fea --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +CLA.md +CODE_OF_CONDUCT.md +LICENSE.md diff --git a/.vscode/launch.json b/.vscode/launch.json index e3be0de9c7..9b3f7b48ad 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,9 +9,7 @@ "webRoot": "${workspaceFolder}/hass_frontend", "disableNetworkCache": true, "preLaunchTask": "Develop Frontend", - "outFiles": [ - "${workspaceFolder}/hass_frontend/frontend_latest/*.js" - ] + "outFiles": ["${workspaceFolder}/hass_frontend/frontend_latest/*.js"] }, { "name": "Debug Gallery", @@ -39,6 +37,6 @@ "webRoot": "${workspaceFolder}/cast/dist", "disableNetworkCache": true, "preLaunchTask": "Develop Cast" - }, + } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 5e5bddec9c..91f8252e8f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -197,7 +197,7 @@ "type": "gulp", "task": "setup-and-fetch-nightly-translations", "problemMatcher": [] - } + } ], "inputs": [ { diff --git a/cast/public/service_worker.js b/cast/public/service_worker.js index 9cd535c9fc..04c7fbdc2c 100644 --- a/cast/public/service_worker.js +++ b/cast/public/service_worker.js @@ -1,3 +1,3 @@ -self.addEventListener("fetch", function(event) { +self.addEventListener("fetch", (event) => { event.respondWith(fetch(event.request)); }); diff --git a/demo/public/service_worker.js b/demo/public/service_worker.js index 9cd535c9fc..04c7fbdc2c 100644 --- a/demo/public/service_worker.js +++ b/demo/public/service_worker.js @@ -1,3 +1,3 @@ -self.addEventListener("fetch", function(event) { +self.addEventListener("fetch", (event) => { event.respondWith(fetch(event.request)); }); diff --git a/gallery/src/pages/Text/remove-delete-add-create.markdown b/gallery/src/pages/Text/remove-delete-add-create.markdown index 395adc673c..89c61db638 100644 --- a/gallery/src/pages/Text/remove-delete-add-create.markdown +++ b/gallery/src/pages/Text/remove-delete-add-create.markdown @@ -4,53 +4,63 @@ subtitle: The difference between remove/delete and add/create. --- # Remove vs Delete + Remove and Delete are quite similar, but can be frustrating if used inconsistently. ## Remove + Take away and set aside, but kept in existence. For example: -* Removing a user's permission -* Removing a user from a group -* Removing links between items -* Removing a widget -* Removing a link -* Removing an item from a cart + +- Removing a user's permission +- Removing a user from a group +- Removing links between items +- Removing a widget +- Removing a link +- Removing an item from a cart ## Delete + Erase, rendered nonexistent or nonrecoverable. For example: -* Deleting a field -* Deleting a value in a field -* Deleting a task -* Deleting a group -* Deleting a permission -* Deleting a calendar event + +- Deleting a field +- Deleting a value in a field +- Deleting a task +- Deleting a group +- Deleting a permission +- Deleting a calendar event # Add vs Create + In most cases, Create can be paired with Delete, and Add can be paired with Remove. ## Add + An already-exisiting item. For example: -* Adding a permission to a user -* Adding a user to a group -* Adding links between items -* Adding a widget -* Adding a link -* Adding an item to a cart + +- Adding a permission to a user +- Adding a user to a group +- Adding links between items +- Adding a widget +- Adding a link +- Adding an item to a cart ## Create + Something made from scratch. For example: -* Creating a new field -* Creating a new value in a field -* Creating a new task -* Creating a new group -* Creating a new permission -* Creating a new calendar event + +- Creating a new field +- Creating a new value in a field +- Creating a new task +- Creating a new group +- Creating a new permission +- Creating a new calendar event Based on this is [UX magazine article](https://uxmag.com/articles/ui-copy-remove-vs-delete2-banner). diff --git a/gallery/src/pages/brand/logo.markdown b/gallery/src/pages/brand/logo.markdown index 550b1e056d..9cd8722f7c 100644 --- a/gallery/src/pages/brand/logo.markdown +++ b/gallery/src/pages/brand/logo.markdown @@ -10,7 +10,6 @@ As a community, we are proud of our logo. Follow these guidelines to ensure it a ![Logo](/images/logo.png) - ## Using the icon Our icon is a shorter and most used version of our logo. The icon can exist without the wordmark, the wordmark should never exist without the icon. @@ -21,7 +20,7 @@ Our icon is a shorter and most used version of our logo. The icon can exist with The pretty blue logo with a background shadow, pictured top left, is our primary logo. It should only be used with black, white, and non-duotone photography. -When needed you can use our logo without a shadow, as seen as the second variant. +When needed you can use our logo without a shadow, as seen as the second variant. The outlined logo should only be used on packaging. diff --git a/gallery/src/pages/components/ha-alert.markdown b/gallery/src/pages/components/ha-alert.markdown index 89f2aa39d8..9d2eced805 100644 --- a/gallery/src/pages/components/ha-alert.markdown +++ b/gallery/src/pages/components/ha-alert.markdown @@ -11,6 +11,7 @@ subtitle: An alert displays a short, important message in a way that attracts th # Alert `` + The alert offers four severity levels that set a distinctive icon and color. @@ -35,38 +36,46 @@ The alert offers four severity levels that set a distinctive icon and color. 2. [Implementation](#implementation) ### Resources -| Type | Link | Status | -|----------------|----------------------------------|-----------| + +| Type | Link | Status | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | | Design | Home Assistant DesignKit (Figma) | Available | -| Implementation | Web Component (GitHub) | Available | +| Implementation | Web Component (GitHub) | Available | ## Guidelines + ### Usage + An alert displays a short, important message in a way that attracts the user's attention without interrupting the user's task. ### Anatomy -*Documentation coming soon* + +_Documentation coming soon_ ### Error alert + Error alerts -*Real world example coming soon* +_Real world example coming soon_ ### Warning alert + Warning alerts -*Real world example coming soon* +_Real world example coming soon_ ### Info alert + Info alerts -*Real world example coming soon* +_Real world example coming soon_ ### Success alert + Success alerts -*Real world example coming soon* +_Real world example coming soon_ ### Placement - ### Accessibility + (WAI-ARIA: [https://www.w3.org/TR/wai-aria-practices/#alert](https://www.w3.org/TR/wai-aria-practices/#alert)) When the component is dynamically displayed, the content is automatically announced by most screen readers. At this time, screen readers do not inform users of alerts that are present when the page loads. @@ -78,6 +87,7 @@ Actions must have a tab index of 0 so that they can be reached by keyboard-only ## Implementation ### Example Usage + **Alert type** @@ -96,17 +106,12 @@ Actions must have a tab index of 0 so that they can be reached by keyboard-only This is an success alert — check it out! - ```html - - This is an error alert — check it out! - + This is an error alert — check it out! This is a warning alert — check it out! - - This is an info alert — check it out! - + This is an info alert — check it out! This is a success alert — check it out! @@ -154,13 +159,14 @@ The `title ` option should not be used without a description. **Slotted icon** -*Documentation coming soon* +_Documentation coming soon_ ### API + **Properties/Attributes** | Name | Type | Default | Description | -|-------------|---------|---------|-------------------------------------------------------| +| ----------- | ------- | ------- | ----------------------------------------------------- | | title | string | `` | Title to display. | | alertType | string | `info` | Severity level that set a distinctive icon and color. | | dismissable | boolean | `false` | Gives the option to close the alert. | @@ -170,8 +176,8 @@ The `title ` option should not be used without a description. **Events** -*Documentation coming soon* +_Documentation coming soon_ **CSS Custom Properties** -*Documentation coming soon* +_Documentation coming soon_ diff --git a/gallery/src/pages/components/ha-dialogs.markdown b/gallery/src/pages/components/ha-dialogs.markdown index f3736d213a..1f9c5b65c0 100644 --- a/gallery/src/pages/components/ha-dialogs.markdown +++ b/gallery/src/pages/components/ha-dialogs.markdown @@ -5,28 +5,32 @@ subtitle: Dialogs provide important prompts in a user flow. # Material Design 3 -Our dialogs are based on the latest version of Material Design. Specs and guidelines can be found on its [website](https://m3.material.io/components/dialogs/overview). +Our dialogs are based on the latest version of Material Design. Specs and guidelines can be found on its [website](https://m3.material.io/components/dialogs/overview). # Highlighted guidelines ## Content -* A best practice is to always use a title, even if it is optional by Material guidelines. -* People mainly read the title and a button. Put the most important information in those two. -* Try to avoid user generated content in the title, this could make the title unreadable long. -* If users become unsure, they read the description. Make sure this explains what will happen. -* Strive for minimalism. + +- A best practice is to always use a title, even if it is optional by Material guidelines. +- People mainly read the title and a button. Put the most important information in those two. +- Try to avoid user generated content in the title, this could make the title unreadable long. +- If users become unsure, they read the description. Make sure this explains what will happen. +- Strive for minimalism. ## Buttons and X-icon -* Keep the labels short, for example `Save`, `Delete`, `Enable`. -* Dialog with actions must always have a discard button. On desktop a `Cancel` button and X-icon, on mobile only the X-icon. -* Destructive actions should be a red warning button. -* Alert or confirmation dialogs only have buttons and no X-icon. -* Try to avoid three buttons in one dialog. Especially when you leave the dialog task unfinished. + +- Keep the labels short, for example `Save`, `Delete`, `Enable`. +- Dialog with actions must always have a discard button. On desktop a `Cancel` button and X-icon, on mobile only the X-icon. +- Destructive actions should be a red warning button. +- Alert or confirmation dialogs only have buttons and no X-icon. +- Try to avoid three buttons in one dialog. Especially when you leave the dialog task unfinished. ## Example + ### Confirmation dialog + > **Delete dashboard?** -> +> > Dashboard [dashboard name] will be permanently deleted from Home Assistant. -> +> > Cancel / Delete diff --git a/gallery/src/pages/components/ha-gauge.markdown b/gallery/src/pages/components/ha-gauge.markdown index 33419c9588..6261408c72 100644 --- a/gallery/src/pages/components/ha-gauge.markdown +++ b/gallery/src/pages/components/ha-gauge.markdown @@ -32,7 +32,6 @@ Error color gauge Gauge with background color - ## CSS variables ### Gauge diff --git a/gallery/src/pages/components/ha-switch.markdown b/gallery/src/pages/components/ha-switch.markdown index d281c3b0e8..266160bd98 100644 --- a/gallery/src/pages/components/ha-switch.markdown +++ b/gallery/src/pages/components/ha-switch.markdown @@ -30,7 +30,7 @@ For the switch / toggle there are always two variables, one for the on / checked The track element (background rounded rectangle that the round circular handle travels on) is set to being half transparent, so the final color will also be impacted by the color behind the track. `switch-checked-color` / `switch-unchecked-color` -Set both the color of the round handle and the track behind it. If you want to control them separately, use the variables below instead. +Set both the color of the round handle and the track behind it. If you want to control them separately, use the variables below instead. `switch-checked-button-color` / `switch-unchecked-button-color` Color of the round handle diff --git a/gallery/src/pages/concepts/home.markdown b/gallery/src/pages/concepts/home.markdown index 666e567455..7b8cb4ab3f 100644 --- a/gallery/src/pages/concepts/home.markdown +++ b/gallery/src/pages/concepts/home.markdown @@ -7,18 +7,21 @@ title: Home This portal aims to aid designers and developers on improving the Home Assistant interface. It consists of working code, resources and guidelines. ## Home Assistant interface + The Home Assistant frontend allows users to browse and control the state of their home, manage their automations and configure integrations. The frontend is designed as a mobile-first experience. It is a progressive web application and offers an app-like experience to our users. The Home Assistant frontend needs to be fast. But it also needs to work on a wide range of old devices. ### Material Design + The Home Assistant interface is based on Material Design. It's a design system created by Google to quickly build high-quality digital experiences. Components and guidelines that are custom made for Home Assistant are documented on this portal. For all other components check material.io. ## Designers + We want to make it as easy for designers to contribute as it is for developers. There’s a lot a designer can contribute to: - Meet us at devs_ux Discord. Feel free to share your designs, user test or strategic ideas. - Start designing with our Figma DesignKit. - Find the lates UX discussions and issues on GitHub. Everyone can start a new issue or discussion! - ## Developers + Everything you need to get started developing can be found in our Home Assistant Developer Docs. diff --git a/gallery/src/pages/date-time/date-time-numeric.markdown b/gallery/src/pages/date-time/date-time-numeric.markdown index 3310f315a1..cb52101530 100644 --- a/gallery/src/pages/date-time/date-time-numeric.markdown +++ b/gallery/src/pages/date-time/date-time-numeric.markdown @@ -4,4 +4,4 @@ title: Date-Time Format (Numeric) This pages lists all supported languages with their available date-time formats. -Formatting function: `const formatDateTimeNumeric: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatDateTimeNumeric: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/date-time-seconds.markdown b/gallery/src/pages/date-time/date-time-seconds.markdown index 01cfa6c729..8db31b8d3a 100644 --- a/gallery/src/pages/date-time/date-time-seconds.markdown +++ b/gallery/src/pages/date-time/date-time-seconds.markdown @@ -4,4 +4,4 @@ title: Date-Time Format (Seconds) This pages lists all supported languages with their available date-time formats. -Formatting function: `const formatDateTimeWithSeconds: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatDateTimeWithSeconds: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/date-time-short-year.markdown b/gallery/src/pages/date-time/date-time-short-year.markdown index 19e77b55b9..a69677daae 100644 --- a/gallery/src/pages/date-time/date-time-short-year.markdown +++ b/gallery/src/pages/date-time/date-time-short-year.markdown @@ -4,4 +4,4 @@ title: Date-Time Format (Short w/ Year) This pages lists all supported languages with their available date-time formats. -Formatting function: `const formatShortDateTimeWithYear: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatShortDateTimeWithYear: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/date-time-short.markdown b/gallery/src/pages/date-time/date-time-short.markdown index 3564a7afa0..b4f5ae4ddb 100644 --- a/gallery/src/pages/date-time/date-time-short.markdown +++ b/gallery/src/pages/date-time/date-time-short.markdown @@ -4,4 +4,4 @@ title: Date-Time Format (Short) This pages lists all supported languages with their available date-time formats. -Formatting function: `const formatShortDateTime: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatShortDateTime: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/date-time.markdown b/gallery/src/pages/date-time/date-time.markdown index cef6195ab1..0b9651125e 100644 --- a/gallery/src/pages/date-time/date-time.markdown +++ b/gallery/src/pages/date-time/date-time.markdown @@ -4,4 +4,4 @@ title: Date-Time Format This pages lists all supported languages with their available date-time formats. -Formatting function: `const formatDateTime: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatDateTime: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/date.markdown b/gallery/src/pages/date-time/date.markdown index 599921e1c7..282160b0c2 100644 --- a/gallery/src/pages/date-time/date.markdown +++ b/gallery/src/pages/date-time/date.markdown @@ -4,4 +4,4 @@ title: Date Format (Numeric) This pages lists all supported languages with their available (numeric) date formats. -Formatting function: `const formatDateNumeric: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatDateNumeric: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/time-seconds.markdown b/gallery/src/pages/date-time/time-seconds.markdown index 23136c29f4..d12a5a6616 100644 --- a/gallery/src/pages/date-time/time-seconds.markdown +++ b/gallery/src/pages/date-time/time-seconds.markdown @@ -4,4 +4,4 @@ title: Time Format (Seconds) This pages lists all supported languages with their available time formats. -Formatting function: `const formatTimeWithSeconds: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatTimeWithSeconds: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/time-weekday.markdown b/gallery/src/pages/date-time/time-weekday.markdown index 637be6afe3..afb2df2904 100644 --- a/gallery/src/pages/date-time/time-weekday.markdown +++ b/gallery/src/pages/date-time/time-weekday.markdown @@ -4,4 +4,4 @@ title: Time Format (Weekday) This pages lists all supported languages with their available time formats. -Formatting function: `const formatTimeWeekday: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatTimeWeekday: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/date-time/time.markdown b/gallery/src/pages/date-time/time.markdown index df90d8931a..c7def99887 100644 --- a/gallery/src/pages/date-time/time.markdown +++ b/gallery/src/pages/date-time/time.markdown @@ -4,4 +4,4 @@ title: Time Format This pages lists all supported languages with their available time formats. -Formatting function: `const formatTime: (dateObj: Date, locale: FrontendLocaleData) => string` \ No newline at end of file +Formatting function: `const formatTime: (dateObj: Date, locale: FrontendLocaleData) => string` diff --git a/gallery/src/pages/lovelace/introduction.markdown b/gallery/src/pages/lovelace/introduction.markdown index c7bfc791d9..8710ec1618 100644 --- a/gallery/src/pages/lovelace/introduction.markdown +++ b/gallery/src/pages/lovelace/introduction.markdown @@ -1,6 +1,7 @@ --- title: Introduction --- + Dashboards have many different cards. Each card allows the user to tell a different story about what is going on in their house. These cards are very customizable, as no household is the same. diff --git a/gallery/src/pages/user-test/configuration-menu.markdown b/gallery/src/pages/user-test/configuration-menu.markdown index 2abf0d5e3c..0adb2f2e35 100644 --- a/gallery/src/pages/user-test/configuration-menu.markdown +++ b/gallery/src/pages/user-test/configuration-menu.markdown @@ -6,197 +6,217 @@ title: "User Test: Configuration menu" At the end of last year, we created one Configuration menu by merging Supervisor. In the next iteration, we want to organize our menu by creating logical grouping and combining duplicated features. We are conducting this test to see if we are on the right track. -* Anyone could join -* Respondents recruited on Twitter, Reddit and Home Assistant Forum -* This test is open for 10 days -* UsabilityHub for user test -* Figma for prototype -* 6 questions -* 3 tasks -* Due to some limitations by UsabilityHub, it only worked on desktop +- Anyone could join +- Respondents recruited on Twitter, Reddit and Home Assistant Forum +- This test is open for 10 days +- UsabilityHub for user test +- Figma for prototype +- 6 questions +- 3 tasks +- Due to some limitations by UsabilityHub, it only worked on desktop # Results + 915 respondents took part in this test and they gave 407 comments. In general there isn’t a significant difference between: -* How long a respondent has been using Home Assistant -* Installation method -* How many visits to its Home Assistant in the past 3 months -* Home Assistant expertise +- How long a respondent has been using Home Assistant +- Installation method +- How many visits to its Home Assistant in the past 3 months +- Home Assistant expertise ## Overall menu change + This prototype organized our menu by creating logical grouping and combining duplicated features. What do people think of this change? ### Stats -* 2% (21) Like extremely -* 30% (276) Like very much -* 53% (481) Neutral -* 12% (108) Dislike very much -* 3% (26) Dislike extremely -*3 respondents passed* +- 2% (21) Like extremely +- 30% (276) Like very much +- 53% (481) Neutral +- 12% (108) Dislike very much +- 3% (26) Dislike extremely + +_3 respondents passed_ ### Comments summary + **Like** -* Clean and decluttered -* Style looks better -* Faster to use -* Merging Supervisor into different pages -* Moving Developer tools to Settings +- Clean and decluttered +- Style looks better +- Faster to use +- Merging Supervisor into different pages +- Moving Developer tools to Settings **Dislike** -* Moving Developer tools to Settings -* More clicks for scripts and helpers -* Too many changes at once causes a high learning curve -* Removing the word `Integrations` makes it harder to find them -* Difference between `Addons` and `Services` is a bit subtle -* No clear distinction between `Developer` and `System` -* Material Design got the Google image +- Moving Developer tools to Settings +- More clicks for scripts and helpers +- Too many changes at once causes a high learning curve +- Removing the word `Integrations` makes it harder to find them +- Difference between `Addons` and `Services` is a bit subtle +- No clear distinction between `Developer` and `System` +- Material Design got the Google image **Suggestions** -* More top level menu items for example logs. -* What are settings and what not? Maybe better to name it `Configuration` -* Devices are a first-class citizen in the domain of Home Assistant, and so shouldn't be tucked away in "Settings" -* Rename Developer tools (or make it only for Home Assistant developers) -* Separate administration (for instance creating users / adding lights etc) from development activities (creating automations and scripts) -* Search Bar in Settings -* Feature to put menu items in sidebar -* Unification of add-ons and integrations -* Adding ‘New’ hints to show what changed -* Give `About` a less prominent size -* Accordion view option which puts every tab below -* Dev mode and a Prod Mode -* Always show config menu (on bigger screens) +- More top level menu items for example logs. +- What are settings and what not? Maybe better to name it `Configuration` +- Devices are a first-class citizen in the domain of Home Assistant, and so shouldn't be tucked away in "Settings" +- Rename Developer tools (or make it only for Home Assistant developers) +- Separate administration (for instance creating users / adding lights etc) from development activities (creating automations and scripts) +- Search Bar in Settings +- Feature to put menu items in sidebar +- Unification of add-ons and integrations +- Adding ‘New’ hints to show what changed +- Give `About` a less prominent size +- Accordion view option which puts every tab below +- Dev mode and a Prod Mode +- Always show config menu (on bigger screens) ### Conclusion + We should keep our focus on organizing our menu by creating logical grouping and combining duplicated features. With these changes we make more people happy: -* Reconsider putting `Logs` as a top-level menu item -* Add a search bar -* Use the word `Integrations` with `Devices & Services` -* Moving `Developer tools` to `Settings` is a good idea -* Rename `Developer tools` to for example `Tools` -* Add `New` explanation popups to what has changed -* We could rename `Configuration` to `Settings` -* Give `About` a less prominent size +- Reconsider putting `Logs` as a top-level menu item +- Add a search bar +- Use the word `Integrations` with `Devices & Services` +- Moving `Developer tools` to `Settings` is a good idea +- Rename `Developer tools` to for example `Tools` +- Add `New` explanation popups to what has changed +- We could rename `Configuration` to `Settings` +- Give `About` a less prominent size ## Helpers + In Home Assistant you can create toggles, text fields, number sliders, timers and counters. Also known as `Helpers`. Where should they be placed? ### Stats -* 78% (709) respondents are using helpers. They use it for: -* 92% (645) automations and scenes -* 62% (422) dashboards -* 43% (296) virtual devices + +- 78% (709) respondents are using helpers. They use it for: +- 92% (645) automations and scenes +- 62% (422) dashboards +- 43% (296) virtual devices ### Comments summary + Some respondents commented that they think `Helpers` shouldn’t be listed under `Automations & Services`. Although almost all respondents use it for that specific purpose. ### Conclusion -Helpers is, in addition to `Automations & Services`, also partly seen as virtual devices and dashboard entities. -* We might consider promoting them in their own top-level menu item -* Rename `Helpers` to something with `controls` +Helpers is, in addition to `Automations & Services`, also partly seen as virtual devices and dashboard entities. + +- We might consider promoting them in their own top-level menu item +- Rename `Helpers` to something with `controls` ## Add person + The first task in this user test was to add a person. Since this has not changed in the current menu structure, this should be an easy assignment. How do people experience the navigation to this feature? ### Stats + 95% reached the goal screen and 98% marked the task as completed. There were 18 common paths. After the task we asked how easy it was to add a person. -* 41% (378) Extremely easy -* 48% (440) Fairly easy -* 7% (67) Neutral -* 2% (19) Somewhat difficult -* 1% (11) Very difficult +- 41% (378) Extremely easy +- 48% (440) Fairly easy +- 7% (67) Neutral +- 2% (19) Somewhat difficult +- 1% (11) Very difficult ### Comments summary -*No mentionable comments * + +_No mentionable comments _ ### Conclusion + This test showed that the current navigation design works. ## YAML + In Home Assistant you can make configuration changes in YAML files. To make these changes take effect you have to reload your YAML in the UI or do a restart. How are people doing this and can they find it in this new design? ### Stats + 83% reached the goal screen and 87% marked the task as completed. There were 59 common paths. After the task we asked how easy it was to reload the YAML changes. -* 4% (40) Extremely easy -* 22% (204) Fairly easy -* 20% (179) Neutral -* 37% (336) Somewhat difficult -* 17% (156) Very difficult +- 4% (40) Extremely easy +- 22% (204) Fairly easy +- 20% (179) Neutral +- 37% (336) Somewhat difficult +- 17% (156) Very difficult And we asked if they have seen that we've moved some functionality from current `Server Controls` to `Developer Tools`. -* 57% (517) Yes -* 43% (398) No +- 57% (517) Yes +- 43% (398) No ### Comments summary + **Like** -* YAML in Developer tools +- YAML in Developer tools **Dislike** -* Hidden restart and reload -* YAML in Developer Tools -* Combining `Developer tools` with `Server management` -* Reload Home Assistant button isn't clear what it does -* Reload/restart Home Assistant in Developer Tools +- Hidden restart and reload +- YAML in Developer Tools +- Combining `Developer tools` with `Server management` +- Reload Home Assistant button isn't clear what it does +- Reload/restart Home Assistant in Developer Tools **Suggestions** -* Reload all YAML button -* Dev mode and a Prod Mode -* Show restart/reload as buttons in System instead of overflow menu -* Explain that you can reload YAML when you want to restart your system -* YAML reloading under System +- Reload all YAML button +- Dev mode and a Prod Mode +- Show restart/reload as buttons in System instead of overflow menu +- Explain that you can reload YAML when you want to restart your system +- YAML reloading under System ### Conclusion -This test showed two different kinds of user groups: UI and YAML users. -* Moving `Developer tools` to `Settings` is a good idea -* YAML users want reload YAML and Home Assistant restart in `System` -* Move the restart and reload button to the `System` page from the overflow menu -* Add suggestion to reload YAML when a user wants to restart -* Add reload all YAML button +This test showed two different kinds of user groups: UI and YAML users. + +- Moving `Developer tools` to `Settings` is a good idea +- YAML users want reload YAML and Home Assistant restart in `System` +- Move the restart and reload button to the `System` page from the overflow menu +- Add suggestion to reload YAML when a user wants to restart +- Add reload all YAML button ## Logs + ### Stats + 70% reached the goal screen and 77% marked the task as completed. There were 48 common paths. After the task we asked to find out why your Elgato light isn't working. -* 6% (57) Extremely easy -* 28% (254) Fairly easy -* 21% (188) Neutral -* 21% (196) Somewhat difficult -* 24% (220) Very difficult +- 6% (57) Extremely easy +- 28% (254) Fairly easy +- 21% (188) Neutral +- 21% (196) Somewhat difficult +- 24% (220) Very difficult ### Comments summary **Suggestions** -* Log errors on the integration page -* Problem solving center +- Log errors on the integration page +- Problem solving center ### Conclusion + Although this test shows that a large number of respondents manage to complete the task, they find it difficult to find out the light isn’t working. -* Add logs errors/warnings to the integration page -* Reconsider putting `Logs` as a top-level menu item +- Add logs errors/warnings to the integration page +- Reconsider putting `Logs` as a top-level menu item ## Learnings for next user test -* Explain that topic is closed for comments so that you can do this test without any influence -* Mobile test should work on mobile -* Testing on an iPad got some bugs -* People like doing these kind of test and we should do them more often +- Explain that topic is closed for comments so that you can do this test without any influence +- Mobile test should work on mobile +- Testing on an iPad got some bugs +- People like doing these kind of test and we should do them more often diff --git a/gallery/src/pages/user-test/user-types.markdown b/gallery/src/pages/user-test/user-types.markdown index eacc108cd4..9dda7f4f13 100644 --- a/gallery/src/pages/user-test/user-types.markdown +++ b/gallery/src/pages/user-test/user-types.markdown @@ -2,7 +2,7 @@ title: "User types" --- -We have defined three user types for Home Assistant. They are a lean segmentation of users that helps us make decisions throughout the product. User types differ from traditional personas in that the segmentation criteria aren’t demographic and don’t personify a group into a single character with a fictitious background story. +We have defined three user types for Home Assistant. They are a lean segmentation of users that helps us make decisions throughout the product. User types differ from traditional personas in that the segmentation criteria aren’t demographic and don’t personify a group into a single character with a fictitious background story. # Outgrowers diff --git a/lint-staged.config.js b/lint-staged.config.js index be7d7f2094..27204507ea 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,6 @@ export default { "*.?(c|m){js,ts}": ["eslint --fix", "prettier --write"], - "!(/translations)*.{json,css,md,html}": "prettier --write", + "*.{json,css,md,markdown,html,y?aml}": "prettier --write", "translations/*/*.json": (files) => 'printf "%s\n" "Translation files should not be added or modified here. Instead, make the necessary modifications in src/translations/en.json. Other languages are managed externally. Please see https://developers.home-assistant.io/docs/translations/ for details." ' + files.join(" ") + diff --git a/package.json b/package.json index ddfc3fd498..e1223da8e1 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "build": "script/build_frontend", "lint:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --ignore-path .gitignore", "format:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --fix --ignore-path .gitignore", - "lint:prettier": "prettier \"**/src/**/*.{js,ts,json,css,md}\" --check", - "format:prettier": "prettier \"**/src/**/*.{js,ts,json,css,md}\" --write", + "lint:prettier": "prettier . --check", + "format:prettier": "prettier . --write", "lint:types": "tsc", "lint:lit": "lit-analyzer \"**/src/**/*.ts\" --format markdown --outFile result.md", "lint": "yarn run lint:eslint && yarn run lint:prettier && yarn run lint:types", From d323db8479c8048efbd3c11195202e41e57c578d Mon Sep 17 00:00:00 2001 From: Will Adler Date: Tue, 18 Jul 2023 11:17:31 -0400 Subject: [PATCH 074/102] Update self-sufficiency card title and tooltip (#17241) --- 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 817993f292..714d2343ba 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4417,9 +4417,9 @@ "self_consumed_solar_could_not_calc": "Self-consumed solar energy couldn't be calculated" }, "self_sufficiency_gauge": { - "card_indicates_self_sufficiency_quota": "This card indicates how self-sufficient your home is.", - "self_sufficiency_quota": "Self-sufficiency quota", - "self_sufficiency_could_not_calc": "Self-sufficiency quota couldn't be calculated" + "card_indicates_self_sufficiency_quota": "This card indicates how much of the energy consumed by your home came from on-site sources (such as solar panels or batteries).", + "self_sufficiency_quota": "Self-sufficiency", + "self_sufficiency_could_not_calc": "Self-sufficiency couldn't be calculated" }, "grid_neutrality_gauge": { "energy_dependency": "This card indicates your net energy usage.", From 1250eac11b29a6b981c19534d5e58dd4e6e51d1b Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 18 Jul 2023 17:18:05 +0200 Subject: [PATCH 075/102] Use ha-outlined icon button in lock more info (#17339) --- src/components/ha-outlined-icon-button.ts | 1 + .../more-info/controls/more-info-lock.ts | 21 +++++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/components/ha-outlined-icon-button.ts b/src/components/ha-outlined-icon-button.ts index 33df9638bd..1ca26ccf97 100644 --- a/src/components/ha-outlined-icon-button.ts +++ b/src/components/ha-outlined-icon-button.ts @@ -23,6 +23,7 @@ export class HaOutlinedIconButton extends IconButton { --md-sys-color-on-surface: var(--secondary-text-color); --md-sys-color-on-surface-variant: var(--secondary-text-color); --md-sys-color-on-surface-rgb: var(--rgb-secondary-text-color); + --md-sys-color-outline: var(--secondary-text-color); } :host([no-ripple]) .outlined { --md-ripple-focus-opacity: 0; diff --git a/src/dialogs/more-info/controls/more-info-lock.ts b/src/dialogs/more-info/controls/more-info-lock.ts index 24c8d0cece..e17753050c 100644 --- a/src/dialogs/more-info/controls/more-info-lock.ts +++ b/src/dialogs/more-info/controls/more-info-lock.ts @@ -1,4 +1,3 @@ -import "@material/web/iconbutton/outlined-icon-button"; import { mdiDoorOpen, mdiLock, mdiLockOff } from "@mdi/js"; import { CSSResultGroup, LitElement, css, html, nothing } from "lit"; import { customElement, property } from "lit/decorators"; @@ -7,6 +6,7 @@ import { domainIcon } from "../../../common/entity/domain_icon"; import { stateColorCss } from "../../../common/entity/state_color"; import { supportsFeature } from "../../../common/entity/supports-feature"; import "../../../components/ha-attributes"; +import "../../../components/ha-outlined-icon-button"; import { UNAVAILABLE } from "../../../data/entity"; import { LockEntity, @@ -82,7 +82,7 @@ class MoreInfoLock extends LitElement {
    ${supportsOpen ? html` - - + ` : nothing} ${isJammed ? html` - - - + - + ` : nothing}
    @@ -140,13 +140,6 @@ class MoreInfoLock extends LitElement { return [ moreInfoControlStyle, css` - md-outlined-icon-button { - --ha-icon-display: block; - --md-sys-color-on-surface: var(--secondary-text-color); - --md-sys-color-on-surface-variant: var(--secondary-text-color); - --md-sys-color-on-surface-rgb: var(--rgb-secondary-text-color); - --md-sys-color-outline: var(--secondary-text-color); - } @keyframes pulse { 0% { opacity: 1; From 61ab08519f6eb1aa52b09272fd11a9711470dd1b Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 18 Jul 2023 17:21:03 +0200 Subject: [PATCH 076/102] Use device battery entity for vacuum more info (#17328) --- src/data/entity_registry.ts | 12 +-- .../more-info/controls/more-info-vacuum.ts | 100 +++++++++++++++--- 2 files changed, 92 insertions(+), 20 deletions(-) diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 9063a8eade..70b0b30209 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -129,20 +129,20 @@ export interface EntityRegistryEntryUpdateParams { aliases?: string[]; } -export const findBatteryEntity = ( +export const findBatteryEntity = ( hass: HomeAssistant, - entities: EntityRegistryEntry[] -): EntityRegistryEntry | undefined => + entities: T[] +): T | undefined => entities.find( (entity) => hass.states[entity.entity_id] && hass.states[entity.entity_id].attributes.device_class === "battery" ); -export const findBatteryChargingEntity = ( +export const findBatteryChargingEntity = ( hass: HomeAssistant, - entities: EntityRegistryEntry[] -): EntityRegistryEntry | undefined => + entities: T[] +): T | undefined => entities.find( (entity) => hass.states[entity.entity_id] && diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts index d1ca0ae75c..6487749d23 100644 --- a/src/dialogs/more-info/controls/more-info-vacuum.ts +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -9,17 +9,26 @@ import { mdiStop, mdiTargetVariant, } from "@mdi/js"; -import { css, CSSResultGroup, html, LitElement, nothing } from "lit"; +import { CSSResultGroup, LitElement, css, html, nothing } from "lit"; import { customElement, property } from "lit/decorators"; +import memoizeOne from "memoize-one"; import { stopPropagation } from "../../../common/dom/stop_propagation"; import { computeAttributeValueDisplay } from "../../../common/entity/compute_attribute_display"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; +import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import { supportsFeature } from "../../../common/entity/supports-feature"; +import { blankBeforePercent } from "../../../common/translations/blank_before_percent"; +import "../../../components/entity/ha-battery-icon"; import "../../../components/ha-attributes"; import "../../../components/ha-icon"; import "../../../components/ha-icon-button"; import "../../../components/ha-select"; import { UNAVAILABLE } from "../../../data/entity"; +import { + EntityRegistryDisplayEntry, + findBatteryChargingEntity, + findBatteryEntity, +} from "../../../data/entity_registry"; import { VacuumEntity, VacuumEntityFeature } from "../../../data/vacuum"; import { HomeAssistant } from "../../../types"; @@ -137,19 +146,7 @@ class MoreInfoVacuum extends LitElement {
    - ${supportsFeature(stateObj, VacuumEntityFeature.BATTERY) && - stateObj.attributes.battery_level - ? html` -
    - - ${stateObj.attributes.battery_level} % - - -
    - ` - : ""} + ${this._renderBattery()}
    ` : ""} ${VACUUM_COMMANDS.some((item) => item.isVisible(stateObj)) @@ -243,6 +240,81 @@ class MoreInfoVacuum extends LitElement { `; } + private _deviceEntities = memoizeOne( + ( + deviceId: string, + entities: HomeAssistant["entities"] + ): EntityRegistryDisplayEntry[] => { + const entries = Object.values(entities); + return entries.filter((entity) => entity.device_id === deviceId); + } + ); + + private _renderBattery() { + const stateObj = this.stateObj!; + + const deviceId = this.hass.entities[stateObj.entity_id]?.device_id; + + const entities = deviceId + ? this._deviceEntities(deviceId, this.hass.entities) + : []; + + const batteryEntity = findBatteryEntity(this.hass, entities); + const battery = batteryEntity + ? this.hass.states[batteryEntity.entity_id] + : undefined; + + const batteryIsBinary = + battery && computeStateDomain(battery) === "binary_sensor"; + + // Use device battery entity + if (battery && (batteryIsBinary || !isNaN(battery.state as any))) { + const batteryChargingEntity = findBatteryChargingEntity( + this.hass, + entities + ); + const batteryCharging = batteryChargingEntity + ? this.hass.states[batteryChargingEntity?.entity_id] + : undefined; + + return html` +
    + + ${batteryIsBinary + ? "" + : `${Number(battery.state).toFixed()}${blankBeforePercent( + this.hass.locale + )}%`} + + +
    + `; + } + + // Use battery_level and battery_icon deprecated attributes + if ( + supportsFeature(stateObj, VacuumEntityFeature.BATTERY) && + stateObj.attributes.battery_level + ) { + return html` +
    + + ${stateObj.attributes.battery_level.toFixed()}${blankBeforePercent( + this.hass.locale + )}% + + +
    + `; + } + + return nothing; + } + private callService(ev: CustomEvent) { const entry = (ev.target! as any).entry as VacuumCommand; this.hass.callService("vacuum", entry.serviceName, { From 88259c8de09a3b25763cf8a89a01df0642a31285 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:42:30 -0400 Subject: [PATCH 077/102] Update dependency @rollup/plugin-commonjs to v25.0.3 (#17337) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e1223da8e1..056bda0f2f 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "@octokit/rest": "20.0.1", "@open-wc/dev-server-hmr": "0.1.4", "@rollup/plugin-babel": "6.0.3", - "@rollup/plugin-commonjs": "25.0.2", + "@rollup/plugin-commonjs": "25.0.3", "@rollup/plugin-json": "6.0.0", "@rollup/plugin-node-resolve": "15.1.0", "@rollup/plugin-replace": "5.0.2", diff --git a/yarn.lock b/yarn.lock index 46ebff1f32..22317bf262 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3849,9 +3849,9 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-commonjs@npm:25.0.2": - version: 25.0.2 - resolution: "@rollup/plugin-commonjs@npm:25.0.2" +"@rollup/plugin-commonjs@npm:25.0.3": + version: 25.0.3 + resolution: "@rollup/plugin-commonjs@npm:25.0.3" dependencies: "@rollup/pluginutils": ^5.0.1 commondir: ^1.0.1 @@ -3864,7 +3864,7 @@ __metadata: peerDependenciesMeta: rollup: optional: true - checksum: d8c4e22d264c5b9286f697653c2f9288149c0fe0169d49b83b5dc8b542f96cc0b9113da3f30d241f2f277513fbf3f8c207d95def5559eb3800190f1872add794 + checksum: 1b94218cc80364d218e5d526e9199620151fe8ac489abc293a75741af5ffb2bfa90da06cffc4a1b9a4091a6f8cda63a6f7c557881b12188f9e0a05f08c147fd0 languageName: node linkType: hard @@ -9664,7 +9664,7 @@ __metadata: "@polymer/paper-toast": 3.0.1 "@polymer/polymer": 3.5.1 "@rollup/plugin-babel": 6.0.3 - "@rollup/plugin-commonjs": 25.0.2 + "@rollup/plugin-commonjs": 25.0.3 "@rollup/plugin-json": 6.0.0 "@rollup/plugin-node-resolve": 15.1.0 "@rollup/plugin-replace": 5.0.2 From 8171b02b75d9e051f27cc5bd70acba2065ba4213 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 19 Jul 2023 10:48:43 +0200 Subject: [PATCH 078/102] Allow changing channel from the thread configuration panel (#17285) --- src/data/otbr.ts | 10 +++ .../thread/thread-config-panel.ts | 66 +++++++++++++++++++ src/translations/en.json | 11 +++- 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/data/otbr.ts b/src/data/otbr.ts index 93e77a1eda..154d2863ff 100644 --- a/src/data/otbr.ts +++ b/src/data/otbr.ts @@ -3,6 +3,7 @@ import { HomeAssistant } from "../types"; export interface OTBRInfo { url: string; active_dataset_tlvs: string; + channel: number; } export const getOTBRInfo = (hass: HomeAssistant): Promise => @@ -30,3 +31,12 @@ export const OTBRGetExtendedAddress = ( hass.callWS({ type: "otbr/get_extended_address", }); + +export const OTBRSetChannel = ( + hass: HomeAssistant, + channel: number +): Promise<{ delay: number }> => + hass.callWS({ + type: "otbr/set_channel", + channel, + }); diff --git a/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts b/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts index 27defda51a..2fdea52d73 100644 --- a/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/thread/thread-config-panel.ts @@ -20,6 +20,7 @@ import { OTBRCreateNetwork, OTBRGetExtendedAddress, OTBRInfo, + OTBRSetChannel, OTBRSetNetwork, } from "../../../../../data/otbr"; import { @@ -200,6 +201,10 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { >${this.hass.localize( "ui.panel.config.thread.reset_border_router" )}${this.hass.localize( + "ui.panel.config.thread.change_channel" + )}${network.dataset?.preferred ? "" : html` 26) { + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.thread.change_channel_invalid" + ), + text: this.hass.localize("ui.panel.config.thread.change_channel_range"), + }); + return; + } + try { + const result = await OTBRSetChannel(this.hass, channel); + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.thread.change_channel_initiated_title" + ), + text: this.hass.localize( + "ui.panel.config.thread.change_channel_initiated_text", + { delay: Math.floor(result.delay / 60) } + ), + }); + } catch (err: any) { + if (err.code === "multiprotocol_enabled") { + showAlertDialog(this, { + title: this.hass.localize( + "ui.panel.config.thread.change_channel_multiprotocol_enabled_title" + ), + text: this.hass.localize( + "ui.panel.config.thread.change_channel_multiprotocol_enabled_text" + ), + }); + return; + } + showAlertDialog(this, { + title: "Error", + text: err.message || err, + }); + } + this._refresh(); + } + static styles = [ haStyle, css` diff --git a/src/translations/en.json b/src/translations/en.json index 714d2343ba..7d80346d89 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3684,7 +3684,16 @@ "no_border_routers": "No border routers found", "border_routers": "{count} border {count, plural,\n one {router}\n other {routers}\n}", "managed_by_home_assistant": "Managed by Home Assistant", - "operational_dataset": "Operational dataset" + "operational_dataset": "Operational dataset", + "change_channel": "Change channel", + "change_channel_initiated_title": "Channel change in progress", + "change_channel_initiated_text": "The channel change has been initiated and will complete in {delay} minutes.", + "change_channel_invalid": "Invalid channel", + "change_channel_label": "Channel", + "change_channel_multiprotocol_enabled_title": "The Thread radio has multiprotocol enabled", + "change_channel_multiprotocol_enabled_text": "To change channel when the Thread radio has multiprotocol enabled, please use the hardware settings menu.", + "change_channel_range": "Channel must be in the range 11 to 26", + "change_channel_text": "Initiate a channel change for your Thread networks. This is an advanced operation and can leave your Thread networks inoperable if the new channel is congested. Depending on existing network conditions, many of your devices may not migrate to the new channel and will require re-joining before they start working again. Use with caution." }, "zha": { "common": { From efc442da5b9a7c38d7ddc3d3050ef6f7c13ae00d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:08:09 +0200 Subject: [PATCH 079/102] Lock file maintenance (#17341) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 342 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 210 insertions(+), 132 deletions(-) diff --git a/yarn.lock b/yarn.lock index 22317bf262..469e42b4d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -129,35 +129,35 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.22.5, @babel/helper-create-class-features-plugin@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.6" +"@babel/helper-create-class-features-plugin@npm:^7.22.5, @babel/helper-create-class-features-plugin@npm:^7.22.6, @babel/helper-create-class-features-plugin@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.9" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-function-name": ^7.22.5 "@babel/helper-member-expression-to-functions": ^7.22.5 "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.9 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@nicolo-ribaudo/semver-v6": ^6.3.3 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 10412e8a509a607cde6137288d3f12b1f91acd374e29e6dd6a277b67217e9f4c932a0acd89eeda837c8432916df775a8af6321aeb8d8b131ccdbf7688208dda1 + checksum: 6c2436d1a5a3f1ff24628d78fa8c6d3120c40285aa3eda7815b1adbf8c5951e0dd73d368cf845825888fa3dc2f207dadce53309825598d7c67953e5ed9dd51d2 languageName: node linkType: hard "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.5" + version: 7.22.9 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.9" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 regexpu-core: ^5.3.1 - semver: ^6.3.0 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 94932145beeb1f91856be25fea8de30b4b81b63fbc7c5a207ed97a5ddc34cd1e9b04041ed28bd24ec09cdcfbb62e8d66f820e4fe864672afe0aa2f357c784e11 + checksum: 87cb48a7ee898ab205374274364c3adc70b87b08c7bd07f51019ae4562c0170d7148e654d591f825dee14b5fe11666a0e7966872dfdbfa0d1b94b861ecf0e4e1 languageName: node linkType: hard @@ -252,30 +252,28 @@ __metadata: linkType: hard "@babel/helper-remap-async-to-generator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.5" + version: 7.22.9 + resolution: "@babel/helper-remap-async-to-generator@npm:7.22.9" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-wrap-function": ^7.22.5 - "@babel/types": ^7.22.5 + "@babel/helper-wrap-function": ^7.22.9 peerDependencies: "@babel/core": ^7.0.0 - checksum: 1e51dcff1c22e97ea3d22034b77788048eb6d8c6860325bd7a1046b7a7135730cefd93b5c96fd9839d76031095d5ffb6f0cd6ee90a5d69a4c7de980d7f4623d9 + checksum: 05538079447829b13512157491cc77f9cf1ea7e1680e15cff0682c3ed9ee162de0c4862ece20a6d6b2df28177a1520bcfe45993fbeccf2747a81795a7c3f6290 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-replace-supers@npm:7.22.5" +"@babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-replace-supers@npm:7.22.9" dependencies: "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-member-expression-to-functions": ^7.22.5 "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: af29deff6c6dc3fa2d1a517390716aa3f4d329855e8689f1d5c3cb07c1b898e614a5e175f1826bb58e9ff1480e6552885a71a9a0ba5161787aaafa2c79b216cc + peerDependencies: + "@babel/core": ^7.0.0 + checksum: d41471f56ff2616459d35a5df1900d5f0756ae78b1027040365325ef332d66e08e3be02a9489756d870887585ff222403a228546e93dd7019e19e59c0c0fe586 languageName: node linkType: hard @@ -327,15 +325,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-wrap-function@npm:7.22.5" +"@babel/helper-wrap-function@npm:^7.22.9": + version: 7.22.9 + resolution: "@babel/helper-wrap-function@npm:7.22.9" dependencies: "@babel/helper-function-name": ^7.22.5 "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 "@babel/types": ^7.22.5 - checksum: a4ba2d7577ad3ce92fadaa341ffce3b0e4b389808099b07c80847f9be0852f4b42344612bc1b3d1b796ffb75be56d5957c5c56a1734f6aee5ccbb7cd9ab12691 + checksum: 037317dc06dac6593e388738ae1d3e43193bc1d31698f067c0ef3d4dc6f074dbed860ed42aa137b48a67aa7cb87336826c4bdc13189260481bcf67eb7256c789 languageName: node linkType: hard @@ -1212,16 +1209,16 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-typescript@npm:7.22.5" + version: 7.22.9 + resolution: "@babel/plugin-transform-typescript@npm:7.22.9" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.9 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-typescript": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d12f1ca1ef1f2a54432eb044d2999705d1205ebe211c2a7f05b12e8eb2d2a461fd7657b5486b2f2f1efe7c0c0dc8e80725b767073d40fe4ae059a7af057b05e4 + checksum: 6d1317a54d093b302599a4bee8ba9865d0de8b7b6ac1a0746c4316231d632f75b7f086e6e78acb9ac95ba12ba3b9da462dc9ca69370abb4603c4cc987f62e67e languageName: node linkType: hard @@ -1419,7 +1416,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.22.8": +"@babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.22.8": version: 7.22.8 resolution: "@babel/traverse@npm:7.22.8" dependencies: @@ -1525,7 +1522,7 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:6.14.1, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0": +"@codemirror/view@npm:6.14.1": version: 6.14.1 resolution: "@codemirror/view@npm:6.14.1" dependencies: @@ -1536,6 +1533,17 @@ __metadata: languageName: node linkType: hard +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0": + version: 6.15.3 + resolution: "@codemirror/view@npm:6.15.3" + dependencies: + "@codemirror/state": ^6.1.4 + style-mod: ^4.0.0 + w3c-keyname: ^2.2.4 + checksum: 048949b1b493a962904a7f77661a939f7c1893a7381022756a135f5dd8daf667f498be1b81da9c37c0e8de85b078ad987c2f75318385c520ed83c95da6313e95 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.0": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -2003,12 +2011,12 @@ __metadata: linkType: hard "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.3 - resolution: "@jridgewell/source-map@npm:0.3.3" + version: 0.3.5 + resolution: "@jridgewell/source-map@npm:0.3.5" dependencies: "@jridgewell/gen-mapping": ^0.3.0 "@jridgewell/trace-mapping": ^0.3.9 - checksum: ae1302146339667da5cd6541260ecbef46ae06819a60f88da8f58b3e64682f787c09359933d050dea5d2173ea7fa40f40dd4d4e7a8d325c5892cccd99aaf8959 + checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f languageName: node linkType: hard @@ -2069,11 +2077,11 @@ __metadata: linkType: hard "@lezer/lr@npm:^1.0.0": - version: 1.3.6 - resolution: "@lezer/lr@npm:1.3.6" + version: 1.3.9 + resolution: "@lezer/lr@npm:1.3.9" dependencies: "@lezer/common": ^1.0.0 - checksum: b2bbcfecc01bd9c801f3ee636ceda333adbbea1f274017cec6f315a23346e7a035a984f325d4f1cd14b157d74d28badda6f794514c29a0b078f7fb3357cdfc32 + checksum: d10982bae6c0b2f5a3ab8710a41dc689a4f9e81afafd3d2de4f0bec169f5c3fc9a321c0e90010a51682d41a6755ae90e1f3199134ff194b3ff4058ea5bcdf353 languageName: node linkType: hard @@ -3365,15 +3373,15 @@ __metadata: linkType: hard "@octokit/request@npm:^8.0.0, @octokit/request@npm:^8.0.1, @octokit/request@npm:^8.0.2": - version: 8.1.0 - resolution: "@octokit/request@npm:8.1.0" + version: 8.1.1 + resolution: "@octokit/request@npm:8.1.1" dependencies: "@octokit/endpoint": ^9.0.0 "@octokit/request-error": ^5.0.0 "@octokit/types": ^11.1.0 is-plain-object: ^5.0.0 universal-user-agent: ^6.0.0 - checksum: 00f71e1ca0bff84a1a903ca9f79a7837aac830cae3560d44f03272d062ef98e5a8170fdab8a47169c41db88e6894717cc71387604486d559f9eae409fab93f6f + checksum: dec3ba2cba14739159cd8d1653ad8ac6d58095e4ac294d312d20ce2c63c60c3cad2e5499137244dba3d681fd5cd7f74b4b5d4df024a19c0ee1831204e5a3a894 languageName: node linkType: hard @@ -4106,12 +4114,12 @@ __metadata: linkType: hard "@types/chrome@npm:*": - version: 0.0.237 - resolution: "@types/chrome@npm:0.0.237" + version: 0.0.241 + resolution: "@types/chrome@npm:0.0.241" dependencies: "@types/filesystem": "*" "@types/har-format": "*" - checksum: 9dfb0070065ca4667ef2fa9ec45af2f604b9ba98b6429d38607c6bfcc8dc2178e83eea4eeedbe88a8299dfe9dda029c9341e454c4eff7b715b90e9d5fc7b990d + checksum: af6cf474ed120b046001c0edf50bb752191369d5205d0b2d1ebcb7548db6b87183a098ee7ab77db1a441eacbf36fbfc3cd5b04a9642a99180a13018ced400984 languageName: node linkType: hard @@ -4187,12 +4195,12 @@ __metadata: linkType: hard "@types/eslint@npm:*": - version: 8.40.2 - resolution: "@types/eslint@npm:8.40.2" + version: 8.44.0 + resolution: "@types/eslint@npm:8.44.0" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: a4780e45e677e3af21c44a900846996cb6d9ae8f71d51940942a047163ae93a05444392c005f491ed46aa169f3b25f8be125ab42c5d8bdb571154bf62a7c828a + checksum: 2655f409a4ecdd64bb9dd9eb6715e7a2ac30c0e7f902b414e10dbe9d6d497baa5a0f13105e1f7bd5ad7a913338e2ab4bed1faf192a7a0d27d1acd45ba79d3f69 languageName: node linkType: hard @@ -4392,11 +4400,11 @@ __metadata: linkType: hard "@types/lodash-es@npm:^4.17.4": - version: 4.17.7 - resolution: "@types/lodash-es@npm:4.17.7" + version: 4.17.8 + resolution: "@types/lodash-es@npm:4.17.8" dependencies: "@types/lodash": "*" - checksum: 4b1f39fd1d921311c37a846c0e0df9d1fa23e27448a6ad1efd7574e703abd2b2fa5e8f3b5037146000f167ba231d0d01e52747d902654151b4ceeff9f2a9b380 + checksum: 36356169a1862e2a1b09cde3b11b3790ab2c2e477778d70f825b216479ea93bd1a960767dbefcd00d6604312170a1b15209f0fa1c35ddf8861bc233c9b0d3e56 languageName: node linkType: hard @@ -4450,9 +4458,9 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 20.3.1 - resolution: "@types/node@npm:20.3.1" - checksum: 63a393ab6d947be17320817b35d7277ef03728e231558166ed07ee30b09fd7c08861be4d746f10fdc63ca7912e8cd023939d4eab887ff6580ff704ff24ed810c + version: 20.4.2 + resolution: "@types/node@npm:20.4.2" + checksum: 99e544ea7560d51f01f95627fc40394c24a13da8f041121a0da13e4ef0a2aa332932eaf9a5e8d0e30d1c07106e96a183be392cbba62e8cf0bf6a085d5c0f4149 languageName: node linkType: hard @@ -4582,12 +4590,13 @@ __metadata: linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.1 - resolution: "@types/serve-static@npm:1.15.1" + version: 1.15.2 + resolution: "@types/serve-static@npm:1.15.2" dependencies: + "@types/http-errors": "*" "@types/mime": "*" "@types/node": "*" - checksum: 2e078bdc1e458c7dfe69e9faa83cc69194b8896cce57cb745016580543c7ab5af07fdaa8ac1765eb79524208c81017546f66056f44d1204f812d72810613de36 + checksum: 15c261dbfc57890f7cc17c04d5b22b418dfa0330c912b46c5d8ae2064da5d6f844ef7f41b63c7f4bbf07675e97ebe6ac804b032635ec742ae45d6f1274259b3e languageName: node linkType: hard @@ -5427,11 +5436,11 @@ __metadata: linkType: hard "acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.9.0 - resolution: "acorn@npm:8.9.0" + version: 8.10.0 + resolution: "acorn@npm:8.10.0" bin: acorn: bin/acorn - checksum: 25dfb94952386ecfb847e61934de04a4e7c2dc21c2e700fc4e2ef27ce78cb717700c4c4f279cd630bb4774948633c3859fc16063ec8573bda4568e0a312e6744 + checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d languageName: node linkType: hard @@ -5734,11 +5743,11 @@ __metadata: linkType: hard "aria-query@npm:^5.1.3": - version: 5.2.1 - resolution: "aria-query@npm:5.2.1" + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" dependencies: dequal: ^2.0.3 - checksum: fdb7a337d97acf4dae831e4c2c786233aca5ccb779a02c10fe65a65af9849f6e9868073593313ab52b7b0d9817e05cfb22a5cd43ecf22a8e7f2abea2268bdac9 + checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 languageName: node linkType: hard @@ -5945,6 +5954,20 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.1": + version: 1.0.1 + resolution: "arraybuffer.prototype.slice@npm:1.0.1" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + get-intrinsic: ^1.2.1 + is-array-buffer: ^3.0.2 + is-shared-array-buffer: ^1.0.2 + checksum: e3e9b2a3e988ebfeddce4c7e8f69df730c9e48cb04b0d40ff0874ce3d86b3d1339dd520ffde5e39c02610bc172ecfbd4bc93324b1cabd9554c44a56b131ce0ce + languageName: node + linkType: hard + "asap@npm:~2.0.6": version: 2.0.6 resolution: "asap@npm:2.0.6" @@ -6507,9 +6530,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001504 - resolution: "caniuse-lite@npm:1.0.30001504" - checksum: 0256f8ef2f5d6d1559198967d7325952e6451e79ff1b92d3d6ba1ec43efedf49fcd3fbb0735ebed0bfd96c6c6a49730e169535e273c60795d23ef25bd37e3e3d + version: 1.0.30001516 + resolution: "caniuse-lite@npm:1.0.30001516" + checksum: 044adf3493b734a356a2922445a30095a0f6de6b9194695cdf74deafe7bef658e85858a31177762c2813f6e1ed2722d832d59eee0ecb2151e93a611ee18cb21f languageName: node linkType: hard @@ -7639,9 +7662,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.431": - version: 1.4.433 - resolution: "electron-to-chromium@npm:1.4.433" - checksum: 106e3bc2fb4ee5eddd4b141363900d5cd731c7579aa6bebd02509c52d6b598a1684aba1b75791e838dfa54dec0a40ddd17ea01199041ea46310aafb206395e43 + version: 1.4.464 + resolution: "electron-to-chromium@npm:1.4.464" + checksum: 4400ddeee0a300705830dfdb69c352b6efe4bd7a5ff99de87f61b8706008ce84f565214afae83272135512472406d8515f89531bcc27948683f67865bdbc1e3a languageName: node linkType: hard @@ -7734,11 +7757,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.8.1 - resolution: "envinfo@npm:7.8.1" + version: 7.10.0 + resolution: "envinfo@npm:7.10.0" bin: envinfo: dist/cli.js - checksum: de736c98d6311c78523628ff127af138451b162e57af5293c1b984ca821d0aeb9c849537d2fde0434011bed33f6bca5310ca2aab8a51a3f28fc719e89045d648 + checksum: 05e81a5768c42cbd5c580dc3f274db3401facadd53e9bd52e2aa49dfbb5d8b26f6181c25a6652d79618a6994185bd2b1c137673101690b147f758e4e71d42f7d languageName: node linkType: hard @@ -7759,16 +7782,17 @@ __metadata: linkType: hard "es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.2 - resolution: "es-abstract@npm:1.21.2" + version: 1.22.1 + resolution: "es-abstract@npm:1.22.1" dependencies: array-buffer-byte-length: ^1.0.0 + arraybuffer.prototype.slice: ^1.0.1 available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 function.prototype.name: ^1.1.5 - get-intrinsic: ^1.2.0 + get-intrinsic: ^1.2.1 get-symbol-description: ^1.0.0 globalthis: ^1.0.3 gopd: ^1.0.1 @@ -7788,15 +7812,19 @@ __metadata: object-inspect: ^1.12.3 object-keys: ^1.1.1 object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 + regexp.prototype.flags: ^1.5.0 + safe-array-concat: ^1.0.0 safe-regex-test: ^1.0.0 string.prototype.trim: ^1.2.7 string.prototype.trimend: ^1.0.6 string.prototype.trimstart: ^1.0.6 + typed-array-buffer: ^1.0.0 + typed-array-byte-length: ^1.0.0 + typed-array-byte-offset: ^1.0.0 typed-array-length: ^1.0.4 unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.9 - checksum: 037f55ee5e1cdf2e5edbab5524095a4f97144d95b94ea29e3611b77d852fd8c8a40e7ae7101fa6a759a9b9b1405f188c3c70928f2d3cd88d543a07fc0d5ad41a + which-typed-array: ^1.1.10 + checksum: 614e2c1c3717cb8d30b6128ef12ea110e06fd7d75ad77091ca1c5dbfb00da130e62e4bbbbbdda190eada098a22b27fe0f99ae5a1171dac2c8663b1e8be8a3a9b languageName: node linkType: hard @@ -8124,12 +8152,12 @@ __metadata: linkType: hard "eslint-scope@npm:^7.2.0": - version: 7.2.0 - resolution: "eslint-scope@npm:7.2.0" + version: 7.2.1 + resolution: "eslint-scope@npm:7.2.1" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: 64591a2d8b244ade9c690b59ef238a11d5c721a98bcee9e9f445454f442d03d3e04eda88e95a4daec558220a99fa384309d9faae3d459bd40e7a81b4063980ae + checksum: dccda5c8909216f6261969b72c77b95e385f9086bed4bc09d8a6276df8439d8f986810fd9ac3bd02c94c0572cefc7fdbeae392c69df2e60712ab8263986522c5 languageName: node linkType: hard @@ -8188,13 +8216,13 @@ __metadata: linkType: hard "espree@npm:^9.6.0": - version: 9.6.0 - resolution: "espree@npm:9.6.0" + version: 9.6.1 + resolution: "espree@npm:9.6.1" dependencies: acorn: ^8.9.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.4.1 - checksum: 1287979510efb052a6a97c73067ea5d0a40701b29adde87bbe2d3eb1667e39ca55e8129e20e2517fed3da570150e7ef470585228459a8f3e3755f45007a1c662 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 languageName: node linkType: hard @@ -8488,16 +8516,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.9": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": + version: 3.3.0 + resolution: "fast-glob@npm:3.3.0" dependencies: "@nodelib/fs.stat": ^2.0.2 "@nodelib/fs.walk": ^1.2.3 glob-parent: ^5.1.2 merge2: ^1.3.0 micromatch: ^4.0.4 - checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + checksum: 20df62be28eb5426fe8e40e0d05601a63b1daceb7c3d87534afcad91bdcf1e4b1743cf2d5247d6e225b120b46df0b9053a032b2691ba34ee121e033acd81f547 languageName: node linkType: hard @@ -9031,7 +9059,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": version: 1.2.1 resolution: "get-intrinsic@npm:1.2.1" dependencies: @@ -9282,15 +9310,15 @@ __metadata: linkType: hard "globby@npm:^13.1.2": - version: 13.2.0 - resolution: "globby@npm:13.2.0" + version: 13.2.2 + resolution: "globby@npm:13.2.2" dependencies: dir-glob: ^3.0.1 - fast-glob: ^3.2.11 - ignore: ^5.2.0 + fast-glob: ^3.3.0 + ignore: ^5.2.4 merge2: ^1.4.1 slash: ^4.0.0 - checksum: 0a3dd786571788adef1c894f22112834cff5bbe061ae6e0a01c5118c39d44b3f1937ef1dae3f8b9bc24756eba84a0923e565b1ad9a4ec52831d7e2a04c035e75 + checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e languageName: node linkType: hard @@ -9845,9 +9873,9 @@ __metadata: linkType: hard "html-entities@npm:^2.3.2": - version: 2.3.6 - resolution: "html-entities@npm:2.3.6" - checksum: 559a88dc3a2059b1e8882940dcaf996ea9d8151b9a780409ff223a79dc1d42ee8bb19b3365064f241f2e2543b0f90612d63f9b8e36d14c4c7fbb73540a8f41cb + version: 2.4.0 + resolution: "html-entities@npm:2.4.0" + checksum: 25bea32642ce9ebd0eedc4d24381883ecb0335ccb8ac26379a0958b9b16652fdbaa725d70207ce54a51db24103436a698a8e454397d3ba8ad81460224751f1dc languageName: node linkType: hard @@ -10736,15 +10764,11 @@ __metadata: linkType: hard "is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "is-typed-array@npm:1.1.10" + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + which-typed-array: ^1.1.11 + checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 languageName: node linkType: hard @@ -10826,6 +10850,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isbinaryfile@npm:^5.0.0": version: 5.0.0 resolution: "isbinaryfile@npm:5.0.0" @@ -11390,11 +11421,11 @@ __metadata: linkType: hard "lit-html@npm:^2.7.0": - version: 2.7.4 - resolution: "lit-html@npm:2.7.4" + version: 2.7.5 + resolution: "lit-html@npm:2.7.5" dependencies: "@types/trusted-types": ^2.0.2 - checksum: 3809d62d8b8e66c047a582fe62d430384c63af8c8444da4ca565b41d03e0295be2ce3eaa3c03b58d35a5d74fd8c98976585902204fc28006cfb9adf29fc1761e + checksum: 7a54399f78c02f21ee5584fd9ff21b3edad8416df0aca22964bc5b221f0b57ba74d7bd98ad076acea2403b53b2ea87cc3eb47ba8395f371a645e3d584f2c1e49 languageName: node linkType: hard @@ -11942,11 +11973,11 @@ __metadata: linkType: hard "minimatch@npm:^9.0.1": - version: 9.0.1 - resolution: "minimatch@npm:9.0.1" + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" dependencies: brace-expansion: ^2.0.1 - checksum: 97f5f5284bb57dc65b9415dec7f17a0f6531a33572193991c60ff18450dcfad5c2dad24ffeaf60b5261dccd63aae58cc3306e2209d57e7f88c51295a532d8ec3 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 languageName: node linkType: hard @@ -12032,9 +12063,9 @@ __metadata: linkType: hard "minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": - version: 7.0.1 - resolution: "minipass@npm:7.0.1" - checksum: fedd1293f6a1b4e406c242a1cecfb75d0a81422bb2c365d999e33a88642fb68d70a89d95b550e08c640b3c0d9162829310e0c58b9b846b9218de25779818c709 + version: 7.0.2 + resolution: "minipass@npm:7.0.2" + checksum: 46776de732eb7cef2c7404a15fb28c41f5c54a22be50d47b03c605bf21f5c18d61a173c0a20b49a97e7a65f78d887245066410642551e45fffe04e9ac9e325bc languageName: node linkType: hard @@ -12290,9 +12321,9 @@ __metadata: linkType: hard "node-releases@npm:^2.0.12": - version: 2.0.12 - resolution: "node-releases@npm:2.0.12" - checksum: b8c56db82c4642a0f443332b331a4396dae452a2ac5a65c8dbd93ef89ecb2fbb0da9d42ac5366d4764973febadca816cf7587dad492dce18d2a6b2af59cda260 + version: 2.0.13 + resolution: "node-releases@npm:2.0.13" + checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 languageName: node linkType: hard @@ -13192,13 +13223,13 @@ __metadata: linkType: hard "postcss@npm:^8.4.14": - version: 8.4.24 - resolution: "postcss@npm:8.4.24" + version: 8.4.26 + resolution: "postcss@npm:8.4.26" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d + checksum: 1cf08ee10d58cbe98f94bf12ac49a5e5ed1588507d333d2642aacc24369ca987274e1f60ff4cbf0081f70d2ab18a5cd3a4a273f188d835b8e7f3ba381b184e57 languageName: node linkType: hard @@ -13550,7 +13581,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3": +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0": version: 1.5.0 resolution: "regexp.prototype.flags@npm:1.5.0" dependencies: @@ -13951,6 +13982,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-array-concat@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: f43cb98fe3b566327d0c09284de2b15fb85ae964a89495c1b1a5d50c7c8ed484190f4e5e71aacc167e16231940079b326f2c0807aea633d47cc7322f40a6b57f + 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" @@ -15019,8 +15062,8 @@ __metadata: linkType: hard "terser@npm:^5.0.0, terser@npm:^5.15.1, terser@npm:^5.16.8": - version: 5.18.0 - resolution: "terser@npm:5.18.0" + version: 5.19.1 + resolution: "terser@npm:5.19.1" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -15028,7 +15071,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: d01eb9805a978b3338b68fd2d9e35c1cd4cad78ea093dc92c7b3c38965232f0af0f95e0c6d90920ecf600a74135c608aebae26302c036c01393a590e1918bb90 + checksum: 18657b2a282238a1ca9c825efa966f4dd043a33196b2f8a7a2cba406a2006e14f55295b9d9cf6380a18599b697e9579e4092c99b9f40c7871ceec01cc98e3606 languageName: node linkType: hard @@ -15267,9 +15310,9 @@ __metadata: linkType: hard "tslib@npm:^2.0.1, tslib@npm:^2.0.2, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": - version: 2.5.3 - resolution: "tslib@npm:2.5.3" - checksum: 88902b309afaf83259131c1e13da1dceb0ad1682a213143a1346a649143924d78cf3760c448b84d796938fd76127183894f8d85cbb3bf9c4fddbfcc140c0003c + version: 2.6.0 + resolution: "tslib@npm:2.6.0" + checksum: c01066038f950016a18106ddeca4649b4d76caa76ec5a31e2a26e10586a59fceb4ee45e96719bf6c715648e7c14085a81fee5c62f7e9ebee68e77a5396e5538f languageName: node linkType: hard @@ -15427,6 +15470,42 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + is-typed-array: ^1.1.10 + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -16269,17 +16348,16 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "which-typed-array@npm:1.1.9" +"which-typed-array@npm:^1.1.10, which-typed-array@npm:^1.1.11": + version: 1.1.11 + resolution: "which-typed-array@npm:1.1.11" dependencies: available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 for-each: ^0.3.3 gopd: ^1.0.1 has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.10 - checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef + checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206 languageName: node linkType: hard From f8fcf304d4d7dc59683d6b06d7ba73ea9fbceb75 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 13:35:47 +0200 Subject: [PATCH 080/102] Lock file maintenance (#17344) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 469e42b4d1..a315d488ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6530,9 +6530,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001516 - resolution: "caniuse-lite@npm:1.0.30001516" - checksum: 044adf3493b734a356a2922445a30095a0f6de6b9194695cdf74deafe7bef658e85858a31177762c2813f6e1ed2722d832d59eee0ecb2151e93a611ee18cb21f + version: 1.0.30001517 + resolution: "caniuse-lite@npm:1.0.30001517" + checksum: e4e87436ae1c4408cf4438aac22902b31eb03f3f5bad7f33bc518d12ffb35f3fd9395ccf7efc608ee046f90ce324ec6f7f26f8a8172b8c43c26a06ecee612a29 languageName: node linkType: hard From e6a3bd4b8c5be0603c3f70dd093a4c1062617a10 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Wed, 19 Jul 2023 09:11:20 -0700 Subject: [PATCH 081/102] Add a missing translation (#17351) --- .../config/integrations/ha-config-integration-page.ts | 6 +++++- src/translations/en.json | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/panels/config/integrations/ha-config-integration-page.ts b/src/panels/config/integrations/ha-config-integration-page.ts index b05b15b3ba..6ec67086f8 100644 --- a/src/panels/config/integrations/ha-config-integration-page.ts +++ b/src/panels/config/integrations/ha-config-integration-page.ts @@ -627,7 +627,11 @@ class HaConfigIntegrationPage extends SubscribeMixin(LitElement) { } if (devicesLine.length === 0) { - devicesLine = ["No devices or entities"]; + devicesLine = [ + this.hass.localize( + "ui.panel.config.integrations.config_entry.no_devices_or_entities" + ), + ]; } else if (devicesLine.length === 2) { devicesLine = [ devicesLine[0], diff --git a/src/translations/en.json b/src/translations/en.json index 7d80346d89..4e6590eb7e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3455,6 +3455,7 @@ "entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}", "services": "{count} {count, plural,\n one {service}\n other {services}\n}", "entries": "{count} {count, plural,\n one {entry}\n other {entries}\n}", + "no_devices_or_entities": "No devices or entities", "rename": "Rename", "configure": "Configure", "system_options": "System options", From 3ce0fc0a2a4a45e1263f3357c6d57e93cd135543 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 19 Jul 2023 23:45:38 +0200 Subject: [PATCH 082/102] Add My support for Assist dev tools (#17342) --- src/panels/my/ha-panel-my.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index 6f2d35c099..a083079f41 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -20,6 +20,9 @@ export const getMyRedirects = (hasSupervisor: boolean): Redirects => ({ application_credentials: { redirect: "/config/application_credentials", }, + developer_assist: { + redirect: "/developer-tools/assist", + }, developer_states: { redirect: "/developer-tools/state", }, From 38ea25cf5a1b19121209206f93433c3f05e801ec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 23:10:47 -0400 Subject: [PATCH 083/102] Lock file maintenance (#17357) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index a315d488ec..fdcc6264c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7662,9 +7662,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.431": - version: 1.4.464 - resolution: "electron-to-chromium@npm:1.4.464" - checksum: 4400ddeee0a300705830dfdb69c352b6efe4bd7a5ff99de87f61b8706008ce84f565214afae83272135512472406d8515f89531bcc27948683f67865bdbc1e3a + version: 1.4.465 + resolution: "electron-to-chromium@npm:1.4.465" + checksum: 1c8509d5bf15004ad88921845386b695744d0ea02beef8e1e8c6abdf673a4d51254395b8cd501a12c1043f732fca18d2981f636aac3cf789673a515424460ccd languageName: node linkType: hard From 11fa9d1ed8768654c84b5d04485826b0e9cc323c Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 20 Jul 2023 07:14:32 -0700 Subject: [PATCH 084/102] Fix guiMode toggle bugs in element-editor (#17282) --- .../lovelace/editor/hui-element-editor.ts | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/panels/lovelace/editor/hui-element-editor.ts b/src/panels/lovelace/editor/hui-element-editor.ts index f711c63210..2d2b58f4a1 100644 --- a/src/panels/lovelace/editor/hui-element-editor.ts +++ b/src/panels/lovelace/editor/hui-element-editor.ts @@ -131,14 +131,16 @@ export abstract class HuiElementEditor extends LitElement { } } - fireEvent(this, "config-changed", { - config: this.value! as any, - error: this._errors?.join(", "), - guiModeAvailable: !( - this.hasWarning || - this.hasError || - this._guiSupported === false - ), + this.updateComplete.then(() => { + fireEvent(this, "config-changed", { + config: this.value! as any, + error: this._errors?.join(", "), + guiModeAvailable: !( + this.hasWarning || + this.hasError || + this._guiSupported === false + ), + }); }); } @@ -156,13 +158,15 @@ export abstract class HuiElementEditor extends LitElement { public set GUImode(guiMode: boolean) { this._guiMode = guiMode; - fireEvent(this as HTMLElement, "GUImode-changed", { - guiMode, - guiModeAvailable: !( - this.hasWarning || - this.hasError || - this._guiSupported === false - ), + this.updateComplete.then(() => { + fireEvent(this as HTMLElement, "GUImode-changed", { + guiMode, + guiModeAvailable: !( + this.hasWarning || + this.hasError || + this._guiSupported === false + ), + }); }); } From 09e26c8fd79243746860fac9aa26f084b41ef12e Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 20 Jul 2023 07:15:19 -0700 Subject: [PATCH 085/102] Missing translation in data-table (#17356) --- src/components/data-table/ha-data-table.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index 6aa6233b6d..5426e1179e 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -338,7 +338,8 @@ export class HaDataTable extends LitElement {
    - ${this.noDataText || "No data"} + ${this.noDataText || + this.hass.localize("ui.components.data-table.no-data")}
    From a1748260d31108d501193acffe563da58806e49b Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 20 Jul 2023 07:15:59 -0700 Subject: [PATCH 086/102] Always show translated labels for ha-form-multi_select (#17360) --- src/components/ha-form/ha-form-multi_select.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/ha-form/ha-form-multi_select.ts b/src/components/ha-form/ha-form-multi_select.ts index e56d902b97..66c7d60ca6 100644 --- a/src/components/ha-form/ha-form-multi_select.ts +++ b/src/components/ha-form/ha-form-multi_select.ts @@ -91,7 +91,11 @@ export class HaFormMultiSelect extends LitElement implements HaFormElement { slot="trigger" .label=${this.label} .value=${data - .map((value) => this.schema.options![value] || value) + .map( + (value) => + optionLabel(options.find((v) => optionValue(v) === value)) || + value + ) .join(", ")} .disabled=${this.disabled} tabindex="-1" From 406f8686425bee7124ba7db2bce8fe017346798d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:36:44 -0400 Subject: [PATCH 087/102] Update dependency webpack to v5.88.2 (#17372) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 056bda0f2f..ff72993ca9 100644 --- a/package.json +++ b/package.json @@ -242,7 +242,7 @@ "typescript": "5.1.6", "vinyl-buffer": "1.0.1", "vinyl-source-stream": "2.0.0", - "webpack": "5.88.1", + "webpack": "5.88.2", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1", "webpack-manifest-plugin": "5.0.0", diff --git a/yarn.lock b/yarn.lock index fdcc6264c9..c6d661e810 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9820,7 +9820,7 @@ __metadata: vis-network: 9.1.6 vue: 2.7.14 vue2-daterange-picker: 0.6.8 - webpack: 5.88.1 + webpack: 5.88.2 webpack-cli: 5.1.4 webpack-dev-server: 4.15.1 webpack-manifest-plugin: 5.0.0 @@ -16224,9 +16224,9 @@ __metadata: languageName: node linkType: hard -"webpack@npm:5.88.1": - version: 5.88.1 - resolution: "webpack@npm:5.88.1" +"webpack@npm:5.88.2": + version: 5.88.2 + resolution: "webpack@npm:5.88.2" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^1.0.0 @@ -16257,7 +16257,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 726e7e05ab2e7c142609a673dd6aa1a711ed97f349418a2a393d650c5ddad172d191257f60e1e37f6b2a77261571c202aabd5ce9240791a686774f0801cf5ec2 + checksum: 79476a782da31a21f6dd38fbbd06b68da93baf6a62f0d08ca99222367f3b8668f5a1f2086b7bb78e23172e31fa6df6fa7ab09b25e827866c4fc4dc2b30443ce2 languageName: node linkType: hard From 795831d4cf14e79fa4fccbee94f1d7c80f084fb6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Jul 2023 20:47:12 -0400 Subject: [PATCH 088/102] Update typescript-eslint monorepo to v6.1.0 (#17370) --- package.json | 4 +- yarn.lock | 139 ++++++++++++++++++++++++--------------------------- 2 files changed, 67 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index ff72993ca9..77c8b240f6 100644 --- a/package.json +++ b/package.json @@ -184,8 +184,8 @@ "@types/sortablejs": "1.15.1", "@types/tar": "6.1.5", "@types/webspeechapi": "0.0.29", - "@typescript-eslint/eslint-plugin": "6.0.0", - "@typescript-eslint/parser": "6.0.0", + "@typescript-eslint/eslint-plugin": "6.1.0", + "@typescript-eslint/parser": "6.1.0", "@web/dev-server": "0.1.38", "@web/dev-server-rollup": "0.4.1", "babel-loader": "9.1.3", diff --git a/yarn.lock b/yarn.lock index c6d661e810..74c0ef4897 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1560,7 +1560,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.3.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -1571,7 +1571,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.0": +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.5.1": version: 4.5.1 resolution: "@eslint-community/regexpp@npm:4.5.1" checksum: 6d901166d64998d591fab4db1c2f872981ccd5f6fe066a1ad0a93d4e11855ecae6bfb76660869a469563e8882d4307228cebd41142adb409d182f2966771e57e @@ -4335,7 +4335,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.12 resolution: "@types/json-schema@npm:7.0.12" checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 @@ -4554,7 +4554,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:^7.5.0": version: 7.5.0 resolution: "@types/semver@npm:7.5.0" checksum: 0a64b9b9c7424d9a467658b18dd70d1d781c2d6f033096a6e05762d20ebbad23c1b69b0083b0484722aabf35640b78ccc3de26368bcae1129c87e9df028a22e2 @@ -4658,22 +4658,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.0.0" +"@typescript-eslint/eslint-plugin@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.1.0" dependencies: - "@eslint-community/regexpp": ^4.5.0 - "@typescript-eslint/scope-manager": 6.0.0 - "@typescript-eslint/type-utils": 6.0.0 - "@typescript-eslint/utils": 6.0.0 - "@typescript-eslint/visitor-keys": 6.0.0 + "@eslint-community/regexpp": ^4.5.1 + "@typescript-eslint/scope-manager": 6.1.0 + "@typescript-eslint/type-utils": 6.1.0 + "@typescript-eslint/utils": 6.1.0 + "@typescript-eslint/visitor-keys": 6.1.0 debug: ^4.3.4 - grapheme-splitter: ^1.0.4 graphemer: ^1.4.0 ignore: ^5.2.4 natural-compare: ^1.4.0 natural-compare-lite: ^1.4.0 - semver: ^7.5.0 + semver: ^7.5.4 ts-api-utils: ^1.0.1 peerDependencies: "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha @@ -4681,44 +4680,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 863f30b8ceb24d104fc8a41774e4f597a35525533aa99721198293b51628a2d986dcc6413893f27eb9db5a49c2fd2cc91d3aece8ed23d590f3eb4e9939c3d6ad + checksum: e1f05d8d49041b47cdbea8fc80f87f03dc0f7273deb2f34f73661831572fe62976ab3780972496428ce6fa31d3f53236a4c90cd9948d45f5004631edbfa3d42a languageName: node linkType: hard -"@typescript-eslint/parser@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/parser@npm:6.0.0" +"@typescript-eslint/parser@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/parser@npm:6.1.0" dependencies: - "@typescript-eslint/scope-manager": 6.0.0 - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/typescript-estree": 6.0.0 - "@typescript-eslint/visitor-keys": 6.0.0 + "@typescript-eslint/scope-manager": 6.1.0 + "@typescript-eslint/types": 6.1.0 + "@typescript-eslint/typescript-estree": 6.1.0 + "@typescript-eslint/visitor-keys": 6.1.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: a22f0c8f67eb244134f9d79d78faf1b6e2c0965495d78eef94a5680868f3d0fd9446a3ce5dc1e36dde02587da5d962944f3d83679c712d0b819ac99cdb9f7143 + checksum: dc59cda4396ca09e3aa2bd5b99d8ef9526df56567d4a9b953668102116db975dfb2426c3369560a2b02e083d49e43b4cebb252144d175e900096eb0b17f7ae3c languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/scope-manager@npm:6.0.0" +"@typescript-eslint/scope-manager@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/scope-manager@npm:6.1.0" dependencies: - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/visitor-keys": 6.0.0 - checksum: 450015be6454f953d0ea0da020ab47597e96a7a15c1002eed16c57430783bd7b045513d57a126606fb35e8971f1ce65fbefd845e3b5496bf75284cbe1681d0b9 + "@typescript-eslint/types": 6.1.0 + "@typescript-eslint/visitor-keys": 6.1.0 + checksum: 57c73b8713be79abebbcfef1d58f78a820ea88a5c37a44d2c9a76130216d9ee824134fae215dde794121cfaf1284370da77e1e5184ba71812aebb1a8cf39f325 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/type-utils@npm:6.0.0" +"@typescript-eslint/type-utils@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/type-utils@npm:6.1.0" dependencies: - "@typescript-eslint/typescript-estree": 6.0.0 - "@typescript-eslint/utils": 6.0.0 + "@typescript-eslint/typescript-estree": 6.1.0 + "@typescript-eslint/utils": 6.1.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -4726,60 +4725,59 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 53f46237891cfa738f6a4bc766a4dbb8d745b1cb9cbe2d2b40f2a4abcf0327d4aa92d9ce5361e87cd26d82e0159f358e28b0c67759eb053c4fd752654dc9dcb1 + checksum: 83b2ffcf3aa297b60deb2e9ddd946b9c15cc55d0727dfc8a3447e8e5402428f6ee3fc67fb9d5d8ade25da4069ca77e23777caf02bcacd2a1e75b66cfc4d76579 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/types@npm:6.0.0" - checksum: a2e232b66b0b057152f4a94d7e0be75f32e389c9c1ec9ed9901ed5aab6e5df08c07bde9865710e315d835e4400ec2232f9c3c525b6edf8a85675ebfbfb69d3a5 +"@typescript-eslint/types@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/types@npm:6.1.0" + checksum: c1f55ebfda7af5e63077beb65fe5a82de7ae7afb913a4ebfb023f2889d5ec06f75b6ebca6ee45d6d205508a52fa5a6bf5821182c3e7e4400ac9304083b88f139 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.0.0" +"@typescript-eslint/typescript-estree@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.1.0" dependencies: - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/visitor-keys": 6.0.0 + "@typescript-eslint/types": 6.1.0 + "@typescript-eslint/visitor-keys": 6.1.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 - semver: ^7.5.0 + semver: ^7.5.4 ts-api-utils: ^1.0.1 peerDependenciesMeta: typescript: optional: true - checksum: 6214ff9cc3c4fd7fe03f846e96a498ecf85916083bb60d419bc5a12142cff912670032b1de5ea52ab353ca7eeb4e1cc8fa475a22958b010043c88e274df49859 + checksum: 42729b8952a78ff9fc7d3833e16de25f1a3502461ebe5d09a28fb4375c8e5978dde0dd1f8a7973bf7470ff9023cce84de82e968b02a09f54a0f753d21d9127e8 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/utils@npm:6.0.0" +"@typescript-eslint/utils@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/utils@npm:6.1.0" dependencies: - "@eslint-community/eslint-utils": ^4.3.0 - "@types/json-schema": ^7.0.11 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 6.0.0 - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/typescript-estree": 6.0.0 - eslint-scope: ^5.1.1 - semver: ^7.5.0 + "@eslint-community/eslint-utils": ^4.4.0 + "@types/json-schema": ^7.0.12 + "@types/semver": ^7.5.0 + "@typescript-eslint/scope-manager": 6.1.0 + "@typescript-eslint/types": 6.1.0 + "@typescript-eslint/typescript-estree": 6.1.0 + semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 94b9b616282f6fa1ae50ba371a482a3c8c50268ef8039b4e86d29c445e95025c819358a5cc9955c4668482d97ef026e7a49e7f4b3a4685347136ef5bbd297e4d + checksum: eb47a6b56e142ca68231f0f43af68d4cf5161235943aaf19c268156e3e751e10dd8ea3e0e297a7c0796b9eb3c5268b3c659821b909799949b55a524707c82e13 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.0.0": - version: 6.0.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.0.0" +"@typescript-eslint/visitor-keys@npm:6.1.0": + version: 6.1.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.1.0" dependencies: - "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/types": 6.1.0 eslint-visitor-keys: ^3.4.1 - checksum: b0d9848a4490174db1d25b5f336548bb11dde4e0ce664c3dc341bed89fb3a3ada091aeb7f5d2d371433815332d93339c6cb77f7a24469c329c3d055b15237bfa + checksum: 21c7c9b9a52325e3b67c0015deb99a1603b19703af7c002e87f32e2d8f9910813985877ee7b589dc9938d308e3d082cf97c8ca43c2c95b86a919c426d8913439 languageName: node linkType: hard @@ -8141,7 +8139,7 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": +"eslint-scope@npm:5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" dependencies: @@ -9354,13 +9352,6 @@ __metadata: languageName: node linkType: hard -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 - languageName: node - linkType: hard - "graphemer@npm:^1.4.0": version: 1.4.0 resolution: "graphemer@npm:1.4.0" @@ -9714,8 +9705,8 @@ __metadata: "@types/sortablejs": 1.15.1 "@types/tar": 6.1.5 "@types/webspeechapi": 0.0.29 - "@typescript-eslint/eslint-plugin": 6.0.0 - "@typescript-eslint/parser": 6.0.0 + "@typescript-eslint/eslint-plugin": 6.1.0 + "@typescript-eslint/parser": 6.1.0 "@vaadin/combo-box": 24.1.3 "@vaadin/vaadin-themable-mixin": 24.1.3 "@vibrant/color": 3.2.1-alpha.1 @@ -14115,7 +14106,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.0": +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: From 308d4b0a62e187a1b0a73a8a2620fa42f42bfd68 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 20 Jul 2023 18:02:08 -0700 Subject: [PATCH 089/102] Fix Options flow missing submit button & finish button. (#17361) * Fix missing submit button in options flow * Fix missing header and finish button at end of options flow * load config translations for options flow * one more revert --- src/dialogs/config-flow/show-dialog-config-flow.ts | 2 ++ src/dialogs/config-flow/show-dialog-options-flow.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/dialogs/config-flow/show-dialog-config-flow.ts b/src/dialogs/config-flow/show-dialog-config-flow.ts index a575cde11f..f7b3fc7e37 100644 --- a/src/dialogs/config-flow/show-dialog-config-flow.ts +++ b/src/dialogs/config-flow/show-dialog-config-flow.ts @@ -23,6 +23,7 @@ export const showConfigFlowDialog = ( createFlow: async (hass, handler) => { const [step] = await Promise.all([ createConfigFlow(hass, handler), + hass.loadFragmentTranslation("config"), hass.loadBackendTranslation("config", handler), hass.loadBackendTranslation("selector", handler), // Used as fallback if no header defined for step @@ -32,6 +33,7 @@ export const showConfigFlowDialog = ( }, fetchFlow: async (hass, flowId) => { const step = await fetchConfigFlow(hass, flowId); + await hass.loadFragmentTranslation("config"); await hass.loadBackendTranslation("config", step.handler); await hass.loadBackendTranslation("selector", step.handler); return step; diff --git a/src/dialogs/config-flow/show-dialog-options-flow.ts b/src/dialogs/config-flow/show-dialog-options-flow.ts index 81a7947599..d95a38c29a 100644 --- a/src/dialogs/config-flow/show-dialog-options-flow.ts +++ b/src/dialogs/config-flow/show-dialog-options-flow.ts @@ -31,6 +31,7 @@ export const showOptionsFlowDialog = ( createFlow: async (hass, handler) => { const [step] = await Promise.all([ createOptionsFlow(hass, handler), + hass.loadFragmentTranslation("config"), hass.loadBackendTranslation("options", configEntry.domain), hass.loadBackendTranslation("selector", configEntry.domain), ]); @@ -39,6 +40,7 @@ export const showOptionsFlowDialog = ( fetchFlow: async (hass, flowId) => { const [step] = await Promise.all([ fetchOptionsFlow(hass, flowId), + hass.loadFragmentTranslation("config"), hass.loadBackendTranslation("options", configEntry.domain), hass.loadBackendTranslation("selector", configEntry.domain), ]); From 3189ef0701e1150f15141dd7b04b0900907aa040 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 20 Jul 2023 23:51:41 -0700 Subject: [PATCH 090/102] Fix dialog-edit-view yaml editor (#17374) --- src/panels/lovelace/editor/view-editor/hui-dialog-edit-view.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 99d8c42f64..d873e8d5e1 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 @@ -21,7 +21,8 @@ import "../../../../components/ha-alert"; import "../../../../components/ha-circular-progress"; import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog-header"; -import { HaYamlEditor } from "../../../../components/ha-yaml-editor"; +import "../../../../components/ha-yaml-editor"; +import type { HaYamlEditor } from "../../../../components/ha-yaml-editor"; import type { LovelaceBadgeConfig, LovelaceCardConfig, From 0eebc9095c26cdcfa963dba8f07dde333890b2f5 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 21 Jul 2023 12:18:32 +0200 Subject: [PATCH 091/102] Add event entity (#17332) --- gallery/src/pages/lovelace/entities-card.ts | 10 ++ src/common/const.ts | 5 +- src/common/entity/compute_state_display.ts | 12 +- src/common/entity/domain_icon.ts | 18 ++- src/common/entity/get_states.ts | 5 + src/common/entity/state_active.ts | 2 +- src/data/entity_attributes.ts | 1 + src/data/logbook.ts | 19 +++ src/data/scene.ts | 1 + src/dialogs/more-info/const.ts | 1 + .../ha-automation-condition-numeric_state.ts | 2 + .../types/ha-automation-condition-state.ts | 1 + .../ha-automation-trigger-numeric_state.ts | 2 + .../types/ha-automation-trigger-state.ts | 1 + .../config/devices/ha-config-device-page.ts | 48 ++++--- .../create-element/create-row-element.ts | 3 + .../entity-rows/hui-event-entity-row.ts | 129 ++++++++++++++++++ src/state-summary/state-card-content.js | 1 + src/state-summary/state-card-event.ts | 59 ++++++++ src/translations/en.json | 13 +- 20 files changed, 302 insertions(+), 31 deletions(-) create mode 100644 src/panels/lovelace/entity-rows/hui-event-entity-row.ts create mode 100644 src/state-summary/state-card-event.ts diff --git a/gallery/src/pages/lovelace/entities-card.ts b/gallery/src/pages/lovelace/entities-card.ts index 075fa73351..aa6368878d 100644 --- a/gallery/src/pages/lovelace/entities-card.ts +++ b/gallery/src/pages/lovelace/entities-card.ts @@ -135,6 +135,14 @@ const ENTITIES = [ getEntity("text", "unavailable", "unavailable", { friendly_name: "Message", }), + getEntity("event", "unavailable", "unavailable", { + friendly_name: "Empty remote", + }), + getEntity("event", "doorbell", "2023-07-17T21:26:11.615+00:00", { + friendly_name: "Doorbell", + device_class: "doorbell", + event_type: "Ding-Dong", + }), ]; const CONFIGS = [ @@ -154,6 +162,7 @@ const CONFIGS = [ - input_number.number - sensor.humidity - text.message + - event.doorbell `, }, { @@ -246,6 +255,7 @@ const CONFIGS = [ - input_number.unavailable - input_select.unavailable - text.unavailable + - event.unavailable `, }, { diff --git a/src/common/const.ts b/src/common/const.ts index b4f79e5126..7902662135 100644 --- a/src/common/const.ts +++ b/src/common/const.ts @@ -10,6 +10,7 @@ import { mdiBookmark, mdiBrightness5, mdiBullhorn, + mdiButtonPointer, mdiCalendar, mdiCalendarClock, mdiCarCoolantLevel, @@ -28,7 +29,6 @@ import { mdiFormatListBulleted, mdiFormTextbox, mdiGauge, - mdiGestureTapButton, mdiGoogleAssistant, mdiGoogleCirclesCommunities, mdiHomeAssistant, @@ -93,7 +93,7 @@ export const FIXED_DOMAIN_ICONS = { homekit: mdiHomeAutomation, image: mdiImage, image_processing: mdiImageFilterFrames, - input_button: mdiGestureTapButton, + input_button: mdiButtonPointer, input_datetime: mdiCalendarClock, input_number: mdiRayVertex, input_select: mdiFormatListBulleted, @@ -178,6 +178,7 @@ export const DOMAINS_WITH_CARD = [ "climate", "cover", "configurator", + "event", "input_button", "input_select", "input_number", diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts index 998949b007..4baad8357d 100644 --- a/src/common/entity/compute_state_display.ts +++ b/src/common/entity/compute_state_display.ts @@ -185,9 +185,15 @@ export const computeStateDisplayFromEntityAttributes = ( // state is a timestamp if ( - ["button", "image", "input_button", "scene", "stt", "tts"].includes( - domain - ) || + [ + "button", + "event", + "image", + "input_button", + "scene", + "stt", + "tts", + ].includes(domain) || (domain === "sensor" && attributes.device_class === "timestamp") ) { try { diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts index 3ced61b3f8..eeefc4598c 100644 --- a/src/common/entity/domain_icon.ts +++ b/src/common/entity/domain_icon.ts @@ -7,6 +7,7 @@ import { mdiAudioVideoOff, mdiBluetooth, mdiBluetoothConnect, + mdiButtonPointer, mdiCalendar, mdiCast, mdiCastConnected, @@ -16,8 +17,10 @@ import { mdiClock, mdiCloseCircleOutline, mdiCrosshairsQuestion, + mdiDoorbell, mdiFan, mdiFanOff, + mdiGestureTap, mdiGestureTapButton, mdiLanConnect, mdiLanDisconnect, @@ -25,6 +28,7 @@ import { mdiLockAlert, mdiLockClock, mdiLockOpen, + mdiMotionSensor, mdiPackage, mdiPackageDown, mdiPackageUp, @@ -111,7 +115,7 @@ export const domainIconWithoutDefault = ( case "update": return mdiPackageUp; default: - return mdiGestureTapButton; + return mdiButtonPointer; } case "camera": @@ -131,6 +135,18 @@ export const domainIconWithoutDefault = ( } return compareState === "not_home" ? mdiAccountArrowRight : mdiAccount; + case "event": + switch (stateObj?.attributes.device_class) { + case "doorbell": + return mdiDoorbell; + case "button": + return mdiGestureTapButton; + case "motion": + return mdiMotionSensor; + default: + return mdiGestureTap; + } + case "fan": return compareState === "off" ? mdiFanOff : mdiFan; diff --git a/src/common/entity/get_states.ts b/src/common/entity/get_states.ts index f8d10ad99f..7eaf7bfb81 100644 --- a/src/common/entity/get_states.ts +++ b/src/common/entity/get_states.ts @@ -250,6 +250,11 @@ export const getStates = ( result.push("home", "not_home"); } break; + case "event": + if (attribute === "event_type") { + result.push(...state.attributes.event_types); + } + break; case "fan": if (attribute === "preset_mode") { result.push(...state.attributes.preset_modes); diff --git a/src/common/entity/state_active.ts b/src/common/entity/state_active.ts index a22ee5c9e5..34162fcc0b 100644 --- a/src/common/entity/state_active.ts +++ b/src/common/entity/state_active.ts @@ -6,7 +6,7 @@ export function stateActive(stateObj: HassEntity, state?: string): boolean { const domain = computeDomain(stateObj.entity_id); const compareState = state !== undefined ? state : stateObj?.state; - if (["button", "input_button", "scene"].includes(domain)) { + if (["button", "event", "input_button", "scene"].includes(domain)) { return compareState !== UNAVAILABLE; } diff --git a/src/data/entity_attributes.ts b/src/data/entity_attributes.ts index 7e3fae87aa..77dcc0b465 100644 --- a/src/data/entity_attributes.ts +++ b/src/data/entity_attributes.ts @@ -9,6 +9,7 @@ export const STATE_ATTRIBUTES = [ "emulated_hue_name", "emulated_hue", "entity_picture", + "event_types", "friendly_name", "haaska_hidden", "haaska_name", diff --git a/src/data/logbook.ts b/src/data/logbook.ts index 37b0737bea..75deda104e 100644 --- a/src/data/logbook.ts +++ b/src/data/logbook.ts @@ -12,6 +12,7 @@ import { LocalizeFunc } from "../common/translations/localize"; import { HaEntityPickerEntityFilterFunc } from "../components/entity/ha-entity-picker"; import { HomeAssistant } from "../types"; import { UNAVAILABLE, UNKNOWN } from "./entity"; +import { computeAttributeValueDisplay } from "../common/entity/compute_attribute_display"; const LOGBOOK_LOCALIZE_PATH = "ui.components.logbook.messages"; export const CONTINUOUS_DOMAINS = ["counter", "proximity", "sensor", "zone"]; @@ -156,6 +157,7 @@ export const createHistoricState = ( attributes: { // Rebuild the historical state by copying static attributes only device_class: currentStateObj?.attributes.device_class, + event_type: currentStateObj?.attributes.event_type, source_type: currentStateObj?.attributes.source_type, has_date: currentStateObj?.attributes.has_date, has_time: currentStateObj?.attributes.has_time, @@ -343,6 +345,23 @@ export const localizeStateMessage = ( } break; + case "event": { + const event_type = + computeAttributeValueDisplay( + hass!.localize, + stateObj, + hass.locale, + hass.config, + hass.entities, + "event_type" + )?.toString() || + localize(`${LOGBOOK_LOCALIZE_PATH}.detected_unknown_event`); + + return localize(`${LOGBOOK_LOCALIZE_PATH}.detected_event`, { + event_type: autoCaseNoun(event_type, hass.language), + }); + } + case "lock": switch (state) { case "unlocked": diff --git a/src/data/scene.ts b/src/data/scene.ts index e8f27d6c26..b9b6fa4d2c 100644 --- a/src/data/scene.ts +++ b/src/data/scene.ts @@ -10,6 +10,7 @@ export const SCENE_IGNORED_DOMAINS = [ "button", "configuration", "device_tracker", + "event", "image_processing", "input_button", "persistent_notification", diff --git a/src/dialogs/more-info/const.ts b/src/dialogs/more-info/const.ts index d6d6d615aa..a0dc211937 100644 --- a/src/dialogs/more-info/const.ts +++ b/src/dialogs/more-info/const.ts @@ -72,6 +72,7 @@ export const DOMAINS_HIDE_DEFAULT_MORE_INFO = [ "select", "text", "update", + "event", ]; /** Domains that should have the history hidden in the more info dialog. */ diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts b/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts index a7458813db..ea41ca70d0 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts @@ -52,6 +52,8 @@ export default class HaNumericStateCondition extends LitElement { "effect_list", "effect", "entity_picture", + "event_type", + "event_types", "fan_mode", "fan_modes", "fan_speed_list", diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-state.ts b/src/panels/config/automation/condition/types/ha-automation-condition-state.ts index e61438ad3e..407699c47e 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-state.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-state.ts @@ -42,6 +42,7 @@ const SCHEMA = [ "editable", "effect_list", "entity_picture", + "event_types", "fan_modes", "fan_speed_list", "forecast", diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts index 62315025a4..4f27495023 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-numeric_state.ts @@ -51,6 +51,8 @@ export class HaNumericStateTrigger extends LitElement { "effect", "entity_id", "entity_picture", + "event_type", + "event_types", "fan_mode", "fan_modes", "fan_speed_list", diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts index 61904a424f..4899fb19ee 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-state.ts @@ -76,6 +76,7 @@ export class HaStateTrigger extends LitElement implements TriggerElement { "effect_list", "entity_id", "entity_picture", + "event_types", "fan_modes", "fan_speed_list", "friendly_name", diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 2c2051065e..3c3f513507 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -207,16 +207,25 @@ export class HaConfigDevicePage extends LitElement { const result = groupBy(entities, (entry) => entry.entity_category ? entry.entity_category + : computeDomain(entry.entity_id) === "event" + ? "event" : SENSOR_ENTITIES.includes(computeDomain(entry.entity_id)) ? "sensor" : "control" ) as Record< | "control" + | "event" | "sensor" | NonNullable, EntityRegistryStateEntry[] >; - for (const key of ["control", "sensor", "diagnostic", "config"]) { + for (const key of [ + "config", + "control", + "diagnostic", + "event", + "sensor", + ]) { if (!(key in result)) { result[key] = []; } @@ -877,24 +886,25 @@ export class HaConfigDevicePage extends LitElement { ${!this.narrow ? [automationCard, sceneCard, scriptCard] : ""}
    - ${(["control", "sensor", "config", "diagnostic"] as const).map( - (category) => - // Make sure we render controls if no other cards will be rendered - entitiesByCategory[category].length > 0 || - (entities.length === 0 && category === "control") - ? html` - - - ` - : "" + ${( + ["control", "sensor", "event", "config", "diagnostic"] as const + ).map((category) => + // Make sure we render controls if no other cards will be rendered + entitiesByCategory[category].length > 0 || + (entities.length === 0 && category === "control") + ? html` + + + ` + : "" )} import("../entity-rows/hui-cover-entity-row"), "date-entity": () => import("../entity-rows/hui-date-entity-row"), "datetime-entity": () => import("../entity-rows/hui-datetime-entity-row"), + "event-entity": () => import("../entity-rows/hui-event-entity-row"), "group-entity": () => import("../entity-rows/hui-group-entity-row"), "input-button-entity": () => import("../entity-rows/hui-input-button-entity-row"), @@ -65,6 +67,7 @@ const DOMAIN_TO_ELEMENT_TYPE = { cover: "cover", date: "date", datetime: "datetime", + event: "event", fan: "toggle", group: "group", humidifier: "humidifier", diff --git a/src/panels/lovelace/entity-rows/hui-event-entity-row.ts b/src/panels/lovelace/entity-rows/hui-event-entity-row.ts new file mode 100644 index 0000000000..35c98d1a0d --- /dev/null +++ b/src/panels/lovelace/entity-rows/hui-event-entity-row.ts @@ -0,0 +1,129 @@ +import { + css, + CSSResultGroup, + html, + LitElement, + PropertyValues, + nothing, +} from "lit"; +import { customElement, property, state } from "lit/decorators"; +import { computeStateDisplay } from "../../../common/entity/compute_state_display"; +import { computeAttributeValueDisplay } from "../../../common/entity/compute_attribute_display"; +import { isUnavailableState } from "../../../data/entity"; +import { ActionHandlerEvent } from "../../../data/lovelace"; +import { HomeAssistant } from "../../../types"; +import { EntitiesCardEntityConfig } from "../cards/types"; +import { actionHandler } from "../common/directives/action-handler-directive"; +import { handleAction } from "../common/handle-action"; +import { hasAction } from "../common/has-action"; +import { hasConfigOrEntityChanged } from "../common/has-changed"; +import "../components/hui-generic-entity-row"; +import "../components/hui-timestamp-display"; +import { createEntityNotFoundWarning } from "../components/hui-warning"; +import { TimestampRenderingFormat } from "../components/types"; +import { LovelaceRow } from "./types"; + +interface EventEntityConfig extends EntitiesCardEntityConfig { + format?: TimestampRenderingFormat; +} + +@customElement("hui-event-entity-row") +class HuiEventEntityRow extends LitElement implements LovelaceRow { + @property({ attribute: false }) public hass?: HomeAssistant; + + @state() private _config?: EventEntityConfig; + + public setConfig(config: EventEntityConfig): void { + if (!config) { + throw new Error("Invalid configuration"); + } + this._config = config; + } + + protected shouldUpdate(changedProps: PropertyValues): boolean { + return hasConfigOrEntityChanged(this, changedProps); + } + + protected render() { + if (!this._config || !this.hass) { + return nothing; + } + + const stateObj = this.hass.states[this._config.entity]; + + if (!stateObj) { + return html` + + ${createEntityNotFoundWarning(this.hass, this._config.entity)} + + `; + } + + return html` + +
    +
    + ${isUnavailableState(stateObj.state) + ? computeStateDisplay( + this.hass!.localize, + stateObj, + this.hass.locale, + this.hass.config, + this.hass.entities + ) + : computeAttributeValueDisplay( + this.hass!.localize, + stateObj, + this.hass.locale, + this.hass.config, + this.hass.entities, + "event_type" + )} +
    +
    + ${isUnavailableState(stateObj.state) + ? `` + : html` + + `} +
    +
    +
    + `; + } + + private _handleAction(ev: ActionHandlerEvent) { + handleAction(this, this.hass!, this._config!, ev.detail.action); + } + + static get styles(): CSSResultGroup { + return css` + div { + text-align: right; + } + .when { + color: var(--secondary-text-color); + } + .what { + color: var(--primary-text-color); + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-event-entity-row": HuiEventEntityRow; + } +} diff --git a/src/state-summary/state-card-content.js b/src/state-summary/state-card-content.js index b1669ae994..4171bd447a 100644 --- a/src/state-summary/state-card-content.js +++ b/src/state-summary/state-card-content.js @@ -8,6 +8,7 @@ import "./state-card-humidifier"; import "./state-card-configurator"; import "./state-card-cover"; import "./state-card-display"; +import "./state-card-event"; import "./state-card-input_button"; import "./state-card-input_number"; import "./state-card-input_select"; diff --git a/src/state-summary/state-card-event.ts b/src/state-summary/state-card-event.ts new file mode 100644 index 0000000000..20d590fb22 --- /dev/null +++ b/src/state-summary/state-card-event.ts @@ -0,0 +1,59 @@ +import { HassEntity } from "home-assistant-js-websocket"; +import { CSSResultGroup, html, LitElement } from "lit"; +import { customElement, property } from "lit/decorators"; +import "../components/entity/ha-entity-toggle"; +import "../components/entity/state-info"; +import { HomeAssistant } from "../types"; +import { isUnavailableState } from "../data/entity"; +import { computeAttributeValueDisplay } from "../common/entity/compute_attribute_display"; +import { computeStateDisplay } from "../common/entity/compute_state_display"; +import { haStyle } from "../resources/styles"; + +@customElement("state-card-event") +export class StateCardEvent extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public stateObj!: HassEntity; + + @property({ type: Boolean }) public inDialog = false; + + protected render() { + return html` +
    + +
    + ${isUnavailableState(this.stateObj.state) + ? computeStateDisplay( + this.hass!.localize, + this.stateObj, + this.hass.locale, + this.hass.config, + this.hass.entities + ) + : computeAttributeValueDisplay( + this.hass!.localize, + this.stateObj, + this.hass.locale, + this.hass.config, + this.hass.entities, + "event_type" + )} +
    +
    + `; + } + + static get styles(): CSSResultGroup { + return haStyle; + } +} + +declare global { + interface HTMLElementTagNameMap { + "state-card-event": StateCardEvent; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index 4e6590eb7e..cad64bcb46 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -357,7 +357,9 @@ "became_unavailable": "became unavailable", "became_unknown": "became unknown", "detected_tampering": "detected tampering", - "cleared_tampering": "cleared tampering" + "cleared_tampering": "cleared tampering", + "detected_event": "{event_type} event detected", + "detected_unknown_event": "detected an unknown event" } }, "entity": { @@ -2322,7 +2324,7 @@ } }, "event": { - "label": "Event", + "label": "Manual event", "event_type": "Event type", "event_data": "Event data", "context_users": "Limit to events triggered by", @@ -2640,11 +2642,11 @@ "label": "Condition" }, "event": { - "label": "Event", - "event": "[%key:ui::panel::config::automation::editor::triggers::type::event::label%]", + "label": "Manual event", + "event": "[%key:ui::panel::config::automation::editor::triggers::type::event::event_type%]", "event_data": "[%key:ui::panel::config::automation::editor::triggers::type::event::event_data%]", "description": { - "full": "Fire event {name}", + "full": "Manually fire event {name}", "template": "based on a template" } }, @@ -3212,6 +3214,7 @@ "entities": { "entities": "Entities", "control": "Controls", + "event": "Events", "sensor": "Sensors", "diagnostic": "Diagnostic", "config": "Configuration", From ec58862f3eec36f6f89d17fdd60ed81955396b02 Mon Sep 17 00:00:00 2001 From: G Johansson Date: Fri, 21 Jul 2023 17:30:59 +0200 Subject: [PATCH 092/102] Implement forecast types for Weather (#15028) * Implement forecast types * editor * Fix twice_daily * All cards * Review comments * hasforecast * card-editor * forecast default * Review comments * fix entity row * Remove legacy option * Check if selected forecast is supported when picking entity * Always show weather_to_show selector * comments * Update types.ts * Hourly before twice-daily * Expose forecast via WS instead of as state attributes * Unsubscribe on disconnect * lint * prettier * Fix _forecastSupported * Improve conditions for subscribing to forecast updates * Teach weather entity row and more info to subscribe * Fix subscribing * Deduplicate code in getForecast * Simplify * Tweak subscribe logic * Address review comments --------- Co-authored-by: Erik Co-authored-by: Bram Kragten --- src/data/weather.ts | 143 +++++++++++++++--- .../more-info/controls/more-info-weather.ts | 79 +++++++++- .../cards/hui-weather-forecast-card.ts | 90 ++++++++--- src/panels/lovelace/cards/types.ts | 2 + .../hui-weather-forecast-card-editor.ts | 134 ++++++++++++++-- .../entity-rows/hui-weather-entity-row.ts | 58 ++++++- src/translations/en.json | 10 +- 7 files changed, 460 insertions(+), 56 deletions(-) diff --git a/src/data/weather.ts b/src/data/weather.ts index 619240354d..d18c41ccab 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -24,10 +24,19 @@ import { } from "home-assistant-js-websocket"; import { css, html, svg, SVGTemplateResult, TemplateResult } from "lit"; import { styleMap } from "lit/directives/style-map"; +import { supportsFeature } from "../common/entity/supports-feature"; import { formatNumber } from "../common/number/format_number"; import "../components/ha-svg-icon"; import type { HomeAssistant } from "../types"; +export const enum WeatherEntityFeature { + FORECAST_DAILY = 1, + FORECAST_HOURLY = 2, + FORECAST_TWICE_DAILY = 4, +} + +export type ForecastType = "legacy" | "hourly" | "daily" | "twice_daily"; + interface ForecastAttribute { temperature: number; datetime: string; @@ -36,7 +45,7 @@ interface ForecastAttribute { precipitation_probability?: number; humidity?: number; condition?: string; - daytime?: boolean; + is_daytime?: boolean; pressure?: number; wind_speed?: string; } @@ -45,6 +54,7 @@ interface WeatherEntityAttributes extends HassEntityAttributeBase { attribution?: string; humidity?: number; forecast?: ForecastAttribute[]; + is_daytime?: boolean; pressure?: number; temperature?: number; visibility?: number; @@ -57,6 +67,11 @@ interface WeatherEntityAttributes extends HassEntityAttributeBase { wind_speed_unit: string; } +export interface ForecastEvent { + type: "hourly" | "daily" | "twice_daily"; + forecast: [ForecastAttribute] | null; +} + export interface WeatherEntity extends HassEntityBase { attributes: WeatherEntityAttributes; } @@ -225,9 +240,10 @@ export const getWeatherUnit = ( export const getSecondaryWeatherAttribute = ( hass: HomeAssistant, - stateObj: WeatherEntity + stateObj: WeatherEntity, + forecast: ForecastAttribute[] ): TemplateResult | undefined => { - const extrema = getWeatherExtrema(hass, stateObj); + const extrema = getWeatherExtrema(hass, stateObj, forecast); if (extrema) { return extrema; @@ -237,11 +253,11 @@ export const getSecondaryWeatherAttribute = ( let attribute: string; if ( - stateObj.attributes.forecast?.length && - stateObj.attributes.forecast[0].precipitation !== undefined && - stateObj.attributes.forecast[0].precipitation !== null + forecast?.length && + forecast[0].precipitation !== undefined && + forecast[0].precipitation !== null ) { - value = stateObj.attributes.forecast[0].precipitation!; + value = forecast[0].precipitation!; attribute = "precipitation"; } else if ("humidity" in stateObj.attributes) { value = stateObj.attributes.humidity!; @@ -265,9 +281,10 @@ export const getSecondaryWeatherAttribute = ( const getWeatherExtrema = ( hass: HomeAssistant, - stateObj: WeatherEntity + stateObj: WeatherEntity, + forecast: ForecastAttribute[] ): TemplateResult | undefined => { - if (!stateObj.attributes.forecast?.length) { + if (!forecast?.length) { return undefined; } @@ -275,18 +292,18 @@ const getWeatherExtrema = ( let tempHigh: number | undefined; const today = new Date().getDate(); - for (const forecast of stateObj.attributes.forecast!) { - if (new Date(forecast.datetime).getDate() !== today) { + for (const fc of forecast!) { + if (new Date(fc.datetime).getDate() !== today) { break; } - if (!tempHigh || forecast.temperature > tempHigh) { - tempHigh = forecast.temperature; + if (!tempHigh || fc.temperature > tempHigh) { + tempHigh = fc.temperature; } - if (!tempLow || (forecast.templow && forecast.templow < tempLow)) { - tempLow = forecast.templow; + if (!tempLow || (fc.templow && fc.templow < tempLow)) { + tempLow = fc.templow; } - if (!forecast.templow && (!tempLow || forecast.temperature < tempLow)) { - tempLow = forecast.temperature; + if (!fc.templow && (!tempLow || fc.temperature < tempLow)) { + tempLow = fc.temperature; } } @@ -510,7 +527,7 @@ export const weatherIcon = (state?: string, nightTime?: boolean): string => const DAY_IN_MILLISECONDS = 86400000; -export const isForecastHourly = ( +const isForecastHourly = ( forecast?: ForecastAttribute[] ): boolean | undefined => { if (forecast && forecast?.length && forecast?.length > 2) { @@ -538,3 +555,93 @@ export const getWeatherConvertibleUnits = ( hass.callWS({ type: "weather/convertible_units", }); + +const getLegacyForecast = ( + weather_attributes?: WeatherEntityAttributes | undefined +): + | { + forecast: ForecastAttribute[]; + type: "daily" | "hourly" | "twice_daily"; + } + | undefined => { + if (weather_attributes?.forecast && weather_attributes.forecast.length > 2) { + const hourly = isForecastHourly(weather_attributes.forecast); + if (hourly === true) { + const dateFirst = new Date(weather_attributes.forecast![0].datetime); + const datelast = new Date( + weather_attributes.forecast![ + weather_attributes.forecast!.length - 1 + ].datetime + ); + const dayDiff = datelast.getTime() - dateFirst.getTime(); + const dayNight = dayDiff > DAY_IN_MILLISECONDS; + return { + forecast: weather_attributes.forecast, + type: dayNight ? "twice_daily" : "hourly", + }; + } + return { forecast: weather_attributes.forecast, type: "daily" }; + } + return undefined; +}; + +export const getForecast = ( + weather_attributes?: WeatherEntityAttributes | undefined, + forecast_event?: ForecastEvent, + forecast_type?: ForecastType | undefined +): + | { + forecast: ForecastAttribute[]; + type: "daily" | "hourly" | "twice_daily"; + } + | undefined => { + if (forecast_type === undefined) { + if ( + forecast_event?.type !== undefined && + forecast_event?.forecast && + forecast_event?.forecast?.length > 2 + ) { + return { forecast: forecast_event.forecast, type: forecast_event?.type }; + } + return getLegacyForecast(weather_attributes); + } + + if (forecast_type === "legacy") { + return getLegacyForecast(weather_attributes); + } + + if ( + forecast_type === forecast_event?.type && + forecast_event?.forecast && + forecast_event?.forecast?.length > 2 + ) { + return { forecast: forecast_event.forecast, type: forecast_type }; + } + + return undefined; +}; + +export const subscribeForecast = ( + hass: HomeAssistant, + entity_id: string, + forecast_type: "daily" | "hourly" | "twice_daily", + callback: (forecastevent: ForecastEvent) => void +) => + hass.connection.subscribeMessage(callback, { + type: "weather/subscribe_forecast", + forecast_type, + entity_id, + }); + +export const getDefaultForecastType = (stateObj: HassEntityBase) => { + if (supportsFeature(stateObj, WeatherEntityFeature.FORECAST_DAILY)) { + return "daily"; + } + if (supportsFeature(stateObj, WeatherEntityFeature.FORECAST_HOURLY)) { + return "hourly"; + } + if (supportsFeature(stateObj, WeatherEntityFeature.FORECAST_TWICE_DAILY)) { + return "twice_daily"; + } + return undefined; +}; diff --git a/src/dialogs/more-info/controls/more-info-weather.ts b/src/dialogs/more-info/controls/more-info-weather.ts index 628886339d..f76e2517f1 100644 --- a/src/dialogs/more-info/controls/more-info-weather.ts +++ b/src/dialogs/more-info/controls/more-info-weather.ts @@ -13,15 +13,18 @@ import { PropertyValues, nothing, } from "lit"; -import { customElement, property } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import { formatDateWeekdayDay } from "../../../common/datetime/format_date"; import { formatTimeWeekday } from "../../../common/datetime/format_time"; import { formatNumber } from "../../../common/number/format_number"; import "../../../components/ha-svg-icon"; import { + getDefaultForecastType, + getForecast, getWeatherUnit, getWind, - isForecastHourly, + subscribeForecast, + ForecastEvent, WeatherEntity, weatherIcons, } from "../../../data/weather"; @@ -33,6 +36,48 @@ class MoreInfoWeather extends LitElement { @property() public stateObj?: WeatherEntity; + @state() private _forecastEvent?: ForecastEvent; + + @state() private _subscribed?: Promise<() => void>; + + private _unsubscribeForecastEvents() { + if (this._subscribed) { + this._subscribed.then((unsub) => unsub()); + this._subscribed = undefined; + } + } + + private async _subscribeForecastEvents() { + this._unsubscribeForecastEvents(); + if (!this.isConnected || !this.hass || !this.stateObj) { + return; + } + + const forecastType = getDefaultForecastType(this.stateObj); + if (forecastType) { + this._subscribed = subscribeForecast( + this.hass!, + this.stateObj!.entity_id, + forecastType, + (event) => { + this._forecastEvent = event; + } + ); + } + } + + public connectedCallback() { + super.connectedCallback(); + if (this.hasUpdated) { + this._subscribeForecastEvents(); + } + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + this._unsubscribeForecastEvents(); + } + protected shouldUpdate(changedProps: PropertyValues): boolean { if (changedProps.has("stateObj")) { return true; @@ -50,12 +95,33 @@ class MoreInfoWeather extends LitElement { return false; } + protected updated(changedProps: PropertyValues): void { + super.updated(changedProps); + + if (changedProps.has("stateObj") || !this._subscribed) { + const oldState = changedProps.get("stateObj") as + | WeatherEntity + | undefined; + if ( + oldState?.entity_id !== this.stateObj?.entity_id || + !this._subscribed + ) { + this._subscribeForecastEvents(); + } + } + } + protected render() { if (!this.hass || !this.stateObj) { return nothing; } - const hourly = isForecastHourly(this.stateObj.attributes.forecast); + const forecastData = getForecast( + this.stateObj.attributes, + this._forecastEvent + ); + const forecast = forecastData?.forecast; + const hourly = forecastData?.type === "hourly"; return html` ${this._showValue(this.stateObj.attributes.temperature) @@ -144,12 +210,12 @@ class MoreInfoWeather extends LitElement {
    ` : ""} - ${this.stateObj.attributes.forecast + ${forecast ? html`
    ${this.hass.localize("ui.card.weather.forecast")}:
    - ${this.stateObj.attributes.forecast.map((item) => + ${forecast.map((item) => this._showValue(item.templow) || this._showValue(item.temperature) ? html`
    ${item.condition @@ -176,6 +242,9 @@ class MoreInfoWeather extends LitElement { this.hass.locale, this.hass.config )} + ${item.is_daytime !== false + ? this.hass!.localize("ui.card.weather.day") + : this.hass!.localize("ui.card.weather.night")}
    `}
    diff --git a/src/panels/lovelace/cards/hui-weather-forecast-card.ts b/src/panels/lovelace/cards/hui-weather-forecast-card.ts index 85f29fc0a4..b5ee99fc86 100644 --- a/src/panels/lovelace/cards/hui-weather-forecast-card.ts +++ b/src/panels/lovelace/cards/hui-weather-forecast-card.ts @@ -20,11 +20,13 @@ import "../../../components/ha-svg-icon"; import { UNAVAILABLE } from "../../../data/entity"; import { ActionHandlerEvent } from "../../../data/lovelace"; import { + getForecast, getSecondaryWeatherAttribute, getWeatherStateIcon, getWeatherUnit, getWind, - isForecastHourly, + subscribeForecast, + ForecastEvent, weatherAttrIcons, WeatherEntity, weatherSVGStyles, @@ -41,8 +43,6 @@ import type { LovelaceCard, LovelaceCardEditor } from "../types"; import type { WeatherForecastCardConfig } from "./types"; import { formatDateWeekdayShort } from "../../../common/datetime/format_date"; -const DAY_IN_MILLISECONDS = 86400000; - @customElement("hui-weather-forecast-card") class HuiWeatherForecastCard extends LitElement implements LovelaceCard { public static async getConfigElement(): Promise { @@ -72,13 +72,54 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { @state() private _config?: WeatherForecastCardConfig; + @state() private _forecastEvent?: ForecastEvent; + + @state() private _subscribed?: Promise<() => void>; + @property({ type: Boolean, reflect: true, attribute: "veryverynarrow" }) private _veryVeryNarrow = false; private _resizeObserver?: ResizeObserver; + private _needForecastSubscription() { + return ( + this._config!.forecast_type && this._config!.forecast_type !== "legacy" + ); + } + + private _unsubscribeForecastEvents() { + if (this._subscribed) { + this._subscribed.then((unsub) => unsub()); + this._subscribed = undefined; + } + } + + private async _subscribeForecastEvents() { + this._unsubscribeForecastEvents(); + if ( + !this.isConnected || + !this.hass || + !this._config || + !this._needForecastSubscription() + ) { + return; + } + + this._subscribed = subscribeForecast( + this.hass!, + this._config!.entity, + this._config!.forecast_type as "daily" | "hourly" | "twice_daily", + (event) => { + this._forecastEvent = event; + } + ); + } + public connectedCallback(): void { super.connectedCallback(); + if (this.hasUpdated && this._config && this.hass) { + this._subscribeForecastEvents(); + } this.updateComplete.then(() => this._attachObserver()); } @@ -86,6 +127,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { if (this._resizeObserver) { this._resizeObserver.disconnect(); } + this._unsubscribeForecastEvents(); } public getCardSize(): number { @@ -111,7 +153,10 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { } protected shouldUpdate(changedProps: PropertyValues): boolean { - return hasConfigOrEntityChanged(this, changedProps); + return ( + hasConfigOrEntityChanged(this, changedProps) || + changedProps.has("forecastEvent") + ); } public willUpdate(): void { @@ -130,6 +175,10 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { return; } + if (changedProps.has("_config") || !this._subscribed) { + this._subscribeForecastEvents(); + } + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; const oldConfig = changedProps.get("_config") as | WeatherForecastCardConfig @@ -172,23 +221,19 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { `; } + const forecastData = getForecast( + stateObj.attributes, + this._forecastEvent, + this._config?.forecast_type + ); const forecast = - this._config?.show_forecast !== false && - stateObj.attributes.forecast?.length - ? stateObj.attributes.forecast.slice(0, this._veryVeryNarrow ? 3 : 5) + this._config?.show_forecast !== false && forecastData?.forecast?.length + ? forecastData.forecast.slice(0, this._veryVeryNarrow ? 3 : 5) : undefined; const weather = !forecast || this._config?.show_current !== false; - const hourly = isForecastHourly(forecast); - let dayNight: boolean | undefined; - - if (hourly) { - const dateFirst = new Date(forecast![0].datetime); - const datelast = new Date(forecast![forecast!.length - 1].datetime); - const dayDiff = datelast.getTime() - dateFirst.getTime(); - - dayNight = dayDiff > DAY_IN_MILLISECONDS; - } + const hourly = forecastData?.type === "hourly"; + const dayNight = forecastData?.type === "twice_daily"; const weatherStateIcon = getWeatherStateIcon(stateObj.state, this); const name = this._config.name ?? computeStateName(stateObj); @@ -285,7 +330,11 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { )} `} ` - : getSecondaryWeatherAttribute(this.hass, stateObj)} + : getSecondaryWeatherAttribute( + this.hass, + stateObj, + forecast! + )}
    @@ -308,7 +357,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { { weekday: "short" } )}
    - ${item.daytime === undefined || item.daytime + ${item.is_daytime !== false ? this.hass!.localize( "ui.card.weather.day" ) @@ -340,7 +389,8 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard { item.condition!, this, !( - item.daytime || item.daytime === undefined + item.is_daytime || + item.is_daytime === undefined ) )}
    diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index 082b6c4b53..0a7c8ee412 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -12,6 +12,7 @@ import { import { LovelaceHeaderFooterConfig } from "../header-footer/types"; import { HaDurationData } from "../../../components/ha-duration-input"; import { LovelaceTileFeatureConfig } from "../tile-features/types"; +import { ForecastType } from "../../../data/weather"; export interface AlarmPanelCardConfig extends LovelaceCardConfig { entity: string; @@ -444,6 +445,7 @@ export interface WeatherForecastCardConfig extends LovelaceCardConfig { name?: string; show_current?: boolean; show_forecast?: boolean; + forecast_type?: ForecastType; secondary_info_attribute?: keyof TranslationDict["ui"]["card"]["weather"]["attributes"]; theme?: string; tap_action?: ActionConfig; diff --git a/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts index 2be07c183b..a758959aeb 100644 --- a/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-weather-forecast-card-editor.ts @@ -7,12 +7,14 @@ import type { LocalizeFunc } from "../../../../common/translations/localize"; import "../../../../components/ha-form/ha-form"; import type { SchemaUnion } from "../../../../components/ha-form/types"; import { UNAVAILABLE } from "../../../../data/entity"; -import type { WeatherEntity } from "../../../../data/weather"; +import type { ForecastType, WeatherEntity } from "../../../../data/weather"; +import { WeatherEntityFeature } from "../../../../data/weather"; import type { HomeAssistant } from "../../../../types"; import type { WeatherForecastCardConfig } from "../../cards/types"; import type { LovelaceCardEditor } from "../../types"; import { actionConfigStruct } from "../structs/action-struct"; import { baseLovelaceCardConfig } from "../structs/base-card-struct"; +import { supportsFeature } from "../../../../common/entity/supports-feature"; const cardConfigStruct = assign( baseLovelaceCardConfig, @@ -22,6 +24,7 @@ const cardConfigStruct = assign( theme: optional(string()), show_current: optional(boolean()), show_forecast: optional(boolean()), + forecast_type: optional(string()), secondary_info_attribute: optional(string()), tap_action: optional(actionConfigStruct), hold_action: optional(actionConfigStruct), @@ -44,7 +47,7 @@ export class HuiWeatherForecastCardEditor if ( /* cannot show forecast in case it is unavailable on the entity */ - (config.show_forecast === true && this._has_forecast === false) || + (config.show_forecast === true && this._hasForecast === false) || /* cannot hide both weather and forecast, need one of them */ (config.show_current === false && config.show_forecast === false) ) { @@ -53,20 +56,72 @@ export class HuiWeatherForecastCardEditor config: { ...config, show_current: true, show_forecast: false }, }); } + if ( + !config.forecast_type || + !this._forecastSupported(config.forecast_type) + ) { + let forecastType: string | undefined; + if (this._forecastSupported("daily")) { + forecastType = "daily"; + } else if (this._forecastSupported("hourly")) { + forecastType = "hourly"; + } else if (this._forecastSupported("twice_daily")) { + forecastType = "twice_daily"; + } else if (this._forecastSupported("legacy")) { + forecastType = "legacy"; + } + fireEvent(this, "config-changed", { + config: { ...config, forecast_type: forecastType }, + }); + } } - get _has_forecast(): boolean | undefined { + private get _stateObj(): WeatherEntity | undefined { if (this.hass && this._config) { - const stateObj = this.hass.states[this._config.entity] as WeatherEntity; - if (stateObj && stateObj.state !== UNAVAILABLE) { - return !!stateObj.attributes.forecast?.length; - } + return this.hass.states[this._config.entity] as WeatherEntity; } return undefined; } + private get _hasForecast(): boolean | undefined { + const stateObj = this._stateObj as WeatherEntity; + if (stateObj && stateObj.state !== UNAVAILABLE) { + return !!( + stateObj.attributes.forecast?.length || + stateObj.attributes.supported_features + ); + } + return undefined; + } + + private _forecastSupported(forecastType: ForecastType): boolean { + const stateObj = this._stateObj as WeatherEntity; + if (forecastType === "legacy") { + return !!stateObj.attributes.forecast?.length; + } + if (forecastType === "daily") { + return supportsFeature(stateObj, WeatherEntityFeature.FORECAST_DAILY); + } + if (forecastType === "hourly") { + return supportsFeature(stateObj, WeatherEntityFeature.FORECAST_HOURLY); + } + if (forecastType === "twice_daily") { + return supportsFeature( + stateObj, + WeatherEntityFeature.FORECAST_TWICE_DAILY + ); + } + return false; + } + private _schema = memoizeOne( - (localize: LocalizeFunc, hasForecast?: boolean) => + ( + localize: LocalizeFunc, + hasForecastLegacy?: boolean, + hasForecastDaily?: boolean, + hasForecastHourly?: boolean, + hasForecastTwiceDaily?: boolean + ) => [ { name: "entity", @@ -86,7 +141,54 @@ export class HuiWeatherForecastCardEditor { name: "theme", selector: { theme: {} } }, ], }, - ...(hasForecast + ...(!hasForecastLegacy && + (hasForecastDaily || hasForecastHourly || hasForecastTwiceDaily) + ? ([ + { + name: "forecast_type", + selector: { + select: { + options: [ + ...(hasForecastDaily + ? ([ + { + value: "daily", + label: localize( + "ui.panel.lovelace.editor.card.weather-forecast.daily" + ), + }, + ] as const) + : []), + ...(hasForecastHourly + ? ([ + { + value: "hourly", + label: localize( + "ui.panel.lovelace.editor.card.weather-forecast.hourly" + ), + }, + ] as const) + : []), + ...(hasForecastTwiceDaily + ? ([ + { + value: "twice_daily", + label: localize( + "ui.panel.lovelace.editor.card.weather-forecast.twice_daily" + ), + }, + ] as const) + : []), + ], + }, + }, + }, + ] as const) + : []), + ...(hasForecastDaily || + hasForecastHourly || + hasForecastTwiceDaily || + hasForecastLegacy ? ([ { name: "forecast", @@ -125,11 +227,17 @@ export class HuiWeatherForecastCardEditor return nothing; } - const schema = this._schema(this.hass.localize, this._has_forecast); + const schema = this._schema( + this.hass.localize, + this._forecastSupported("legacy"), + this._forecastSupported("daily"), + this._forecastSupported("hourly"), + this._forecastSupported("twice_daily") + ); const data: WeatherForecastCardConfig = { show_current: true, - show_forecast: this._has_forecast, + show_forecast: this._hasForecast, ...this._config, }; @@ -184,6 +292,10 @@ export class HuiWeatherForecastCardEditor )} (${this.hass!.localize( "ui.panel.lovelace.editor.card.config.optional" )})`; + case "forecast_type": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.weather-forecast.forecast_type" + ); case "forecast": return this.hass!.localize( "ui.panel.lovelace.editor.card.weather-forecast.weather_to_show" diff --git a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts index f8badf7b10..90351e76d6 100644 --- a/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-weather-entity-row.ts @@ -16,9 +16,13 @@ import "../../../components/entity/state-badge"; import { isUnavailableState } from "../../../data/entity"; import { ActionHandlerEvent } from "../../../data/lovelace"; import { + getDefaultForecastType, + getForecast, getSecondaryWeatherAttribute, getWeatherStateIcon, getWeatherUnit, + subscribeForecast, + ForecastEvent, WeatherEntity, weatherSVGStyles, } from "../../../data/weather"; @@ -38,6 +42,48 @@ class HuiWeatherEntityRow extends LitElement implements LovelaceRow { @state() private _config?: EntitiesCardEntityConfig; + @state() private _forecastEvent?: ForecastEvent; + + @state() private _subscribed?: Promise<() => void>; + + private _unsubscribeForecastEvents() { + if (this._subscribed) { + this._subscribed.then((unsub) => unsub()); + this._subscribed = undefined; + } + } + + private async _subscribeForecastEvents() { + this._unsubscribeForecastEvents(); + if (!this.hass || !this._config || !this.isConnected) { + return; + } + const stateObj = this.hass!.states[this._config!.entity]; + const forecastType = getDefaultForecastType(stateObj); + if (forecastType) { + this._subscribed = subscribeForecast( + this.hass!, + stateObj.entity_id, + forecastType, + (event) => { + this._forecastEvent = event; + } + ); + } + } + + public connectedCallback() { + super.connectedCallback(); + if (this.hasUpdated) { + this._subscribeForecastEvents(); + } + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + this._unsubscribeForecastEvents(); + } + public setConfig(config: EntitiesCardEntityConfig): void { if (!config?.entity) { throw new Error("Entity must be specified"); @@ -50,6 +96,13 @@ class HuiWeatherEntityRow extends LitElement implements LovelaceRow { return hasConfigOrEntityChanged(this, changedProps); } + protected updated(changedProps: PropertyValues): void { + super.updated(changedProps); + if (changedProps.has("_config") || !this._subscribed) { + this._subscribeForecastEvents(); + } + } + protected render() { if (!this.hass || !this._config) { return nothing; @@ -72,6 +125,9 @@ class HuiWeatherEntityRow extends LitElement implements LovelaceRow { const hasSecondary = this._config.secondary_info; const weatherStateIcon = getWeatherStateIcon(stateObj.state, this); + const forecastData = getForecast(stateObj.attributes, this._forecastEvent); + const forecast = forecastData?.forecast; + return html`
    - ${getSecondaryWeatherAttribute(this.hass!, stateObj)} + ${getSecondaryWeatherAttribute(this.hass!, stateObj, forecast!)}
    `; diff --git a/src/translations/en.json b/src/translations/en.json index cad64bcb46..a77a941d7e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -254,6 +254,9 @@ "day": "Day", "night": "Night", "forecast": "Forecast", + "forecast_daily": "Forecast daily", + "forecast_hourly": "Forecast hourly", + "forecast_twice_daily": "Forecast twice daily", "high": "High", "low": "Low" } @@ -4975,7 +4978,12 @@ "weather_to_show": "Weather to Show", "show_both": "Show current Weather and Forecast", "show_only_current": "Show only current Weather", - "show_only_forecast": "Show only Forecast" + "show_only_forecast": "Show only Forecast", + "forecast_type": "Select forecast type", + "no_type": "No type", + "daily": "Daily", + "hourly": "Hourly", + "twice_daily": "Twice daily" } }, "view": { From c7cf49de05529f13a0ef59f291ee8bb0c4cd6e06 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 23:25:23 -0400 Subject: [PATCH 093/102] Update dependency hls.js to v1.4.10 (#17383) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 77c8b240f6..64be316ada 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "deep-freeze": "0.0.1", "fuse.js": "6.6.2", "google-timezones-json": "1.2.0", - "hls.js": "1.4.9", + "hls.js": "1.4.10", "home-assistant-js-websocket": "8.2.0", "idb-keyval": "6.2.1", "intl-messageformat": "10.5.0", diff --git a/yarn.lock b/yarn.lock index 74c0ef4897..a15e2150f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9593,10 +9593,10 @@ __metadata: languageName: node linkType: hard -"hls.js@npm:1.4.9": - version: 1.4.9 - resolution: "hls.js@npm:1.4.9" - checksum: 51e469eb99e7093a1b71a7531731d9da8609104730f1030797d25c4e25d9d7d8a6d22603921cb9a9ee6ab26b28c569e91c68a37be92dc1f34bc58e0c5af65b99 +"hls.js@npm:1.4.10": + version: 1.4.10 + resolution: "hls.js@npm:1.4.10" + checksum: c084000598fd7422b7445c7e313dc28133261579b5783bbb3881c7fcb609365d02157e3d3a74d0b41ac7440de405d1c69e64e14634370dc357c473d23e4afd44 languageName: node linkType: hard @@ -9753,7 +9753,7 @@ __metadata: gulp-merge-json: 2.1.2 gulp-rename: 2.0.0 gulp-zopfli-green: 6.0.1 - hls.js: 1.4.9 + hls.js: 1.4.10 home-assistant-js-websocket: 8.2.0 html-minifier-terser: 7.2.0 husky: 8.0.3 From e21f95136818a79565927244f91729f521962bff Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Sat, 22 Jul 2023 13:52:57 -0400 Subject: [PATCH 094/102] Enable cache in CI and locally for ESLint and Prettier (#17384) --- .github/workflows/ci.yaml | 8 ++++++++ lint-staged.config.js | 7 +++++-- package.json | 8 ++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 94f4e6413a..a7a7da4f92 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -36,6 +36,14 @@ jobs: run: yarn dedupe --check - name: Build resources run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages + - name: Setup lint cache + uses: actions/cache@v3.3.1 + with: + path: | + node_modules/.cache/prettier + node_modules/.cache/eslint + key: lint-${{ github.sha }} + restore-keys: lint- - name: Run eslint run: yarn run lint:eslint --quiet - name: Run tsc diff --git a/lint-staged.config.js b/lint-staged.config.js index 27204507ea..8740aaab19 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,6 +1,9 @@ export default { - "*.?(c|m){js,ts}": ["eslint --fix", "prettier --write"], - "*.{json,css,md,markdown,html,y?aml}": "prettier --write", + "*.?(c|m){js,ts}": [ + "eslint --cache --cache-strategy=content --cache-location=node_modules/.cache/eslint/.eslintcache --fix", + "prettier --cache --write", + ], + "*.{json,css,md,markdown,html,y?aml}": "prettier --cache --write", "translations/*/*.json": (files) => 'printf "%s\n" "Translation files should not be added or modified here. Instead, make the necessary modifications in src/translations/en.json. Other languages are managed externally. Please see https://developers.home-assistant.io/docs/translations/ for details." ' + files.join(" ") + diff --git a/package.json b/package.json index 64be316ada..a44afdb38b 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ "version": "1.0.0", "scripts": { "build": "script/build_frontend", - "lint:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --ignore-path .gitignore", - "format:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --fix --ignore-path .gitignore", - "lint:prettier": "prettier . --check", - "format:prettier": "prettier . --write", + "lint:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --cache --cache-strategy=content --cache-location=node_modules/.cache/eslint/.eslintcache --ignore-path=.gitignore", + "format:eslint": "eslint \"**/src/**/*.{js,ts,html}\" --cache --cache-strategy=content --cache-location=node_modules/.cache/eslint/.eslintcache --ignore-path=.gitignore --fix", + "lint:prettier": "prettier . --cache --check", + "format:prettier": "prettier . --cache --write", "lint:types": "tsc", "lint:lit": "lit-analyzer \"**/src/**/*.ts\" --format markdown --outFile result.md", "lint": "yarn run lint:eslint && yarn run lint:prettier && yarn run lint:types", From d6e279e8f4e1f4266b45ba73ee31141c5a698c64 Mon Sep 17 00:00:00 2001 From: Miguel Camba Date: Sun, 23 Jul 2023 18:50:40 +0200 Subject: [PATCH 095/102] Add device_class PH, including default icon (#17385) --- gallery/src/pages/misc/entity-state.ts | 1 + src/common/const.ts | 2 ++ src/common/entity/get_states.ts | 1 + 3 files changed, 4 insertions(+) diff --git a/gallery/src/pages/misc/entity-state.ts b/gallery/src/pages/misc/entity-state.ts index c35c9fae1e..8a738ca873 100644 --- a/gallery/src/pages/misc/entity-state.ts +++ b/gallery/src/pages/misc/entity-state.ts @@ -35,6 +35,7 @@ const SENSOR_DEVICE_CLASSES = [ "nitrogen_monoxide", "nitrous_oxide", "ozone", + "ph", "pm1", "pm10", "pm25", diff --git a/src/common/const.ts b/src/common/const.ts index 7902662135..56b632d4be 100644 --- a/src/common/const.ts +++ b/src/common/const.ts @@ -45,6 +45,7 @@ import { mdiMoleculeCo, mdiMoleculeCo2, mdiPalette, + mdiPh, mdiProgressClock, mdiRayVertex, mdiRemote, @@ -148,6 +149,7 @@ export const FIXED_DEVICE_CLASS_ICONS = { nitrogen_monoxide: mdiMolecule, nitrous_oxide: mdiMolecule, ozone: mdiMolecule, + ph: mdiPh, pm1: mdiMolecule, pm10: mdiMolecule, pm25: mdiMolecule, diff --git a/src/common/entity/get_states.ts b/src/common/entity/get_states.ts index 7eaf7bfb81..17140b2166 100644 --- a/src/common/entity/get_states.ts +++ b/src/common/entity/get_states.ts @@ -186,6 +186,7 @@ const FIXED_DOMAIN_ATTRIBUTE_STATES = { "nitrogen_monoxide", "nitrous_oxide", "ozone", + "ph", "pm1", "pm10", "pm25", From 2c7e17ce89002235e3ed15d8f812fdafb3642ebf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 01:17:23 -0400 Subject: [PATCH 096/102] Update dependency @types/luxon to v3.3.1 (#17396) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a44afdb38b..5bd5b18910 100644 --- a/package.json +++ b/package.json @@ -176,7 +176,7 @@ "@types/js-yaml": "4.0.5", "@types/leaflet": "1.9.3", "@types/leaflet-draw": "1.0.7", - "@types/luxon": "3.3.0", + "@types/luxon": "3.3.1", "@types/marked": "4.3.1", "@types/mocha": "10.0.1", "@types/qrcode": "1.5.1", diff --git a/yarn.lock b/yarn.lock index a15e2150f2..8364390247 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4415,10 +4415,10 @@ __metadata: languageName: node linkType: hard -"@types/luxon@npm:3.3.0": - version: 3.3.0 - resolution: "@types/luxon@npm:3.3.0" - checksum: f7e3a89fc3ca404fbc3ea538653ed6860bc28f570a8c4d6d24449b89b9b553b7d6ad6cc94a9e129c5b8c9a2b97f0c365b3017f811e59c4a859a9c219a1c918e0 +"@types/luxon@npm:3.3.1": + version: 3.3.1 + resolution: "@types/luxon@npm:3.3.1" + checksum: da8f6158edacae1430f3eca5f4ab4891200ffb34aa521ef6bae407a3c50b3854907098bc4535fb2a66a2779738f3c6c48fdfd86f01117a6f4844b18536cdb7c0 languageName: node linkType: hard @@ -9697,7 +9697,7 @@ __metadata: "@types/js-yaml": 4.0.5 "@types/leaflet": 1.9.3 "@types/leaflet-draw": 1.0.7 - "@types/luxon": 3.3.0 + "@types/luxon": 3.3.1 "@types/marked": 4.3.1 "@types/mocha": 10.0.1 "@types/qrcode": 1.5.1 From 4fd5dfd6ae5b991c7250e4040ed7f68666d39bc0 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 24 Jul 2023 15:57:13 +0200 Subject: [PATCH 097/102] Add My support for companion app settings (#17398) --- src/panels/my/ha-panel-my.ts | 24 ++++++++++++++++++++++++ src/translations/en.json | 2 ++ 2 files changed, 26 insertions(+) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index a083079f41..9810837ccf 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -51,6 +51,9 @@ export const getMyRedirects = (hasSupervisor: boolean): Redirects => ({ component: "calendar", redirect: "/calendar", }, + companion_app: { + redirect: "#external-app-configuration", + }, config: { redirect: "/config/dashboard", }, @@ -323,6 +326,15 @@ class HaPanelMy extends LitElement { return; } + if (this._redirect.redirect === "#external-app-configuration") { + if (this.hass.auth.external?.config.hasSettingsScreen) { + this.hass.auth.external!.fireMessage({ type: "config_screen/show" }); + return; + } + this._error = "not_app"; + return; + } + if ( this._redirect.component && !isComponentLoaded(this.hass, this._redirect.component) @@ -410,6 +422,18 @@ class HaPanelMy extends LitElement { >` ); break; + case "not_app": + error = this.hass.localize( + "ui.panel.my.not_app", + "link", + html`${this.hass.localize("ui.panel.my.download_app")}` + ); + break; default: error = this.hass.localize("ui.panel.my.error") || "Unknown error"; } diff --git a/src/translations/en.json b/src/translations/en.json index a77a941d7e..8834f0583e 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1473,7 +1473,9 @@ "not_supported": "This redirect is not supported by your Home Assistant instance. Check the {link} for the supported redirects and the version they where introduced.", "component_not_loaded": "This redirect is not supported by your Home Assistant instance. You need the integration {integration} to use this redirect.", "no_supervisor": "This redirect is not supported by your Home Assistant installation. It needs either the Home Assistant Operating System or Home Assistant Supervised installation method. For more information, see the {docs_link}.", + "not_app": "This redirect only works from a mobile device that has the Home Assistant Companion app installed. {link}.", "documentation": "documentation", + "download_app": "Click here to download the app", "faq_link": "My Home Assistant FAQ", "error": "An unknown error occurred" }, From 02f01aba0e01560a871ac7a5d429d5037e8998d5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:35:43 -0400 Subject: [PATCH 098/102] Update vaadinWebComponents monorepo to v24.1.4 (#17397) --- package.json | 4 +- yarn.lock | 166 +++++++++++++++++++++++++-------------------------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/package.json b/package.json index 5bd5b18910..c8d3aa3f88 100644 --- a/package.json +++ b/package.json @@ -94,8 +94,8 @@ "@polymer/paper-toast": "3.0.1", "@polymer/polymer": "3.5.1", "@thomasloven/round-slider": "0.6.0", - "@vaadin/combo-box": "24.1.3", - "@vaadin/vaadin-themable-mixin": "24.1.3", + "@vaadin/combo-box": "24.1.4", + "@vaadin/vaadin-themable-mixin": "24.1.4", "@vibrant/color": "3.2.1-alpha.1", "@vibrant/core": "3.2.1-alpha.1", "@vibrant/quantizer-mmcq": "3.2.1-alpha.1", diff --git a/yarn.lock b/yarn.lock index 8364390247..cd99f0bce9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4781,126 +4781,126 @@ __metadata: languageName: node linkType: hard -"@vaadin/a11y-base@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/a11y-base@npm:24.1.3" +"@vaadin/a11y-base@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/a11y-base@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~24.1.3 + "@vaadin/component-base": ~24.1.4 lit: ^2.0.0 - checksum: f2e365ea5d77bec664e02499dde31ff12b7e636bc726d33944afd428cf8c613f5d0adb1fb29237caebba0937bafe1a8027e950246ecba822545c3a9079e56aaa + checksum: 1b5ddc2af1418c530d12ac00cd1ad9f896ef118730157c901662906409806ef6a46d18be4daf9d883784727c8ce4186700c0fdfa3ccc521c58693e494be98cc0 languageName: node linkType: hard -"@vaadin/combo-box@npm:24.1.3": - version: 24.1.3 - resolution: "@vaadin/combo-box@npm:24.1.3" +"@vaadin/combo-box@npm:24.1.4": + version: 24.1.4 + resolution: "@vaadin/combo-box@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.3 - "@vaadin/component-base": ~24.1.3 - "@vaadin/field-base": ~24.1.3 - "@vaadin/input-container": ~24.1.3 - "@vaadin/item": ~24.1.3 - "@vaadin/lit-renderer": ~24.1.3 - "@vaadin/overlay": ~24.1.3 - "@vaadin/vaadin-lumo-styles": ~24.1.3 - "@vaadin/vaadin-material-styles": ~24.1.3 - "@vaadin/vaadin-themable-mixin": ~24.1.3 - checksum: a31da1b4694a6d322156bb59af06b07bfdb6b7cbb8bb91ecc96d20969b42cfd70353faa2f44bc63e9ed97cfd20e29e8399402d885a70a0620588de9a73146e1d + "@vaadin/a11y-base": ~24.1.4 + "@vaadin/component-base": ~24.1.4 + "@vaadin/field-base": ~24.1.4 + "@vaadin/input-container": ~24.1.4 + "@vaadin/item": ~24.1.4 + "@vaadin/lit-renderer": ~24.1.4 + "@vaadin/overlay": ~24.1.4 + "@vaadin/vaadin-lumo-styles": ~24.1.4 + "@vaadin/vaadin-material-styles": ~24.1.4 + "@vaadin/vaadin-themable-mixin": ~24.1.4 + checksum: 598800430645af9c5da1b6195ee326827d0069c31219a3c48145c877f8c08e739b5c68261cd54f3b6d1e6d34cac33165f643744594ff1737731e8fa2f7b2a9e0 languageName: node linkType: hard -"@vaadin/component-base@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/component-base@npm:24.1.3" +"@vaadin/component-base@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/component-base@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 "@vaadin/vaadin-development-mode-detector": ^2.0.0 "@vaadin/vaadin-usage-statistics": ^2.1.0 lit: ^2.0.0 - checksum: 069c50059ea57c48e4ca02dee2e5624decadce90304c62bd32195beb368afd59a67e88c669fe6f31fb840bd8b3c5c7901d83787f50816cbb55b01f4488556700 + checksum: dc0d4dfa898fb37103cc52e385dc98f14d074e4bc846f377ef391e24b14317c4cca939667aa4e67984815021d89706fc70183e62cbaa3cd98f5168d254492db2 languageName: node linkType: hard -"@vaadin/field-base@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/field-base@npm:24.1.3" +"@vaadin/field-base@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/field-base@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.3 - "@vaadin/component-base": ~24.1.3 + "@vaadin/a11y-base": ~24.1.4 + "@vaadin/component-base": ~24.1.4 lit: ^2.0.0 - checksum: bc06b5b4da182c2917108657557de379ffe79b38fd61d0dc28f872420b48c63eceed92410618513a0c19a35be06cc07367bf7d1cc570f8489b2adf5bc5355a6b + checksum: 6767702f0b501a7463eb17d0254410d49ede194b9c46dbc784db1dc9aa454e4dd79094e1c6166f31ee6c913b3532eda4c12a9dbd7ef51ca6c5a407050b322788 languageName: node linkType: hard -"@vaadin/icon@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/icon@npm:24.1.3" +"@vaadin/icon@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/icon@npm:24.1.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~24.1.3 - "@vaadin/vaadin-lumo-styles": ~24.1.3 - "@vaadin/vaadin-themable-mixin": ~24.1.3 + "@vaadin/component-base": ~24.1.4 + "@vaadin/vaadin-lumo-styles": ~24.1.4 + "@vaadin/vaadin-themable-mixin": ~24.1.4 lit: ^2.0.0 - checksum: 0901f6e558d440f672e6ca80995f6fdcc4ec06fe1f8cf57f305a029213138299b472c1bf23755d5b539335bd6ff0c9d218a55d4f1de3c068da6427322b6e9634 + checksum: 880476ab0ba49bfdc4402a3c3facedd17673dd2c5b85c8e0240ac780c5a889c8c7bc2297ec0479e1551c50dd1e7d01d68ca9c24eb140a1f2daa5d43782d8e747 languageName: node linkType: hard -"@vaadin/input-container@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/input-container@npm:24.1.3" +"@vaadin/input-container@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/input-container@npm:24.1.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~24.1.3 - "@vaadin/vaadin-lumo-styles": ~24.1.3 - "@vaadin/vaadin-material-styles": ~24.1.3 - "@vaadin/vaadin-themable-mixin": ~24.1.3 - checksum: 429387239df99d36685b31d1264e4c4d04b2085c80da43cd0ae01836bce2ad7cbddcc557eca517b39686581622f8589b0d08f90026ad4d5cf34993b85eb96de2 + "@vaadin/component-base": ~24.1.4 + "@vaadin/vaadin-lumo-styles": ~24.1.4 + "@vaadin/vaadin-material-styles": ~24.1.4 + "@vaadin/vaadin-themable-mixin": ~24.1.4 + checksum: 1851ac7a85bbaf02fbcbe3de99efe94aee2921873d5226b48d77a42d35cdf2d5f6f99b0a8bce9c559f90edfcb79efbe47e486db3bfe2991071af1f271d10a07d languageName: node linkType: hard -"@vaadin/item@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/item@npm:24.1.3" +"@vaadin/item@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/item@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.3 - "@vaadin/component-base": ~24.1.3 - "@vaadin/vaadin-lumo-styles": ~24.1.3 - "@vaadin/vaadin-material-styles": ~24.1.3 - "@vaadin/vaadin-themable-mixin": ~24.1.3 - checksum: f6b89f9efb1c25a41f387a2585c5ef7d51058607a33f431456d539aa48b0fb3d655aee069a47418632c046c2064f08157113779979041a68b5b9ce9ef3504a2b + "@vaadin/a11y-base": ~24.1.4 + "@vaadin/component-base": ~24.1.4 + "@vaadin/vaadin-lumo-styles": ~24.1.4 + "@vaadin/vaadin-material-styles": ~24.1.4 + "@vaadin/vaadin-themable-mixin": ~24.1.4 + checksum: 5694a54c156516a41be7c92f7486fe417b227caaa39186322720426d9586d87f17775faae11ec8d16d249826c9b0cf753ed7061b2d4b9ac2cbcb614ce4b35714 languageName: node linkType: hard -"@vaadin/lit-renderer@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/lit-renderer@npm:24.1.3" +"@vaadin/lit-renderer@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/lit-renderer@npm:24.1.4" dependencies: lit: ^2.0.0 - checksum: 2a906603ab8775de8be91323b9b5c820730531231c7ba82c655cba4bca411ef1aeb8679a440f888bf6b9577463ff54584bb61a668ee468dfd7d9755aee088337 + checksum: ac69537651be8733de209333cbbdd1b5b6e17394d6869d7de8c6b06bd63952a478de1f72120dfe826a72073788094032f5284d8cdbe19de5edf57a836de476b0 languageName: node linkType: hard -"@vaadin/overlay@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/overlay@npm:24.1.3" +"@vaadin/overlay@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/overlay@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/a11y-base": ~24.1.3 - "@vaadin/component-base": ~24.1.3 - "@vaadin/vaadin-lumo-styles": ~24.1.3 - "@vaadin/vaadin-material-styles": ~24.1.3 - "@vaadin/vaadin-themable-mixin": ~24.1.3 - checksum: e210a9b8cbb3edebea48dea196b95cc1369d2ceddeb0ba6bfb094b31147514f6e6a08c6f3a86d99e36a5e7b08e9913f5df3f89384e6907abca4eb3de2f33e68b + "@vaadin/a11y-base": ~24.1.4 + "@vaadin/component-base": ~24.1.4 + "@vaadin/vaadin-lumo-styles": ~24.1.4 + "@vaadin/vaadin-material-styles": ~24.1.4 + "@vaadin/vaadin-themable-mixin": ~24.1.4 + checksum: 44a664cd249b66345240a1ab6cd9c466f7d43c496a13c6d30d2cfdc1e67550f4b8562d43b16d0b974a2dc61bbde5d10671a63f97b9171f71ca75cb4d7de684cf languageName: node linkType: hard @@ -4911,34 +4911,34 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-lumo-styles@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/vaadin-lumo-styles@npm:24.1.3" +"@vaadin/vaadin-lumo-styles@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/vaadin-lumo-styles@npm:24.1.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/icon": ~24.1.3 - "@vaadin/vaadin-themable-mixin": ~24.1.3 - checksum: 54d94bde98a2c15e7410ada28f082e43c8db9d1d5ce0a5255f02467ff7db706c805d425c5d172d545fe844a4ced147f8828b50a6cff7bea8732d6cecf4fc1211 + "@vaadin/icon": ~24.1.4 + "@vaadin/vaadin-themable-mixin": ~24.1.4 + checksum: 358dfa2ca955d86119b675e4e32982a51be12327fd675cdf3601b79a9fc9c8388e31299e593aabc62bb72afb17ba3856b904dfbecd7408f82719c9ce015fd883 languageName: node linkType: hard -"@vaadin/vaadin-material-styles@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/vaadin-material-styles@npm:24.1.3" +"@vaadin/vaadin-material-styles@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/vaadin-material-styles@npm:24.1.4" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-themable-mixin": ~24.1.3 - checksum: c1af4802118864fc37a0019c4369de9f05c570382982f1cc79e96f46617860e2db453d707d3671e133d66ca3040d741ec3a414af44eabb1375fb3cf15d951e2a + "@vaadin/vaadin-themable-mixin": ~24.1.4 + checksum: 0289b667dbf54d2a81ffb74dd1caeccefed7cd7e0d02163c31775ab03f5d8fb15647578c4744592d753a2657b47216f221468f19f497d920e21f443e84699bf4 languageName: node linkType: hard -"@vaadin/vaadin-themable-mixin@npm:24.1.3, @vaadin/vaadin-themable-mixin@npm:~24.1.3": - version: 24.1.3 - resolution: "@vaadin/vaadin-themable-mixin@npm:24.1.3" +"@vaadin/vaadin-themable-mixin@npm:24.1.4, @vaadin/vaadin-themable-mixin@npm:~24.1.4": + version: 24.1.4 + resolution: "@vaadin/vaadin-themable-mixin@npm:24.1.4" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 lit: ^2.0.0 - checksum: b6a57ec5ce54907f61be82413494639500fd8ef9ae2dff58628369b9581bc442b88b4356c7ef9f9202ca1cc67677f1d489df56cd0ec2ea96a357976e583f582d + checksum: db2993360d741f50011c0ca3229afb67d6965bd2fcb4915108e8bd462071c82d5f0a60877e250db1611b5712cbb17d3ab97fef932f97c43b63cb15a0357646ea languageName: node linkType: hard @@ -9707,8 +9707,8 @@ __metadata: "@types/webspeechapi": 0.0.29 "@typescript-eslint/eslint-plugin": 6.1.0 "@typescript-eslint/parser": 6.1.0 - "@vaadin/combo-box": 24.1.3 - "@vaadin/vaadin-themable-mixin": 24.1.3 + "@vaadin/combo-box": 24.1.4 + "@vaadin/vaadin-themable-mixin": 24.1.4 "@vibrant/color": 3.2.1-alpha.1 "@vibrant/core": 3.2.1-alpha.1 "@vibrant/quantizer-mmcq": 3.2.1-alpha.1 From 17c9e910926f18ba08f2a9265dde7b0c6fef5afb Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 24 Jul 2023 17:43:20 +0200 Subject: [PATCH 099/102] Adjust default icon of event entity (#17401) --- src/common/entity/domain_icon.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts index eeefc4598c..1ea45fa095 100644 --- a/src/common/entity/domain_icon.ts +++ b/src/common/entity/domain_icon.ts @@ -18,9 +18,9 @@ import { mdiCloseCircleOutline, mdiCrosshairsQuestion, mdiDoorbell, + mdiEyeCheck, mdiFan, mdiFanOff, - mdiGestureTap, mdiGestureTapButton, mdiLanConnect, mdiLanDisconnect, @@ -144,7 +144,7 @@ export const domainIconWithoutDefault = ( case "motion": return mdiMotionSensor; default: - return mdiGestureTap; + return mdiEyeCheck; } case "fan": From 5ed767804ce8dcc72ef22a72e9bd67d12733bc5d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 24 Jul 2023 17:43:31 +0200 Subject: [PATCH 100/102] Complete service translation support in service dev tools (#17399) --- .../service/developer-tools-service.ts | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/panels/developer-tools/service/developer-tools-service.ts b/src/panels/developer-tools/service/developer-tools-service.ts index d0600df766..8ffd198e78 100644 --- a/src/panels/developer-tools/service/developer-tools-service.ts +++ b/src/panels/developer-tools/service/developer-tools-service.ts @@ -58,6 +58,9 @@ class HaPanelDevService extends LitElement { protected firstUpdated(params) { super.firstUpdated(params); + this.hass.loadBackendTranslation("services"); + this.hass.loadBackendTranslation("selector"); + const serviceParam = extractSearchParam("service"); if (serviceParam) { this._serviceData = { @@ -95,6 +98,14 @@ class HaPanelDevService extends LitElement { const isValid = this._isValid(this._serviceData, fields, target); + const domain = this._serviceData?.service + ? computeDomain(this._serviceData?.service) + : undefined; + + const serviceName = this._serviceData?.service + ? computeObjectId(this._serviceData?.service) + : undefined; + return html`

    @@ -251,8 +262,16 @@ class HaPanelDevService extends LitElement { (field) => html`

    ${field.key}
    - ${field.description} - ${field.example} + + ${this.hass.localize( + `component.${domain}.services.${serviceName}.fields.${field.key}.description` + ) || field.description} + + + ${this.hass.localize( + `component.${domain}.services.${serviceName}.fields.${field.key}.example` + ) || field.example} + ` )} @@ -430,6 +449,14 @@ class HaPanelDevService extends LitElement { this.hass.services, this._serviceData?.service ); + const domain = this._serviceData?.service + ? computeDomain(this._serviceData?.service) + : undefined; + + const serviceName = this._serviceData?.service + ? computeObjectId(this._serviceData?.service) + : undefined; + const example = {}; fields.forEach((field) => { if (field.example) { @@ -437,7 +464,10 @@ class HaPanelDevService extends LitElement { try { value = load(field.example); } catch (err: any) { - value = field.example; + value = + this.hass.localize( + `component.${domain}.services.${serviceName}.fields.${field.key}.example` + ) || field.example; } example[field.key] = value; } From 89b5a082e567a33d776774ebb01b4150a7d8bc4c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 11:54:57 -0400 Subject: [PATCH 101/102] Update CodeMirror (#17376) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 6 +++--- yarn.lock | 35 ++++++++++++----------------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index c8d3aa3f88..4689fad4b6 100644 --- a/package.json +++ b/package.json @@ -27,13 +27,13 @@ "dependencies": { "@babel/runtime": "7.22.6", "@braintree/sanitize-url": "6.0.2", - "@codemirror/autocomplete": "6.8.1", + "@codemirror/autocomplete": "6.9.0", "@codemirror/commands": "6.2.4", "@codemirror/language": "6.8.0", - "@codemirror/legacy-modes": "6.3.2", + "@codemirror/legacy-modes": "6.3.3", "@codemirror/search": "6.5.0", "@codemirror/state": "6.2.1", - "@codemirror/view": "6.14.1", + "@codemirror/view": "6.15.3", "@egjs/hammerjs": "2.0.17", "@formatjs/intl-datetimeformat": "6.10.0", "@formatjs/intl-displaynames": "6.5.0", diff --git a/yarn.lock b/yarn.lock index cd99f0bce9..8ade02b4c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1452,9 +1452,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/autocomplete@npm:6.8.1": - version: 6.8.1 - resolution: "@codemirror/autocomplete@npm:6.8.1" +"@codemirror/autocomplete@npm:6.9.0": + version: 6.9.0 + resolution: "@codemirror/autocomplete@npm:6.9.0" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 @@ -1465,7 +1465,7 @@ __metadata: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: 8599cd91defa3fea5276a7f9aff43ced323d9c4401dfb867e43608ba72ded48cb458256c5c784949a6332c0c20ba2fedac16a5708335cd809d269e4ea5076957 + checksum: a5f661944c75f40b02c90a193c9a459c0fd7e335c0ac5973420c19157dfb46010f573c2b70731591fe477e7a2ad10121ff3ae394a72d450946d7b886c28b0368 languageName: node linkType: hard @@ -1495,12 +1495,12 @@ __metadata: languageName: node linkType: hard -"@codemirror/legacy-modes@npm:6.3.2": - version: 6.3.2 - resolution: "@codemirror/legacy-modes@npm:6.3.2" +"@codemirror/legacy-modes@npm:6.3.3": + version: 6.3.3 + resolution: "@codemirror/legacy-modes@npm:6.3.3" dependencies: "@codemirror/language": ^6.0.0 - checksum: fa5f5477fb9e19267251e2ecd3de8c1a4c2512813555bb60111dce3951f2c3f6080a2985a573b7542534ba1d2c34115f7e39ee23fdf8f6f81db6f8ce447c1efc + checksum: 3cd32b0f011b0a193e0948e5901b625f38aa6d9a8b24344531d6e142eb6fbb3e6cb5969429102044f3d04fbe53c4deaebd9f659c05067a0b18d17766290c9e05 languageName: node linkType: hard @@ -1522,18 +1522,7 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:6.14.1": - version: 6.14.1 - resolution: "@codemirror/view@npm:6.14.1" - dependencies: - "@codemirror/state": ^6.1.4 - style-mod: ^4.0.0 - w3c-keyname: ^2.2.4 - checksum: 19114ee05b3795ebe07a69cf00c36e8351b3500ce105b8412d90e757d459f71370ead3de852f0fda069041803276e6c38e6f1f943f77e85c9b5c279ab7fa1c4a - languageName: node - linkType: hard - -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0": +"@codemirror/view@npm:6.15.3, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0": version: 6.15.3 resolution: "@codemirror/view@npm:6.15.3" dependencies: @@ -9611,13 +9600,13 @@ __metadata: "@babel/preset-typescript": 7.22.5 "@babel/runtime": 7.22.6 "@braintree/sanitize-url": 6.0.2 - "@codemirror/autocomplete": 6.8.1 + "@codemirror/autocomplete": 6.9.0 "@codemirror/commands": 6.2.4 "@codemirror/language": 6.8.0 - "@codemirror/legacy-modes": 6.3.2 + "@codemirror/legacy-modes": 6.3.3 "@codemirror/search": 6.5.0 "@codemirror/state": 6.2.1 - "@codemirror/view": 6.14.1 + "@codemirror/view": 6.15.3 "@egjs/hammerjs": 2.0.17 "@formatjs/intl-datetimeformat": 6.10.0 "@formatjs/intl-displaynames": 6.5.0 From de4d5179181245f76bd8d08f5315b5ca7ac3df7f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 25 Jul 2023 17:35:49 +0200 Subject: [PATCH 102/102] Bumped version to 20230725.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4c2a8ff47e..e3972f0f8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "home-assistant-frontend" -version = "20230705.1" +version = "20230725.0" license = {text = "Apache-2.0"} description = "The Home Assistant frontend" readme = "README.md"