From c7e7e14f325220521b5f9f15e3296d07c8810f8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 04:29:33 +0000 Subject: [PATCH 001/138] Bump eslint-plugin-lit from 1.6.1 to 1.8.2 (#15268) * Bump eslint-plugin-lit from 1.6.1 to 1.8.2 Bumps [eslint-plugin-lit](https://github.com/43081j/eslint-plugin-lit) from 1.6.1 to 1.8.2. - [Release notes](https://github.com/43081j/eslint-plugin-lit/releases) - [Commits](https://github.com/43081j/eslint-plugin-lit/compare/v1.6.1...v1.8.2) --- updated-dependencies: - dependency-name: eslint-plugin-lit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Set new rules to warn for now --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- .eslintrc.json | 10 ++++++++-- package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 8527576da2..644e04a073 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -65,7 +65,10 @@ "import/extensions": [ "error", "ignorePackages", - { "ts": "never", "js": "never" } + { + "ts": "never", + "js": "never" + } ], "no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"], "object-curly-newline": "off", @@ -112,7 +115,10 @@ ], "unused-imports/no-unused-imports": "error", "lit/attribute-value-entities": "off", - "lit/no-template-map": "off" + "lit/no-template-map": "off", + "lit/no-native-attributes": "warn", + "lit/no-this-assign-in-render": "warn", + "lit/prefer-nothing": "warn" }, "plugins": ["disable", "unused-imports"], "processor": "disable/disable" diff --git a/package.json b/package.json index fcfd48f9d4..b7b3bab7bd 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "eslint-import-resolver-webpack": "^0.13.1", "eslint-plugin-disable": "^2.0.3", "eslint-plugin-import": "^2.24.2", - "eslint-plugin-lit": "^1.6.1", + "eslint-plugin-lit": "^1.8.2", "eslint-plugin-unused-imports": "^1.1.5", "eslint-plugin-wc": "^1.4.0", "fancy-log": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 4257048348..5a37c450b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7850,16 +7850,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-lit@npm:^1.6.1": - version: 1.6.1 - resolution: "eslint-plugin-lit@npm:1.6.1" +"eslint-plugin-lit@npm:^1.8.2": + version: 1.8.2 + resolution: "eslint-plugin-lit@npm:1.8.2" dependencies: parse5: ^6.0.1 parse5-htmlparser2-tree-adapter: ^6.0.1 requireindex: ^1.2.0 peerDependencies: eslint: ">= 5" - checksum: 75e4dd2fb074cb600db1aee78196e201196bce21b8983c9bb64eea86c7d24f7013868bf5aa92f3c3f0087e232abf1ddb1954fd2d37d7ba4a897d4d085d9a14eb + checksum: 30c4d60d26734e6974da3b6f4998f9c10a797f63ad123368bb9d1064efcb99ccd255ba9e4efec41f7029a0eaf8196445c3d8cf424cd4ef918faee2b388d474ae languageName: node linkType: hard @@ -9484,7 +9484,7 @@ fsevents@^1.2.7: eslint-import-resolver-webpack: ^0.13.1 eslint-plugin-disable: ^2.0.3 eslint-plugin-import: ^2.24.2 - eslint-plugin-lit: ^1.6.1 + eslint-plugin-lit: ^1.8.2 eslint-plugin-unused-imports: ^1.1.5 eslint-plugin-wc: ^1.4.0 fancy-log: ^2.0.0 From 52d869f5b8bb32d30b95ab5f182a82a31eb929fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:45:05 -0500 Subject: [PATCH 002/138] Bump chai from 4.3.4 to 4.3.7 (#15330) Bumps [chai](https://github.com/chaijs/chai) from 4.3.4 to 4.3.7. - [Release notes](https://github.com/chaijs/chai/releases) - [Changelog](https://github.com/chaijs/chai/blob/4.x.x/History.md) - [Commits](https://github.com/chaijs/chai/compare/v4.3.4...v4.3.7) --- updated-dependencies: - dependency-name: chai dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index b7b3bab7bd..f307f8dce4 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "@web/dev-server": "^0.0.24", "@web/dev-server-rollup": "^0.2.11", "babel-loader": "^9.1.2", - "chai": "^4.3.4", + "chai": "^4.3.7", "del": "^7.0.0", "eslint": "^7.32.0", "eslint-config-airbnb-base": "^14.2.1", diff --git a/yarn.lock b/yarn.lock index 5a37c450b0..2791cccf57 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6352,17 +6352,18 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.4": - version: 4.3.4 - resolution: "chai@npm:4.3.4" +"chai@npm:^4.3.7": + version: 4.3.7 + resolution: "chai@npm:4.3.7" dependencies: assertion-error: ^1.1.0 check-error: ^1.0.2 - deep-eql: ^3.0.1 + deep-eql: ^4.1.2 get-func-name: ^2.0.0 + loupe: ^2.3.1 pathval: ^1.1.1 type-detect: ^4.0.5 - checksum: 772c522b3bfe3fcf0e0e74edfe584cd886b0e85a73126dec750095300e023d4e1ec6d40e3c35a80d2bd8f33dca46c42767a36f5f50f32dca6fa31c88b5f49ab8 + checksum: 0bba7d267848015246a66995f044ce3f0ebc35e530da3cbdf171db744e14cbe301ab913a8d07caf7952b430257ccbb1a4a983c570a7c5748dc537897e5131f7c languageName: node linkType: hard @@ -7165,12 +7166,12 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^3.0.1": - version: 3.0.1 - resolution: "deep-eql@npm:3.0.1" +"deep-eql@npm:^4.1.2": + version: 4.1.3 + resolution: "deep-eql@npm:4.1.3" dependencies: type-detect: ^4.0.0 - checksum: 4f4c9fb79eb994fb6e81d4aa8b063adc40c00f831588aa65e20857d5d52f15fb23034a6576ecf886f7ff6222d5ae42e71e9b7d57113e0715b1df7ea1e812b125 + checksum: 7f6d30cb41c713973dc07eaadded848b2ab0b835e518a88b91bea72f34e08c4c71d167a722a6f302d3a6108f05afd8e6d7650689a84d5d29ec7fe6220420397f languageName: node linkType: hard @@ -9467,7 +9468,7 @@ fsevents@^1.2.7: "@webcomponents/webcomponentsjs": ^2.2.10 app-datepicker: ^5.1.0 babel-loader: ^9.1.2 - chai: ^4.3.4 + chai: ^4.3.7 chart.js: ^3.3.2 comlink: ^4.3.1 core-js: ^3.27.2 @@ -11340,6 +11341,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"loupe@npm:^2.3.1": + version: 2.3.6 + resolution: "loupe@npm:2.3.6" + dependencies: + get-func-name: ^2.0.0 + checksum: cc83f1b124a1df7384601d72d8d1f5fe95fd7a8185469fec48bb2e4027e45243949e7a013e8d91051a138451ff0552310c32aa9786e60b6a30d1e801bdc2163f + languageName: node + linkType: hard + "lower-case@npm:^1.1.1": version: 1.1.4 resolution: "lower-case@npm:1.1.4" From adb65176f02658cb1b48bd0a919b012da9f19744 Mon Sep 17 00:00:00 2001 From: Flavien Charlon Date: Fri, 3 Feb 2023 09:00:54 +0000 Subject: [PATCH 003/138] Fix a coloring issue with climate states (#15325) --- src/components/entity/state-badge.ts | 2 +- src/panels/lovelace/cards/hui-button-card.ts | 2 +- src/panels/lovelace/cards/hui-entity-card.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/entity/state-badge.ts b/src/components/entity/state-badge.ts index ff50844dc2..b0e001e9c2 100644 --- a/src/components/entity/state-badge.ts +++ b/src/components/entity/state-badge.ts @@ -133,7 +133,7 @@ export class StateBadge extends LitElement { } if (stateObj.attributes.hvac_action) { const hvacAction = stateObj.attributes.hvac_action; - if (["heating", "cooling", "drying", "fan"].includes(hvacAction)) { + if (hvacAction in HVAC_ACTION_TO_MODE) { iconStyle.color = stateColorCss( stateObj, HVAC_ACTION_TO_MODE[hvacAction] diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 310d82cce6..dd79487d25 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -323,7 +323,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { } if (stateObj.attributes.hvac_action) { const hvacAction = stateObj.attributes.hvac_action; - if (["heating", "cooling", "drying", "fan"].includes(hvacAction)) { + if (hvacAction in HVAC_ACTION_TO_MODE) { return stateColorCss(stateObj, HVAC_ACTION_TO_MODE[hvacAction]); } return undefined; diff --git a/src/panels/lovelace/cards/hui-entity-card.ts b/src/panels/lovelace/cards/hui-entity-card.ts index 562b62bd39..694f6532da 100644 --- a/src/panels/lovelace/cards/hui-entity-card.ts +++ b/src/panels/lovelace/cards/hui-entity-card.ts @@ -195,7 +195,7 @@ export class HuiEntityCard extends LitElement implements LovelaceCard { private _computeColor(stateObj: HassEntity): string | undefined { if (stateObj.attributes.hvac_action) { const hvacAction = stateObj.attributes.hvac_action; - if (["heating", "cooling", "drying", "fan"].includes(hvacAction)) { + if (hvacAction in HVAC_ACTION_TO_MODE) { return stateColorCss(stateObj, HVAC_ACTION_TO_MODE[hvacAction]); } return undefined; From 1cf140c16cc858b0f5861ae5ce1bbdd5df1679bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Feb 2023 16:16:37 +0100 Subject: [PATCH 004/138] Bump sortablejs from 1.14.0 to 1.15.0 (#15328) Bumps [sortablejs](https://github.com/SortableJS/Sortable) from 1.14.0 to 1.15.0. - [Release notes](https://github.com/SortableJS/Sortable/releases) - [Commits](https://github.com/SortableJS/Sortable/compare/1.14.0...1.15.0) --- updated-dependencies: - dependency-name: sortablejs dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 f307f8dce4..6cd6bfddf0 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "resize-observer-polyfill": "^1.5.1", "roboto-fontface": "^0.10.0", "rrule": "^2.7.1", - "sortablejs": "^1.14.0", + "sortablejs": "^1.15.0", "superstruct": "^1.0.3", "tinykeys": "^1.1.3", "tsparticles": "^1.34.0", diff --git a/yarn.lock b/yarn.lock index 2791cccf57..b3fdc3b922 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9541,7 +9541,7 @@ fsevents@^1.2.7: rrule: ^2.7.1 serve: ^11.3.2 sinon: ^15.0.1 - sortablejs: ^1.14.0 + sortablejs: ^1.15.0 source-map-url: ^0.4.1 superstruct: ^1.0.3 systemjs: ^6.13.0 @@ -14377,10 +14377,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"sortablejs@npm:^1.14.0": - version: 1.14.0 - resolution: "sortablejs@npm:1.14.0" - checksum: 7b9d2cbb0331f3f259b8703a17174ff46a941b6d59c77c75ca05a5bd484bf2b409a9c1d21344f9c933939880450803b254825c7c7d7f88034e8c7e675420b389 +"sortablejs@npm:^1.15.0": + version: 1.15.0 + resolution: "sortablejs@npm:1.15.0" + checksum: bb82223a663484640d317cad510ac987f26b7a443631040407224de1be069afcc6c39048b6d8527f10f269e33595e8128d7de2fac23517c8260470f77f932d55 languageName: node linkType: hard From b277e946c3bd0fed47e654409374bcfcde16cfc2 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Fri, 3 Feb 2023 15:26:17 -0500 Subject: [PATCH 005/138] Rename zwave_js ws API command (#15339) --- src/data/zwave_js.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 336c9824b6..4c0baad80b 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -700,7 +700,7 @@ export const fetchZwaveNodeFirmwareUpdateCapabilities = ( device_id: string ): Promise => hass.callWS({ - type: "zwave_js/get_firmware_update_capabilities", + type: "zwave_js/get_node_firmware_update_capabilities", device_id, }); From 095040af459e3cec3b2cbcb7e7003afd52511311 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 03:47:49 +0000 Subject: [PATCH 006/138] Bump @babel/plugin-proposal-decorators from 7.20.7 to 7.20.13 (#15356) Bumps [@babel/plugin-proposal-decorators](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-decorators) from 7.20.7 to 7.20.13. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.20.13/packages/babel-plugin-proposal-decorators) --- updated-dependencies: - dependency-name: "@babel/plugin-proposal-decorators" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 6cd6bfddf0..5909a19033 100644 --- a/package.json +++ b/package.json @@ -149,7 +149,7 @@ "@babel/core": "^7.20.2", "@babel/plugin-external-helpers": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.20.7", + "@babel/plugin-proposal-decorators": "^7.20.13", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-chaining": "^7.20.7", diff --git a/yarn.lock b/yarn.lock index b3fdc3b922..025e1cb99c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -120,7 +120,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.20.2, @babel/helper-create-class-features-plugin@npm:^7.20.7": +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.20.12, @babel/helper-create-class-features-plugin@npm:^7.20.2": version: 7.20.12 resolution: "@babel/helper-create-class-features-plugin@npm:7.20.12" dependencies: @@ -444,18 +444,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/plugin-proposal-decorators@npm:7.20.7" +"@babel/plugin-proposal-decorators@npm:^7.20.13": + version: 7.20.13 + resolution: "@babel/plugin-proposal-decorators@npm:7.20.13" dependencies: - "@babel/helper-create-class-features-plugin": ^7.20.7 + "@babel/helper-create-class-features-plugin": ^7.20.12 "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-replace-supers": ^7.20.7 "@babel/helper-split-export-declaration": ^7.18.6 "@babel/plugin-syntax-decorators": ^7.19.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0de9134d71a60b165df9b6e66b7c270fb2fa940ad28d7672e5c73fe5e4300a798cbb28d845477e3265a356d5254758735f28d13452f448dd12988ea299cf7e16 + checksum: 445723b410627d52ab2d195589eb9fe5fbd66a00ebfc9bedcf63b6cbfdfc42e163d77ac391f8738ab9f632779e6f2aa427fe468fbbd6661177ef0cdca735a7d5 languageName: node linkType: hard @@ -9359,7 +9359,7 @@ fsevents@^1.2.7: "@babel/core": ^7.20.2 "@babel/plugin-external-helpers": ^7.18.6 "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-decorators": ^7.20.7 + "@babel/plugin-proposal-decorators": ^7.20.13 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 "@babel/plugin-proposal-object-rest-spread": ^7.20.2 "@babel/plugin-proposal-optional-chaining": ^7.20.7 From 2511bad90251727da7a0357a8f09a5e2227940e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 04:01:13 +0000 Subject: [PATCH 007/138] Bump tar from 6.1.11 to 6.1.13 (#15354) * Bump tar from 6.1.11 to 6.1.13 Bumps [tar](https://github.com/npm/node-tar) from 6.1.11 to 6.1.13. - [Release notes](https://github.com/npm/node-tar/releases) - [Changelog](https://github.com/isaacs/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-tar/compare/v6.1.11...v6.1.13) --- updated-dependencies: - dependency-name: tar dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Deduplicate dependencies --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 5909a19033..7f38f131bd 100644 --- a/package.json +++ b/package.json @@ -230,7 +230,7 @@ "sinon": "^15.0.1", "source-map-url": "^0.4.1", "systemjs": "^6.13.0", - "tar": "^6.1.11", + "tar": "^6.1.13", "terser-webpack-plugin": "^5.2.4", "ts-lit-plugin": "^1.2.1", "typescript": "^4.9.5", diff --git a/yarn.lock b/yarn.lock index 025e1cb99c..31210101be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9545,7 +9545,7 @@ fsevents@^1.2.7: source-map-url: ^0.4.1 superstruct: ^1.0.3 systemjs: ^6.13.0 - tar: ^6.1.11 + tar: ^6.1.13 terser-webpack-plugin: ^5.2.4 tinykeys: ^1.1.3 ts-lit-plugin: ^1.2.1 @@ -11734,6 +11734,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"minipass@npm:^4.0.0": + version: 4.0.2 + resolution: "minipass@npm:4.0.2" + checksum: 2e4f4caaf85a45c01c6042adc43b5111a6113f62e300acf1db3b193ac3ec6e955bc893d6d8a08635598771a55a0f60487dcac59a1ac39557eb524295d4778c9e + languageName: node + linkType: hard + "minizlib@npm:^1.1.1": version: 1.2.1 resolution: "minizlib@npm:1.2.1" @@ -14943,17 +14950,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tar@npm:^6.0.2, tar@npm:^6.1.0, tar@npm:^6.1.11": - version: 6.1.11 - resolution: "tar@npm:6.1.11" +"tar@npm:^6.0.2, tar@npm:^6.1.0, tar@npm:^6.1.13": + version: 6.1.13 + resolution: "tar@npm:6.1.13" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 - minipass: ^3.0.0 + minipass: ^4.0.0 minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f + checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c languageName: node linkType: hard From 2c064c53cd8c917317836394d9e304c42f163a14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 04:03:22 +0000 Subject: [PATCH 008/138] Bump @types/sortablejs from 1.10.7 to 1.15.0 (#15358) Bumps [@types/sortablejs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sortablejs) from 1.10.7 to 1.15.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sortablejs) --- updated-dependencies: - dependency-name: "@types/sortablejs" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 31210101be..bb9cb338f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4404,9 +4404,9 @@ __metadata: linkType: hard "@types/sortablejs@npm:^1": - version: 1.10.7 - resolution: "@types/sortablejs@npm:1.10.7" - checksum: c0854b842f0d4b938cb8d0496159bae77b275ed5b5fae8a0faf8d016a51d16906e1b2343f3f09a859a9c6b7ab3409cd7c9577643b249367fbf1756ffe15e4cbb + version: 1.15.0 + resolution: "@types/sortablejs@npm:1.15.0" + checksum: 34846bfcd1947a010c1e1d43ccbedbcda84462fcb6a3933d8d1a36d4eeced442dd889be7d1b6402f4491a61997ac29548e4f10cb35b14870a5f3d4ad6cafc0ec languageName: node linkType: hard From dded380076930b0eb5cb170f3b75873621d2516c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 04:06:15 +0000 Subject: [PATCH 009/138] Bump eslint-import-resolver-webpack from 0.13.1 to 0.13.2 (#15355) * Bump eslint-import-resolver-webpack from 0.13.1 to 0.13.2 Bumps [eslint-import-resolver-webpack](https://github.com/import-js/eslint-plugin-import) from 0.13.1 to 0.13.2. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/resolvers/webpack/v0.13.1...resolvers/webpack/v0.13.2) --- updated-dependencies: - dependency-name: eslint-import-resolver-webpack dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Deduplicate dependencies --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 7f38f131bd..a066053a41 100644 --- a/package.json +++ b/package.json @@ -191,7 +191,7 @@ "eslint-config-airbnb-base": "^14.2.1", "eslint-config-airbnb-typescript": "^14.0.0", "eslint-config-prettier": "^8.6.0", - "eslint-import-resolver-webpack": "^0.13.1", + "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-disable": "^2.0.3", "eslint-plugin-import": "^2.24.2", "eslint-plugin-lit": "^1.8.2", diff --git a/yarn.lock b/yarn.lock index bb9cb338f7..47097845d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7783,9 +7783,9 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-webpack@npm:^0.13.1": - version: 0.13.1 - resolution: "eslint-import-resolver-webpack@npm:0.13.1" +"eslint-import-resolver-webpack@npm:^0.13.2": + version: 0.13.2 + resolution: "eslint-import-resolver-webpack@npm:0.13.2" dependencies: array-find: ^1.0.0 debug: ^3.2.7 @@ -7793,15 +7793,15 @@ __metadata: find-root: ^1.1.0 has: ^1.0.3 interpret: ^1.4.0 - is-core-module: ^2.4.0 - is-regex: ^1.1.3 + is-core-module: ^2.7.0 + is-regex: ^1.1.4 lodash: ^4.17.21 resolve: ^1.20.0 semver: ^5.7.1 peerDependencies: eslint-plugin-import: ">=1.4.0" webpack: ">=1.11.0" - checksum: 667862c99f78d3fbdeb6ee9b3634ce315ec43d245ca62373621e68d0122142b00c96dcd5180ebb621c80cd8502d6f0a280def542875ea87ef3963b29519181de + checksum: 6c40164747bf894a0e34cbc9626566193471062e8809cef7aa8be74e0346c962d03aa7b8f3579a3d348245269860c1f241eba5379ec04acc89daffa4fb6b5f17 languageName: node linkType: hard @@ -9482,7 +9482,7 @@ fsevents@^1.2.7: eslint-config-airbnb-base: ^14.2.1 eslint-config-airbnb-typescript: ^14.0.0 eslint-config-prettier: ^8.6.0 - eslint-import-resolver-webpack: ^0.13.1 + eslint-import-resolver-webpack: ^0.13.2 eslint-plugin-disable: ^2.0.3 eslint-plugin-import: ^2.24.2 eslint-plugin-lit: ^1.8.2 @@ -10132,12 +10132,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-core-module@npm:^2.2.0, is-core-module@npm:^2.4.0, is-core-module@npm:^2.6.0": - version: 2.7.0 - resolution: "is-core-module@npm:2.7.0" +"is-core-module@npm:^2.2.0, is-core-module@npm:^2.6.0, is-core-module@npm:^2.7.0": + version: 2.11.0 + resolution: "is-core-module@npm:2.11.0" dependencies: has: ^1.0.3 - checksum: 8ec6dc714438ef9dc4dae10c94d21bd5aa67244da7e85bd9e42f0fd298514181214f6bebe358a486477c1242458b170ad7a8c936be0be15d465862fa61d3d1c7 + checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab languageName: node linkType: hard @@ -10407,7 +10407,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-regex@npm:^1.1.3, is-regex@npm:^1.1.4": +"is-regex@npm:^1.1.4": version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: From 791fd102c6596c813109c52911d6f142996f91ab Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Mon, 6 Feb 2023 10:51:35 -0500 Subject: [PATCH 010/138] Bump @fullcalendar to version 6.1.1 (#14947) --- .github/dependabot.yml | 4 - package.json | 11 ++- src/panels/calendar/ha-full-calendar.ts | 11 --- .../config/helpers/forms/ha-schedule-form.ts | 7 -- src/panels/lovelace/cards/hui-tile-card.ts | 72 ++++++++-------- .../hui-weather-forecast-card-editor.ts | 4 +- yarn.lock | 83 ++++++++----------- 7 files changed, 78 insertions(+), 114 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 79c8f5c7c4..99dc4f65c3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -19,7 +19,3 @@ updates: - dependency-name: "*rollup*" - dependency-name: "@rollup/*" - dependency-name: "serve" - # Wait for fullcalendar v6+ to fix shadow DOM issue - - dependency-name: "@fullcalendar/*" - versions: - - ">=6" diff --git a/package.json b/package.json index a066053a41..58bdc87e83 100644 --- a/package.json +++ b/package.json @@ -38,12 +38,11 @@ "@formatjs/intl-numberformat": "^8.3.3", "@formatjs/intl-pluralrules": "^5.1.8", "@formatjs/intl-relativetimeformat": "^11.1.8", - "@fullcalendar/common": "^5.11.4", - "@fullcalendar/core": "^5.11.4", - "@fullcalendar/daygrid": "^5.11.4", - "@fullcalendar/interaction": "^5.11.4", - "@fullcalendar/list": "^5.11.4", - "@fullcalendar/timegrid": "^5.11.4", + "@fullcalendar/core": "^6.1.1", + "@fullcalendar/daygrid": "^6.1.1", + "@fullcalendar/interaction": "^6.1.1", + "@fullcalendar/list": "^6.1.1", + "@fullcalendar/timegrid": "^6.1.1", "@lezer/highlight": "^1.1.3", "@lit-labs/motion": "^1.0.3", "@lit-labs/virtualizer": "^1.0.1", diff --git a/src/panels/calendar/ha-full-calendar.ts b/src/panels/calendar/ha-full-calendar.ts index 9e4f3ad5e0..bad1abd75d 100644 --- a/src/panels/calendar/ha-full-calendar.ts +++ b/src/panels/calendar/ha-full-calendar.ts @@ -1,15 +1,9 @@ -// @ts-ignore -import fullcalendarStyle from "@fullcalendar/common/main.css"; import type { CalendarOptions } from "@fullcalendar/core"; import { Calendar } from "@fullcalendar/core"; import allLocales from "@fullcalendar/core/locales-all"; import dayGridPlugin from "@fullcalendar/daygrid"; -// @ts-ignore -import daygridStyle from "@fullcalendar/daygrid/main.css"; import interactionPlugin from "@fullcalendar/interaction"; import listPlugin from "@fullcalendar/list"; -// @ts-ignore -import listStyle from "@fullcalendar/list/main.css"; import "@material/mwc-button"; import { mdiPlus, @@ -25,7 +19,6 @@ import { LitElement, PropertyValues, TemplateResult, - unsafeCSS, } from "lit"; import { property, state } from "lit/decorators"; import memoize from "memoize-one"; @@ -406,10 +399,6 @@ export class HAFullCalendar extends LitElement { return [ haStyle, css` - ${unsafeCSS(fullcalendarStyle)} - ${unsafeCSS(daygridStyle)} - ${unsafeCSS(listStyle)} - :host { display: flex; flex-direction: column; diff --git a/src/panels/config/helpers/forms/ha-schedule-form.ts b/src/panels/config/helpers/forms/ha-schedule-form.ts index 960965d2c1..24a29809df 100644 --- a/src/panels/config/helpers/forms/ha-schedule-form.ts +++ b/src/panels/config/helpers/forms/ha-schedule-form.ts @@ -1,11 +1,7 @@ -// @ts-ignore -import fullcalendarStyle from "@fullcalendar/common/main.css"; import { Calendar, CalendarOptions } from "@fullcalendar/core"; import allLocales from "@fullcalendar/core/locales-all"; import interactionPlugin from "@fullcalendar/interaction"; import timeGridPlugin from "@fullcalendar/timegrid"; -// @ts-ignore -import timegridStyle from "@fullcalendar/timegrid/main.css"; import { addDays, isSameDay, isSameWeek, nextDay } from "date-fns"; import { css, @@ -14,7 +10,6 @@ import { LitElement, PropertyValues, TemplateResult, - unsafeCSS, } from "lit"; import { customElement, property, state } from "lit/decorators"; import { firstWeekdayIndex } from "../../../../common/datetime/first_weekday"; @@ -409,8 +404,6 @@ class HaScheduleForm extends LitElement { return [ haStyle, css` - ${unsafeCSS(fullcalendarStyle)} - ${unsafeCSS(timegridStyle)} .form { color: var(--primary-text-color); } diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 97a7256b14..6422257036 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -1,4 +1,3 @@ -import { memoize } from "@fullcalendar/common"; import { Ripple } from "@material/mwc-ripple"; import { RippleHandlers } from "@material/mwc-ripple/ripple-handlers"; import { mdiExclamationThick, mdiHelp } from "@mdi/js"; @@ -13,6 +12,7 @@ import { } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { styleMap } from "lit/directives/style-map"; +import memoizeOne from "memoize-one"; import { computeCssColor } from "../../../common/color/compute-color"; import { hsv2rgb, rgb2hex, rgb2hsv } from "../../../common/color/convert-color"; import { DOMAINS_TOGGLE } from "../../../common/const"; @@ -139,42 +139,44 @@ export class HuiTileCard extends LitElement implements LovelaceCard { return imageUrl; } - private _computeStateColor = memoize((entity: HassEntity, color?: string) => { - // Use custom color if active - if (color) { - return stateActive(entity) ? computeCssColor(color) : undefined; - } - - // Use default color for person/device_tracker because color is on the badge - if ( - computeDomain(entity.entity_id) === "person" || - computeDomain(entity.entity_id) === "device_tracker" - ) { - return undefined; - } - - // Use light color if the light support rgb - if ( - computeDomain(entity.entity_id) === "light" && - entity.attributes.rgb_color - ) { - const hsvColor = rgb2hsv(entity.attributes.rgb_color); - - // Modify the real rgb color for better contrast - if (hsvColor[1] < 0.4) { - // Special case for very light color (e.g: white) - if (hsvColor[1] < 0.1) { - hsvColor[2] = 225; - } else { - hsvColor[1] = 0.4; - } + private _computeStateColor = memoizeOne( + (entity: HassEntity, color?: string) => { + // Use custom color if active + if (color) { + return stateActive(entity) ? computeCssColor(color) : undefined; } - return rgb2hex(hsv2rgb(hsvColor)); - } - // Fallback to state color - return stateColorCss(entity); - }); + // Use default color for person/device_tracker because color is on the badge + if ( + computeDomain(entity.entity_id) === "person" || + computeDomain(entity.entity_id) === "device_tracker" + ) { + return undefined; + } + + // Use light color if the light support rgb + if ( + computeDomain(entity.entity_id) === "light" && + entity.attributes.rgb_color + ) { + const hsvColor = rgb2hsv(entity.attributes.rgb_color); + + // Modify the real rgb color for better contrast + if (hsvColor[1] < 0.4) { + // Special case for very light color (e.g: white) + if (hsvColor[1] < 0.1) { + hsvColor[2] = 225; + } else { + hsvColor[1] = 0.4; + } + } + return rgb2hex(hsv2rgb(hsvColor)); + } + + // Fallback to state color + return stateColorCss(entity); + } + ); private _computeStateDisplay(stateObj: HassEntity): TemplateResult | string { const domain = computeDomain(stateObj.entity_id); 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 cc040c84d1..9ed5b09774 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 @@ -1,6 +1,6 @@ -import { memoize } from "@fullcalendar/common"; import { html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; import { assert, assign, boolean, object, optional, string } from "superstruct"; import { fireEvent } from "../../../../common/dom/fire_event"; import { entityId } from "../../../../common/structs/is-entity-id"; @@ -66,7 +66,7 @@ export class HuiWeatherForecastCardEditor return undefined; } - private _schema = memoize( + private _schema = memoizeOne( (entity: string, localize: LocalizeFunc, hasForecast?: boolean) => [ { diff --git a/yarn.lock b/yarn.lock index 47097845d5..b63e4332d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1585,64 +1585,50 @@ __metadata: languageName: node linkType: hard -"@fullcalendar/common@npm:^5.11.4, @fullcalendar/common@npm:~5.11.4": - version: 5.11.4 - resolution: "@fullcalendar/common@npm:5.11.4" +"@fullcalendar/core@npm:^6.1.1": + version: 6.1.1 + resolution: "@fullcalendar/core@npm:6.1.1" dependencies: - tslib: ^2.1.0 - checksum: 8fc0e05539ba83d310eb5a7163dcd10582d83465393cccb525022b20c954e29e6361b289a2d2eec1ae5b5d950700333739b81cb5e81bc8cb72f682484ca697af - languageName: node - linkType: hard - -"@fullcalendar/core@npm:^5.11.4": - version: 5.11.4 - resolution: "@fullcalendar/core@npm:5.11.4" - dependencies: - "@fullcalendar/common": ~5.11.4 preact: ^10.0.5 - tslib: ^2.1.0 - checksum: 11652a58dc4a7af2b9c552ca71e4215c56d574f7d639deab0a6604afa0a67c7bfef445d5a6e364b6bc6b0ffb333ba9e7730e184d480e0113dce90c470d988d17 + checksum: 4fc30de34c1c03196f7a80904d4e8f307c66afe52a65e7a257137f1a639c29efc69d15a58d381a2481753b51f4bc101fb00584606cfb006226a01843efa743c5 languageName: node linkType: hard -"@fullcalendar/daygrid@npm:^5.11.4, @fullcalendar/daygrid@npm:~5.11.4": - version: 5.11.4 - resolution: "@fullcalendar/daygrid@npm:5.11.4" - dependencies: - "@fullcalendar/common": ~5.11.4 - tslib: ^2.1.0 - checksum: a25d83cfe5b3ac3feeb49af47701c54e858d30b0b53871df2a83aa7edbcc7d49f435d59fdbf3d6e18b5699caced8133e9c4b1c919caca2c8717bd92f57c08ab4 +"@fullcalendar/daygrid@npm:^6.1.1, @fullcalendar/daygrid@npm:~6.1.1": + version: 6.1.1 + resolution: "@fullcalendar/daygrid@npm:6.1.1" + peerDependencies: + "@fullcalendar/core": ~6.1.1 + checksum: ffc3431af31e3858218c962ad761019967e8bccd9d83ea4897bd2db86b0d06fd4dfd4c529f25791ac38ef403295c8a23a0c0e7bb6420c6067890a64350a4305f languageName: node linkType: hard -"@fullcalendar/interaction@npm:^5.11.4": - version: 5.11.4 - resolution: "@fullcalendar/interaction@npm:5.11.4" - dependencies: - "@fullcalendar/common": ~5.11.4 - tslib: ^2.1.0 - checksum: 88231b925498b947f5af98fcabf564f7d72ecde6660696e5aec7aa5c4aca7988deab74c9486a30e0e461cdd31913c560bb016f54a61641d13359488e845e053f +"@fullcalendar/interaction@npm:^6.1.1": + version: 6.1.1 + resolution: "@fullcalendar/interaction@npm:6.1.1" + peerDependencies: + "@fullcalendar/core": ~6.1.1 + checksum: 8319e06999792e16af16d39fb3437080b427c2f9688a2b3a90f0cd8228e925603389f7390c7558cb651b9099bf3cd88a2e05d8b1e4836723f098a8c4d2a95c69 languageName: node linkType: hard -"@fullcalendar/list@npm:^5.11.4": - version: 5.11.4 - resolution: "@fullcalendar/list@npm:5.11.4" - dependencies: - "@fullcalendar/common": ~5.11.4 - tslib: ^2.1.0 - checksum: e2cec5e89c57836a9ca4db57fbe67e16f78d91191df39ac0b5d0f18c1fdac9763f04647ae42e5f2d31ffa3cd245423d3aec449ed6c84fafc0195e62079a4eedc +"@fullcalendar/list@npm:^6.1.1": + version: 6.1.1 + resolution: "@fullcalendar/list@npm:6.1.1" + peerDependencies: + "@fullcalendar/core": ~6.1.1 + checksum: da2443812b9a477a5fdc2b647bbe8ca4a86e92c3bd000229b5e50b38b3cdee467dc69743ebd58035abee663de5ced392850ac2fa567b0d0487e324b836a0b863 languageName: node linkType: hard -"@fullcalendar/timegrid@npm:^5.11.4": - version: 5.11.4 - resolution: "@fullcalendar/timegrid@npm:5.11.4" +"@fullcalendar/timegrid@npm:^6.1.1": + version: 6.1.1 + resolution: "@fullcalendar/timegrid@npm:6.1.1" dependencies: - "@fullcalendar/common": ~5.11.4 - "@fullcalendar/daygrid": ~5.11.4 - tslib: ^2.1.0 - checksum: 3a2fccac65198c5fffa53286fcbb2556b6e3885cfc6f7978b7ee21c57cbc2a58617e6c54eff977f5234163cef3281e50548327a06cf253acc43c6881bed00f2c + "@fullcalendar/daygrid": ~6.1.1 + peerDependencies: + "@fullcalendar/core": ~6.1.1 + checksum: 38796e93ac4e1ea69be4a315105aa6fcc9e8b21564c10f7e0be2fb59756d8115cdbecb8ab8a69f221c27d13da5c06efc1c6c44ed8aabf54e98a69660b466d985 languageName: node linkType: hard @@ -9382,12 +9368,11 @@ fsevents@^1.2.7: "@formatjs/intl-numberformat": ^8.3.3 "@formatjs/intl-pluralrules": ^5.1.8 "@formatjs/intl-relativetimeformat": ^11.1.8 - "@fullcalendar/common": ^5.11.4 - "@fullcalendar/core": ^5.11.4 - "@fullcalendar/daygrid": ^5.11.4 - "@fullcalendar/interaction": ^5.11.4 - "@fullcalendar/list": ^5.11.4 - "@fullcalendar/timegrid": ^5.11.4 + "@fullcalendar/core": ^6.1.1 + "@fullcalendar/daygrid": ^6.1.1 + "@fullcalendar/interaction": ^6.1.1 + "@fullcalendar/list": ^6.1.1 + "@fullcalendar/timegrid": ^6.1.1 "@koa/cors": ^4.0.0 "@lezer/highlight": ^1.1.3 "@lit-labs/motion": ^1.0.3 From cfbab03f760aab911c3c35b4d99aae370e39325f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 16:30:39 +0000 Subject: [PATCH 011/138] Bump leaflet from 1.7.1 to 1.9.3 (#15357) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bram Kragten --- package.json | 2 +- src/common/dom/setup-leaflet-map.ts | 3 +-- yarn.lock | 28 ++++++++++++++-------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 58bdc87e83..c8d05e7876 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "idb-keyval": "^5.1.3", "intl-messageformat": "^10.3.0", "js-yaml": "^4.1.0", - "leaflet": "^1.7.1", + "leaflet": "^1.9.3", "leaflet-draw": "^1.0.4", "lit": "^2.6.1", "marked": "^4.0.12", diff --git a/src/common/dom/setup-leaflet-map.ts b/src/common/dom/setup-leaflet-map.ts index 1ce5c20f4e..444e12f472 100644 --- a/src/common/dom/setup-leaflet-map.ts +++ b/src/common/dom/setup-leaflet-map.ts @@ -11,8 +11,7 @@ export const setupLeafletMap = async ( throw new Error("Cannot setup Leaflet map on disconnected element"); } // eslint-disable-next-line - const Leaflet = ((await import("leaflet")) as any) - .default as LeafletModuleType; + const Leaflet = (await import("leaflet")).default as LeafletModuleType; Leaflet.Icon.Default.imagePath = "/static/images/leaflet/images/"; const map = Leaflet.map(mapElement); diff --git a/yarn.lock b/yarn.lock index b63e4332d6..105dc40204 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4103,9 +4103,9 @@ __metadata: linkType: hard "@types/geojson@npm:*": - version: 7946.0.8 - resolution: "@types/geojson@npm:7946.0.8" - checksum: 6049a39b025cfe323d5cf87333d87c133ec963cdbd349c49295bee779827ee4b46a3041fd8bd2e7a4b02d6d1e26f3002968875928941bbed08477bfd5f6f9284 + version: 7946.0.10 + resolution: "@types/geojson@npm:7946.0.10" + checksum: 12c407c2dc93ecb26c08af533ee732f1506a9b29456616ba7ba1d525df96206c28ddf44a528f6a5415d7d22893e9d967420940a9c095ee5e539c1eba5fefc1f4 languageName: node linkType: hard @@ -4210,20 +4210,20 @@ __metadata: linkType: hard "@types/leaflet-draw@npm:^1": - version: 1.0.5 - resolution: "@types/leaflet-draw@npm:1.0.5" + version: 1.0.6 + resolution: "@types/leaflet-draw@npm:1.0.6" dependencies: "@types/leaflet": "*" - checksum: 75ee3c389b8ea0acd8b9f88e3094057df695c29edd8360b5abb902898d78810957be6f77392d5c1c2b1f01d94eef80670be9e8374dfbb819fe8237fcf155f8d6 + checksum: 6520de61f26f4f845fea3faa43077515d2eac58274e98d61b26ca0885d9002fdeb131375e85f4e503daa6b4ec27f0837a1ecddacbba78aea4764084a424bf93e languageName: node linkType: hard "@types/leaflet@npm:*, @types/leaflet@npm:^1": - version: 1.7.5 - resolution: "@types/leaflet@npm:1.7.5" + version: 1.9.0 + resolution: "@types/leaflet@npm:1.9.0" dependencies: "@types/geojson": "*" - checksum: 922f3d1176017c350be997773df72d0fd8f31c2f0340a20d3a91eb31540c3e6ef09eb020cec85c74b05afd54f4095e406ab3a45c9328c31ea17f95aa6ef69c6e + checksum: f3ee2e2fc8bd3480d77667471c8f774a3726ff7694a7d08d2423c05b40e28f00379c7d469b4cbd3b53a1bc96c75970c92f9da7908fc477cbac0eda2a9d17b6ad languageName: node linkType: hard @@ -9494,7 +9494,7 @@ fsevents@^1.2.7: intl-messageformat: ^10.3.0 js-yaml: ^4.1.0 jszip: ^3.10.1 - leaflet: ^1.7.1 + leaflet: ^1.9.3 leaflet-draw: ^1.0.4 lint-staged: ^13.1.0 lit: ^2.6.1 @@ -10974,10 +10974,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"leaflet@npm:^1.7.1": - version: 1.7.1 - resolution: "leaflet@npm:1.7.1" - checksum: f69149ab482eeb6cdabd837939c4782c97a7a18bc0b2a9330d4a828ca0dc6e035981f2ecdb71c6646aa173bc369cd3b4fd6bbe5d81df4c59c45254f9e9361d03 +"leaflet@npm:^1.9.3": + version: 1.9.3 + resolution: "leaflet@npm:1.9.3" + checksum: f8bc33215e6aed8488cb3d32511b943ff093c1747bcda8a39116e24fe714e12525f1a6843b6a79940ece4cf8d2a86e2cb1d7b80fc550344b3182659b19231a04 languageName: node linkType: hard From e47b59f82614c263027fb408a9e9e70554364594 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 16:49:19 +0000 Subject: [PATCH 012/138] Bump @typescript-eslint/eslint-plugin from 5.46.1 to 5.50.0 (#15370) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.46.1 to 5.50.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.50.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 134 +++++++++++++++++++++++++++------------------------ 2 files changed, 72 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index c8d05e7876..b5dc559ada 100644 --- a/package.json +++ b/package.json @@ -179,7 +179,7 @@ "@types/sortablejs": "^1", "@types/tar": "^6", "@types/webspeechapi": "^0.0.29", - "@typescript-eslint/eslint-plugin": "^5.46.1", + "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.49.0", "@web/dev-server": "^0.0.24", "@web/dev-server-rollup": "^0.2.11", diff --git a/yarn.lock b/yarn.lock index 105dc40204..eae0f54db4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4438,14 +4438,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.46.1" +"@typescript-eslint/eslint-plugin@npm:^5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.50.0" dependencies: - "@typescript-eslint/scope-manager": 5.46.1 - "@typescript-eslint/type-utils": 5.46.1 - "@typescript-eslint/utils": 5.46.1 + "@typescript-eslint/scope-manager": 5.50.0 + "@typescript-eslint/type-utils": 5.50.0 + "@typescript-eslint/utils": 5.50.0 debug: ^4.3.4 + grapheme-splitter: ^1.0.4 ignore: ^5.2.0 natural-compare-lite: ^1.4.0 regexpp: ^3.2.0 @@ -4457,7 +4458,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 4ea4af5faa5c509113d575bf6ea1f76989f253b4839bb98bcda28450be7fc8a87788169e822b0f6d739aee67e32e824440ef00cebc294d4212ffb3fed1f0756a + checksum: 351c4a157a7d717cc3835bdc09324b20d649463738a029c5701e5a38cdb162305ff7d56adff196a0c3245c24ea3167bbdac7f1c30399b8c1d495abbdbc1c53d6 languageName: node linkType: hard @@ -4478,16 +4479,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/scope-manager@npm:5.46.1" - dependencies: - "@typescript-eslint/types": 5.46.1 - "@typescript-eslint/visitor-keys": 5.46.1 - checksum: bf934603dc9c7da71eb26f415d13018f2a96dbba193a773bc440a5c93828365f09bb3db9be55189dfbbace414c6c48d7fad246c0d9717dab4676d0d79d6d8676 - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:5.49.0": version: 5.49.0 resolution: "@typescript-eslint/scope-manager@npm:5.49.0" @@ -4498,12 +4489,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/type-utils@npm:5.46.1" +"@typescript-eslint/scope-manager@npm:5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/scope-manager@npm:5.50.0" dependencies: - "@typescript-eslint/typescript-estree": 5.46.1 - "@typescript-eslint/utils": 5.46.1 + "@typescript-eslint/types": 5.50.0 + "@typescript-eslint/visitor-keys": 5.50.0 + checksum: bd49447a834c82cb130e6900644042c3a84195bf7a63483385e90b6454c65856d6f276c997cad6bf9c36c9d0cb168fdde625ce4c78c3b8bcce42da782270794b + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/type-utils@npm:5.50.0" + dependencies: + "@typescript-eslint/typescript-estree": 5.50.0 + "@typescript-eslint/utils": 5.50.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -4511,14 +4512,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a47f1b73ac773a7f33421a8e8f9bc6e047f55236e3257b2c9eaa04d18595ab6505129ffdab86685e9c3bef564091315a2347150cd6e61a511cc2160667458014 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/types@npm:5.46.1" - checksum: 91143d3304b8c70d69d9c8e5b7428cce3a222eacfbeb99e592d278668bcf998760731deae064a76157b9a0fc4911fe3178aa24e4ea6fe2ba68dd37113834c924 + checksum: d2fc2fd10ef300865fd6a902ae92aef6c45cddc4359445f1e5c6dc9511063b52d2170cc6b525763395d4171c177b3d0fffd77cf9a2ab7e01fcd7109bd1a5a585 languageName: node linkType: hard @@ -4529,21 +4523,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.46.1" - dependencies: - "@typescript-eslint/types": 5.46.1 - "@typescript-eslint/visitor-keys": 5.46.1 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 21499b927b4118cd51e841b2e1b7e55621135f923f461b75dc8ca8442de38a82da5a0232dce5229e0266b6fc12d70696e0e912fcf1483d4c44f02e4cad39ed98 +"@typescript-eslint/types@npm:5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/types@npm:5.50.0" + checksum: 1189c63d35abeec685dd519fd923926b884e63d5e10e4a9fe995aebfde59b8a2e10773090ec3ba32a0ec408746b18f6a454d9bedb0b6c7ce8b6066547144fb4d languageName: node linkType: hard @@ -4565,31 +4548,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/utils@npm:5.46.1" +"@typescript-eslint/typescript-estree@npm:5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.50.0" + dependencies: + "@typescript-eslint/types": 5.50.0 + "@typescript-eslint/visitor-keys": 5.50.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: cb1ac8d39647da6d52750c713d9635750ed41245ec82f937a159a71ad3bf490ebabfad3b43eeca07bca39d60df30d3a2f31f8bed0061381731d92a62e284b867 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/utils@npm:5.50.0" dependencies: "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.46.1 - "@typescript-eslint/types": 5.46.1 - "@typescript-eslint/typescript-estree": 5.46.1 + "@typescript-eslint/scope-manager": 5.50.0 + "@typescript-eslint/types": 5.50.0 + "@typescript-eslint/typescript-estree": 5.50.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: db9fd1dfb2390e66041f9529d564f38ccf74042de68e0e1e3d319ba4d02d7cd969d75dc056f938b98acab53ad7c1e36c68eabb15c0b2e2296b081652fa8d3820 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.46.1": - version: 5.46.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.46.1" - dependencies: - "@typescript-eslint/types": 5.46.1 - eslint-visitor-keys: ^3.3.0 - checksum: 952cf20e29a040e0820e52d6815097abf042ea8e1fd5d013c0a319284ea0e2e29e0ca9ef244717450a6eb9d32ebf7fa9ed91185675a27adc35c9ad070d561b7c + checksum: 4471ae8b24449300e009f1cc09ee0d38cce20ae9171e8fbf4ef752ce4eb87104cc0d813d8f7051b619fa05e1e7c12b748dad49832911685297b1bbfef3c01f0b languageName: node linkType: hard @@ -4603,6 +4594,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.50.0": + version: 5.50.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.50.0" + dependencies: + "@typescript-eslint/types": 5.50.0 + eslint-visitor-keys: ^3.3.0 + checksum: 55319cb7ee7b78d07d9dc67a388d69fe0b7f11cbc79190e17e7f87a39c9992d08dab3b5872d5a7f01094dda28ad6ac61d3573e59015ef70bf138d4c4f8c45b88 + languageName: node + linkType: hard + "@ungap/promise-all-settled@npm:1.1.2": version: 1.1.2 resolution: "@ungap/promise-all-settled@npm:1.1.2" @@ -9098,6 +9099,13 @@ fsevents@^1.2.7: 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 + "growl@npm:1.10.5": version: 1.10.5 resolution: "growl@npm:1.10.5" @@ -9439,7 +9447,7 @@ fsevents@^1.2.7: "@types/sortablejs": ^1 "@types/tar": ^6 "@types/webspeechapi": ^0.0.29 - "@typescript-eslint/eslint-plugin": ^5.46.1 + "@typescript-eslint/eslint-plugin": ^5.50.0 "@typescript-eslint/parser": ^5.49.0 "@vaadin/combo-box": ^23.3.6 "@vaadin/vaadin-themable-mixin": ^23.3.6 From 5b504bf9ce5510f5431377ea7ed8244f2a713bbf Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 6 Feb 2023 18:18:30 +0100 Subject: [PATCH 013/138] Add "add matter device" link to add integration dialog (#15365) --- .../integrations/protocolIntegrationPicked.ts | 40 +++++++++ src/data/matter.ts | 49 +++++++++++ .../devices/ha-config-devices-dashboard.ts | 5 ++ .../integrations/dialog-add-integration.ts | 16 ++-- .../integrations/ha-domain-integrations.ts | 76 +++++++++------- .../integrations/ha-integration-card.ts | 5 +- .../matter/dialog-matter-add-device.ts | 87 ++++++++++++++++++ .../matter/matter-config-panel.ts | 88 +++++++------------ .../matter/show-dialog-add-matter-device.ts | 11 +++ src/translations/en.json | 5 +- 10 files changed, 286 insertions(+), 96 deletions(-) create mode 100644 src/panels/config/integrations/integration-panels/matter/dialog-matter-add-device.ts create mode 100644 src/panels/config/integrations/integration-panels/matter/show-dialog-add-matter-device.ts diff --git a/src/common/integrations/protocolIntegrationPicked.ts b/src/common/integrations/protocolIntegrationPicked.ts index a1f11551c4..dfc3a89f7a 100644 --- a/src/common/integrations/protocolIntegrationPicked.ts +++ b/src/common/integrations/protocolIntegrationPicked.ts @@ -4,12 +4,15 @@ import { domainToName } from "../../data/integration"; import { getIntegrationDescriptions } from "../../data/integrations"; import { showConfigFlowDialog } from "../../dialogs/config-flow/show-dialog-config-flow"; import { showConfirmationDialog } from "../../dialogs/generic/show-dialog-box"; +import { showMatterAddDeviceDialog } from "../../panels/config/integrations/integration-panels/matter/show-dialog-add-matter-device"; import { showZWaveJSAddNodeDialog } from "../../panels/config/integrations/integration-panels/zwave_js/show-dialog-zwave_js-add-node"; import type { HomeAssistant } from "../../types"; import { documentationUrl } from "../../util/documentation-url"; import { isComponentLoaded } from "../config/is_component_loaded"; import { navigate } from "../navigate"; +export const PROTOCOL_INTEGRATIONS = ["zha", "zwave_js", "matter"] as const; + export const protocolIntegrationPicked = async ( element: HTMLElement, hass: HomeAssistant, @@ -113,5 +116,42 @@ export const protocolIntegrationPicked = async ( } navigate("/config/zha/add"); + } else if (domain === "matter") { + const entries = await getConfigEntries(hass, { + domain, + }); + if (!isComponentLoaded(hass, domain) || !entries.length) { + // If the component isn't loaded, ask them to load the integration first + showConfirmationDialog(element, { + title: hass.localize( + "ui.panel.config.integrations.config_flow.missing_zwave_zigbee_title", + { integration: "Matter" } + ), + text: hass.localize( + "ui.panel.config.integrations.config_flow.missing_matter", + { + brand: options?.brand || options?.domain || "Matter", + link: html`${hass.localize( + "ui.panel.config.integrations.config_flow.supported_hardware" + )}`, + } + ), + confirmText: hass.localize( + "ui.panel.config.integrations.config_flow.proceed" + ), + confirm: () => { + showConfigFlowDialog(element, { + startFlowHandler: "matter", + }); + }, + }); + return; + } + showMatterAddDeviceDialog(element); } }; diff --git a/src/data/matter.ts b/src/data/matter.ts index f270ead3ad..11686a7cb2 100644 --- a/src/data/matter.ts +++ b/src/data/matter.ts @@ -1,4 +1,53 @@ +import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { navigate } from "../common/navigate"; import { HomeAssistant } from "../types"; +import { subscribeDeviceRegistry } from "./device_registry"; + +export const canCommissionMatterExternal = (hass: HomeAssistant) => + hass.auth.external?.config.canCommissionMatter; + +export const startExternalCommissioning = (hass: HomeAssistant) => + hass.auth.external!.fireMessage({ + type: "matter/commission", + }); + +export const redirectOnNewMatterDevice = ( + hass: HomeAssistant, + callback?: () => void +): UnsubscribeFunc => { + let curMatterDevices: Set | undefined; + const unsubDeviceReg = subscribeDeviceRegistry(hass.connection, (entries) => { + if (!curMatterDevices) { + curMatterDevices = new Set( + Object.values(entries) + .filter((device) => + device.identifiers.find((identifier) => identifier[0] === "matter") + ) + .map((device) => device.id) + ); + return; + } + const newMatterDevices = Object.values(entries).filter( + (device) => + device.identifiers.find((identifier) => identifier[0] === "matter") && + !curMatterDevices!.has(device.id) + ); + if (newMatterDevices.length) { + unsubDeviceReg(); + curMatterDevices = undefined; + callback?.(); + navigate(`/config/devices/device/${newMatterDevices[0].id}`); + } + }); + return () => { + unsubDeviceReg(); + curMatterDevices = undefined; + }; +}; + +export const addMatterDevice = (hass: HomeAssistant) => { + startExternalCommissioning(hass); +}; export const commissionMatterDevice = ( hass: HomeAssistant, diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index b336bf6b18..582bd9e3ce 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -39,6 +39,7 @@ import { HomeAssistant, Route } from "../../../types"; import { brandsUrl } from "../../../util/brands-url"; import { configSections } from "../ha-panel-config"; import "../integrations/ha-integration-overflow-menu"; +import { showMatterAddDeviceDialog } from "../integrations/integration-panels/matter/show-dialog-add-matter-device"; import { showZWaveJSAddNodeDialog } from "../integrations/integration-panels/zwave_js/show-dialog-zwave_js-add-node"; import { showAddIntegrationDialog } from "../integrations/show-add-integration-dialog"; @@ -543,6 +544,10 @@ export class HaConfigDeviceDashboard extends LitElement { this._showZJSAddDeviceDialog(filteredConfigEntry); return; } + if (filteredConfigEntry?.domain === "matter") { + showMatterAddDeviceDialog(this); + return; + } showAddIntegrationDialog(this); } diff --git a/src/panels/config/integrations/dialog-add-integration.ts b/src/panels/config/integrations/dialog-add-integration.ts index 15b52126d4..00f5b8af3d 100644 --- a/src/panels/config/integrations/dialog-add-integration.ts +++ b/src/panels/config/integrations/dialog-add-integration.ts @@ -7,7 +7,10 @@ import { styleMap } from "lit/directives/style-map"; import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { fireEvent } from "../../../common/dom/fire_event"; -import { protocolIntegrationPicked } from "../../../common/integrations/protocolIntegrationPicked"; +import { + protocolIntegrationPicked, + PROTOCOL_INTEGRATIONS, +} from "../../../common/integrations/protocolIntegrationPicked"; import { navigate } from "../../../common/navigate"; import { caseInsensitiveStringCompare } from "../../../common/string/compare"; import { LocalizeFunc } from "../../../common/translations/localize"; @@ -136,10 +139,9 @@ class AddIntegrationDialog extends LitElement { localize: LocalizeFunc, filter?: string ): IntegrationListItem[] => { - const addDeviceRows: IntegrationListItem[] = ( - ["zha", "zwave_js"] as const + const addDeviceRows: IntegrationListItem[] = PROTOCOL_INTEGRATIONS.filter( + (domain) => components.includes(domain) ) - .filter((domain) => components.includes(domain)) .map((domain) => ({ name: localize(`ui.panel.config.integrations.add_${domain}_device`), domain, @@ -371,7 +373,7 @@ class AddIntegrationDialog extends LitElement { ), confirm: () => { this.closeDialog(); - if (["zha", "zwave_js"].includes(integration.supported_by)) { + if (PROTOCOL_INTEGRATIONS.includes(integration.supported_by)) { protocolIntegrationPicked(this, this.hass, integration.supported_by); return; } @@ -519,7 +521,9 @@ class AddIntegrationDialog extends LitElement { } if ( - ["zha", "zwave_js"].includes(integration.domain) && + (PROTOCOL_INTEGRATIONS as ReadonlyArray).includes( + integration.domain + ) && isComponentLoaded(this.hass, integration.domain) ) { this._pickedBrand = integration.domain; diff --git a/src/panels/config/integrations/ha-domain-integrations.ts b/src/panels/config/integrations/ha-domain-integrations.ts index da4c1f7aed..0a96aa0856 100644 --- a/src/panels/config/integrations/ha-domain-integrations.ts +++ b/src/panels/config/integrations/ha-domain-integrations.ts @@ -3,7 +3,10 @@ import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { fireEvent } from "../../../common/dom/fire_event"; -import { protocolIntegrationPicked } from "../../../common/integrations/protocolIntegrationPicked"; +import { + protocolIntegrationPicked, + PROTOCOL_INTEGRATIONS, +} from "../../../common/integrations/protocolIntegrationPicked"; import { shouldHandleRequestSelectedEvent } from "../../../common/mwc/handle-request-selected-event"; import { navigate } from "../../../common/navigate"; import { caseInsensitiveStringCompare } from "../../../common/string/compare"; @@ -77,38 +80,41 @@ class HaDomainIntegrations extends LitElement { : ""}` : ""} ${this.integration?.iot_standards - ? ( - this.integration.iot_standards.filter( - (standard) => standard in standardToDomain - ) as (keyof typeof standardToDomain)[] - ).map((standard) => { - const domain = standardToDomain[standard]; - return html` - - ${this.hass.localize( - `ui.panel.config.integrations.add_${domain}_device` - )} + (PROTOCOL_INTEGRATIONS as ReadonlyArray).includes( + standardToDomain[standard] || standard + ) + ) + .map((standard) => { + const domain: (typeof PROTOCOL_INTEGRATIONS)[number] = + standardToDomain[standard] || standard; + return html` - - `; - }) + + ${this.hass.localize( + `ui.panel.config.integrations.add_${domain}_device` + )} + + `; + }) : ""} ${this.integration && "integrations" in this.integration && @@ -144,7 +150,7 @@ class HaDomainIntegrations extends LitElement { ` ) : ""} - ${this.domain === "zha" || this.domain === "zwave_js" + ${(PROTOCOL_INTEGRATIONS as ReadonlyArray).includes(this.domain) ? html` ${this.hass.localize( - `ui.panel.config.integrations.add_${this.domain}_device` + `ui.panel.config.integrations.add_${ + this.domain as (typeof PROTOCOL_INTEGRATIONS)[number] + }_device` )} diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index cedf0c214a..a369f82157 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -73,6 +73,7 @@ import { documentationUrl } from "../../../util/documentation-url"; import { fileDownload } from "../../../util/file_download"; import type { ConfigEntryExtended } from "./ha-config-integrations"; import "./ha-integration-header"; +import { isDevVersion } from "../../../common/config/version"; const integrationsWithPanel = { matter: "/config/matter", @@ -346,7 +347,9 @@ export class HaIntegrationCard extends LitElement { ? html` ${this.hass.localize("ui.common.enable")} ` - : item.domain in integrationsWithPanel + : item.domain in integrationsWithPanel && + (item.domain !== "matter" || + isDevVersion(this.hass.config.version)) ? html` + this.closeDialog() + ); + addMatterDevice(this.hass); + } + + public closeDialog(): void { + this._open = false; + this._unsub?.(); + this._unsub = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._open) { + return html``; + } + + return html` + +
+ ${!canCommissionMatterExternal(this.hass) + ? this.hass.localize( + "ui.panel.config.integrations.config_flow.matter_mobile_app" + ) + : html``} +
+ + ${this.hass.localize("ui.common.cancel")} + +
+ `; + } + + static styles = [ + haStyleDialog, + css` + div { + display: grid; + } + ha-circular-progress { + justify-self: center; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + "dialog-matter-add-device": DialogMatterAddDevice; + } +} diff --git a/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts b/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts index 1f99075dc3..20fcc722f9 100644 --- a/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts @@ -1,21 +1,23 @@ import "@material/mwc-button"; -import { css, html, LitElement, PropertyValues, TemplateResult } from "lit"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; +import "../../../../../components/ha-alert"; import "../../../../../components/ha-card"; import { acceptSharedMatterDevice, + canCommissionMatterExternal, commissionMatterDevice, matterSetThread, matterSetWifi, + redirectOnNewMatterDevice, + startExternalCommissioning, } from "../../../../../data/matter"; +import { showPromptDialog } from "../../../../../dialogs/generic/show-dialog-box"; import "../../../../../layouts/hass-subpage"; import { haStyle } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; -import "../../../../../components/ha-alert"; -import { showPromptDialog } from "../../../../../dialogs/generic/show-dialog-box"; -import { navigate } from "../../../../../common/navigate"; -import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; -import { isDevVersion } from "../../../../../common/config/version"; @customElement("matter-config-panel") export class MatterConfigPanel extends LitElement { @@ -25,10 +27,11 @@ export class MatterConfigPanel extends LitElement { @state() private _error?: string; - private _curMatterDevices?: Set; + private _unsub?: UnsubscribeFunc; - private get _canCommissionMatter() { - return this.hass.auth.external?.config.canCommissionMatter; + disconnectedCallback() { + super.disconnectedCallback(); + this._stopRedirect(); } protected render(): TemplateResult { @@ -57,19 +60,17 @@ export class MatterConfigPanel extends LitElement { share code.
- ${this._canCommissionMatter + ${canCommissionMatterExternal(this.hass) ? html`Commission device with mobile app` : ""} - ${isDevVersion(this.hass.config.version) - ? html`Commission device - Add shared device` - : ""} + Commission device + Add shared device Set WiFi Credentials @@ -83,33 +84,23 @@ export class MatterConfigPanel extends LitElement { `; } - protected override updated(changedProps: PropertyValues) { - super.updated(changedProps); - - if (!this._curMatterDevices || !changedProps.has("hass")) { + private _redirectOnNewMatterDevice() { + if (this._unsub) { return; } + this._unsub = redirectOnNewMatterDevice(this.hass, () => { + this._unsub = undefined; + }); + } - const oldHass = changedProps.get("hass") as HomeAssistant | undefined; - if (!oldHass || oldHass.devices === this.hass.devices) { - return; - } - - const newMatterDevices = Object.values(this.hass.devices).filter( - (device) => - device.identifiers.find((identifier) => identifier[0] === "matter") && - !this._curMatterDevices!.has(device.id) - ); - if (newMatterDevices.length) { - navigate(`/config/devices/device/${newMatterDevices[0].id}`); - } + private _stopRedirect() { + this._unsub?.(); + this._unsub = undefined; } private _startMobileCommissioning() { - this._redirectOnNewDevice(); - this.hass.auth.external!.fireMessage({ - type: "matter/commission", - }); + this._redirectOnNewMatterDevice(); + startExternalCommissioning(this.hass); } private async _setWifi(): Promise { @@ -150,11 +141,12 @@ export class MatterConfigPanel extends LitElement { return; } this._error = undefined; - this._redirectOnNewDevice(); + this._redirectOnNewMatterDevice(); try { await commissionMatterDevice(this.hass, code); } catch (err: any) { this._error = err.message; + this._stopRedirect(); } } @@ -169,11 +161,12 @@ export class MatterConfigPanel extends LitElement { return; } this._error = undefined; - this._redirectOnNewDevice(); + this._redirectOnNewMatterDevice(); try { await acceptSharedMatterDevice(this.hass, Number(code)); } catch (err: any) { this._error = err.message; + this._stopRedirect(); } } @@ -195,19 +188,6 @@ export class MatterConfigPanel extends LitElement { } } - private _redirectOnNewDevice() { - if (this._curMatterDevices) { - return; - } - this._curMatterDevices = new Set( - Object.values(this.hass.devices) - .filter((device) => - device.identifiers.find((identifier) => identifier[0] === "matter") - ) - .map((device) => device.id) - ); - } - static styles = [ haStyle, css` diff --git a/src/panels/config/integrations/integration-panels/matter/show-dialog-add-matter-device.ts b/src/panels/config/integrations/integration-panels/matter/show-dialog-add-matter-device.ts new file mode 100644 index 0000000000..3559482e7c --- /dev/null +++ b/src/panels/config/integrations/integration-panels/matter/show-dialog-add-matter-device.ts @@ -0,0 +1,11 @@ +import { fireEvent } from "../../../../../common/dom/fire_event"; + +export const loadAddDeviceDialog = () => import("./dialog-matter-add-device"); + +export const showMatterAddDeviceDialog = (element: HTMLElement): void => { + fireEvent(element, "show-dialog", { + dialogTag: "dialog-matter-add-device", + dialogImport: loadAddDeviceDialog, + dialogParams: {}, + }); +}; diff --git a/src/translations/en.json b/src/translations/en.json index 4c08100009..9a268b7d5f 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2993,6 +2993,7 @@ "search_brand": "Search for a brand name", "add_zwave_js_device": "Add Z-Wave device", "add_zha_device": "Add Zigbee device", + "add_matter_device": "Add Matter device", "disable": { "show_disabled": "Show disabled integrations", "disabled_integrations": "{number} disabled", @@ -3106,8 +3107,10 @@ "could_not_load": "Config flow could not be loaded", "not_loaded": "The integration could not be loaded, try to restart Home Assistant.", "supported_brand_flow": "Support for {supported_brand} devices is provided by {flow_domain_name}. Do you want to continue?", - "missing_zwave_zigbee": "To add a {brand} device, you first need {supported_hardware_link} and the {integration} integration set up. If you already have the hardware then you can proceed with the setup of {integration}.", "missing_zwave_zigbee_title": "{integration} is not setup", + "missing_zwave_zigbee": "To add a {brand} device, you first need {supported_hardware_link} and the {integration} integration set up. If you already have the hardware then you can proceed with the setup of {integration}.", + "missing_matter": "To add a {brand} device, you first need the {integration} integration and {supported_hardware_link}. Do you want to proceed with the setup of {integration}?", + "matter_mobile_app": "You need to use the Home Assistant Companion app on your mobile phone to commission Matter devices.", "supported_hardware": "supported hardware", "proceed": "Proceed" } From 57f7dfb64873fc484f1285522a0ce198c4486852 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 18:23:56 +0100 Subject: [PATCH 014/138] Bump idb-keyval from 5.1.3 to 6.2.0 (#15310) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index b5dc559ada..7593730599 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "hammerjs": "^2.0.8", "hls.js": "^1.3.1", "home-assistant-js-websocket": "^8.0.1", - "idb-keyval": "^5.1.3", + "idb-keyval": "^6.2.0", "intl-messageformat": "^10.3.0", "js-yaml": "^4.1.0", "leaflet": "^1.9.3", diff --git a/yarn.lock b/yarn.lock index eae0f54db4..9457490256 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9497,7 +9497,7 @@ fsevents@^1.2.7: home-assistant-js-websocket: ^8.0.1 html-minifier: ^4.0.0 husky: ^8.0.3 - idb-keyval: ^5.1.3 + idb-keyval: ^6.2.0 instant-mocha: ^1.5.0 intl-messageformat: ^10.3.0 js-yaml: ^4.1.0 @@ -9809,12 +9809,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"idb-keyval@npm:^5.1.3": - version: 5.1.3 - resolution: "idb-keyval@npm:5.1.3" +"idb-keyval@npm:^6.2.0": + version: 6.2.0 + resolution: "idb-keyval@npm:6.2.0" dependencies: - safari-14-idb-fix: ^1.0.4 - checksum: c9934b5f56b81cc0806e7a89ef219b8314ef73dbb6f86c4ae4d891f98fc46f35a980f7b94faae3b4b3b8f3616d575782163e2d8dc74ee09aed47a8334db40917 + safari-14-idb-fix: ^3.0.0 + checksum: ddd58f95829ff734e3e83b29608709cdfba38e5795b1f6261ff1afc582ce48f475d0c827d7cf32aacbc5ea6b13d00c2d4a2f7240afccd5252565abeafbd7b990 languageName: node linkType: hard @@ -13898,10 +13898,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"safari-14-idb-fix@npm:^1.0.4": - version: 1.0.4 - resolution: "safari-14-idb-fix@npm:1.0.4" - checksum: a9b9b47a86b072a4b933228fa76a6a2df11cdbe9e4018f827f72b68752e8e16420db4d4770dcf743ddfc823003105aa6ef39190f7c35dfba7201750f11232ab9 +"safari-14-idb-fix@npm:^3.0.0": + version: 3.0.0 + resolution: "safari-14-idb-fix@npm:3.0.0" + checksum: 30d5baf3d9a17b52842b2c3fd3f0001fde7095a36191b6140ac78c19e8e1ff4b2607b9beb3b066c6bec107ccb5399c96e29748a6f5fcd592425f806f5e36f759 languageName: node linkType: hard From 68d1ef56db6cf51dfc1553ecdad56bafeae96b0f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 18:26:11 +0100 Subject: [PATCH 015/138] Bump @webcomponents/webcomponentsjs from 2.2.10 to 2.7.0 (#15262) Co-authored-by: dependabot[bot] <49699333+dependabot[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 7593730599..1b1be4c82f 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "@vibrant/quantizer-mmcq": "^3.2.1-alpha.1", "@vue/web-component-wrapper": "^1.3.0", "@webcomponents/scoped-custom-element-registry": "^0.0.5", - "@webcomponents/webcomponentsjs": "^2.2.10", + "@webcomponents/webcomponentsjs": "^2.7.0", "app-datepicker": "^5.1.0", "chart.js": "^3.3.2", "comlink": "^4.3.1", diff --git a/yarn.lock b/yarn.lock index 9457490256..0e43954a18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5167,10 +5167,10 @@ __metadata: languageName: node linkType: hard -"@webcomponents/webcomponentsjs@npm:^2.2.10": - version: 2.2.10 - resolution: "@webcomponents/webcomponentsjs@npm:2.2.10" - checksum: 8d7a89e4dbe71290fe14e6142d7d6f33d80433c493544571d83fc5ebc23e2f0584cd86e29ca8b5f8d306ffd72084c2ab2a25a4ec3cee37ea96a487bb7c60f541 +"@webcomponents/webcomponentsjs@npm:^2.7.0": + version: 2.7.0 + resolution: "@webcomponents/webcomponentsjs@npm:2.7.0" + checksum: df60a5faf79d85eba334a42f7bffb101f0e01a8ee8cc3705f17c67c70247415c4440ad6e8fdd3c74dc5be097a436c4e4831824bef039a12b69f05e84a07187b7 languageName: node linkType: hard @@ -9458,7 +9458,7 @@ fsevents@^1.2.7: "@web/dev-server": ^0.0.24 "@web/dev-server-rollup": ^0.2.11 "@webcomponents/scoped-custom-element-registry": ^0.0.5 - "@webcomponents/webcomponentsjs": ^2.2.10 + "@webcomponents/webcomponentsjs": ^2.7.0 app-datepicker: ^5.1.0 babel-loader: ^9.1.2 chai: ^4.3.7 From 9f6d9d8b0bcb2c7e3f305356f60cffe3699d0976 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 17:34:17 +0000 Subject: [PATCH 016/138] Bump tsparticles from 1.34.0 to 2.8.0 (#15367) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bram Kragten --- package.json | 3 +- src/html/onboarding.html.template | 3 + src/onboarding/ha-onboarding.ts | 2 +- src/onboarding/particles.ts | 144 ++++++++++++++++-------------- yarn.lock | 100 +++++++++++++++++---- 5 files changed, 165 insertions(+), 87 deletions(-) diff --git a/package.json b/package.json index 1b1be4c82f..8dc8f949e4 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,8 @@ "sortablejs": "^1.15.0", "superstruct": "^1.0.3", "tinykeys": "^1.1.3", - "tsparticles": "^1.34.0", + "tsparticles-engine": "^2.8.0", + "tsparticles-preset-links": "^2.8.0", "unfetch": "^4.1.0", "vis-data": "^7.1.2", "vis-network": "^8.5.4", diff --git a/src/html/onboarding.html.template b/src/html/onboarding.html.template index 1dd9b0c7ce..2b81e1a84f 100644 --- a/src/html/onboarding.html.template +++ b/src/html/onboarding.html.template @@ -13,6 +13,9 @@ color: var(--primary-text-color, #212121); background-color: #0277bd !important; } + body { + height: auto; + } .content { box-sizing: border-box; padding: 20px 16px; diff --git a/src/onboarding/ha-onboarding.ts b/src/onboarding/ha-onboarding.ts index 1c4e6ffbe5..72dabb9d9a 100644 --- a/src/onboarding/ha-onboarding.ts +++ b/src/onboarding/ha-onboarding.ts @@ -72,7 +72,7 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { const step = this._curStep()!; if (this._loading || !step) { - return html` `; + return html` `; } if (step.step === "user") { return html` diff --git a/src/onboarding/particles.ts b/src/onboarding/particles.ts index e3f49dd2a5..ca10b20259 100644 --- a/src/onboarding/particles.ts +++ b/src/onboarding/particles.ts @@ -1,82 +1,88 @@ -import { tsParticles } from "tsparticles"; +import { tsParticles } from "tsparticles-engine"; +import { loadLinksPreset } from "tsparticles-preset-links"; -tsParticles.load("particles", { - // autoPlay: true, - fullScreen: { - enable: true, - zIndex: -1, - }, - detectRetina: true, - fpsLimit: 60, - motion: { - disable: false, - reduce: { - factor: 4, - value: true, +loadLinksPreset(tsParticles).then(() => { + tsParticles.load("particles", { + preset: "links", + background: { + opacity: 0, }, - }, - particles: { - color: { - value: "#fff", - animation: { - enable: true, - speed: 50, - sync: false, + fullScreen: { + enable: true, + zIndex: -1, + }, + detectRetina: true, + fpsLimit: 60, + motion: { + disable: false, + reduce: { + factor: 4, + value: true, }, }, - links: { + particles: { color: { - value: "random", + value: "#fff", + animation: { + enable: true, + speed: 50, + sync: false, + }, }, - distance: 100, - enable: true, - frequency: 1, - opacity: 0.7, - width: 1, - }, - move: { - enable: true, - speed: 0.5, - }, - number: { - density: { + links: { + color: { + value: "random", + }, + distance: 100, enable: true, - area: 800, - factor: 1000, + frequency: 1, + opacity: 0.7, + width: 1, }, - limit: 0, - value: 50, - }, - opacity: { - random: { + move: { enable: true, - minimumValue: 0.3, - }, - value: 0.5, - animation: { - destroy: "none", - enable: true, - minimumValue: 0.3, speed: 0.5, - startValue: "random", - sync: false, + }, + number: { + density: { + enable: true, + area: 800, + factor: 1000, + }, + limit: 0, + value: 50, + }, + opacity: { + random: { + enable: true, + minimumValue: 0.3, + }, + value: 0.5, + animation: { + destroy: "none", + enable: true, + minimumValue: 0.3, + speed: 0.5, + startValue: "random", + sync: false, + }, + }, + size: { + random: { + enable: true, + minimumValue: 1, + }, + value: 3, + animation: { + destroy: "none", + enable: true, + minimumValue: 1, + speed: 3, + startValue: "random", + sync: false, + }, }, }, - size: { - random: { - enable: true, - minimumValue: 1, - }, - value: 3, - animation: { - destroy: "none", - enable: true, - minimumValue: 1, - speed: 3, - startValue: "random", - sync: false, - }, - }, - }, - pauseOnBlur: true, + pauseOnBlur: true, + }); }); diff --git a/yarn.lock b/yarn.lock index 0e43954a18..fc81797c02 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9542,7 +9542,8 @@ fsevents@^1.2.7: terser-webpack-plugin: ^5.2.4 tinykeys: ^1.1.3 ts-lit-plugin: ^1.2.1 - tsparticles: ^1.34.0 + tsparticles-engine: ^2.8.0 + tsparticles-preset-links: ^2.8.0 typescript: ^4.9.5 unfetch: ^4.1.0 vinyl-buffer: ^1.0.1 @@ -12855,13 +12856,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pathseg@npm:^1.2.1": - version: 1.2.1 - resolution: "pathseg@npm:1.2.1" - checksum: c83761317b4789d31162165bd34ebc36b99ef77ebfd971bfbc2e65c3400c72f10cd638224abe818dbd4cc8e72518977c29490963e2d9b3212ba37cbb7b730b16 - languageName: node - linkType: hard - "pathval@npm:^1.1.1": version: 1.1.1 resolution: "pathval@npm:1.1.1" @@ -15287,15 +15281,89 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tsparticles@npm:^1.34.0": - version: 1.34.0 - resolution: "tsparticles@npm:1.34.0" +"tsparticles-engine@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-engine@npm:2.8.0" + checksum: 100635a3456b62fc74baea157945d731ba6a02ad0e4e352ebbaf14f2a81d6c553e5807c93611c830676d8a0bd1c5e9a16039fbb1139d1e0a9611db175af50257 + languageName: node + linkType: hard + +"tsparticles-interaction-particles-links@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-interaction-particles-links@npm:2.8.0" dependencies: - pathseg: ^1.2.1 - dependenciesMeta: - pathseg: - optional: true - checksum: 1de222a6298d92721677a118c61e5f04013faacac40e61401cfa027c046dc5b6ac1daddf1fb09e81403a7c315fdcd3fe829b1fb1545a7eafeff78b9e0369f4d8 + tsparticles-engine: ^2.8.0 + checksum: ac7ec514ec0c3714b52da9c718c7573ad448d6edcc96ca4b79fa12ab5f1ea4e5d61c197a8460ded66d5c4a44dddd06b9e54bb28658f7aa734a70a1d7013ea9e4 + languageName: node + linkType: hard + +"tsparticles-move-base@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-move-base@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + checksum: f48155ad80a1a5b971bb30932bdda2b5c8476062516b17641036ed6ad3cacb80abbe6ba338673ff5e9b8f7782851112d426077952e393a9b737133abc09c89a9 + languageName: node + linkType: hard + +"tsparticles-preset-links@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-preset-links@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + tsparticles-interaction-particles-links: ^2.8.0 + tsparticles-move-base: ^2.8.0 + tsparticles-shape-circle: ^2.8.0 + tsparticles-updater-color: ^2.8.0 + tsparticles-updater-opacity: ^2.8.0 + tsparticles-updater-out-modes: ^2.8.0 + tsparticles-updater-size: ^2.8.0 + checksum: 2aa96837ce4ae5def66ee5799b27987bfe52362b35b1e40f8f2ef9f6a8cbd85dc5bb805fc0f8d8aa0896b73da5c25e3219ac803ff2d6e1b4225608ac20f5ea10 + languageName: node + linkType: hard + +"tsparticles-shape-circle@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-shape-circle@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + checksum: 391a1f018a6a4a01217acfc58f6f2b73b4ded7a7be26b45c05afb4c74d994fc186f5c2ede17a3f3dd70381f4c426c825f1c638d828861fd959c30e39cc191fc0 + languageName: node + linkType: hard + +"tsparticles-updater-color@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-updater-color@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + checksum: abc99d7aab6508b8023f0d375696d6d39dee096e2bc22d2f6d7b4495433430d7c8f3e5f2503cc25b53be0e698ef4811a87622b192a8a85fb141805fd8d433a54 + languageName: node + linkType: hard + +"tsparticles-updater-opacity@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-updater-opacity@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + checksum: 5897ad7144f59cecd1d6a69466d01a5d58e5f6ecd912b60f7371aff4321166bdbc5b13e0971b5a08cc2bd4e832008093418d493c2a5307b8087fae1867d2a15f + languageName: node + linkType: hard + +"tsparticles-updater-out-modes@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-updater-out-modes@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + checksum: 38564328405f50b8bdfc394f982b135031d6e9b967d9b76eb79984847b49a1507e8258d6a2de873ded3d89c3ef9b09dba767cd08a703c4459df2af1e44de8e77 + languageName: node + linkType: hard + +"tsparticles-updater-size@npm:^2.8.0": + version: 2.8.0 + resolution: "tsparticles-updater-size@npm:2.8.0" + dependencies: + tsparticles-engine: ^2.8.0 + checksum: 99465600be5353dfb4aa49313f1caa092828068996b333ce2059d8dc8dc75b242d69ab9390886a968b670a4cdf109835078afb365f1b5579e4010d9959b05880 languageName: node linkType: hard From e6dc47531009721d34cacd8afb2d6dc222787c47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 17:36:54 +0000 Subject: [PATCH 017/138] Bump @codemirror/view from 6.7.1 to 6.7.3 (#15366) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bram Kragten --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8dc8f949e4..da7d63aa63 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@codemirror/legacy-modes": "^6.3.1", "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.7.1", + "@codemirror/view": "^6.7.3", "@formatjs/intl-datetimeformat": "^6.4.3", "@formatjs/intl-getcanonicallocales": "^2.0.5", "@formatjs/intl-locale": "^3.0.11", diff --git a/yarn.lock b/yarn.lock index fc81797c02..1afe7822d7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1437,14 +1437,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.7.1": - version: 6.7.1 - resolution: "@codemirror/view@npm:6.7.1" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.7.3": + version: 6.7.3 + resolution: "@codemirror/view@npm:6.7.3" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 75a5846d61e63027e9bf1dfd0b507932934cb7650b7959c1191e68b161eb1756e9773f964c4331970b51864aef8f7954bc5cc8fdb51b0f6533de6c20568833ed + checksum: 37c0458cf45e52a1af9b9bef29108dd84bb91c6818ecad432d89627039d92f6b234b033cf14ecbc1c5b533694127478942fcc9641fdf52b9a1b20eccc018e27c languageName: node linkType: hard @@ -9369,7 +9369,7 @@ fsevents@^1.2.7: "@codemirror/legacy-modes": ^6.3.1 "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.7.1 + "@codemirror/view": ^6.7.3 "@formatjs/intl-datetimeformat": ^6.4.3 "@formatjs/intl-getcanonicallocales": ^2.0.5 "@formatjs/intl-locale": ^3.0.11 From 55484366789633b87b0ca0eb2e3c8d596743d51c Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Mon, 6 Feb 2023 12:41:59 -0500 Subject: [PATCH 018/138] Add eslint-plugin-lit-a11y and fix some errors (#15334) --- .eslintrc.json | 8 +- package.json | 1 + src/components/ha-clickable-list-item.ts | 7 +- src/components/ha-file-upload.ts | 2 - .../hui-dialog-create-headerfooter.ts | 2 +- yarn.lock | 402 ++++++++++++++++-- 6 files changed, 366 insertions(+), 56 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 644e04a073..5680879b3c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,6 +5,7 @@ "plugin:@typescript-eslint/recommended", "plugin:wc/recommended", "plugin:lit/all", + "plugin:lit-a11y/recommended", "prettier" ], "parser": "@typescript-eslint/parser", @@ -118,7 +119,12 @@ "lit/no-template-map": "off", "lit/no-native-attributes": "warn", "lit/no-this-assign-in-render": "warn", - "lit/prefer-nothing": "warn" + "lit/prefer-nothing": "warn", + "lit-a11y/click-events-have-key-events": ["off"], + "lit-a11y/no-autofocus": "off", + "lit-a11y/alt-text": "warn", + "lit-a11y/anchor-is-valid": "warn", + "lit-a11y/role-has-required-aria-attrs": "warn" }, "plugins": ["disable", "unused-imports"], "processor": "disable/disable" diff --git a/package.json b/package.json index da7d63aa63..8bbdff5851 100644 --- a/package.json +++ b/package.json @@ -195,6 +195,7 @@ "eslint-plugin-disable": "^2.0.3", "eslint-plugin-import": "^2.24.2", "eslint-plugin-lit": "^1.8.2", + "eslint-plugin-lit-a11y": "^2.3.0", "eslint-plugin-unused-imports": "^1.1.5", "eslint-plugin-wc": "^1.4.0", "fancy-log": "^2.0.0", diff --git a/src/components/ha-clickable-list-item.ts b/src/components/ha-clickable-list-item.ts index 43175efd08..4c73330cd0 100644 --- a/src/components/ha-clickable-list-item.ts +++ b/src/components/ha-clickable-list-item.ts @@ -17,11 +17,8 @@ export class HaClickableListItem extends HaListItem { const href = this.href || ""; return html`${this.disableHref - ? html`${r}` - : html`${r}` + : html`${r}`}`; } diff --git a/src/components/ha-file-upload.ts b/src/components/ha-file-upload.ts index fa85894bfc..045cac2daa 100644 --- a/src/components/ha-file-upload.ts +++ b/src/components/ha-file-upload.ts @@ -75,7 +75,6 @@ export class HaFileUpload extends LitElement { ${this.icon ? html` = 5" + checksum: 6bc589e7e2b17a1dfb5a883b02cd29728061a106322981c8b1c065454d54280567464fcc1564a9e7ade8c779890e4fd49ac31ff556e12d451c92ec76d668542a + languageName: node + linkType: hard + +"eslint-plugin-lit@npm:^1.6.0, eslint-plugin-lit@npm:^1.8.2": version: 1.8.2 resolution: "eslint-plugin-lit@npm:1.8.2" dependencies: @@ -7885,6 +7999,13 @@ __metadata: languageName: node linkType: hard +"eslint-rule-extender@npm:0.0.1": + version: 0.0.1 + resolution: "eslint-rule-extender@npm:0.0.1" + checksum: 53f57926c58dd37fdcabb524fdaef0ddaab045cff5b18d6598dfb381fb26657220b90f39a4823113b7d72f4fc27ae2b4620f02a6d8da18d4862c1c1013eab687 + languageName: node + linkType: hard + "eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -8607,6 +8728,15 @@ __metadata: languageName: node linkType: hard +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + "for-in@npm:^1.0.1, for-in@npm:^1.0.2": version: 1.0.2 resolution: "for-in@npm:1.0.2" @@ -8782,6 +8912,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"functions-have-names@npm:^1.2.2": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + "fuse.js@npm:^6.6.2": version: 6.6.2 resolution: "fuse.js@npm:6.6.2" @@ -8833,14 +8970,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.1 - resolution: "get-intrinsic@npm:1.1.1" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": + version: 1.2.0 + resolution: "get-intrinsic@npm:1.2.0" dependencies: function-bind: ^1.1.1 has: ^1.0.3 - has-symbols: ^1.0.1 - checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 + has-symbols: ^1.0.3 + checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d languageName: node linkType: hard @@ -9092,6 +9229,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + "graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -9259,10 +9405,19 @@ fsevents@^1.2.7: languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": - version: 1.0.2 - resolution: "has-symbols@npm:1.0.2" - checksum: 2309c426071731be792b5be43b3da6fb4ed7cbe8a9a6bcfca1862587709f01b33d575ce8f5c264c1eaad09fca2f9a8208c0a2be156232629daa2dd0c0740976b +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 languageName: node linkType: hard @@ -9479,6 +9634,7 @@ fsevents@^1.2.7: eslint-plugin-disable: ^2.0.3 eslint-plugin-import: ^2.24.2 eslint-plugin-lit: ^1.8.2 + eslint-plugin-lit-a11y: ^2.3.0 eslint-plugin-unused-imports: ^1.1.5 eslint-plugin-wc: ^1.4.0 fancy-log: ^2.0.0 @@ -9968,14 +10124,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" +"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4": + version: 1.0.4 + resolution: "internal-slot@npm:1.0.4" dependencies: - get-intrinsic: ^1.1.0 + get-intrinsic: ^1.1.3 has: ^1.0.3 side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf + checksum: 8974588d06bab4f675573a3b52975370facf6486df51bc0567a982c7024fa29495f10b76c0d4dc742dd951d1b72024fdc1e31bb0bedf1678dc7aacacaf5a4f73 languageName: node linkType: hard @@ -10071,6 +10227,27 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-arguments@npm:^1.1.1": + version: 1.1.1 + resolution: "is-arguments@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1": + version: 3.0.1 + resolution: "is-array-buffer@npm:3.0.1" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-typed-array: ^1.1.10 + checksum: f26ab87448e698285daf707e52a533920449f7abf63714140ffab9d5571aa5a71ac2fa2677e8b793ad0d5d3e40078d4d2c8a0ab39c957e3cfc6513bb6c9dfdc9 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -10119,10 +10296,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard @@ -10153,10 +10330,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.1 - resolution: "is-date-object@npm:1.0.1" - checksum: 4ce962ecb46d31e48652a247ba9a31697199308926ec8e330426f5de41007781c28617c7c972f188e9aa2dd3d77f725eaba7755d207cecdd49f32fc0beca4fed +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc languageName: node linkType: hard @@ -10283,6 +10462,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-map@npm:^2.0.1, is-map@npm:^2.0.2": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 + languageName: node + linkType: hard + "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" @@ -10427,10 +10613,19 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "is-shared-array-buffer@npm:1.0.1" - checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 +"is-set@npm:^2.0.1, is-set@npm:^2.0.2": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.1, is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a languageName: node linkType: hard @@ -10473,6 +10668,19 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-typed-array@npm:^1.1.10": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + 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 + languageName: node + linkType: hard + "is-unc-path@npm:^1.0.0": version: 1.0.0 resolution: "is-unc-path@npm:1.0.0" @@ -10505,6 +10713,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.1": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -10514,6 +10729,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + languageName: node + linkType: hard + "is-windows@npm:^1.0.1, is-windows@npm:^1.0.2": version: 1.0.2 resolution: "is-windows@npm:1.0.2" @@ -10544,6 +10769,13 @@ fsevents@^1.2.7: 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:^4.0.6": version: 4.0.6 resolution: "isbinaryfile@npm:4.0.6" @@ -10939,6 +11171,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"language-subtag-registry@npm:^0.3.20": + version: 0.3.22 + resolution: "language-subtag-registry@npm:0.3.22" + checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a + languageName: node + linkType: hard + +"language-tags@npm:^1.0.5": + version: 1.0.7 + resolution: "language-tags@npm:1.0.7" + dependencies: + language-subtag-registry: ^0.3.20 + checksum: 2f1ca8ffe4e549893817456ca1974dbff0f3cc8aea4e123e666dc6df85f3cf2d828b8143084388a7e2bec15fac77b7194151e43b5b32e63526dafe17a08a9fd0 + languageName: node + linkType: hard + "last-run@npm:^1.1.0": version: 1.1.1 resolution: "last-run@npm:1.1.1" @@ -12239,7 +12487,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": +"object-is@npm:^1.1.5": + version: 1.1.5 + resolution: "object-is@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a @@ -12255,15 +12513,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.assign@npm:^4.0.4, object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" +"object.assign@npm:^4.0.4, object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 languageName: node linkType: hard @@ -12697,6 +12955,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"parse5@npm:^4.0.0": + version: 4.0.0 + resolution: "parse5@npm:4.0.0" + checksum: 2123cec690689fed44e6c76aa8a08215d2dadece7eff7b35156dda7485e6a232c9b737313688ee715eb0678b6a87a31026927dd74690154f8a0811059845ba46 + languageName: node + linkType: hard + +"parse5@npm:^5.1.1": + version: 5.1.1 + resolution: "parse5@npm:5.1.1" + checksum: 613a714af4c1101d1cb9f7cece2558e35b9ae8a0c03518223a4a1e35494624d9a9ad5fad4c13eab66a0e0adccd9aa3d522fc8f5f9cc19789e0579f3fa0bdfc65 + languageName: node + linkType: hard + "parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -13443,13 +13715,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.3.1": - version: 1.4.1 - resolution: "regexp.prototype.flags@npm:1.4.1" +"regexp.prototype.flags@npm:^1.3.1, regexp.prototype.flags@npm:^1.4.3": + version: 1.4.3 + resolution: "regexp.prototype.flags@npm:1.4.3" dependencies: call-bind: ^1.0.2 define-properties: ^1.1.3 - checksum: 77944a3ea5ae84f391fa80bff9babfedc47eadc9dc38e282b5fd746368fb787deec89c68ce3114195bf6b5782b160280a278b62d41ccc6e125afab1a7f816de8 + functions-have-names: ^1.2.2 + checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 languageName: node linkType: hard @@ -13613,7 +13886,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"requireindex@npm:^1.2.0": +"requireindex@npm:^1.2.0, requireindex@npm:~1.2.0": version: 1.2.0 resolution: "requireindex@npm:1.2.0" checksum: 50d8b10a1ff1fdf6aea7a1870bc7bd238b0fb1917d8d7ca17fd03afc38a65dcd7a8a4eddd031f89128b5f0065833d5c92c4fef67f2c04e8624057fe626c9cf94 @@ -14583,6 +14856,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.0.0": + version: 1.0.0 + resolution: "stop-iteration-iterator@npm:1.0.0" + dependencies: + internal-slot: ^1.0.4 + checksum: d04173690b2efa40e24ab70e5e51a3ff31d56d699550cfad084104ab3381390daccb36652b25755e420245f3b0737de66c1879eaa2a8d4fc0a78f9bf892fcb42 + languageName: node + linkType: hard + "stream-exhaust@npm:^1.0.1": version: 1.0.2 resolution: "stream-exhaust@npm:1.0.2" @@ -16289,6 +16571,18 @@ typescript@^3.8.3: languageName: node linkType: hard +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: ^2.0.1 + is-set: ^2.0.1 + is-weakmap: ^2.0.1 + is-weakset: ^2.0.1 + checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + languageName: node + linkType: hard + "which-module@npm:^1.0.0": version: 1.0.0 resolution: "which-module@npm:1.0.0" @@ -16303,6 +16597,20 @@ typescript@^3.8.3: languageName: node linkType: hard +"which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" + 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 + languageName: node + linkType: hard + "which@npm:2.0.2, which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" From 84902bd01fcfedfb5dc37ac0dbf8aafadaea2e25 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 6 Feb 2023 09:45:23 -0800 Subject: [PATCH 019/138] Missing parenthesis breaks map tooltip format (#15326) --- src/panels/lovelace/cards/hui-map-card.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-map-card.ts b/src/panels/lovelace/cards/hui-map-card.ts index ad8ec6cc1d..2d70716f0f 100644 --- a/src/panels/lovelace/cards/hui-map-card.ts +++ b/src/panels/lovelace/cards/hui-map-card.ts @@ -341,7 +341,7 @@ class HuiMapCard extends LitElement implements LovelaceCard { const p = {} as HaMapPathPoint; p.point = [latitude, longitude] as LatLngTuple; const t = new Date(entityState.lu * 1000); - if (config.hours_to_show! ?? DEFAULT_HOURS_TO_SHOW > 144) { + if ((config.hours_to_show! ?? DEFAULT_HOURS_TO_SHOW) > 144) { // if showing > 6 days in the history trail, show the full // date and time p.tooltip = formatDateTime(t, this.hass.locale); From c6eee9bf74cd6498e1f2f1fbd963eb99fe6ee223 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 6 Feb 2023 22:06:25 +0100 Subject: [PATCH 020/138] Update create helper dialog (#15288) --- src/components/ha-dialog.ts | 5 +- .../config/helpers/dialog-helper-detail.ts | 50 +++++++++++++------ 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 1e69ad2ac4..080dc647d9 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -46,7 +46,10 @@ export class HaDialog extends DialogBase { styles, css` .mdc-dialog { - --mdc-dialog-scroll-divider-color: var(--divider-color); + --mdc-dialog-scroll-divider-color: var( + --dialog-scroll-divider-color, + var(--divider-color) + ); z-index: var(--dialog-z-index, 7); -webkit-backdrop-filter: var(--dialog-backdrop-filter, none); backdrop-filter: var(--dialog-backdrop-filter, none); diff --git a/src/panels/config/helpers/dialog-helper-detail.ts b/src/panels/config/helpers/dialog-helper-detail.ts index ab0e7c5d64..1cab181d17 100644 --- a/src/panels/config/helpers/dialog-helper-detail.ts +++ b/src/panels/config/helpers/dialog-helper-detail.ts @@ -9,7 +9,8 @@ import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { dynamicElement } from "../../../common/dom/dynamic-element-directive"; import { shouldHandleRequestSelectedEvent } from "../../../common/mwc/handle-request-selected-event"; import "../../../components/ha-circular-progress"; -import "../../../components/ha-dialog"; +import { createCloseHeading } from "../../../components/ha-dialog"; +import "../../../components/ha-list-item"; import { getConfigFlowHandlers } from "../../../data/config_flow"; import { createCounter } from "../../../data/counter"; import { createInputBoolean } from "../../../data/input_boolean"; @@ -167,8 +168,9 @@ export class DialogHelperDetail extends LitElement { const isLoaded = !(domain in HELPERS) || isComponentLoaded(this.hass, domain); return html` - ${label} - + + ${!isLoaded ? html` - - ${this.hass!.localize("ui.common.cancel")} - `; } @@ -214,15 +214,19 @@ export class DialogHelperDetail extends LitElement { class=${classMap({ "button-left": !this._domain })} scrimClickAction escapeKeyAction - .heading=${this._domain - ? this.hass.localize( - "ui.panel.config.helpers.dialog.create_platform", - "platform", - this.hass.localize( - `ui.panel.config.helpers.types.${this._domain}` - ) || this._domain - ) - : this.hass.localize("ui.panel.config.helpers.dialog.create_helper")} + .hideActions=${!this._domain} + .heading=${createCloseHeading( + this.hass, + this._domain + ? this.hass.localize( + "ui.panel.config.helpers.dialog.create_platform", + "platform", + this.hass.localize( + `ui.panel.config.helpers.types.${this._domain}` + ) || this._domain + ) + : this.hass.localize("ui.panel.config.helpers.dialog.create_helper") + )} > ${content} @@ -285,6 +289,22 @@ export class DialogHelperDetail extends LitElement { ha-dialog.button-left { --justify-action-buttons: flex-start; } + ha-dialog { + --dialog-content-padding: 0; + --dialog-scroll-divider-color: transparent; + --mdc-dialog-max-height: 60vh; + } + @media all and (min-width: 550px) { + ha-dialog { + --mdc-dialog-min-width: 500px; + } + } + ha-icon-next { + width: 24px; + } + .form { + padding: 24px; + } `, ]; } From d570d063c7ca2dba65dd5ee1d07ddf3c12cbf7c4 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Mon, 6 Feb 2023 22:37:05 +0100 Subject: [PATCH 021/138] Optionally update sensor units when unit system changes (#15287) Co-authored-by: Bram Kragten --- .../config/core/ha-config-section-general.ts | 67 +++++++++++++++++-- src/translations/en.json | 9 ++- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/panels/config/core/ha-config-section-general.ts b/src/panels/config/core/ha-config-section-general.ts index 900b5ccdac..31abfd8346 100644 --- a/src/panels/config/core/ha-config-section-general.ts +++ b/src/panels/config/core/ha-config-section-general.ts @@ -26,6 +26,9 @@ import "../../../layouts/hass-subpage"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import "../../../components/ha-alert"; +import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; +import type { HaCheckbox } from "../../../components/ha-checkbox"; +import "../../../components/ha-checkbox"; @customElement("ha-config-section-general") class HaConfigSectionGeneral extends LitElement { @@ -55,6 +58,8 @@ class HaConfigSectionGeneral extends LitElement { @state() private _error?: string; + @state() private _updateUnits?: boolean; + protected render(): TemplateResult { const canEdit = ["storage", "default"].includes( this.hass.config.config_source @@ -174,6 +179,32 @@ class HaConfigSectionGeneral extends LitElement { .disabled=${this._submitting} > + ${this._unitSystem !== this._configuredUnitSystem() + ? html` + + + +
+ ${this.hass.localize( + "ui.panel.config.core.section.core.core_config.update_units_text_1" + )} + ${this.hass.localize( + "ui.panel.config.core.section.core.core_config.update_units_text_2" + )}

+ ${this.hass.localize( + "ui.panel.config.core.section.core.core_config.update_units_text_3" + )} +
+ ` + : ""}
Date: Tue, 7 Feb 2023 05:55:47 +0100 Subject: [PATCH 022/138] Add my support for matter (#15372) * Add my support for matter * Update ha-panel-config.ts --- .../integrations/protocolIntegrationPicked.ts | 3 +- .../integrations/ha-config-integrations.ts | 11 +- .../matter/matter-add-device.ts | 22 ++ .../matter/matter-config-dashboard.ts | 212 +++++++++++++++ .../matter/matter-config-panel.ts | 248 ++++-------------- src/panels/my/ha-panel-my.ts | 15 +- 6 files changed, 304 insertions(+), 207 deletions(-) create mode 100644 src/panels/config/integrations/integration-panels/matter/matter-add-device.ts create mode 100644 src/panels/config/integrations/integration-panels/matter/matter-config-dashboard.ts diff --git a/src/common/integrations/protocolIntegrationPicked.ts b/src/common/integrations/protocolIntegrationPicked.ts index dfc3a89f7a..558bee552d 100644 --- a/src/common/integrations/protocolIntegrationPicked.ts +++ b/src/common/integrations/protocolIntegrationPicked.ts @@ -130,8 +130,9 @@ export const protocolIntegrationPicked = async ( text: hass.localize( "ui.panel.config.integrations.config_flow.missing_matter", { + integration: "Matter", brand: options?.brand || options?.domain || "Matter", - link: html` { - if (["zha", "zwave_js"].includes(integration.supported_by!)) { + if ( + (PROTOCOL_INTEGRATIONS as ReadonlyArray).includes( + integration.supported_by! + ) + ) { protocolIntegrationPicked( this, this.hass, diff --git a/src/panels/config/integrations/integration-panels/matter/matter-add-device.ts b/src/panels/config/integrations/integration-panels/matter/matter-add-device.ts new file mode 100644 index 0000000000..76a5bbadf2 --- /dev/null +++ b/src/panels/config/integrations/integration-panels/matter/matter-add-device.ts @@ -0,0 +1,22 @@ +import { customElement } from "lit/decorators"; +import { navigate } from "../../../../../common/navigate"; +import { HomeAssistant } from "../../../../../types"; +import { showMatterAddDeviceDialog } from "./show-dialog-add-matter-device"; + +@customElement("matter-add-device") +export class MatterAddDevice extends HTMLElement { + public hass!: HomeAssistant; + + connectedCallback() { + showMatterAddDeviceDialog(this); + navigate(`/config/devices`, { + replace: true, + }); + } +} + +declare global { + interface HTMLElementTagNameMap { + "matter-add-device": MatterAddDevice; + } +} diff --git a/src/panels/config/integrations/integration-panels/matter/matter-config-dashboard.ts b/src/panels/config/integrations/integration-panels/matter/matter-config-dashboard.ts new file mode 100644 index 0000000000..29e4a62650 --- /dev/null +++ b/src/panels/config/integrations/integration-panels/matter/matter-config-dashboard.ts @@ -0,0 +1,212 @@ +import "@material/mwc-button"; +import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { css, html, LitElement, TemplateResult } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; +import "../../../../../components/ha-alert"; +import "../../../../../components/ha-card"; +import { + acceptSharedMatterDevice, + canCommissionMatterExternal, + commissionMatterDevice, + matterSetThread, + matterSetWifi, + redirectOnNewMatterDevice, + startExternalCommissioning, +} from "../../../../../data/matter"; +import { showPromptDialog } from "../../../../../dialogs/generic/show-dialog-box"; +import "../../../../../layouts/hass-subpage"; +import { haStyle } from "../../../../../resources/styles"; +import { HomeAssistant } from "../../../../../types"; + +@customElement("matter-config-dashboard") +export class MatterConfigDashboard extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ type: Boolean }) public narrow!: boolean; + + @state() private _error?: string; + + private _unsub?: UnsubscribeFunc; + + disconnectedCallback() { + super.disconnectedCallback(); + this._stopRedirect(); + } + + protected render(): TemplateResult { + return html` + + ${isComponentLoaded(this.hass, "otbr") + ? html` + + Visit Thread Panel + + ` + : ""} +
+ + Matter is still in the early phase of development, it is not + meant to be used in production. This panel is for development + only. +
+ ${this._error + ? html`${this._error}` + : ""} + You can add Matter devices by commissing them if they are not + setup yet, or share them from another controller and enter the + share code. +
+
+ ${canCommissionMatterExternal(this.hass) + ? html`Commission device with mobile app` + : ""} + Commission device + Add shared device + Set WiFi Credentials + Set Thread Credentials +
+
+
+ + `; + } + + private _redirectOnNewMatterDevice() { + if (this._unsub) { + return; + } + this._unsub = redirectOnNewMatterDevice(this.hass, () => { + this._unsub = undefined; + }); + } + + private _stopRedirect() { + this._unsub?.(); + this._unsub = undefined; + } + + private _startMobileCommissioning() { + this._redirectOnNewMatterDevice(); + startExternalCommissioning(this.hass); + } + + private async _setWifi(): Promise { + this._error = undefined; + const networkName = await showPromptDialog(this, { + title: "Network name", + inputLabel: "Network name", + inputType: "string", + confirmText: "Continue", + }); + if (!networkName) { + return; + } + const psk = await showPromptDialog(this, { + title: "Passcode", + inputLabel: "Code", + inputType: "password", + confirmText: "Set Wifi", + }); + if (!psk) { + return; + } + try { + await matterSetWifi(this.hass, networkName, psk); + } catch (err: any) { + this._error = err.message; + } + } + + private async _commission(): Promise { + const code = await showPromptDialog(this, { + title: "Commission device", + inputLabel: "Code", + inputType: "string", + confirmText: "Commission", + }); + if (!code) { + return; + } + this._error = undefined; + this._redirectOnNewMatterDevice(); + try { + await commissionMatterDevice(this.hass, code); + } catch (err: any) { + this._error = err.message; + this._stopRedirect(); + } + } + + private async _acceptSharedDevice(): Promise { + const code = await showPromptDialog(this, { + title: "Add shared device", + inputLabel: "Pin", + inputType: "number", + confirmText: "Accept device", + }); + if (!code) { + return; + } + this._error = undefined; + this._redirectOnNewMatterDevice(); + try { + await acceptSharedMatterDevice(this.hass, Number(code)); + } catch (err: any) { + this._error = err.message; + this._stopRedirect(); + } + } + + private async _setThread(): Promise { + const code = await showPromptDialog(this, { + title: "Set Thread operation", + inputLabel: "Dataset", + inputType: "string", + confirmText: "Set Thread", + }); + if (!code) { + return; + } + this._error = undefined; + try { + await matterSetThread(this.hass, code); + } catch (err: any) { + this._error = err.message; + } + } + + static styles = [ + haStyle, + css` + ha-alert[alert-type="warning"] { + position: relative; + top: -16px; + } + .content { + padding: 24px 0 32px; + max-width: 600px; + margin: 0 auto; + direction: ltr; + } + ha-card:first-child { + margin-bottom: 16px; + } + a[slot="toolbar-icon"] { + text-decoration: none; + } + `, + ]; +} diff --git a/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts b/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts index 20fcc722f9..e6aa5b102f 100644 --- a/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/matter/matter-config-panel.ts @@ -1,212 +1,58 @@ -import "@material/mwc-button"; -import { UnsubscribeFunc } from "home-assistant-js-websocket"; -import { css, html, LitElement, TemplateResult } from "lit"; -import { customElement, property, state } from "lit/decorators"; -import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; -import "../../../../../components/ha-alert"; -import "../../../../../components/ha-card"; +import { mdiMathLog, mdiServerNetwork } from "@mdi/js"; +import { customElement, property } from "lit/decorators"; import { - acceptSharedMatterDevice, - canCommissionMatterExternal, - commissionMatterDevice, - matterSetThread, - matterSetWifi, - redirectOnNewMatterDevice, - startExternalCommissioning, -} from "../../../../../data/matter"; -import { showPromptDialog } from "../../../../../dialogs/generic/show-dialog-box"; -import "../../../../../layouts/hass-subpage"; -import { haStyle } from "../../../../../resources/styles"; + HassRouterPage, + RouterOptions, +} from "../../../../../layouts/hass-router-page"; +import { PageNavigation } from "../../../../../layouts/hass-tabs-subpage"; import { HomeAssistant } from "../../../../../types"; +export const configTabs: PageNavigation[] = [ + { + translationKey: "ui.panel.config.zwave_js.navigation.network", + path: `/config/zwave_js/dashboard`, + iconPath: mdiServerNetwork, + }, + { + translationKey: "ui.panel.config.zwave_js.navigation.logs", + path: `/config/zwave_js/logs`, + iconPath: mdiMathLog, + }, +]; + @customElement("matter-config-panel") -export class MatterConfigPanel extends LitElement { +class MatterConfigRouter extends HassRouterPage { @property({ attribute: false }) public hass!: HomeAssistant; - @property({ type: Boolean }) public narrow!: boolean; + @property() public isWide!: boolean; - @state() private _error?: string; + @property() public narrow!: boolean; - private _unsub?: UnsubscribeFunc; + protected routerOptions: RouterOptions = { + defaultPage: "dashboard", + showLoading: true, + routes: { + dashboard: { + tag: "matter-config-dashboard", + load: () => import("./matter-config-dashboard"), + }, + add: { + tag: "matter-add-device", + load: () => import("./matter-add-device"), + }, + }, + }; - disconnectedCallback() { - super.disconnectedCallback(); - this._stopRedirect(); + protected updatePageEl(el): void { + el.route = this.routeTail; + el.hass = this.hass; + el.isWide = this.isWide; + el.narrow = this.narrow; + } +} + +declare global { + interface HTMLElementTagNameMap { + "matter-config-panel": MatterConfigRouter; } - - protected render(): TemplateResult { - return html` - - ${isComponentLoaded(this.hass, "otbr") - ? html` - - Visit Thread Panel - - ` - : ""} -
- - Matter is still in the early phase of development, it is not - meant to be used in production. This panel is for development - only. -
- ${this._error - ? html`${this._error}` - : ""} - You can add Matter devices by commissing them if they are not - setup yet, or share them from another controller and enter the - share code. -
-
- ${canCommissionMatterExternal(this.hass) - ? html`Commission device with mobile app` - : ""} - Commission device - Add shared device - Set WiFi Credentials - Set Thread Credentials -
-
-
-
- `; - } - - private _redirectOnNewMatterDevice() { - if (this._unsub) { - return; - } - this._unsub = redirectOnNewMatterDevice(this.hass, () => { - this._unsub = undefined; - }); - } - - private _stopRedirect() { - this._unsub?.(); - this._unsub = undefined; - } - - private _startMobileCommissioning() { - this._redirectOnNewMatterDevice(); - startExternalCommissioning(this.hass); - } - - private async _setWifi(): Promise { - this._error = undefined; - const networkName = await showPromptDialog(this, { - title: "Network name", - inputLabel: "Network name", - inputType: "string", - confirmText: "Continue", - }); - if (!networkName) { - return; - } - const psk = await showPromptDialog(this, { - title: "Passcode", - inputLabel: "Code", - inputType: "password", - confirmText: "Set Wifi", - }); - if (!psk) { - return; - } - try { - await matterSetWifi(this.hass, networkName, psk); - } catch (err: any) { - this._error = err.message; - } - } - - private async _commission(): Promise { - const code = await showPromptDialog(this, { - title: "Commission device", - inputLabel: "Code", - inputType: "string", - confirmText: "Commission", - }); - if (!code) { - return; - } - this._error = undefined; - this._redirectOnNewMatterDevice(); - try { - await commissionMatterDevice(this.hass, code); - } catch (err: any) { - this._error = err.message; - this._stopRedirect(); - } - } - - private async _acceptSharedDevice(): Promise { - const code = await showPromptDialog(this, { - title: "Add shared device", - inputLabel: "Pin", - inputType: "number", - confirmText: "Accept device", - }); - if (!code) { - return; - } - this._error = undefined; - this._redirectOnNewMatterDevice(); - try { - await acceptSharedMatterDevice(this.hass, Number(code)); - } catch (err: any) { - this._error = err.message; - this._stopRedirect(); - } - } - - private async _setThread(): Promise { - const code = await showPromptDialog(this, { - title: "Set Thread operation", - inputLabel: "Dataset", - inputType: "string", - confirmText: "Set Thread", - }); - if (!code) { - return; - } - this._error = undefined; - try { - await matterSetThread(this.hass, code); - } catch (err: any) { - this._error = err.message; - } - } - - static styles = [ - haStyle, - css` - ha-alert[alert-type="warning"] { - position: relative; - top: -16px; - } - .content { - padding: 24px 0 32px; - max-width: 600px; - margin: 0 auto; - direction: ltr; - } - ha-card:first-child { - margin-bottom: 16px; - } - a[slot="toolbar-icon"] { - text-decoration: none; - } - `, - ]; } diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index 7960d31dba..609aba96f2 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -2,7 +2,10 @@ import { sanitizeUrl } from "@braintree/sanitize-url"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators"; import { isComponentLoaded } from "../../common/config/is_component_loaded"; -import { protocolIntegrationPicked } from "../../common/integrations/protocolIntegrationPicked"; +import { + protocolIntegrationPicked, + PROTOCOL_INTEGRATIONS, +} from "../../common/integrations/protocolIntegrationPicked"; import { navigate } from "../../common/navigate"; import { createSearchParam, @@ -87,6 +90,10 @@ export const getMyRedirects = (hasSupervisor: boolean): Redirects => ({ component: "zwave_js", redirect: "/config/zwave_js/add", }, + add_matter_device: { + component: "matter", + redirect: "/config/matter/add", + }, config_energy: { component: "energy", redirect: "/config/energy/dashboard", @@ -310,9 +317,11 @@ class HaPanelMy extends LitElement { ) { this.hass.loadBackendTranslation("title", this._redirect.component); this._error = "no_component"; - if (["add_zwave_device", "add_zigbee_device"].includes(path)) { + const component = this._redirect.component; + if ( + (PROTOCOL_INTEGRATIONS as ReadonlyArray).includes(component) + ) { const params = extractSearchParamsObject(); - const component = this._redirect.component; this.hass .loadFragmentTranslation("config") .then() From 251b2540c77914c45cc9f52a52db34db1d8ca692 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 00:18:38 -0500 Subject: [PATCH 023/138] Bump @typescript-eslint/eslint-plugin from 5.50.0 to 5.51.0 (#15375) --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 8bbdff5851..8237983450 100644 --- a/package.json +++ b/package.json @@ -180,7 +180,7 @@ "@types/sortablejs": "^1", "@types/tar": "^6", "@types/webspeechapi": "^0.0.29", - "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/eslint-plugin": "^5.51.0", "@typescript-eslint/parser": "^5.49.0", "@web/dev-server": "^0.0.24", "@web/dev-server-rollup": "^0.2.11", diff --git a/yarn.lock b/yarn.lock index 5fddc39e64..3bbf9d23e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4447,13 +4447,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.50.0" +"@typescript-eslint/eslint-plugin@npm:^5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.51.0" dependencies: - "@typescript-eslint/scope-manager": 5.50.0 - "@typescript-eslint/type-utils": 5.50.0 - "@typescript-eslint/utils": 5.50.0 + "@typescript-eslint/scope-manager": 5.51.0 + "@typescript-eslint/type-utils": 5.51.0 + "@typescript-eslint/utils": 5.51.0 debug: ^4.3.4 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 @@ -4467,7 +4467,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 351c4a157a7d717cc3835bdc09324b20d649463738a029c5701e5a38cdb162305ff7d56adff196a0c3245c24ea3167bbdac7f1c30399b8c1d495abbdbc1c53d6 + checksum: 5351d8cec13bd9867ce4aaf7052aa31c9ca867fc89c620fc0fe5718ac2cbc165903275db59974324d98e45df0d33a73a4367d236668772912731031a672cfdcd languageName: node linkType: hard @@ -4498,22 +4498,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/scope-manager@npm:5.50.0" +"@typescript-eslint/scope-manager@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/scope-manager@npm:5.51.0" dependencies: - "@typescript-eslint/types": 5.50.0 - "@typescript-eslint/visitor-keys": 5.50.0 - checksum: bd49447a834c82cb130e6900644042c3a84195bf7a63483385e90b6454c65856d6f276c997cad6bf9c36c9d0cb168fdde625ce4c78c3b8bcce42da782270794b + "@typescript-eslint/types": 5.51.0 + "@typescript-eslint/visitor-keys": 5.51.0 + checksum: b3c9f48b6b7a7ae2ebcad4745ef91e4727776b2cf56d31be6456b1aa063aa649539e20f9fffa83cad9ccaaa9c492f2354a1c15526a2b789e235ec58b3a82d22c languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/type-utils@npm:5.50.0" +"@typescript-eslint/type-utils@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/type-utils@npm:5.51.0" dependencies: - "@typescript-eslint/typescript-estree": 5.50.0 - "@typescript-eslint/utils": 5.50.0 + "@typescript-eslint/typescript-estree": 5.51.0 + "@typescript-eslint/utils": 5.51.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -4521,7 +4521,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: d2fc2fd10ef300865fd6a902ae92aef6c45cddc4359445f1e5c6dc9511063b52d2170cc6b525763395d4171c177b3d0fffd77cf9a2ab7e01fcd7109bd1a5a585 + checksum: ab9747b0c629cfaaab903eed8ce1e39d34d69a402ce5faf2f1fff2bbb461bdbe034044b1368ba67ba8e5c1c512172e07d83c8a563635d8de811bf148d95c7dec languageName: node linkType: hard @@ -4532,10 +4532,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/types@npm:5.50.0" - checksum: 1189c63d35abeec685dd519fd923926b884e63d5e10e4a9fe995aebfde59b8a2e10773090ec3ba32a0ec408746b18f6a454d9bedb0b6c7ce8b6066547144fb4d +"@typescript-eslint/types@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/types@npm:5.51.0" + checksum: b31021a0866f41ba5d71b6c4c7e20cc9b99d49c93bb7db63b55b2e51542fb75b4e27662ee86350da3c1318029e278a5a807facaf4cb5aeea724be8b0e021e836 languageName: node linkType: hard @@ -4557,12 +4557,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.50.0" +"@typescript-eslint/typescript-estree@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.51.0" dependencies: - "@typescript-eslint/types": 5.50.0 - "@typescript-eslint/visitor-keys": 5.50.0 + "@typescript-eslint/types": 5.51.0 + "@typescript-eslint/visitor-keys": 5.51.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -4571,25 +4571,25 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: cb1ac8d39647da6d52750c713d9635750ed41245ec82f937a159a71ad3bf490ebabfad3b43eeca07bca39d60df30d3a2f31f8bed0061381731d92a62e284b867 + checksum: aec23e5cab48ee72fefa6d1ac266639ebabf6cebec1e0207ad47011d3a48186ac9a632c8e34c3bac896155f54895a497230c11d789fd81263b08eb267d7113ce languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/utils@npm:5.50.0" +"@typescript-eslint/utils@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/utils@npm:5.51.0" dependencies: "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.50.0 - "@typescript-eslint/types": 5.50.0 - "@typescript-eslint/typescript-estree": 5.50.0 + "@typescript-eslint/scope-manager": 5.51.0 + "@typescript-eslint/types": 5.51.0 + "@typescript-eslint/typescript-estree": 5.51.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 4471ae8b24449300e009f1cc09ee0d38cce20ae9171e8fbf4ef752ce4eb87104cc0d813d8f7051b619fa05e1e7c12b748dad49832911685297b1bbfef3c01f0b + checksum: c6e28c942fbac5500f0e8ed67ef304b484ba296486e55306f78fb090dc9d5bb1f25a0bedc065e14680041eadce5e95fa10aab618cb0c316599ec987e6ea72442 languageName: node linkType: hard @@ -4603,13 +4603,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.50.0": - version: 5.50.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.50.0" +"@typescript-eslint/visitor-keys@npm:5.51.0": + version: 5.51.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.51.0" dependencies: - "@typescript-eslint/types": 5.50.0 + "@typescript-eslint/types": 5.51.0 eslint-visitor-keys: ^3.3.0 - checksum: 55319cb7ee7b78d07d9dc67a388d69fe0b7f11cbc79190e17e7f87a39c9992d08dab3b5872d5a7f01094dda28ad6ac61d3573e59015ef70bf138d4c4f8c45b88 + checksum: b49710f3c6b3b62a846a163afffd81be5eb2b1f44e25bec51ff3c9f4c3b579d74aa4cbd3753b4fc09ea3dbc64a7062f9c658c08d22bb2740a599cb703d876220 languageName: node linkType: hard @@ -9602,7 +9602,7 @@ fsevents@^1.2.7: "@types/sortablejs": ^1 "@types/tar": ^6 "@types/webspeechapi": ^0.0.29 - "@typescript-eslint/eslint-plugin": ^5.50.0 + "@typescript-eslint/eslint-plugin": ^5.51.0 "@typescript-eslint/parser": ^5.49.0 "@vaadin/combo-box": ^23.3.6 "@vaadin/vaadin-themable-mixin": ^23.3.6 From a74c05a004d916d6afba2a054f25236f1c9d522e Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Tue, 7 Feb 2023 01:10:15 -0800 Subject: [PATCH 024/138] Rerun layoutOptions when input_select options change (#15274) fixes undefined --- .../hui-input-select-entity-row.ts | 23 +++++++++++++-- src/state-summary/state-card-input_select.ts | 29 +++++++++++++++++-- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts index 896c8c4113..ac5003d2ee 100644 --- a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts @@ -1,6 +1,6 @@ import "@material/mwc-list/mwc-list-item"; import { css, html, LitElement, PropertyValues, TemplateResult } from "lit"; -import { customElement, property, state } from "lit/decorators"; +import { customElement, property, state, query } from "lit/decorators"; import { stopPropagation } from "../../../common/dom/stop_propagation"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/ha-select"; @@ -16,6 +16,7 @@ import { hasConfigOrEntityChanged } from "../common/has-changed"; import "../components/hui-generic-entity-row"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import { LovelaceRow } from "./types"; +import type { HaSelect } from "../../../components/ha-select"; @customElement("hui-input-select-entity-row") class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { @@ -23,6 +24,8 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { @state() private _config?: EntitiesCardEntityConfig; + @query("ha-select") private _haSelect!: HaSelect; + public setConfig(config: EntitiesCardEntityConfig): void { if (!config || !config.entity) { throw new Error("Entity must be specified"); @@ -35,6 +38,22 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { return hasConfigOrEntityChanged(this, changedProps); } + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + if (changedProps.has("hass")) { + const oldHass = changedProps.get("hass"); + if ( + this.hass && + oldHass && + this._config?.entity && + this.hass.states[this._config.entity].attributes.options !== + oldHass.states[this._config.entity].attributes.options + ) { + this._haSelect.layoutOptions(); + } + } + } + protected render(): TemplateResult { if (!this.hass || !this._config) { return html``; @@ -62,7 +81,7 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { .label=${this._config.name || computeStateName(stateObj)} .value=${stateObj.state} .disabled=${ - stateObj.state === UNAVAILABLE /* UNKNWON state is allowed */ + stateObj.state === UNAVAILABLE /* UNKNOWN state is allowed */ } naturalMenuWidth @selected=${this._selectedChanged} diff --git a/src/state-summary/state-card-input_select.ts b/src/state-summary/state-card-input_select.ts index 2472eac01e..bf276776c8 100644 --- a/src/state-summary/state-card-input_select.ts +++ b/src/state-summary/state-card-input_select.ts @@ -1,13 +1,21 @@ import "@material/mwc-list/mwc-list-item"; import "../components/ha-select"; -import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; -import { customElement, property } from "lit/decorators"; +import { + css, + CSSResultGroup, + html, + LitElement, + TemplateResult, + PropertyValues, +} from "lit"; +import { customElement, property, query } from "lit/decorators"; import { stopPropagation } from "../common/dom/stop_propagation"; import { computeStateName } from "../common/entity/compute_state_name"; import "../components/entity/state-badge"; import { UNAVAILABLE } from "../data/entity"; import { InputSelectEntity, setInputSelectOption } from "../data/input_select"; import type { HomeAssistant } from "../types"; +import type { HaSelect } from "../components/ha-select"; @customElement("state-card-input_select") class StateCardInputSelect extends LitElement { @@ -15,6 +23,21 @@ class StateCardInputSelect extends LitElement { @property() public stateObj!: InputSelectEntity; + @query("ha-select", true) private _haSelect!: HaSelect; + + protected updated(changedProps: PropertyValues) { + super.updated(changedProps); + if (changedProps.has("stateObj")) { + const oldState = changedProps.get("stateObj"); + if ( + oldState && + this.stateObj.attributes.options !== oldState.attributes.options + ) { + this._haSelect.layoutOptions(); + } + } + } + protected render(): TemplateResult { return html` @@ -22,7 +45,7 @@ class StateCardInputSelect extends LitElement { .label=${computeStateName(this.stateObj)} .value=${this.stateObj.state} .disabled=${ - this.stateObj.state === UNAVAILABLE /* UNKNWON state is allowed */ + this.stateObj.state === UNAVAILABLE /* UNKNOWN state is allowed */ } naturalMenuWidth fixedMenuPosition From 47fcd253b12ba5b801c824240ee65a4fbfc769d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 10:14:49 +0100 Subject: [PATCH 025/138] Bump unfetch from 4.1.0 to 5.0.0 (#15376) Co-authored-by: dependabot[bot] <49699333+dependabot[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 8237983450..8de5c60f6a 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "tinykeys": "^1.1.3", "tsparticles-engine": "^2.8.0", "tsparticles-preset-links": "^2.8.0", - "unfetch": "^4.1.0", + "unfetch": "^5.0.0", "vis-data": "^7.1.2", "vis-network": "^8.5.4", "vue": "^2.6.12", diff --git a/yarn.lock b/yarn.lock index 3bbf9d23e9..66ddffc335 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9701,7 +9701,7 @@ fsevents@^1.2.7: tsparticles-engine: ^2.8.0 tsparticles-preset-links: ^2.8.0 typescript: ^4.9.5 - unfetch: ^4.1.0 + unfetch: ^5.0.0 vinyl-buffer: ^1.0.1 vinyl-source-stream: ^2.0.0 vis-data: ^7.1.2 @@ -15830,10 +15830,10 @@ typescript@^3.8.3: languageName: node linkType: hard -"unfetch@npm:^4.1.0": - version: 4.1.0 - resolution: "unfetch@npm:4.1.0" - checksum: 8a0fee1e0f6ad8b3a2966fa199d07716affc3682d8e1c2c0cc138e5e5d2a2e0627d8c3321a4529a79e8a58332955bf80ac6c018f1dcc6de652026a7c3257d726 +"unfetch@npm:^5.0.0": + version: 5.0.0 + resolution: "unfetch@npm:5.0.0" + checksum: 005133bcdc85cefea60890af4ac265799356b69c6a7719c1330484165af7109c06b9eedd3e03d620c14dcc8b43bcf329148f4c1f06016390162f845e0d0a62c5 languageName: node linkType: hard From d1294edf342a48efc564d5aa3dfc45e14db1217a Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 7 Feb 2023 10:28:56 +0100 Subject: [PATCH 026/138] Use right variable name for light card (#15379) --- src/panels/lovelace/cards/hui-light-card.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-light-card.ts b/src/panels/lovelace/cards/hui-light-card.ts index 6fa001d3b3..4d63f8f57e 100644 --- a/src/panels/lovelace/cards/hui-light-card.ts +++ b/src/panels/lovelace/cards/hui-light-card.ts @@ -330,11 +330,11 @@ export class HuiLightCard extends LitElement implements LovelaceCard { } .light-button.state-on { - color: var(--state-light-color); + color: var(--state-light-active-color); } .light-button.state-unavailable { - color: var(--state-icon-unavailable-color); + color: var(--state-unavailable-color); } #info { From 09f0899fe4ee79e7c0c381b338f6e51a63e4dfee Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 7 Feb 2023 10:58:57 +0100 Subject: [PATCH 027/138] Bump babel (#15380 bump babel --- package.json | 4 +- yarn.lock | 127 ++++++++++++++++++++++++++------------------------- 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 8de5c60f6a..1cb7e26b6d 100644 --- a/package.json +++ b/package.json @@ -146,12 +146,12 @@ "xss": "^1.0.14" }, "devDependencies": { - "@babel/core": "^7.20.2", + "@babel/core": "^7.20.12", "@babel/plugin-external-helpers": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-decorators": "^7.20.13", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", "@babel/plugin-proposal-optional-chaining": "^7.20.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.10.4", diff --git a/yarn.lock b/yarn.lock index 66ddffc335..0b40d26c74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,37 +46,37 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.0, @babel/compat-data@npm:^7.20.1": - version: 7.20.1 - resolution: "@babel/compat-data@npm:7.20.1" - checksum: 989b9b7a6fe43c547bb8329241bd0ba6983488b83d29cc59de35536272ee6bb4cc7487ba6c8a4bceebb3a57f8c5fea1434f80bbbe75202bc79bc1110f955ff25 +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.1, @babel/compat-data@npm:^7.20.5": + version: 7.20.14 + resolution: "@babel/compat-data@npm:7.20.14" + checksum: 6c9efe36232094e4ad0b70d165587f21ca718e5d011f7a52a77a18502a7524e90e2855aa5a2e086395bcfd21bd2c7c99128dcd8d9fdffe94316b72acf5c66f2c languageName: node linkType: hard -"@babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.2": - version: 7.20.2 - resolution: "@babel/core@npm:7.20.2" +"@babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.12": + version: 7.20.12 + resolution: "@babel/core@npm:7.20.12" dependencies: "@ampproject/remapping": ^2.1.0 "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.20.2 - "@babel/helper-compilation-targets": ^7.20.0 - "@babel/helper-module-transforms": ^7.20.2 - "@babel/helpers": ^7.20.1 - "@babel/parser": ^7.20.2 - "@babel/template": ^7.18.10 - "@babel/traverse": ^7.20.1 - "@babel/types": ^7.20.2 + "@babel/generator": ^7.20.7 + "@babel/helper-compilation-targets": ^7.20.7 + "@babel/helper-module-transforms": ^7.20.11 + "@babel/helpers": ^7.20.7 + "@babel/parser": ^7.20.7 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.20.12 + "@babel/types": ^7.20.7 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.1 + json5: ^2.2.2 semver: ^6.3.0 - checksum: 98faaaef26103a276a30a141b951a93bc8418d100d1f668bf7a69d12f3e25df57958e8b6b9100d95663f720db62da85ade736f6629a5ebb1e640251a1b43c0e4 + checksum: 62e6c3e2149a70b5c9729ef5f0d3e2e97e9dcde89fc039c8d8e3463d5d7ba9b29ee84d10faf79b61532ac1645aa62f2bd42338320617e6e3a8a4d8e2a27076e7 languageName: node linkType: hard -"@babel/generator@npm:^7.20.2, @babel/generator@npm:^7.20.7": +"@babel/generator@npm:^7.20.7": version: 7.20.7 resolution: "@babel/generator@npm:7.20.7" dependencies: @@ -106,17 +106,18 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.0": - version: 7.20.0 - resolution: "@babel/helper-compilation-targets@npm:7.20.0" +"@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.0, @babel/helper-compilation-targets@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/helper-compilation-targets@npm:7.20.7" dependencies: - "@babel/compat-data": ^7.20.0 + "@babel/compat-data": ^7.20.5 "@babel/helper-validator-option": ^7.18.6 browserslist: ^4.21.3 + lru-cache: ^5.1.1 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: bc183f2109648849c8fde0b3c5cf08adf2f7ad6dc617b546fd20f34c8ef574ee5ee293c8d1bd0ed0221212e8f5907cdc2c42097870f1dcc769a654107d82c95b + checksum: 8c32c873ba86e2e1805b30e0807abd07188acbe00ebb97576f0b09061cc65007f1312b589eccb4349c5a8c7f8bb9f2ab199d41da7030bf103d9f347dcd3a3cf4 languageName: node linkType: hard @@ -219,19 +220,19 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.19.6, @babel/helper-module-transforms@npm:^7.20.2": - version: 7.20.2 - resolution: "@babel/helper-module-transforms@npm:7.20.2" +"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.19.6, @babel/helper-module-transforms@npm:^7.20.11": + version: 7.20.11 + resolution: "@babel/helper-module-transforms@npm:7.20.11" dependencies: "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-module-imports": ^7.18.6 "@babel/helper-simple-access": ^7.20.2 "@babel/helper-split-export-declaration": ^7.18.6 "@babel/helper-validator-identifier": ^7.19.1 - "@babel/template": ^7.18.10 - "@babel/traverse": ^7.20.1 - "@babel/types": ^7.20.2 - checksum: 33a60ca115f6fce2c9d98e2a2e5649498aa7b23e2ae3c18745d7a021487708fc311458c33542f299387a0da168afccba94116e077f2cce49ae9e5ab83399e8a2 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.20.10 + "@babel/types": ^7.20.7 + checksum: 29319ebafa693d48756c6ba0d871677bb0037e0da084fbe221a17c38d57093fc8aa38543c07d76e788266a937976e37ab4901971ca7f237c5ab45f524b9ecca0 languageName: node linkType: hard @@ -339,14 +340,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.20.1": - version: 7.20.1 - resolution: "@babel/helpers@npm:7.20.1" +"@babel/helpers@npm:^7.20.7": + version: 7.20.13 + resolution: "@babel/helpers@npm:7.20.13" dependencies: - "@babel/template": ^7.18.10 - "@babel/traverse": ^7.20.1 - "@babel/types": ^7.20.0 - checksum: be35f78666bdab895775ed94dbeb098f7b4fa08ce4cfb0c3a9e69b7220cce56960dcdc2b14f5df9d3b80388d4bf7df155c97f6cf6768c0138f4e6931d0f44955 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.20.13 + "@babel/types": ^7.20.7 + checksum: d62076fa834f342798f8c3fd7aec0870cc1725d273d99e540cbaa8d6c3ed10258228dd14601c8e66bfeabbb9424c3b31090ecc467fe855f7bd72c4734df7fb09 languageName: node linkType: hard @@ -361,12 +362,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.20.2, @babel/parser@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/parser@npm:7.20.7" +"@babel/parser@npm:^7.20.13, @babel/parser@npm:^7.20.7": + version: 7.20.15 + resolution: "@babel/parser@npm:7.20.15" bin: parser: ./bin/babel-parser.js - checksum: 25b5266e3bd4be837092685f6b7ef886f1308ff72659a24342eb646ae5014f61ed1771ce8fc20636c890fcae19304fc72c069564ca6075207b7fbf3f75367275 + checksum: 1d0f47ca67ff2652f1c0ff1570bed8deccbc4b53509e7cd73476af9cc7ed23480c99f1179bd6d0be01612368b92b39e206d330ad6054009d699934848a89298b languageName: node linkType: hard @@ -531,18 +532,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.20.2": - version: 7.20.2 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.2" +"@babel/plugin-proposal-object-rest-spread@npm:^7.20.2, @babel/plugin-proposal-object-rest-spread@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" dependencies: - "@babel/compat-data": ^7.20.1 - "@babel/helper-compilation-targets": ^7.20.0 + "@babel/compat-data": ^7.20.5 + "@babel/helper-compilation-targets": ^7.20.7 "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.20.1 + "@babel/plugin-transform-parameters": ^7.20.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9764d1a4735fcd384fdb9b6c6ccb20d1bea2f88f648640d26ce5d9cd5880ce1e389d2f852d7bea7e86ff343726225dc16e1deb92c7b3dc5c5721ed905a602318 + checksum: 1329db17009964bc644484c660eab717cb3ca63ac0ab0f67c651a028d1bc2ead51dc4064caea283e46994f1b7221670a35cbc0b4beb6273f55e915494b5aa0b2 languageName: node linkType: hard @@ -1061,14 +1062,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.20.1": - version: 7.20.3 - resolution: "@babel/plugin-transform-parameters@npm:7.20.3" +"@babel/plugin-transform-parameters@npm:^7.20.1, @babel/plugin-transform-parameters@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-transform-parameters@npm:7.20.7" dependencies: "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 69054c93d744574e06b0244623140718ecba87e1cc34bd5c7bd5824fd4dbef764ac4832046ea1ba5d2c6a2f12e03289555c9f65f0aafae4871f3d740ff61b9ec + checksum: 6ffe0dd9afb2d2b9bc247381aa2e95dd9997ff5568a0a11900528919a4e073ac68f46409431455badb8809644d47cff180045bc2b9700e3f36e3b23554978947 languageName: node linkType: hard @@ -1331,9 +1332,9 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.20.1, @babel/traverse@npm:^7.20.7": - version: 7.20.12 - resolution: "@babel/traverse@npm:7.20.12" +"@babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.20.10, @babel/traverse@npm:^7.20.12, @babel/traverse@npm:^7.20.13, @babel/traverse@npm:^7.20.7": + version: 7.20.13 + resolution: "@babel/traverse@npm:7.20.13" dependencies: "@babel/code-frame": ^7.18.6 "@babel/generator": ^7.20.7 @@ -1341,11 +1342,11 @@ __metadata: "@babel/helper-function-name": ^7.19.0 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.20.7 + "@babel/parser": ^7.20.13 "@babel/types": ^7.20.7 debug: ^4.1.0 globals: ^11.1.0 - checksum: d758b355ab4f1e87984524b67785fa23d74e8a45d2ceb8bcf4d5b2b0cd15ee160db5e68c7078808542805774ca3802e2eafb1b9638afa4cd7f9ecabd0ca7fd56 + checksum: 30ca6e0bd18233fda48fa09315efd14dfc61dcf5b8fa3712b343bfc61b32bc63b5e85ea1773cc9576c9b293b96f46b4589aaeb0a52e1f3eeac4edc076d049fc7 languageName: node linkType: hard @@ -9505,12 +9506,12 @@ fsevents@^1.2.7: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": ^7.20.2 + "@babel/core": ^7.20.12 "@babel/plugin-external-helpers": ^7.18.6 "@babel/plugin-proposal-class-properties": ^7.18.6 "@babel/plugin-proposal-decorators": ^7.20.13 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.20.2 + "@babel/plugin-proposal-object-rest-spread": ^7.20.7 "@babel/plugin-proposal-optional-chaining": ^7.20.7 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-import-meta": ^7.10.4 @@ -10971,12 +10972,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"json5@npm:^2.2.0, json5@npm:^2.2.1": - version: 2.2.1 - resolution: "json5@npm:2.2.1" +"json5@npm:^2.2.0, json5@npm:^2.2.1, json5@npm:^2.2.2": + version: 2.2.3 + resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 languageName: node linkType: hard From c19cba85ec98a61088b61b1d86e4a72d59e0694b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 13:35:58 +0100 Subject: [PATCH 028/138] Bump path-parse from 1.0.6 to 1.0.7 (#15381) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 0b40d26c74..29e07fdf62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13057,9 +13057,9 @@ fsevents@^1.2.7: linkType: hard "path-parse@npm:^1.0.6": - version: 1.0.6 - resolution: "path-parse@npm:1.0.6" - checksum: 962a85dd384d68d469ec5ba4010df8f8f9b7e936ce603bbe3211476c5615feb3c2b1ca61211a78445fadc833f0b1a86ea6484c861035ec4ac93011ba9aff9a11 + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a languageName: node linkType: hard From b2bfb1fdcbf790b991a35b5c1621c0f97663cbbd Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 7 Feb 2023 15:18:00 +0100 Subject: [PATCH 029/138] Update create automation dialog (#15286) --- src/components/ha-blueprint-picker.ts | 4 +- src/data/blueprint.ts | 17 ++ .../automation/dialog-new-automation.ts | 204 ++++++++++++++---- src/translations/en.json | 23 +- 4 files changed, 197 insertions(+), 51 deletions(-) diff --git a/src/components/ha-blueprint-picker.ts b/src/components/ha-blueprint-picker.ts index 0dfc64c3a9..c1f8a82af3 100644 --- a/src/components/ha-blueprint-picker.ts +++ b/src/components/ha-blueprint-picker.ts @@ -41,9 +41,9 @@ class HaBluePrintPicker extends LitElement { return []; } const result = Object.entries(blueprints) - .filter(([_path, blueprint]) => !("error" in blueprint)) + .filter((entry): entry is [string, Blueprint] => !("error" in entry[1])) .map(([path, blueprint]) => ({ - ...(blueprint as Blueprint).metadata, + ...blueprint.metadata, path, })); return result.sort((a, b) => diff --git a/src/data/blueprint.ts b/src/data/blueprint.ts index 3f2b826953..315aa53044 100644 --- a/src/data/blueprint.ts +++ b/src/data/blueprint.ts @@ -16,6 +16,7 @@ export interface BlueprintMetaData { input?: Record; description?: string; source_url?: string; + author?: string; } export interface BlueprintInput { @@ -63,3 +64,19 @@ export const deleteBlueprint = ( domain, path, }); + +export type BlueprintSourceType = "local" | "community" | "homeassistant"; + +export const getBlueprintSourceType = ( + blueprint: Blueprint +): BlueprintSourceType => { + const sourceUrl = blueprint.metadata.source_url; + + if (!sourceUrl) { + return "local"; + } + if (sourceUrl.includes("github.com/home-assistant")) { + return "homeassistant"; + } + return "community"; +}; diff --git a/src/panels/config/automation/dialog-new-automation.ts b/src/panels/config/automation/dialog-new-automation.ts index d755f09a7e..c91ad599f9 100644 --- a/src/panels/config/automation/dialog-new-automation.ts +++ b/src/panels/config/automation/dialog-new-automation.ts @@ -1,17 +1,40 @@ -import "@material/mwc-button"; +import "@material/mwc-list/mwc-list"; +import { + mdiAccount, + mdiFile, + mdiHomeAssistant, + mdiOpenInNew, + mdiPencilOutline, + mdiWeb, +} from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; import { fireEvent } from "../../../common/dom/fire_event"; -import "../../../components/ha-blueprint-picker"; -import "../../../components/ha-circular-progress"; +import { shouldHandleRequestSelectedEvent } from "../../../common/mwc/handle-request-selected-event"; +import { stringCompare } from "../../../common/string/compare"; import { createCloseHeading } from "../../../components/ha-dialog"; +import "../../../components/ha-icon-next"; +import "../../../components/ha-list-item"; +import "../../../components/ha-tip"; import { showAutomationEditor } from "../../../data/automation"; +import { + Blueprint, + Blueprints, + BlueprintSourceType, + fetchBlueprints, + getBlueprintSourceType, +} from "../../../data/blueprint"; import { HassDialog } from "../../../dialogs/make-dialog-manager"; import { haStyle, haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; -import "@material/mwc-list/mwc-list-item"; -import "../../../components/ha-icon-next"; -import "@material/mwc-list/mwc-list"; +import { documentationUrl } from "../../../util/documentation-url"; + +const SOURCE_TYPE_ICONS: Record = { + local: mdiFile, + community: mdiAccount, + homeassistant: mdiHomeAssistant, +}; @customElement("ha-dialog-new-automation") class DialogNewAutomation extends LitElement implements HassDialog { @@ -19,8 +42,13 @@ class DialogNewAutomation extends LitElement implements HassDialog { @state() private _opened = false; + @state() public blueprints?: Blueprints; + public showDialog(): void { this._opened = true; + fetchBlueprints(this.hass!, "automation").then((blueprints) => { + this.blueprints = blueprints; + }); } public closeDialog(): void { @@ -30,10 +58,33 @@ class DialogNewAutomation extends LitElement implements HassDialog { this._opened = false; } + private _processedBlueprints = memoizeOne((blueprints?: Blueprints) => { + if (!blueprints) { + return []; + } + const result = Object.entries(blueprints) + .filter((entry): entry is [string, Blueprint] => !("error" in entry[1])) + .map(([path, blueprint]) => { + const sourceType = getBlueprintSourceType(blueprint); + + return { + ...blueprint.metadata, + sourceType, + path, + }; + }); + return result.sort((a, b) => + stringCompare(a.name, b.name, this.hass!.locale.language) + ); + }); + protected render(): TemplateResult { if (!this._opened) { return html``; } + + const processedBlueprints = this._processedBlueprints(this.blueprints); + return html` - - + + + ${this.hass.localize( - "ui.panel.config.automation.dialog_new.blueprint.use_blueprint" - )} - - - - -
  • - - ${this.hass.localize( - "ui.panel.config.automation.dialog_new.start_empty" + "ui.panel.config.automation.dialog_new.create_empty" )} ${this.hass.localize( - "ui.panel.config.automation.dialog_new.start_empty_description" + "ui.panel.config.automation.dialog_new.create_empty_description" )} - + +
  • + ${processedBlueprints.map( + (blueprint) => html` + + + ${blueprint.name} + + ${blueprint.author + ? this.hass.localize( + `ui.panel.config.automation.dialog_new.blueprint_source.author`, + { author: blueprint.author } + ) + : this.hass.localize( + `ui.panel.config.automation.dialog_new.blueprint_source.${blueprint.sourceType}` + )} + + + + ` + )} + ${processedBlueprints.length === 0 + ? html` + + + + ${this.hass.localize( + "ui.panel.config.automation.dialog_new.create_blueprint" + )} + + ${this.hass.localize( + "ui.panel.config.automation.dialog_new.create_blueprint_description" + )} + + + + + ` + : html` + + + ${this.hass.localize( + "ui.panel.config.automation.dialog_new.discover_blueprint_tip" + )} + + + `}
    `; } - private async _blueprintPicked(ev: CustomEvent) { + private async _blueprint(ev) { + if (!shouldHandleRequestSelectedEvent(ev)) { + return; + } + const path = (ev.currentTarget! as any).path; this.closeDialog(); - showAutomationEditor({ use_blueprint: { path: ev.detail.value } }); + showAutomationEditor({ use_blueprint: { path } }); } - private async _blueprint() { - this.shadowRoot!.querySelector("ha-blueprint-picker")!.open(); - } - - private async _blank() { + private async _blank(ev) { + if (!shouldHandleRequestSelectedEvent(ev)) { + return; + } this.closeDialog(); showAutomationEditor(); } @@ -92,14 +212,24 @@ class DialogNewAutomation extends LitElement implements HassDialog { haStyle, haStyleDialog, css` - mwc-list-item.blueprint { - height: 110px; - } - ha-blueprint-picker { - margin-top: 8px; - } ha-dialog { --dialog-content-padding: 0; + --mdc-dialog-max-height: 60vh; + } + @media all and (min-width: 550px) { + ha-dialog { + --mdc-dialog-min-width: 500px; + } + } + ha-icon-next { + width: 24px; + } + ha-tip { + margin-top: 8px; + margin-bottom: 4px; + } + a.item { + text-decoration: unset; } `, ]; diff --git a/src/translations/en.json b/src/translations/en.json index 79f5a7ebaa..176cd12b34 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1931,19 +1931,18 @@ } }, "dialog_new": { - "header": "Create a new automation", - "how": "How do you want to create your new automation?", - "blueprint": { - "use_blueprint": "Use a blueprint" + "header": "Create automation", + "create_empty": "Create new automation", + "create_empty_description": "Start with an empty automation from scratch", + "create_blueprint": "Create from blueprint", + "create_blueprint_description": "Discover community blueprints", + "blueprint_source": { + "author": "By {author}", + "local": "By you", + "community": "By the community", + "homeassistant": "By Home Assistant" }, - "thingtalk": { - "header": "Describe the automation you want to create", - "intro": "And we will try to create it for you. For example: Turn the lights off when I leave.", - "input_label": "What should this automation do?", - "create": "Create" - }, - "start_empty": "Start with an empty automation", - "start_empty_description": "Create a new automation from scratch" + "discover_blueprint_tip": "Discover more community blueprints" }, "editor": { "enable": "[%key:ui::common::enable%]", From 1beeb0e5e8cfb1cc724ebcc510dfe9068a86fa8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 13:37:38 -0500 Subject: [PATCH 030/138] Bump eslint-plugin-import from 2.24.2 to 2.27.5 (#15371) * Bump eslint-plugin-import from 2.24.2 to 2.27.5 Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.24.2 to 2.27.5. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.24.2...v2.27.5) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 491 +++++++++++++++++++++++++-------------------------- 2 files changed, 244 insertions(+), 249 deletions(-) diff --git a/package.json b/package.json index 1cb7e26b6d..1976b9b8f2 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "eslint-config-prettier": "^8.6.0", "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-disable": "^2.0.3", - "eslint-plugin-import": "^2.24.2", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-lit": "^1.8.2", "eslint-plugin-lit-a11y": "^2.3.0", "eslint-plugin-unused-imports": "^1.1.5", diff --git a/yarn.lock b/yarn.lock index 29e07fdf62..811e59be6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5747,16 +5747,16 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.3": - version: 3.1.3 - resolution: "array-includes@npm:3.1.3" +"array-includes@npm:^3.1.6": + version: 3.1.6 + resolution: "array-includes@npm:3.1.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.18.0-next.2 - get-intrinsic: ^1.1.1 - is-string: ^1.0.5 - checksum: eaab8812412b5ec921c8fe678a9d61f501b12f6c72e271e0e8652fe7f4145276cc7ad79ff303ac4ed69cbf5135155bfb092b1b6d552e423e75106d1c887da150 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + get-intrinsic: ^1.1.3 + is-string: ^1.0.7 + checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 languageName: node linkType: hard @@ -5818,14 +5818,27 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.4": - version: 1.2.4 - resolution: "array.prototype.flat@npm:1.2.4" +"array.prototype.flat@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flat@npm:1.3.1" dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - es-abstract: ^1.18.0-next.1 - checksum: 1ec5d9887ae45e70e4b993e801b440ae5ddcd0d2c6d1dbe214c311e91436152f510916bdac82b066693544b9801a3c510dfbec8a278ababf8de7eb0bde74636f + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.1": + version: 1.3.1 + resolution: "array.prototype.flatmap@npm:1.3.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-shim-unscopables: ^1.0.0 + checksum: 8c1c43a4995f12cf12523436da28515184c753807b3f0bc2ca6c075f71c470b099e2090cc67dba8e5280958fea401c1d0c59e1db0143272aef6cd1103921a987 languageName: node linkType: hard @@ -7114,7 +7127,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.1.2, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.1.2, debug@npm:^2.2.0, debug@npm:^2.3.3": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -7654,7 +7667,7 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": +"error-ex@npm:^1.2.0": version: 1.3.2 resolution: "error-ex@npm:1.3.2" dependencies: @@ -7663,31 +7676,44 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.18.0-next.1, es-abstract@npm:^1.18.0-next.2, es-abstract@npm:^1.18.2, es-abstract@npm:^1.19.1": - version: 1.19.1 - resolution: "es-abstract@npm:1.19.1" +"es-abstract@npm:^1.18.2, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4": + version: 1.21.1 + resolution: "es-abstract@npm:1.21.1" dependencies: + available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 function-bind: ^1.1.1 - get-intrinsic: ^1.1.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.1.3 get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 has: ^1.0.3 - has-symbols: ^1.0.2 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.1 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.4 + is-array-buffer: ^3.0.1 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.1 + is-shared-array-buffer: ^1.0.2 is-string: ^1.0.7 - is-weakref: ^1.0.1 - object-inspect: ^1.11.0 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.2 object-keys: ^1.1.1 - object.assign: ^4.1.2 - string.prototype.trimend: ^1.0.4 - string.prototype.trimstart: ^1.0.4 - unbox-primitive: ^1.0.1 - checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + safe-regex-test: ^1.0.0 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.9 + checksum: 23ff60d42d17a55d150e7bcedbdb065d4077a8b98c436e0e2e1ef4dd532a6d78a56028673de0bd8ed464a43c46ba781c50d9af429b6a17e44dbd14c7d7fb7926 languageName: node linkType: hard @@ -7729,6 +7755,26 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: ^1.0.3 + checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + languageName: node + linkType: hard + "es-to-primitive@npm:^1.2.1": version: 1.2.1 resolution: "es-to-primitive@npm:1.2.1" @@ -7854,13 +7900,14 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" +"eslint-import-resolver-node@npm:^0.3.7": + version: 0.3.7 + resolution: "eslint-import-resolver-node@npm:0.3.7" dependencies: debug: ^3.2.7 - resolve: ^1.20.0 - checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + is-core-module: ^2.11.0 + resolve: ^1.22.1 + checksum: 3379aacf1d2c6952c1b9666c6fa5982c3023df695430b0d391c0029f6403a7775414873d90f397e98ba6245372b6c8960e16e74d9e4a3b0c0a4582f3bdbe3d6e languageName: node linkType: hard @@ -7886,13 +7933,15 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.6.2": - version: 2.6.2 - resolution: "eslint-module-utils@npm:2.6.2" +"eslint-module-utils@npm:^2.7.4": + version: 2.7.4 + resolution: "eslint-module-utils@npm:2.7.4" dependencies: debug: ^3.2.7 - pkg-dir: ^2.0.0 - checksum: 814591f494e4f4b04c1af0fde2a679e7a7664a5feb51175e02ba96d671e34ec60cb1835d174508eb81c07a6c92c243f84c6349f4169b3bec1a8dbdd36a0934f3 + peerDependenciesMeta: + eslint: + optional: true + checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 languageName: node linkType: hard @@ -7907,28 +7956,28 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.24.2": - version: 2.24.2 - resolution: "eslint-plugin-import@npm:2.24.2" +"eslint-plugin-import@npm:^2.27.5": + version: 2.27.5 + resolution: "eslint-plugin-import@npm:2.27.5" dependencies: - array-includes: ^3.1.3 - array.prototype.flat: ^1.2.4 - debug: ^2.6.9 + array-includes: ^3.1.6 + array.prototype.flat: ^1.3.1 + array.prototype.flatmap: ^1.3.1 + debug: ^3.2.7 doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.6 - eslint-module-utils: ^2.6.2 - find-up: ^2.0.0 + eslint-import-resolver-node: ^0.3.7 + eslint-module-utils: ^2.7.4 has: ^1.0.3 - is-core-module: ^2.6.0 - minimatch: ^3.0.4 - object.values: ^1.1.4 - pkg-up: ^2.0.0 - read-pkg-up: ^3.0.0 - resolve: ^1.20.0 - tsconfig-paths: ^3.11.0 + is-core-module: ^2.11.0 + is-glob: ^4.0.3 + minimatch: ^3.1.2 + object.values: ^1.1.6 + resolve: ^1.22.1 + semver: ^6.3.0 + tsconfig-paths: ^3.14.1 peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 - checksum: df570aec83ffa126fd80596d9fb1b6799d3cde025ceeb159eb28383541ebbb855468c9a2dbc670ab9e91dd0a8f8a82e52fd909a7c61e9ffa585bcce84ae1aec4 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: f500571a380167e25d72a4d925ef9a7aae8899eada57653e5f3051ec3d3c16d08271fcefe41a30a9a2f4fefc232f066253673ee4ea77b30dba65ae173dade85d languageName: node linkType: hard @@ -8620,15 +8669,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.0.0, find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -8906,6 +8946,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + "functional-red-black-tree@npm:^1.0.1": version: 1.0.1 resolution: "functional-red-black-tree@npm:1.0.1" @@ -9187,6 +9239,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + languageName: node + linkType: hard + "globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" @@ -9385,10 +9446,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"has-bigints@npm:^1.0.1": - version: 1.0.1 - resolution: "has-bigints@npm:1.0.1" - checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183 +"has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b languageName: node linkType: hard @@ -9415,6 +9476,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + "has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" @@ -9633,7 +9701,7 @@ fsevents@^1.2.7: eslint-config-prettier: ^8.6.0 eslint-import-resolver-webpack: ^0.13.2 eslint-plugin-disable: ^2.0.3 - eslint-plugin-import: ^2.24.2 + eslint-plugin-import: ^2.27.5 eslint-plugin-lit: ^1.8.2 eslint-plugin-lit-a11y: ^2.3.0 eslint-plugin-unused-imports: ^1.1.5 @@ -10297,14 +10365,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-core-module@npm:^2.2.0, is-core-module@npm:^2.6.0, is-core-module@npm:^2.7.0": +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.7.0, is-core-module@npm:^2.9.0": version: 2.11.0 resolution: "is-core-module@npm:2.11.0" dependencies: @@ -10484,10 +10552,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.1": - version: 2.0.1 - resolution: "is-negative-zero@npm:2.0.1" - checksum: a46f2e0cb5e16fdb8f2011ed488979386d7e68d381966682e3f4c98fc126efe47f26827912baca2d06a02a644aee458b9cba307fb389f6b161e759125db7a3b8 +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a languageName: node linkType: hard @@ -10621,7 +10689,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1, is-shared-array-buffer@npm:^1.0.2": +"is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" dependencies: @@ -10669,7 +10737,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10": +"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" dependencies: @@ -10721,7 +10789,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-weakref@npm:^1.0.1": +"is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" dependencies: @@ -10926,7 +10994,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"json-parse-better-errors@npm:^1.0.1, json-parse-better-errors@npm:^1.0.2": +"json-parse-better-errors@npm:^1.0.2": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d @@ -11420,18 +11488,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"load-json-file@npm:^4.0.0": - version: 4.0.0 - resolution: "load-json-file@npm:4.0.0" - dependencies: - graceful-fs: ^4.1.2 - parse-json: ^4.0.0 - pify: ^3.0.0 - strip-bom: ^3.0.0 - checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 - languageName: node - linkType: hard - "loader-runner@npm:^4.2.0": version: 4.2.0 resolution: "loader-runner@npm:4.2.0" @@ -11439,16 +11495,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -11882,7 +11928,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimatch@npm:3.0.4, minimatch@npm:^3.0.4": +"minimatch@npm:3.0.4": version: 3.0.4 resolution: "minimatch@npm:3.0.4" dependencies: @@ -11891,6 +11937,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + "minimatch@npm:^5.0.1": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -11900,7 +11955,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5": +"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.7 resolution: "minimist@npm:1.2.7" checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec @@ -12481,7 +12536,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object-inspect@npm:^1.11.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": version: 1.12.2 resolution: "object-inspect@npm:1.12.2" checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 @@ -12578,14 +12633,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.values@npm:^1.1.4": - version: 1.1.4 - resolution: "object.values@npm:1.1.4" +"object.values@npm:^1.1.6": + version: 1.1.6 + resolution: "object.values@npm:1.1.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.18.2 - checksum: 1a2f1e9d0bcfc299b8491170a50e6e7ca23392641d7781a8528e96c72f0013ba7ee731792ff8586c8eaec0328acda16c59622924c82c58bd0eb5c4ee67794856 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e languageName: node linkType: hard @@ -12744,15 +12799,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd - languageName: node - linkType: hard - "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -12771,15 +12817,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -12826,13 +12863,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -12916,16 +12946,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: ^1.3.1 - json-parse-better-errors: ^1.0.1 - checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 - languageName: node - linkType: hard - "parse-node-version@npm:^1.0.0": version: 1.0.1 resolution: "parse-node-version@npm:1.0.1" @@ -13007,13 +13027,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -13056,7 +13069,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"path-parse@npm:^1.0.6": +"path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a @@ -13113,15 +13126,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"path-type@npm:^3.0.0": - version: 3.0.0 - resolution: "path-type@npm:3.0.0" - dependencies: - pify: ^3.0.0 - checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 - languageName: node - linkType: hard - "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -13173,13 +13177,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde - languageName: node - linkType: hard - "pinkie-promise@npm:^2.0.0": version: 2.0.1 resolution: "pinkie-promise@npm:2.0.1" @@ -13216,15 +13213,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pkg-dir@npm:^2.0.0": - version: 2.0.0 - resolution: "pkg-dir@npm:2.0.0" - dependencies: - find-up: ^2.1.0 - checksum: 8c72b712305b51e1108f0ffda5ec1525a8307e54a5855db8fb1dcf77561a5ae98e2ba3b4814c9806a679f76b2f7e5dd98bde18d07e594ddd9fdd25e9cf242ea1 - languageName: node - linkType: hard - "pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -13234,15 +13222,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pkg-up@npm:^2.0.0": - version: 2.0.0 - resolution: "pkg-up@npm:2.0.0" - dependencies: - find-up: ^2.1.0 - checksum: de4b418175281a082e366ce1a919f032520ee53cf421578b35173f03816f6ec4c19e1552066840bb0988c3e1215859653948efd6ca3507a23f4f44229269500d - languageName: node - linkType: hard - "plugin-error@npm:0.1.2": version: 0.1.2 resolution: "plugin-error@npm:0.1.2" @@ -13562,16 +13541,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"read-pkg-up@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg-up@npm:3.0.0" - dependencies: - find-up: ^2.0.0 - read-pkg: ^3.0.0 - checksum: 16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb - languageName: node - linkType: hard - "read-pkg@npm:^1.0.0": version: 1.1.0 resolution: "read-pkg@npm:1.1.0" @@ -13583,17 +13552,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"read-pkg@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg@npm:3.0.0" - dependencies: - load-json-file: ^4.0.0 - normalize-package-data: ^2.3.2 - path-type: ^3.0.0 - checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 - languageName: node - linkType: hard - "readable-stream@npm:2 || 3, readable-stream@npm:^3.0.6": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" @@ -13967,23 +13925,29 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0": - version: 1.20.0 - resolution: "resolve@npm:1.20.0" +"resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0, resolve@npm:^1.22.1": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" dependencies: - is-core-module: ^2.2.0 - path-parse: ^1.0.6 - checksum: 40cf70b2cde00ef57f99daf2dc63c6a56d6c14a1b7fc51735d06a6f0a3b97cb67b4fb7ef6c747b4e13a7baba83b0ef625d7c4ce92a483cd5af923c3b65fd16fe + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.11.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.4.0#~builtin": - version: 1.20.0 - resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin::version=1.20.0&hash=c3c19d" +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.11.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.4.0#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" dependencies: - is-core-module: ^2.2.0 - path-parse: ^1.0.6 - checksum: a0dd7d16a8e47af23afa9386df2dff10e3e0debb2c7299a42e581d9d9b04d7ad5d2c53f24f1e043f7b3c250cbdc71150063e53d0b6559683d37f790b7c8c3cd5 + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b languageName: node linkType: hard @@ -14187,6 +14151,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + "safe-regex@npm:^1.1.0": version: 1.1.0 resolution: "safe-regex@npm:1.1.0" @@ -14955,23 +14930,25 @@ fsevents@^1.2.7: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimend@npm:1.0.4" +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimstart@npm:1.0.4" +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 languageName: node linkType: hard @@ -15148,6 +15125,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + "sver-compat@npm:^1.5.0": version: 1.5.0 resolution: "sver-compat@npm:1.5.0" @@ -15538,15 +15522,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tsconfig-paths@npm:^3.11.0": - version: 3.11.0 - resolution: "tsconfig-paths@npm:3.11.0" +"tsconfig-paths@npm:^3.14.1": + version: 3.14.1 + resolution: "tsconfig-paths@npm:3.14.1" dependencies: "@types/json5": ^0.0.29 json5: ^1.0.1 - minimist: ^1.2.0 + minimist: ^1.2.6 strip-bom: ^3.0.0 - checksum: e14aaa6883f316d611db41cbb0fc8779b59c66b31d1e045565ad4540c77ccd3d2bb66f7c261b74ff535d3cc6b4a1ce21dc84774bf2a2a603ed6b0fb96f7e0cc7 + checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d languageName: node linkType: hard @@ -15715,6 +15699,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + "typedarray@npm:^0.0.6": version: 0.0.6 resolution: "typedarray@npm:0.0.6" @@ -15787,15 +15782,15 @@ typescript@^3.8.3: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.1": - version: 1.0.1 - resolution: "unbox-primitive@npm:1.0.1" +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" dependencies: - function-bind: ^1.1.1 - has-bigints: ^1.0.1 - has-symbols: ^1.0.2 + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 which-boxed-primitive: ^1.0.2 - checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 languageName: node linkType: hard From 74b12b8092a646c2f5e5089bc5e57be96921dc0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Feb 2023 23:44:24 -0500 Subject: [PATCH 031/138] Bump lint-staged from 13.1.0 to 13.1.1 (#15392) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 13.1.0 to 13.1.1. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Commits](https://github.com/okonet/lint-staged/compare/v13.1.0...v13.1.1) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 1976b9b8f2..3140b8a7f8 100644 --- a/package.json +++ b/package.json @@ -211,7 +211,7 @@ "husky": "^8.0.3", "instant-mocha": "^1.5.0", "jszip": "^3.10.1", - "lint-staged": "^13.1.0", + "lint-staged": "^13.1.1", "lit-analyzer": "^1.2.1", "lodash.template": "^4.5.0", "magic-string": "^0.25.7", diff --git a/yarn.lock b/yarn.lock index 811e59be6a..68e8376189 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9729,7 +9729,7 @@ fsevents@^1.2.7: jszip: ^3.10.1 leaflet: ^1.9.3 leaflet-draw: ^1.0.4 - lint-staged: ^13.1.0 + lint-staged: ^13.1.1 lit: ^2.6.1 lit-analyzer: ^1.2.1 lodash.template: ^4.5.0 @@ -11356,9 +11356,9 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lint-staged@npm:^13.1.0": - version: 13.1.0 - resolution: "lint-staged@npm:13.1.0" +"lint-staged@npm:^13.1.1": + version: 13.1.1 + resolution: "lint-staged@npm:13.1.1" dependencies: cli-truncate: ^3.1.0 colorette: ^2.0.19 @@ -11375,7 +11375,7 @@ fsevents@^1.2.7: yaml: ^2.1.3 bin: lint-staged: bin/lint-staged.js - checksum: adf20c4ca9285c4a93b06598b970d71b04cfe58a1a4c9006f753b83e02c1c622d1866c32a4f1e7e29a98091c501eac3345f7678af247b4f97d5be88b3d8727c1 + checksum: 8e5093c7e982a2f6d6449927a40156a812644479df1d2760aee8bf05df3a314e022d8f7e275e57fd61769ee57e3cf7b062ed3c6e4934a63848300b877e269daa languageName: node linkType: hard From 5f6d0bc846d6a8326563a51428d2d050b98bae57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 05:08:10 +0000 Subject: [PATCH 032/138] Bump @fullcalendar from 6.1.1 to 6.1.4 (#15390) * Bump @fullcalendar/core from 6.1.1 to 6.1.4 Bumps [@fullcalendar/core](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/core) from 6.1.1 to 6.1.4. - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.4/packages/core) --- updated-dependencies: - dependency-name: "@fullcalendar/core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Bump the rest of the fullcalendar packages --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 10 ++++----- yarn.lock | 60 ++++++++++++++++++++++++++-------------------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 3140b8a7f8..7a8f4ec3ee 100644 --- a/package.json +++ b/package.json @@ -38,11 +38,11 @@ "@formatjs/intl-numberformat": "^8.3.3", "@formatjs/intl-pluralrules": "^5.1.8", "@formatjs/intl-relativetimeformat": "^11.1.8", - "@fullcalendar/core": "^6.1.1", - "@fullcalendar/daygrid": "^6.1.1", - "@fullcalendar/interaction": "^6.1.1", - "@fullcalendar/list": "^6.1.1", - "@fullcalendar/timegrid": "^6.1.1", + "@fullcalendar/core": "^6.1.4", + "@fullcalendar/daygrid": "^6.1.4", + "@fullcalendar/interaction": "^6.1.4", + "@fullcalendar/list": "^6.1.4", + "@fullcalendar/timegrid": "^6.1.4", "@lezer/highlight": "^1.1.3", "@lit-labs/motion": "^1.0.3", "@lit-labs/virtualizer": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 68e8376189..d735058672 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1586,50 +1586,50 @@ __metadata: languageName: node linkType: hard -"@fullcalendar/core@npm:^6.1.1": - version: 6.1.1 - resolution: "@fullcalendar/core@npm:6.1.1" +"@fullcalendar/core@npm:^6.1.4": + version: 6.1.4 + resolution: "@fullcalendar/core@npm:6.1.4" dependencies: preact: ^10.0.5 - checksum: 4fc30de34c1c03196f7a80904d4e8f307c66afe52a65e7a257137f1a639c29efc69d15a58d381a2481753b51f4bc101fb00584606cfb006226a01843efa743c5 + checksum: 3c659bbaf814a1f084ddd3e2eeaf68bb48f268a36560abb399c4aa29a40d6017c5bb1cd87c43664f333a1f6682c32b6a85ffb661538ea0faa78a1c119760a381 languageName: node linkType: hard -"@fullcalendar/daygrid@npm:^6.1.1, @fullcalendar/daygrid@npm:~6.1.1": - version: 6.1.1 - resolution: "@fullcalendar/daygrid@npm:6.1.1" +"@fullcalendar/daygrid@npm:^6.1.4, @fullcalendar/daygrid@npm:~6.1.4": + version: 6.1.4 + resolution: "@fullcalendar/daygrid@npm:6.1.4" peerDependencies: - "@fullcalendar/core": ~6.1.1 - checksum: ffc3431af31e3858218c962ad761019967e8bccd9d83ea4897bd2db86b0d06fd4dfd4c529f25791ac38ef403295c8a23a0c0e7bb6420c6067890a64350a4305f + "@fullcalendar/core": ~6.1.4 + checksum: 24b3c6e521c5e5288cb05d34e080daace1138b4b421a5dd059938a8c9b7730374b7f07908984b124d48e810276a3c24f1e1c7b6080d375ca80e4d7ef387d7774 languageName: node linkType: hard -"@fullcalendar/interaction@npm:^6.1.1": - version: 6.1.1 - resolution: "@fullcalendar/interaction@npm:6.1.1" +"@fullcalendar/interaction@npm:^6.1.4": + version: 6.1.4 + resolution: "@fullcalendar/interaction@npm:6.1.4" peerDependencies: - "@fullcalendar/core": ~6.1.1 - checksum: 8319e06999792e16af16d39fb3437080b427c2f9688a2b3a90f0cd8228e925603389f7390c7558cb651b9099bf3cd88a2e05d8b1e4836723f098a8c4d2a95c69 + "@fullcalendar/core": ~6.1.4 + checksum: 5e282ba36bfbc306e8e36ea88b9df0c5a11b7bcdf4c8952377396da24a3ca058b436a39e9002eba9fc1ca8ce70ca23ef2fd74ef08f48d4b8b45576f7e30a6bea languageName: node linkType: hard -"@fullcalendar/list@npm:^6.1.1": - version: 6.1.1 - resolution: "@fullcalendar/list@npm:6.1.1" +"@fullcalendar/list@npm:^6.1.4": + version: 6.1.4 + resolution: "@fullcalendar/list@npm:6.1.4" peerDependencies: - "@fullcalendar/core": ~6.1.1 - checksum: da2443812b9a477a5fdc2b647bbe8ca4a86e92c3bd000229b5e50b38b3cdee467dc69743ebd58035abee663de5ced392850ac2fa567b0d0487e324b836a0b863 + "@fullcalendar/core": ~6.1.4 + checksum: 0338a8bb1546e103921d1d6a5baf54b9d43759d9aaf905357c2272e01cbd42e120812128b2f2661d0ef82abc0b8447b16e6f1618968487ffa4c6f0a570f907d5 languageName: node linkType: hard -"@fullcalendar/timegrid@npm:^6.1.1": - version: 6.1.1 - resolution: "@fullcalendar/timegrid@npm:6.1.1" +"@fullcalendar/timegrid@npm:^6.1.4": + version: 6.1.4 + resolution: "@fullcalendar/timegrid@npm:6.1.4" dependencies: - "@fullcalendar/daygrid": ~6.1.1 + "@fullcalendar/daygrid": ~6.1.4 peerDependencies: - "@fullcalendar/core": ~6.1.1 - checksum: 38796e93ac4e1ea69be4a315105aa6fcc9e8b21564c10f7e0be2fb59756d8115cdbecb8ab8a69f221c27d13da5c06efc1c6c44ed8aabf54e98a69660b466d985 + "@fullcalendar/core": ~6.1.4 + checksum: 1329b941f94e2c17a866e612e7d92adacbca0364ba7e76908caa2a936f526c0cde43fa050f571634dd2db2e779f1cbd3115b64cbc0b524d34f0c4d61243659b8 languageName: node linkType: hard @@ -9600,11 +9600,11 @@ fsevents@^1.2.7: "@formatjs/intl-numberformat": ^8.3.3 "@formatjs/intl-pluralrules": ^5.1.8 "@formatjs/intl-relativetimeformat": ^11.1.8 - "@fullcalendar/core": ^6.1.1 - "@fullcalendar/daygrid": ^6.1.1 - "@fullcalendar/interaction": ^6.1.1 - "@fullcalendar/list": ^6.1.1 - "@fullcalendar/timegrid": ^6.1.1 + "@fullcalendar/core": ^6.1.4 + "@fullcalendar/daygrid": ^6.1.4 + "@fullcalendar/interaction": ^6.1.4 + "@fullcalendar/list": ^6.1.4 + "@fullcalendar/timegrid": ^6.1.4 "@koa/cors": ^4.0.0 "@lezer/highlight": ^1.1.3 "@lit-labs/motion": ^1.0.3 From 222a01d86f3d16b793534da1feecfaa757d94be8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 11:17:32 +0100 Subject: [PATCH 033/138] Bump gulp-json-transform from 0.4.6 to 0.4.8 (#15391) Co-authored-by: dependabot[bot] <49699333+dependabot[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 7a8f4ec3ee..eefeb90589 100644 --- a/package.json +++ b/package.json @@ -203,7 +203,7 @@ "glob": "^8.1.0", "gulp": "^4.0.2", "gulp-flatmap": "^1.0.2", - "gulp-json-transform": "^0.4.6", + "gulp-json-transform": "^0.4.8", "gulp-merge-json": "^2.1.2", "gulp-rename": "^2.0.0", "gulp-zopfli-green": "^3.0.1", diff --git a/yarn.lock b/yarn.lock index d735058672..6ecf11926a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9359,9 +9359,9 @@ fsevents@^1.2.7: languageName: node linkType: hard -"gulp-json-transform@npm:^0.4.6": - version: 0.4.6 - resolution: "gulp-json-transform@npm:0.4.6" +"gulp-json-transform@npm:^0.4.8": + version: 0.4.8 + resolution: "gulp-json-transform@npm:0.4.8" dependencies: ansi-colors: ^1.0.1 fancy-log: ^1.3.2 @@ -9369,7 +9369,7 @@ fsevents@^1.2.7: promise: ^8.0.1 through2: ^2.0.3 vinyl: ^2.1.0 - checksum: 4abcefa260921be3c42fc560b058692c1624f44d8647ccb332b916b1f36eff332955496f875d9adf0dcbd9d03dfaf4666c435ada8f06e6da84820b35f4d5731c + checksum: 408a18e809e4d922edf8193a75150d9cf5da41bf7c9ab0ef7750826d3a0bf890636f818e9b99b97e2d919daf38884063ed5a139f8bddf3bb1f98c8d1da5c6aec languageName: node linkType: hard @@ -9713,7 +9713,7 @@ fsevents@^1.2.7: google-timezones-json: ^1.0.2 gulp: ^4.0.2 gulp-flatmap: ^1.0.2 - gulp-json-transform: ^0.4.6 + gulp-json-transform: ^0.4.8 gulp-merge-json: ^2.1.2 gulp-rename: ^2.0.0 gulp-zopfli-green: ^3.0.1 From f19c50a00220d74d56b15650054c36edc645ceec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 11:18:47 +0100 Subject: [PATCH 034/138] Bump date-fns-tz from 1.3.7 to 2.0.0 (#15388) Co-authored-by: dependabot[bot] <49699333+dependabot[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 eefeb90589..441b303555 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "core-js": "^3.27.2", "cropperjs": "^1.5.13", "date-fns": "^2.29.3", - "date-fns-tz": "^1.3.7", + "date-fns-tz": "^2.0.0", "deep-clone-simple": "^1.1.1", "deep-freeze": "^0.0.1", "fuse.js": "^6.6.2", diff --git a/yarn.lock b/yarn.lock index 6ecf11926a..1202523a1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7104,12 +7104,12 @@ __metadata: languageName: node linkType: hard -"date-fns-tz@npm:^1.3.7": - version: 1.3.7 - resolution: "date-fns-tz@npm:1.3.7" +"date-fns-tz@npm:^2.0.0": + version: 2.0.0 + resolution: "date-fns-tz@npm:2.0.0" peerDependencies: date-fns: ">=2.0.0" - checksum: b749613669223056d5e6d715114c94bec57234b676d0cea0c72ca710626c81e9ea04df6441852a5fec74b42c5f27b2f076e13697ec43da360b67806a3042a10e + checksum: a6553603a9d26dd9669326c99a58a2335ac550bc060c74b86a5ad9e1de73c9d4e3e5236f0f552f990e616e4e8dcc2b6a637913a04d2e04396e6a9f8ae83c73da languageName: node linkType: hard @@ -9691,7 +9691,7 @@ fsevents@^1.2.7: core-js: ^3.27.2 cropperjs: ^1.5.13 date-fns: ^2.29.3 - date-fns-tz: ^1.3.7 + date-fns-tz: ^2.0.0 deep-clone-simple: ^1.1.1 deep-freeze: ^0.0.1 del: ^7.0.0 From 6c2a767896f9db961d38ad4c1a7c1da3a6fa4fb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 11:19:30 +0100 Subject: [PATCH 035/138] Bump vis-data from 7.1.2 to 7.1.4 (#15389) Co-authored-by: dependabot[bot] <49699333+dependabot[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 441b303555..227d867559 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "tsparticles-engine": "^2.8.0", "tsparticles-preset-links": "^2.8.0", "unfetch": "^5.0.0", - "vis-data": "^7.1.2", + "vis-data": "^7.1.4", "vis-network": "^8.5.4", "vue": "^2.6.12", "vue2-daterange-picker": "^0.5.1", diff --git a/yarn.lock b/yarn.lock index 1202523a1b..385de7b372 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9773,7 +9773,7 @@ fsevents@^1.2.7: unfetch: ^5.0.0 vinyl-buffer: ^1.0.1 vinyl-source-stream: ^2.0.0 - vis-data: ^7.1.2 + vis-data: ^7.1.4 vis-network: ^8.5.4 vue: ^2.6.12 vue2-daterange-picker: ^0.5.1 @@ -16161,13 +16161,13 @@ typescript@^3.8.3: languageName: node linkType: hard -"vis-data@npm:^7.1.2": - version: 7.1.2 - resolution: "vis-data@npm:7.1.2" +"vis-data@npm:^7.1.4": + version: 7.1.4 + resolution: "vis-data@npm:7.1.4" peerDependencies: uuid: ^7.0.0 || ^8.0.0 vis-util: ^4.0.0 || ^5.0.0 - checksum: ebc74cd7de8fe27cb8cc111a812de87a4cc644652a392e43f191876ac8c66888488e6fd1f1945ead89193b971a0bc74a13a67daa18aabd3801e185e4a7efc83b + checksum: a1266eb678b7f75c422c070ebd579a99565de9b23deba2e75862afb9c15ef5fa67e34f002c8c7013751100c75d6fb76b25bdb9f1a309d9f0cda1bec0935b26ff languageName: node linkType: hard From 7e92d62936fd1ffd957a3b47399c4cdf077c9d2f Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 8 Feb 2023 11:29:16 +0100 Subject: [PATCH 036/138] Add tile card to gallery (#15394) --- gallery/src/pages/lovelace/tile-card.markdown | 3 + gallery/src/pages/lovelace/tile-card.ts | 173 ++++++++++++++++++ src/components/tile/ha-tile-info.ts | 2 + src/panels/lovelace/cards/hui-tile-card.ts | 165 +++++++++-------- 4 files changed, 264 insertions(+), 79 deletions(-) create mode 100644 gallery/src/pages/lovelace/tile-card.markdown create mode 100644 gallery/src/pages/lovelace/tile-card.ts diff --git a/gallery/src/pages/lovelace/tile-card.markdown b/gallery/src/pages/lovelace/tile-card.markdown new file mode 100644 index 0000000000..0117153269 --- /dev/null +++ b/gallery/src/pages/lovelace/tile-card.markdown @@ -0,0 +1,3 @@ +--- +title: Tile Card +--- diff --git a/gallery/src/pages/lovelace/tile-card.ts b/gallery/src/pages/lovelace/tile-card.ts new file mode 100644 index 0000000000..00e1e29376 --- /dev/null +++ b/gallery/src/pages/lovelace/tile-card.ts @@ -0,0 +1,173 @@ +import { html, LitElement, PropertyValues, TemplateResult } from "lit"; +import { customElement, query } from "lit/decorators"; +import { CoverEntityFeature } from "../../../../src/data/cover"; +import { LightColorMode } from "../../../../src/data/light"; +import { VacuumEntityFeature } from "../../../../src/data/vacuum"; +import { getEntity } from "../../../../src/fake_data/entity"; +import { provideHass } from "../../../../src/fake_data/provide_hass"; +import "../../components/demo-cards"; + +const ENTITIES = [ + getEntity("switch", "tv_outlet", "on", { + friendly_name: "TV outlet", + device_class: "outlet", + }), + getEntity("light", "bed_light", "on", { + friendly_name: "Bed Light", + supported_color_modes: [LightColorMode.HS], + }), + getEntity("light", "unavailable", "unavailable", { + friendly_name: "Unavailable entity", + }), + getEntity("climate", "thermostat", "heat", { + current_temperature: 73, + min_temp: 45, + max_temp: 95, + temperature: 80, + hvac_modes: ["heat", "cool", "auto", "off"], + friendly_name: "Thermostat", + hvac_action: "heating", + }), + getEntity("person", "paulus", "home", { + friendly_name: "Paulus", + }), + getEntity("vacuum", "first_floor_vacuum", "docked", { + friendly_name: "First floor vacuum", + supported_features: + VacuumEntityFeature.START + + VacuumEntityFeature.STOP + + VacuumEntityFeature.RETURN_HOME, + }), + getEntity("cover", "kitchen_shutter", "open", { + friendly_name: "Kitchen shutter", + device_class: "shutter", + supported_features: + CoverEntityFeature.CLOSE + + CoverEntityFeature.OPEN + + CoverEntityFeature.STOP, + }), + getEntity("cover", "pergola_roof", "open", { + friendly_name: "Pergola Roof", + supported_features: + CoverEntityFeature.CLOSE_TILT + + CoverEntityFeature.OPEN_TILT + + CoverEntityFeature.STOP_TILT, + }), +]; + +const CONFIGS = [ + { + heading: "Basic example", + config: ` +- type: tile + entity: switch.tv_outlet + `, + }, + { + heading: "Vertical example", + config: ` +- type: tile + entity: switch.tv_outlet + vertical: true + `, + }, + { + heading: "Custom color", + config: ` +- type: tile + entity: switch.tv_outlet + color: pink + `, + }, + { + heading: "Unknown entity", + config: ` +- type: tile + entity: light.unknown + `, + }, + { + heading: "Unavailable entity", + config: ` +- type: tile + entity: light.unavailable + `, + }, + { + heading: "Climate", + config: ` +- type: tile + entity: climate.thermostat + `, + }, + { + heading: "Person", + config: ` +- type: tile + entity: person.paulus + `, + }, + { + heading: "Light brightness feature", + config: ` +- type: tile + entity: light.bed_light + features: + - type: "light-brightness" + `, + }, + { + heading: "Vacuum commands feature", + config: ` +- type: tile + entity: vacuum.first_floor_vacuum + features: + - type: "vacuum-commands" + commands: + - start_pause + - stop + - return_home + `, + }, + { + heading: "Cover open close feature", + config: ` +- type: tile + entity: cover.kitchen_shutter + features: + - type: "cover-open-close" + `, + }, + { + heading: "Cover tilt feature", + config: ` +- type: tile + entity: cover.pergola_roof + features: + - type: "cover-tilt" + `, + }, +]; + +@customElement("demo-lovelace-tile-card") +class DemoTile extends LitElement { + @query("#demos") private _demoRoot!: HTMLElement; + + protected render(): TemplateResult { + return html``; + } + + protected firstUpdated(changedProperties: PropertyValues) { + super.firstUpdated(changedProperties); + const hass = provideHass(this._demoRoot); + hass.updateTranslations(null, "en"); + hass.updateTranslations("lovelace", "en"); + hass.addEntities(ENTITIES); + } +} + +declare global { + interface HTMLElementTagNameMap { + "demo-lovelace-tile-card": DemoTile; + } +} diff --git a/src/components/tile/ha-tile-info.ts b/src/components/tile/ha-tile-info.ts index 5f8d79aa77..5aa224884a 100644 --- a/src/components/tile/ha-tile-info.ts +++ b/src/components/tile/ha-tile-info.ts @@ -25,6 +25,8 @@ export class HaTileInfo extends LitElement { display: flex; flex-direction: column; align-items: flex-start; + justify-content: center; + min-height: 40px; } span { text-overflow: ellipsis; diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 6422257036..25b4eb071f 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -16,7 +16,6 @@ import memoizeOne from "memoize-one"; import { computeCssColor } from "../../../common/color/compute-color"; import { hsv2rgb, rgb2hex, rgb2hsv } from "../../../common/color/convert-color"; import { DOMAINS_TOGGLE } from "../../../common/const"; -import { stopPropagation } from "../../../common/dom/stop_propagation"; import { computeDomain } from "../../../common/entity/compute_domain"; import { computeStateDisplay } from "../../../common/entity/compute_state_display"; import { stateActive } from "../../../common/entity/state_active"; @@ -263,27 +262,29 @@ export class HuiTileCard extends LitElement implements LovelaceCard { const entityId = this._config.entity; const stateObj = entityId ? this.hass.states[entityId] : undefined; - const tileClasses = { vertical: Boolean(this._config.vertical) }; + const contentClasses = { vertical: Boolean(this._config.vertical) }; if (!stateObj) { return html` - -
    -
    - - + +
    +
    +
    + + +
    +
    -
    `; @@ -315,66 +316,62 @@ export class HuiTileCard extends LitElement implements LovelaceCard { return html` ${this._shouldRenderRipple ? html`` : null} -
    +
    - ${imageUrl - ? html` - - ` - : html` - - `} - ${badge - ? html` - - ` - : null} + @mousedown=${this.handleRippleActivate} + @mouseup=${this.handleRippleDeactivate} + @mouseenter=${this.handleRippleMouseEnter} + @mouseleave=${this.handleRippleMouseLeave} + @touchstart=${this.handleRippleActivate} + @touchend=${this.handleRippleDeactivate} + @touchcancel=${this.handleRippleDeactivate} + >
    +
    +
    + ${imageUrl + ? html` + + ` + : html` + + `} + ${badge + ? html` + + ` + : null} +
    +
    -
    ${supportedFeatures?.length ? html` @@ -424,16 +421,15 @@ export class HuiTileCard extends LitElement implements LovelaceCard { --tile-color: var(--state-inactive-color); -webkit-tap-highlight-color: transparent; } - ha-card:has(.tile:focus-visible) { + ha-card:has(.background:focus-visible) { border-color: var(--tile-color); box-shadow: 0 0 0 1px var(--tile-color); } ha-card { --mdc-ripple-color: var(--tile-color); height: 100%; - overflow: hidden; - // For safari overflow hidden z-index: 0; + overflow: hidden; } ha-card.active { --tile-color: var(--state-icon-color); @@ -444,7 +440,14 @@ export class HuiTileCard extends LitElement implements LovelaceCard { [role="button"]:focus { outline: none; } - .tile { + .background { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } + .content { display: flex; flex-direction: row; align-items: center; @@ -473,6 +476,10 @@ export class HuiTileCard extends LitElement implements LovelaceCard { } .icon-container .icon { --tile-icon-color: var(--tile-color); + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + -moz-user-select: none; } .icon-container .badge { position: absolute; @@ -488,9 +495,9 @@ export class HuiTileCard extends LitElement implements LovelaceCard { padding: 12px; flex: 1; min-width: 0; - min-height: 40px; transition: background-color 180ms ease-in-out; box-sizing: border-box; + pointer-events: none; } `; } From 1550895d8600012329b896b49caee4c96a33bef2 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 8 Feb 2023 11:53:19 +0100 Subject: [PATCH 037/138] Move refresh logs button to top (#15382) --- src/panels/config/logs/error-log-card.ts | 27 +++++++++++++++--- src/panels/config/logs/ha-config-logs.ts | 6 ++++ src/panels/config/logs/system-log-card.ts | 34 +++++++++++++++++++---- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/panels/config/logs/error-log-card.ts b/src/panels/config/logs/error-log-card.ts index 0eaaf3bcb4..aa0493ddd2 100644 --- a/src/panels/config/logs/error-log-card.ts +++ b/src/panels/config/logs/error-log-card.ts @@ -36,6 +36,8 @@ class ErrorLogCard extends LitElement { @property() public filter = ""; + @property() public header?: string; + @property() public provider!: string; @property({ type: Boolean, attribute: true }) public show = false; @@ -56,9 +58,10 @@ class ErrorLogCard extends LitElement { ? html`
    -

    - ${this.hass.localize("ui.panel.config.logs.show_full_logs")} -

    +

    + ${this.header || + this.hass.localize("ui.panel.config.logs.show_full_logs")} +

    p.key === this._selectedLogProvider + )!.name} .filter=${this._filter} > ` : ""} p.key === this._selectedLogProvider + )!.name} .filter=${this._filter} .provider=${this._selectedLogProvider} .show=${this._selectedLogProvider !== "core"} diff --git a/src/panels/config/logs/system-log-card.ts b/src/panels/config/logs/system-log-card.ts index eaf448c1f8..1a0843c0ce 100644 --- a/src/panels/config/logs/system-log-card.ts +++ b/src/panels/config/logs/system-log-card.ts @@ -1,3 +1,4 @@ +import { mdiRefresh } from "@mdi/js"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; @@ -25,6 +26,8 @@ export class SystemLogCard extends LitElement { @property() public filter = ""; + @property() public header?: string; + public loaded = false; @state() private _items?: LoggedError[]; @@ -83,6 +86,14 @@ export class SystemLogCard extends LitElement {
    ` : html` +
    +

    ${this.header || "Logs"}

    + +
    ${this._items.length === 0 ? html`
    @@ -139,11 +150,6 @@ export class SystemLogCard extends LitElement { "ui.panel.config.logs.clear" )} - ${this.hass.localize( - "ui.panel.config.logs.refresh" - )}
    `} @@ -181,6 +187,24 @@ export class SystemLogCard extends LitElement { padding-top: 16px; } + .header { + display: flex; + justify-content: space-between; + padding: 0 16px; + } + + .card-header { + color: var(--ha-card-header-color, --primary-text-color); + font-family: var(--ha-card-header-font-family, inherit); + font-size: var(--ha-card-header-font-size, 24px); + letter-spacing: -0.012em; + line-height: 48px; + display: block; + margin-block-start: 0px; + margin-block-end: 0px; + font-weight: normal; + } + paper-item { cursor: pointer; } From 050ed145bfc9d1359091096de419faeae7fabec8 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 8 Feb 2023 18:20:58 +0100 Subject: [PATCH 038/138] Allow overriding a sensor's display precision (#15363) * Allow overriding a sensor's display precision * Update demo + gallery * Lint * Fix state not updated in the UI * Use formatNumber for options * Feedbacks * Add default precision and minimumFractionDigits * Remove useless undefined --------- Co-authored-by: Paul Bottein --- demo/src/ha-demo.ts | 2 + gallery/src/pages/misc/integration-card.ts | 1 + src/common/entity/compute_state_display.ts | 8 +- src/common/number/format_number.ts | 13 ++- src/components/entity/ha-state-label-badge.ts | 2 +- src/data/entity_registry.ts | 9 +++ .../entities/entity-registry-settings.ts | 80 ++++++++++++++++++- .../config/entities/ha-config-entities.ts | 1 + src/panels/lovelace/cards/hui-entity-card.ts | 5 +- src/panels/lovelace/common/has-changed.ts | 54 +++++++++++-- src/translations/en.json | 2 + test/common/string/format_number.ts | 3 +- 12 files changed, 163 insertions(+), 17 deletions(-) diff --git a/demo/src/ha-demo.ts b/demo/src/ha-demo.ts index e911afce1f..4b527df487 100644 --- a/demo/src/ha-demo.ts +++ b/demo/src/ha-demo.ts @@ -71,6 +71,7 @@ class HaDemo extends HomeAssistantAppEl { entity_category: null, has_entity_name: false, unique_id: "co2_intensity", + options: null, }, { config_entry_id: "co2signal", @@ -86,6 +87,7 @@ class HaDemo extends HomeAssistantAppEl { entity_category: null, has_entity_name: false, unique_id: "grid_fossil_fuel_percentage", + options: null, }, ]); diff --git a/gallery/src/pages/misc/integration-card.ts b/gallery/src/pages/misc/integration-card.ts index 56de4308e8..168344e51b 100644 --- a/gallery/src/pages/misc/integration-card.ts +++ b/gallery/src/pages/misc/integration-card.ts @@ -197,6 +197,7 @@ const createEntityRegistryEntries = ( platform: "updater", has_entity_name: false, unique_id: "updater", + options: null, }, ]; diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts index 18a05de5ac..c469585a9d 100644 --- a/src/common/entity/compute_state_display.ts +++ b/src/common/entity/compute_state_display.ts @@ -49,6 +49,8 @@ export const computeStateDisplayFromEntityAttributes = ( return localize(`state.default.${state}`); } + const entity = entities[entityId] as EntityRegistryEntry | undefined; + // Entities with a `unit_of_measurement` or `state_class` are numeric values and should use `formatNumber` if (isNumericFromAttributes(attributes)) { // state is duration @@ -82,7 +84,7 @@ export const computeStateDisplayFromEntityAttributes = ( return `${formatNumber( state, locale, - getNumberFormatOptions({ state, attributes } as HassEntity) + getNumberFormatOptions({ state, attributes } as HassEntity, entity) )}${unit}`; } @@ -160,7 +162,7 @@ export const computeStateDisplayFromEntityAttributes = ( return formatNumber( state, locale, - getNumberFormatOptions({ state, attributes } as HassEntity) + getNumberFormatOptions({ state, attributes } as HassEntity, entity) ); } @@ -199,8 +201,6 @@ export const computeStateDisplayFromEntityAttributes = ( : localize("ui.card.update.up_to_date"); } - const entity = entities[entityId] as EntityRegistryEntry | undefined; - return ( (entity?.translation_key && localize( diff --git a/src/common/number/format_number.ts b/src/common/number/format_number.ts index e3f78f1b79..2e461ab822 100644 --- a/src/common/number/format_number.ts +++ b/src/common/number/format_number.ts @@ -2,6 +2,7 @@ import { HassEntity, HassEntityAttributeBase, } from "home-assistant-js-websocket"; +import { EntityRegistryEntry } from "../../data/entity_registry"; import { FrontendLocaleData, NumberFormat } from "../../data/translation"; import { round } from "./round"; @@ -90,8 +91,18 @@ export const formatNumber = ( * @returns An `Intl.NumberFormatOptions` object with `maximumFractionDigits` set to 0, or `undefined` */ export const getNumberFormatOptions = ( - entityState: HassEntity + entityState: HassEntity, + entity?: EntityRegistryEntry ): Intl.NumberFormatOptions | undefined => { + const precision = + entity?.options?.sensor?.display_precision ?? + entity?.options?.sensor?.suggested_display_precision; + if (precision != null) { + return { + maximumFractionDigits: precision, + minimumFractionDigits: precision, + }; + } if ( Number.isInteger(Number(entityState.attributes?.step)) && Number.isInteger(Number(entityState.state)) diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index 6af024518d..03079a331f 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -186,7 +186,7 @@ export class HaStateLabelBadge extends LitElement { ? formatNumber( entityState.state, this.hass!.locale, - getNumberFormatOptions(entityState) + getNumberFormatOptions(entityState, entry) ) : computeStateDisplay( this.hass!.localize, diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index cbc5459b3b..ede328f7e1 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -22,6 +22,7 @@ export interface EntityRegistryEntry { original_name?: string; unique_id: string; translation_key?: string; + options: EntityRegistryOptions | null; } export interface ExtEntityRegistryEntry extends EntityRegistryEntry { @@ -39,6 +40,8 @@ export interface UpdateEntityRegistryEntryResult { } export interface SensorEntityOptions { + display_precision?: number | null; + suggested_display_precision?: number | null; unit_of_measurement?: string | null; } @@ -54,6 +57,12 @@ export interface WeatherEntityOptions { wind_speed_unit?: string | null; } +export interface EntityRegistryOptions { + number?: NumberEntityOptions; + sensor?: SensorEntityOptions; + weather?: WeatherEntityOptions; +} + export interface EntityRegistryEntryUpdateParams { name?: string | null; icon?: string | null; diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index d1afbb6b50..db7fbf479b 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -63,6 +63,7 @@ import { EntityRegistryEntry, EntityRegistryEntryUpdateParams, ExtEntityRegistryEntry, + SensorEntityOptions, fetchEntityRegistry, removeEntityRegistryEntry, updateEntityRegistryEntry, @@ -81,6 +82,7 @@ import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import { showDeviceRegistryDetailDialog } from "../devices/device-registry-detail/show-dialog-device-registry-detail"; import { showAliasesDialog } from "../../../dialogs/aliases/show-dialog-aliases"; +import { formatNumber } from "../../../common/number/format_number"; const OVERRIDE_DEVICE_CLASSES = { cover: [ @@ -126,6 +128,8 @@ const OVERRIDE_WEATHER_UNITS = { const SWITCH_AS_DOMAINS = ["cover", "fan", "light", "lock", "siren"]; +const PRECISIONS = [0, 1, 2, 3, 4, 5, 6]; + @customElement("entity-registry-settings") export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; @@ -154,6 +158,8 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @state() private _unit_of_measurement?: string | null; + @state() private _precision?: number | null; + @state() private _precipitation_unit?: string | null; @state() private _pressure_unit?: string | null; @@ -251,6 +257,10 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { this._unit_of_measurement = stateObj?.attributes?.unit_of_measurement; } + if (domain === "sensor") { + this._precision = this.entry.options?.sensor?.display_precision; + } + if (domain === "weather") { const stateObj: HassEntity | undefined = this.hass.states[this.entry.entity_id]; @@ -277,6 +287,14 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { } } + private precisionLabel(precision?: number, stateValue?: string) { + const value = stateValue ?? 0; + return formatNumber(value, this.hass.locale, { + minimumFractionDigits: precision, + maximumFractionDigits: precision, + }); + } + protected async updated(changedProps: PropertyValues): Promise { if (changedProps.has("_deviceClass")) { const domain = computeDomain(this.entry.entity_id); @@ -313,6 +331,9 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { const invalidDomainUpdate = computeDomain(this._entityId.trim()) !== domain; + const defaultPrecision = + this.entry.options?.sensor?.suggested_display_precision ?? undefined; + return html` ${!stateObj ? html` @@ -468,6 +489,47 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { ` : ""} + ${domain === "sensor" && + // Allow customizing the precision for a sensor with numerical device class, + // a unit of measurement or state class + ((this._deviceClass && + !["date", "enum", "timestamp"].includes(this._deviceClass)) || + stateObj?.attributes.unit_of_measurement || + stateObj?.attributes.state_class) + ? html` + + ${this.hass.localize( + "ui.dialogs.entity_registry.editor.precision_default", + { + value: this.precisionLabel( + defaultPrecision, + stateObj?.state + ), + } + )} + ${PRECISIONS.map( + (precision) => html` + + ${this.precisionLabel(precision, stateObj?.state)} + + ` + )} + + ` + : ""} ${domain === "weather" ? html` - "entity" in entity && - oldHass.states[entity.entity] !== element.hass!.states[entity.entity] - ); + return entities.some((entity) => { + if (!("entity" in entity)) { + return false; + } + + return ( + compareEntityState(oldHass, newHass, entity.entity) || + compareEntityEntryOptions(oldHass, newHass, entity.entity) + ); + }); } diff --git a/src/translations/en.json b/src/translations/en.json index 176cd12b34..f42e7ff028 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -906,6 +906,8 @@ "entity_id": "Entity ID", "unit_of_measurement": "Unit of Measurement", "precipitation_unit": "Precipitation unit", + "precision": "Display precision", + "precision_default": "Default ({value})", "pressure_unit": "Barometric pressure unit", "temperature_unit": "Temperature unit", "visibility_unit": "Visibility unit", diff --git a/test/common/string/format_number.ts b/test/common/string/format_number.ts index e8f402e3a4..c8c4c135eb 100644 --- a/test/common/string/format_number.ts +++ b/test/common/string/format_number.ts @@ -126,8 +126,7 @@ describe("formatNumber", () => { getNumberFormatOptions({ state: "3.0", attributes: { step: 0.5 }, - } as unknown as HassEntity), - undefined + } as unknown as HassEntity) ); }); From 15cf003b469c74871a59876ab69602d3ee5ebe9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 11:14:19 -0500 Subject: [PATCH 039/138] Bump comlink from 4.3.1 to 4.4.1 (#15404) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 227d867559..ce1fd76325 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "@webcomponents/webcomponentsjs": "^2.7.0", "app-datepicker": "^5.1.0", "chart.js": "^3.3.2", - "comlink": "^4.3.1", + "comlink": "^4.4.1", "core-js": "^3.27.2", "cropperjs": "^1.5.13", "date-fns": "^2.29.3", diff --git a/yarn.lock b/yarn.lock index 385de7b372..7d4ff7b16f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6797,10 +6797,10 @@ __metadata: languageName: node linkType: hard -"comlink@npm:^4.3.1": - version: 4.3.1 - resolution: "comlink@npm:4.3.1" - checksum: 557360a6558708c55aff74a25f834bfb9bfca8a42444682c4d5aead57681534a0206202be2a2760b4de124c3ba6d485b08978b6d5469cb3d26bf1438ee28a4f1 +"comlink@npm:^4.4.1": + version: 4.4.1 + resolution: "comlink@npm:4.4.1" + checksum: 16d58a8f590087fc45432e31d6c138308dfd4b75b89aec0b7f7bb97ad33d810381bd2b1e608a1fb2cf05979af9cbfcdcaf1715996d5fcf77aeb013b6da3260af languageName: node linkType: hard @@ -9687,7 +9687,7 @@ fsevents@^1.2.7: babel-loader: ^9.1.2 chai: ^4.3.7 chart.js: ^3.3.2 - comlink: ^4.3.1 + comlink: ^4.4.1 core-js: ^3.27.2 cropperjs: ^1.5.13 date-fns: ^2.29.3 From bc572a57496114b83e1aa2e318e3a9ac07cf5280 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 12:10:01 -0500 Subject: [PATCH 040/138] Bump @webcomponents/scoped-custom-element-registry from 0.0.5 to 0.0.8 (#15407) Bumps [@webcomponents/scoped-custom-element-registry](https://github.com/webcomponents/polyfills/tree/HEAD/packages/scoped-custom-element-registry) from 0.0.5 to 0.0.8. - [Release notes](https://github.com/webcomponents/polyfills/releases) - [Changelog](https://github.com/webcomponents/polyfills/blob/master/packages/scoped-custom-element-registry/CHANGELOG.md) - [Commits](https://github.com/webcomponents/polyfills/commits/@webcomponents/scoped-custom-element-registry@0.0.8/packages/scoped-custom-element-registry) --- updated-dependencies: - dependency-name: "@webcomponents/scoped-custom-element-registry" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 ce1fd76325..62a823d74a 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "@vibrant/core": "^3.2.1-alpha.1", "@vibrant/quantizer-mmcq": "^3.2.1-alpha.1", "@vue/web-component-wrapper": "^1.3.0", - "@webcomponents/scoped-custom-element-registry": "^0.0.5", + "@webcomponents/scoped-custom-element-registry": "^0.0.8", "@webcomponents/webcomponentsjs": "^2.7.0", "app-datepicker": "^5.1.0", "chart.js": "^3.3.2", diff --git a/yarn.lock b/yarn.lock index 7d4ff7b16f..37887fd40c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5163,10 +5163,10 @@ __metadata: languageName: node linkType: hard -"@webcomponents/scoped-custom-element-registry@npm:^0.0.5": - version: 0.0.5 - resolution: "@webcomponents/scoped-custom-element-registry@npm:0.0.5" - checksum: eb422f63f042f9e525d89491267073a1c822d60d44b91fed5178d5dc2092e95f180e45e3eb50d214a35ea16580277461c15cade6f4ca1e7694e8a7a451355d31 +"@webcomponents/scoped-custom-element-registry@npm:^0.0.8": + version: 0.0.8 + resolution: "@webcomponents/scoped-custom-element-registry@npm:0.0.8" + checksum: b758bd34723834eedeabe53decadeaa3a655a0fb6b264f1ad55d9fb617f1cff44c72f7722e78cfb953a82c06f85c1e640929d65e775df85202c34419091d2cdf languageName: node linkType: hard @@ -9681,7 +9681,7 @@ fsevents@^1.2.7: "@vue/web-component-wrapper": ^1.3.0 "@web/dev-server": ^0.0.24 "@web/dev-server-rollup": ^0.2.11 - "@webcomponents/scoped-custom-element-registry": ^0.0.5 + "@webcomponents/scoped-custom-element-registry": ^0.0.8 "@webcomponents/webcomponentsjs": ^2.7.0 app-datepicker: ^5.1.0 babel-loader: ^9.1.2 From eec4760593700e44e47887ca92b792ca22c39d90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 17:42:45 +0000 Subject: [PATCH 041/138] Bump @codemirror/view from 6.7.3 to 6.8.1 (#15405) * Bump @codemirror/view from 6.7.3 to 6.8.1 Bumps [@codemirror/view](https://github.com/codemirror/view) from 6.7.3 to 6.8.1. - [Release notes](https://github.com/codemirror/view/releases) - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/compare/6.7.3...6.8.1) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 62a823d74a..67f56f3c39 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@codemirror/legacy-modes": "^6.3.1", "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.7.3", + "@codemirror/view": "^6.8.1", "@formatjs/intl-datetimeformat": "^6.4.3", "@formatjs/intl-getcanonicallocales": "^2.0.5", "@formatjs/intl-locale": "^3.0.11", diff --git a/yarn.lock b/yarn.lock index 37887fd40c..f60c2b63a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1438,14 +1438,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.7.3": - version: 6.7.3 - resolution: "@codemirror/view@npm:6.7.3" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.8.1": + version: 6.8.1 + resolution: "@codemirror/view@npm:6.8.1" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: 37c0458cf45e52a1af9b9bef29108dd84bb91c6818ecad432d89627039d92f6b234b033cf14ecbc1c5b533694127478942fcc9641fdf52b9a1b20eccc018e27c + checksum: e645298a5d2ebbf7ad14fa4a1ccfbaafda227349b44578354783066c6e433ed57a395cbc02c7bdd5351064a5be234d625e71f9b5c24803cb24ab399f60855f28 languageName: node linkType: hard @@ -9593,7 +9593,7 @@ fsevents@^1.2.7: "@codemirror/legacy-modes": ^6.3.1 "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.7.3 + "@codemirror/view": ^6.8.1 "@formatjs/intl-datetimeformat": ^6.4.3 "@formatjs/intl-getcanonicallocales": ^2.0.5 "@formatjs/intl-locale": ^3.0.11 From 24f6bb5c933e392cb592d0abe434282ed2ac0ec8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 08:50:19 -0500 Subject: [PATCH 042/138] Bump hls.js from 1.3.1 to 1.3.3 (#15412) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 67f56f3c39..c3df1e08b7 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "fuse.js": "^6.6.2", "google-timezones-json": "^1.0.2", "hammerjs": "^2.0.8", - "hls.js": "^1.3.1", + "hls.js": "^1.3.3", "home-assistant-js-websocket": "^8.0.1", "idb-keyval": "^6.2.0", "intl-messageformat": "^10.3.0", diff --git a/yarn.lock b/yarn.lock index f60c2b63a4..e0fbc473b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9563,10 +9563,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"hls.js@npm:^1.3.1": - version: 1.3.1 - resolution: "hls.js@npm:1.3.1" - checksum: 10f40e8d7acf762b715575d6a34b0dfea3404f2e8b45c56eb2822791128b1ecb6978c0643a7dc027a9e434682e79686a860649a01ff1c9eed1957024ff037ee6 +"hls.js@npm:^1.3.3": + version: 1.3.3 + resolution: "hls.js@npm:1.3.3" + checksum: 373b80838ac2d9bdb8d3cb319b1279930b5b344c9015b88ae198ead2442c2517b768b831898c5182acff40c13a26745382798b9dc2c8115d09d8693c142e09e9 languageName: node linkType: hard @@ -9718,7 +9718,7 @@ fsevents@^1.2.7: gulp-rename: ^2.0.0 gulp-zopfli-green: ^3.0.1 hammerjs: ^2.0.8 - hls.js: ^1.3.1 + hls.js: ^1.3.3 home-assistant-js-websocket: ^8.0.1 html-minifier: ^4.0.0 husky: ^8.0.3 From 4e74a652b32cbf143b6509c1697926c789a835f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 10:57:59 -0500 Subject: [PATCH 043/138] Bump tinykeys from 1.1.3 to 1.4.0 (#15406) Bumps [tinykeys](https://github.com/jamiebuilds/tinykeys) from 1.1.3 to 1.4.0. - [Release notes](https://github.com/jamiebuilds/tinykeys/releases) - [Commits](https://github.com/jamiebuilds/tinykeys/compare/v1.1.3...v1.4.0) --- updated-dependencies: - dependency-name: tinykeys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 c3df1e08b7..c5e7dee956 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "rrule": "^2.7.1", "sortablejs": "^1.15.0", "superstruct": "^1.0.3", - "tinykeys": "^1.1.3", + "tinykeys": "^1.4.0", "tsparticles-engine": "^2.8.0", "tsparticles-preset-links": "^2.8.0", "unfetch": "^5.0.0", diff --git a/yarn.lock b/yarn.lock index e0fbc473b3..7d275c68dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9765,7 +9765,7 @@ fsevents@^1.2.7: systemjs: ^6.13.0 tar: ^6.1.13 terser-webpack-plugin: ^5.2.4 - tinykeys: ^1.1.3 + tinykeys: ^1.4.0 ts-lit-plugin: ^1.2.1 tsparticles-engine: ^2.8.0 tsparticles-preset-links: ^2.8.0 @@ -15394,10 +15394,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tinykeys@npm:^1.1.3": - version: 1.1.3 - resolution: "tinykeys@npm:1.1.3" - checksum: 28b311ce9950f835f8cfaa72767c090984d5bd68cc460a6a9530cce55173882527a19d12683ef84181429b6de373523d51e4defcc2fced17a9e9864ed02e6ca5 +"tinykeys@npm:^1.4.0": + version: 1.4.0 + resolution: "tinykeys@npm:1.4.0" + checksum: 1a285204116f1150d761a5c34bac9340e9c66a2b1a619311c3e0581168bc086a0ba9ae844774b82cb3393a121def5738c1f33f426135052d5acbf7863e9268d2 languageName: node linkType: hard From e2bfaf244866e4639ae0a45009cc682d65ac4dd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 11:15:49 -0500 Subject: [PATCH 044/138] Bump marked from 4.0.12 to 4.2.12 (#15413) Bumps [marked](https://github.com/markedjs/marked) from 4.0.12 to 4.2.12. - [Release notes](https://github.com/markedjs/marked/releases) - [Changelog](https://github.com/markedjs/marked/blob/master/.releaserc.json) - [Commits](https://github.com/markedjs/marked/compare/v4.0.12...v4.2.12) --- updated-dependencies: - dependency-name: marked dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 c5e7dee956..6c3ef19b71 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "leaflet": "^1.9.3", "leaflet-draw": "^1.0.4", "lit": "^2.6.1", - "marked": "^4.0.12", + "marked": "^4.2.12", "memoize-one": "^6.0.0", "node-vibrant": "3.2.1-alpha.1", "proxy-polyfill": "^0.3.2", diff --git a/yarn.lock b/yarn.lock index 7d275c68dc..7fd3466931 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9735,7 +9735,7 @@ fsevents@^1.2.7: lodash.template: ^4.5.0 magic-string: ^0.25.7 map-stream: ^0.0.7 - marked: ^4.0.12 + marked: ^4.2.12 memoize-one: ^6.0.0 merge-stream: ^2.0.0 mocha: ^8.4.0 @@ -11747,12 +11747,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"marked@npm:^4.0.12": - version: 4.0.12 - resolution: "marked@npm:4.0.12" +"marked@npm:^4.2.12": + version: 4.2.12 + resolution: "marked@npm:4.2.12" bin: marked: bin/marked.js - checksum: 7575117f85a8986652f3ac8b8a7b95056c4c5fce01a1fc76dc4c7960412cb4c9bd9da8133487159b6b3ff84f52b543dfe9a36f826a5f358892b5ec4b6824f192 + checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 languageName: node linkType: hard From d1b95ba36bd1a51aa181e03662cebe6b174e1474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 18:38:48 +0000 Subject: [PATCH 045/138] Bump eslint-config-airbnb-typescript from 14.0.0 to 17.0.0 (#15373) * Bump eslint-config-airbnb-typescript from 14.0.0 to 17.0.0 Bumps [eslint-config-airbnb-typescript](https://github.com/iamturns/eslint-config-airbnb-typescript) from 14.0.0 to 17.0.0. - [Release notes](https://github.com/iamturns/eslint-config-airbnb-typescript/releases) - [Changelog](https://github.com/iamturns/eslint-config-airbnb-typescript/blob/master/CHANGELOG.md) - [Commits](https://github.com/iamturns/eslint-config-airbnb-typescript/compare/v14.0.0...v17.0.0) --- updated-dependencies: - dependency-name: eslint-config-airbnb-typescript dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] * Disable default params last rule for current offenders --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- demo/src/stubs/recorder.ts | 3 +++ package.json | 2 +- src/common/util/select-unit.ts | 1 + src/state/connection-mixin.ts | 11 ++++---- yarn.lock | 47 ++++++++++++++++++++++++---------- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/demo/src/stubs/recorder.ts b/demo/src/stubs/recorder.ts index 3d367cdc0e..7ba78a805b 100644 --- a/demo/src/stubs/recorder.ts +++ b/demo/src/stubs/recorder.ts @@ -15,6 +15,7 @@ import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; const generateMeanStatistics = ( start: Date, end: Date, + // eslint-disable-next-line @typescript-eslint/default-param-last period: "5minute" | "hour" | "day" | "month" = "hour", initValue: number, maxDiff: number @@ -51,6 +52,7 @@ const generateMeanStatistics = ( const generateSumStatistics = ( start: Date, end: Date, + // eslint-disable-next-line @typescript-eslint/default-param-last period: "5minute" | "hour" | "day" | "month" = "hour", initValue: number, maxDiff: number @@ -86,6 +88,7 @@ const generateSumStatistics = ( const generateCurvedStatistics = ( start: Date, end: Date, + // eslint-disable-next-line @typescript-eslint/default-param-last _period: "5minute" | "hour" | "day" | "month" = "hour", initValue: number, maxDiff: number, diff --git a/package.json b/package.json index 6c3ef19b71..e9d4189a5d 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "del": "^7.0.0", "eslint": "^7.32.0", "eslint-config-airbnb-base": "^14.2.1", - "eslint-config-airbnb-typescript": "^14.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.6.0", "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-disable": "^2.0.3", diff --git a/src/common/util/select-unit.ts b/src/common/util/select-unit.ts index f68599c610..7e388a2ddb 100644 --- a/src/common/util/select-unit.ts +++ b/src/common/util/select-unit.ts @@ -19,6 +19,7 @@ const SECS_PER_HOUR = SECS_PER_MIN * 60; // Adapted from https://github.com/formatjs/formatjs/blob/186cef62f980ec66252ee232f438a42d0b51b9f9/packages/intl-utils/src/diff.ts export function selectUnit( from: Date | number, + // eslint-disable-next-line @typescript-eslint/default-param-last to: Date | number = Date.now(), locale: FrontendLocaleData, thresholds: Partial = {} diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts index dab61ccbb1..ca44abf7d5 100644 --- a/src/state/connection-mixin.ts +++ b/src/state/connection-mixin.ts @@ -10,7 +10,11 @@ import { subscribeServices, } from "home-assistant-js-websocket"; import { fireEvent } from "../common/dom/fire_event"; +import { polyfillsLoaded } from "../common/translations/localize"; +import { subscribeAreaRegistry } from "../data/area_registry"; import { broadcastConnectionStatus } from "../data/connection-status"; +import { subscribeDeviceRegistry } from "../data/device_registry"; +import { subscribeEntityRegistry } from "../data/entity_registry"; import { subscribeFrontendUserData } from "../data/frontend"; import { forwardHaptic } from "../data/haptics"; import { DEFAULT_PANEL } from "../data/panel"; @@ -19,15 +23,11 @@ import { FirstWeekday, NumberFormat, TimeFormat } from "../data/translation"; import { subscribePanels } from "../data/ws-panels"; import { translationMetadata } from "../resources/translations-metadata"; import { Constructor, HomeAssistant, ServiceCallResponse } from "../types"; +import { getLocalLanguage } from "../util/common-translation"; import { fetchWithAuth } from "../util/fetch-with-auth"; import { getState } from "../util/ha-pref-storage"; import hassCallApi from "../util/hass-call-api"; -import { getLocalLanguage } from "../util/common-translation"; import { HassBaseEl } from "./hass-base-mixin"; -import { polyfillsLoaded } from "../common/translations/localize"; -import { subscribeAreaRegistry } from "../data/area_registry"; -import { subscribeDeviceRegistry } from "../data/device_registry"; -import { subscribeEntityRegistry } from "../data/entity_registry"; export const connectionMixin = >( superClass: T @@ -70,6 +70,7 @@ export const connectionMixin = >( enableShortcuts: true, moreInfoEntityId: null, hassUrl: (path = "") => new URL(path, auth.data.hassUrl).toString(), + // eslint-disable-next-line @typescript-eslint/default-param-last callService: async (domain, service, serviceData = {}, target) => { if (__DEV__) { // eslint-disable-next-line no-console diff --git a/yarn.lock b/yarn.lock index 7fd3466931..76d6987819 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7676,7 +7676,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.18.2, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4": +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4": version: 1.21.1 resolution: "es-abstract@npm:1.21.1" dependencies: @@ -7879,13 +7879,32 @@ __metadata: languageName: node linkType: hard -"eslint-config-airbnb-typescript@npm:^14.0.0": - version: 14.0.0 - resolution: "eslint-config-airbnb-typescript@npm:14.0.0" +"eslint-config-airbnb-base@npm:^15.0.0": + version: 15.0.0 + resolution: "eslint-config-airbnb-base@npm:15.0.0" + dependencies: + confusing-browser-globals: ^1.0.10 + object.assign: ^4.1.2 + object.entries: ^1.1.5 + semver: ^6.3.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^4.29.3 - "@typescript-eslint/parser": ^4.29.3 - checksum: 0544e55cd651e0217a09faa257a86689fdaa056bb6e0217ea38345c3c083ddeb5eb59a23b745884637d8e7c338acaa4459b08c151226c65c61b308c58e8a1d3a + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + checksum: 38626bad2ce2859fccac86b30cd2b86c9b7d8d71d458331860861dc05290a5b198bded2f4fb89efcb9046ec48f8ab4c4fb00365ba8916f27b172671da28b93ea + 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" + dependencies: + eslint-config-airbnb-base: ^15.0.0 + peerDependencies: + "@typescript-eslint/eslint-plugin": ^5.13.0 + "@typescript-eslint/parser": ^5.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + checksum: e598ae7bcc3629bbc847a749f8c1ad69e6ef111335b60d88bde91d1bb335077b06688868257fe2fcc95c3687a0d6e3e1f91e0534cc633f5a118239e52bb05a54 languageName: node linkType: hard @@ -9697,7 +9716,7 @@ fsevents@^1.2.7: del: ^7.0.0 eslint: ^7.32.0 eslint-config-airbnb-base: ^14.2.1 - eslint-config-airbnb-typescript: ^14.0.0 + eslint-config-airbnb-typescript: ^17.0.0 eslint-config-prettier: ^8.6.0 eslint-import-resolver-webpack: ^0.13.2 eslint-plugin-disable: ^2.0.3 @@ -12593,14 +12612,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.entries@npm:^1.1.2": - version: 1.1.4 - resolution: "object.entries@npm:1.1.4" +"object.entries@npm:^1.1.2, object.entries@npm:^1.1.5": + version: 1.1.6 + resolution: "object.entries@npm:1.1.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.18.2 - checksum: 1ddd2e28f5ecfe2369fe198439ec0457529f3eec85c7f43870be8de3ec3d98024b014ddb4a769ca48925e47ed76c69a51d8bf2c9886ed43174e3a1d33c2dbe38 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0f8c47517e6a9a980241eafe3b73de11e59511883173c2b93d67424a008e47e11b77c80e431ad1d8a806f6108b225a1cab9223e53e555776c612a24297117d28 languageName: node linkType: hard From 4a10c722ab9bb5ed4bd9827ee18c75b5ff9dfc18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Feb 2023 16:21:49 -0500 Subject: [PATCH 046/138] Bump gulp-zopfli-green from 3.0.1 to 6.0.1 (#15414) Bumps [gulp-zopfli-green](https://github.com/gekorm/gulp-zopfli-green) from 3.0.1 to 6.0.1. - [Release notes](https://github.com/gekorm/gulp-zopfli-green/releases) - [Commits](https://github.com/gekorm/gulp-zopfli-green/compare/v3.0.1...v6.0.1) --- updated-dependencies: - dependency-name: gulp-zopfli-green dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 78 +++++++++++++++++----------------------------------- 2 files changed, 26 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index e9d4189a5d..2bfbbef02c 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "gulp-json-transform": "^0.4.8", "gulp-merge-json": "^2.1.2", "gulp-rename": "^2.0.0", - "gulp-zopfli-green": "^3.0.1", + "gulp-zopfli-green": "^6.0.1", "html-minifier": "^4.0.0", "husky": "^8.0.3", "instant-mocha": "^1.5.0", diff --git a/yarn.lock b/yarn.lock index 76d6987819..48dbdd655e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1633,12 +1633,12 @@ __metadata: languageName: node linkType: hard -"@gfx/zopfli@npm:^1.0.9": - version: 1.0.11 - resolution: "@gfx/zopfli@npm:1.0.11" +"@gfx/zopfli@npm:^1.0.15": + version: 1.0.15 + resolution: "@gfx/zopfli@npm:1.0.15" dependencies: base64-js: ^1.3.0 - checksum: 3728effed086649c7acbd4f426b9ac971866134a308010dc9d13f1916419c7093456932d2db32b5c23017da83dee8e75b5fc361d932aa3c063ef01eaa1c9b0d6 + checksum: 4d7156a861acda05e8c0de7d538e0a8e7321c19c5b3895f59b518b7a85273d53821978b10b358a4e3f89172946fb49b4f439ab79b1eb1c20d885048b4231be05 languageName: node linkType: hard @@ -6264,7 +6264,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2, bytes@npm:^3.0.0": +"bytes@npm:3.1.2, bytes@npm:^3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e @@ -7300,12 +7300,12 @@ __metadata: languageName: node linkType: hard -"defaults@npm:^1.0.2": - version: 1.0.3 - resolution: "defaults@npm:1.0.3" +"defaults@npm:^1.0.4": + version: 1.0.4 + resolution: "defaults@npm:1.0.4" dependencies: clone: ^1.0.2 - checksum: 96e2112da6553d376afd5265ea7cbdb2a3b45535965d71ab8bb1da10c8126d168fdd5268799625324b368356d21ba2a7b3d4ec50961f11a47b7feb9de3d4413e + checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a languageName: node linkType: hard @@ -8836,16 +8836,6 @@ __metadata: languageName: node linkType: hard -"from2@npm:^2.1.1": - version: 2.3.0 - resolution: "from2@npm:2.3.0" - dependencies: - inherits: ^2.0.1 - readable-stream: ^2.0.0 - checksum: 6080eba0793dce32f475141fb3d54cc15f84ee52e420ee22ac3ab0ad639dc95a1875bc6eb9c0e1140e94972a36a89dc5542491b85f1ab8df0c126241e0f1a61b - languageName: node - linkType: hard - "fs-extra@npm:^11.1.0": version: 11.1.0 resolution: "fs-extra@npm:11.1.0" @@ -9412,19 +9402,18 @@ fsevents@^1.2.7: languageName: node linkType: hard -"gulp-zopfli-green@npm:^3.0.1": - version: 3.0.1 - resolution: "gulp-zopfli-green@npm:3.0.1" +"gulp-zopfli-green@npm:^6.0.1": + version: 6.0.1 + resolution: "gulp-zopfli-green@npm:6.0.1" dependencies: - "@gfx/zopfli": ^1.0.9 - bytes: ^3.0.0 - defaults: ^1.0.2 - fancy-log: ^1.3.2 - into-stream: ^4.0.0 + "@gfx/zopfli": ^1.0.15 + bytes: ^3.1.2 + defaults: ^1.0.4 + fancy-log: ^2.0.0 plugin-error: ^1.0.1 stream-to-array: ^2.0.2 - through2: ^3.0.0 - checksum: cd28d8b5216cf15112fb1bdf7d39662b5e0f3480c02bcf3eede1dc082af8be51919518c6e7081d4610974fa91d6c54c995e34c466d6a8fe8d9e32515492a055b + through2: ^4.0.2 + checksum: 20b7567a850d8de98671ff3b98be1fc9d7718946ce30176099eaa4ea383d8d96423deeee9500c94c8d212735ceccd2450090be2ac9dfd8e721425a40ef95d165 languageName: node linkType: hard @@ -9735,7 +9724,7 @@ fsevents@^1.2.7: gulp-json-transform: ^0.4.8 gulp-merge-json: ^2.1.2 gulp-rename: ^2.0.0 - gulp-zopfli-green: ^3.0.1 + gulp-zopfli-green: ^6.0.1 hammerjs: ^2.0.8 hls.js: ^1.3.3 home-assistant-js-websocket: ^8.0.1 @@ -10249,16 +10238,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"into-stream@npm:^4.0.0": - version: 4.0.0 - resolution: "into-stream@npm:4.0.0" - dependencies: - from2: ^2.1.1 - p-is-promise: ^2.0.0 - checksum: 952519f8a308fdcaaaa51871f16a66ea3eff568099b815d194fc96842ce0c2fca520b1693480f2be741fa7bea10c08d605b2c166ae6859c7cb6044d659e7a24f - languageName: node - linkType: hard - "invert-kv@npm:^1.0.0": version: 1.0.0 resolution: "invert-kv@npm:1.0.0" @@ -12811,13 +12790,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-is-promise@npm:^2.0.0": - version: 2.0.0 - resolution: "p-is-promise@npm:2.0.0" - checksum: 784edc4a97efe1cc8f42c3449b765baabc51b96f7bc637ddd322e7323904d1f689cfb00ccf625cc555d78ec4b114100a3b83a4f39c0ec1b26417bf0ee713b4e6 - languageName: node - linkType: hard - "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -13571,7 +13543,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:^3.0.6": +"readable-stream@npm:3, readable-stream@npm:^3.0.6": version: 3.6.0 resolution: "readable-stream@npm:3.6.0" dependencies: @@ -15369,12 +15341,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"through2@npm:^3.0.0": - version: 3.0.1 - resolution: "through2@npm:3.0.1" +"through2@npm:^4.0.2": + version: 4.0.2 + resolution: "through2@npm:4.0.2" dependencies: - readable-stream: 2 || 3 - checksum: ffac3931c1906b5d3a375b71e3d692228432299ba63213e65d686f95ea3abe1bb5726fa335fb7eba9c6f5f010da17c071a6c1c531bd091b2ec7650bc38bcaf13 + readable-stream: 3 + checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 languageName: node linkType: hard From a325d32d091e98939b33f5fc78299a08b3d96b51 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 11 Feb 2023 16:43:20 -0600 Subject: [PATCH 047/138] Fix stats data being fetched for all entities when there are no energy/water stat ids (#15428) * Fix stats data being fetched for all entities when there are no energy/water stat ids I noticed the following query was being sent to the stats api since there were no water stat ids. Since it sent an empty list it enumerated everything ``` { type: "recorder/statistics_during_period", start_time: "2023-02-05T05:00:00.000Z", end_time: "2023-02-12T05:59:59.999Z" .... statistic_ids: [], type: "recorder/statistics_during_period" types: ["sum"] units: {volume: "gal"} } ``` * not python --- src/data/energy.ts | 80 +++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/src/data/energy.ts b/src/data/energy.ts index ba369bded0..1584d385c5 100644 --- a/src/data/energy.ts +++ b/src/data/energy.ts @@ -406,24 +406,28 @@ const getEnergyData = async ( }; const stats = { - ...(await fetchStatistics( - hass!, - startMinHour, - end, - energyStatIds, - period, - energyUnits, - ["sum"] - )), - ...(await fetchStatistics( - hass!, - startMinHour, - end, - waterStatIds, - period, - waterUnits, - ["sum"] - )), + ...(energyStatIds.length + ? await fetchStatistics( + hass!, + startMinHour, + end, + energyStatIds, + period, + energyUnits, + ["sum"] + ) + : {}), + ...(waterStatIds.length + ? await fetchStatistics( + hass!, + startMinHour, + end, + waterStatIds, + period, + waterUnits, + ["sum"] + ) + : {}), }; let statsCompare; @@ -441,24 +445,28 @@ const getEnergyData = async ( endCompare = addMilliseconds(start, -1); statsCompare = { - ...(await fetchStatistics( - hass!, - compareStartMinHour, - endCompare, - energyStatIds, - period, - energyUnits, - ["sum"] - )), - ...(await fetchStatistics( - hass!, - compareStartMinHour, - endCompare, - waterStatIds, - period, - waterUnits, - ["sum"] - )), + ...(energyStatIds.length + ? await fetchStatistics( + hass!, + compareStartMinHour, + endCompare, + energyStatIds, + period, + energyUnits, + ["sum"] + ) + : {}), + ...(waterStatIds.length + ? await fetchStatistics( + hass!, + compareStartMinHour, + endCompare, + waterStatIds, + period, + waterUnits, + ["sum"] + ) + : {}), }; } From f74aa7c7e6bbc3b321fb7bf4400777e3ef475cdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 04:39:54 +0000 Subject: [PATCH 048/138] Bump @types/marked from 4.0.2 to 4.0.8 (#15433) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 48dbdd655e..56ec5ea209 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4245,9 +4245,9 @@ __metadata: linkType: hard "@types/marked@npm:^4": - version: 4.0.2 - resolution: "@types/marked@npm:4.0.2" - checksum: 61d7f47b2b9924a63600f975ae0417894d0b5e009d8d75d165ace563ec3b0e56205e66df08bc68017a530315289b491f2626e3e0b8e33ac08aec474b1944f0e8 + version: 4.0.8 + resolution: "@types/marked@npm:4.0.8" + checksum: 68278fa7acaa5d920cdc239d675b5daf842e0ad4779e4848cd617d9baf2ac1afccb5a264c331e37d80031d647e1640cb983cd31e73d45b28552670b4853fad8e languageName: node linkType: hard From b409d0ff8895795d0ce255a0e1b89811544d9ef6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 04:42:12 +0000 Subject: [PATCH 049/138] Bump rrule from 2.7.1 to 2.7.2 (#15432) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 2bfbbef02c..ca21445ade 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "regenerator-runtime": "^0.13.11", "resize-observer-polyfill": "^1.5.1", "roboto-fontface": "^0.10.0", - "rrule": "^2.7.1", + "rrule": "^2.7.2", "sortablejs": "^1.15.0", "superstruct": "^1.0.3", "tinykeys": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index 56ec5ea209..fa3cab8bf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9764,7 +9764,7 @@ fsevents@^1.2.7: rollup-plugin-string: ^3.0.0 rollup-plugin-terser: ^5.3.0 rollup-plugin-visualizer: ^5.9.0 - rrule: ^2.7.1 + rrule: ^2.7.2 serve: ^11.3.2 sinon: ^15.0.1 sortablejs: ^1.15.0 @@ -14096,12 +14096,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"rrule@npm:^2.7.1": - version: 2.7.1 - resolution: "rrule@npm:2.7.1" +"rrule@npm:^2.7.2": + version: 2.7.2 + resolution: "rrule@npm:2.7.2" dependencies: tslib: ^2.4.0 - checksum: 80b81c5b1c1d12539a2af6de6fc8ebff8d763d8006cd9a418a1de7adbd634ae84ea853f1590d73ea72737422b8775cd53ca64c59e7c4625eda09a2746596f1d9 + checksum: 9fae4c4ecacd81792b8722ae09b32eb0516148de776860f83caa9f2d97d8aa0fc18e6bb2ea62bd14c336b963252e2def1c212f1bf21310aee9124df4c1d2afc2 languageName: node linkType: hard From 714c6aab985219613e85d5ec551af92af4c260dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 04:43:36 +0000 Subject: [PATCH 050/138] Bump prettier from 2.8.3 to 2.8.4 (#15436) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ca21445ade..43325c1b1e 100644 --- a/package.json +++ b/package.json @@ -221,7 +221,7 @@ "object-hash": "^3.0.0", "open": "^8.4.0", "pinst": "^3.0.0", - "prettier": "^2.8.3", + "prettier": "^2.8.4", "require-dir": "^1.2.0", "rollup": "^2.8.2", "rollup-plugin-string": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index fa3cab8bf8..1c64d5e368 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9751,7 +9751,7 @@ fsevents@^1.2.7: object-hash: ^3.0.0 open: ^8.4.0 pinst: ^3.0.0 - prettier: ^2.8.3 + prettier: ^2.8.4 proxy-polyfill: ^0.3.2 punycode: ^2.3.0 qr-scanner: ^1.4.2 @@ -13284,12 +13284,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"prettier@npm:^2.8.3": - version: 2.8.3 - resolution: "prettier@npm:2.8.3" +"prettier@npm:^2.8.4": + version: 2.8.4 + resolution: "prettier@npm:2.8.4" bin: prettier: bin-prettier.js - checksum: 92f2ceb522d454370e02082aa74ad27388672f7cee8975028b59517c069fe643bdc73e322675c8faf2ff173d7a626d1a6389f26b474000308e793aa25fff46e5 + checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e languageName: node linkType: hard From 1c5b476bda653b2be67c4fd0d9176847096ad4fb Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 13 Feb 2023 17:28:45 +0100 Subject: [PATCH 051/138] Fix custom card documentation url (#15439) Fix custom card documentation --- src/panels/lovelace/create-element/create-element-base.ts | 2 +- src/panels/lovelace/editor/get-card-documentation-url.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 8a1482e43e..4556efe509 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -154,7 +154,7 @@ const _lazyCreate = ( const _getCustomTag = (type: string) => type.startsWith(CUSTOM_TYPE_PREFIX) - ? type.substr(CUSTOM_TYPE_PREFIX.length) + ? type.slice(CUSTOM_TYPE_PREFIX.length) : undefined; export const createLovelaceElement = ( diff --git a/src/panels/lovelace/editor/get-card-documentation-url.ts b/src/panels/lovelace/editor/get-card-documentation-url.ts index e810f6bb4f..7d01eb9419 100644 --- a/src/panels/lovelace/editor/get-card-documentation-url.ts +++ b/src/panels/lovelace/editor/get-card-documentation-url.ts @@ -10,7 +10,8 @@ export const getCardDocumentationURL = ( type: string ): string | undefined => { if (type.startsWith(CUSTOM_TYPE_PREFIX)) { - return getCustomCardEntry(type)?.documentationURL; + return getCustomCardEntry(type.slice(CUSTOM_TYPE_PREFIX.length)) + ?.documentationURL; } return `${documentationUrl(hass, "/lovelace/")}${type}`; From 859e69d373a7060566a4a213688ed2dc9debbf04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 16:32:42 +0000 Subject: [PATCH 052/138] Bump terser-webpack-plugin from 5.2.4 to 5.3.6 (#15435) * Bump terser-webpack-plugin from 5.2.4 to 5.3.6 Bumps [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) from 5.2.4 to 5.3.6. - [Release notes](https://github.com/webpack-contrib/terser-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/terser-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/terser-webpack-plugin/compare/v5.2.4...v5.3.6) --- updated-dependencies: - dependency-name: terser-webpack-plugin dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 54 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 43325c1b1e..24827c64bf 100644 --- a/package.json +++ b/package.json @@ -232,7 +232,7 @@ "source-map-url": "^0.4.1", "systemjs": "^6.13.0", "tar": "^6.1.13", - "terser-webpack-plugin": "^5.2.4", + "terser-webpack-plugin": "^5.3.6", "ts-lit-plugin": "^1.2.1", "typescript": "^4.9.5", "vinyl-buffer": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 1c64d5e368..1e4dc6a6a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1803,7 +1803,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2": +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": version: 0.3.2 resolution: "@jridgewell/gen-mapping@npm:0.3.2" dependencies: @@ -1828,6 +1828,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/source-map@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/source-map@npm:0.3.2" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1b83f0eb944e77b70559a394d5d3b3f98a81fcc186946aceb3ef42d036762b52ef71493c6c0a3b7c1d2f08785f53ba2df1277fe629a06e6109588ff4cdcf7482 + languageName: node + linkType: hard + "@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" @@ -1835,7 +1845,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.17 resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: @@ -9772,7 +9782,7 @@ fsevents@^1.2.7: superstruct: ^1.0.3 systemjs: ^6.13.0 tar: ^6.1.13 - terser-webpack-plugin: ^5.2.4 + terser-webpack-plugin: ^5.3.6 tinykeys: ^1.4.0 ts-lit-plugin: ^1.2.1 tsparticles-engine: ^2.8.0 @@ -10908,14 +10918,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-worker@npm:^27.0.6": - version: 27.2.4 - resolution: "jest-worker@npm:27.2.4" +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" dependencies: "@types/node": "*" merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 0caae100e97e247a1c0140928fff075aade1a41317f18316e63db32b626858dff3552bf4e09c9c3bd9af5e8dbe92123fdaed3c9cc8f5439ec64cd970c612bd5d + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 languageName: node linkType: hard @@ -12799,7 +12809,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": +"p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -14669,7 +14679,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"source-map@npm:^0.7.4, source-map@npm:~0.7.2": +"source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 @@ -15237,16 +15247,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.2.4": - version: 5.2.4 - resolution: "terser-webpack-plugin@npm:5.2.4" +"terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.3.6": + version: 5.3.6 + resolution: "terser-webpack-plugin@npm:5.3.6" dependencies: - jest-worker: ^27.0.6 - p-limit: ^3.1.0 + "@jridgewell/trace-mapping": ^0.3.14 + jest-worker: ^27.4.5 schema-utils: ^3.1.1 serialize-javascript: ^6.0.0 - source-map: ^0.6.1 - terser: ^5.7.2 + terser: ^5.14.1 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -15256,7 +15265,7 @@ fsevents@^1.2.7: optional: true uglify-js: optional: true - checksum: ddbcdd28f9620ecacc9b50ff31776485ad012c7f1cbef53825e4fc334a78d82e2344346e5595751916494951bc64717004c07b03ad88deeb3df4a5f76c559cc9 + checksum: 8f3448d7fdb0434ce6a0c09d95c462bfd2f4a5a430233d854163337f734a7f5c07c74513d16081e06d4ca33d366d5b1a36f5444219bc41a7403afd6162107bad languageName: node linkType: hard @@ -15273,16 +15282,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"terser@npm:^5.0.0, terser@npm:^5.7.2": - version: 5.9.0 - resolution: "terser@npm:5.9.0" +"terser@npm:^5.0.0, terser@npm:^5.14.1": + version: 5.16.3 + resolution: "terser@npm:5.16.3" dependencies: + "@jridgewell/source-map": ^0.3.2 + acorn: ^8.5.0 commander: ^2.20.0 - source-map: ~0.7.2 source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 11c1246b1991015a8881742878af779e3863fad42f626ffda957dbf28c94bf51e7994cffb9ffbec86ff3c23ab45ffa6d79d453c15e664306e35fc7b2c4eee5f4 + checksum: d3c2ac1c2723c37b698b25b68d76fd315a1277fddde113983d5783d1f2a01dd7b8ed83ba3f54e5e65f0b59dd971ed7be2fdf8d4be94ec694b2d27832d2e7561f languageName: node linkType: hard From bf5eeba0a5c09b9bd008742bb3258184d7b73773 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Mon, 13 Feb 2023 11:47:10 -0500 Subject: [PATCH 053/138] Remove firmware target from zwave_js firmware upload UI (#15425) --- src/data/zwave_js.ts | 6 +--- .../dialog-zwave_js-update-firmware-node.ts | 28 +------------------ src/translations/en.json | 4 +-- 3 files changed, 3 insertions(+), 35 deletions(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 4c0baad80b..7dcc12abef 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -707,14 +707,10 @@ export const fetchZwaveNodeFirmwareUpdateCapabilities = ( export const uploadFirmwareAndBeginUpdate = async ( hass: HomeAssistant, device_id: string, - file: File, - target?: number + file: File ) => { const fd = new FormData(); fd.append("file", file); - if (target !== undefined) { - fd.append("target", target.toString()); - } const resp = await hass.fetchWithAuth( `/api/zwave_js/firmware/upload/${device_id}`, { diff --git a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts index 768d2d5a82..4c8b194b92 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts @@ -34,7 +34,6 @@ import { showAlertDialog, showConfirmationDialog, } from "../../../../../dialogs/generic/show-dialog-box"; -import { HaFormIntegerSchema } from "../../../../../components/ha-form/types"; @customElement("dialog-zwave_js-update-firmware-node") class DialogZWaveJSUpdateFirmwareNode extends LitElement { @@ -56,8 +55,6 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { @state() private _nodeStatus?: ZWaveJSNodeStatus; - @state() private _firmwareTarget? = 0; - private _subscribedNodeStatus?: Promise; private _subscribedNodeFirmwareUpdate?: Promise; @@ -80,7 +77,6 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { this._firmwareFile = this._nodeStatus = undefined; - this._firmwareTarget = 0; this._uploading = this._updateInProgress = false; fireEvent(this, "dialog-closed", { dialog: this.localName }); @@ -95,12 +91,6 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { return html``; } - const schema: HaFormIntegerSchema = { - name: "firmware_target", - type: "integer", - valueMin: 0, - }; - const beginFirmwareUpdateHTML = html` -

    - ${this.hass.localize( - "ui.panel.config.zwave_js.update_firmware.firmware_target_intro" - )} -

    - Date: Mon, 13 Feb 2023 17:48:18 +0100 Subject: [PATCH 054/138] Use enum for media player features (#15410) --- .../ha-selector/ha-selector-media.ts | 5 +- src/data/media-player.ts | 80 +++++++++++-------- .../controls/more-info-media_player.ts | 26 +++--- .../cloud/account/dialog-cloud-tts-try.ts | 4 +- .../lovelace/cards/hui-media-control-card.ts | 19 +++-- .../hui-media-player-entity-row.ts | 68 ++++++++-------- .../media-browser/browser-media-player.ts | 12 +-- .../media-browser/ha-bar-media-player.ts | 26 +++--- 8 files changed, 129 insertions(+), 111 deletions(-) diff --git a/src/components/ha-selector/ha-selector-media.ts b/src/components/ha-selector/ha-selector-media.ts index fc998f5d05..bd45f5dec1 100644 --- a/src/components/ha-selector/ha-selector-media.ts +++ b/src/components/ha-selector/ha-selector-media.ts @@ -8,7 +8,7 @@ import { getSignedPath } from "../../data/auth"; import { MediaClassBrowserSettings, MediaPickedEvent, - SUPPORT_BROWSE_MEDIA, + MediaPlayerEntityFeature, } from "../../data/media-player"; import type { MediaSelector, MediaSelectorValue } from "../../data/selector"; import type { HomeAssistant } from "../../types"; @@ -80,7 +80,8 @@ export class HaMediaSelector extends LitElement { const supportsBrowse = !this.value?.entity_id || - (stateObj && supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA)); + (stateObj && + supportsFeature(stateObj, MediaPlayerEntityFeature.BROWSE_MEDIA)); return html` - ${supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA) + ${supportsFeature(stateObj, MediaPlayerEntityFeature.BROWSE_MEDIA) ? html` - ${(supportsFeature(stateObj, SUPPORT_VOLUME_SET) || - supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS)) && + ${(supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_SET) || + supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_BUTTONS)) && ![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state) ? html`
    - ${supportsFeature(stateObj, SUPPORT_VOLUME_MUTE) + ${supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_MUTE) ? html` ` : ""} - ${supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS) + ${supportsFeature( + stateObj, + MediaPlayerEntityFeature.VOLUME_BUTTONS + ) ? html` ` : ""} - ${supportsFeature(stateObj, SUPPORT_VOLUME_SET) + ${supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_SET) ? html` @@ -168,7 +166,7 @@ class MoreInfoMediaPlayer extends LitElement { ` : ""} ${![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state) && - supportsFeature(stateObj, SUPPORT_SELECT_SOUND_MODE) && + supportsFeature(stateObj, MediaPlayerEntityFeature.SELECT_SOUND_MODE) && stateObj.attributes.sound_mode_list?.length ? html`
    diff --git a/src/panels/config/cloud/account/dialog-cloud-tts-try.ts b/src/panels/config/cloud/account/dialog-cloud-tts-try.ts index b93cbeac21..68e93478f4 100644 --- a/src/panels/config/cloud/account/dialog-cloud-tts-try.ts +++ b/src/panels/config/cloud/account/dialog-cloud-tts-try.ts @@ -14,7 +14,7 @@ import "../../../../components/ha-select"; import "../../../../components/ha-textarea"; import type { HaTextArea } from "../../../../components/ha-textarea"; import { showAutomationEditor } from "../../../../data/automation"; -import { SUPPORT_PLAY_MEDIA } from "../../../../data/media-player"; +import { MediaPlayerEntityFeature } from "../../../../data/media-player"; import { convertTextToSpeech } from "../../../../data/tts"; import { showAlertDialog } from "../../../../dialogs/generic/show-dialog-box"; import { haStyleDialog } from "../../../../resources/styles"; @@ -94,7 +94,7 @@ export class DialogTryTts extends LitElement { .filter( (entity) => computeStateDomain(entity) === "media_player" && - supportsFeature(entity, SUPPORT_PLAY_MEDIA) + supportsFeature(entity, MediaPlayerEntityFeature.PLAY_MEDIA) ) .map( (entity) => html` diff --git a/src/panels/lovelace/cards/hui-media-control-card.ts b/src/panels/lovelace/cards/hui-media-control-card.ts index 8f2f47303f..05d6faf3b2 100644 --- a/src/panels/lovelace/cards/hui-media-control-card.ts +++ b/src/panels/lovelace/cards/hui-media-control-card.ts @@ -31,10 +31,8 @@ import { handleMediaControlClick, MediaPickedEvent, MediaPlayerEntity, + MediaPlayerEntityFeature, mediaPlayerPlayMedia, - SUPPORT_BROWSE_MEDIA, - SUPPORT_SEEK, - SUPPORT_TURN_ON, } from "../../../data/media-player"; import type { HomeAssistant } from "../../../types"; import { findEntities } from "../common/find-entities"; @@ -174,7 +172,8 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { const isOffState = entityState === "off"; const isUnavailable = isUnavailableState(entityState) || - (entityState === "off" && !supportsFeature(stateObj, SUPPORT_TURN_ON)); + (entityState === "off" && + !supportsFeature(stateObj, MediaPlayerEntityFeature.TURN_ON)); const hasNoImage = !this._image; const controls = computeMediaControls(stateObj, false); const showControls = @@ -282,7 +281,10 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard { ` )} - ${supportsFeature(stateObj, SUPPORT_BROWSE_MEDIA) + ${supportsFeature( + stateObj, + MediaPlayerEntityFeature.BROWSE_MEDIA + ) ? html` ` : ""} - ${assumedState && supportsFeature(stateObj, SUPPORT_PLAY) + ${assumedState && supportsFeature(stateObj, MediaPlayerEntityFeature.PLAY) ? html` ` : ""} - ${assumedState && supportsFeature(stateObj, SUPPORT_PAUSE) + ${assumedState && + supportsFeature(stateObj, MediaPlayerEntityFeature.PAUSE) ? html`
    - ${supportsFeature(stateObj, SUPPORT_TURN_ON) && + ${supportsFeature(stateObj, MediaPlayerEntityFeature.TURN_ON) && entityState === "off" && !isUnavailableState(entityState) ? html` @@ -214,11 +207,14 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow { @click=${this._togglePower} > ` - : !supportsFeature(stateObj, SUPPORT_VOLUME_SET) && - !supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS) + : !supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_SET) && + !supportsFeature( + stateObj, + MediaPlayerEntityFeature.VOLUME_BUTTONS + ) ? buttons : ""} - ${supportsFeature(stateObj, SUPPORT_TURN_OFF) && + ${supportsFeature(stateObj, MediaPlayerEntityFeature.TURN_OFF) && entityState !== "off" && !isUnavailableState(entityState) ? html` @@ -231,13 +227,16 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow { : ""}
    - ${(supportsFeature(stateObj, SUPPORT_VOLUME_SET) || - supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS)) && + ${(supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_SET) || + supportsFeature(stateObj, MediaPlayerEntityFeature.VOLUME_BUTTONS)) && ![UNAVAILABLE, UNKNOWN, "off"].includes(entityState) ? html`
    - ${supportsFeature(stateObj, SUPPORT_VOLUME_MUTE) + ${supportsFeature( + stateObj, + MediaPlayerEntityFeature.VOLUME_MUTE + ) ? html` ` : !this._veryNarrow && - supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS) + supportsFeature( + stateObj, + MediaPlayerEntityFeature.VOLUME_BUTTONS + ) ? html` computeStateDomain(entity) === "media_player" && - supportsFeature(entity, SUPPORT_BROWSE_MEDIA) && + supportsFeature(entity, MediaPlayerEntityFeature.BROWSE_MEDIA) && !this._hiddenEntities.has(entity.entity_id) ); } From 00a40a5c51d379b92ebaf1afd5758bd5db4995e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 17:01:11 +0000 Subject: [PATCH 055/138] Bump tsparticles-engine from 2.8.0 to 2.9.3 (#15434) * Bump tsparticles-engine from 2.8.0 to 2.9.3 Bumps [tsparticles-engine](https://github.com/matteobruni/tsparticles/tree/HEAD/engine) from 2.8.0 to 2.9.3. - [Release notes](https://github.com/matteobruni/tsparticles/releases) - [Changelog](https://github.com/matteobruni/tsparticles/blob/main/engine/CHANGELOG.md) - [Commits](https://github.com/matteobruni/tsparticles/commits/tsparticles-engine@2.9.3/engine) --- updated-dependencies: - dependency-name: tsparticles-engine dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 24827c64bf..58bc853a87 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "sortablejs": "^1.15.0", "superstruct": "^1.0.3", "tinykeys": "^1.4.0", - "tsparticles-engine": "^2.8.0", + "tsparticles-engine": "^2.9.3", "tsparticles-preset-links": "^2.8.0", "unfetch": "^5.0.0", "vis-data": "^7.1.4", diff --git a/yarn.lock b/yarn.lock index 1e4dc6a6a1..dd2c4dc357 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9785,7 +9785,7 @@ fsevents@^1.2.7: terser-webpack-plugin: ^5.3.6 tinykeys: ^1.4.0 ts-lit-plugin: ^1.2.1 - tsparticles-engine: ^2.8.0 + tsparticles-engine: ^2.9.3 tsparticles-preset-links: ^2.8.0 typescript: ^4.9.5 unfetch: ^5.0.0 @@ -15549,10 +15549,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tsparticles-engine@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-engine@npm:2.8.0" - checksum: 100635a3456b62fc74baea157945d731ba6a02ad0e4e352ebbaf14f2a81d6c553e5807c93611c830676d8a0bd1c5e9a16039fbb1139d1e0a9611db175af50257 +"tsparticles-engine@npm:^2.8.0, tsparticles-engine@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-engine@npm:2.9.3" + checksum: 767b6c1568f9428706e62bd15fe91f290fd1a86e9641f00d848006165e829d414e954b95833a4360f2b0a9a2699fa6d340bb007cce22412b48b7692d4a6489f5 languageName: node linkType: hard From 1a335a18a4fcd2707e916b3431f01cac6872f237 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Feb 2023 04:25:46 +0000 Subject: [PATCH 056/138] Bump @types/tar from 6.1.2 to 6.1.3 (#15444) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index dd2c4dc357..7b5516ea92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4417,12 +4417,12 @@ __metadata: linkType: hard "@types/tar@npm:^6": - version: 6.1.2 - resolution: "@types/tar@npm:6.1.2" + version: 6.1.3 + resolution: "@types/tar@npm:6.1.3" dependencies: "@types/node": "*" minipass: ^3.3.5 - checksum: 57e625e2db29e3b9c6d8d06774758cf6e4caa2096f4144f7c0fdb2760e1150146d2a86f0eb80b4d2e1ba0ecf07f06303775054c4f4d22bea5d51e8b54cdd0fd8 + checksum: 3a221f74adfcef8555b9c4cc951907dfd567630744ffe5211da1b44caf2a4c3b02297b73c9fb02d171e93a7a7c74fb15c1826e3f0438f0e5e8f4c790db59ddcf languageName: node linkType: hard From d8fe7d9a01b74f4815b0e36852fa3076eb88580d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Feb 2023 04:29:53 +0000 Subject: [PATCH 057/138] Bump @typescript-eslint/parser from 5.49.0 to 5.52.0 (#15445) --- package.json | 2 +- yarn.lock | 100 +++++++++++++++++++++++++-------------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 58bc853a87..737ef49d00 100644 --- a/package.json +++ b/package.json @@ -181,7 +181,7 @@ "@types/tar": "^6", "@types/webspeechapi": "^0.0.29", "@typescript-eslint/eslint-plugin": "^5.51.0", - "@typescript-eslint/parser": "^5.49.0", + "@typescript-eslint/parser": "^5.52.0", "@web/dev-server": "^0.0.24", "@web/dev-server-rollup": "^0.2.11", "babel-loader": "^9.1.2", diff --git a/yarn.lock b/yarn.lock index 7b5516ea92..60d7d0657a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4482,30 +4482,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.49.0": - version: 5.49.0 - resolution: "@typescript-eslint/parser@npm:5.49.0" +"@typescript-eslint/parser@npm:^5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/parser@npm:5.52.0" dependencies: - "@typescript-eslint/scope-manager": 5.49.0 - "@typescript-eslint/types": 5.49.0 - "@typescript-eslint/typescript-estree": 5.49.0 + "@typescript-eslint/scope-manager": 5.52.0 + "@typescript-eslint/types": 5.52.0 + "@typescript-eslint/typescript-estree": 5.52.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 87b3760cfc29b3edd3d28fe0d5e9e5a3833d60398d7779ecc657b9e3bfec624cd464176e26b24b0761fb79cc88daddae19560340f91119c4856b91f9663594dd - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.49.0": - version: 5.49.0 - resolution: "@typescript-eslint/scope-manager@npm:5.49.0" - dependencies: - "@typescript-eslint/types": 5.49.0 - "@typescript-eslint/visitor-keys": 5.49.0 - checksum: 466047e24ff8a4195f14aadde39375f22891bdaced09e58c89f2c32af0aa4a0d87e71a5f006f6ab76858e6f30c4b764b1e0ef7bc26713bb78add30638108c45f + checksum: 1d8ff6e932f9c9db8d24b16ce89fd963f0982c38559e500aa1f8dc5cd66abd02f1659dd1a1361ce550def05331803caa69a69a039b54c94fc0f22919a2305c12 languageName: node linkType: hard @@ -4519,6 +4509,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/scope-manager@npm:5.52.0" + dependencies: + "@typescript-eslint/types": 5.52.0 + "@typescript-eslint/visitor-keys": 5.52.0 + checksum: 9a03fe30f8e90a5106c482478f213eefdd09f2f74e24d9dc59b453885466a758fe6d1cd24d706aed6188fb03c84b16ca6491cf20da6b16b8fc53cad8b8c327f2 + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:5.51.0": version: 5.51.0 resolution: "@typescript-eslint/type-utils@npm:5.51.0" @@ -4536,13 +4536,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:5.49.0": - version: 5.49.0 - resolution: "@typescript-eslint/types@npm:5.49.0" - checksum: 41f72a043007fc3f3356b5a38d7bfa54871545b4a309810a062f044cff25122413a9660ce6d83d1221762f60d067351d020b0cb68f7e1279817f53e77ce8f33d - languageName: node - linkType: hard - "@typescript-eslint/types@npm:5.51.0": version: 5.51.0 resolution: "@typescript-eslint/types@npm:5.51.0" @@ -4550,21 +4543,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.49.0": - version: 5.49.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.49.0" - dependencies: - "@typescript-eslint/types": 5.49.0 - "@typescript-eslint/visitor-keys": 5.49.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: f331af9f0ef3ce3157c421b8cc727dec5aa0a60add305aa4c676a02c63ec07799105268af192c5ed193a682b7ed804564d29d49bdbd2019678e495d80e65e29a +"@typescript-eslint/types@npm:5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/types@npm:5.52.0" + checksum: 018940d61aebf7cf3f7de1b9957446e2ea01f08fe950bef4788c716a3a88f7c42765fe7d80152b0d0428fcd4bd3ace2dfa8c459ba1c59d9a84e951642180f869 languageName: node linkType: hard @@ -4586,6 +4568,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.52.0" + dependencies: + "@typescript-eslint/types": 5.52.0 + "@typescript-eslint/visitor-keys": 5.52.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 67d396907fee3d6894e26411a5098a37f07e5d50343189e6361ff7db91c74a7ffe2abd630d11f14c2bda1f4af13edf52b80b11cbccb55b44079c7cec14c9e108 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:5.51.0": version: 5.51.0 resolution: "@typescript-eslint/utils@npm:5.51.0" @@ -4604,16 +4604,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.49.0": - version: 5.49.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.49.0" - dependencies: - "@typescript-eslint/types": 5.49.0 - eslint-visitor-keys: ^3.3.0 - checksum: 46dc7bc713e8825d1fccba521fdf7c6e2f8829e491c2afd44dbe4105c6432e3c3dfe7e1ecb221401269d639264bb4af77b60a7b65521fcff9ab02cd31d8ef782 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:5.51.0": version: 5.51.0 resolution: "@typescript-eslint/visitor-keys@npm:5.51.0" @@ -4624,6 +4614,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.52.0" + dependencies: + "@typescript-eslint/types": 5.52.0 + eslint-visitor-keys: ^3.3.0 + checksum: 33b44f0cd35b7b47f34e89d52e47b8d8200f55af306b22db4de104d79f65907458ea022e548f50d966e32fea150432ac9c1ae65b3001b0ad2ac8a17c0211f370 + languageName: node + linkType: hard + "@ungap/promise-all-settled@npm:1.1.2": version: 1.1.2 resolution: "@ungap/promise-all-settled@npm:1.1.2" @@ -9690,7 +9690,7 @@ fsevents@^1.2.7: "@types/tar": ^6 "@types/webspeechapi": ^0.0.29 "@typescript-eslint/eslint-plugin": ^5.51.0 - "@typescript-eslint/parser": ^5.49.0 + "@typescript-eslint/parser": ^5.52.0 "@vaadin/combo-box": ^23.3.6 "@vaadin/vaadin-themable-mixin": ^23.3.6 "@vibrant/color": ^3.2.1-alpha.1 From 1e7fe595192f67e57ef9e00fdd7a2de6c80919e8 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Tue, 14 Feb 2023 04:01:01 -0800 Subject: [PATCH 058/138] Add slight hysteresis to chart height to prevent scrollbar juddering (#15321) --- src/components/chart/ha-chart-base.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/chart/ha-chart-base.ts b/src/components/chart/ha-chart-base.ts index 0f7c5b9d3c..0235fcdf88 100644 --- a/src/components/chart/ha-chart-base.ts +++ b/src/components/chart/ha-chart-base.ts @@ -233,7 +233,11 @@ export default class HaChartBase extends LitElement { { id: "afterRenderHook", afterRender: (chart) => { - this._chartHeight = chart.height; + const change = chart.height - (this._chartHeight ?? 0); + if (!this._chartHeight || change > 0 || change < -12) { + // hysteresis to prevent infinite render loops + this._chartHeight = chart.height; + } }, legend: { ...this.options?.plugins?.legend, From a13e2af17ab70161d0fa20e2a0c1fe8b82b51126 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Tue, 14 Feb 2023 14:02:45 +0200 Subject: [PATCH 059/138] Various RTL fixes (#15446) --- gallery/src/pages/components/ha-alert.markdown | 12 ------------ src/components/ha-alert.ts | 18 ++++-------------- src/components/ha-textarea.ts | 10 ++++++++++ .../config/automation/ha-automation-trace.ts | 9 +++++++-- 4 files changed, 21 insertions(+), 28 deletions(-) diff --git a/gallery/src/pages/components/ha-alert.markdown b/gallery/src/pages/components/ha-alert.markdown index e5f5e5c059..89f2aa39d8 100644 --- a/gallery/src/pages/components/ha-alert.markdown +++ b/gallery/src/pages/components/ha-alert.markdown @@ -156,18 +156,6 @@ The `title ` option should not be used without a description. *Documentation coming soon* -**Right to left** - - - This is an info alert — check it out! - - -```html - - This is an info alert — check it out! - -``` - ### API **Properties/Attributes** diff --git a/src/components/ha-alert.ts b/src/components/ha-alert.ts index d49c9959ac..772d2db0d6 100644 --- a/src/components/ha-alert.ts +++ b/src/components/ha-alert.ts @@ -37,13 +37,10 @@ class HaAlert extends LitElement { @property({ type: Boolean }) public dismissable = false; - @property({ type: Boolean }) public rtl = false; - public render() { return html` ` : ""} @@ -475,10 +454,6 @@ class HaConfigHardware extends SubscribeMixin(LitElement) { if (isHassioLoaded && !this._hardwareInfo?.hardware.length) { this._OSData = await fetchHassioHassOsInfo(this.hass); } - - if (isHassioLoaded) { - this._hostData = await fetchHassioHostInfo(this.hass); - } } catch (err: any) { this._error = err.message || err; } @@ -496,72 +471,8 @@ class HaConfigHardware extends SubscribeMixin(LitElement) { showhardwareAvailableDialog(this); } - private async _hostReboot(): Promise { - const confirmed = await showConfirmationDialog(this, { - title: this.hass.localize("ui.panel.config.hardware.reboot_host_title"), - text: this.hass.localize("ui.panel.config.hardware.reboot_host_text"), - confirmText: this.hass.localize("ui.panel.config.hardware.reboot"), - dismissText: this.hass.localize("ui.common.cancel"), - destructive: true, - }); - - if (!confirmed) { - return; - } - - showToast(this, { - message: this.hass.localize("ui.panel.config.hardware.rebooting_host"), - duration: 0, - }); - - try { - await rebootHost(this.hass); - } catch (err: any) { - // Ignore connection errors, these are all expected - if (this.hass.connection.connected && !ignoreSupervisorError(err)) { - showAlertDialog(this, { - title: this.hass.localize( - "ui.panel.config.hardware.failed_to_reboot_host" - ), - text: extractApiErrorMessage(err), - }); - } - } - } - - private async _hostShutdown(): Promise { - const confirmed = await showConfirmationDialog(this, { - title: this.hass.localize("ui.panel.config.hardware.shutdown_host_title"), - text: this.hass.localize("ui.panel.config.hardware.shutdown_host_text"), - confirmText: this.hass.localize("ui.panel.config.hardware.shutdown"), - dismissText: this.hass.localize("ui.common.cancel"), - destructive: true, - }); - - if (!confirmed) { - return; - } - - showToast(this, { - message: this.hass.localize( - "ui.panel.config.hardware.host_shutting_down" - ), - duration: 0, - }); - - try { - await shutdownHost(this.hass); - } catch (err: any) { - // Ignore connection errors, these are all expected - if (this.hass.connection.connected && !ignoreSupervisorError(err)) { - showAlertDialog(this, { - title: this.hass.localize( - "ui.panel.config.hardware.failed_to_shutdown_host" - ), - text: extractApiErrorMessage(err), - }); - } - } + private async _showRestartDialog() { + showRestartDialog(this); } static styles = [ @@ -587,10 +498,6 @@ class HaConfigHardware extends SubscribeMixin(LitElement) { flex-direction: column; padding: 16px; } - ha-button-menu { - color: var(--secondary-text-color); - --mdc-menu-min-width: 200px; - } .primary-text { font-size: 16px; @@ -620,6 +527,10 @@ class HaConfigHardware extends SubscribeMixin(LitElement) { height: 48px; padding: 8px 16px; } + .card-actions { + display: flex; + justify-content: space-between; + } `, ]; } diff --git a/src/translations/en.json b/src/translations/en.json index b5f4750a93..ec48e92cde 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1008,6 +1008,41 @@ "aliases_description": "Aliases are alternative names used in voice assistants to refer to this entity." } }, + "restart": { + "heading": "Restart Home Assistant", + "advanced_options": "Advanced options", + "reload": { + "title": "Quick reload", + "description": "Load new YAML configurations without a restart.", + "reloading": "Reloading configuration" + }, + "restart": { + "title": "Restart Home Assistant", + "description": "Interrupts all running automations and scripts.", + "confirm_title": "Restart?", + "confirm_description": "This will interrupt all running automations and scripts.", + "confirm_action": "Restart Home Assistant", + "failed": "Failed to restart Home Assistant" + }, + "reboot": { + "title": "Reboot system", + "description": "Restart the system running Home Assistant and all Add-ons.", + "confirm_title": "Reboot system?", + "confirm_description": "This will reboot the complete system which includes Home Assistant and all the Add-ons.", + "confirm_action": "Reboot", + "rebooting": "Rebooting system", + "failed": "Failed to reboot system" + }, + "shutdown": { + "title": "Shutdown system", + "description": "Shutdown the system running Home Assistant and all Add-ons.", + "confirm_title": "Shutdown system?", + "confirm_description": "This will shutdown the complete system whitch includes Home Assistant and all Add-ons.", + "confirm_action": "Shutdown", + "shutting_down": "Shutting down system", + "failed": "Failed to shutdown system" + } + }, "aliases": { "heading": "{name} aliases", "remove_alias": "Remove alias {number}", @@ -1742,24 +1777,16 @@ "id": "ID", "attributes": "Attributes" }, + "reboot_moved_title": "Reboot and shutdown moved", + "reboot_moved_description": "Reboot and shutdown actions has been moved to system page.", + "reboot_moved_link": "Go to system page.", "processor": "Processor", "memory": "Memory", - "rebooting_host": "Rebooting system", - "reboot": "Reboot", - "reboot_host": "Reboot system", - "reboot_host_title": "Reboot system?", - "reboot_host_text": "This will reboot the complete system which includes the Core and all Add-ons.", - "failed_to_reboot_host": "Failed to reboot system", - "host_shutting_down": "system shutting down", - "shutdown": "Shutdown", - "shutdown_host": "Shutdown system", - "shutdown_host_title": "Shutdown system?", - "shutdown_host_text": "This will shutdown the complete system which includes the Core and all Add-ons.", - "failed_to_shutdown_host": "Failed to shutdown system", "board": "Board", "documentation": "Documentation", "configure": "Configure", - "documentation_description": "Find extra information about your device" + "documentation_description": "Find extra information about your device", + "restart_homeassistant": "[%key:ui::panel::config::system_dashboard::restart_homeassistant%]" }, "info": { "caption": "About", @@ -3734,10 +3761,7 @@ "integration_start_time": "Integration Startup Time" }, "system_dashboard": { - "confirm_restart_text": "This will stop all your active dashboards, automations and scripts.", - "confirm_restart_title": "Restart Home Assistant?", - "restart_homeassistant_short": "Restart", - "restart_error": "Failed to restart Home Assistant" + "restart_homeassistant": "Restart Home Assistant" } }, "lovelace": { From 1e2c21d49e59a94baba9420a8fc21da6434fa38a Mon Sep 17 00:00:00 2001 From: lunmay <28674102+lunmay@users.noreply.github.com> Date: Wed, 15 Feb 2023 15:02:08 +0100 Subject: [PATCH 062/138] Fix typo from restart dialog (whitch -> which) (#15458) Typo fix: whitch - >which --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index ec48e92cde..3a9a065327 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1037,7 +1037,7 @@ "title": "Shutdown system", "description": "Shutdown the system running Home Assistant and all Add-ons.", "confirm_title": "Shutdown system?", - "confirm_description": "This will shutdown the complete system whitch includes Home Assistant and all Add-ons.", + "confirm_description": "This will shutdown the complete system which includes Home Assistant and all Add-ons.", "confirm_action": "Shutdown", "shutting_down": "Shutting down system", "failed": "Failed to shutdown system" From 7c65bb9791a9d780a4e2d3f4425937d661240194 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:00:22 +0100 Subject: [PATCH 063/138] Bump open from 8.4.0 to 8.4.1 (#15442) * Bump open from 8.4.0 to 8.4.1 Bumps [open](https://github.com/sindresorhus/open) from 8.4.0 to 8.4.1. - [Release notes](https://github.com/sindresorhus/open/releases) - [Commits](https://github.com/sindresorhus/open/compare/v8.4.0...v8.4.1) --- updated-dependencies: - dependency-name: open dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 737ef49d00..e634905132 100644 --- a/package.json +++ b/package.json @@ -219,7 +219,7 @@ "merge-stream": "^2.0.0", "mocha": "^8.4.0", "object-hash": "^3.0.0", - "open": "^8.4.0", + "open": "^8.4.1", "pinst": "^3.0.0", "prettier": "^2.8.4", "require-dir": "^1.2.0", diff --git a/yarn.lock b/yarn.lock index 60d7d0657a..7c46317e05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9759,7 +9759,7 @@ fsevents@^1.2.7: mocha: ^8.4.0 node-vibrant: 3.2.1-alpha.1 object-hash: ^3.0.0 - open: ^8.4.0 + open: ^8.4.1 pinst: ^3.0.0 prettier: ^2.8.4 proxy-polyfill: ^0.3.2 @@ -12726,14 +12726,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"open@npm:^8.0.9, open@npm:^8.4.0": - version: 8.4.0 - resolution: "open@npm:8.4.0" +"open@npm:^8.0.9, open@npm:^8.4.0, open@npm:^8.4.1": + version: 8.4.1 + resolution: "open@npm:8.4.1" dependencies: define-lazy-prop: ^2.0.0 is-docker: ^2.1.1 is-wsl: ^2.2.0 - checksum: e9545bec64cdbf30a0c35c1bdc310344adf8428a117f7d8df3c0af0a0a24c513b304916a6d9b11db0190ff7225c2d578885080b761ed46a3d5f6f1eebb98b63c + checksum: dbe8e1d98889df60b5179eab8b94b9591744d1f0033bce1a9a10738ba140bd9d625d6bcde7ff9f043e379aafb918975c2daa03b87cef13eb046ac18ed807f06d languageName: node linkType: hard From 9d918b727ce0e8714e33f8c166e3ef134ee15ac6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 10:02:39 -0500 Subject: [PATCH 064/138] Bump tsparticles-preset-links from 2.8.0 to 2.9.3 (#15454) Bumps [tsparticles-preset-links](https://github.com/matteobruni/tsparticles/tree/HEAD/presets/links) from 2.8.0 to 2.9.3. - [Release notes](https://github.com/matteobruni/tsparticles/releases) - [Changelog](https://github.com/matteobruni/tsparticles/blob/main/presets/links/CHANGELOG.md) - [Commits](https://github.com/matteobruni/tsparticles/commits/tsparticles-preset-links@2.9.3/presets/links) --- updated-dependencies: - dependency-name: tsparticles-preset-links dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 98 ++++++++++++++++++++++++++-------------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index e634905132..78912a54d3 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "superstruct": "^1.0.3", "tinykeys": "^1.4.0", "tsparticles-engine": "^2.9.3", - "tsparticles-preset-links": "^2.8.0", + "tsparticles-preset-links": "^2.9.3", "unfetch": "^5.0.0", "vis-data": "^7.1.4", "vis-network": "^8.5.4", diff --git a/yarn.lock b/yarn.lock index 7c46317e05..ed5a94bea5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9786,7 +9786,7 @@ fsevents@^1.2.7: tinykeys: ^1.4.0 ts-lit-plugin: ^1.2.1 tsparticles-engine: ^2.9.3 - tsparticles-preset-links: ^2.8.0 + tsparticles-preset-links: ^2.9.3 typescript: ^4.9.5 unfetch: ^5.0.0 vinyl-buffer: ^1.0.1 @@ -15549,89 +15549,89 @@ fsevents@^1.2.7: languageName: node linkType: hard -"tsparticles-engine@npm:^2.8.0, tsparticles-engine@npm:^2.9.3": +"tsparticles-engine@npm:^2.9.3": version: 2.9.3 resolution: "tsparticles-engine@npm:2.9.3" checksum: 767b6c1568f9428706e62bd15fe91f290fd1a86e9641f00d848006165e829d414e954b95833a4360f2b0a9a2699fa6d340bb007cce22412b48b7692d4a6489f5 languageName: node linkType: hard -"tsparticles-interaction-particles-links@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-interaction-particles-links@npm:2.8.0" +"tsparticles-interaction-particles-links@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-interaction-particles-links@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: ac7ec514ec0c3714b52da9c718c7573ad448d6edcc96ca4b79fa12ab5f1ea4e5d61c197a8460ded66d5c4a44dddd06b9e54bb28658f7aa734a70a1d7013ea9e4 + tsparticles-engine: ^2.9.3 + checksum: be551275a6fd4bb543b4a5eb5105df8f53aed799527e9e032ab282f383367a90b002e8d134432bd8828ef0c06ddd4c826a1bcc158335bf81e83c39b042358322 languageName: node linkType: hard -"tsparticles-move-base@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-move-base@npm:2.8.0" +"tsparticles-move-base@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-move-base@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: f48155ad80a1a5b971bb30932bdda2b5c8476062516b17641036ed6ad3cacb80abbe6ba338673ff5e9b8f7782851112d426077952e393a9b737133abc09c89a9 + tsparticles-engine: ^2.9.3 + checksum: 06b579ce3873daa8f706261c28c0fb5b9b60bf9682da6eb0ca4488e60b06e08d122b9e20613a65db2e7b4c535728dc54a24fcc8942fa79935fd5d4315de44e11 languageName: node linkType: hard -"tsparticles-preset-links@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-preset-links@npm:2.8.0" +"tsparticles-preset-links@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-preset-links@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - tsparticles-interaction-particles-links: ^2.8.0 - tsparticles-move-base: ^2.8.0 - tsparticles-shape-circle: ^2.8.0 - tsparticles-updater-color: ^2.8.0 - tsparticles-updater-opacity: ^2.8.0 - tsparticles-updater-out-modes: ^2.8.0 - tsparticles-updater-size: ^2.8.0 - checksum: 2aa96837ce4ae5def66ee5799b27987bfe52362b35b1e40f8f2ef9f6a8cbd85dc5bb805fc0f8d8aa0896b73da5c25e3219ac803ff2d6e1b4225608ac20f5ea10 + tsparticles-engine: ^2.9.3 + tsparticles-interaction-particles-links: ^2.9.3 + tsparticles-move-base: ^2.9.3 + tsparticles-shape-circle: ^2.9.3 + tsparticles-updater-color: ^2.9.3 + tsparticles-updater-opacity: ^2.9.3 + tsparticles-updater-out-modes: ^2.9.3 + tsparticles-updater-size: ^2.9.3 + checksum: fc867d5a7efc0d596a1cfe06159f8e872ff806eafd37a3b07d94537d0432c4839dab3b9c10797341a8526ca395c0e5cd4e91b551c3f4b55da298d2d6b5a938ce languageName: node linkType: hard -"tsparticles-shape-circle@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-shape-circle@npm:2.8.0" +"tsparticles-shape-circle@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-shape-circle@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: 391a1f018a6a4a01217acfc58f6f2b73b4ded7a7be26b45c05afb4c74d994fc186f5c2ede17a3f3dd70381f4c426c825f1c638d828861fd959c30e39cc191fc0 + tsparticles-engine: ^2.9.3 + checksum: f770e6edd10e1935402ef19b1f5c051758c3a1f1722b64dae4f215f178bb83211abe8abde26bc87c220db1969457bc7729a77f5e3fcd00e44e7103bc10a13336 languageName: node linkType: hard -"tsparticles-updater-color@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-updater-color@npm:2.8.0" +"tsparticles-updater-color@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-updater-color@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: abc99d7aab6508b8023f0d375696d6d39dee096e2bc22d2f6d7b4495433430d7c8f3e5f2503cc25b53be0e698ef4811a87622b192a8a85fb141805fd8d433a54 + tsparticles-engine: ^2.9.3 + checksum: e602b4754c6bb11ec2475939131e4fff815b07dc0431f4df34b9fdd82567fd299f5648f61e323258126856a3b71f87e77e5cf97e3100fb3929204e53a726c01f languageName: node linkType: hard -"tsparticles-updater-opacity@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-updater-opacity@npm:2.8.0" +"tsparticles-updater-opacity@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-updater-opacity@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: 5897ad7144f59cecd1d6a69466d01a5d58e5f6ecd912b60f7371aff4321166bdbc5b13e0971b5a08cc2bd4e832008093418d493c2a5307b8087fae1867d2a15f + tsparticles-engine: ^2.9.3 + checksum: 4bc735e014219615256469fc05330140e7d5d43e85a91c8400045c812108f73b3549f7d50b92b985cf12264e81bb5cf0e2093e4ba16adcb0c420bb9e71dc801e languageName: node linkType: hard -"tsparticles-updater-out-modes@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-updater-out-modes@npm:2.8.0" +"tsparticles-updater-out-modes@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-updater-out-modes@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: 38564328405f50b8bdfc394f982b135031d6e9b967d9b76eb79984847b49a1507e8258d6a2de873ded3d89c3ef9b09dba767cd08a703c4459df2af1e44de8e77 + tsparticles-engine: ^2.9.3 + checksum: 2c695211254b39831987a465b35711899f7e13fc7512aac83b4019a948c22eab15c71ad61627cca34ea6b18b7370f88d5b5d07f743dab8d3ec3eb0b99b4ff684 languageName: node linkType: hard -"tsparticles-updater-size@npm:^2.8.0": - version: 2.8.0 - resolution: "tsparticles-updater-size@npm:2.8.0" +"tsparticles-updater-size@npm:^2.9.3": + version: 2.9.3 + resolution: "tsparticles-updater-size@npm:2.9.3" dependencies: - tsparticles-engine: ^2.8.0 - checksum: 99465600be5353dfb4aa49313f1caa092828068996b333ce2059d8dc8dc75b242d69ab9390886a968b670a4cdf109835078afb365f1b5579e4010d9959b05880 + tsparticles-engine: ^2.9.3 + checksum: 13e0231a7469cd83ff74a20766980c8bce4480fc0e91841103431acf7df051e58ead2391f58947d03307bc20c6d3a0065c9a675f7c2f603b82fceffccc4e7c77 languageName: node linkType: hard From a9180e062cb61cc6881846072d141d30c815870f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 15:23:43 +0000 Subject: [PATCH 065/138] Bump mocha and @types/mocha (#15453) Bumps [mocha](https://github.com/mochajs/mocha) and [@types/mocha](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mocha). These dependencies needed to be updated together. Updates `mocha` from 8.4.0 to 10.2.0 - [Release notes](https://github.com/mochajs/mocha/releases) - [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md) - [Commits](https://github.com/mochajs/mocha/compare/v8.4.0...v10.2.0) Updates `@types/mocha` from 8.2.3 to 10.0.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/mocha) --- updated-dependencies: - dependency-name: mocha dependency-type: direct:development update-type: version-update:semver-major - dependency-name: "@types/mocha" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 239 ++++++++++++++++++--------------------------------- 2 files changed, 84 insertions(+), 159 deletions(-) diff --git a/package.json b/package.json index 78912a54d3..1c75b200ca 100644 --- a/package.json +++ b/package.json @@ -175,7 +175,7 @@ "@types/leaflet": "^1", "@types/leaflet-draw": "^1", "@types/marked": "^4", - "@types/mocha": "^8", + "@types/mocha": "^10", "@types/qrcode": "^1.5.0", "@types/sortablejs": "^1", "@types/tar": "^6", @@ -217,7 +217,7 @@ "magic-string": "^0.25.7", "map-stream": "^0.0.7", "merge-stream": "^2.0.0", - "mocha": "^8.4.0", + "mocha": "^10.2.0", "object-hash": "^3.0.0", "open": "^8.4.1", "pinst": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index ed5a94bea5..da3889c5ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4275,10 +4275,10 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:^8": - version: 8.2.3 - resolution: "@types/mocha@npm:8.2.3" - checksum: b43ed1b642a2ee62bf10792a07d5d21d66ab8b4d2cf5d822c8a7643e77b90009aecc000eefab5f6ddc9eb69004192f84119a6f97a8499e1a13ea082e7a5e71bf +"@types/mocha@npm:^10": + version: 10.0.1 + resolution: "@types/mocha@npm:10.0.1" + checksum: 224ea9fce7b1734ccdb9aa99a622d902a538ce1847bca7fd22c5fb38adcf3ed536f50f48f587085db988a4bb3c2eb68f4b98e1cd6a38bc5547bd3bbbedc54495 languageName: node linkType: hard @@ -4624,13 +4624,6 @@ __metadata: languageName: node linkType: hard -"@ungap/promise-all-settled@npm:1.1.2": - version: 1.1.2 - resolution: "@ungap/promise-all-settled@npm:1.1.2" - checksum: 08d37fdfa23a6fe8139f1305313562ebad973f3fac01bcce2773b2bda5bcb0146dfdcf3cb6a722cf0a5f2ca0bc56a827eac8f1e7b3beddc548f654addf1fc34c - languageName: node - linkType: hard - "@vaadin/combo-box@npm:^23.3.6": version: 23.3.6 resolution: "@vaadin/combo-box@npm:23.3.6" @@ -5565,7 +5558,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:~3.1.1, anymatch@npm:~3.1.2": +"anymatch@npm:~3.1.2": version: 3.1.2 resolution: "anymatch@npm:3.1.2" dependencies: @@ -6463,22 +6456,22 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.1": - version: 3.5.1 - resolution: "chokidar@npm:3.5.1" +"chokidar@npm:3.5.3, chokidar@npm:^3.4.3, chokidar@npm:^3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" dependencies: - anymatch: ~3.1.1 + anymatch: ~3.1.2 braces: ~3.0.2 - fsevents: ~2.3.1 - glob-parent: ~5.1.0 + fsevents: ~2.3.2 + glob-parent: ~5.1.2 is-binary-path: ~2.1.0 is-glob: ~4.0.1 normalize-path: ~3.0.0 - readdirp: ~3.5.0 + readdirp: ~3.6.0 dependenciesMeta: fsevents: optional: true - checksum: b7774e6e3aeca084d39e8542041555a11452414c744122436101243f89580fad97154ae11525e46bfa816313ae32533e2a88e8587e4d50b14ea716a9e6538978 + checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c languageName: node linkType: hard @@ -6505,25 +6498,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.3, chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - "chownr@npm:^1.1.1": version: 1.1.1 resolution: "chownr@npm:1.1.1" @@ -7146,7 +7120,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -7158,18 +7132,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.3.1": - version: 4.3.1 - resolution: "debug@npm:4.3.1" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 2c3352e37d5c46b0d203317cd45ea0e26b2c99f2d9dfec8b128e6ceba90dfb65425f5331bf3020fe9929d7da8c16758e737f4f3bfc0fce6b8b3d503bae03298b - languageName: node - linkType: hard - "debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -9111,7 +9073,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.0, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -9167,21 +9129,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 351d549dd90553b87c2d3f90ce11aed9e1093c74130440e7ae0592e11bbcd2ce7f0ebb8ba6bfe63aaf9b62166a7f4c80cb84490ae5d78408bb2572bf7d4ee0a6 - languageName: node - linkType: hard - -"glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:7.2.0, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": version: 7.2.0 resolution: "glob@npm:7.2.0" dependencies: @@ -9333,13 +9281,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"growl@npm:1.10.5": - version: 1.10.5 - resolution: "growl@npm:1.10.5" - checksum: 4b86685de6831cebcbb19f93870bea624afee61124b0a20c49017013987cd129e73a8c4baeca295728f41d21265e1f859d25ef36731b142ca59c655fea94bb1a - languageName: node - linkType: hard - "gulp-cli@npm:^2.2.0": version: 2.3.0 resolution: "gulp-cli@npm:2.3.0" @@ -9684,7 +9625,7 @@ fsevents@^1.2.7: "@types/leaflet": ^1 "@types/leaflet-draw": ^1 "@types/marked": ^4 - "@types/mocha": ^8 + "@types/mocha": ^10 "@types/qrcode": ^1.5.0 "@types/sortablejs": ^1 "@types/tar": ^6 @@ -9756,7 +9697,7 @@ fsevents@^1.2.7: marked: ^4.2.12 memoize-one: ^6.0.0 merge-stream: ^2.0.0 - mocha: ^8.4.0 + mocha: ^10.2.0 node-vibrant: 3.2.1-alpha.1 object-hash: ^3.0.0 open: ^8.4.1 @@ -10767,6 +10708,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-unicode-supported@npm:^0.1.0": + version: 0.1.0 + resolution: "is-unicode-supported@npm:0.1.0" + checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 + languageName: node + linkType: hard + "is-utf8@npm:^0.2.0, is-utf8@npm:^0.2.1": version: 0.2.1 resolution: "is-utf8@npm:0.2.1" @@ -10950,14 +10898,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"js-yaml@npm:4.0.0": - version: 4.0.0 - resolution: "js-yaml@npm:4.0.0" +"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" dependencies: argparse: ^2.0.1 bin: js-yaml: bin/js-yaml.js - checksum: 931d6dddb3589fa272c8273366c6dffa99fd6bd26ac7b70f9bac925c28cb7ae352b964192df84f90ecd7a2ff50ab87e6d58e2148eb19c89aa155c73ed847ab92 + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a languageName: node linkType: hard @@ -10973,17 +10921,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -11617,12 +11554,13 @@ fsevents@^1.2.7: languageName: node linkType: hard -"log-symbols@npm:4.0.0": - version: 4.0.0 - resolution: "log-symbols@npm:4.0.0" +"log-symbols@npm:4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" dependencies: - chalk: ^4.0.0 - checksum: a7c1fb5cc504ff04422460dcae3a830002426432fbed81280c8a49f4c6f5ef244c28b987636bf1c871ba6866d7024713388be391e92c0d5af6a70598fcabc46b + chalk: ^4.1.0 + is-unicode-supported: ^0.1.0 + checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 languageName: node linkType: hard @@ -11945,6 +11883,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"minimatch@npm:5.0.1": + version: 5.0.1 + resolution: "minimatch@npm:5.0.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -12096,39 +12043,35 @@ fsevents@^1.2.7: languageName: node linkType: hard -"mocha@npm:^8.4.0": - version: 8.4.0 - resolution: "mocha@npm:8.4.0" +"mocha@npm:^10.2.0": + version: 10.2.0 + resolution: "mocha@npm:10.2.0" dependencies: - "@ungap/promise-all-settled": 1.1.2 ansi-colors: 4.1.1 browser-stdout: 1.3.1 - chokidar: 3.5.1 - debug: 4.3.1 + chokidar: 3.5.3 + debug: 4.3.4 diff: 5.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.1.6 - growl: 1.10.5 + glob: 7.2.0 he: 1.2.0 - js-yaml: 4.0.0 - log-symbols: 4.0.0 - minimatch: 3.0.4 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 ms: 2.1.3 - nanoid: 3.1.20 - serialize-javascript: 5.0.1 + nanoid: 3.3.3 + serialize-javascript: 6.0.0 strip-json-comments: 3.1.1 supports-color: 8.1.1 - which: 2.0.2 - wide-align: 1.1.3 - workerpool: 6.1.0 + workerpool: 6.2.1 yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 bin: _mocha: bin/_mocha - mocha: bin/mocha - checksum: 4bcf00670580f009f9e20cc596cce5e2434d3562c468da783a8f935e38c4476435f12ecade43341cb8730b9d4987358038e76a075201d4bc51010927d3f8cd7c + mocha: bin/mocha.js + checksum: 406c45eab122ffd6ea2003c2f108b2bc35ba036225eee78e0c784b6fa2c7f34e2b13f1dbacef55a4fdf523255d76e4f22d1b5aacda2394bd11666febec17c719 languageName: node linkType: hard @@ -12192,12 +12135,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"nanoid@npm:3.1.20": - version: 3.1.20 - resolution: "nanoid@npm:3.1.20" +"nanoid@npm:3.3.3": + version: 3.3.3 + resolution: "nanoid@npm:3.3.3" bin: nanoid: bin/nanoid.cjs - checksum: f6246023d5d8313c2c16be05c18cdb189a6de50ab6418b513b34086eda4aabd12866b2cbe435548c760dc43cf11830b26b14b113afde47305398e3345795e433 + checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 languageName: node linkType: hard @@ -13590,15 +13533,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"readdirp@npm:~3.5.0": - version: 3.5.0 - resolution: "readdirp@npm:3.5.0" - dependencies: - picomatch: ^2.2.1 - checksum: 6b1a9341e295e15d4fb40c010216cbcb6266587cd0b3ce7defabd66fa1b4e35f9fba3d64c2187fd38fadd01ccbfc5f1b33fdfb1da63b3cbf66224b7c6d75ce5a - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -14284,12 +14218,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"serialize-javascript@npm:5.0.1": - version: 5.0.1 - resolution: "serialize-javascript@npm:5.0.1" +"serialize-javascript@npm:6.0.0, serialize-javascript@npm:^6.0.0": + version: 6.0.0 + resolution: "serialize-javascript@npm:6.0.0" dependencies: randombytes: ^2.1.0 - checksum: bb45a427690c3d2711e28499de0fbf25036af1e23c63c6a9237ed0aa572fd0941fcdefe50a2dccf26d9df8c8b86ae38659e19d8ba7afd3fbc1f1c7539a2a48d2 + checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 languageName: node linkType: hard @@ -14309,15 +14243,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" - dependencies: - randombytes: ^2.1.0 - checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 - languageName: node - linkType: hard - "serve-handler@npm:6.1.3": version: 6.1.3 resolution: "serve-handler@npm:6.1.3" @@ -16608,17 +16533,6 @@ typescript@^3.8.3: languageName: node linkType: hard -"which@npm:2.0.2, which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - "which@npm:^1.2.14, which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -16630,6 +16544,17 @@ typescript@^3.8.3: languageName: node linkType: hard +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + "wicg-inert@npm:^3.0.0": version: 3.0.0 resolution: "wicg-inert@npm:3.0.0" @@ -16637,7 +16562,7 @@ typescript@^3.8.3: languageName: node linkType: hard -"wide-align@npm:1.1.3, wide-align@npm:^1.1.0": +"wide-align@npm:^1.1.0": version: 1.1.3 resolution: "wide-align@npm:1.1.3" dependencies: @@ -16869,10 +16794,10 @@ typescript@^3.8.3: languageName: node linkType: hard -"workerpool@npm:6.1.0": - version: 6.1.0 - resolution: "workerpool@npm:6.1.0" - checksum: 519d03a4d008fd95ff9e1a583afe537e6a0eecd8250452044e390db3e1dc4ce91616a8ee6c4bba9a2fda38440c2666664c31b50b5a9fd05cc43c739df54d5781 +"workerpool@npm:6.2.1": + version: 6.2.1 + resolution: "workerpool@npm:6.2.1" + checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d languageName: node linkType: hard From ff47d7d408e320f328e89edc925f6ecb908eb666 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 10:37:02 -0500 Subject: [PATCH 066/138] Bump vis-network from 8.5.4 to 9.1.2 (#15251) Bumps [vis-network](https://github.com/visjs/vis-network) from 8.5.4 to 9.1.2. - [Release notes](https://github.com/visjs/vis-network/releases) - [Changelog](https://github.com/visjs/vis-network/blob/master/HISTORY.md) - [Commits](https://github.com/visjs/vis-network/compare/v8.5.4...v9.1.2) --- updated-dependencies: - dependency-name: vis-network dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 1c75b200ca..cbf279c0ee 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "tsparticles-preset-links": "^2.9.3", "unfetch": "^5.0.0", "vis-data": "^7.1.4", - "vis-network": "^8.5.4", + "vis-network": "^9.1.2", "vue": "^2.6.12", "vue2-daterange-picker": "^0.5.1", "weekstart": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index da3889c5ae..90fab4895c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9733,7 +9733,7 @@ fsevents@^1.2.7: vinyl-buffer: ^1.0.1 vinyl-source-stream: ^2.0.0 vis-data: ^7.1.4 - vis-network: ^8.5.4 + vis-network: ^9.1.2 vue: ^2.6.12 vue2-daterange-picker: ^0.5.1 webpack: ^5.55.1 @@ -16097,9 +16097,9 @@ typescript@^3.8.3: languageName: node linkType: hard -"vis-network@npm:^8.5.4": - version: 8.5.4 - resolution: "vis-network@npm:8.5.4" +"vis-network@npm:^9.1.2": + version: 9.1.2 + resolution: "vis-network@npm:9.1.2" peerDependencies: "@egjs/hammerjs": ^2.0.0 component-emitter: ^1.3.0 @@ -16107,8 +16107,8 @@ typescript@^3.8.3: timsort: ^0.3.0 uuid: ^3.4.0 || ^7.0.0 || ^8.0.0 vis-data: ^7.0.0 - vis-util: ^3.0.0 || ^4.0.0 - checksum: c1184399044094cbae71250adfaf6ec982db1cf4d1e643fd19ad9c8e55182168f4752d77d741bdb1e616eba138803a146afe36f8c626ead37788945fafd44e45 + vis-util: ^5.0.1 + checksum: 763bee104c9d69f6b229d10675f712f824568f28dd13540d35d0f1f1fc58fcb9dc27cc12da80f6e874076a7cb75793d168b49c3c7783f8cb06f57931d9edfe0e languageName: node linkType: hard From 6e55077cd30fef5ab747d02b39a248c2042842db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 13:07:14 -0500 Subject: [PATCH 067/138] Bump vue2-daterange-picker from 0.5.1 to 0.6.8 (#15403) Bumps [vue2-daterange-picker](https://github.com/Innologica/vue2-daterange-picker) from 0.5.1 to 0.6.8. - [Release notes](https://github.com/Innologica/vue2-daterange-picker/releases) - [Commits](https://github.com/Innologica/vue2-daterange-picker/commits) --- updated-dependencies: - dependency-name: vue2-daterange-picker dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[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 cbf279c0ee..92a6a002bc 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "vis-data": "^7.1.4", "vis-network": "^9.1.2", "vue": "^2.6.12", - "vue2-daterange-picker": "^0.5.1", + "vue2-daterange-picker": "^0.6.8", "weekstart": "^1.1.0", "workbox-cacheable-response": "^6.5.4", "workbox-core": "^6.5.4", diff --git a/yarn.lock b/yarn.lock index 90fab4895c..136f2157dc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9735,7 +9735,7 @@ fsevents@^1.2.7: vis-data: ^7.1.4 vis-network: ^9.1.2 vue: ^2.6.12 - vue2-daterange-picker: ^0.5.1 + vue2-daterange-picker: ^0.6.8 webpack: ^5.55.1 webpack-cli: ^5.0.1 webpack-dev-server: ^4.11.1 @@ -16164,12 +16164,12 @@ typescript@^3.8.3: languageName: node linkType: hard -"vue2-daterange-picker@npm:^0.5.1": - version: 0.5.1 - resolution: "vue2-daterange-picker@npm:0.5.1" +"vue2-daterange-picker@npm:^0.6.8": + version: 0.6.8 + resolution: "vue2-daterange-picker@npm:0.6.8" dependencies: vue: ^2.6.10 - checksum: 93951b84a8a40e4092ca805206b47ae6490951d1816674b650990dece018f8e48085661c2a4ef13ca9c8e23aecbca507f7c2b305d37c08a73ef898841e9cec4f + checksum: ac928b60b3e08e8b27d019adcde9380dc809557611b774a77d20d838403484526250b275326baa92cfb362b96c9988ddf2957d27f6f76b650b2da37f54f9b77c languageName: node linkType: hard From 94dd3c95ff54affdbd05d149cdf64dced6dfdd4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:41:34 +0000 Subject: [PATCH 068/138] Bump core-js from 3.27.2 to 3.28.0 (#15441) * Bump core-js from 3.27.2 to 3.28.0 Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.27.2 to 3.28.0. - [Release notes](https://github.com/zloirock/core-js/releases) - [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md) - [Commits](https://github.com/zloirock/core-js/commits/v3.28.0/packages/core-js) --- updated-dependencies: - dependency-name: core-js dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update core-js version in babel preset --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- build-scripts/bundle.js | 2 +- package.json | 2 +- yarn.lock | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js index 655bbb278b..715dbd9f93 100644 --- a/build-scripts/bundle.js +++ b/build-scripts/bundle.js @@ -67,7 +67,7 @@ module.exports.babelOptions = ({ latestBuild }) => ({ "@babel/preset-env", { useBuiltIns: "entry", - corejs: { version: "3.27", proposals: true }, + corejs: { version: "3.28", proposals: true }, bugfixes: true, }, ], diff --git a/package.json b/package.json index 92a6a002bc..896cb8a933 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "app-datepicker": "^5.1.0", "chart.js": "^3.3.2", "comlink": "^4.4.1", - "core-js": "^3.27.2", + "core-js": "^3.28.0", "cropperjs": "^1.5.13", "date-fns": "^2.29.3", "date-fns-tz": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 136f2157dc..ae0cdd3f4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7015,10 +7015,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.27.2": - version: 3.27.2 - resolution: "core-js@npm:3.27.2" - checksum: 718debd426f55a6b97cf9b757c936be258afd6d4f7052f89d0f96c982d7013e9000b0b006df42831a0cf32adad298e34d6a19052dce9ae1c7ab87162c0c665e0 +"core-js@npm:^3.28.0": + version: 3.28.0 + resolution: "core-js@npm:3.28.0" + checksum: 3155fd0ec16d0089106b145e9595280a4ea4bde0d7ff26aa14364cd4f1c203baf6620c3025acd284f363d08b9f21104101692766ca9a36ffeee7307bdf3e1881 languageName: node linkType: hard @@ -9647,7 +9647,7 @@ fsevents@^1.2.7: chai: ^4.3.7 chart.js: ^3.3.2 comlink: ^4.4.1 - core-js: ^3.27.2 + core-js: ^3.28.0 cropperjs: ^1.5.13 date-fns: ^2.29.3 date-fns-tz: ^2.0.0 From cb85bc054a147b175020e57c48f88c0f52985666 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:43:45 +0000 Subject: [PATCH 069/138] Bump vue from 2.6.12 to 2.7.14 (#15443) * Bump vue from 2.6.12 to 2.7.14 Bumps [vue](https://github.com/vuejs/core) from 2.6.12 to 2.7.14. - [Release notes](https://github.com/vuejs/core/releases) - [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md) - [Commits](https://github.com/vuejs/core/commits) --- updated-dependencies: - dependency-name: vue dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 60 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 896cb8a933..0cf2c2fc4c 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "unfetch": "^5.0.0", "vis-data": "^7.1.4", "vis-network": "^9.1.2", - "vue": "^2.6.12", + "vue": "^2.7.14", "vue2-daterange-picker": "^0.6.8", "weekstart": "^1.1.0", "workbox-cacheable-response": "^6.5.4", diff --git a/yarn.lock b/yarn.lock index ae0cdd3f4f..b33ab8ac81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -362,7 +362,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.20.13, @babel/parser@npm:^7.20.7": +"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.13, @babel/parser@npm:^7.20.7": version: 7.20.15 resolution: "@babel/parser@npm:7.20.15" bin: @@ -4890,6 +4890,17 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-sfc@npm:2.7.14": + version: 2.7.14 + resolution: "@vue/compiler-sfc@npm:2.7.14" + dependencies: + "@babel/parser": ^7.18.4 + postcss: ^8.4.14 + source-map: ^0.6.1 + checksum: 25e00abaecb311f1effbf539bc3e4fdeedb39d35f9c2947b2640187a047e6a7400e693fd7da1d3a98977b9078c5bf629ca47f8b9a59dc14a080c0a1e1dd06a49 + languageName: node + linkType: hard + "@vue/web-component-wrapper@npm:^1.3.0": version: 1.3.0 resolution: "@vue/web-component-wrapper@npm:1.3.0" @@ -7079,6 +7090,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^3.1.0": + version: 3.1.1 + resolution: "csstype@npm:3.1.1" + checksum: 1f7b4f5fdd955b7444b18ebdddf3f5c699159f13e9cf8ac9027ae4a60ae226aef9bbb14a6e12ca7dba3358b007cee6354b116e720262867c398de6c955ea451d + languageName: node + linkType: hard + "d@npm:1": version: 1.0.0 resolution: "d@npm:1.0.0" @@ -9734,7 +9752,7 @@ fsevents@^1.2.7: vinyl-source-stream: ^2.0.0 vis-data: ^7.1.4 vis-network: ^9.1.2 - vue: ^2.6.12 + vue: ^2.7.14 vue2-daterange-picker: ^0.6.8 webpack: ^5.55.1 webpack-cli: ^5.0.1 @@ -12144,6 +12162,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"nanoid@npm:^3.3.4": + version: 3.3.4 + resolution: "nanoid@npm:3.3.4" + bin: + nanoid: bin/nanoid.cjs + checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c + languageName: node + linkType: hard + "nanomatch@npm:^1.2.9": version: 1.2.13 resolution: "nanomatch@npm:1.2.13" @@ -13223,6 +13250,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"postcss@npm:^8.4.14": + version: 8.4.21 + resolution: "postcss@npm:8.4.21" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679 + languageName: node + linkType: hard + "preact@npm:^10.0.5": version: 10.4.1 resolution: "preact@npm:10.4.1" @@ -14560,6 +14598,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + "source-map-resolve@npm:^0.5.0": version: 0.5.3 resolution: "source-map-resolve@npm:0.5.3" @@ -16173,10 +16218,13 @@ typescript@^3.8.3: languageName: node linkType: hard -"vue@npm:^2.6.10, vue@npm:^2.6.12": - version: 2.6.12 - resolution: "vue@npm:2.6.12" - checksum: a8959e30990c5464131e451d3f9c2a6e6964c2d1137a30fbcd2bc66174a6c2d6f63e4dcec9c17fa0f236580953ff1ad44c25437c5e02ee1cf74b588bbac1a0bf +"vue@npm:^2.6.10, vue@npm:^2.7.14": + version: 2.7.14 + resolution: "vue@npm:2.7.14" + dependencies: + "@vue/compiler-sfc": 2.7.14 + csstype: ^3.1.0 + checksum: 8b06da67cc40870c66a30b7a6bc2874950cd4383792c371eb30497dd14fc7b41cf308b1c4517368d8f0e7ac16198c08de19236f6a79fe43f4bdbc4a1d9d4ad07 languageName: node linkType: hard From 3b1bc37f5394f29f515e4e647c182187d32f9e34 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Wed, 15 Feb 2023 13:18:52 -0800 Subject: [PATCH 070/138] More alarm arming options in more-info dialog (#15452) * More alarm arming options in more-info dialog * minor change to null handling * Update src/dialogs/more-info/controls/more-info-alarm_control_panel.ts Co-authored-by: Paul Bottein * Update src/dialogs/more-info/controls/more-info-alarm_control_panel.ts Co-authored-by: Paul Bottein --------- Co-authored-by: Paul Bottein --- src/data/alarm_control_panel.ts | 9 ++++ .../controls/more-info-alarm_control_panel.ts | 52 +++++++++++++++++-- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/data/alarm_control_panel.ts b/src/data/alarm_control_panel.ts index 31bb8de9c7..20ecbaa8ce 100644 --- a/src/data/alarm_control_panel.ts +++ b/src/data/alarm_control_panel.ts @@ -3,6 +3,15 @@ import { HomeAssistant } from "../types"; export const FORMAT_TEXT = "text"; export const FORMAT_NUMBER = "number"; +export const enum AlarmControlPanelEntityFeature { + ARM_HOME = 1, + ARM_AWAY = 2, + ARM_NIGHT = 4, + TRIGGER = 8, + ARM_CUSTOM_BYPASS = 16, + ARM_VACATION = 32, +} + export const callAlarmAction = ( hass: HomeAssistant, entity: string, diff --git a/src/dialogs/more-info/controls/more-info-alarm_control_panel.ts b/src/dialogs/more-info/controls/more-info-alarm_control_panel.ts index 0fb7401959..2f4441ee15 100644 --- a/src/dialogs/more-info/controls/more-info-alarm_control_panel.ts +++ b/src/dialogs/more-info/controls/more-info-alarm_control_panel.ts @@ -1,18 +1,19 @@ import "@material/mwc-button"; import type { HassEntity } from "home-assistant-js-websocket"; -import { css, html, LitElement, TemplateResult } from "lit"; -import { customElement, property, query } from "lit/decorators"; +import { css, html, LitElement, PropertyValues, TemplateResult } from "lit"; +import { customElement, property, state, query } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import "../../../components/ha-textfield"; +import { supportsFeature } from "../../../common/entity/supports-feature"; import type { HaTextField } from "../../../components/ha-textfield"; import { callAlarmAction, FORMAT_NUMBER, + AlarmControlPanelEntityFeature, } from "../../../data/alarm_control_panel"; import type { HomeAssistant } from "../../../types"; const BUTTONS = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "", "0", "clear"]; -const ARM_ACTIONS = ["arm_home", "arm_away"]; const DISARM_ACTIONS = ["disarm"]; @customElement("more-info-alarm_control_panel") @@ -21,8 +22,51 @@ export class MoreInfoAlarmControlPanel extends LitElement { @property({ attribute: false }) public stateObj?: HassEntity; + @state() private _armActions: string[] = []; + @query("#alarmCode") private _input?: HaTextField; + public willUpdate(changedProps: PropertyValues) { + super.willUpdate(changedProps); + + if (!this.stateObj || !changedProps.has("stateObj")) { + return; + } + + this._armActions = []; + if ( + supportsFeature(this.stateObj, AlarmControlPanelEntityFeature.ARM_HOME) + ) { + this._armActions.push("arm_home"); + } + if ( + supportsFeature(this.stateObj, AlarmControlPanelEntityFeature.ARM_AWAY) + ) { + this._armActions.push("arm_away"); + } + if ( + supportsFeature(this.stateObj, AlarmControlPanelEntityFeature.ARM_NIGHT) + ) { + this._armActions.push("arm_night"); + } + if ( + supportsFeature( + this.stateObj, + AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS + ) + ) { + this._armActions.push("arm_custom_bypass"); + } + if ( + supportsFeature( + this.stateObj, + AlarmControlPanelEntityFeature.ARM_VACATION + ) + ) { + this._armActions.push("arm_vacation"); + } + } + protected render(): TemplateResult { if (!this.hass || !this.stateObj) { return html``; @@ -72,7 +116,7 @@ export class MoreInfoAlarmControlPanel extends LitElement { `}
    ${(this.stateObj.state === "disarmed" - ? ARM_ACTIONS + ? this._armActions : DISARM_ACTIONS ).map( (stateAction) => html` From 0fdb012e244969b1dbc02fa59a956c1b7677d6d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 00:13:03 -0500 Subject: [PATCH 071/138] Bump @typescript-eslint/eslint-plugin from 5.51.0 to 5.52.0 (#15466) --- package.json | 2 +- yarn.lock | 87 +++++++++++++--------------------------------------- 2 files changed, 22 insertions(+), 67 deletions(-) diff --git a/package.json b/package.json index 0cf2c2fc4c..d9f9085d55 100644 --- a/package.json +++ b/package.json @@ -180,7 +180,7 @@ "@types/sortablejs": "^1", "@types/tar": "^6", "@types/webspeechapi": "^0.0.29", - "@typescript-eslint/eslint-plugin": "^5.51.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", "@web/dev-server": "^0.0.24", "@web/dev-server-rollup": "^0.2.11", diff --git a/yarn.lock b/yarn.lock index b33ab8ac81..46a127b52b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4458,13 +4458,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.51.0" +"@typescript-eslint/eslint-plugin@npm:^5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.52.0" dependencies: - "@typescript-eslint/scope-manager": 5.51.0 - "@typescript-eslint/type-utils": 5.51.0 - "@typescript-eslint/utils": 5.51.0 + "@typescript-eslint/scope-manager": 5.52.0 + "@typescript-eslint/type-utils": 5.52.0 + "@typescript-eslint/utils": 5.52.0 debug: ^4.3.4 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 @@ -4478,7 +4478,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 5351d8cec13bd9867ce4aaf7052aa31c9ca867fc89c620fc0fe5718ac2cbc165903275db59974324d98e45df0d33a73a4367d236668772912731031a672cfdcd + checksum: cff07ee94d8ab2a1b6c33b5c5bf641eff2bf2bebc0f35a9d8b3f128fd610e27a4aaf620bc2ad23608ad161b1810b7e32e5a2e0f746cc5094c3f506f7a14daa34 languageName: node linkType: hard @@ -4499,16 +4499,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/scope-manager@npm:5.51.0" - dependencies: - "@typescript-eslint/types": 5.51.0 - "@typescript-eslint/visitor-keys": 5.51.0 - checksum: b3c9f48b6b7a7ae2ebcad4745ef91e4727776b2cf56d31be6456b1aa063aa649539e20f9fffa83cad9ccaaa9c492f2354a1c15526a2b789e235ec58b3a82d22c - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:5.52.0": version: 5.52.0 resolution: "@typescript-eslint/scope-manager@npm:5.52.0" @@ -4519,12 +4509,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/type-utils@npm:5.51.0" +"@typescript-eslint/type-utils@npm:5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/type-utils@npm:5.52.0" dependencies: - "@typescript-eslint/typescript-estree": 5.51.0 - "@typescript-eslint/utils": 5.51.0 + "@typescript-eslint/typescript-estree": 5.52.0 + "@typescript-eslint/utils": 5.52.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -4532,14 +4522,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ab9747b0c629cfaaab903eed8ce1e39d34d69a402ce5faf2f1fff2bbb461bdbe034044b1368ba67ba8e5c1c512172e07d83c8a563635d8de811bf148d95c7dec - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/types@npm:5.51.0" - checksum: b31021a0866f41ba5d71b6c4c7e20cc9b99d49c93bb7db63b55b2e51542fb75b4e27662ee86350da3c1318029e278a5a807facaf4cb5aeea724be8b0e021e836 + checksum: ac5422040461febab8a2eeec76d969024ccff76203dec357f7220c9b5e0dde96e3e3a76fd4118d42b50bd5bfb3a194aaceeb63417a2ac4e1ebf5e687558a9a10 languageName: node linkType: hard @@ -4550,24 +4533,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.51.0" - dependencies: - "@typescript-eslint/types": 5.51.0 - "@typescript-eslint/visitor-keys": 5.51.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: aec23e5cab48ee72fefa6d1ac266639ebabf6cebec1e0207ad47011d3a48186ac9a632c8e34c3bac896155f54895a497230c11d789fd81263b08eb267d7113ce - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:5.52.0": version: 5.52.0 resolution: "@typescript-eslint/typescript-estree@npm:5.52.0" @@ -4586,31 +4551,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/utils@npm:5.51.0" +"@typescript-eslint/utils@npm:5.52.0": + version: 5.52.0 + resolution: "@typescript-eslint/utils@npm:5.52.0" dependencies: "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.51.0 - "@typescript-eslint/types": 5.51.0 - "@typescript-eslint/typescript-estree": 5.51.0 + "@typescript-eslint/scope-manager": 5.52.0 + "@typescript-eslint/types": 5.52.0 + "@typescript-eslint/typescript-estree": 5.52.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c6e28c942fbac5500f0e8ed67ef304b484ba296486e55306f78fb090dc9d5bb1f25a0bedc065e14680041eadce5e95fa10aab618cb0c316599ec987e6ea72442 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.51.0": - version: 5.51.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.51.0" - dependencies: - "@typescript-eslint/types": 5.51.0 - eslint-visitor-keys: ^3.3.0 - checksum: b49710f3c6b3b62a846a163afffd81be5eb2b1f44e25bec51ff3c9f4c3b579d74aa4cbd3753b4fc09ea3dbc64a7062f9c658c08d22bb2740a599cb703d876220 + checksum: 01906be5262ece36537e9d586e4d2d4791e05752a9354bcb42b1f5bf965f53daa13309c61c3dff5e201ea28c298e4e01cf0c93738afa0099fea0da3b1d8cb3a5 languageName: node linkType: hard @@ -9648,7 +9603,7 @@ fsevents@^1.2.7: "@types/sortablejs": ^1 "@types/tar": ^6 "@types/webspeechapi": ^0.0.29 - "@typescript-eslint/eslint-plugin": ^5.51.0 + "@typescript-eslint/eslint-plugin": ^5.52.0 "@typescript-eslint/parser": ^5.52.0 "@vaadin/combo-box": ^23.3.6 "@vaadin/vaadin-themable-mixin": ^23.3.6 From 980758528ad801626f4e963fcb74650aeef271b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 00:14:37 -0500 Subject: [PATCH 072/138] Bump @codemirror/autocomplete from 6.4.0 to 6.4.1 (#15470) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index d9f9085d55..ecb16b0555 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "license": "Apache-2.0", "dependencies": { "@braintree/sanitize-url": "^6.0.2", - "@codemirror/autocomplete": "^6.4.0", + "@codemirror/autocomplete": "^6.4.1", "@codemirror/commands": "^6.2.0", "@codemirror/language": "^6.4.0", "@codemirror/legacy-modes": "^6.3.1", diff --git a/yarn.lock b/yarn.lock index 46a127b52b..0ef9543c9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1368,9 +1368,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/autocomplete@npm:^6.4.0": - version: 6.4.0 - resolution: "@codemirror/autocomplete@npm:6.4.0" +"@codemirror/autocomplete@npm:^6.4.1": + version: 6.4.1 + resolution: "@codemirror/autocomplete@npm:6.4.1" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 @@ -1381,7 +1381,7 @@ __metadata: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: 3470fee01da60d3d71b8b4f8728629c0f0441e704b8b828592f98c000d75fdb2c9077727e82685626cf45b95cadbc0c1a03968261df2f0cfb4162418b5f4dd1f + checksum: db2809092e9cc6928a420667dec7d6ceb790c495a85fb136071f8e7f2ab15a26eb1f48de41151e2a94b1ec0117d5ae949896f45b2b2c9bbc4b3dc836b9783967 languageName: node linkType: hard @@ -9519,7 +9519,7 @@ fsevents@^1.2.7: "@babel/preset-env": ^7.20.2 "@babel/preset-typescript": ^7.18.6 "@braintree/sanitize-url": ^6.0.2 - "@codemirror/autocomplete": ^6.4.0 + "@codemirror/autocomplete": ^6.4.1 "@codemirror/commands": ^6.2.0 "@codemirror/language": ^6.4.0 "@codemirror/legacy-modes": ^6.3.1 From de5199e34c4864482963c689879a712628067308 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 05:34:04 +0000 Subject: [PATCH 073/138] Bump @codemirror/commands from 6.2.0 to 6.2.1 (#15471) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index ecb16b0555..1a1119f612 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "dependencies": { "@braintree/sanitize-url": "^6.0.2", "@codemirror/autocomplete": "^6.4.1", - "@codemirror/commands": "^6.2.0", + "@codemirror/commands": "^6.2.1", "@codemirror/language": "^6.4.0", "@codemirror/legacy-modes": "^6.3.1", "@codemirror/search": "^6.2.3", diff --git a/yarn.lock b/yarn.lock index 0ef9543c9d..0a6ca5b7c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1385,15 +1385,15 @@ __metadata: languageName: node linkType: hard -"@codemirror/commands@npm:^6.2.0": - version: 6.2.0 - resolution: "@codemirror/commands@npm:6.2.0" +"@codemirror/commands@npm:^6.2.1": + version: 6.2.1 + resolution: "@codemirror/commands@npm:6.2.1" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: 13475fcd348335b4c31e563cbe83b98fdaa99218da882e3fbe6bad66841c55a69030e4a1a5f475ba2607db194d3b43b91e38fd088f9f4196b1ed4eac5b523909 + checksum: 216308c57745e86bdd9cbbecc8fa6d8302c340674c3f1837894f1eeb12a91d47adeb24a1d1d76faf05f7630f6dd80b9dad974ff23f017370ebdc5329b2204262 languageName: node linkType: hard @@ -9520,7 +9520,7 @@ fsevents@^1.2.7: "@babel/preset-typescript": ^7.18.6 "@braintree/sanitize-url": ^6.0.2 "@codemirror/autocomplete": ^6.4.1 - "@codemirror/commands": ^6.2.0 + "@codemirror/commands": ^6.2.1 "@codemirror/language": ^6.4.0 "@codemirror/legacy-modes": ^6.3.1 "@codemirror/search": ^6.2.3 From d5578c236fbbfbc9412fa4c20e57cc025d53f745 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Thu, 16 Feb 2023 02:39:31 -0800 Subject: [PATCH 074/138] Fix typo in water consumption description (#15464) --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index 3a9a065327..ddb975ab62 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1655,7 +1655,7 @@ "dialog": { "header": "Configure water consumption", "paragraph": "Water consumption is the volume of water that flows to your home.", - "entity_para": "Pick a sensor which measures gas consumption in either of {unit}.", + "entity_para": "Pick a sensor which measures water consumption in either of {unit}.", "cost_para": "Select how Home Assistant should keep track of the costs of the consumed water.", "no_cost": "[%key:ui::panel::config::energy::grid::flow_dialog::from::no_cost%]", "cost_stat": "[%key:ui::panel::config::energy::grid::flow_dialog::from::cost_stat%]", From 8631139133ff7241f5a179a287481d5a1471fa32 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 16 Feb 2023 12:54:17 +0100 Subject: [PATCH 075/138] Fix initial scroll inside more info dialog (#15473) --- src/dialogs/more-info/ha-more-info-dialog.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index b7e3d289c7..02eb06b797 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -273,6 +273,7 @@ export class MoreInfoDialog extends LitElement { --dialog-surface-position: static; --dialog-content-position: static; --vertical-align-dialog: flex-start; + --dialog-content-padding: 0; } ha-header-bar { @@ -297,8 +298,12 @@ export class MoreInfoDialog extends LitElement { var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); } - :host([tab="settings"]) ha-dialog { - --dialog-content-padding: 0px; + ha-dialog .content { + padding: 24px; + } + + :host([tab="settings"]) ha-dialog .content { + padding: 0px; } @media all and (min-width: 600px) and (min-height: 501px) { @@ -321,8 +326,8 @@ export class MoreInfoDialog extends LitElement { } } - :host([tab="info"]) ha-dialog[data-domain="camera"] { - --dialog-content-padding: 0; + :host([tab="info"]) ha-dialog[data-domain="camera"] .content { + padding: 0; /* max height of the video is full screen, minus the height of the header of the dialog and the padding of the dialog (mdc-dialog-max-height: calc(100% - 72px)) */ --video-max-height: calc(100vh - 113px - 72px); } From d98a26146b7a05d87bcfe3a730e132bfdfec0f3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 13:15:58 +0100 Subject: [PATCH 076/138] Bump @vaadin/combo-box from 23.3.6 to 23.3.7 (#15468) * Bump @vaadin/combo-box from 23.3.6 to 23.3.7 Bumps [@vaadin/combo-box](https://github.com/vaadin/web-components/tree/HEAD/packages/combo-box) from 23.3.6 to 23.3.7. - [Release notes](https://github.com/vaadin/web-components/releases) - [Commits](https://github.com/vaadin/web-components/commits/v23.3.7/packages/combo-box) --- updated-dependencies: - dependency-name: "@vaadin/combo-box" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update theme mixin too --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Paul Bottein --- package.json | 4 +- yarn.lock | 148 +++++++++++++++++++++++++-------------------------- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index 1a1119f612..c6ae7ba2d0 100644 --- a/package.json +++ b/package.json @@ -87,8 +87,8 @@ "@polymer/paper-tooltip": "^3.0.1", "@polymer/polymer": "3.4.1", "@thomasloven/round-slider": "0.6.0", - "@vaadin/combo-box": "^23.3.6", - "@vaadin/vaadin-themable-mixin": "^23.3.6", + "@vaadin/combo-box": "^23.3.7", + "@vaadin/vaadin-themable-mixin": "^23.3.7", "@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 0a6ca5b7c2..325bcae8e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4579,110 +4579,110 @@ __metadata: languageName: node linkType: hard -"@vaadin/combo-box@npm:^23.3.6": - version: 23.3.6 - resolution: "@vaadin/combo-box@npm:23.3.6" +"@vaadin/combo-box@npm:^23.3.7": + version: 23.3.7 + resolution: "@vaadin/combo-box@npm:23.3.7" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~23.3.6 - "@vaadin/field-base": ~23.3.6 - "@vaadin/input-container": ~23.3.6 - "@vaadin/item": ~23.3.6 - "@vaadin/lit-renderer": ~23.3.6 - "@vaadin/overlay": ~23.3.6 - "@vaadin/vaadin-lumo-styles": ~23.3.6 - "@vaadin/vaadin-material-styles": ~23.3.6 - "@vaadin/vaadin-themable-mixin": ~23.3.6 - checksum: fdd260a4adf89850fb058bc99a008e970ec7b58a2c576101548640a08577d497dc87778e2b3901f93249e2b21ac2e39d1d5c011762cff98c59fcf7cdc31200c0 + "@vaadin/component-base": ~23.3.7 + "@vaadin/field-base": ~23.3.7 + "@vaadin/input-container": ~23.3.7 + "@vaadin/item": ~23.3.7 + "@vaadin/lit-renderer": ~23.3.7 + "@vaadin/overlay": ~23.3.7 + "@vaadin/vaadin-lumo-styles": ~23.3.7 + "@vaadin/vaadin-material-styles": ~23.3.7 + "@vaadin/vaadin-themable-mixin": ~23.3.7 + checksum: 6165ed644d3d02310288278e4f1f5d372365652abc7fff54d2163317799402899ed1d656d2dcff23a8ae5af02623a9f0236e746554107210e12678d8c1980be1 languageName: node linkType: hard -"@vaadin/component-base@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/component-base@npm:23.3.6" +"@vaadin/component-base@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/component-base@npm:23.3.7" 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: d3301f12cbc2c7bc900aef87ccbc3513b58a7a23b846a8dea40a2b91dd82d37f02bc080523f4d9e4413c23a7f2b56fe9f709d9ed72d2d1a214c7205e7d429a6d + checksum: 2d5af22354d9345ae2fd69b7af53f78202a7f3dab64a5af688123cdd4d7b6543d271b4f8dc8f251f917dc146681c784594533f8df2215d0a00189ba2a616c853 languageName: node linkType: hard -"@vaadin/field-base@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/field-base@npm:23.3.6" +"@vaadin/field-base@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/field-base@npm:23.3.7" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~23.3.6 + "@vaadin/component-base": ~23.3.7 lit: ^2.0.0 - checksum: cd37f85f2a52a2c0a46bbae959caa28bf2c64394ccdfec911eb9dd07b2cdac733def169738958b8dc421e82752c9fa6e201926d5a967113a8a48ccecdb61a887 + checksum: b9bb5eddf09da49af3c146fc642c5da3db6c5eec64fd752c8fa1ec86564698c6177a362b887d480ac0aca4b6d6bba13b39a5c4301c308ef486bcb5abe92d4dae languageName: node linkType: hard -"@vaadin/icon@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/icon@npm:23.3.6" +"@vaadin/icon@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/icon@npm:23.3.7" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~23.3.6 - "@vaadin/vaadin-lumo-styles": ~23.3.6 - "@vaadin/vaadin-themable-mixin": ~23.3.6 + "@vaadin/component-base": ~23.3.7 + "@vaadin/vaadin-lumo-styles": ~23.3.7 + "@vaadin/vaadin-themable-mixin": ~23.3.7 lit: ^2.0.0 - checksum: 5c559274e44bcab9aa4683f77a8078ff1f4b7af71f446091f321f1f47c954f918ee306341dd0415c743d78cde40601e3e381b215672d4cb91f92fe37debf44fa + checksum: 8607a9e33340f1d0d17a18be9880e958352f8582564f7a15a9d0976340eae1d94e879d4ead906d786c651cbdc7ce3be477eed45bf038a1fbdcc6dfafd93d38dd languageName: node linkType: hard -"@vaadin/input-container@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/input-container@npm:23.3.6" +"@vaadin/input-container@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/input-container@npm:23.3.7" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~23.3.6 - "@vaadin/vaadin-lumo-styles": ~23.3.6 - "@vaadin/vaadin-material-styles": ~23.3.6 - "@vaadin/vaadin-themable-mixin": ~23.3.6 - checksum: c675f1daf9f51f1fc0987a85be1ed83bffc897be9a694b861a037a9c91438a1f02f232cd026c80ec88ffc409ae147ed415cadd8ed07b34e49b94b15e01753d0e + "@vaadin/component-base": ~23.3.7 + "@vaadin/vaadin-lumo-styles": ~23.3.7 + "@vaadin/vaadin-material-styles": ~23.3.7 + "@vaadin/vaadin-themable-mixin": ~23.3.7 + checksum: 337395a4cc64a9abdf08dc514bb31177b4af686b184a3b5ad33470993c2b720f35bc97a654316fef615e1518e22bcd414a12840dd8ca66bd7f28645ee2e5d212 languageName: node linkType: hard -"@vaadin/item@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/item@npm:23.3.6" +"@vaadin/item@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/item@npm:23.3.7" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~23.3.6 - "@vaadin/vaadin-lumo-styles": ~23.3.6 - "@vaadin/vaadin-material-styles": ~23.3.6 - "@vaadin/vaadin-themable-mixin": ~23.3.6 - checksum: 92236d255173a22cbbae9b83e521f2037228961bd675eead48c312f0a4311cdd488289418e1c9015559993c8a673f62c09dbdefc4b50bcaaa4b42b357c124073 + "@vaadin/component-base": ~23.3.7 + "@vaadin/vaadin-lumo-styles": ~23.3.7 + "@vaadin/vaadin-material-styles": ~23.3.7 + "@vaadin/vaadin-themable-mixin": ~23.3.7 + checksum: f5e3ec76db31c1eb72bb0dc91bef65929c037919f036aee1e0178566996dd8315db6196d7791a2f0b11466255f601e6f846dfd04405732bdae6518fdde76537a languageName: node linkType: hard -"@vaadin/lit-renderer@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/lit-renderer@npm:23.3.6" +"@vaadin/lit-renderer@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/lit-renderer@npm:23.3.7" dependencies: lit: ^2.0.0 - checksum: fcd411682943e7a8160c501a0063a1d6de51687d2b08864590c83111ae8ebcf50b471443f62a855bab6debce1520de320b6620ab4bc4a324fcc9c3eeab2bd769 + checksum: 5d8dabd7ca8db8f029948ff191225bc658d4e7dd445e2b24baa2f6596905c95f229520b17ba973a7921ec35c21fd4744ad97ba0206435d5a974ae7819382c770 languageName: node linkType: hard -"@vaadin/overlay@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/overlay@npm:23.3.6" +"@vaadin/overlay@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/overlay@npm:23.3.7" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 "@polymer/polymer": ^3.0.0 - "@vaadin/component-base": ~23.3.6 - "@vaadin/vaadin-lumo-styles": ~23.3.6 - "@vaadin/vaadin-material-styles": ~23.3.6 - "@vaadin/vaadin-themable-mixin": ~23.3.6 - checksum: 9ff90980602bda7a10efe735eff973844e6b30112735389f9be60dee04fd51ab8752345c8a173d1ab6cc5583c26a67cfb4faa301db1b8c2c1a48c6164f4ce3bb + "@vaadin/component-base": ~23.3.7 + "@vaadin/vaadin-lumo-styles": ~23.3.7 + "@vaadin/vaadin-material-styles": ~23.3.7 + "@vaadin/vaadin-themable-mixin": ~23.3.7 + checksum: 1f4cb3e9cdbde9cdb1d4e8bfefb1a98b39f757a29dc6c58d6d5ea535b8bff38429f121aa9aa66071f151a8c796cc313e86bef7c07ff8b6c95500c69ded10055c languageName: node linkType: hard @@ -4693,36 +4693,36 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-lumo-styles@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/vaadin-lumo-styles@npm:23.3.6" +"@vaadin/vaadin-lumo-styles@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/vaadin-lumo-styles@npm:23.3.7" dependencies: "@polymer/iron-icon": ^3.0.0 "@polymer/iron-iconset-svg": ^3.0.0 "@polymer/polymer": ^3.0.0 - "@vaadin/icon": ~23.3.6 - "@vaadin/vaadin-themable-mixin": ~23.3.6 - checksum: d3e4d47c0a0e8f786cba38f185a80a08274f1e93020896a1d1a67eff7518c9774c77b15622968128c823c08e7c789f08918aeb8c78f18c60b18078f63f67f7ff + "@vaadin/icon": ~23.3.7 + "@vaadin/vaadin-themable-mixin": ~23.3.7 + checksum: 76c12320f04ef78a0cff2b87239ff6d6bd6b1d80bf66db3a8585ccef70cd4070db8c6e5d9a7e73398e4684056e326377c58c17adb7486d86c730a3733650b5bc languageName: node linkType: hard -"@vaadin/vaadin-material-styles@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/vaadin-material-styles@npm:23.3.6" +"@vaadin/vaadin-material-styles@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/vaadin-material-styles@npm:23.3.7" dependencies: "@polymer/polymer": ^3.0.0 - "@vaadin/vaadin-themable-mixin": ~23.3.6 - checksum: 7725bb7952b75724ac33de8abcca164689c545dad8675155ff72ef9dd2ae6eb082fdcad483e851a4ef6090c2f40834c6e401a304ab38af700eac0442189fa06b + "@vaadin/vaadin-themable-mixin": ~23.3.7 + checksum: 28513c95487a2b3ff8cfaf966fa1305e14e84c8a96dcd5974c125962187df5ff83532d77260ac222dcd07eae8cb35f66faf29a601b187b4ebb4d1975be566a8e languageName: node linkType: hard -"@vaadin/vaadin-themable-mixin@npm:^23.3.6, @vaadin/vaadin-themable-mixin@npm:~23.3.6": - version: 23.3.6 - resolution: "@vaadin/vaadin-themable-mixin@npm:23.3.6" +"@vaadin/vaadin-themable-mixin@npm:^23.3.7, @vaadin/vaadin-themable-mixin@npm:~23.3.7": + version: 23.3.7 + resolution: "@vaadin/vaadin-themable-mixin@npm:23.3.7" dependencies: "@open-wc/dedupe-mixin": ^1.3.0 lit: ^2.0.0 - checksum: 5cdf75ad20e30d15daaa5f1428613a8c78c0159c61e1607ff3c3a3d374b8c8ae9a7a5c99a718d845228305518863e8ff3a4c86897f3dd350c507a3f317f42637 + checksum: 142bc358e248d1d9f1accef47a4537460093faca8f4b25487bd16c9e4abf98ef0e3f8da57a5780b4f275af4bed8a4c8f6739559d9cc2802900a1a05f8662ea77 languageName: node linkType: hard @@ -9605,8 +9605,8 @@ fsevents@^1.2.7: "@types/webspeechapi": ^0.0.29 "@typescript-eslint/eslint-plugin": ^5.52.0 "@typescript-eslint/parser": ^5.52.0 - "@vaadin/combo-box": ^23.3.6 - "@vaadin/vaadin-themable-mixin": ^23.3.6 + "@vaadin/combo-box": ^23.3.7 + "@vaadin/vaadin-themable-mixin": ^23.3.7 "@vibrant/color": ^3.2.1-alpha.1 "@vibrant/core": ^3.2.1-alpha.1 "@vibrant/quantizer-mmcq": ^3.2.1-alpha.1 From 252e58d63ba8c673178c0355584253d330744dc8 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 16 Feb 2023 16:29:56 +0100 Subject: [PATCH 077/138] Add basic Thread network overview page (#15474) --- src/data/thread.ts | 66 +++++ .../thread/thread-config-panel.ts | 248 +++++++++++++++--- src/translations/en.json | 8 + 3 files changed, 279 insertions(+), 43 deletions(-) create mode 100644 src/data/thread.ts diff --git a/src/data/thread.ts b/src/data/thread.ts new file mode 100644 index 0000000000..b760495654 --- /dev/null +++ b/src/data/thread.ts @@ -0,0 +1,66 @@ +import { HomeAssistant } from "../types"; + +export interface ThreadRouter { + brand: "google" | "apple" | "homeassistant"; + server: string; + extended_pan_id: string; + model_name: string | null; + network_name: string; + vendor_name: string; +} + +export interface ThreadDataSet { + created; + dataset_id; + extended_pan_id; + network_name: string; + pan_id; + preferred: boolean; + source; +} + +export interface ThreadRouterDiscoveryEvent { + key: string; + type: "router_discovered" | "router_removed"; + data: ThreadRouter; +} + +class DiscoveryStream { + hass: HomeAssistant; + + routers: { [key: string]: ThreadRouter }; + + constructor(hass: HomeAssistant) { + this.hass = hass; + this.routers = {}; + } + + processEvent(streamMessage: ThreadRouterDiscoveryEvent): ThreadRouter[] { + if (streamMessage.type === "router_discovered") { + this.routers[streamMessage.key] = streamMessage.data; + } else if (streamMessage.type === "router_removed") { + delete this.routers[streamMessage.key]; + } + return Object.values(this.routers); + } +} + +export const subscribeDiscoverThreadRouters = ( + hass: HomeAssistant, + callbackFunction: (routers: ThreadRouter[]) => void +) => { + const stream = new DiscoveryStream(hass); + return hass.connection.subscribeMessage( + (message) => callbackFunction(stream.processEvent(message)), + { + type: "thread/discover_routers", + } + ); +}; + +export const listThreadDataSets = ( + hass: HomeAssistant +): Promise<{ datasets: ThreadDataSet[] }> => + hass.callWS({ + type: "thread/list_datasets", + }); 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 78ed4c91b5..aefd881e60 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 @@ -1,75 +1,215 @@ import "@material/mwc-button"; +import { mdiDevices, mdiDotsVertical, mdiInformationOutline } from "@mdi/js"; import { css, html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; +import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; +import { stringCompare } from "../../../../../common/string/compare"; import "../../../../../components/ha-card"; +import { getOTBRInfo } from "../../../../../data/otbr"; +import { + listThreadDataSets, + subscribeDiscoverThreadRouters, + ThreadDataSet, + ThreadRouter, +} from "../../../../../data/thread"; +import { showConfigFlowDialog } from "../../../../../dialogs/config-flow/show-dialog-config-flow"; +import { showAlertDialog } from "../../../../../dialogs/generic/show-dialog-box"; import "../../../../../layouts/hass-subpage"; +import { SubscribeMixin } from "../../../../../mixins/subscribe-mixin"; import { haStyle } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; -import { getOTBRInfo, OTBRInfo } from "../../../../../data/otbr"; -import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; -import { showConfigFlowDialog } from "../../../../../dialogs/config-flow/show-dialog-config-flow"; +import { brandsUrl } from "../../../../../util/brands-url"; + +interface ThreadNetwork { + name: string; + dataset?: ThreadDataSet; + routers?: ThreadRouter[]; +} @customElement("thread-config-panel") -export class ThreadConfigPanel extends LitElement { +export class ThreadConfigPanel extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; @property({ type: Boolean }) public narrow!: boolean; - @state() private _info?: OTBRInfo; + @state() private _routers: ThreadRouter[] = []; + + @state() private _datasets: ThreadDataSet[] = []; protected render(): TemplateResult { + const networks = this._groupRoutersByNetwork(this._routers, this._datasets); + return html` + + + Add border router +
    - - ${isComponentLoaded(this.hass, "otbr") - ? html` -
    - ${!this._info - ? html`` - : html` - - - - - - - - - -
    URL${this._info.url}
    Active Dataset TLVs${this._info.active_dataset_tlvs || "-"}
    - `} -
    - ` - : html` -
    No border routers found.
    -
    - -
    - `} -
    + ${networks.preferred + ? html`

    + ${this.hass.localize("ui.panel.config.thread.my_network")} +

    + ${this._renderNetwork(networks.preferred)}` + : ""} + ${networks.networks.length + ? html`

    + ${this.hass.localize("ui.panel.config.thread.other_networks")} +

    + ${networks.networks.map((network) => + this._renderNetwork(network) + )}` + : ""}
    `; } + private _renderNetwork(network: ThreadNetwork) { + return html` +
    + ${network.name}${network.dataset + ? html`` + : ""} +
    + ${network.routers?.length + ? html`
    +

    + ${this.hass.localize("ui.panel.config.thread.border_routers", { + count: network.routers.length, + })} +

    +
    + ${network.routers.map( + (router) => + html` + ${router.brand} + ${router.model_name || router.server.replace(".local.", "")} + ${router.server} + ` + )}` + : html`
    + + ${this.hass.localize("ui.panel.config.thread.no_border_routers")} +
    `} +
    `; + } + + private async _showDatasetInfo(ev: Event) { + const dataset = (ev.currentTarget as any).networkDataset as ThreadDataSet; + if (isComponentLoaded(this.hass, "otbr")) { + const otbrInfo = await getOTBRInfo(this.hass); + if (otbrInfo.active_dataset_tlvs.includes(dataset.extended_pan_id)) { + showAlertDialog(this, { + title: dataset.network_name, + text: html`Network name: ${dataset.network_name}
    + Dataset id: ${dataset.dataset_id}
    + Pan id: ${dataset.pan_id}
    + Extended Pan id: ${dataset.extended_pan_id}
    + OTBR URL: ${otbrInfo.url}
    + Active dataset TLVs: ${otbrInfo.active_dataset_tlvs}`, + }); + return; + } + } + showAlertDialog(this, { + title: dataset.network_name, + text: html`Network name: ${dataset.network_name}
    + Dataset id: ${dataset.dataset_id}
    + Pan id: ${dataset.pan_id}
    + Extended Pan id: ${dataset.extended_pan_id}`, + }); + } + + private _onImageError(ev) { + ev.target.style.display = "none"; + } + + private _onImageLoad(ev) { + ev.target.style.display = ""; + } + + hassSubscribe() { + return [ + subscribeDiscoverThreadRouters(this.hass, (routers: ThreadRouter[]) => { + this._routers = routers; + }), + ]; + } + protected override firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); this._refresh(); } - private _refresh() { - if (isComponentLoaded(this.hass, "otbr")) { - getOTBRInfo(this.hass).then((info) => { - this._info = info; - }); + private _groupRoutersByNetwork = memoizeOne( + ( + routers: ThreadRouter[], + datasets: ThreadDataSet[] + ): { preferred?: ThreadNetwork; networks: ThreadNetwork[] } => { + let preferred: ThreadNetwork | undefined; + const networks: { [key: string]: ThreadNetwork } = {}; + for (const router of routers) { + const network = router.network_name; + if (network in networks) { + networks[network].routers!.push(router); + } else { + networks[network] = { name: network, routers: [router] }; + } + } + for (const dataset of datasets) { + const network = dataset.network_name; + if (dataset.preferred) { + preferred = { + name: network, + dataset: dataset, + routers: networks[network]?.routers, + }; + delete networks[network]; + continue; + } + if (network in networks) { + networks[network].dataset = dataset; + } else { + networks[network] = { name: network, dataset: dataset }; + } + } + return { + preferred, + networks: Object.values(networks).sort((a, b) => + stringCompare(a.name, b.name, this.hass.locale.language) + ), + }; } + ); + + private _refresh() { + listThreadDataSets(this.hass).then((datasets) => { + this._datasets = datasets.datasets; + }); } private _addOTBR() { @@ -91,9 +231,31 @@ export class ThreadConfigPanel extends LitElement { margin: 0 auto; direction: ltr; } - ha-card:first-child { + routers { + padding-bottom: 0; + } + .no-routers { + display: flex; + flex-direction: column; + align-items: center; + } + .no-routers ha-svg-icon { + background-color: var(--light-primary-color); + color: var(--secondary-text-color); + padding: 16px; + border-radius: 50%; + margin-bottom: 8px; + } + ha-card { margin-bottom: 16px; } + h4 { + margin: 0; + } + .card-header { + display: flex; + justify-content: space-between; + } `, ]; } diff --git a/src/translations/en.json b/src/translations/en.json index ddb975ab62..b4aa14c47e 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3263,6 +3263,14 @@ "qos": "QoS", "retain": "Retain" }, + "thread": { + "other_networks": "Other networks", + "my_network": "My network", + "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" + }, "zha": { "common": { "clusters": "Clusters", From d37e53b4a57941047d672e39eaa5e9a526de2390 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 11:07:56 -0500 Subject: [PATCH 078/138] Bump magic-string from 0.25.7 to 0.29.0 (#15469) Bumps [magic-string](https://github.com/rich-harris/magic-string) from 0.25.7 to 0.29.0. - [Release notes](https://github.com/rich-harris/magic-string/releases) - [Changelog](https://github.com/Rich-Harris/magic-string/blob/master/CHANGELOG.md) - [Commits](https://github.com/rich-harris/magic-string/compare/v0.25.7...v0.29.0) --- updated-dependencies: - dependency-name: magic-string dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c6ae7ba2d0..13c22d7609 100644 --- a/package.json +++ b/package.json @@ -214,7 +214,7 @@ "lint-staged": "^13.1.1", "lit-analyzer": "^1.2.1", "lodash.template": "^4.5.0", - "magic-string": "^0.25.7", + "magic-string": "^0.29.0", "map-stream": "^0.0.7", "merge-stream": "^2.0.0", "mocha": "^10.2.0", diff --git a/yarn.lock b/yarn.lock index 325bcae8e4..23e74b18a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1838,7 +1838,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 @@ -9665,7 +9665,7 @@ fsevents@^1.2.7: lit: ^2.6.1 lit-analyzer: ^1.2.1 lodash.template: ^4.5.0 - magic-string: ^0.25.7 + magic-string: ^0.29.0 map-stream: ^0.0.7 marked: ^4.2.12 memoize-one: ^6.0.0 @@ -11602,6 +11602,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"magic-string@npm:^0.29.0": + version: 0.29.0 + resolution: "magic-string@npm:0.29.0" + dependencies: + "@jridgewell/sourcemap-codec": ^1.4.13 + checksum: 19e5398fcfc44804917127c72ad622c68a19a0a10cbdb8d4f9f9417584a087fe9e117140bfb2463d86743cf1ed9cf4182ae0b0ad1a7536f7fdda257ee4449ffb + languageName: node + linkType: hard + "make-dir@npm:^3.0.2": version: 3.1.0 resolution: "make-dir@npm:3.1.0" From 07d84a32fdc3d1c37128aa64956d7b67aa59f11f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 16:09:23 +0000 Subject: [PATCH 079/138] Bump @codemirror/language from 6.4.0 to 6.6.0 (#15467) * Bump @codemirror/language from 6.4.0 to 6.6.0 Bumps [@codemirror/language](https://github.com/codemirror/language) from 6.4.0 to 6.6.0. - [Release notes](https://github.com/codemirror/language/releases) - [Changelog](https://github.com/codemirror/language/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/language/compare/6.4.0...6.6.0) --- updated-dependencies: - dependency-name: "@codemirror/language" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 13c22d7609..986a8a9787 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@braintree/sanitize-url": "^6.0.2", "@codemirror/autocomplete": "^6.4.1", "@codemirror/commands": "^6.2.1", - "@codemirror/language": "^6.4.0", + "@codemirror/language": "^6.6.0", "@codemirror/legacy-modes": "^6.3.1", "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", diff --git a/yarn.lock b/yarn.lock index 23e74b18a5..bb9005a672 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1397,9 +1397,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.4.0": - version: 6.4.0 - resolution: "@codemirror/language@npm:6.4.0" +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.6.0": + version: 6.6.0 + resolution: "@codemirror/language@npm:6.6.0" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 @@ -1407,7 +1407,7 @@ __metadata: "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: 607072e234db59a9a21eb41b8777b62d68a55ed28298edc4f6aaedfcf52349db1fe3ff3e7747ccfc77f03757bad45ba9a657d59a0e9c67be1231902586dec7a3 + checksum: bb9411620e2f231653a3f0c4429e0d19a3843bff5dbc117df4649d7bf783ec4ad809c0add8bc0887a4ec3f48b4f8f941621168e47d76101d5383f0d670af1722 languageName: node linkType: hard @@ -9521,7 +9521,7 @@ fsevents@^1.2.7: "@braintree/sanitize-url": ^6.0.2 "@codemirror/autocomplete": ^6.4.1 "@codemirror/commands": ^6.2.1 - "@codemirror/language": ^6.4.0 + "@codemirror/language": ^6.6.0 "@codemirror/legacy-modes": ^6.3.1 "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 From 82b2c6aa06d98e75a06730f6286c4313b4e965b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Feb 2023 16:34:48 +0000 Subject: [PATCH 080/138] Bump @codemirror/view from 6.8.1 to 6.9.0 (#15472) * Bump @codemirror/view from 6.8.1 to 6.9.0 Bumps [@codemirror/view](https://github.com/codemirror/view) from 6.8.1 to 6.9.0. - [Release notes](https://github.com/codemirror/view/releases) - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/compare/6.8.1...6.9.0) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 986a8a9787..cbebfce391 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@codemirror/legacy-modes": "^6.3.1", "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.8.1", + "@codemirror/view": "^6.9.0", "@formatjs/intl-datetimeformat": "^6.4.3", "@formatjs/intl-getcanonicallocales": "^2.0.5", "@formatjs/intl-locale": "^3.0.11", diff --git a/yarn.lock b/yarn.lock index bb9005a672..c3b869bfb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1438,14 +1438,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.8.1": - version: 6.8.1 - resolution: "@codemirror/view@npm:6.8.1" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.9.0": + version: 6.9.0 + resolution: "@codemirror/view@npm:6.9.0" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: e645298a5d2ebbf7ad14fa4a1ccfbaafda227349b44578354783066c6e433ed57a395cbc02c7bdd5351064a5be234d625e71f9b5c24803cb24ab399f60855f28 + checksum: c68b928220ab01a917d03e79aee2291b9ce524bb2bc5482354c7adb8ca7ba82ad2877283477a135eb09a239b9905985bb10eb91a2f9d0cb82739b4a97dc2ea2e languageName: node linkType: hard @@ -9525,7 +9525,7 @@ fsevents@^1.2.7: "@codemirror/legacy-modes": ^6.3.1 "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.8.1 + "@codemirror/view": ^6.9.0 "@formatjs/intl-datetimeformat": ^6.4.3 "@formatjs/intl-getcanonicallocales": ^2.0.5 "@formatjs/intl-locale": ^3.0.11 From 054e4165f8fbd73e6e029c37b02462c9a12488b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 00:00:30 -0500 Subject: [PATCH 081/138] Bump @types/tar from 6.1.3 to 6.1.4 (#15479) --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index c3b869bfb9..0245095e59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4417,12 +4417,12 @@ __metadata: linkType: hard "@types/tar@npm:^6": - version: 6.1.3 - resolution: "@types/tar@npm:6.1.3" + version: 6.1.4 + resolution: "@types/tar@npm:6.1.4" dependencies: "@types/node": "*" - minipass: ^3.3.5 - checksum: 3a221f74adfcef8555b9c4cc951907dfd567630744ffe5211da1b44caf2a4c3b02297b73c9fb02d171e93a7a7c74fb15c1826e3f0438f0e5e8f4c790db59ddcf + minipass: ^4.0.0 + checksum: 48a1f6b8665ed03f37f74966cfe991a33d6e85cee28aaa6ef42c7ca8448cdbc1e2ca96b473b6b53f1d7bd91423ae0dcfe54a295607d7ac4b4cbb9dbf167df7fa languageName: node linkType: hard @@ -11960,7 +11960,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3, minipass@npm:^3.3.5": +"minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3": version: 3.3.5 resolution: "minipass@npm:3.3.5" dependencies: From 8f22b3c1fac7a303e8a80d61bb699b43fc41ceed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 00:01:56 -0500 Subject: [PATCH 082/138] Bump lint-staged from 13.1.1 to 13.1.2 (#15481) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index cbebfce391..99b8e7abec 100644 --- a/package.json +++ b/package.json @@ -211,7 +211,7 @@ "husky": "^8.0.3", "instant-mocha": "^1.5.0", "jszip": "^3.10.1", - "lint-staged": "^13.1.1", + "lint-staged": "^13.1.2", "lit-analyzer": "^1.2.1", "lodash.template": "^4.5.0", "magic-string": "^0.29.0", diff --git a/yarn.lock b/yarn.lock index 0245095e59..237aafd556 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9661,7 +9661,7 @@ fsevents@^1.2.7: jszip: ^3.10.1 leaflet: ^1.9.3 leaflet-draw: ^1.0.4 - lint-staged: ^13.1.1 + lint-staged: ^13.1.2 lit: ^2.6.1 lit-analyzer: ^1.2.1 lodash.template: ^4.5.0 @@ -11274,9 +11274,9 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lint-staged@npm:^13.1.1": - version: 13.1.1 - resolution: "lint-staged@npm:13.1.1" +"lint-staged@npm:^13.1.2": + version: 13.1.2 + resolution: "lint-staged@npm:13.1.2" dependencies: cli-truncate: ^3.1.0 colorette: ^2.0.19 @@ -11293,7 +11293,7 @@ fsevents@^1.2.7: yaml: ^2.1.3 bin: lint-staged: bin/lint-staged.js - checksum: 8e5093c7e982a2f6d6449927a40156a812644479df1d2760aee8bf05df3a314e022d8f7e275e57fd61769ee57e3cf7b062ed3c6e4934a63848300b877e269daa + checksum: f854ad5c88542b8f06e27f3b4046927a4f3d4a451a04e079526559d819a325762268f65bd2df7156bcc0cb5f531f621c42cdb824b403f537c78305adc9e56a54 languageName: node linkType: hard From 747b9e2ae1f8f520dc3f2d43c9d6a5e414050430 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:29:57 +0000 Subject: [PATCH 083/138] Bump eslint-config-airbnb-base from 14.2.1 to 15.0.0 (#15480) * Bump eslint-config-airbnb-base from 14.2.1 to 15.0.0 Bumps [eslint-config-airbnb-base](https://github.com/airbnb/javascript) from 14.2.1 to 15.0.0. - [Release notes](https://github.com/airbnb/javascript/releases) - [Commits](https://github.com/airbnb/javascript/compare/eslint-config-airbnb-base-v14.2.1...eslint-config-airbnb-base-v15.0.0) --- updated-dependencies: - dependency-name: eslint-config-airbnb-base dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Set new rules to warn for now --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- .eslintrc.json | 3 +++ package.json | 2 +- yarn.lock | 18 ++---------------- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 5680879b3c..549844fe62 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -59,6 +59,9 @@ "prefer-destructuring": "off", "no-restricted-globals": [2, "event"], "prefer-promise-reject-errors": "off", + "no-promise-executor-return": "warn", + "no-unsafe-optional-chaining": "warn", + "prefer-regex-literals": ["warn"], "import/prefer-default-export": "off", "import/no-default-export": "off", "import/no-unresolved": "off", diff --git a/package.json b/package.json index 99b8e7abec..a76678f8a9 100644 --- a/package.json +++ b/package.json @@ -188,7 +188,7 @@ "chai": "^4.3.7", "del": "^7.0.0", "eslint": "^7.32.0", - "eslint-config-airbnb-base": "^14.2.1", + "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.6.0", "eslint-import-resolver-webpack": "^0.13.2", diff --git a/yarn.lock b/yarn.lock index 237aafd556..f5440dc2e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7810,20 +7810,6 @@ __metadata: languageName: node linkType: hard -"eslint-config-airbnb-base@npm:^14.2.1": - version: 14.2.1 - resolution: "eslint-config-airbnb-base@npm:14.2.1" - dependencies: - confusing-browser-globals: ^1.0.10 - object.assign: ^4.1.2 - object.entries: ^1.1.2 - peerDependencies: - eslint: ^5.16.0 || ^6.8.0 || ^7.2.0 - eslint-plugin-import: ^2.22.1 - checksum: 858bea748a3c8685b52fcf2488e6a0b964022f8387f4ee1e69cb707d4fda2a409f09eb8eea658bcd83fae3519967d10208ba7576dd3d3202b8cf0b9d1a6e21eb - languageName: node - linkType: hard - "eslint-config-airbnb-base@npm:^15.0.0": version: 15.0.0 resolution: "eslint-config-airbnb-base@npm:15.0.0" @@ -9628,7 +9614,7 @@ fsevents@^1.2.7: deep-freeze: ^0.0.1 del: ^7.0.0 eslint: ^7.32.0 - eslint-config-airbnb-base: ^14.2.1 + eslint-config-airbnb-base: ^15.0.0 eslint-config-airbnb-typescript: ^17.0.0 eslint-config-prettier: ^8.6.0 eslint-import-resolver-webpack: ^0.13.2 @@ -12535,7 +12521,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.entries@npm:^1.1.2, object.entries@npm:^1.1.5": +"object.entries@npm:^1.1.5": version: 1.1.6 resolution: "object.entries@npm:1.1.6" dependencies: From 6c9d6755f1243f9aa5449d6e53f8775c07d1eee7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 19 Feb 2023 23:53:35 -0500 Subject: [PATCH 084/138] Bump @codemirror/autocomplete from 6.4.1 to 6.4.2 (#15501) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a76678f8a9..5a99543297 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "license": "Apache-2.0", "dependencies": { "@braintree/sanitize-url": "^6.0.2", - "@codemirror/autocomplete": "^6.4.1", + "@codemirror/autocomplete": "^6.4.2", "@codemirror/commands": "^6.2.1", "@codemirror/language": "^6.6.0", "@codemirror/legacy-modes": "^6.3.1", diff --git a/yarn.lock b/yarn.lock index f5440dc2e3..44901fef68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1368,9 +1368,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/autocomplete@npm:^6.4.1": - version: 6.4.1 - resolution: "@codemirror/autocomplete@npm:6.4.1" +"@codemirror/autocomplete@npm:^6.4.2": + version: 6.4.2 + resolution: "@codemirror/autocomplete@npm:6.4.2" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 @@ -1381,7 +1381,7 @@ __metadata: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 - checksum: db2809092e9cc6928a420667dec7d6ceb790c495a85fb136071f8e7f2ab15a26eb1f48de41151e2a94b1ec0117d5ae949896f45b2b2c9bbc4b3dc836b9783967 + checksum: c6cc4edb1c412153e6f6f27926674d7f1d386d1f30d6d4f60c5b52bfa0105870b0c70449b69891937bcf082340d8b0fa6d1f9f28f5eb60adc2974ed4c73aadc1 languageName: node linkType: hard @@ -9505,7 +9505,7 @@ fsevents@^1.2.7: "@babel/preset-env": ^7.20.2 "@babel/preset-typescript": ^7.18.6 "@braintree/sanitize-url": ^6.0.2 - "@codemirror/autocomplete": ^6.4.1 + "@codemirror/autocomplete": ^6.4.2 "@codemirror/commands": ^6.2.1 "@codemirror/language": ^6.6.0 "@codemirror/legacy-modes": ^6.3.1 From 6986c1c8b78a381f4a3d9ad7214ed38be1af5990 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 13:31:14 +0100 Subject: [PATCH 085/138] Add option to hide legend on statistic graph card (#15506) --- src/components/chart/statistics-chart.ts | 8 ++++++-- src/panels/lovelace/cards/hui-statistics-graph-card.ts | 7 ++++++- src/panels/lovelace/cards/types.ts | 1 + .../config-elements/hui-statistics-graph-card-editor.ts | 8 ++++++++ src/translations/en.json | 3 ++- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/components/chart/statistics-chart.ts b/src/components/chart/statistics-chart.ts index 9b78e8ab02..551de1a562 100644 --- a/src/components/chart/statistics-chart.ts +++ b/src/components/chart/statistics-chart.ts @@ -59,7 +59,7 @@ export const statTypeMap: Record = { class StatisticsChart extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @property({ attribute: false }) public statisticsData!: Statistics; + @property({ attribute: false }) public statisticsData?: Statistics; @property({ attribute: false }) public metadata?: Record< string, @@ -99,7 +99,11 @@ class StatisticsChart extends LitElement { if (!this.hasUpdated || changedProps.has("unit")) { this._createOptions(); } - if (changedProps.has("statisticsData") || changedProps.has("statTypes")) { + if ( + changedProps.has("statisticsData") || + changedProps.has("statTypes") || + changedProps.has("hideLegend") + ) { this._generateData(); } } diff --git a/src/panels/lovelace/cards/hui-statistics-graph-card.ts b/src/panels/lovelace/cards/hui-statistics-graph-card.ts index 94550d6921..997f84d2e5 100644 --- a/src/panels/lovelace/cards/hui-statistics-graph-card.ts +++ b/src/panels/lovelace/cards/hui-statistics-graph-card.ts @@ -91,7 +91,11 @@ export class HuiStatisticsGraphCard extends LitElement implements LovelaceCard { } public getCardSize(): number { - return this._config?.title ? 2 : 0 + 2 * (this._entities?.length || 1); + return ( + 5 + + (this._config?.title ? 2 : 0) + + (!this._config?.hide_legend ? this._entities?.length || 0 : 0) + ); } public setConfig(config: StatisticsGraphCardConfig): void { @@ -194,6 +198,7 @@ export class HuiStatisticsGraphCard extends LitElement implements LovelaceCard { .statTypes=${this._statTypes!} .names=${this._names} .unit=${this._unit} + .hideLegend=${this._config.hide_legend || false} >
    diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index 985571d620..e82f1eeea5 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -312,6 +312,7 @@ export interface StatisticsGraphCardConfig extends LovelaceCardConfig { period?: "5minute" | "hour" | "day" | "month"; stat_types?: ExtendedStatisticType | ExtendedStatisticType[]; chart_type?: "line" | "bar"; + hide_legend?: boolean; } export interface StatisticCardConfig extends LovelaceCardConfig { 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 6b0c025ea9..4d89eb5a83 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 @@ -12,6 +12,7 @@ import { array, assert, assign, + boolean, literal, number, object, @@ -72,6 +73,7 @@ const cardConfigStruct = assign( chart_type: optional(union([literal("bar"), literal("line")])), stat_types: optional(union([array(statTypeStruct), statTypeStruct])), unit: optional(string()), + hide_legend: optional(boolean()), }) ); @@ -204,6 +206,11 @@ export class HuiStatisticsGraphCardEditor ["bar", "Bar"], ], }, + { + name: "hide_legend", + required: false, + selector: { boolean: {} }, + }, ], }, ]; @@ -334,6 +341,7 @@ export class HuiStatisticsGraphCardEditor case "stat_types": case "period": case "unit": + case "hide_legend": return this.hass!.localize( `ui.panel.lovelace.editor.card.statistics-graph.${schema.name}` ); diff --git a/src/translations/en.json b/src/translations/en.json index b4aa14c47e..68853ec791 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4194,7 +4194,8 @@ "5minute": "5 Minutes" }, "pick_statistic": "Add a statistic", - "picked_statistic": "Statistic" + "picked_statistic": "Statistic", + "hide_legend": "Hide legend" }, "statistic": { "name": "Statistic", From cf377558ae8f4f801eb3e5616a9ece18f7e582cf Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 14:21:02 +0100 Subject: [PATCH 086/138] Use filter_entity and filter_attribute context (#15395) --- .../ha-automation-condition-numeric_state.ts | 6 +- .../types/ha-automation-condition-state.ts | 102 +++++++++--------- .../ha-automation-trigger-numeric_state.ts | 6 +- .../hui-weather-forecast-card-editor.ts | 11 +- 4 files changed, 60 insertions(+), 65 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 07a767437a..0a9003c72e 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 @@ -29,7 +29,6 @@ export default class HaNumericStateCondition extends LitElement { private _schema = memoizeOne( ( localize: LocalizeFunc, - entityId, inputAboveIsEntity?: boolean, inputBelowIsEntity?: boolean ) => @@ -39,7 +38,6 @@ export default class HaNumericStateCondition extends LitElement { name: "attribute", selector: { attribute: { - entity_id: entityId, hide_attributes: [ "access_token", "auto_update", @@ -106,6 +104,9 @@ export default class HaNumericStateCondition extends LitElement { ], }, }, + context: { + filter_entity: "entity_id", + }, }, { name: "mode_above", @@ -212,7 +213,6 @@ export default class HaNumericStateCondition extends LitElement { const schema = this._schema( this.hass.localize, - this.condition.entity_id, inputAboveIsEntity, inputBelowIsEntity ); 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 1be65ec571..71b945562f 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 @@ -1,6 +1,5 @@ import { html, LitElement, PropertyValues } from "lit"; import { customElement, property } from "lit/decorators"; -import memoizeOne from "memoize-one"; import { assert, boolean, @@ -29,6 +28,54 @@ const stateConditionStruct = object({ enabled: optional(boolean()), }); +const SCHEMA = [ + { name: "entity_id", required: true, selector: { entity: {} } }, + { + name: "attribute", + selector: { + attribute: { + hide_attributes: [ + "access_token", + "available_modes", + "color_modes", + "editable", + "effect_list", + "entity_picture", + "fan_modes", + "fan_speed_list", + "forecast", + "friendly_name", + "hvac_modes", + "icon", + "operation_list", + "options", + "preset_modes", + "sound_mode_list", + "source_list", + "state_class", + "swing_modes", + "token", + ], + }, + }, + context: { + filter_entity: "entity_id", + }, + }, + { + name: "state", + required: true, + selector: { + state: {}, + }, + context: { + filter_entity: "entity_id", + filter_attribute: "attribute", + }, + }, + { name: "for", selector: { duration: {} } }, +] as const; + @customElement("ha-automation-condition-state") export class HaStateCondition extends LitElement implements ConditionElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -41,51 +88,6 @@ export class HaStateCondition extends LitElement implements ConditionElement { return { entity_id: "", state: "" }; } - private _schema = memoizeOne( - (entityId, attribute) => - [ - { name: "entity_id", required: true, selector: { entity: {} } }, - { - name: "attribute", - selector: { - attribute: { - entity_id: entityId, - hide_attributes: [ - "access_token", - "available_modes", - "color_modes", - "editable", - "effect_list", - "entity_picture", - "fan_modes", - "fan_speed_list", - "forecast", - "friendly_name", - "hvac_modes", - "icon", - "operation_list", - "options", - "preset_modes", - "sound_mode_list", - "source_list", - "state_class", - "swing_modes", - "token", - ], - }, - }, - }, - { - name: "state", - required: true, - selector: { - state: { entity_id: entityId, attribute: attribute }, - }, - }, - { name: "for", selector: { duration: {} } }, - ] as const - ); - public shouldUpdate(changedProperties: PropertyValues) { if (changedProperties.has("condition")) { try { @@ -101,16 +103,12 @@ export class HaStateCondition extends LitElement implements ConditionElement { protected render() { const trgFor = createDurationData(this.condition.for); const data = { ...this.condition, for: trgFor }; - const schema = this._schema( - this.condition.entity_id, - this.condition.attribute - ); return html` > + schema: SchemaUnion ): string => { switch (schema.name) { case "entity_id": 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 ef4e74d07e..3d54f15cca 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 @@ -25,7 +25,6 @@ export class HaNumericStateTrigger extends LitElement { private _schema = memoizeOne( ( localize: LocalizeFunc, - entityId, inputAboveIsEntity?: boolean, inputBelowIsEntity?: boolean ) => @@ -35,7 +34,6 @@ export class HaNumericStateTrigger extends LitElement { name: "attribute", selector: { attribute: { - entity_id: entityId, hide_attributes: [ "access_token", "auto_update", @@ -102,6 +100,9 @@ export class HaNumericStateTrigger extends LitElement { ], }, }, + context: { + filter_entity: "entity_id", + }, }, { name: "mode_above", @@ -231,7 +232,6 @@ export class HaNumericStateTrigger extends LitElement { const schema = this._schema( this.hass.localize, - this.trigger.entity_id, inputAboveIsEntity, inputBelowIsEntity ); 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 9ed5b09774..264637c16a 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 @@ -67,7 +67,7 @@ export class HuiWeatherForecastCardEditor } private _schema = memoizeOne( - (entity: string, localize: LocalizeFunc, hasForecast?: boolean) => + (localize: LocalizeFunc, hasForecast?: boolean) => [ { name: "entity", @@ -81,7 +81,8 @@ export class HuiWeatherForecastCardEditor schema: [ { name: "secondary_info_attribute", - selector: { attribute: { entity_id: entity } }, + selector: { attribute: {} }, + context: { filter_entity: "entity" }, }, { name: "theme", selector: { theme: {} } }, ], @@ -125,11 +126,7 @@ export class HuiWeatherForecastCardEditor return html``; } - const schema = this._schema( - this._config.entity, - this.hass.localize, - this._has_forecast - ); + const schema = this._schema(this.hass.localize, this._has_forecast); const data: WeatherForecastCardConfig = { show_current: true, From c4160e83689977d4668c795471c9a53db8a6083c Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 14:30:05 +0100 Subject: [PATCH 087/138] Add filter options to entity and device selectors (#15302) --- src/common/array/ensure-array.ts | 1 + src/components/device/ha-device-picker.ts | 31 +++- src/components/ha-area-picker.ts | 42 +++-- src/components/ha-areas-picker.ts | 4 +- .../ha-selector/ha-selector-area.ts | 33 ++-- .../ha-selector/ha-selector-device.ts | 56 ++++--- .../ha-selector/ha-selector-entity.ts | 22 ++- .../ha-selector/ha-selector-target.ts | 55 +++---- src/components/ha-selector/ha-selector.ts | 19 ++- src/components/ha-target-picker.ts | 102 +++++------- src/data/selector.ts | 154 ++++++++++++++---- 11 files changed, 331 insertions(+), 188 deletions(-) diff --git a/src/common/array/ensure-array.ts b/src/common/array/ensure-array.ts index cdc9ea89ed..70869a91f1 100644 --- a/src/common/array/ensure-array.ts +++ b/src/common/array/ensure-array.ts @@ -2,6 +2,7 @@ type NonUndefined = T extends undefined ? never : T; export function ensureArray(value: undefined): undefined; export function ensureArray(value: T | T[]): NonUndefined[]; +export function ensureArray(value: T | readonly T[]): NonUndefined[]; export function ensureArray(value) { if (value === undefined || Array.isArray(value)) { return value; diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 95a3332fe0..715a42c1db 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -1,5 +1,5 @@ import "@material/mwc-list/mwc-list-item"; -import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { ComboBoxLitRenderer } from "@vaadin/combo-box/lit"; import { customElement, property, query, state } from "lit/decorators"; @@ -37,6 +37,8 @@ export type HaDevicePickerDeviceFilterFunc = ( device: DeviceRegistryEntry ) => boolean; +export type HaDevicePickerEntityFilterFunc = (entity: HassEntity) => boolean; + const rowRenderer: ComboBoxLitRenderer = (item) => html` @@ -94,6 +96,8 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { @property() public deviceFilter?: HaDevicePickerDeviceFilterFunc; + @property() public entityFilter?: HaDevicePickerEntityFilterFunc; + @property({ type: Boolean }) public disabled?: boolean; @property({ type: Boolean }) public required?: boolean; @@ -113,6 +117,7 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { excludeDomains: this["excludeDomains"], includeDeviceClasses: this["includeDeviceClasses"], deviceFilter: this["deviceFilter"], + entityFilter: this["entityFilter"], excludeDevices: this["excludeDevices"] ): Device[] => { if (!devices.length) { @@ -127,7 +132,12 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { const deviceEntityLookup: DeviceEntityLookup = {}; - if (includeDomains || excludeDomains || includeDeviceClasses) { + if ( + includeDomains || + excludeDomains || + includeDeviceClasses || + entityFilter + ) { for (const entity of entities) { if (!entity.device_id) { continue; @@ -198,6 +208,22 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { }); } + if (entityFilter) { + inputDevices = inputDevices.filter((device) => { + const devEntities = deviceEntityLookup[device.id]; + if (!devEntities || !devEntities.length) { + return false; + } + return deviceEntityLookup[device.id].some((entity) => { + const stateObj = this.hass.states[entity.entity_id]; + if (!stateObj) { + return false; + } + return entityFilter(stateObj); + }); + }); + } + if (deviceFilter) { inputDevices = inputDevices.filter( (device) => @@ -274,6 +300,7 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { this.excludeDomains, this.includeDeviceClasses, this.deviceFilter, + this.entityFilter, this.excludeDevices ); } diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts index 9557836e4a..0f47ed05b9 100644 --- a/src/components/ha-area-picker.ts +++ b/src/components/ha-area-picker.ts @@ -1,4 +1,6 @@ +import "@material/mwc-list/mwc-list-item"; import { ComboBoxLitRenderer } from "@vaadin/combo-box/lit"; +import { HassEntity } from "home-assistant-js-websocket"; import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, query, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; @@ -83,7 +85,7 @@ export class HaAreaPicker extends LitElement { @property() public deviceFilter?: HaDevicePickerDeviceFilterFunc; - @property() public entityFilter?: (entity: EntityRegistryEntry) => boolean; + @property() public entityFilter?: (entity: HassEntity) => boolean; @property({ type: Boolean }) public disabled?: boolean; @@ -135,7 +137,12 @@ export class HaAreaPicker extends LitElement { let inputDevices: DeviceRegistryEntry[] | undefined; let inputEntities: EntityRegistryEntry[] | undefined; - if (includeDomains || excludeDomains || includeDeviceClasses) { + if ( + includeDomains || + excludeDomains || + includeDeviceClasses || + entityFilter + ) { for (const entity of entities) { if (!entity.device_id) { continue; @@ -145,16 +152,9 @@ export class HaAreaPicker extends LitElement { } deviceEntityLookup[entity.device_id].push(entity); } - inputDevices = devices; - inputEntities = entities.filter((entity) => entity.area_id); - } else { - if (deviceFilter) { - inputDevices = devices; - } - if (entityFilter) { - inputEntities = entities.filter((entity) => entity.area_id); - } } + inputDevices = devices; + inputEntities = entities.filter((entity) => entity.area_id); if (includeDomains) { inputDevices = inputDevices!.filter((device) => { @@ -218,9 +218,23 @@ export class HaAreaPicker extends LitElement { } if (entityFilter) { - inputEntities = inputEntities!.filter((entity) => - entityFilter!(entity) - ); + inputDevices = inputDevices!.filter((device) => { + const devEntities = deviceEntityLookup[device.id]; + if (!devEntities || !devEntities.length) { + return false; + } + return deviceEntityLookup[device.id].some((entity) => { + const stateObj = this.hass.states[entity.entity_id]; + if (!stateObj) { + return false; + } + return entityFilter(stateObj); + }); + }); + inputEntities = inputEntities!.filter((entity) => { + const stateObj = this.hass.states[entity.entity_id]; + return entityFilter!(stateObj); + }); } let outputAreas = areas; diff --git a/src/components/ha-areas-picker.ts b/src/components/ha-areas-picker.ts index 2b162e56d7..e4f2948e98 100644 --- a/src/components/ha-areas-picker.ts +++ b/src/components/ha-areas-picker.ts @@ -1,7 +1,7 @@ +import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; -import type { EntityRegistryEntry } from "../data/entity_registry"; import { SubscribeMixin } from "../mixins/subscribe-mixin"; import type { HomeAssistant } from "../types"; import type { HaDevicePickerDeviceFilterFunc } from "./device/ha-device-picker"; @@ -48,7 +48,7 @@ export class HaAreasPicker extends SubscribeMixin(LitElement) { @property() public deviceFilter?: HaDevicePickerDeviceFilterFunc; - @property() public entityFilter?: (entity: EntityRegistryEntry) => boolean; + @property() public entityFilter?: (entity: HassEntity) => boolean; @property({ attribute: "picked-area-label" }) public pickedAreaLabel?: string; diff --git a/src/components/ha-selector/ha-selector-area.ts b/src/components/ha-selector/ha-selector-area.ts index 704a36ed2c..e8c2539295 100644 --- a/src/components/ha-selector/ha-selector-area.ts +++ b/src/components/ha-selector/ha-selector-area.ts @@ -2,6 +2,7 @@ import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; +import { ensureArray } from "../../common/array/ensure-array"; import type { DeviceRegistryEntry } from "../../data/device_registry"; import { getDeviceIntegrationLookup } from "../../data/device_registry"; import { @@ -52,11 +53,21 @@ export class HaAreaSelector extends SubscribeMixin(LitElement) { ]; } + private _hasIntegration(selector: AreaSelector) { + return ( + (selector.area?.entity && + ensureArray(selector.area.entity).some( + (filter) => filter.integration + )) || + (selector.area?.device && + ensureArray(selector.area.device).some((device) => device.integration)) + ); + } + protected updated(changedProperties: PropertyValues): void { if ( changedProperties.has("selector") && - (this.selector.area?.device?.integration || - this.selector.area?.entity?.integration) && + this._hasIntegration(this.selector) && !this._entitySources ) { fetchEntitySourcesWithCache(this.hass).then((sources) => { @@ -66,11 +77,7 @@ export class HaAreaSelector extends SubscribeMixin(LitElement) { } protected render(): TemplateResult { - if ( - (this.selector.area?.device?.integration || - this.selector.area?.entity?.integration) && - !this._entitySources - ) { + if (this._hasIntegration(this.selector) && !this._entitySources) { return html``; } @@ -110,10 +117,8 @@ export class HaAreaSelector extends SubscribeMixin(LitElement) { return true; } - return filterSelectorEntities( - this.selector.area.entity, - entity, - this._entitySources + return ensureArray(this.selector.area.entity).some((filter) => + filterSelectorEntities(filter, entity, this._entitySources) ); }; @@ -127,10 +132,8 @@ export class HaAreaSelector extends SubscribeMixin(LitElement) { ? this._deviceIntegrationLookup(this._entitySources, this._entities) : undefined; - return filterSelectorDevices( - this.selector.area.device, - device, - deviceIntegrations + return ensureArray(this.selector.area.device).some((filter) => + filterSelectorDevices(filter, device, deviceIntegrations) ); }; } diff --git a/src/components/ha-selector/ha-selector-device.ts b/src/components/ha-selector/ha-selector-device.ts index e56808b766..db080201c0 100644 --- a/src/components/ha-selector/ha-selector-device.ts +++ b/src/components/ha-selector/ha-selector-device.ts @@ -1,7 +1,8 @@ -import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; +import { ensureArray } from "../../common/array/ensure-array"; import type { DeviceRegistryEntry } from "../../data/device_registry"; import { getDeviceIntegrationLookup } from "../../data/device_registry"; import { @@ -13,7 +14,10 @@ import { fetchEntitySourcesWithCache, } from "../../data/entity_sources"; import type { DeviceSelector } from "../../data/selector"; -import { filterSelectorDevices } from "../../data/selector"; +import { + filterSelectorDevices, + filterSelectorEntities, +} from "../../data/selector"; import { SubscribeMixin } from "../../mixins/subscribe-mixin"; import type { HomeAssistant } from "../../types"; import "../device/ha-device-picker"; @@ -49,11 +53,24 @@ export class HaDeviceSelector extends SubscribeMixin(LitElement) { ]; } + private _hasIntegration(selector: DeviceSelector) { + return ( + (selector.device?.filter && + ensureArray(selector.device.filter).some( + (filter) => filter.integration + )) || + (selector.device?.entity && + ensureArray(selector.device.entity).some( + (device) => device.integration + )) + ); + } + protected updated(changedProperties): void { super.updated(changedProperties); if ( changedProperties.has("selector") && - this.selector.device?.integration && + this._hasIntegration(this.selector) && !this._entitySources ) { fetchEntitySourcesWithCache(this.hass).then((sources) => { @@ -63,7 +80,7 @@ export class HaDeviceSelector extends SubscribeMixin(LitElement) { } protected render() { - if (this.selector.device?.integration && !this._entitySources) { + if (this._hasIntegration(this.selector) && !this._entitySources) { return html``; } @@ -75,12 +92,7 @@ export class HaDeviceSelector extends SubscribeMixin(LitElement) { .label=${this.label} .helper=${this.helper} .deviceFilter=${this._filterDevices} - .includeDeviceClasses=${this.selector.device?.entity?.device_class - ? [this.selector.device.entity.device_class] - : undefined} - .includeDomains=${this.selector.device?.entity?.domain - ? [this.selector.device.entity.domain] - : undefined} + .entityFilter=${this._filterEntities} .disabled=${this.disabled} .required=${this.required} allow-custom-entity @@ -95,12 +107,7 @@ export class HaDeviceSelector extends SubscribeMixin(LitElement) { .value=${this.value} .helper=${this.helper} .deviceFilter=${this._filterDevices} - .includeDeviceClasses=${this.selector.device.entity?.device_class - ? [this.selector.device.entity.device_class] - : undefined} - .includeDomains=${this.selector.device.entity?.domain - ? [this.selector.device.entity.domain] - : undefined} + .entityFilter=${this._filterEntities} .disabled=${this.disabled} .required=${this.required} > @@ -108,18 +115,25 @@ export class HaDeviceSelector extends SubscribeMixin(LitElement) { } private _filterDevices = (device: DeviceRegistryEntry): boolean => { + if (!this.selector.device?.filter) { + return true; + } const deviceIntegrations = this._entitySources && this._entities ? this._deviceIntegrationLookup(this._entitySources, this._entities) : undefined; - if (!this.selector.device) { + return ensureArray(this.selector.device.filter).some((filter) => + filterSelectorDevices(filter, device, deviceIntegrations) + ); + }; + + private _filterEntities = (entity: HassEntity): boolean => { + if (!this.selector.device?.entity) { return true; } - return filterSelectorDevices( - this.selector.device, - device, - deviceIntegrations + return ensureArray(this.selector.device.entity).some((filter) => + filterSelectorEntities(filter, entity, this._entitySources) ); }; } diff --git a/src/components/ha-selector/ha-selector-entity.ts b/src/components/ha-selector/ha-selector-entity.ts index b56ecf1723..6138b274a7 100644 --- a/src/components/ha-selector/ha-selector-entity.ts +++ b/src/components/ha-selector/ha-selector-entity.ts @@ -1,6 +1,7 @@ import { HassEntity } from "home-assistant-js-websocket"; import { html, LitElement, PropertyValues } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { ensureArray } from "../../common/array/ensure-array"; import { EntitySources, fetchEntitySourcesWithCache, @@ -29,7 +30,18 @@ export class HaEntitySelector extends LitElement { @property({ type: Boolean }) public required = true; + private _hasIntegration(selector: EntitySelector) { + return ( + selector.entity?.filter && + ensureArray(selector.entity.filter).some((filter) => filter.integration) + ); + } + protected render() { + if (this._hasIntegration(this.selector) && !this._entitySources) { + return html``; + } + if (!this.selector.entity?.multiple) { return html` { @@ -74,13 +86,11 @@ export class HaEntitySelector extends LitElement { } private _filterEntities = (entity: HassEntity): boolean => { - if (!this.selector?.entity) { + if (!this.selector?.entity?.filter) { return true; } - return filterSelectorEntities( - this.selector.entity, - entity, - this._entitySources + return ensureArray(this.selector.entity.filter).some((filter) => + filterSelectorEntities(filter, entity, this._entitySources) ); }; } diff --git a/src/components/ha-selector/ha-selector-target.ts b/src/components/ha-selector/ha-selector-target.ts index 9853d1552e..6a0b2a4dcc 100644 --- a/src/components/ha-selector/ha-selector-target.ts +++ b/src/components/ha-selector/ha-selector-target.ts @@ -14,7 +14,6 @@ import { DeviceRegistryEntry, getDeviceIntegrationLookup, } from "../../data/device_registry"; -import { EntityRegistryEntry } from "../../data/entity_registry"; import { EntitySources, fetchEntitySourcesWithCache, @@ -45,12 +44,24 @@ export class HaTargetSelector extends LitElement { private _deviceIntegrationLookup = memoizeOne(getDeviceIntegrationLookup); + private _hasIntegration(selector: TargetSelector) { + return ( + (selector.target?.entity && + ensureArray(selector.target.entity).some( + (filter) => filter.integration + )) || + (selector.target?.device && + ensureArray(selector.target.device).some( + (device) => device.integration + )) + ); + } + protected updated(changedProperties: PropertyValues): void { super.updated(changedProperties); if ( changedProperties.has("selector") && - (this.selector.target?.device?.integration || - this.selector.target?.entity?.integration) && + this._hasIntegration(this.selector) && !this._entitySources ) { fetchEntitySourcesWithCache(this.hass).then((sources) => { @@ -60,11 +71,7 @@ export class HaTargetSelector extends LitElement { } protected render(): TemplateResult { - if ( - (this.selector.target?.device?.integration || - this.selector.target?.entity?.integration) && - !this._entitySources - ) { + if (this._hasIntegration(this.selector) && !this._entitySources) { return html``; } @@ -73,39 +80,21 @@ export class HaTargetSelector extends LitElement { .value=${this.value} .helper=${this.helper} .deviceFilter=${this._filterDevices} - .entityFilter=${this._filterStates} - .entityRegFilter=${this._filterRegEntities} - .includeDeviceClasses=${this.selector.target?.entity?.device_class - ? [this.selector.target?.entity.device_class] - : undefined} - .includeDomains=${this.selector.target?.entity?.domain - ? ensureArray(this.selector.target.entity.domain as string | string[]) - : undefined} + .entityFilter=${this._filterEntities} .disabled=${this.disabled} >`; } - private _filterStates = (entity: HassEntity): boolean => { + private _filterEntities = (entity: HassEntity): boolean => { if (!this.selector.target?.entity) { return true; } - return filterSelectorEntities( - this.selector.target.entity, - entity, - this._entitySources + return ensureArray(this.selector.target.entity).some((filter) => + filterSelectorEntities(filter, entity, this._entitySources) ); }; - private _filterRegEntities = (entity: EntityRegistryEntry): boolean => { - if (this.selector.target?.entity?.integration) { - if (entity.platform !== this.selector.target.entity.integration) { - return false; - } - } - return true; - }; - private _filterDevices = (device: DeviceRegistryEntry): boolean => { if (!this.selector.target?.device) { return true; @@ -118,10 +107,8 @@ export class HaTargetSelector extends LitElement { ) : undefined; - return filterSelectorDevices( - this.selector.target.device, - device, - deviceIntegrations + return ensureArray(this.selector.target.device).some((filter) => + filterSelectorDevices(filter, device, deviceIntegrations) ); }; diff --git a/src/components/ha-selector/ha-selector.ts b/src/components/ha-selector/ha-selector.ts index 1f44b3503f..b613245545 100644 --- a/src/components/ha-selector/ha-selector.ts +++ b/src/components/ha-selector/ha-selector.ts @@ -1,7 +1,12 @@ import { html, LitElement, PropertyValues } from "lit"; import { customElement, property } from "lit/decorators"; +import memoizeOne from "memoize-one"; import { dynamicElement } from "../../common/dom/dynamic-element-directive"; -import type { Selector } from "../../data/selector"; +import { + Selector, + handleLegacyEntitySelector, + handleLegacyDeviceSelector, +} from "../../data/selector"; import type { HomeAssistant } from "../../types"; const LOAD_ELEMENTS = { @@ -75,12 +80,22 @@ export class HaSelector extends LitElement { } } + private _handleLegacySelector = memoizeOne((selector: Selector) => { + if ("entity" in selector) { + return handleLegacyEntitySelector(selector); + } + if ("device" in selector) { + return handleLegacyDeviceSelector(selector); + } + return selector; + }); + protected render() { return html` ${dynamicElement(`ha-selector-${this._type}`, { hass: this.hass, name: this.name, - selector: this.selector, + selector: this._handleLegacySelector(this.selector), value: this.value, label: this.label, placeholder: this.placeholder, diff --git a/src/components/ha-target-picker.ts b/src/components/ha-target-picker.ts index 3aa581b441..599720075a 100644 --- a/src/components/ha-target-picker.ts +++ b/src/components/ha-target-picker.ts @@ -9,32 +9,19 @@ import { mdiUnfoldMoreVertical, } from "@mdi/js"; import "@polymer/paper-tooltip/paper-tooltip"; -import { - HassEntity, - HassServiceTarget, - UnsubscribeFunc, -} from "home-assistant-js-websocket"; +import { HassEntity, HassServiceTarget } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, unsafeCSS } from "lit"; import { customElement, property, query, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; -import { fireEvent } from "../common/dom/fire_event"; import { ensureArray } from "../common/array/ensure-array"; +import { fireEvent } from "../common/dom/fire_event"; import { computeDomain } from "../common/entity/compute_domain"; import { computeStateName } from "../common/entity/compute_state_name"; -import { - AreaRegistryEntry, - subscribeAreaRegistry, -} from "../data/area_registry"; import { computeDeviceName, DeviceRegistryEntry, - subscribeDeviceRegistry, } from "../data/device_registry"; -import { - EntityRegistryEntry, - subscribeEntityRegistry, -} from "../data/entity_registry"; -import { SubscribeMixin } from "../mixins/subscribe-mixin"; +import { EntityRegistryEntry } from "../data/entity_registry"; import { HomeAssistant } from "../types"; import "./device/ha-device-picker"; import type { HaDevicePickerDeviceFilterFunc } from "./device/ha-device-picker"; @@ -46,7 +33,7 @@ import "./ha-input-helper-text"; import "./ha-svg-icon"; @customElement("ha-target-picker") -export class HaTargetPicker extends SubscribeMixin(LitElement) { +export class HaTargetPicker extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public value?: HassServiceTarget; @@ -73,52 +60,17 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { @property() public deviceFilter?: HaDevicePickerDeviceFilterFunc; - @property() public entityRegFilter?: (entity: EntityRegistryEntry) => boolean; - @property() public entityFilter?: HaEntityPickerEntityFilterFunc; @property({ type: Boolean, reflect: true }) public disabled = false; @property({ type: Boolean }) public horizontal = false; - @state() private _areas?: { [areaId: string]: AreaRegistryEntry }; - - @state() private _devices?: { - [deviceId: string]: DeviceRegistryEntry; - }; - - @state() private _entities?: EntityRegistryEntry[]; - @state() private _addMode?: "area_id" | "entity_id" | "device_id"; @query("#input") private _inputElement?; - public hassSubscribe(): UnsubscribeFunc[] { - return [ - subscribeAreaRegistry(this.hass.connection!, (areas) => { - const areaLookup: { [areaId: string]: AreaRegistryEntry } = {}; - for (const area of areas) { - areaLookup[area.area_id] = area; - } - this._areas = areaLookup; - }), - subscribeDeviceRegistry(this.hass.connection!, (devices) => { - const deviceLookup: { [deviceId: string]: DeviceRegistryEntry } = {}; - for (const device of devices) { - deviceLookup[device.id] = device; - } - this._devices = deviceLookup; - }), - subscribeEntityRegistry(this.hass.connection!, (entities) => { - this._entities = entities; - }), - ]; - } - protected render() { - if (!this._areas || !this._devices || !this._entities) { - return html``; - } return html` ${this.horizontal ? html` @@ -141,7 +93,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) {
    ${this.value?.area_id ? ensureArray(this.value.area_id).map((area_id) => { - const area = this._areas![area_id]; + const area = this.hass.devices![area_id]; return this._renderChip( "area_id", area_id, @@ -153,7 +105,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { : ""} ${this.value?.device_id ? ensureArray(this.value.device_id).map((device_id) => { - const device = this._devices![device_id]; + const device = this.hass.devices![device_id]; return this._renderChip( "device_id", device_id, @@ -342,7 +294,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { )} no-add .deviceFilter=${this.deviceFilter} - .entityFilter=${this.entityRegFilter} + .entityFilter=${this.entityFilter} .includeDeviceClasses=${this.includeDeviceClasses} .includeDomains=${this.includeDomains} .excludeAreas=${ensureArray(this.value?.area_id)} @@ -359,6 +311,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { "ui.components.target-picker.add_device_id" )} .deviceFilter=${this.deviceFilter} + .entityFilter=${this.entityFilter} .includeDeviceClasses=${this.includeDeviceClasses} .includeDomains=${this.includeDomains} .excludeDevices=${ensureArray(this.value?.device_id)} @@ -419,7 +372,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { const newDevices: string[] = []; const newEntities: string[] = []; if (target.type === "area_id") { - Object.values(this._devices!).forEach((device) => { + Object.values(this.hass.devices).forEach((device) => { if ( device.area_id === target.id && !this.value!.device_id?.includes(device.id) && @@ -428,7 +381,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { newDevices.push(device.id); } }); - this._entities!.forEach((entity) => { + Object.values(this.hass.entities).forEach((entity) => { if ( entity.area_id === target.id && !this.value!.entity_id?.includes(entity.entity_id) && @@ -438,7 +391,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { } }); } else if (target.type === "device_id") { - this._entities!.forEach((entity) => { + Object.values(this.hass.entities).forEach((entity) => { if ( entity.device_id === target.id && !this.value!.entity_id?.includes(entity.entity_id) && @@ -502,9 +455,10 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { } private _deviceMeetsFilter(device: DeviceRegistryEntry): boolean { - const devEntities = this._entities?.filter( + const devEntities = Object.values(this.hass.entities).filter( (entity) => entity.device_id === device.id ); + if (this.includeDomains) { if (!devEntities || !devEntities.length) { return false; @@ -541,7 +495,23 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { } if (this.deviceFilter) { - return this.deviceFilter(device); + if (!this.deviceFilter(device)) { + return false; + } + } + + if (this.entityFilter) { + if ( + !devEntities.some((entity) => { + const stateObj = this.hass.states[entity.entity_id]; + if (!stateObj) { + return false; + } + return this.entityFilter!(stateObj); + }) + ) { + return false; + } } return true; } @@ -550,6 +520,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { if (entity.entity_category) { return false; } + if ( this.includeDomains && !this.includeDomains.includes(computeDomain(entity.entity_id)) @@ -568,8 +539,15 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) { return false; } } - if (this.entityRegFilter) { - return this.entityRegFilter(entity); + + if (this.entityFilter) { + const stateObj = this.hass.states[entity.entity_id]; + if (!stateObj) { + return false; + } + if (!this.entityFilter!(stateObj)) { + return false; + } } return true; } diff --git a/src/data/selector.ts b/src/data/selector.ts index e8012b49d1..3ac4661a87 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -16,8 +16,10 @@ export type Selector = | DateSelector | DateTimeSelector | DeviceSelector + | LegacyDeviceSelector | DurationSelector | EntitySelector + | LegacyEntitySelector | FileSelector | IconSelector | LocationSelector @@ -48,22 +50,10 @@ export interface AddonSelector { } | null; } -export interface SelectorDevice { - integration?: NonNullable["integration"]; - manufacturer?: NonNullable["manufacturer"]; - model?: NonNullable["model"]; -} - -export interface SelectorEntity { - integration?: NonNullable["integration"]; - domain?: NonNullable["domain"]; - device_class?: NonNullable["device_class"]; -} - export interface AreaSelector { area: { - entity?: SelectorEntity; - device?: SelectorDevice; + entity?: EntitySelectorFilter | readonly EntitySelectorFilter[]; + device?: DeviceSelectorFilter | readonly DeviceSelectorFilter[]; multiple?: boolean; } | null; } @@ -108,33 +98,77 @@ export interface DateTimeSelector { datetime: {} | null; } +interface DeviceSelectorFilter { + integration?: string; + manufacturer?: string; + model?: string; +} + export interface DeviceSelector { device: { - integration?: string; - manufacturer?: string; - model?: string; - entity?: SelectorEntity; + filter?: DeviceSelectorFilter | readonly DeviceSelectorFilter[]; + entity?: EntitySelectorFilter | readonly EntitySelectorFilter[]; multiple?: boolean; } | null; } +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"]; + }; +} + export interface DurationSelector { duration: { enable_day?: boolean; } | null; } +interface EntitySelectorFilter { + integration?: string; + domain?: string | readonly string[]; + device_class?: string | readonly string[]; +} + export interface EntitySelector { entity: { - integration?: string; - domain?: string | readonly string[]; - device_class?: string; multiple?: boolean; include_entities?: string[]; exclude_entities?: string[]; + filter?: EntitySelectorFilter | readonly EntitySelectorFilter[]; } | null; } +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"]; + }; +} + export interface StatisticSelector { statistic: { device_class?: string; @@ -250,8 +284,8 @@ export interface StringSelector { export interface TargetSelector { target: { - entity?: SelectorEntity; - device?: SelectorDevice; + entity?: EntitySelectorFilter | readonly EntitySelectorFilter[]; + device?: DeviceSelectorFilter | readonly DeviceSelectorFilter[]; } | null; } @@ -281,7 +315,7 @@ export interface UiColorSelector { } export const filterSelectorDevices = ( - filterDevice: SelectorDevice, + filterDevice: DeviceSelectorFilter, device: DeviceRegistryEntry, deviceIntegrationLookup: Record | undefined ): boolean => { @@ -308,7 +342,7 @@ export const filterSelectorDevices = ( }; export const filterSelectorEntities = ( - filterEntity: SelectorEntity, + filterEntity: EntitySelectorFilter, entity: HassEntity, entitySources?: EntitySources ): boolean => { @@ -329,11 +363,15 @@ export const filterSelectorEntities = ( } } - if ( - filterDeviceClass && - entity.attributes.device_class !== filterDeviceClass - ) { - return false; + if (filterDeviceClass) { + const entityDeviceClass = entity.attributes.device_class; + if ( + entityDeviceClass && Array.isArray(filterDeviceClass) + ? !filterDeviceClass.includes(entityDeviceClass) + : entityDeviceClass !== filterDeviceClass + ) { + return false; + } } if ( @@ -345,3 +383,59 @@ export const filterSelectorEntities = ( return true; }; + +export const handleLegacyEntitySelector = ( + selector: LegacyEntitySelector | EntitySelector +): EntitySelector => { + if (!selector.entity) return { entity: null }; + + if ("filter" in selector.entity) return selector; + + const { domain, integration, device_class, ...rest } = ( + selector as LegacyEntitySelector + ).entity!; + + if (domain || integration || device_class) { + return { + entity: { + ...rest, + filter: { + domain, + integration, + device_class, + }, + }, + }; + } + return { + entity: rest, + }; +}; + +export const handleLegacyDeviceSelector = ( + selector: LegacyDeviceSelector | DeviceSelector +): DeviceSelector => { + if (!selector.device) return { device: null }; + + if ("filter" in selector.device) return selector; + + const { integration, manufacturer, model, ...rest } = ( + selector as LegacyDeviceSelector + ).device!; + + if (integration || manufacturer || model) { + return { + device: { + ...rest, + filter: { + integration, + manufacturer, + model, + }, + }, + }; + } + return { + device: rest, + }; +}; From e91a477b8b4a158c11a57fa14866625c39611e3d Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 14:30:38 +0100 Subject: [PATCH 088/138] Fix alert padding inside more info dialog (#15477) --- src/dialogs/more-info/ha-more-info-dialog.ts | 19 ++++++++++--------- src/dialogs/more-info/ha-more-info-info.ts | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 02eb06b797..cc282e5e1d 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -274,6 +274,7 @@ export class MoreInfoDialog extends LitElement { --dialog-content-position: static; --vertical-align-dialog: flex-start; --dialog-content-padding: 0; + --content-padding: 24px; } ha-header-bar { @@ -299,11 +300,17 @@ export class MoreInfoDialog extends LitElement { } ha-dialog .content { - padding: 24px; + padding: var(--content-padding); } - :host([tab="settings"]) ha-dialog .content { - padding: 0px; + :host([tab="settings"]) ha-dialog { + --content-padding: 0; + } + + :host([tab="info"]) ha-dialog[data-domain="camera"] { + --content-padding: 0; + /* max height of the video is full screen, minus the height of the header of the dialog and the padding of the dialog (mdc-dialog-max-height: calc(100% - 72px)) */ + --video-max-height: calc(100vh - 113px - 72px); } @media all and (min-width: 600px) and (min-height: 501px) { @@ -325,12 +332,6 @@ export class MoreInfoDialog extends LitElement { --mdc-dialog-max-width: 90vw; } } - - :host([tab="info"]) ha-dialog[data-domain="camera"] .content { - padding: 0; - /* max height of the video is full screen, minus the height of the header of the dialog and the padding of the dialog (mdc-dialog-max-height: calc(100% - 72px)) */ - --video-max-height: calc(100vh - 113px - 72px); - } `, ]; } diff --git a/src/dialogs/more-info/ha-more-info-info.ts b/src/dialogs/more-info/ha-more-info-info.ts index 005cf6278b..85cb076a4e 100644 --- a/src/dialogs/more-info/ha-more-info-info.ts +++ b/src/dialogs/more-info/ha-more-info-info.ts @@ -99,9 +99,9 @@ export class MoreInfoInfo extends LitElement { ha-alert { display: block; - margin: calc(-1 * var(--dialog-content-padding, 24px)) - calc(-1 * var(--dialog-content-padding, 24px)) 16px - calc(-1 * var(--dialog-content-padding, 24px)); + margin: calc(-1 * var(--content-padding, 24px)) + calc(-1 * var(--content-padding, 24px)) 16px + calc(-1 * var(--content-padding, 24px)); } `; } From 1ab1cf0fab48e5f63e19d2d49c2593567acb467e Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 14:32:13 +0100 Subject: [PATCH 089/138] Add support for buffering state in media browser (#15459) --- src/data/media-player.ts | 4 +++- .../media-browser/browser-media-player.ts | 22 +++++++++---------- .../media-browser/ha-bar-media-player.ts | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/data/media-player.ts b/src/data/media-player.ts index 657b2bbf41..c666c0ec52 100644 --- a/src/data/media-player.ts +++ b/src/data/media-player.ts @@ -73,7 +73,9 @@ export interface MediaPlayerEntity extends HassEntityBase { | "off" | "on" | "unavailable" - | "unknown"; + | "unknown" + | "standby" + | "buffering"; } export const enum MediaPlayerEntityFeature { diff --git a/src/panels/media-browser/browser-media-player.ts b/src/panels/media-browser/browser-media-player.ts index 53aa891a7b..d8c082f1ac 100644 --- a/src/panels/media-browser/browser-media-player.ts +++ b/src/panels/media-browser/browser-media-player.ts @@ -70,10 +70,6 @@ export class BrowserMediaPlayer { } } - public get isPlaying(): boolean { - return this.buffering || (!this.player.paused && !this.player.ended); - } - static idleStateObj(): MediaPlayerEntity { const now = new Date().toISOString(); return { @@ -88,9 +84,13 @@ export class BrowserMediaPlayer { toStateObj(): MediaPlayerEntity { // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement - const base = BrowserMediaPlayer.idleStateObj(); - base.state = this.isPlaying ? "playing" : "paused"; - base.attributes = { + const stateObj = BrowserMediaPlayer.idleStateObj(); + stateObj.state = this.buffering + ? "buffering" + : this.player.paused || this.player.ended + ? "paused" + : "playing"; + stateObj.attributes = { media_title: this.item.title, entity_picture: this.item.thumbnail, volume_level: this.player.volume, @@ -103,10 +103,10 @@ export class BrowserMediaPlayer { }; if (this.player.duration) { - base.attributes.media_duration = this.player.duration; - base.attributes.media_position = this.player.currentTime; - base.attributes.media_position_updated_at = base.last_updated; + stateObj.attributes.media_duration = this.player.duration; + stateObj.attributes.media_position = this.player.currentTime; + stateObj.attributes.media_position_updated_at = stateObj.last_updated; } - return base; + return stateObj; } } diff --git a/src/panels/media-browser/ha-bar-media-player.ts b/src/panels/media-browser/ha-bar-media-player.ts index 17e2986ab5..c41d57c9a8 100644 --- a/src/panels/media-browser/ha-bar-media-player.ts +++ b/src/panels/media-browser/ha-bar-media-player.ts @@ -244,7 +244,7 @@ export class BarMediaPlayer extends SubscribeMixin(LitElement) {
    - ${this._browserPlayer?.buffering + ${stateObj.state === "buffering" ? html` ` : html`
    From 9c42eb5130850d8d43862b363d78849b6526c714 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 14:41:58 +0100 Subject: [PATCH 090/138] Add better focus style for tile card when theme use box-shadow (#15476) --- src/components/ha-bar-slider.ts | 1 + src/components/ha-bar-switch.ts | 1 + src/panels/lovelace/cards/hui-tile-card.ts | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/ha-bar-slider.ts b/src/components/ha-bar-slider.ts index 51bd09df6a..5854e06148 100644 --- a/src/components/ha-bar-slider.ts +++ b/src/components/ha-bar-slider.ts @@ -280,6 +280,7 @@ export class HaBarSlider extends LitElement { width: 100%; border-radius: var(--slider-bar-border-radius); outline: none; + transition: box-shadow 180ms ease-in-out; } :host(:focus-visible) { box-shadow: 0 0 0 2px var(--slider-bar-color); diff --git a/src/components/ha-bar-switch.ts b/src/components/ha-bar-switch.ts index c2e6b9d782..59f851923c 100644 --- a/src/components/ha-bar-switch.ts +++ b/src/components/ha-bar-switch.ts @@ -106,6 +106,7 @@ export class HaBarSwitch extends LitElement { cursor: pointer; border-radius: var(--switch-bar-border-radius); outline: none; + transition: box-shadow 180ms ease-in-out; } :host(:focus-visible) { box-shadow: 0 0 0 2px var(--switch-bar-off-color); diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 25b4eb071f..9f30749c03 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -422,14 +422,17 @@ export class HuiTileCard extends LitElement implements LovelaceCard { -webkit-tap-highlight-color: transparent; } ha-card:has(.background:focus-visible) { + --shadow-default: var(--ha-card-box-shadow, 0 0 0 0 transparent); + --shadow-focus: 0 0 0 1px var(--tile-color); border-color: var(--tile-color); - box-shadow: 0 0 0 1px var(--tile-color); + box-shadow: var(--shadow-default), var(--shadow-focus); } ha-card { --mdc-ripple-color: var(--tile-color); height: 100%; z-index: 0; overflow: hidden; + transition: box-shadow 180ms ease-in-out, border-color 180ms ease-in-out; } ha-card.active { --tile-color: var(--state-icon-color); From 87549471338bc0337318d13fee8c08fe93aa2ccf Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 14:58:10 +0100 Subject: [PATCH 091/138] Compact more info header (#15448) --- .../dialogs/network/dialog-hassio-network.ts | 1 - src/components/ha-header-bar.ts | 6 + src/dialogs/more-info/ha-more-info-dialog.ts | 329 +++++++++++------- .../cloud-google-assistant.ts | 5 +- .../device-detail/ha-device-entities-card.ts | 5 +- .../entities/entity-registry-settings.ts | 5 +- .../config/entities/ha-config-entities.ts | 5 +- .../config/helpers/ha-config-helpers.ts | 5 +- .../config/network/supervisor-hostname.ts | 1 - .../config/network/supervisor-network.ts | 1 - src/state/more-info-mixin.ts | 2 +- src/translations/en.json | 3 +- 12 files changed, 218 insertions(+), 150 deletions(-) diff --git a/hassio/src/dialogs/network/dialog-hassio-network.ts b/hassio/src/dialogs/network/dialog-hassio-network.ts index 103669b18b..05f6569df9 100644 --- a/hassio/src/dialogs/network/dialog-hassio-network.ts +++ b/hassio/src/dialogs/network/dialog-hassio-network.ts @@ -17,7 +17,6 @@ import "../../../../src/components/ha-formfield"; import "../../../../src/components/ha-header-bar"; import "../../../../src/components/ha-icon-button"; import "../../../../src/components/ha-radio"; -import "../../../../src/components/ha-related-items"; import { extractApiErrorMessage } from "../../../../src/data/hassio/common"; import { AccessPoints, diff --git a/src/components/ha-header-bar.ts b/src/components/ha-header-bar.ts index 68111455af..c778b00331 100644 --- a/src/components/ha-header-bar.ts +++ b/src/components/ha-header-bar.ts @@ -36,6 +36,12 @@ export class HaHeaderBar extends LitElement { position: static; color: var(--mdc-theme-on-primary, #fff); } + .mdc-top-app-bar__section.mdc-top-app-bar__section--align-start { + flex: 1; + } + .mdc-top-app-bar__section.mdc-top-app-bar__section--align-end { + flex: none; + } `, ]; } diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index cc282e5e1d..77adbfff55 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -1,41 +1,54 @@ +import { + mdiChartBoxOutline, + mdiClose, + mdiCogOutline, + mdiDevices, + mdiDotsVertical, + mdiInformationOutline, + mdiPencilOutline, +} from "@mdi/js"; import type { HassEntity } from "home-assistant-js-websocket"; -import "@material/mwc-button"; -import "@material/mwc-tab"; -import "@material/mwc-tab-bar"; -import { mdiClose, mdiPencil } from "@mdi/js"; import { css, html, LitElement, PropertyValues } from "lit"; import { customElement, property, state } from "lit/decorators"; import { cache } from "lit/directives/cache"; import { fireEvent } from "../../common/dom/fire_event"; +import { stopPropagation } from "../../common/dom/stop_propagation"; import { computeDomain } from "../../common/entity/compute_domain"; import { computeStateName } from "../../common/entity/compute_state_name"; +import { shouldHandleRequestSelectedEvent } from "../../common/mwc/handle-request-selected-event"; import { navigate } from "../../common/navigate"; +import "../../components/ha-button-menu"; import "../../components/ha-dialog"; import "../../components/ha-header-bar"; import "../../components/ha-icon-button"; +import "../../components/ha-icon-button-prev"; +import "../../components/ha-list-item"; import "../../components/ha-related-items"; +import { EntityRegistryEntry } from "../../data/entity_registry"; import { haStyleDialog } from "../../resources/styles"; import "../../state-summary/state-card-content"; import { HomeAssistant } from "../../types"; import { - EDITABLE_DOMAINS_WITH_ID, - EDITABLE_DOMAINS_WITH_UNIQUE_ID, - DOMAINS_WITH_MORE_INFO, computeShowHistoryComponent, computeShowLogBookComponent, + DOMAINS_WITH_MORE_INFO, + EDITABLE_DOMAINS_WITH_ID, + EDITABLE_DOMAINS_WITH_UNIQUE_ID, } from "./const"; import "./controls/more-info-default"; +import "./ha-more-info-history-and-logbook"; import "./ha-more-info-info"; import "./ha-more-info-settings"; -import "./ha-more-info-history-and-logbook"; import "./more-info-content"; export interface MoreInfoDialogParams { entityId: string | null; - tab?: Tab; + view?: View; + /** @deprecated Use `view` instead */ + tab?: View; } -type Tab = "info" | "history" | "settings" | "related"; +type View = "info" | "history" | "settings" | "related"; @customElement("ha-more-info-dialog") export class MoreInfoDialog extends LitElement { @@ -45,7 +58,7 @@ export class MoreInfoDialog extends LitElement { @state() private _entityId?: string | null; - @state() private _currTab: Tab = "info"; + @state() private _currView: View = "info"; public showDialog(params: MoreInfoDialogParams) { this._entityId = params.entityId; @@ -53,7 +66,7 @@ export class MoreInfoDialog extends LitElement { this.closeDialog(); return; } - this._currTab = params.tab || "info"; + this._currView = params.view || "info"; this.large = false; } @@ -62,7 +75,7 @@ export class MoreInfoDialog extends LitElement { fireEvent(this, "dialog-closed", { dialog: this.localName }); } - protected shouldShowEditIcon( + private shouldShowEditIcon( domain: string, stateObj: HassEntity | undefined ): boolean { @@ -82,16 +95,77 @@ export class MoreInfoDialog extends LitElement { return false; } + private shouldShowHistory(domain: string): boolean { + return ( + DOMAINS_WITH_MORE_INFO.includes(domain) && + (computeShowHistoryComponent(this.hass, this._entityId!) || + computeShowLogBookComponent(this.hass, this._entityId!)) + ); + } + + private _getDeviceId(): string | null { + const entity = this.hass.entities[this._entityId!] as + | EntityRegistryEntry + | undefined; + return entity?.device_id ?? null; + } + + private back() { + this._currView = "info"; + } + + private _goToHistory() { + this._currView = "history"; + } + + private _goToSettings(): void { + this._currView = "settings"; + } + + private _goToDevice(ev): void { + if (!shouldHandleRequestSelectedEvent(ev)) return; + const deviceId = this._getDeviceId(); + + if (!deviceId) return; + + navigate(`/config/devices/device/${deviceId}`); + this.closeDialog(); + } + + private _goToEdit(ev) { + if (!shouldHandleRequestSelectedEvent(ev)) return; + const stateObj = this.hass.states[this._entityId!]; + const domain = computeDomain(this._entityId!); + let idToPassThroughUrl = stateObj.entity_id; + if (EDITABLE_DOMAINS_WITH_ID.includes(domain) || domain === "person") { + idToPassThroughUrl = stateObj.attributes.id; + } + if (EDITABLE_DOMAINS_WITH_UNIQUE_ID.includes(domain)) { + idToPassThroughUrl = this.hass.entities[this._entityId!].unique_id; + } + + navigate(`/config/${domain}/edit/${idToPassThroughUrl}`); + this.closeDialog(); + } + + private _goToRelated(ev): void { + if (!shouldHandleRequestSelectedEvent(ev)) return; + this._currView = "related"; + } + protected render() { if (!this._entityId) { - return html``; + return null; } const entityId = this._entityId; const stateObj = this.hass.states[entityId]; const domain = computeDomain(entityId); const name = (stateObj && computeStateName(stateObj)) || entityId; - const tabs = this._getTabs(entityId, this.hass.user!.is_admin); + + const isAdmin = this.hass.user!.is_admin; + + const deviceId = this._getDeviceId(); return html`
    - + ${this._currView === "info" + ? html` + + ` + : html` + + `}
    ${name}
    - ${this.shouldShowEditIcon(domain, stateObj) + ${this._currView === "info" ? html` + ${this.shouldShowHistory(domain) + ? html` + + ` + : null} - ` - : ""} -
    + ${isAdmin + ? html` + - ${tabs.length > 1 - ? html` - - ${tabs.map( - (tab) => html` - - ` - )} - - ` - : ""} + ${deviceId + ? html` + + ${this.hass.localize( + "ui.dialogs.more_info_control.device_info" + )} + + + ` + : null} + ${this.shouldShowEditIcon(domain, stateObj) + ? html` + + ${this.hass.localize( + "ui.dialogs.more_info_control.edit" + )} + + + ` + : null} + + ${this.hass.localize( + "ui.dialogs.more_info_control.related" + )} + + + ` + : null} + ` + : null} +
    ${cache( - this._currTab === "info" + this._currView === "info" ? html` ` - : this._currTab === "history" + : this._currView === "history" ? html` ` - : this._currTab === "settings" + : this._currView === "settings" ? html` this.closeDialog()); } - protected willUpdate(changedProps: PropertyValues) { - super.willUpdate(changedProps); - if (!this._entityId) { - return; - } - const tabs = this._getTabs(this._entityId, this.hass.user!.is_admin); - if (!tabs.includes(this._currTab)) { - this._currTab = tabs[0]; - } - } - protected updated(changedProps: PropertyValues) { super.updated(changedProps); - if (changedProps.has("_currTab")) { - this.setAttribute("tab", this._currTab); + if (changedProps.has("_currView")) { + this.setAttribute("view", this._currView); } } - private _getTabs(entityId: string, isAdmin: boolean): Tab[] { - const domain = computeDomain(entityId); - const tabs: Tab[] = ["info"]; - - // Info and history are combined in info when there are no - // dedicated more-info controls. If not combined, add a history tab. - if ( - DOMAINS_WITH_MORE_INFO.includes(domain) && - (computeShowHistoryComponent(this.hass, entityId) || - computeShowLogBookComponent(this.hass, entityId)) - ) { - tabs.push("history"); - } - - if (isAdmin) { - tabs.push("settings"); - tabs.push("related"); - } - - return tabs; - } - private _enlarge() { this.large = !this.large; } - private _gotoEdit() { - const stateObj = this.hass.states[this._entityId!]; - const domain = computeDomain(this._entityId!); - let idToPassThroughUrl = stateObj.entity_id; - if (EDITABLE_DOMAINS_WITH_ID.includes(domain) || domain === "person") { - idToPassThroughUrl = stateObj.attributes.id; - } - if (EDITABLE_DOMAINS_WITH_UNIQUE_ID.includes(domain)) { - idToPassThroughUrl = this.hass.entities[this._entityId!].unique_id; - } - - navigate(`/config/${domain}/edit/${idToPassThroughUrl}`); - this.closeDialog(); - } - - private _handleTabChanged(ev: CustomEvent): void { - const newTab = this._getTabs(this._entityId!, this.hass.user!.is_admin)[ - ev.detail.index - ]; - if (newTab === this._currTab) { - return; - } - - this._currTab = newTab; - } - static get styles() { return [ haStyleDialog, css` ha-dialog { --dialog-surface-position: static; - --dialog-content-position: static; + --dialog-content-position: relative; --vertical-align-dialog: flex-start; --dialog-content-padding: 0; --content-padding: 24px; @@ -282,17 +362,11 @@ export class MoreInfoDialog extends LitElement { --mdc-theme-primary: var(--mdc-theme-surface); flex-shrink: 0; display: block; + border-bottom: none; } .content { outline: none; } - @media all and (max-width: 450px), all and (max-height: 500px) { - ha-header-bar { - --mdc-theme-primary: var(--app-header-background-color); - --mdc-theme-on-primary: var(--app-header-text-color, white); - border-bottom: none; - } - } .heading { border-bottom: 1px solid @@ -303,14 +377,19 @@ export class MoreInfoDialog extends LitElement { padding: var(--content-padding); } - :host([tab="settings"]) ha-dialog { + :host([view="settings"]) ha-dialog { --content-padding: 0; } - :host([tab="info"]) ha-dialog[data-domain="camera"] { + :host([view="info"]) ha-dialog[data-domain="camera"] { --content-padding: 0; /* max height of the video is full screen, minus the height of the header of the dialog and the padding of the dialog (mdc-dialog-max-height: calc(100% - 72px)) */ - --video-max-height: calc(100vh - 113px - 72px); + --video-max-height: calc(100vh - 65px - 72px); + } + + .main-title { + overflow: hidden; + text-overflow: ellipsis; } @media all and (min-width: 600px) and (min-height: 501px) { @@ -322,8 +401,6 @@ export class MoreInfoDialog extends LitElement { } .main-title { - overflow: hidden; - text-overflow: ellipsis; cursor: default; } diff --git a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts index 48beb15d12..74918de7ca 100644 --- a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts +++ b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts @@ -482,14 +482,13 @@ class CloudGoogleAssistant extends LitElement { private _showMoreInfo(ev) { const entityId = ev.currentTarget.stateObj.entity_id; - const moreInfoTab = ev.currentTarget.moreInfoTab; - fireEvent(this, "hass-more-info", { entityId, tab: moreInfoTab }); + fireEvent(this, "hass-more-info", { entityId }); } private _showMoreInfoSettings(ev) { ev.stopPropagation(); const entityId = ev.currentTarget.stateObj.entity_id; - fireEvent(this, "hass-more-info", { entityId, tab: "settings" }); + fireEvent(this, "hass-more-info", { entityId, view: "settings" }); } private async _exposeChanged(ev: CustomEvent) { diff --git a/src/panels/config/devices/device-detail/ha-device-entities-card.ts b/src/panels/config/devices/device-detail/ha-device-entities-card.ts index e0aeffd445..c6c2a2abe2 100644 --- a/src/panels/config/devices/device-detail/ha-device-entities-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-entities-card.ts @@ -223,10 +223,7 @@ export class HaDeviceEntitiesCard extends LitElement { private _openEditEntry(ev: Event): void { const entry = (ev.currentTarget! as any).entry; - showMoreInfoDialog(this, { - entityId: entry.entity_id, - tab: "settings", - }); + showMoreInfoDialog(this, { entityId: entry.entity_id }); } private _addToLovelaceView(): void { diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index db7fbf479b..ffbf968507 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -1247,10 +1247,7 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { if (!entity) { return; } - showMoreInfoDialog(parent, { - entityId: entity.entity_id, - tab: "settings", - }); + showMoreInfoDialog(parent, { entityId: entity.entity_id }); }); }, "entity_registry_updated"); } diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index a84aea822d..733a53747e 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -916,10 +916,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { private _openEditEntry(ev: CustomEvent): void { const entityId = (ev.detail as RowClickedEvent).id; - showMoreInfoDialog(this, { - entityId, - tab: "settings", - }); + showMoreInfoDialog(this, { entityId }); } private async _loadConfigEntries() { diff --git a/src/panels/config/helpers/ha-config-helpers.ts b/src/panels/config/helpers/ha-config-helpers.ts index 8e8c8268fe..f7138bfd97 100644 --- a/src/panels/config/helpers/ha-config-helpers.ts +++ b/src/panels/config/helpers/ha-config-helpers.ts @@ -358,10 +358,7 @@ export class HaConfigHelpers extends SubscribeMixin(LitElement) { private async _openEditDialog(ev: CustomEvent): Promise { const entityId = (ev.detail as RowClickedEvent).id; - showMoreInfoDialog(this, { - entityId, - tab: "settings", - }); + showMoreInfoDialog(this, { entityId }); } private _createHelpler() { diff --git a/src/panels/config/network/supervisor-hostname.ts b/src/panels/config/network/supervisor-hostname.ts index 45a42ff711..fab91f5524 100644 --- a/src/panels/config/network/supervisor-hostname.ts +++ b/src/panels/config/network/supervisor-hostname.ts @@ -13,7 +13,6 @@ import "../../../components/ha-formfield"; import "../../../components/ha-header-bar"; import "../../../components/ha-icon-button"; import "../../../components/ha-radio"; -import "../../../components/ha-related-items"; import "../../../components/ha-settings-row"; import "../../../components/ha-textfield"; import { extractApiErrorMessage } from "../../../data/hassio/common"; diff --git a/src/panels/config/network/supervisor-network.ts b/src/panels/config/network/supervisor-network.ts index bcab99e48a..3ab1b73ef7 100644 --- a/src/panels/config/network/supervisor-network.ts +++ b/src/panels/config/network/supervisor-network.ts @@ -17,7 +17,6 @@ import "../../../components/ha-formfield"; import "../../../components/ha-header-bar"; import "../../../components/ha-icon-button"; import "../../../components/ha-radio"; -import "../../../components/ha-related-items"; import { extractApiErrorMessage } from "../../../data/hassio/common"; import { AccessPoints, diff --git a/src/state/more-info-mixin.ts b/src/state/more-info-mixin.ts index 509c1a4b7a..7b14098279 100644 --- a/src/state/more-info-mixin.ts +++ b/src/state/more-info-mixin.ts @@ -29,7 +29,7 @@ export default >(superClass: T) => "ha-more-info-dialog", { entityId: ev.detail.entityId, - tab: ev.detail.tab, + view: ev.detail.view || ev.detail.tab, }, () => import("../dialogs/more-info/ha-more-info-dialog") ); diff --git a/src/translations/en.json b/src/translations/en.json index 68853ec791..7330da095f 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -832,10 +832,11 @@ "settings": "Settings", "edit": "Edit entity", "details": "Details", - "info": "Info", + "back_to_info": "Back to info", "related": "Related", "history": "History", "logbook": "Logbook", + "device_info": "Device info", "last_changed": "Last changed", "last_updated": "Last updated", "show_more": "Show more", From d5fb924cb403e674cf8d3bbddccf38a9faa288e6 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 20 Feb 2023 06:30:40 -0800 Subject: [PATCH 092/138] Support for timestamp sensors in time trigger automation UI (#15292) * Support for timestamp sensors in time trigger automation UI * rename var * simply filter function Co-authored-by: Paul Bottein * rename var * use new entity filter options --------- Co-authored-by: Paul Bottein --- .../types/ha-automation-condition-time.ts | 24 +++++++++++++++---- .../types/ha-automation-trigger-time.ts | 9 ++++++- src/translations/en.json | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-time.ts b/src/panels/config/automation/condition/types/ha-automation-condition-time.ts index 108644ffe5..ba12359de5 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-time.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-time.ts @@ -63,7 +63,14 @@ export class HaTimeCondition extends LitElement implements ConditionElement { { name: "after", selector: inputModeAfter - ? { entity: { domain: "input_datetime" } } + ? { + entity: { + filter: [ + { domain: "input_datetime" }, + { domain: "sensor", device_class: "timestamp" }, + ], + }, + } : { time: {} }, }, { @@ -88,7 +95,14 @@ export class HaTimeCondition extends LitElement implements ConditionElement { { name: "before", selector: inputModeBefore - ? { entity: { domain: "input_datetime" } } + ? { + entity: { + filter: [ + { domain: "input_datetime" }, + { domain: "sensor", device_class: "timestamp" }, + ], + }, + } : { time: {} }, }, { @@ -111,10 +125,12 @@ export class HaTimeCondition extends LitElement implements ConditionElement { protected render() { const inputModeBefore = this._inputModeBefore ?? - this.condition.before?.startsWith("input_datetime."); + (this.condition.before?.startsWith("input_datetime.") || + this.condition.before?.startsWith("sensor.")); const inputModeAfter = this._inputModeAfter ?? - this.condition.after?.startsWith("input_datetime."); + (this.condition.after?.startsWith("input_datetime.") || + this.condition.after?.startsWith("sensor.")); const schema = this._schema( this.hass.localize, diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-time.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-time.ts index 1375312e3f..4802243785 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-time.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-time.ts @@ -26,7 +26,14 @@ export class HaTimeTrigger extends LitElement implements TriggerElement { private _schema = memoizeOne( (localize: LocalizeFunc, inputMode?: boolean) => { const atSelector = inputMode - ? { entity: { domain: "input_datetime" } } + ? { + entity: { + filter: [ + { domain: "input_datetime" }, + { domain: "sensor", device_class: "timestamp" }, + ], + }, + } : { time: {} }; return [ diff --git a/src/translations/en.json b/src/translations/en.json index 7330da095f..83fd86b304 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2131,7 +2131,7 @@ }, "time": { "type_value": "Fixed time", - "type_input": "Value of a date/time helper", + "type_input": "Value of a date/time helper or timestamp-class sensor", "label": "Time", "at": "At time", "mode": "Mode" From cabbbcf9f3e38cbfc2472e83b65019b89aff5dbe Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 16:25:53 +0100 Subject: [PATCH 093/138] Convert tile button into more generic button (#15485) * Add button group component * Add focus style * Use new component in tile card --- .../pages/components/ha-bar-button.markdown | 3 + gallery/src/pages/components/ha-bar-button.ts | 189 ++++++++++++++++++ src/components/ha-bar-button-group.ts | 63 ++++++ .../ha-tile-button.ts => ha-bar-button.ts} | 36 ++-- .../hui-cover-open-close-tile-feature.ts | 36 ++-- .../hui-cover-tilt-tile-feature.ts | 36 ++-- .../hui-vacuum-commands-tile-feature.ts | 28 +-- 7 files changed, 308 insertions(+), 83 deletions(-) create mode 100644 gallery/src/pages/components/ha-bar-button.markdown create mode 100644 gallery/src/pages/components/ha-bar-button.ts create mode 100644 src/components/ha-bar-button-group.ts rename src/components/{tile/ha-tile-button.ts => ha-bar-button.ts} (78%) diff --git a/gallery/src/pages/components/ha-bar-button.markdown b/gallery/src/pages/components/ha-bar-button.markdown new file mode 100644 index 0000000000..eb265b8f1f --- /dev/null +++ b/gallery/src/pages/components/ha-bar-button.markdown @@ -0,0 +1,3 @@ +--- +title: Bar Button +--- diff --git a/gallery/src/pages/components/ha-bar-button.ts b/gallery/src/pages/components/ha-bar-button.ts new file mode 100644 index 0000000000..fcdd0f4176 --- /dev/null +++ b/gallery/src/pages/components/ha-bar-button.ts @@ -0,0 +1,189 @@ +import { + mdiFanSpeed1, + mdiFanSpeed2, + mdiFanSpeed3, + mdiLightbulb, +} from "@mdi/js"; +import { css, html, LitElement, TemplateResult } from "lit"; +import { customElement } from "lit/decorators"; +import { ifDefined } from "lit/directives/if-defined"; +import { repeat } from "lit/directives/repeat"; +import "../../../../src/components/ha-bar-button"; +import "../../../../src/components/ha-card"; +import "../../../../src/components/ha-svg-icon"; +import "../../../../src/components/ha-bar-button-group"; + +type Button = { + label: string; + icon?: string; + class?: string; + disabled?: boolean; +}; + +const buttons: Button[] = [ + { + label: "Button", + }, + { + label: "Button and custom style", + class: "custom", + }, + { + label: "Disabled Button", + disabled: true, + }, +]; + +type ButtonGroup = { + vertical?: boolean; + class?: string; +}; + +const buttonGroups: ButtonGroup[] = [ + {}, + { + class: "custom-group", + }, +]; + +@customElement("demo-components-ha-bar-button") +export class DemoHaBarButton extends LitElement { + protected render(): TemplateResult { + return html` + + ${repeat( + buttons, + (btn) => html` +
    +
    Config: ${JSON.stringify(btn)}
    + + + +
    + ` + )} +
    + + + ${repeat( + buttonGroups, + (group) => html` +
    +
    Config: ${JSON.stringify(group)}
    + + + + + + + + + + + +
    + ` + )} +
    + +
    +

    Vertical

    +
    + ${repeat( + buttonGroups, + (group) => html` + + + + + + + + + + + + ` + )} +
    +
    +
    + `; + } + + static get styles() { + return css` + ha-card { + max-width: 600px; + margin: 24px auto; + } + pre { + margin-top: 0; + margin-bottom: 8px; + } + p { + margin: 0; + } + label { + font-weight: 600; + } + .custom { + --button-bar-icon-color: var(--primary-color); + --button-bar-background-color: var(--primary-color); + --button-bar-background-opacity: 0.2; + --button-bar-border-radius: 18px; + height: 100px; + width: 100px; + } + .custom-group { + --button-bar-group-thickness: 100px; + --button-bar-group-border-radius: 18px; + --button-bar-group-spacing: 20px; + } + .custom-group ha-bar-button { + --button-bar-border-radius: 18px; + --mdc-icon-size: 32px; + } + .vertical-buttons { + height: 300px; + display: flex; + flex-direction: row; + justify-content: space-between; + } + p.title { + margin-bottom: 12px; + } + .vertical-switches > *:not(:last-child) { + margin-right: 4px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "demo-components-ha-bar-button": DemoHaBarButton; + } +} diff --git a/src/components/ha-bar-button-group.ts b/src/components/ha-bar-button-group.ts new file mode 100644 index 0000000000..030e4a9e3c --- /dev/null +++ b/src/components/ha-bar-button-group.ts @@ -0,0 +1,63 @@ +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property } from "lit/decorators"; + +@customElement("ha-bar-button-group") +export class HaBarButtonGroup extends LitElement { + @property({ type: Boolean, reflect: true }) + public vertical = false; + + protected render(): TemplateResult { + return html` +
    + +
    + `; + } + + static get styles(): CSSResultGroup { + return css` + :host { + --button-bar-group-spacing: 12px; + --button-bar-group-thickness: 40px; + height: var(--button-bar-group-thickness); + width: auto; + display: block; + } + .container { + display: flex; + flex-direction: row; + width: 100%; + height: 100%; + } + ::slotted(*) { + flex: 1; + height: 100%; + width: 100%; + } + ::slotted(*:not(:last-child)) { + margin-right: var(--button-bar-group-spacing); + margin-inline-end: var(--button-bar-group-spacing); + margin-inline-start: initial; + direction: var(--direction); + } + :host([vertical]) { + width: var(--button-bar-group-thickness); + height: auto; + } + :host([vertical]) .container { + flex-direction: column; + } + :host([vertical]) ::slotted(ha-bar-button:not(:last-child)) { + margin-right: initial; + margin-inline-end: initial; + margin-bottom: var(--button-bar-group-spacing); + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-bar-button-group": HaBarButtonGroup; + } +} diff --git a/src/components/tile/ha-tile-button.ts b/src/components/ha-bar-button.ts similarity index 78% rename from src/components/tile/ha-tile-button.ts rename to src/components/ha-bar-button.ts index 321536d8eb..e8a8f6f47e 100644 --- a/src/components/tile/ha-tile-button.ts +++ b/src/components/ha-bar-button.ts @@ -9,11 +9,9 @@ import { state, } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; -import "../ha-icon"; -import "../ha-svg-icon"; -@customElement("ha-tile-button") -export class HaTileButton extends LitElement { +@customElement("ha-bar-button") +export class HaBarButton extends LitElement { @property({ type: Boolean, reflect: true }) disabled = false; @property() public label?: string; @@ -28,7 +26,7 @@ export class HaTileButton extends LitElement { type="button" class="button" aria-label=${ifDefined(this.label)} - .title=${this.label} + title=${ifDefined(this.label)} .disabled=${Boolean(this.disabled)} @focus=${this.handleRippleFocus} @blur=${this.handleRippleBlur} @@ -81,9 +79,11 @@ export class HaTileButton extends LitElement { static get styles(): CSSResultGroup { return css` :host { - --tile-button-icon-color: var(--primary-text-color); - --tile-button-background-color: var(--disabled-color); - --tile-button-background-opacity: 0.2; + display: block; + --button-bar-icon-color: var(--primary-text-color); + --button-bar-background-color: var(--disabled-color); + --button-bar-background-opacity: 0.2; + --button-bar-border-radius: 10px; width: 40px; height: 40px; -webkit-tap-highlight-color: transparent; @@ -97,7 +97,7 @@ export class HaTileButton extends LitElement { justify-content: center; width: 100%; height: 100%; - border-radius: 10px; + border-radius: var(--button-bar-border-radius); border: none; margin: 0; padding: 0; @@ -106,7 +106,8 @@ export class HaTileButton extends LitElement { outline: none; overflow: hidden; background: none; - --mdc-ripple-color: var(--tile-button-background-color); + z-index: 1; + --mdc-ripple-color: var(--button-bar-background-color); } .button::before { content: ""; @@ -115,22 +116,21 @@ export class HaTileButton extends LitElement { left: 0; height: 100%; width: 100%; - background-color: var(--tile-button-background-color); + background-color: var(--button-bar-background-color); transition: background-color 180ms ease-in-out, opacity 180ms ease-in-out; - opacity: var(--tile-button-background-opacity); + opacity: var(--button-bar-background-opacity); } .button ::slotted(*) { - --mdc-icon-size: 20px; transition: color 180ms ease-in-out; - color: var(--tile-button-icon-color); + color: var(--button-bar-icon-color); pointer-events: none; } .button:disabled { cursor: not-allowed; - --tile-button-background-color: var(--disabled-color); - --tile-button-icon-color: var(--disabled-text-color); - --tile-button-background-opacity: 0.2; + --button-bar-background-color: var(--disabled-color); + --button-bar-icon-color: var(--disabled-text-color); + --button-bar-background-opacity: 0.2; } `; } @@ -138,6 +138,6 @@ export class HaTileButton extends LitElement { declare global { interface HTMLElementTagNameMap { - "ha-tile-button": HaTileButton; + "ha-bar-button": HaBarButton; } } diff --git a/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts b/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts index 05d4e6dce7..6f75c8c4cf 100644 --- a/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts @@ -7,7 +7,8 @@ import { computeOpenIcon, } from "../../../common/entity/cover_icon"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import "../../../components/tile/ha-tile-button"; +import "../../../components/ha-bar-button"; +import "../../../components/ha-bar-button-group"; import { canClose, canOpen, @@ -69,10 +70,10 @@ class HuiCoverOpenCloseTileFeature } return html` -
    + ${supportsFeature(this.stateObj, CoverEntityFeature.OPEN) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.STOP) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.CLOSE) ? html` - - + ` : undefined} -
    + `; } static get styles() { return css` - .container { - display: flex; - flex-direction: row; - padding: 0 12px 12px 12px; - width: auto; - } - ha-tile-button { - flex: 1; - } - ha-tile-button:not(:last-child) { - margin-right: 12px; - margin-inline-end: 12px; - margin-inline-start: initial; - direction: var(--direction); + ha-bar-button-group { + margin: 0 12px 12px 12px; + --button-bar-group-spacing: 12px; } `; } diff --git a/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts b/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts index 018a0fb307..ca22b29fc1 100644 --- a/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts @@ -3,7 +3,8 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import "../../../components/tile/ha-tile-button"; +import "../../../components/ha-bar-button"; +import "../../../components/ha-bar-button-group"; import { canCloseTilt, canOpenTilt, @@ -65,10 +66,10 @@ class HuiCoverTiltTileFeature } return html` -
    + ${supportsFeature(this.stateObj, CoverEntityFeature.OPEN_TILT) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.STOP_TILT) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.CLOSE_TILT) ? html` - - + ` : undefined} -
    + `; } static get styles() { return css` - .container { - display: flex; - flex-direction: row; - padding: 0 12px 12px 12px; - width: auto; - } - ha-tile-button { - flex: 1; - } - ha-tile-button:not(:last-child) { - margin-right: 12px; - margin-inline-end: 12px; - margin-inline-start: initial; - direction: var(--direction); + ha-bar-button-group { + margin: 0 12px 12px 12px; + --button-bar-group-spacing: 12px; } `; } 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 6c19958a77..b99671770e 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 @@ -11,7 +11,8 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import "../../../components/tile/ha-tile-button"; +import "../../../components/ha-bar-button"; +import "../../../components/ha-bar-button-group"; import { UNAVAILABLE } from "../../../data/entity"; import { canReturnHome, @@ -167,7 +168,7 @@ class HuiVacuumCommandTileFeature const stateObj = this.stateObj as VacuumEntity; return html` -
    + ${VACUUM_COMMANDS.filter( (command) => supportsVacuumCommand(stateObj, command) && @@ -175,7 +176,7 @@ class HuiVacuumCommandTileFeature ).map((command) => { const button = VACUUM_COMMANDS_BUTTONS[command](stateObj); return html` - - + `; })} -
    + `; } static get styles() { return css` - .container { - display: flex; - flex-direction: row; - padding: 0 12px 12px 12px; - width: auto; - } - ha-tile-button { - flex: 1; - } - ha-tile-button:not(:last-child) { - margin-right: 12px; - margin-inline-end: 12px; - margin-inline-start: initial; - direction: var(--direction); + ha-bar-button-group { + margin: 0 12px 12px 12px; + --button-bar-group-spacing: 12px; } `; } From 5f9f51f92d8667d25694fd343dddd9ca102c0099 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 20 Feb 2023 17:32:52 +0100 Subject: [PATCH 094/138] Render target picker combo-box in overlaying menu surface (#14970) --- src/components/device/ha-device-picker.ts | 2 +- src/components/device/ha-devices-picker.ts | 10 +- src/components/ha-area-picker.ts | 3 + src/components/ha-target-picker.ts | 202 ++++++++++++--------- src/panels/history/ha-panel-history.ts | 47 ++--- src/panels/logbook/ha-panel-logbook.ts | 2 + 6 files changed, 146 insertions(+), 120 deletions(-) diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 715a42c1db..8b9e477d6a 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -214,7 +214,7 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) { if (!devEntities || !devEntities.length) { return false; } - return deviceEntityLookup[device.id].some((entity) => { + return devEntities.some((entity) => { const stateObj = this.hass.states[entity.entity_id]; if (!stateObj) { return false; diff --git a/src/components/device/ha-devices-picker.ts b/src/components/device/ha-devices-picker.ts index 1f1340ef04..327af4c8ac 100644 --- a/src/components/device/ha-devices-picker.ts +++ b/src/components/device/ha-devices-picker.ts @@ -4,7 +4,10 @@ import { fireEvent } from "../../common/dom/fire_event"; import { PolymerChangedEvent } from "../../polymer-types"; import { HomeAssistant } from "../../types"; import "./ha-device-picker"; -import type { HaDevicePickerDeviceFilterFunc } from "./ha-device-picker"; +import type { + HaDevicePickerDeviceFilterFunc, + HaDevicePickerEntityFilterFunc, +} from "./ha-device-picker"; @customElement("ha-devices-picker") class HaDevicesPicker extends LitElement { @@ -44,6 +47,8 @@ class HaDevicesPicker extends LitElement { @property() public deviceFilter?: HaDevicePickerDeviceFilterFunc; + @property() public entityFilter?: HaDevicePickerEntityFilterFunc; + protected render(): TemplateResult { if (!this.hass) { return html``; @@ -59,6 +64,7 @@ class HaDevicesPicker extends LitElement { .curValue=${entityId} .hass=${this.hass} .deviceFilter=${this.deviceFilter} + .entityFilter=${this.entityFilter} .includeDomains=${this.includeDomains} .excludeDomains=${this.excludeDomains} .includeDeviceClasses=${this.includeDeviceClasses} @@ -76,8 +82,10 @@ class HaDevicesPicker extends LitElement { .hass=${this.hass} .helper=${this.helper} .deviceFilter=${this.deviceFilter} + .entityFilter=${this.entityFilter} .includeDomains=${this.includeDomains} .excludeDomains=${this.excludeDomains} + .excludeDevices=${currentDevices} .includeDeviceClasses=${this.includeDeviceClasses} .label=${this.pickDeviceLabel} .disabled=${this.disabled} diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts index 0f47ed05b9..6f016cc1f7 100644 --- a/src/components/ha-area-picker.ts +++ b/src/components/ha-area-picker.ts @@ -233,6 +233,9 @@ export class HaAreaPicker extends LitElement { }); inputEntities = inputEntities!.filter((entity) => { const stateObj = this.hass.states[entity.entity_id]; + if (!stateObj) { + return false; + } return entityFilter!(stateObj); }); } diff --git a/src/components/ha-target-picker.ts b/src/components/ha-target-picker.ts index 599720075a..02eb8f1456 100644 --- a/src/components/ha-target-picker.ts +++ b/src/components/ha-target-picker.ts @@ -13,6 +13,7 @@ import { HassEntity, HassServiceTarget } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, unsafeCSS } from "lit"; import { customElement, property, query, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; +import { ComboBoxLightOpenedChangedEvent } from "@vaadin/combo-box/vaadin-combo-box-light"; import { ensureArray } from "../common/array/ensure-array"; import { fireEvent } from "../common/dom/fire_event"; import { computeDomain } from "../common/entity/compute_domain"; @@ -31,6 +32,8 @@ import "./ha-area-picker"; import "./ha-icon-button"; import "./ha-input-helper-text"; import "./ha-svg-icon"; +import { stopPropagation } from "../common/dom/stop_propagation"; +import "@material/mwc-menu/mwc-menu-surface"; @customElement("ha-target-picker") export class HaTargetPicker extends LitElement { @@ -64,28 +67,21 @@ export class HaTargetPicker extends LitElement { @property({ type: Boolean, reflect: true }) public disabled = false; - @property({ type: Boolean }) public horizontal = false; + @property({ type: Boolean }) public addOnTop = false; @state() private _addMode?: "area_id" | "entity_id" | "device_id"; @query("#input") private _inputElement?; + @query(".add-container", true) private _addContainer?: HTMLDivElement; + + private _opened = false; + protected render() { - return html` - ${this.horizontal - ? html` -
    - ${this._renderChips()} ${this._renderPicker()} -
    - ${this._renderItems()} - ` - : html` -
    - ${this._renderItems()} ${this._renderPicker()} - ${this._renderChips()} -
    - `} - `; + if (this.addOnTop) { + return html` ${this._renderChips()} ${this._renderItems()} `; + } + return html` ${this._renderItems()} ${this._renderChips()} `; } private _renderItems() { @@ -132,7 +128,7 @@ export class HaTargetPicker extends LitElement { private _renderChips() { return html` -
    +
    + ${this._renderPicker()}
    ${this.helper ? html`${this.helper}` @@ -200,11 +197,8 @@ export class HaTargetPicker extends LitElement { `; } - private async _showPicker(ev) { + private _showPicker(ev) { this._addMode = ev.currentTarget.type; - await this.updateComplete; - await this._inputElement?.focus(); - await this._inputElement?.open(); } private _renderChip( @@ -239,7 +233,7 @@ export class HaTargetPicker extends LitElement { ${type === "entity_id" ? "" - : html` + : html` - `; - case "device_id": - return html` - - `; - case "entity_id": - return html` - - `; + if (!this._addMode) { + return html``; } - return html``; + return html`${this._addMode === "area_id" + ? html` + + ` + : this._addMode === "device_id" + ? html` + + ` + : html` + + `}`; } private _targetPicked(ev) { @@ -347,7 +352,6 @@ export class HaTargetPicker extends LitElement { const value = ev.detail.value; const target = ev.currentTarget; target.value = ""; - this._addMode = undefined; if ( this.value && this.value[target.type] && @@ -454,6 +458,31 @@ export class HaTargetPicker extends LitElement { return undefined; } + private _onClosed(ev) { + ev.stopPropagation(); + ev.target.open = true; + } + + private async _onOpened() { + if (!this._addMode) { + return; + } + await this._inputElement?.focus(); + await this._inputElement?.open(); + this._opened = true; + } + + private _openedChanged(ev: ComboBoxLightOpenedChangedEvent) { + if (this._opened && !ev.detail.value) { + this._opened = false; + this._addMode = undefined; + } + } + + private _preventDefault(ev: Event) { + ev.preventDefault(); + } + private _deviceMeetsFilter(device: DeviceRegistryEntry): boolean { const devEntities = Object.values(this.hass.entities).filter( (entity) => entity.device_id === device.id @@ -555,12 +584,6 @@ export class HaTargetPicker extends LitElement { static get styles(): CSSResultGroup { return css` ${unsafeCSS(chipStyles)} - .horizontal-container { - display: flex; - flex-wrap: wrap; - min-height: 56px; - align-items: center; - } .mdc-chip { color: var(--primary-text-color); } @@ -573,6 +596,10 @@ export class HaTargetPicker extends LitElement { .mdc-chip.add { color: rgba(0, 0, 0, 0.87); } + .add-container { + position: relative; + display: inline-flex; + } .mdc-chip:not(.add) { cursor: default; } @@ -644,6 +671,15 @@ export class HaTargetPicker extends LitElement { opacity: var(--light-disabled-opacity); pointer-events: none; } + mwc-menu-surface { + --mdc-menu-min-width: 100%; + } + ha-entity-picker, + ha-device-picker, + ha-area-picker { + display: block; + width: 100%; + } `; } } diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts index b3be7664b4..cdaf307565 100644 --- a/src/panels/history/ha-panel-history.ts +++ b/src/panels/history/ha-panel-history.ts @@ -156,7 +156,7 @@ class HaPanelHistory extends SubscribeMixin(LitElement) {
    -
    +
    @@ -510,18 +510,6 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { height: 100%; } - :host([narrow]) .narrow-wrap { - flex-wrap: wrap; - } - - .horizontal { - align-items: center; - } - - :host(:not([narrow])) .selector-padding { - padding-left: 32px; - } - .progress-wrapper { position: relative; } @@ -529,11 +517,7 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { .filters { display: flex; align-items: flex-start; - padding: 8px 16px 0; - } - - :host([narrow]) .filters { - flex-wrap: wrap; + margin-top: 16px; } ha-date-range-picker { @@ -544,11 +528,15 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { direction: var(--direction); } - :host([narrow]) ha-date-range-picker { - margin-right: 0; - margin-inline-end: 0; - margin-inline-start: initial; - direction: var(--direction); + @media all and (max-width: 1025px) { + .filters { + flex-direction: column; + } + ha-date-range-picker { + margin-right: 0; + margin-inline-end: 0; + width: 100%; + } } ha-circular-progress { @@ -558,17 +546,6 @@ class HaPanelHistory extends SubscribeMixin(LitElement) { transform: translate(-50%, -50%); } - ha-entity-picker { - display: inline-block; - flex-grow: 1; - max-width: 400px; - } - - :host([narrow]) ha-entity-picker { - max-width: none; - width: 100%; - } - .start-search { padding-top: 16px; text-align: center; diff --git a/src/panels/logbook/ha-panel-logbook.ts b/src/panels/logbook/ha-panel-logbook.ts index 8f53ce7f56..f3983a2c4b 100644 --- a/src/panels/logbook/ha-panel-logbook.ts +++ b/src/panels/logbook/ha-panel-logbook.ts @@ -249,6 +249,7 @@ export class HaPanelLogbook extends LitElement { margin-inline-start: initial; max-width: 100%; direction: var(--direction); + margin-bottom: -5px; } :host([narrow]) ha-date-range-picker { @@ -256,6 +257,7 @@ export class HaPanelLogbook extends LitElement { margin-inline-end: 0; margin-inline-start: initial; direction: var(--direction); + margin-bottom: 8px; } .filters { From bef586efb306ef0442e568ae1d87d4cba5c6f069 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 17:34:37 +0100 Subject: [PATCH 095/138] Rename bar components to control components (#15508) * Rename ha-bar-slider to ha-control-slider * Rename ha-bar-switch to ha-control-switch * Rename ha-bar-button to ha-control-button * Update tile features --- .../pages/components/ha-bar-button.markdown | 3 - .../pages/components/ha-bar-slider.markdown | 3 - .../pages/components/ha-bar-switch.markdown | 3 - .../components/ha-control-button.markdown | 3 + ...{ha-bar-button.ts => ha-control-button.ts} | 65 ++++++++++--------- .../components/ha-control-slider.markdown | 3 + ...{ha-bar-slider.ts => ha-control-slider.ts} | 24 +++---- .../components/ha-control-switch.markdown | 3 + ...{ha-bar-switch.ts => ha-control-switch.ts} | 26 ++++---- ...on-group.ts => ha-control-button-group.ts} | 22 +++---- ...{ha-bar-button.ts => ha-control-button.ts} | 31 ++++----- ...{ha-bar-slider.ts => ha-control-slider.ts} | 38 +++++------ ...{ha-bar-switch.ts => ha-control-switch.ts} | 44 ++++++------- src/components/tile/ha-tile-slider.ts | 18 ++--- .../hui-cover-open-close-tile-feature.ts | 24 +++---- .../hui-cover-tilt-tile-feature.ts | 24 +++---- .../hui-vacuum-commands-tile-feature.ts | 16 ++--- 17 files changed, 177 insertions(+), 173 deletions(-) delete mode 100644 gallery/src/pages/components/ha-bar-button.markdown delete mode 100644 gallery/src/pages/components/ha-bar-slider.markdown delete mode 100644 gallery/src/pages/components/ha-bar-switch.markdown create mode 100644 gallery/src/pages/components/ha-control-button.markdown rename gallery/src/pages/components/{ha-bar-button.ts => ha-control-button.ts} (70%) create mode 100644 gallery/src/pages/components/ha-control-slider.markdown rename gallery/src/pages/components/{ha-bar-slider.ts => ha-control-slider.ts} (87%) create mode 100644 gallery/src/pages/components/ha-control-switch.markdown rename gallery/src/pages/components/{ha-bar-switch.ts => ha-control-switch.ts} (84%) rename src/components/{ha-bar-button-group.ts => ha-control-button-group.ts} (63%) rename src/components/{ha-bar-button.ts => ha-control-button.ts} (78%) rename src/components/{ha-bar-slider.ts => ha-control-slider.ts} (91%) rename src/components/{ha-bar-switch.ts => ha-control-switch.ts} (79%) diff --git a/gallery/src/pages/components/ha-bar-button.markdown b/gallery/src/pages/components/ha-bar-button.markdown deleted file mode 100644 index eb265b8f1f..0000000000 --- a/gallery/src/pages/components/ha-bar-button.markdown +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Bar Button ---- diff --git a/gallery/src/pages/components/ha-bar-slider.markdown b/gallery/src/pages/components/ha-bar-slider.markdown deleted file mode 100644 index 5d45928b4e..0000000000 --- a/gallery/src/pages/components/ha-bar-slider.markdown +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Bar Slider ---- diff --git a/gallery/src/pages/components/ha-bar-switch.markdown b/gallery/src/pages/components/ha-bar-switch.markdown deleted file mode 100644 index b47b9bb183..0000000000 --- a/gallery/src/pages/components/ha-bar-switch.markdown +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Bar Switch ---- diff --git a/gallery/src/pages/components/ha-control-button.markdown b/gallery/src/pages/components/ha-control-button.markdown new file mode 100644 index 0000000000..344a3ebe1d --- /dev/null +++ b/gallery/src/pages/components/ha-control-button.markdown @@ -0,0 +1,3 @@ +--- +title: Control Button +--- diff --git a/gallery/src/pages/components/ha-bar-button.ts b/gallery/src/pages/components/ha-control-button.ts similarity index 70% rename from gallery/src/pages/components/ha-bar-button.ts rename to gallery/src/pages/components/ha-control-button.ts index fcdd0f4176..0c3ad180be 100644 --- a/gallery/src/pages/components/ha-bar-button.ts +++ b/gallery/src/pages/components/ha-control-button.ts @@ -8,10 +8,10 @@ import { css, html, LitElement, TemplateResult } from "lit"; import { customElement } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { repeat } from "lit/directives/repeat"; -import "../../../../src/components/ha-bar-button"; +import "../../../../src/components/ha-control-button"; import "../../../../src/components/ha-card"; import "../../../../src/components/ha-svg-icon"; -import "../../../../src/components/ha-bar-button-group"; +import "../../../../src/components/ha-control-button-group"; type Button = { label: string; @@ -46,7 +46,7 @@ const buttonGroups: ButtonGroup[] = [ }, ]; -@customElement("demo-components-ha-bar-button") +@customElement("demo-components-ha-control-button") export class DemoHaBarButton extends LitElement { protected render(): TemplateResult { return html` @@ -56,13 +56,13 @@ export class DemoHaBarButton extends LitElement { (btn) => html`
    Config: ${JSON.stringify(btn)}
    - - +
    ` )} @@ -74,26 +74,26 @@ export class DemoHaBarButton extends LitElement { (group) => html`
    Config: ${JSON.stringify(group)}
    - - + + - - + + - - + + - - + +
    ` )} @@ -105,26 +105,29 @@ export class DemoHaBarButton extends LitElement { ${repeat( buttonGroups, (group) => html` - - + + - - + + - - + + - - + + ` )}
    @@ -150,20 +153,20 @@ export class DemoHaBarButton extends LitElement { font-weight: 600; } .custom { - --button-bar-icon-color: var(--primary-color); - --button-bar-background-color: var(--primary-color); - --button-bar-background-opacity: 0.2; - --button-bar-border-radius: 18px; + --control-button-icon-color: var(--primary-color); + --control-button-background-color: var(--primary-color); + --control-button-background-opacity: 0.2; + --control-button-border-radius: 18px; height: 100px; width: 100px; } .custom-group { - --button-bar-group-thickness: 100px; - --button-bar-group-border-radius: 18px; - --button-bar-group-spacing: 20px; + --control-button-group-thickness: 100px; + --control-button-group-border-radius: 18px; + --control-button-group-spacing: 20px; } - .custom-group ha-bar-button { - --button-bar-border-radius: 18px; + .custom-group ha-control-button { + --control-button-border-radius: 18px; --mdc-icon-size: 32px; } .vertical-buttons { @@ -184,6 +187,6 @@ export class DemoHaBarButton extends LitElement { declare global { interface HTMLElementTagNameMap { - "demo-components-ha-bar-button": DemoHaBarButton; + "demo-components-ha-control-button": DemoHaBarButton; } } diff --git a/gallery/src/pages/components/ha-control-slider.markdown b/gallery/src/pages/components/ha-control-slider.markdown new file mode 100644 index 0000000000..3825be3295 --- /dev/null +++ b/gallery/src/pages/components/ha-control-slider.markdown @@ -0,0 +1,3 @@ +--- +title: Control Slider +--- diff --git a/gallery/src/pages/components/ha-bar-slider.ts b/gallery/src/pages/components/ha-control-slider.ts similarity index 87% rename from gallery/src/pages/components/ha-bar-slider.ts rename to gallery/src/pages/components/ha-control-slider.ts index 261169d6dc..5faf01a1fc 100644 --- a/gallery/src/pages/components/ha-bar-slider.ts +++ b/gallery/src/pages/components/ha-control-slider.ts @@ -2,7 +2,7 @@ import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { repeat } from "lit/directives/repeat"; -import "../../../../src/components/ha-bar-slider"; +import "../../../../src/components/ha-control-slider"; import "../../../../src/components/ha-card"; const sliders: { @@ -46,7 +46,7 @@ const sliders: { }, ]; -@customElement("demo-components-ha-bar-slider") +@customElement("demo-components-ha-control-slider") export class DemoHaBarSlider extends LitElement { @state() private value = 50; @@ -86,7 +86,7 @@ export class DemoHaBarSlider extends LitElement {
    Config: ${JSON.stringify(config)}
    - - +
    `; @@ -106,7 +106,7 @@ export class DemoHaBarSlider extends LitElement { ${repeat(sliders, (slider) => { const { id, label, ...config } = slider; return html` - - + `; })}
    @@ -141,11 +141,11 @@ export class DemoHaBarSlider extends LitElement { font-weight: 600; } .custom { - --slider-bar-color: #ffcf4c; - --slider-bar-background: #ffcf4c; - --slider-bar-background-opacity: 0.2; - --slider-bar-thickness: 100px; - --slider-bar-border-radius: 24px; + --control-slider-color: #ffcf4c; + --control-slider-background: #ffcf4c; + --control-slider-background-opacity: 0.2; + --control-slider-thickness: 100px; + --control-slider-border-radius: 24px; } .vertical-sliders { height: 300px; @@ -165,6 +165,6 @@ export class DemoHaBarSlider extends LitElement { declare global { interface HTMLElementTagNameMap { - "demo-components-ha-bar-slider": DemoHaBarSlider; + "demo-components-ha-control-slider": DemoHaBarSlider; } } diff --git a/gallery/src/pages/components/ha-control-switch.markdown b/gallery/src/pages/components/ha-control-switch.markdown new file mode 100644 index 0000000000..ea4a4fadbf --- /dev/null +++ b/gallery/src/pages/components/ha-control-switch.markdown @@ -0,0 +1,3 @@ +--- +title: Control Switch +--- diff --git a/gallery/src/pages/components/ha-bar-switch.ts b/gallery/src/pages/components/ha-control-switch.ts similarity index 84% rename from gallery/src/pages/components/ha-bar-switch.ts rename to gallery/src/pages/components/ha-control-switch.ts index 7cf6bf64ef..8311e2a0a5 100644 --- a/gallery/src/pages/components/ha-bar-switch.ts +++ b/gallery/src/pages/components/ha-control-switch.ts @@ -8,7 +8,7 @@ import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { repeat } from "lit/directives/repeat"; -import "../../../../src/components/ha-bar-switch"; +import "../../../../src/components/ha-control-switch"; import "../../../../src/components/ha-card"; const switches: { @@ -39,8 +39,8 @@ const switches: { }, ]; -@customElement("demo-components-ha-bar-switch") -export class DemoHaBarSwitch extends LitElement { +@customElement("demo-components-ha-control-switch") +export class DemoHaControlSwitch extends LitElement { @state() private checked = false; handleValueChanged(e: any) { @@ -56,7 +56,7 @@ export class DemoHaBarSwitch extends LitElement {
    Config: ${JSON.stringify(config)}
    - - +
    `; @@ -78,7 +78,7 @@ export class DemoHaBarSwitch extends LitElement { ${repeat(switches, (sw) => { const { id, label, ...config } = sw; return html` - - + `; })}
    @@ -115,11 +115,11 @@ export class DemoHaBarSwitch extends LitElement { font-weight: 600; } .custom { - --switch-bar-on-color: var(--green-color); - --switch-bar-off-color: var(--red-color); - --switch-bar-thickness: 100px; - --switch-bar-border-radius: 24px; - --switch-bar-padding: 6px; + --control-switch-on-color: var(--green-color); + --control-switch-off-color: var(--red-color); + --control-switch-thickness: 100px; + --control-switch-border-radius: 24px; + --control-switch-padding: 6px; --mdc-icon-size: 24px; } .vertical-switches { @@ -140,6 +140,6 @@ export class DemoHaBarSwitch extends LitElement { declare global { interface HTMLElementTagNameMap { - "demo-components-ha-bar-switch": DemoHaBarSwitch; + "demo-components-ha-control-switch": DemoHaControlSwitch; } } diff --git a/src/components/ha-bar-button-group.ts b/src/components/ha-control-button-group.ts similarity index 63% rename from src/components/ha-bar-button-group.ts rename to src/components/ha-control-button-group.ts index 030e4a9e3c..3a3df1c945 100644 --- a/src/components/ha-bar-button-group.ts +++ b/src/components/ha-control-button-group.ts @@ -1,8 +1,8 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; -@customElement("ha-bar-button-group") -export class HaBarButtonGroup extends LitElement { +@customElement("ha-control-button-group") +export class HaControlButtonGroup extends LitElement { @property({ type: Boolean, reflect: true }) public vertical = false; @@ -17,9 +17,9 @@ export class HaBarButtonGroup extends LitElement { static get styles(): CSSResultGroup { return css` :host { - --button-bar-group-spacing: 12px; - --button-bar-group-thickness: 40px; - height: var(--button-bar-group-thickness); + --control-button-group-spacing: 12px; + --control-button-group-thickness: 40px; + height: var(--control-button-group-thickness); width: auto; display: block; } @@ -35,22 +35,22 @@ export class HaBarButtonGroup extends LitElement { width: 100%; } ::slotted(*:not(:last-child)) { - margin-right: var(--button-bar-group-spacing); - margin-inline-end: var(--button-bar-group-spacing); + margin-right: var(--control-button-group-spacing); + margin-inline-end: var(--control-button-group-spacing); margin-inline-start: initial; direction: var(--direction); } :host([vertical]) { - width: var(--button-bar-group-thickness); + width: var(--control-button-group-thickness); height: auto; } :host([vertical]) .container { flex-direction: column; } - :host([vertical]) ::slotted(ha-bar-button:not(:last-child)) { + :host([vertical]) ::slotted(ha-control-button:not(:last-child)) { margin-right: initial; margin-inline-end: initial; - margin-bottom: var(--button-bar-group-spacing); + margin-bottom: var(--control-button-group-spacing); } `; } @@ -58,6 +58,6 @@ export class HaBarButtonGroup extends LitElement { declare global { interface HTMLElementTagNameMap { - "ha-bar-button-group": HaBarButtonGroup; + "ha-control-button-group": HaControlButtonGroup; } } diff --git a/src/components/ha-bar-button.ts b/src/components/ha-control-button.ts similarity index 78% rename from src/components/ha-bar-button.ts rename to src/components/ha-control-button.ts index e8a8f6f47e..d169fb6d08 100644 --- a/src/components/ha-bar-button.ts +++ b/src/components/ha-control-button.ts @@ -10,8 +10,8 @@ import { } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; -@customElement("ha-bar-button") -export class HaBarButton extends LitElement { +@customElement("ha-control-button") +export class HaControlButton extends LitElement { @property({ type: Boolean, reflect: true }) disabled = false; @property() public label?: string; @@ -80,10 +80,11 @@ export class HaBarButton extends LitElement { return css` :host { display: block; - --button-bar-icon-color: var(--primary-text-color); - --button-bar-background-color: var(--disabled-color); - --button-bar-background-opacity: 0.2; - --button-bar-border-radius: 10px; + --control-button-icon-color: var(--primary-text-color); + --control-button-background-color: var(--disabled-color); + --control-button-background-opacity: 0.2; + --control-button-border-radius: 10px; + --mdc-icon-size: 20px; width: 40px; height: 40px; -webkit-tap-highlight-color: transparent; @@ -97,7 +98,7 @@ export class HaBarButton extends LitElement { justify-content: center; width: 100%; height: 100%; - border-radius: var(--button-bar-border-radius); + border-radius: var(--control-button-border-radius); border: none; margin: 0; padding: 0; @@ -107,7 +108,7 @@ export class HaBarButton extends LitElement { overflow: hidden; background: none; z-index: 1; - --mdc-ripple-color: var(--button-bar-background-color); + --mdc-ripple-color: var(--control-button-background-color); } .button::before { content: ""; @@ -116,21 +117,21 @@ export class HaBarButton extends LitElement { left: 0; height: 100%; width: 100%; - background-color: var(--button-bar-background-color); + background-color: var(--control-button-background-color); transition: background-color 180ms ease-in-out, opacity 180ms ease-in-out; - opacity: var(--button-bar-background-opacity); + opacity: var(--control-button-background-opacity); } .button ::slotted(*) { transition: color 180ms ease-in-out; - color: var(--button-bar-icon-color); + color: var(--control-button-icon-color); pointer-events: none; } .button:disabled { cursor: not-allowed; - --button-bar-background-color: var(--disabled-color); - --button-bar-icon-color: var(--disabled-text-color); - --button-bar-background-opacity: 0.2; + --control-button-background-color: var(--disabled-color); + --control-button-icon-color: var(--disabled-text-color); + --control-button-background-opacity: 0.2; } `; } @@ -138,6 +139,6 @@ export class HaBarButton extends LitElement { declare global { interface HTMLElementTagNameMap { - "ha-bar-button": HaBarButton; + "ha-control-button": HaControlButton; } } diff --git a/src/components/ha-bar-slider.ts b/src/components/ha-control-slider.ts similarity index 91% rename from src/components/ha-bar-slider.ts rename to src/components/ha-control-slider.ts index 5854e06148..44fea413ab 100644 --- a/src/components/ha-bar-slider.ts +++ b/src/components/ha-control-slider.ts @@ -42,8 +42,8 @@ const getPercentageFromEvent = (e: HammerInput, vertical: boolean) => { return Math.max(Math.min(1, (x - offset) / total), 0); }; -@customElement("ha-bar-slider") -export class HaBarSlider extends LitElement { +@customElement("ha-control-slider") +export class HaControlSlider extends LitElement { @property({ type: Boolean }) public disabled = false; @@ -271,29 +271,29 @@ export class HaBarSlider extends LitElement { return css` :host { display: block; - --slider-bar-color: var(--primary-color); - --slider-bar-background: var(--disabled-color); - --slider-bar-background-opacity: 0.2; - --slider-bar-thickness: 40px; - --slider-bar-border-radius: 10px; - height: var(--slider-bar-thickness); + --control-slider-color: var(--primary-color); + --control-slider-background: var(--disabled-color); + --control-slider-background-opacity: 0.2; + --control-slider-thickness: 40px; + --control-slider-border-radius: 10px; + height: var(--control-slider-thickness); width: 100%; - border-radius: var(--slider-bar-border-radius); + border-radius: var(--control-slider-border-radius); outline: none; transition: box-shadow 180ms ease-in-out; } :host(:focus-visible) { - box-shadow: 0 0 0 2px var(--slider-bar-color); + box-shadow: 0 0 0 2px var(--control-slider-color); } :host([vertical]) { - width: var(--slider-bar-thickness); + width: var(--control-slider-thickness); height: 100%; } .slider { position: relative; height: 100%; width: 100%; - border-radius: var(--slider-bar-border-radius); + border-radius: var(--control-slider-border-radius); transform: translateZ(0); overflow: hidden; cursor: pointer; @@ -307,18 +307,18 @@ export class HaBarSlider extends LitElement { left: 0; height: 100%; width: 100%; - background: var(--slider-bar-background); - opacity: var(--slider-bar-background-opacity); + background: var(--control-slider-background); + opacity: var(--control-slider-background-opacity); } .slider .slider-track-bar { - --border-radius: var(--slider-bar-border-radius); + --border-radius: var(--control-slider-border-radius); --handle-size: 4px; - --handle-margin: calc(var(--slider-bar-thickness) / 8); + --handle-margin: calc(var(--control-slider-thickness) / 8); --slider-size: 100%; position: absolute; height: 100%; width: 100%; - background-color: var(--slider-bar-color); + background-color: var(--control-slider-color); transition: transform 180ms ease-in-out; } .slider .slider-track-bar.show-handle { @@ -413,7 +413,7 @@ export class HaBarSlider extends LitElement { } .slider .slider-track-cursor { - --cursor-size: calc(var(--slider-bar-thickness) / 4); + --cursor-size: calc(var(--control-slider-thickness) / 4); --handle-size: 4px; position: absolute; background-color: white; @@ -452,6 +452,6 @@ export class HaBarSlider extends LitElement { declare global { interface HTMLElementTagNameMap { - "ha-bar-slider": HaBarSlider; + "ha-control-slider": HaControlSlider; } } diff --git a/src/components/ha-bar-switch.ts b/src/components/ha-control-switch.ts similarity index 79% rename from src/components/ha-bar-switch.ts rename to src/components/ha-control-switch.ts index 59f851923c..881df1c42d 100644 --- a/src/components/ha-bar-switch.ts +++ b/src/components/ha-control-switch.ts @@ -10,8 +10,8 @@ import { customElement, property } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; import "./ha-svg-icon"; -@customElement("ha-bar-switch") -export class HaBarSwitch extends LitElement { +@customElement("ha-control-switch") +export class HaControlSwitch extends LitElement { @property({ type: Boolean, attribute: "disabled" }) public disabled = false; @@ -92,36 +92,36 @@ export class HaBarSwitch extends LitElement { return css` :host { display: block; - --switch-bar-on-color: var(--primary-color); - --switch-bar-off-color: var(--disabled-color); - --switch-bar-background-opacity: 0.2; - --switch-bar-thickness: 40px; - --switch-bar-border-radius: 12px; - --switch-bar-padding: 4px; + --control-switch-on-color: var(--primary-color); + --control-switch-off-color: var(--disabled-color); + --control-switch-background-opacity: 0.2; + --control-switch-thickness: 40px; + --control-switch-border-radius: 12px; + --control-switch-padding: 4px; --mdc-icon-size: 20px; - height: var(--switch-bar-thickness); + height: var(--control-switch-thickness); width: 100%; box-sizing: border-box; user-select: none; cursor: pointer; - border-radius: var(--switch-bar-border-radius); + border-radius: var(--control-switch-border-radius); outline: none; transition: box-shadow 180ms ease-in-out; } :host(:focus-visible) { - box-shadow: 0 0 0 2px var(--switch-bar-off-color); + box-shadow: 0 0 0 2px var(--control-switch-off-color); } :host([checked]:focus-visible) { - box-shadow: 0 0 0 2px var(--switch-bar-on-color); + box-shadow: 0 0 0 2px var(--control-switch-on-color); } .switch { box-sizing: border-box; position: relative; height: 100%; width: 100%; - border-radius: var(--switch-bar-border-radius); + border-radius: var(--control-switch-border-radius); overflow: hidden; - padding: var(--switch-bar-padding); + padding: var(--control-switch-padding); display: flex; } .switch .background { @@ -130,31 +130,31 @@ export class HaBarSwitch extends LitElement { left: 0; height: 100%; width: 100%; - background-color: var(--switch-bar-off-color); + background-color: var(--control-switch-off-color); transition: background-color 180ms ease-in-out; - opacity: var(--switch-bar-background-opacity); + opacity: var(--control-switch-background-opacity); } .switch .button { width: 50%; height: 100%; background: lightgrey; border-radius: calc( - var(--switch-bar-border-radius) - var(--switch-bar-padding) + var(--control-switch-border-radius) - var(--control-switch-padding) ); transition: transform 180ms ease-in-out, background-color 180ms ease-in-out; - background-color: var(--switch-bar-off-color); + background-color: var(--control-switch-off-color); color: white; display: flex; align-items: center; justify-content: center; } :host([checked]) .switch .background { - background-color: var(--switch-bar-on-color); + background-color: var(--control-switch-on-color); } :host([checked]) .switch .button { transform: translateX(100%); - background-color: var(--switch-bar-on-color); + background-color: var(--control-switch-on-color); } :host([reversed]) .switch { flex-direction: row-reverse; @@ -163,7 +163,7 @@ export class HaBarSwitch extends LitElement { transform: translateX(-100%); } :host([vertical]) { - width: var(--switch-bar-thickness); + width: var(--control-switch-thickness); height: 100%; } :host([vertical][checked]) .switch .button { @@ -189,6 +189,6 @@ export class HaBarSwitch extends LitElement { declare global { interface HTMLElementTagNameMap { - "ha-bar-switch": HaBarSwitch; + "ha-control-switch": HaControlSwitch; } } diff --git a/src/components/tile/ha-tile-slider.ts b/src/components/tile/ha-tile-slider.ts index c010f151dd..b79bd0ad2c 100644 --- a/src/components/tile/ha-tile-slider.ts +++ b/src/components/tile/ha-tile-slider.ts @@ -1,7 +1,7 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; -import "../ha-bar-slider"; +import "../ha-control-slider"; @customElement("ha-tile-slider") export class HaTileSlider extends LitElement { @@ -30,7 +30,7 @@ export class HaTileSlider extends LitElement { protected render(): TemplateResult { return html` - - + `; } static get styles(): CSSResultGroup { return css` - ha-bar-slider { - --slider-bar-color: var(--tile-slider-color, var(--primary-color)); - --slider-bar-background: var( + ha-control-slider { + --control-slider-color: var(--tile-slider-color, var(--primary-color)); + --control-slider-background: var( --tile-slider-background, var(--disabled-color) ); - --slider-bar-background-opacity: var( + --control-slider-background-opacity: var( --tile-slider-background-opacity, 0.2 ); - --slider-bar-thickness: 40px; - --slider-bar-border-radius: 10px; + --control-slider-thickness: 40px; + --control-slider-border-radius: 10px; } `; } diff --git a/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts b/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts index 6f75c8c4cf..9f2813b157 100644 --- a/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts @@ -7,8 +7,8 @@ import { computeOpenIcon, } from "../../../common/entity/cover_icon"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import "../../../components/ha-bar-button"; -import "../../../components/ha-bar-button-group"; +import "../../../components/ha-control-button"; +import "../../../components/ha-control-button-group"; import { canClose, canOpen, @@ -70,10 +70,10 @@ class HuiCoverOpenCloseTileFeature } return html` - + ${supportsFeature(this.stateObj, CoverEntityFeature.OPEN) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.STOP) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.CLOSE) ? html` - - + ` : undefined} - + `; } static get styles() { return css` - ha-bar-button-group { + ha-control-button-group { margin: 0 12px 12px 12px; - --button-bar-group-spacing: 12px; + --control-button-group-spacing: 12px; } `; } diff --git a/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts b/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts index ca22b29fc1..43f03fbd80 100644 --- a/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts @@ -3,8 +3,8 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import "../../../components/ha-bar-button"; -import "../../../components/ha-bar-button-group"; +import "../../../components/ha-control-button"; +import "../../../components/ha-control-button-group"; import { canCloseTilt, canOpenTilt, @@ -66,10 +66,10 @@ class HuiCoverTiltTileFeature } return html` - + ${supportsFeature(this.stateObj, CoverEntityFeature.OPEN_TILT) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.STOP_TILT) ? html` - - + ` : null} ${supportsFeature(this.stateObj, CoverEntityFeature.CLOSE_TILT) ? html` - - + ` : undefined} - + `; } static get styles() { return css` - ha-bar-button-group { + ha-control-button-group { margin: 0 12px 12px 12px; - --button-bar-group-spacing: 12px; + --control-button-group-spacing: 12px; } `; } 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 b99671770e..8089c55d23 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 @@ -11,8 +11,8 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; import { supportsFeature } from "../../../common/entity/supports-feature"; -import "../../../components/ha-bar-button"; -import "../../../components/ha-bar-button-group"; +import "../../../components/ha-control-button"; +import "../../../components/ha-control-button-group"; import { UNAVAILABLE } from "../../../data/entity"; import { canReturnHome, @@ -168,7 +168,7 @@ class HuiVacuumCommandTileFeature const stateObj = this.stateObj as VacuumEntity; return html` - + ${VACUUM_COMMANDS.filter( (command) => supportsVacuumCommand(stateObj, command) && @@ -176,7 +176,7 @@ class HuiVacuumCommandTileFeature ).map((command) => { const button = VACUUM_COMMANDS_BUTTONS[command](stateObj); return html` - - + `; })} - + `; } static get styles() { return css` - ha-bar-button-group { + ha-control-button-group { margin: 0 12px 12px 12px; - --button-bar-group-spacing: 12px; + --control-button-group-spacing: 12px; } `; } From e21816be52e1d21d2f3840b83309659fb4d8e711 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 17:36:46 +0100 Subject: [PATCH 096/138] Fix area name in target picker (#15511) --- src/components/ha-target-picker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ha-target-picker.ts b/src/components/ha-target-picker.ts index 02eb8f1456..39b240f411 100644 --- a/src/components/ha-target-picker.ts +++ b/src/components/ha-target-picker.ts @@ -89,7 +89,7 @@ export class HaTargetPicker extends LitElement {
    ${this.value?.area_id ? ensureArray(this.value.area_id).map((area_id) => { - const area = this.hass.devices![area_id]; + const area = this.hass.areas![area_id]; return this._renderChip( "area_id", area_id, From 05f2fb896cba40aa105354abef59a9a5d0de8f91 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 20 Feb 2023 09:14:04 -0800 Subject: [PATCH 097/138] Block target picker from adding badly formatted entity (fix history crash) (#15509) --- src/components/ha-target-picker.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/ha-target-picker.ts b/src/components/ha-target-picker.ts index 39b240f411..200feca500 100644 --- a/src/components/ha-target-picker.ts +++ b/src/components/ha-target-picker.ts @@ -18,6 +18,7 @@ import { ensureArray } from "../common/array/ensure-array"; import { fireEvent } from "../common/dom/fire_event"; import { computeDomain } from "../common/entity/compute_domain"; import { computeStateName } from "../common/entity/compute_state_name"; +import { isValidEntityId } from "../common/entity/valid_entity_id"; import { computeDeviceName, DeviceRegistryEntry, @@ -351,6 +352,11 @@ export class HaTargetPicker extends LitElement { } const value = ev.detail.value; const target = ev.currentTarget; + + if (target.type === "entity_id" && !isValidEntityId(value)) { + return; + } + target.value = ""; if ( this.value && From 7adb49c77268c65dde644c26588ce201ff4e87ba Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Mon, 20 Feb 2023 12:14:54 -0500 Subject: [PATCH 098/138] Fix promise constructors with returns (#15486) --- .eslintrc.json | 1 - src/components/data-table/ha-data-table.ts | 10 ++++++---- src/components/ha-related-items.ts | 4 +++- src/data/update.ts | 4 +++- src/dialogs/more-info/controls/more-info-climate.ts | 4 +++- src/dialogs/more-info/controls/more-info-humidifier.ts | 4 +++- src/onboarding/ha-onboarding.ts | 4 +++- .../editor/card-editor/hui-dialog-edit-card.ts | 4 +++- src/panels/media-browser/ha-bar-media-player.ts | 4 +++- src/state/translations-mixin.ts | 8 +++++--- 10 files changed, 32 insertions(+), 15 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 549844fe62..985f1da4fd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -59,7 +59,6 @@ "prefer-destructuring": "off", "no-restricted-globals": [2, "event"], "prefer-promise-reject-errors": "off", - "no-promise-executor-return": "warn", "no-unsafe-optional-chaining": "warn", "prefer-regex-literals": ["warn"], "import/prefer-default-export": "off", diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index dad2d26efb..34a0bc29d3 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -1,3 +1,4 @@ +import "@lit-labs/virtualizer"; import { mdiArrowDown, mdiArrowUp } from "@mdi/js"; import deepClone from "deep-clone-simple"; import { @@ -21,16 +22,15 @@ import { styleMap } from "lit/directives/style-map"; import memoizeOne from "memoize-one"; import { restoreScroll } from "../../common/decorators/restore-scroll"; import { fireEvent } from "../../common/dom/fire_event"; -import "../search-input"; import { debounce } from "../../common/util/debounce"; import { nextRender } from "../../common/util/render-status"; import { haStyleScrollbar } from "../../resources/styles"; +import { HomeAssistant } from "../../types"; import "../ha-checkbox"; import type { HaCheckbox } from "../ha-checkbox"; import "../ha-svg-icon"; +import "../search-input"; import { filterData, sortData } from "./sort-filter"; -import { HomeAssistant } from "../../types"; -import "@lit-labs/virtualizer"; declare global { // for fire event @@ -461,7 +461,9 @@ export class HaDataTable extends LitElement { const elapsed = curTime - startTime; if (elapsed < 100) { - await new Promise((resolve) => setTimeout(resolve, 100 - elapsed)); + await new Promise((resolve) => { + setTimeout(resolve, 100 - elapsed); + }); } if (this.curRequest !== curRequest) { return; diff --git a/src/components/ha-related-items.ts b/src/components/ha-related-items.ts index 89974e6be8..d13b4db4c7 100644 --- a/src/components/ha-related-items.ts +++ b/src/components/ha-related-items.ts @@ -282,7 +282,9 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) { private async _navigateAwayClose() { // allow new page to open before closing dialog - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); fireEvent(this, "close-dialog"); } diff --git a/src/data/update.ts b/src/data/update.ts index cc352c5116..9392ad0162 100644 --- a/src/data/update.ts +++ b/src/data/update.ts @@ -150,7 +150,9 @@ export const checkForEntityUpdates = async ( }); // there is no reliable way to know if all the updates are done updating, so we just wait a bit for now... - await new Promise((r) => setTimeout(r, 10000)); + await new Promise((r) => { + setTimeout(r, 10000); + }); unsubscribeEvents(); diff --git a/src/dialogs/more-info/controls/more-info-climate.ts b/src/dialogs/more-info/controls/more-info-climate.ts index 559b9bfbef..f2a8f8d92a 100644 --- a/src/dialogs/more-info/controls/more-info-climate.ts +++ b/src/dialogs/more-info/controls/more-info-climate.ts @@ -467,7 +467,9 @@ class MoreInfoClimate extends LitElement { // We reset stateObj to re-sync the inputs with the state. It will be out // of sync if our service call did not result in the entity to be turned // on. Since the state is not changing, the resync is not called automatic. - await new Promise((resolve) => setTimeout(resolve, 2000)); + await new Promise((resolve) => { + setTimeout(resolve, 2000); + }); // No need to resync if we received a new state. if (this.stateObj !== curState) { diff --git a/src/dialogs/more-info/controls/more-info-humidifier.ts b/src/dialogs/more-info/controls/more-info-humidifier.ts index b5618e8619..9701fcc079 100644 --- a/src/dialogs/more-info/controls/more-info-humidifier.ts +++ b/src/dialogs/more-info/controls/more-info-humidifier.ts @@ -147,7 +147,9 @@ class MoreInfoHumidifier extends LitElement { // We reset stateObj to re-sync the inputs with the state. It will be out // of sync if our service call did not result in the entity to be turned // on. Since the state is not changing, the resync is not called automatic. - await new Promise((resolve) => setTimeout(resolve, 2000)); + await new Promise((resolve) => { + setTimeout(resolve, 2000); + }); // No need to resync if we received a new state. if (this.stateObj !== curState) { diff --git a/src/onboarding/ha-onboarding.ts b/src/onboarding/ha-onboarding.ts index 72dabb9d9a..59ecb89fe1 100644 --- a/src/onboarding/ha-onboarding.ts +++ b/src/onboarding/ha-onboarding.ts @@ -323,7 +323,9 @@ class HaOnboarding extends litLocalizeLiteMixin(HassElement) { // Load config strings for integrations (this as any)._loadFragmentTranslations(this.hass!.language, "config"); // Make sure hass is initialized + the config/user callbacks have called. - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); } } diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts index f11310b93b..2532023a01 100755 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-edit-card.ts @@ -315,7 +315,9 @@ export class HuiDialogEditCard private async _confirmCancel() { // Make sure the open state of this dialog is handled before the open state of confirm dialog - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); const confirm = await showConfirmationDialog(this, { title: this.hass!.localize( "ui.panel.lovelace.editor.edit_card.unsaved_changes" diff --git a/src/panels/media-browser/ha-bar-media-player.ts b/src/panels/media-browser/ha-bar-media-player.ts index c41d57c9a8..ba7f1b5820 100644 --- a/src/panels/media-browser/ha-bar-media-player.ts +++ b/src/panels/media-browser/ha-bar-media-player.ts @@ -162,7 +162,9 @@ export class BarMediaPlayer extends SubscribeMixin(LitElement) {
    ${until( // Only show spinner after 500ms - new Promise((resolve) => setTimeout(resolve, 500)).then( + new Promise((resolve) => { + setTimeout(resolve, 500); + }).then( () => html`` ) )} diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index b0848fcb4e..9e697425b6 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -1,4 +1,5 @@ import { atLeastVersion } from "../common/config/version"; +import { fireEvent } from "../common/dom/fire_event"; import { computeLocalize, LocalizeFunc } from "../common/translations/localize"; import { computeRTLDirection, @@ -16,14 +17,13 @@ import { } from "../data/translation"; import { translationMetadata } from "../resources/translations-metadata"; import { Constructor, HomeAssistant } from "../types"; -import { storeState } from "../util/ha-pref-storage"; import { getLocalLanguage, getTranslation, getUserLocale, } from "../util/common-translation"; +import { storeState } from "../util/ha-pref-storage"; import { HassBaseEl } from "./hass-base-mixin"; -import { fireEvent } from "../common/dom/fire_event"; declare global { // for fire event @@ -373,7 +373,9 @@ export default >(superClass: T) => // overwritten when we call _updateHass the second time! // Allow hass to be updated - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); if (language !== (this.hass ?? this._pendingHass).language) { // the language was changed, abort From 658ce808019a872af708e4b0e6725b910811fae6 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Mon, 20 Feb 2023 19:16:03 +0200 Subject: [PATCH 099/138] Rtl fixes feb23 (#15487) --- gallery/src/pages/components/ha-tip.ts | 7 ++++++- src/components/ha-tip.ts | 20 +++++++++++++++---- src/dialogs/quick-bar/ha-quick-bar.ts | 4 +++- src/layouts/hass-tabs-subpage-data-table.ts | 6 ++++++ .../config/dashboard/ha-config-dashboard.ts | 2 +- .../state/developer-tools-state.js | 6 +++++- .../select-view/hui-dialog-select-view.ts | 3 +++ 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/gallery/src/pages/components/ha-tip.ts b/gallery/src/pages/components/ha-tip.ts index 49fa1f2c71..1f349efa7e 100644 --- a/gallery/src/pages/components/ha-tip.ts +++ b/gallery/src/pages/components/ha-tip.ts @@ -3,6 +3,7 @@ import { customElement } from "lit/decorators"; import "../../../../src/components/ha-tip"; import "../../../../src/components/ha-card"; import { applyThemesOnElement } from "../../../../src/common/dom/apply_themes_on_element"; +import { provideHass } from "../../../../src/fake_data/provide_hass"; const tips: (string | TemplateResult)[] = [ "Test tip", @@ -18,7 +19,11 @@ export class DemoHaTip extends LitElement {
    - ${tips.map((tip) => html`${tip}`)} + ${tips.map( + (tip) => html`${tip}` + )}
    diff --git a/src/components/ha-tip.ts b/src/components/ha-tip.ts index ef4e36fa05..b1ed88a333 100644 --- a/src/components/ha-tip.ts +++ b/src/components/ha-tip.ts @@ -1,15 +1,24 @@ import { mdiLightbulbOutline } from "@mdi/js"; -import { css, html, LitElement } from "lit"; -import { customElement } from "lit/decorators"; +import { css, html, LitElement, TemplateResult } from "lit"; +import { property, customElement } from "lit/decorators"; +import { HomeAssistant } from "../types"; import "./ha-svg-icon"; @customElement("ha-tip") class HaTip extends LitElement { - public render() { + @property({ attribute: false }) public hass!: HomeAssistant; + + public render(): TemplateResult { + if (!this.hass) { + return html``; + } + return html` - Tip! + ${this.hass.localize("ui.panel.config.tips.tip")} `; } @@ -21,7 +30,10 @@ class HaTip extends LitElement { } .text { + direction: var(--direction); margin-left: 2px; + margin-inline-start: 2px; + margin-inline-end: initial; color: var(--secondary-text-color); } diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index 730ef8ad68..aeb6520cf4 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -242,7 +242,9 @@ export class QuickBar extends LitElement { : ""} `} - ${this._hint ? html`${this._hint}` : ""} + ${this._hint + ? html`${this._hint}` + : ""} `; } diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts index 81227b26a8..30a13c94c3 100644 --- a/src/layouts/hass-tabs-subpage-data-table.ts +++ b/src/layouts/hass-tabs-subpage-data-table.ts @@ -333,15 +333,21 @@ export class HaTabsSubpageDataTable extends LitElement { align-items: center; padding: 2px 2px 2px 8px; margin-left: 4px; + margin-inline-start: 4px; + margin-inline-end: initial; font-size: 14px; width: max-content; cursor: initial; + direction: var(--direction); } .active-filters ha-svg-icon { color: var(--primary-color); } .active-filters mwc-button { margin-left: 8px; + margin-inline-start: 8px; + margin-inline-end: initial; + direction: var(--direction); } .active-filters::before { background-color: var(--primary-color); diff --git a/src/panels/config/dashboard/ha-config-dashboard.ts b/src/panels/config/dashboard/ha-config-dashboard.ts index 9c0ea74e89..76fc85056c 100644 --- a/src/panels/config/dashboard/ha-config-dashboard.ts +++ b/src/panels/config/dashboard/ha-config-dashboard.ts @@ -275,7 +275,7 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) { )} > - ${this._tip} + ${this._tip} `; diff --git a/src/panels/developer-tools/state/developer-tools-state.js b/src/panels/developer-tools/state/developer-tools-state.js index 6152506e91..d2993647fe 100644 --- a/src/panels/developer-tools/state/developer-tools-state.js +++ b/src/panels/developer-tools/state/developer-tools-state.js @@ -114,6 +114,10 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { direction: rtl; } + :host([rtl]) .filters { + direction: rtl; + } + .entities tr { vertical-align: top; direction: ltr; @@ -190,7 +194,7 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { on-change="entityIdChanged" allow-custom-entity > - [[localize('ui.tips.key_e_hint')]] + [[localize('ui.tips.key_e_hint')]] Date: Mon, 20 Feb 2023 19:56:06 +0100 Subject: [PATCH 100/138] Allow for custom submit button text in data flows (#15383) --- .../config-flow/show-dialog-config-flow.ts | 13 +++++++++++++ .../config-flow/show-dialog-data-entry-flow.ts | 5 +++++ .../config-flow/show-dialog-options-flow.ts | 13 +++++++++++++ src/dialogs/config-flow/step-flow-form.ts | 7 +++---- .../config/repairs/show-dialog-repair-flow.ts | 15 +++++++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/dialogs/config-flow/show-dialog-config-flow.ts b/src/dialogs/config-flow/show-dialog-config-flow.ts index 1eb007976c..d74df38c1d 100644 --- a/src/dialogs/config-flow/show-dialog-config-flow.ts +++ b/src/dialogs/config-flow/show-dialog-config-flow.ts @@ -101,6 +101,19 @@ export const showConfigFlowDialog = ( return hass.localize(`component.${step.handler}.selector.${key}`); }, + renderShowFormStepSubmitButton(hass, step) { + return ( + hass.localize( + `component.${step.handler}.config.step.${step.step_id}.submit` + ) || + hass.localize( + `ui.panel.config.integrations.config_flow.${ + step.last_step === false ? "next" : "submit" + }` + ) + ); + }, + renderExternalStepHeader(hass, step) { return ( hass.localize( diff --git a/src/dialogs/config-flow/show-dialog-data-entry-flow.ts b/src/dialogs/config-flow/show-dialog-data-entry-flow.ts index d685cf228b..265a5cd5f6 100644 --- a/src/dialogs/config-flow/show-dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/show-dialog-data-entry-flow.ts @@ -67,6 +67,11 @@ export interface FlowConfig { key: string ): string; + renderShowFormStepSubmitButton( + hass: HomeAssistant, + step: DataEntryFlowStepForm + ): string; + renderExternalStepHeader( hass: HomeAssistant, step: DataEntryFlowStepExternal diff --git a/src/dialogs/config-flow/show-dialog-options-flow.ts b/src/dialogs/config-flow/show-dialog-options-flow.ts index 42aa2a25ab..8744aa4d0a 100644 --- a/src/dialogs/config-flow/show-dialog-options-flow.ts +++ b/src/dialogs/config-flow/show-dialog-options-flow.ts @@ -115,6 +115,19 @@ export const showOptionsFlowDialog = ( return hass.localize(`component.${configEntry.domain}.selector.${key}`); }, + renderShowFormStepSubmitButton(hass, step) { + return ( + hass.localize( + `component.${configEntry.domain}.options.step.${step.step_id}.submit` + ) || + hass.localize( + `ui.panel.config.integrations.config_flow.${ + step.last_step === false ? "next" : "submit" + }` + ) + ); + }, + renderExternalStepHeader(_hass, _step) { return ""; }, diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index 21511ef6e6..d6f042bf9d 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -70,10 +70,9 @@ class StepFlowForm extends LitElement { : html`
    - ${this.hass.localize( - `ui.panel.config.integrations.config_flow.${ - this.step.last_step === false ? "next" : "submit" - }` + ${this.flowConfig.renderShowFormStepSubmitButton( + this.hass, + this.step )}
    diff --git a/src/panels/config/repairs/show-dialog-repair-flow.ts b/src/panels/config/repairs/show-dialog-repair-flow.ts index 575530eaf3..e1af620988 100644 --- a/src/panels/config/repairs/show-dialog-repair-flow.ts +++ b/src/panels/config/repairs/show-dialog-repair-flow.ts @@ -128,6 +128,21 @@ export const showRepairsFlowDialog = ( return hass.localize(`component.${issue.domain}.selector.${key}`); }, + renderShowFormStepSubmitButton(hass, step) { + return ( + hass.localize( + `component.${issue.domain}.issues.${ + issue.translation_key || issue.issue_id + }.fix_flow.step.${step.step_id}.submit` + ) || + hass.localize( + `ui.panel.config.integrations.config_flow.${ + step.last_step === false ? "next" : "submit" + }` + ) + ); + }, + renderExternalStepHeader(_hass, _step) { return ""; }, From dfbe32018a1ee6e84f584117f19a0e1ee30e8cc7 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 20 Feb 2023 20:32:13 +0100 Subject: [PATCH 101/138] Add reload all service to quick bar and dev tools (#15512) --- src/dialogs/quick-bar/ha-quick-bar.ts | 12 ++++++++++++ .../yaml_configuration/developer-yaml-config.ts | 10 ++++++++++ src/translations/en.json | 2 ++ 3 files changed, 24 insertions(+) diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index aeb6520cf4..2b86ca4351 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -552,6 +552,18 @@ export class QuickBar extends LitElement { ), }); + // Add "homeassistant.reload_all" + commands.push({ + primaryText: this.hass.localize( + "ui.dialogs.quick-bar.commands.reload.all" + ), + action: () => this.hass.callService("homeassistant", "reload_all"), + iconPath: mdiReload, + categoryText: this.hass.localize( + "ui.dialogs.quick-bar.commands.types.reload" + ), + }); + return commands.map((command) => ({ ...command, categoryKey: "reload", 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 1686b8cb8d..933d42c730 100644 --- a/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts +++ b/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts @@ -121,6 +121,16 @@ export class DeveloperYamlConfig extends LitElement { "ui.panel.developer-tools.tabs.yaml.section.reloading.introduction" )}
    +
    + ${this.hass.localize( + "ui.panel.developer-tools.tabs.yaml.section.reloading.all" + )} + +
    Date: Mon, 20 Feb 2023 14:32:31 -0500 Subject: [PATCH 102/138] Update ZWaveJSNodeStatus interface and firmware logic (#15338) --- src/data/zwave_js.ts | 1 + .../integration-elements/zwave_js/device-actions.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 7dcc12abef..af0bd8f2b3 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -176,6 +176,7 @@ export interface ZWaveJSNodeStatus { zwave_plus_version: number | null; highest_security_class: SecurityClass | null; is_controller_node: boolean; + has_firmware_update_cc: boolean; } export interface ZwaveJSNodeMetadata { diff --git a/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts b/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts index 5687081ecc..a6fd80387f 100644 --- a/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts +++ b/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts @@ -95,7 +95,7 @@ export const getZwaveDeviceActions = async ( }, ]; - if (!nodeStatus.ready) { + if (!nodeStatus.ready || !nodeStatus.has_firmware_update_cc) { return actions; } From 76f90e1449690832582d7feb1197afefa5f28913 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 20 Feb 2023 11:40:34 -0800 Subject: [PATCH 103/138] Fix errors in duration data processing in Automation UI Editor (#15422) Fix errors in duration data processing --- src/common/datetime/create_duration_data.ts | 12 ++++++++++-- .../condition/types/ha-automation-condition-state.ts | 3 ++- .../trigger/types/ha-automation-trigger-state.ts | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/common/datetime/create_duration_data.ts b/src/common/datetime/create_duration_data.ts index 3b743471ca..d8e717b7e3 100644 --- a/src/common/datetime/create_duration_data.ts +++ b/src/common/datetime/create_duration_data.ts @@ -10,11 +10,19 @@ export const createDurationData = ( if (typeof duration !== "object") { if (typeof duration === "string" || isNaN(duration)) { const parts = duration?.toString().split(":") || []; + if (parts.length === 1) { + return { seconds: Number(parts[0]) }; + } + if (parts.length > 3) { + return undefined; + } + const seconds = Number(parts[2]) || 0; + const seconds_whole = Math.floor(seconds); return { hours: Number(parts[0]) || 0, minutes: Number(parts[1]) || 0, - seconds: Number(parts[2]) || 0, - milliseconds: Number(parts[3]) || 0, + seconds: seconds_whole, + milliseconds: Math.floor((seconds - seconds_whole) * 1000), }; } return { seconds: duration }; 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 71b945562f..e61438ad3e 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 @@ -4,6 +4,7 @@ import { assert, boolean, literal, + number, object, optional, string, @@ -24,7 +25,7 @@ const stateConditionStruct = object({ entity_id: optional(string()), attribute: optional(string()), state: optional(string()), - for: optional(union([string(), forDictStruct])), + for: optional(union([number(), string(), forDictStruct])), enabled: optional(boolean()), }); 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 b17d3bfd71..2e6e67b18e 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 @@ -5,6 +5,7 @@ import { assert, assign, literal, + number, object, optional, string, @@ -31,7 +32,7 @@ const stateTriggerStruct = assign( attribute: optional(string()), from: optional(string()), to: optional(string()), - for: optional(union([string(), forDictStruct])), + for: optional(union([number(), string(), forDictStruct])), }) ); From fbf084bf009d64366d6f632a9775ca0386b9592c Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 20 Feb 2023 11:41:26 -0800 Subject: [PATCH 104/138] Fix map sizing in grids and h-stacks (#15290) * Fix map sizing in grids and h-stacks * ha-card as a flexbox --- src/panels/lovelace/cards/hui-map-card.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/panels/lovelace/cards/hui-map-card.ts b/src/panels/lovelace/cards/hui-map-card.ts index 2d70716f0f..05439d461d 100644 --- a/src/panels/lovelace/cards/hui-map-card.ts +++ b/src/panels/lovelace/cards/hui-map-card.ts @@ -255,6 +255,8 @@ class HuiMapCard extends LitElement implements LovelaceCard { return; } + root.style.height = "auto"; + const ratio = parseAspectRatio(this._config.aspect_ratio); root.style.paddingBottom = @@ -368,6 +370,8 @@ class HuiMapCard extends LitElement implements LovelaceCard { overflow: hidden; width: 100%; height: 100%; + display: flex; + flex-direction: column; } ha-map { From 74bc6eeda88766bd36c326cd9c678dc095e4042e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 20 Feb 2023 20:45:02 +0100 Subject: [PATCH 105/138] Add message when no preferred network (#15514) --- .../thread/thread-config-panel.ts | 28 ++++++++++++++----- src/translations/en.json | 2 ++ 2 files changed, 23 insertions(+), 7 deletions(-) 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 aefd881e60..f706f586e2 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 @@ -48,16 +48,30 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { slot="trigger" > Add border router${this.hass.localize( + "ui.panel.config.thread.add_open_thread_border_router" + )}
    +

    ${this.hass.localize("ui.panel.config.thread.my_network")}

    ${networks.preferred - ? html`

    - ${this.hass.localize("ui.panel.config.thread.my_network")} -

    - ${this._renderNetwork(networks.preferred)}` - : ""} + ? this._renderNetwork(networks.preferred) + : html` +
    +

    + ${this.hass.localize( + "ui.panel.config.thread.no_preferred_network" + )} +

    + + ${this.hass.localize( + "ui.panel.config.thread.add_open_thread_border_router" + )} +
    +
    `} ${networks.networks.length ? html`

    ${this.hass.localize("ui.panel.config.thread.other_networks")} @@ -231,7 +245,7 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { margin: 0 auto; direction: ltr; } - routers { + .routers { padding-bottom: 0; } .no-routers { diff --git a/src/translations/en.json b/src/translations/en.json index e17ad3e400..42bbb77173 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3268,6 +3268,8 @@ "thread": { "other_networks": "Other networks", "my_network": "My network", + "no_preferred_network": "You don't have a preferred network yet.", + "add_open_thread_border_router": "Add an OpenTread border router", "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", From be8cb8fb3fd6b330a4e1699888386c37ef22ea0f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 21:01:10 +0000 Subject: [PATCH 106/138] Bump @codemirror/view from 6.9.0 to 6.9.1 (#15502) * Bump @codemirror/view from 6.9.0 to 6.9.1 Bumps [@codemirror/view](https://github.com/codemirror/view) from 6.9.0 to 6.9.1. - [Release notes](https://github.com/codemirror/view/releases) - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/compare/6.9.0...6.9.1) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Deduplicate dependencies [dependabot skip] --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Steve Repsher --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5a99543297..9c5cc80276 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@codemirror/legacy-modes": "^6.3.1", "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", - "@codemirror/view": "^6.9.0", + "@codemirror/view": "^6.9.1", "@formatjs/intl-datetimeformat": "^6.4.3", "@formatjs/intl-getcanonicallocales": "^2.0.5", "@formatjs/intl-locale": "^3.0.11", diff --git a/yarn.lock b/yarn.lock index 44901fef68..1029d55fc8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1438,14 +1438,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.9.0": - version: 6.9.0 - resolution: "@codemirror/view@npm:6.9.0" +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.9.1": + version: 6.9.1 + resolution: "@codemirror/view@npm:6.9.1" dependencies: "@codemirror/state": ^6.1.4 style-mod: ^4.0.0 w3c-keyname: ^2.2.4 - checksum: c68b928220ab01a917d03e79aee2291b9ce524bb2bc5482354c7adb8ca7ba82ad2877283477a135eb09a239b9905985bb10eb91a2f9d0cb82739b4a97dc2ea2e + checksum: 485d54d338a27ebde6bec489e3008db80a2a801fe27db0d4a3c70181c8739f806f035855ba13d5b311d186ad2b130db07196e8b465ec102b0142df0689bff2f8 languageName: node linkType: hard @@ -9511,7 +9511,7 @@ fsevents@^1.2.7: "@codemirror/legacy-modes": ^6.3.1 "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 - "@codemirror/view": ^6.9.0 + "@codemirror/view": ^6.9.1 "@formatjs/intl-datetimeformat": ^6.4.3 "@formatjs/intl-getcanonicallocales": ^2.0.5 "@formatjs/intl-locale": ^3.0.11 From d56f35e6fd4a156bf80ef4156b37fee11c395ad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 00:02:30 -0500 Subject: [PATCH 107/138] Bump @types/leaflet from 1.9.0 to 1.9.1 (#15519) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1029d55fc8..2d4bfa28db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4230,11 +4230,11 @@ __metadata: linkType: hard "@types/leaflet@npm:*, @types/leaflet@npm:^1": - version: 1.9.0 - resolution: "@types/leaflet@npm:1.9.0" + version: 1.9.1 + resolution: "@types/leaflet@npm:1.9.1" dependencies: "@types/geojson": "*" - checksum: f3ee2e2fc8bd3480d77667471c8f774a3726ff7694a7d08d2423c05b40e28f00379c7d469b4cbd3b53a1bc96c75970c92f9da7908fc477cbac0eda2a9d17b6ad + checksum: 0ca56ff08e1c3e4cb09c98c75f89c1370367b9e39c1df16e7be1c9868efdf5d67a9fd4e471bf629877cf65c0134619b604232c1335dbc6f0942b214493426b6b languageName: node linkType: hard From 2cae0cd54f3d0c3a2bc88bba6210e9744882efae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 00:05:14 -0500 Subject: [PATCH 108/138] Bump @formatjs/intl-datetimeformat from 6.4.3 to 6.5.1 (#15522) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 9c5cc80276..b90ef0ff8e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.1", - "@formatjs/intl-datetimeformat": "^6.4.3", + "@formatjs/intl-datetimeformat": "^6.5.1", "@formatjs/intl-getcanonicallocales": "^2.0.5", "@formatjs/intl-locale": "^3.0.11", "@formatjs/intl-numberformat": "^8.3.3", diff --git a/yarn.lock b/yarn.lock index 2d4bfa28db..caf6e9220c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1513,14 +1513,14 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-datetimeformat@npm:^6.4.3": - version: 6.4.3 - resolution: "@formatjs/intl-datetimeformat@npm:6.4.3" +"@formatjs/intl-datetimeformat@npm:^6.5.1": + version: 6.5.1 + resolution: "@formatjs/intl-datetimeformat@npm:6.5.1" dependencies: "@formatjs/ecma402-abstract": 1.14.3 "@formatjs/intl-localematcher": 0.2.32 tslib: ^2.4.0 - checksum: 5c77fd9e823a9596665abf45607cfcc3aba786836aeb0a79aeb67026b7991ef4963f0b10998994fc2b487bb1c777145d5ef2938d3e8dd44d4048fe36e779f038 + checksum: 5e11ee237819e593f45753e43da94d002d78e0e7160cf14daf5e40e173cb9063996ea2e6e554cff7db9e4f6aa5366d2a463bccdcd92a4620ca1bfbea55fc4658 languageName: node linkType: hard @@ -9512,7 +9512,7 @@ fsevents@^1.2.7: "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.1 - "@formatjs/intl-datetimeformat": ^6.4.3 + "@formatjs/intl-datetimeformat": ^6.5.1 "@formatjs/intl-getcanonicallocales": ^2.0.5 "@formatjs/intl-locale": ^3.0.11 "@formatjs/intl-numberformat": ^8.3.3 From 1cffe4f9bf479595caf7a018928a04d3687d2c9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 00:06:56 -0500 Subject: [PATCH 109/138] Bump intl-messageformat from 10.3.0 to 10.3.1 (#15520) --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index b90ef0ff8e..06f1d32732 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "hls.js": "^1.3.3", "home-assistant-js-websocket": "^8.0.1", "idb-keyval": "^6.2.0", - "intl-messageformat": "^10.3.0", + "intl-messageformat": "^10.3.1", "js-yaml": "^4.1.0", "leaflet": "^1.9.3", "leaflet-draw": "^1.0.4", diff --git a/yarn.lock b/yarn.lock index caf6e9220c..79f339af5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1492,14 +1492,14 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.2.0": - version: 2.2.0 - resolution: "@formatjs/icu-messageformat-parser@npm:2.2.0" +"@formatjs/icu-messageformat-parser@npm:2.3.0": + version: 2.3.0 + resolution: "@formatjs/icu-messageformat-parser@npm:2.3.0" dependencies: "@formatjs/ecma402-abstract": 1.14.3 "@formatjs/icu-skeleton-parser": 1.3.18 tslib: ^2.4.0 - checksum: bd457714296a3503d57383ee9ba8c9fb01e0097379c2bcf18c827ff736f64cf83132f2ab539f534b716726d6554beede354c30180d543dd8a1cf8e4c8f842bd7 + checksum: e8aca733bed81c94ec16fa9f1a88dbaf93a644a8c5796a6ab1e795112dd1f6c1e92528a123483d3034ac5e6b2b454481ef61f7e56e6e77f1467f9524be7fe331 languageName: node linkType: hard @@ -9642,7 +9642,7 @@ fsevents@^1.2.7: husky: ^8.0.3 idb-keyval: ^6.2.0 instant-mocha: ^1.5.0 - intl-messageformat: ^10.3.0 + intl-messageformat: ^10.3.1 js-yaml: ^4.1.0 jszip: ^3.10.1 leaflet: ^1.9.3 @@ -10136,15 +10136,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"intl-messageformat@npm:^10.3.0": - version: 10.3.0 - resolution: "intl-messageformat@npm:10.3.0" +"intl-messageformat@npm:^10.3.1": + version: 10.3.1 + resolution: "intl-messageformat@npm:10.3.1" dependencies: "@formatjs/ecma402-abstract": 1.14.3 "@formatjs/fast-memoize": 1.2.8 - "@formatjs/icu-messageformat-parser": 2.2.0 + "@formatjs/icu-messageformat-parser": 2.3.0 tslib: ^2.4.0 - checksum: a92b2fec9ed0ba992ecfefbe9968c0f80961d6d23d105b16f3437108c61fe57d6e91e04392c4092335136399e047572996bc45d197ec0899473a3aac3627fed2 + checksum: 926f07c8a09ad10feaf2619119b8fc77057cb263d6dec1a06a74ca62b530cfcdfa36f58bd40691c1d3cd41c350b75bc7d96f0e402a81e0ecb700d4d7d0d8cce9 languageName: node linkType: hard From c95a600fbbc9db1ca5d33e8fe6ca8a3e4f7c00d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 00:08:37 -0500 Subject: [PATCH 110/138] Bump @formatjs/intl-relativetimeformat from 11.1.8 to 11.1.10 (#15523) --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 06f1d32732..f442e16e85 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@formatjs/intl-locale": "^3.0.11", "@formatjs/intl-numberformat": "^8.3.3", "@formatjs/intl-pluralrules": "^5.1.8", - "@formatjs/intl-relativetimeformat": "^11.1.8", + "@formatjs/intl-relativetimeformat": "^11.1.10", "@fullcalendar/core": "^6.1.4", "@fullcalendar/daygrid": "^6.1.4", "@fullcalendar/interaction": "^6.1.4", diff --git a/yarn.lock b/yarn.lock index 79f339af5c..daf4dfdc6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1575,14 +1575,14 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-relativetimeformat@npm:^11.1.8": - version: 11.1.8 - resolution: "@formatjs/intl-relativetimeformat@npm:11.1.8" +"@formatjs/intl-relativetimeformat@npm:^11.1.10": + version: 11.1.10 + resolution: "@formatjs/intl-relativetimeformat@npm:11.1.10" dependencies: "@formatjs/ecma402-abstract": 1.14.3 "@formatjs/intl-localematcher": 0.2.32 tslib: ^2.4.0 - checksum: 2ca379c549d5998366e8648843e810ffcba88e42112d6b6a8bd8d5898d1bc84137245ee44f7ef83c3fe85e33c122bb366f261478facd2efd78c98718e53fe404 + checksum: e0a2994a35cdce02272bf4eff0806e940ee9f63cbe6988b83da9a8aea06365ac4ac037c39f700d4b84a29af13452503642b042f7d32ec7fdd823f76de00ad919 languageName: node linkType: hard @@ -9517,7 +9517,7 @@ fsevents@^1.2.7: "@formatjs/intl-locale": ^3.0.11 "@formatjs/intl-numberformat": ^8.3.3 "@formatjs/intl-pluralrules": ^5.1.8 - "@formatjs/intl-relativetimeformat": ^11.1.8 + "@formatjs/intl-relativetimeformat": ^11.1.10 "@fullcalendar/core": ^6.1.4 "@fullcalendar/daygrid": ^6.1.4 "@fullcalendar/interaction": ^6.1.4 From 850609b1d00bfc37a99b6a779dff43f99d78a1b1 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Tue, 21 Feb 2023 00:36:18 -0800 Subject: [PATCH 111/138] Resync thermostat card setpoint values if service call fails (#15497) --- .../lovelace/cards/hui-thermostat-card.ts | 124 ++++++++++++++---- 1 file changed, 100 insertions(+), 24 deletions(-) diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index 58983fecf5..f75d2e95d1 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -90,6 +90,8 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { @query("ha-card") private _card?: HaCard; + @state() private resyncSetpoint = false; + public getCardSize(): number { return 7; } @@ -120,11 +122,23 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { const name = this._config!.name || computeStateName(this.hass!.states[this._config!.entity]); - const targetTemp = - stateObj.attributes.temperature !== null && - Number.isFinite(Number(stateObj.attributes.temperature)) - ? stateObj.attributes.temperature - : stateObj.attributes.min_temp; + const targetTemp = this.resyncSetpoint + ? // If the user set position in the slider is out of sync with the entity + // value, then rerendering the slider with same $value a second time + // does not move the slider. Need to set it to a different dummy value + // for one update cycle to force it to rerender to the desired value. + stateObj.attributes.min_temp - 1 + : stateObj.attributes.temperature !== null && + Number.isFinite(Number(stateObj.attributes.temperature)) + ? stateObj.attributes.temperature + : stateObj.attributes.min_temp; + + const targetLow = this.resyncSetpoint + ? stateObj.attributes.min_temp - 1 + : stateObj.attributes.target_temp_low; + const targetHigh = this.resyncSetpoint + ? stateObj.attributes.min_temp - 1 + : stateObj.attributes.target_temp_high; const slider = stateObj.state === UNAVAILABLE @@ -132,8 +146,8 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { : html` setTimeout(resolve, 2000)); + + const newState = this.hass!.states[this._config!.entity] as ClimateEntity; + delete data.entity_id; + + if ( + Object.entries(data).every( + ([key, value]) => newState.attributes[key] === value + ) + ) { + return; + } + + this.resyncSetpoint = true; + await this.updateComplete; + this.resyncSetpoint = false; + } + static get styles(): CSSResultGroup { return css` :host { From 77f7a5647d920fd7366870214fb3ef75695fd5e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Feb 2023 09:46:30 +0100 Subject: [PATCH 112/138] Bump @formatjs/intl-getcanonicallocales from 2.0.5 to 2.1.0 (#15521) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f442e16e85..3e5b05cdf7 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.1", "@formatjs/intl-datetimeformat": "^6.5.1", - "@formatjs/intl-getcanonicallocales": "^2.0.5", + "@formatjs/intl-getcanonicallocales": "^2.1.0", "@formatjs/intl-locale": "^3.0.11", "@formatjs/intl-numberformat": "^8.3.3", "@formatjs/intl-pluralrules": "^5.1.8", diff --git a/yarn.lock b/yarn.lock index daf4dfdc6d..cf520bbde0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1524,7 +1524,7 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-getcanonicallocales@npm:2.0.5, @formatjs/intl-getcanonicallocales@npm:^2.0.5": +"@formatjs/intl-getcanonicallocales@npm:2.0.5": version: 2.0.5 resolution: "@formatjs/intl-getcanonicallocales@npm:2.0.5" dependencies: @@ -1533,6 +1533,15 @@ __metadata: languageName: node linkType: hard +"@formatjs/intl-getcanonicallocales@npm:^2.1.0": + version: 2.1.0 + resolution: "@formatjs/intl-getcanonicallocales@npm:2.1.0" + dependencies: + tslib: ^2.4.0 + checksum: f099231b1e82ea1698b9a12c722611643e3e4a7c42d6e26612e880979349e078f5545edd741d08f156ccea44ea34e619c4636b870d42de73cc408c95e58b4c75 + languageName: node + linkType: hard + "@formatjs/intl-locale@npm:^3.0.11": version: 3.0.11 resolution: "@formatjs/intl-locale@npm:3.0.11" @@ -9513,7 +9522,7 @@ fsevents@^1.2.7: "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.1 "@formatjs/intl-datetimeformat": ^6.5.1 - "@formatjs/intl-getcanonicallocales": ^2.0.5 + "@formatjs/intl-getcanonicallocales": ^2.1.0 "@formatjs/intl-locale": ^3.0.11 "@formatjs/intl-numberformat": ^8.3.3 "@formatjs/intl-pluralrules": ^5.1.8 From a469a926015b1cc25c23adb2397c6201d1b3ab02 Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Tue, 21 Feb 2023 03:50:28 -0500 Subject: [PATCH 113/138] Bump webpack to v5.72.1 and tweak stats scripts (#15516) --- demo/script/size_stats | 9 +++-- package.json | 2 +- script/size_stats | 9 +++-- yarn.lock | 80 +++++++++++++++++++++--------------------- 4 files changed, 53 insertions(+), 47 deletions(-) diff --git a/demo/script/size_stats b/demo/script/size_stats index 6d785f36b3..999677bb42 100755 --- a/demo/script/size_stats +++ b/demo/script/size_stats @@ -6,6 +6,9 @@ set -e cd "$(dirname "$0")/.." -STATS=1 NODE_ENV=production ../node_modules/.bin/webpack --profile --json > compilation-stats.json -npx webpack-bundle-analyzer compilation-stats.json dist/frontend_latest -rm compilation-stats.json +export STATS=1 +statsfile="compilation-stats-demo.json" + +./node_modules/.bin/webpack-cli --profile --node-env=production --json=$statsfile +npx webpack-bundle-analyzer $statsfile dist/frontend_latest +rm -f $statsfile diff --git a/package.json b/package.json index 3e5b05cdf7..a301294286 100644 --- a/package.json +++ b/package.json @@ -237,7 +237,7 @@ "typescript": "^4.9.5", "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", - "webpack": "^5.55.1", + "webpack": "=5.72.1", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.11.1", "webpack-manifest-plugin": "^5.0.0", diff --git a/script/size_stats b/script/size_stats index f93f0174dc..5c550c58b5 100755 --- a/script/size_stats +++ b/script/size_stats @@ -6,6 +6,9 @@ set -e cd "$(dirname "$0")/.." -STATS=1 NODE_ENV=production ./node_modules/.bin/webpack --profile --json > compilation-stats.json -npx webpack-bundle-analyzer compilation-stats.json hass_frontend/frontend_latest -rm compilation-stats.json +export STATS=1 +statsfile="compilation-stats.json" + +./node_modules/.bin/webpack-cli --profile --node-env=production --json=$statsfile +npx webpack-bundle-analyzer $statsfile hass_frontend/frontend_latest +rm -f $statsfile diff --git a/yarn.lock b/yarn.lock index cf520bbde0..873a65a2e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4049,13 +4049,13 @@ __metadata: languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.0": - version: 3.7.0 - resolution: "@types/eslint-scope@npm:3.7.0" +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.4 + resolution: "@types/eslint-scope@npm:3.7.4" dependencies: "@types/eslint": "*" "@types/estree": "*" - checksum: 86b54f375259fe97955660b08215895b38769cd5c054d6120ded129ee94d36115d7e3bca31ca61bddcd8fc7bd168bc6fb74ccf25521c9744d9e47682c047d876 + checksum: ea6a9363e92f301cd3888194469f9ec9d0021fe0a397a97a6dd689e7545c75de0bd2153dfb13d3ab532853a278b6572c6f678ce846980669e41029d205653460 languageName: node linkType: hard @@ -4069,10 +4069,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^0.0.50": - version: 0.0.50 - resolution: "@types/estree@npm:0.0.50" - checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922 +"@types/estree@npm:*, @types/estree@npm:^0.0.51": + version: 0.0.51 + resolution: "@types/estree@npm:0.0.51" + checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 languageName: node linkType: hard @@ -5261,11 +5261,11 @@ __metadata: linkType: hard "acorn@npm:^8.4.1, acorn@npm:^8.5.0": - version: 8.7.0 - resolution: "acorn@npm:8.7.0" + version: 8.8.2 + resolution: "acorn@npm:8.8.2" bin: acorn: bin/acorn - checksum: e0f79409d68923fbf1aa6d4166f3eedc47955320d25c89a20cc822e6ba7c48c5963d5bc657bc242d68f7a4ac9faf96eef033e8f73656da6c640d4219935fdfd0 + checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 languageName: node linkType: hard @@ -7579,13 +7579,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.8.3": - version: 5.8.3 - resolution: "enhanced-resolve@npm:5.8.3" +"enhanced-resolve@npm:^5.9.3": + version: 5.12.0 + resolution: "enhanced-resolve@npm:5.12.0" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: d79fbe531106448b768bb0673fb623ec0202d7ee70373ab7d4f4745d5dfe0806f38c9db7e7da8c941288fe475ab3d538db3791fce522056eeea40ca398c9e287 + checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174 languageName: node linkType: hard @@ -9235,7 +9235,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da @@ -9704,7 +9704,7 @@ fsevents@^1.2.7: vis-network: ^9.1.2 vue: ^2.7.14 vue2-daterange-picker: ^0.6.8 - webpack: ^5.55.1 + webpack: =5.72.1 webpack-cli: ^5.0.1 webpack-dev-server: ^4.11.1 webpack-manifest-plugin: ^5.0.0 @@ -10907,10 +10907,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"json-parse-better-errors@npm:^1.0.2": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d +"json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f languageName: node linkType: hard @@ -16194,13 +16194,13 @@ typescript@^3.8.3: languageName: node linkType: hard -"watchpack@npm:^2.2.0": - version: 2.2.0 - resolution: "watchpack@npm:2.2.0" +"watchpack@npm:^2.3.1": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" dependencies: glob-to-regexp: ^0.4.1 graceful-fs: ^4.1.2 - checksum: e275f48fae29edee3195c51a8312b609581b9be5ce323d3102ffd082cb124f48d7a393ce05e4110239e4354379e04d78a97ceb26ae367746e7e218bf258135c8 + checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 languageName: node linkType: hard @@ -16372,19 +16372,19 @@ typescript@^3.8.3: languageName: node linkType: hard -"webpack-sources@npm:^3.2.0": - version: 3.2.1 - resolution: "webpack-sources@npm:3.2.1" - checksum: 438ee4759f70ee2d5ae17a2fc5e66a1f71f0ba8ad9de77edfaf4180c82925f6504790c5a1ddfa2a6d409212cd9e7332a6822d6acabb0f39303bc3b14354872e6 +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 languageName: node linkType: hard -"webpack@npm:^5.55.1": - version: 5.55.1 - resolution: "webpack@npm:5.55.1" +"webpack@npm:=5.72.1": + version: 5.72.1 + resolution: "webpack@npm:5.72.1" dependencies: - "@types/eslint-scope": ^3.7.0 - "@types/estree": ^0.0.50 + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^0.0.51 "@webassemblyjs/ast": 1.11.1 "@webassemblyjs/wasm-edit": 1.11.1 "@webassemblyjs/wasm-parser": 1.11.1 @@ -16392,27 +16392,27 @@ typescript@^3.8.3: acorn-import-assertions: ^1.7.6 browserslist: ^4.14.5 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.8.3 + enhanced-resolve: ^5.9.3 es-module-lexer: ^0.9.0 eslint-scope: 5.1.1 events: ^3.2.0 glob-to-regexp: ^0.4.1 - graceful-fs: ^4.2.4 - json-parse-better-errors: ^1.0.2 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 loader-runner: ^4.2.0 mime-types: ^2.1.27 neo-async: ^2.6.2 schema-utils: ^3.1.0 tapable: ^2.1.1 terser-webpack-plugin: ^5.1.3 - watchpack: ^2.2.0 - webpack-sources: ^3.2.0 + watchpack: ^2.3.1 + webpack-sources: ^3.2.3 peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 70b447f76d4320bd82229cf7b787c6067c40d35142295408dd662eaa3bdf0d97f587d7913b981e4cc25cff08bb14307b85c18ed4a7b270b22e6586c5770d3f1e + checksum: d1eff085eee1c67a68f7bf1d077ea202c1e68a0de0e0866274984769838c3f224fbc64e847e1a1bbc6eba9fb6a9965098809cc0be9292b573767bb5d8d2df96e languageName: node linkType: hard From 0b54e60b9169b63b2c3ffcc782401b15a858ac5e Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Tue, 21 Feb 2023 03:51:06 -0500 Subject: [PATCH 114/138] Update ZWaveJSController interface (#15230) --- src/data/zwave_js.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index af0bd8f2b3..779566e5e8 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -92,6 +92,22 @@ enum NodeType { "End Node" = 1, } +enum RFRegion { + "Europe" = 0x00, + "USA" = 0x01, + "Australia/New Zealand" = 0x02, + "Hong Kong" = 0x03, + "India" = 0x05, + "Israel" = 0x06, + "Russia" = 0x07, + "China" = 0x08, + "USA (Long Range)" = 0x09, + "Japan" = 0x20, + "Korea" = 0x21, + "Unknown" = 0xfe, + "Default (EU)" = 0xff, +} + export enum FirmwareUpdateStatus { Error_Timeout = -1, Error_Checksum = 0, @@ -149,6 +165,7 @@ export interface ZWaveJSController { sdk_version: string; type: number; own_node_id: number; + rf_region: RFRegion | null; is_primary: boolean; is_using_home_id_from_other_network: boolean; is_sis_present: boolean; From 88205a94d668241042c60818728915a7a570d507 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 21 Feb 2023 11:08:19 +0100 Subject: [PATCH 115/138] Bump babel (#15526 * Bump babel * fix lint * Restore src/cast/dev_const.ts --- package.json | 12 +- .../lovelace/cards/hui-thermostat-card.ts | 4 +- yarn.lock | 297 +++++++++--------- 3 files changed, 158 insertions(+), 155 deletions(-) diff --git a/package.json b/package.json index a301294286..e35362f545 100644 --- a/package.json +++ b/package.json @@ -146,18 +146,18 @@ "xss": "^1.0.14" }, "devDependencies": { - "@babel/core": "^7.20.12", + "@babel/core": "^7.21.0", "@babel/plugin-external-helpers": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-decorators": "^7.20.13", + "@babel/plugin-proposal-decorators": "^7.21.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/preset-env": "^7.20.2", - "@babel/preset-typescript": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", "@koa/cors": "^4.0.0", "@octokit/auth-oauth-device": "^4.0.4", "@octokit/rest": "^19.0.7", @@ -180,8 +180,8 @@ "@types/sortablejs": "^1", "@types/tar": "^6", "@types/webspeechapi": "^0.0.29", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", + "@typescript-eslint/eslint-plugin": "^5.53.0", + "@typescript-eslint/parser": "^5.53.0", "@web/dev-server": "^0.0.24", "@web/dev-server-rollup": "^0.2.11", "babel-loader": "^9.1.2", diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index f75d2e95d1..956782dec3 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -517,7 +517,9 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { // After updating temperature, wait 2s and check if the values // from call service are reflected in the entity. If not, resync // the slider to the entity values. - await new Promise((resolve) => setTimeout(resolve, 2000)); + await new Promise((resolve) => { + setTimeout(resolve, 2000); + }); const newState = this.hass!.states[this._config!.entity] as ClimateEntity; delete data.entity_id; diff --git a/yarn.lock b/yarn.lock index 873a65a2e7..88ab3165f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,7 +5,7 @@ __metadata: version: 6 cacheKey: 8 -"@ampproject/remapping@npm:^2.1.0": +"@ampproject/remapping@npm:^2.2.0": version: 2.2.0 resolution: "@ampproject/remapping@npm:2.2.0" dependencies: @@ -53,37 +53,38 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.20.12": - version: 7.20.12 - resolution: "@babel/core@npm:7.20.12" +"@babel/core@npm:^7.11.1, @babel/core@npm:^7.12.3, @babel/core@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/core@npm:7.21.0" dependencies: - "@ampproject/remapping": ^2.1.0 + "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.20.7 + "@babel/generator": ^7.21.0 "@babel/helper-compilation-targets": ^7.20.7 - "@babel/helper-module-transforms": ^7.20.11 - "@babel/helpers": ^7.20.7 - "@babel/parser": ^7.20.7 + "@babel/helper-module-transforms": ^7.21.0 + "@babel/helpers": ^7.21.0 + "@babel/parser": ^7.21.0 "@babel/template": ^7.20.7 - "@babel/traverse": ^7.20.12 - "@babel/types": ^7.20.7 + "@babel/traverse": ^7.21.0 + "@babel/types": ^7.21.0 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: 62e6c3e2149a70b5c9729ef5f0d3e2e97e9dcde89fc039c8d8e3463d5d7ba9b29ee84d10faf79b61532ac1645aa62f2bd42338320617e6e3a8a4d8e2a27076e7 + checksum: 357f4dd3638861ceebf6d95ff49ad8b902065ee8b7b352621deed5666c2a6d702a48ca7254dba23ecae2a0afb67d20f90db7dd645c3b75e35e72ad9776c671aa languageName: node linkType: hard -"@babel/generator@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/generator@npm:7.20.7" +"@babel/generator@npm:^7.21.0": + version: 7.21.1 + resolution: "@babel/generator@npm:7.21.1" dependencies: - "@babel/types": ^7.20.7 + "@babel/types": ^7.21.0 "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 84b6983ffdb50c80c1c2e3f3c32617a7133d8effd1065f3e0f9bba188a7d54ab42a4dd5e42b61b843c65f9dd1aa870036ff0f848ebd42707aaa8a2b6d31d04f5 + checksum: 69085a211ff91a7a608ee3f86e6fcb9cf5e724b756d792a713b0c328a671cd3e423e1ef1b12533f366baba0616caffe0a7ba9d328727eab484de5961badbef00 languageName: node linkType: hard @@ -121,21 +122,21 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.20.12, @babel/helper-create-class-features-plugin@npm:^7.20.2": - version: 7.20.12 - resolution: "@babel/helper-create-class-features-plugin@npm:7.20.12" +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-create-class-features-plugin@npm:7.21.0" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.19.0 - "@babel/helper-member-expression-to-functions": ^7.20.7 + "@babel/helper-function-name": ^7.21.0 + "@babel/helper-member-expression-to-functions": ^7.21.0 "@babel/helper-optimise-call-expression": ^7.18.6 "@babel/helper-replace-supers": ^7.20.7 "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 "@babel/helper-split-export-declaration": ^7.18.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 1e9ed4243b75278fa24deb40dc62bf537b79307987223a2d2d2ae5abf7ba6dc8435d6e3bb55d52ceb30d3e1eba88e7eb6a1885a8bb519e5cfc3e9dedb97d43e6 + checksum: 3e781d91d1056ea9b3a0395f3017492594a8b86899119b4a1645227c31727b8bec9bc8f6b72e86b1c5cf2dd6690893d2e8c5baff4974c429e616ead089552a21 languageName: node linkType: hard @@ -183,13 +184,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/helper-function-name@npm:7.19.0" +"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.19.0, @babel/helper-function-name@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-function-name@npm:7.21.0" dependencies: - "@babel/template": ^7.18.10 - "@babel/types": ^7.19.0 - checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e + "@babel/template": ^7.20.7 + "@babel/types": ^7.21.0 + checksum: d63e63c3e0e3e8b3138fa47b0cd321148a300ef12b8ee951196994dcd2a492cc708aeda94c2c53759a5c9177fffaac0fd8778791286746f72a000976968daf4e languageName: node linkType: hard @@ -202,12 +203,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/helper-member-expression-to-functions@npm:7.20.7" +"@babel/helper-member-expression-to-functions@npm:^7.20.7, @babel/helper-member-expression-to-functions@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-member-expression-to-functions@npm:7.21.0" dependencies: - "@babel/types": ^7.20.7 - checksum: cec17aab7e964830b0146e575bd141127032319f26ed864a65b35abd75ad618d264d3e11449b9b4e29cfd95bb1a7e774afddd4884fdcc29c36ac9cbd2b66359f + "@babel/types": ^7.21.0 + checksum: 49cbb865098195fe82ba22da3a8fe630cde30dcd8ebf8ad5f9a24a2b685150c6711419879cf9d99b94dad24cff9244d8c2a890d3d7ec75502cd01fe58cff5b5d languageName: node linkType: hard @@ -220,9 +221,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.19.6, @babel/helper-module-transforms@npm:^7.20.11": - version: 7.20.11 - resolution: "@babel/helper-module-transforms@npm:7.20.11" +"@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.19.6, @babel/helper-module-transforms@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-module-transforms@npm:7.21.0" dependencies: "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-module-imports": ^7.18.6 @@ -230,9 +231,9 @@ __metadata: "@babel/helper-split-export-declaration": ^7.18.6 "@babel/helper-validator-identifier": ^7.19.1 "@babel/template": ^7.20.7 - "@babel/traverse": ^7.20.10 - "@babel/types": ^7.20.7 - checksum: 29319ebafa693d48756c6ba0d871677bb0037e0da084fbe221a17c38d57093fc8aa38543c07d76e788266a937976e37ab4901971ca7f237c5ab45f524b9ecca0 + "@babel/traverse": ^7.21.0 + "@babel/types": ^7.21.0 + checksum: bd92d0b73c12dc2f37be906954c58cc3fbec74ba243731e1aa223063b422eef6b961ca7fe19737a073be18db298e1385d370df2e5781646b8c09ecebd7c847de languageName: node linkType: hard @@ -321,10 +322,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-option@npm:7.18.6" - checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf +"@babel/helper-validator-option@npm:^7.18.6, @babel/helper-validator-option@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-validator-option@npm:7.21.0" + checksum: 8ece4c78ffa5461fd8ab6b6e57cc51afad59df08192ed5d84b475af4a7193fc1cb794b59e3e7be64f3cdc4df7ac78bf3dbb20c129d7757ae078e6279ff8c2f07 languageName: node linkType: hard @@ -340,14 +341,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.20.7": - version: 7.20.13 - resolution: "@babel/helpers@npm:7.20.13" +"@babel/helpers@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helpers@npm:7.21.0" dependencies: "@babel/template": ^7.20.7 - "@babel/traverse": ^7.20.13 - "@babel/types": ^7.20.7 - checksum: d62076fa834f342798f8c3fd7aec0870cc1725d273d99e540cbaa8d6c3ed10258228dd14601c8e66bfeabbb9424c3b31090ecc467fe855f7bd72c4734df7fb09 + "@babel/traverse": ^7.21.0 + "@babel/types": ^7.21.0 + checksum: 9370dad2bb665c551869a08ac87c8bdafad53dbcdce1f5c5d498f51811456a3c005d9857562715151a0f00b2e912ac8d89f56574f837b5689f5f5072221cdf54 languageName: node linkType: hard @@ -362,12 +363,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.13, @babel/parser@npm:^7.20.7": - version: 7.20.15 - resolution: "@babel/parser@npm:7.20.15" +"@babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0": + version: 7.21.1 + resolution: "@babel/parser@npm:7.21.1" bin: parser: ./bin/babel-parser.js - checksum: 1d0f47ca67ff2652f1c0ff1570bed8deccbc4b53509e7cd73476af9cc7ed23480c99f1179bd6d0be01612368b92b39e206d330ad6054009d699934848a89298b + checksum: a564cff6dec4201a611d1f2ae5af8d7436ce80550e75a77ee72dca6b094df6188b5a4ccfae6a98c85991b56a51e6c48159e466cc5a374c7a37af706fcb5a6bc2 languageName: node linkType: hard @@ -445,18 +446,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-decorators@npm:^7.20.13": - version: 7.20.13 - resolution: "@babel/plugin-proposal-decorators@npm:7.20.13" +"@babel/plugin-proposal-decorators@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-proposal-decorators@npm:7.21.0" dependencies: - "@babel/helper-create-class-features-plugin": ^7.20.12 + "@babel/helper-create-class-features-plugin": ^7.21.0 "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-replace-supers": ^7.20.7 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/plugin-syntax-decorators": ^7.19.0 + "@babel/plugin-syntax-decorators": ^7.21.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 445723b410627d52ab2d195589eb9fe5fbd66a00ebfc9bedcf63b6cbfdfc42e163d77ac391f8738ab9f632779e6f2aa427fe468fbbd6661177ef0cdca735a7d5 + checksum: 2889a060010af7ac2e24f7a193262e50a94e254dd86d273e25a2bec2a2f97dd95b136bb933f63448c1cdde4f38ac7877837685657aa8161699eb226d9f1eb453 languageName: node linkType: hard @@ -559,16 +560,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.18.9, @babel/plugin-proposal-optional-chaining@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.20.7" +"@babel/plugin-proposal-optional-chaining@npm:^7.18.9, @babel/plugin-proposal-optional-chaining@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" dependencies: "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 274b8932335bd064ca24cf1a4da2b2c20c92726d4bfa8b0cb5023857479b8481feef33505c16650c7b9239334e5c6959babc924816324c4cf223dd91c7ca79bc + checksum: 11c5449e01b18bb8881e8e005a577fa7be2fe5688e2382c8822d51f8f7005342a301a46af7b273b1f5645f9a7b894c428eee8526342038a275ef6ba4c8d8d746 languageName: node linkType: hard @@ -643,14 +644,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-decorators@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/plugin-syntax-decorators@npm:7.19.0" +"@babel/plugin-syntax-decorators@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-syntax-decorators@npm:7.21.0" dependencies: - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 105a13d581a8643ba145d4d0d31f34a492b352defa5b155e785702da6ce9c3ff0c1843ba9bee176e35f6e38afa19dc7bd12c120220af0495de4b128f1dd27f6e + checksum: 31108e73c3e569f2795ddb4f5f1f32c13c6be97a107d41e318c8f58ca3fde0fa958af3d1a302ab64f36f73ce4d6dda7889732243561c087a7cc3b22192d42a65 languageName: node linkType: hard @@ -1163,16 +1164,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.18.6": - version: 7.20.2 - resolution: "@babel/plugin-transform-typescript@npm:7.20.2" +"@babel/plugin-transform-typescript@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-transform-typescript@npm:7.21.0" dependencies: - "@babel/helper-create-class-features-plugin": ^7.20.2 + "@babel/helper-create-class-features-plugin": ^7.21.0 "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-typescript": ^7.20.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 14434eb77cb3c8c4187a055eabdd5ff8b3e90a37ac95ecc7c9007ea8fc5660e0652c445646a2a25836a02d91944e0dc1e8b58ef55b063a901e54a24fdb4168af + checksum: 091931118eb515738a4bc8245875f985fc9759d3f85cdf08ee641779b41520241b369404e2bb86fc81907ad827678fdb704e8e5a995352def5dd3051ea2cd870 languageName: node linkType: hard @@ -1299,16 +1300,16 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/preset-typescript@npm:7.18.6" +"@babel/preset-typescript@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/preset-typescript@npm:7.21.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-transform-typescript": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-validator-option": ^7.21.0 + "@babel/plugin-transform-typescript": ^7.21.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7fe0da5103eb72d3cf39cf3e138a794c8cdd19c0b38e3e101507eef519c46a87a0d6d0e8bc9e28a13ea2364001ebe7430b9d75758aab4c3c3a8db9a487b9dc7c + checksum: 6e1f4d7294de2678fbaf36035e98847b2be432f40fe7a1204e5e45b8b05bcbe22902fe0d726e16af14de5bc08987fae28a7899871503fd661050d85f58755af6 languageName: node linkType: hard @@ -1332,32 +1333,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.20.10, @babel/traverse@npm:^7.20.12, @babel/traverse@npm:^7.20.13, @babel/traverse@npm:^7.20.7": - version: 7.20.13 - resolution: "@babel/traverse@npm:7.20.13" +"@babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/traverse@npm:7.21.0" dependencies: "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.20.7 + "@babel/generator": ^7.21.0 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.19.0 + "@babel/helper-function-name": ^7.21.0 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.20.13 - "@babel/types": ^7.20.7 + "@babel/parser": ^7.21.0 + "@babel/types": ^7.21.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: 30ca6e0bd18233fda48fa09315efd14dfc61dcf5b8fa3712b343bfc61b32bc63b5e85ea1773cc9576c9b293b96f46b4589aaeb0a52e1f3eeac4edc076d049fc7 + checksum: 99241b22db509d2f01a9af51bfab1d68e73cd3b66bbc2560f0f65e49880f68a05ead913e72a4e464152430a027f0c7822f126d6f1bcc3bc3e01ef8b8558a6dc6 languageName: node linkType: hard -"@babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.20.7 - resolution: "@babel/types@npm:7.20.7" +"@babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.21.0 + resolution: "@babel/types@npm:7.21.0" dependencies: "@babel/helper-string-parser": ^7.19.4 "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: b39af241f0b72bba67fd6d0d23914f6faec8c0eba8015c181cbd5ea92e59fc91a52a1ab490d3520c7dbd19ddb9ebb76c476308f6388764f16d8201e37fae6811 + checksum: dbcdda202b3a2bfd59e4de880ce38652f1f8957893a9751be069ac86e47ad751222070fe6cd92220214d77973f1474e4e1111c16dc48199dfca1489c0ee8c0c5 languageName: node linkType: hard @@ -1854,7 +1855,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.17 resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: @@ -4467,13 +4468,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.52.0" +"@typescript-eslint/eslint-plugin@npm:^5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.53.0" dependencies: - "@typescript-eslint/scope-manager": 5.52.0 - "@typescript-eslint/type-utils": 5.52.0 - "@typescript-eslint/utils": 5.52.0 + "@typescript-eslint/scope-manager": 5.53.0 + "@typescript-eslint/type-utils": 5.53.0 + "@typescript-eslint/utils": 5.53.0 debug: ^4.3.4 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 @@ -4487,43 +4488,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: cff07ee94d8ab2a1b6c33b5c5bf641eff2bf2bebc0f35a9d8b3f128fd610e27a4aaf620bc2ad23608ad161b1810b7e32e5a2e0f746cc5094c3f506f7a14daa34 + checksum: 12dffe65969d8e5248c86a700fe46a737e55ecafb276933e747b4731eab6266fe55e2d43a34b8b340179fe248e127d861cd016a7614b1b9804cd0687c99616d1 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/parser@npm:5.52.0" +"@typescript-eslint/parser@npm:^5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/parser@npm:5.53.0" dependencies: - "@typescript-eslint/scope-manager": 5.52.0 - "@typescript-eslint/types": 5.52.0 - "@typescript-eslint/typescript-estree": 5.52.0 + "@typescript-eslint/scope-manager": 5.53.0 + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/typescript-estree": 5.53.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 1d8ff6e932f9c9db8d24b16ce89fd963f0982c38559e500aa1f8dc5cd66abd02f1659dd1a1361ce550def05331803caa69a69a039b54c94fc0f22919a2305c12 + checksum: 979e5d63793a9e64998b1f956ba0f00f8a2674db3a664fafce7b2433323f5248bd776af8305e2419d73a9d94c55176fee099abc5c153b4cc52e5765c725c1edd languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/scope-manager@npm:5.52.0" +"@typescript-eslint/scope-manager@npm:5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/scope-manager@npm:5.53.0" dependencies: - "@typescript-eslint/types": 5.52.0 - "@typescript-eslint/visitor-keys": 5.52.0 - checksum: 9a03fe30f8e90a5106c482478f213eefdd09f2f74e24d9dc59b453885466a758fe6d1cd24d706aed6188fb03c84b16ca6491cf20da6b16b8fc53cad8b8c327f2 + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/visitor-keys": 5.53.0 + checksum: 51f31dc01e95908611f402441f58404da80a338c0237b2b82f4a7b0b2e8868c4bfe8f7cf44b2567dd56533de609156a5d4ac54bb1f9f09c7014b99428aef2543 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/type-utils@npm:5.52.0" +"@typescript-eslint/type-utils@npm:5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/type-utils@npm:5.53.0" dependencies: - "@typescript-eslint/typescript-estree": 5.52.0 - "@typescript-eslint/utils": 5.52.0 + "@typescript-eslint/typescript-estree": 5.53.0 + "@typescript-eslint/utils": 5.53.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -4531,23 +4532,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ac5422040461febab8a2eeec76d969024ccff76203dec357f7220c9b5e0dde96e3e3a76fd4118d42b50bd5bfb3a194aaceeb63417a2ac4e1ebf5e687558a9a10 + checksum: 52c40967c5fabd58c2ae8bf519ef89e4feb511e4df630aeaeac8335661a79b6b3a32d30a61a5f1d8acc703f21c4d90751a5d41cda1b35d08867524da11bc2e1d languageName: node linkType: hard -"@typescript-eslint/types@npm:5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/types@npm:5.52.0" - checksum: 018940d61aebf7cf3f7de1b9957446e2ea01f08fe950bef4788c716a3a88f7c42765fe7d80152b0d0428fcd4bd3ace2dfa8c459ba1c59d9a84e951642180f869 +"@typescript-eslint/types@npm:5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/types@npm:5.53.0" + checksum: b0eaf23de4ab13697d4d2095838c959a3f410c30f0d19091e5ca08e62320c3cc3c72bcb631823fb6a4fbb31db0a059e386a0801244930d0a88a6a698e5f46548 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.52.0" +"@typescript-eslint/typescript-estree@npm:5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.53.0" dependencies: - "@typescript-eslint/types": 5.52.0 - "@typescript-eslint/visitor-keys": 5.52.0 + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/visitor-keys": 5.53.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -4556,35 +4557,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 67d396907fee3d6894e26411a5098a37f07e5d50343189e6361ff7db91c74a7ffe2abd630d11f14c2bda1f4af13edf52b80b11cbccb55b44079c7cec14c9e108 + checksum: 6e119c8e4167c8495d728c5556a834545a9c064918dd5e7b79b0d836726f4f8e2a0297b0ac82bf2b71f1e5427552217d0b59d8fb1406fd79bd3bf91b75dca873 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/utils@npm:5.52.0" +"@typescript-eslint/utils@npm:5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/utils@npm:5.53.0" dependencies: "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.52.0 - "@typescript-eslint/types": 5.52.0 - "@typescript-eslint/typescript-estree": 5.52.0 + "@typescript-eslint/scope-manager": 5.53.0 + "@typescript-eslint/types": 5.53.0 + "@typescript-eslint/typescript-estree": 5.53.0 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 01906be5262ece36537e9d586e4d2d4791e05752a9354bcb42b1f5bf965f53daa13309c61c3dff5e201ea28c298e4e01cf0c93738afa0099fea0da3b1d8cb3a5 + checksum: 18e6bac14ae853385a74123759850bca367904723e170c37416fc014673eb714afb6bb090367bff61494a8387e941b6af65ee5f4f845f7177fabb4df85e01643 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.52.0": - version: 5.52.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.52.0" +"@typescript-eslint/visitor-keys@npm:5.53.0": + version: 5.53.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.53.0" dependencies: - "@typescript-eslint/types": 5.52.0 + "@typescript-eslint/types": 5.53.0 eslint-visitor-keys: ^3.3.0 - checksum: 33b44f0cd35b7b47f34e89d52e47b8d8200f55af306b22db4de104d79f65907458ea022e548f50d966e32fea150432ac9c1ae65b3001b0ad2ac8a17c0211f370 + checksum: 090695883c15364c6f401e97f56b13db0f31c1114f3bd22562bd41734864d27f6a3c80de33957e9dedab2d5f94b0f4480ba3fde1d4574e74dca4593917b7b54a languageName: node linkType: hard @@ -9501,18 +9502,18 @@ fsevents@^1.2.7: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": ^7.20.12 + "@babel/core": ^7.21.0 "@babel/plugin-external-helpers": ^7.18.6 "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-decorators": ^7.20.13 + "@babel/plugin-proposal-decorators": ^7.21.0 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 "@babel/plugin-proposal-object-rest-spread": ^7.20.7 - "@babel/plugin-proposal-optional-chaining": ^7.20.7 + "@babel/plugin-proposal-optional-chaining": ^7.21.0 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/preset-env": ^7.20.2 - "@babel/preset-typescript": ^7.18.6 + "@babel/preset-typescript": ^7.21.0 "@braintree/sanitize-url": ^6.0.2 "@codemirror/autocomplete": ^6.4.2 "@codemirror/commands": ^6.2.1 @@ -9598,8 +9599,8 @@ fsevents@^1.2.7: "@types/sortablejs": ^1 "@types/tar": ^6 "@types/webspeechapi": ^0.0.29 - "@typescript-eslint/eslint-plugin": ^5.52.0 - "@typescript-eslint/parser": ^5.52.0 + "@typescript-eslint/eslint-plugin": ^5.53.0 + "@typescript-eslint/parser": ^5.53.0 "@vaadin/combo-box": ^23.3.7 "@vaadin/vaadin-themable-mixin": ^23.3.7 "@vibrant/color": ^3.2.1-alpha.1 From 8ed4914232b6488cda7b16ab4470b5aab83e7175 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 21 Feb 2023 11:10:44 +0100 Subject: [PATCH 116/138] Add support for custom tile features (#15411 * Move isSupported to class * Use getConfigElement to display edit button * Remove custom element for test * Don't use class static functions * Refactor render * Add support for custom tile features in editor * Add missing relative position * Rename custom tile features options * PR feedbacks + split offical and custom types * Merge is custom type function --- src/common/structs/is-custom-type.ts | 3 +- src/data/lovelace_custom_cards.ts | 20 ++ src/panels/lovelace/cards/hui-tile-card.ts | 24 +- .../create-element/create-element-base.ts | 9 +- .../hui-entities-card-editor.ts | 6 +- .../hui-tile-card-features-editor.ts | 244 ++++++++++++------ .../editor/get-card-documentation-url.ts | 8 +- .../hui-cover-open-close-tile-feature.ts | 21 +- .../hui-cover-tilt-tile-feature.ts | 21 +- .../hui-light-brightness-tile-feature.ts | 18 +- .../hui-vacuum-commands-tile-feature.ts | 20 +- .../lovelace/tile-features/tile-features.ts | 44 ---- src/panels/lovelace/types.ts | 1 + 13 files changed, 275 insertions(+), 164 deletions(-) delete mode 100644 src/panels/lovelace/tile-features/tile-features.ts diff --git a/src/common/structs/is-custom-type.ts b/src/common/structs/is-custom-type.ts index dd5de2f637..e5a0082794 100644 --- a/src/common/structs/is-custom-type.ts +++ b/src/common/structs/is-custom-type.ts @@ -1,6 +1,5 @@ import { refine, string } from "superstruct"; - -export const isCustomType = (value: string) => value.startsWith("custom:"); +import { isCustomType } from "../../data/lovelace_custom_cards"; export const customType = () => refine(string(), "custom element type", isCustomType); diff --git a/src/data/lovelace_custom_cards.ts b/src/data/lovelace_custom_cards.ts index d669b50880..0f7b5e9f02 100644 --- a/src/data/lovelace_custom_cards.ts +++ b/src/data/lovelace_custom_cards.ts @@ -1,3 +1,5 @@ +import type { HassEntity } from "home-assistant-js-websocket"; + export interface CustomCardEntry { type: string; name?: string; @@ -6,8 +8,16 @@ export interface CustomCardEntry { documentationURL?: string; } +export interface CustomTileFeatureEntry { + type: string; + name?: string; + supported?: (stateObj: HassEntity) => boolean; + configurable?: boolean; +} + export interface CustomCardsWindow { customCards?: CustomCardEntry[]; + customTileFeatures?: CustomTileFeatureEntry[]; } export const CUSTOM_TYPE_PREFIX = "custom:"; @@ -17,8 +27,18 @@ const customCardsWindow = window as CustomCardsWindow; if (!("customCards" in customCardsWindow)) { customCardsWindow.customCards = []; } +if (!("customTileFeatures" in customCardsWindow)) { + customCardsWindow.customTileFeatures = []; +} export const customCards = customCardsWindow.customCards!; +export const customTileFeatures = customCardsWindow.customTileFeatures!; export const getCustomCardEntry = (type: string) => customCards.find((card) => card.type === type); + +export const isCustomType = (type: string) => + type.startsWith(CUSTOM_TYPE_PREFIX); + +export const stripCustomPrefix = (type: string) => + type.slice(CUSTOM_TYPE_PREFIX.length); diff --git a/src/panels/lovelace/cards/hui-tile-card.ts b/src/panels/lovelace/cards/hui-tile-card.ts index 9f30749c03..be251b2d7f 100644 --- a/src/panels/lovelace/cards/hui-tile-card.ts +++ b/src/panels/lovelace/cards/hui-tile-card.ts @@ -40,7 +40,6 @@ import { findEntities } from "../common/find-entities"; import { handleAction } from "../common/handle-action"; import "../components/hui-timestamp-display"; import { createTileFeatureElement } from "../create-element/create-tile-feature-element"; -import { supportsTileFeature } from "../tile-features/tile-features"; import { LovelaceTileFeatureConfig } from "../tile-features/types"; import { LovelaceCard, @@ -309,10 +308,6 @@ export class HuiTileCard extends LitElement implements LovelaceCard { : undefined; const badge = computeTileBadge(stateObj, this.hass); - const supportedFeatures = this._config.features?.filter((feature) => - supportsTileFeature(stateObj, feature.type) - ); - return html` ${this._shouldRenderRipple ? html`` : null} @@ -373,15 +368,11 @@ export class HuiTileCard extends LitElement implements LovelaceCard { >

    - ${supportedFeatures?.length - ? html` -
    - ${supportedFeatures.map((featureConf) => - this.renderFeature(featureConf, stateObj) - )} -
    - ` - : null} +
    + ${this._config.features?.map((featureConf) => + this.renderFeature(featureConf, stateObj) + )} +
    `; } @@ -412,7 +403,7 @@ export class HuiTileCard extends LitElement implements LovelaceCard { (element as LovelaceTileFeature).stateObj = stateObj; } - return html`
    ${element}
    `; + return html`${element}`; } static get styles(): CSSResultGroup { @@ -502,6 +493,9 @@ export class HuiTileCard extends LitElement implements LovelaceCard { box-sizing: border-box; pointer-events: none; } + .features { + position: relative; + } `; } } diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 4556efe509..792b8fd2e3 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -5,7 +5,10 @@ import { LovelaceViewConfig, LovelaceViewElement, } from "../../../data/lovelace"; -import { CUSTOM_TYPE_PREFIX } from "../../../data/lovelace_custom_cards"; +import { + isCustomType, + stripCustomPrefix, +} from "../../../data/lovelace_custom_cards"; import type { HuiErrorCard } from "../cards/hui-error-card"; import type { ErrorCardConfig } from "../cards/types"; import { LovelaceElement, LovelaceElementConfig } from "../elements/types"; @@ -153,9 +156,7 @@ const _lazyCreate = ( }; const _getCustomTag = (type: string) => - type.startsWith(CUSTOM_TYPE_PREFIX) - ? type.slice(CUSTOM_TYPE_PREFIX.length) - : undefined; + isCustomType(type) ? stripCustomPrefix(type) : undefined; export const createLovelaceElement = ( tagSuffix: T, diff --git a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts index 585de1f5f2..1b0e680850 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-entities-card-editor.ts @@ -17,10 +17,7 @@ import { union, } from "superstruct"; import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event"; -import { - customType, - isCustomType, -} from "../../../../common/structs/is-custom-type"; +import { customType } from "../../../../common/structs/is-custom-type"; import { entityId } from "../../../../common/structs/is-entity-id"; import { computeRTLDirection } from "../../../../common/util/compute_rtl"; import "../../../../components/entity/state-badge"; @@ -50,6 +47,7 @@ import { } from "../types"; import { configElementStyle } from "./config-elements-style"; import { buttonEntityConfigStruct } from "../structs/button-entity-struct"; +import { isCustomType } from "../../../../data/lovelace_custom_cards"; const buttonEntitiesRowConfigStruct = object({ type: literal("button"), diff --git a/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts b/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts index ffcce2826f..372901d0f6 100644 --- a/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts @@ -1,11 +1,4 @@ -import { - mdiDelete, - mdiDrag, - mdiListBox, - mdiPencil, - mdiPlus, - mdiWindowShutter, -} from "@mdi/js"; +import { mdiDelete, mdiDrag, mdiListBox, mdiPencil, mdiPlus } from "@mdi/js"; import { HassEntity } from "home-assistant-js-websocket"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; import { customElement, property } from "lit/decorators"; @@ -14,9 +7,17 @@ import type { SortableEvent } from "sortablejs"; import { fireEvent } from "../../../../common/dom/fire_event"; import { stopPropagation } from "../../../../common/dom/stop_propagation"; import "../../../../components/entity/ha-entity-picker"; -import "../../../../components/ha-icon-button"; import "../../../../components/ha-button"; +import "../../../../components/ha-icon-button"; +import "../../../../components/ha-list-item"; import "../../../../components/ha-svg-icon"; +import { + CustomTileFeatureEntry, + customTileFeatures, + CUSTOM_TYPE_PREFIX, + isCustomType, + stripCustomPrefix, +} from "../../../../data/lovelace_custom_cards"; import { sortableStyles } from "../../../../resources/ha-sortable-style"; import { loadSortable, @@ -24,19 +25,40 @@ import { } from "../../../../resources/sortable.ondemand"; import { HomeAssistant } from "../../../../types"; import { getTileFeatureElementClass } from "../../create-element/create-tile-feature-element"; -import { - isTileFeatureEditable, - supportsTileFeature, -} from "../../tile-features/tile-features"; +import { supportsCoverOpenCloseTileFeature } from "../../tile-features/hui-cover-open-close-tile-feature"; +import { supportsCoverTiltTileFeature } from "../../tile-features/hui-cover-tilt-tile-feature"; +import { supportsLightBrightnessTileFeature } from "../../tile-features/hui-light-brightness-tile-feature"; +import { supportsVacuumCommandTileFeature } from "../../tile-features/hui-vacuum-commands-tile-feature"; import { LovelaceTileFeatureConfig } from "../../tile-features/types"; -const FEATURES_TYPE: LovelaceTileFeatureConfig["type"][] = [ +type FeatureType = LovelaceTileFeatureConfig["type"]; +type SupportsFeature = (stateObj: HassEntity) => boolean; + +const FEATURE_TYPES: FeatureType[] = [ "cover-open-close", "cover-tilt", "light-brightness", "vacuum-commands", ]; +const EDITABLES_FEATURE_TYPES = new Set(["vacuum-commands"]); + +const SUPPORTS_FEATURE_TYPES: Record = + { + "cover-open-close": supportsCoverOpenCloseTileFeature, + "cover-tilt": supportsCoverTiltTileFeature, + "light-brightness": supportsLightBrightnessTileFeature, + "vacuum-commands": supportsVacuumCommandTileFeature, + }; + +const CUSTOM_FEATURE_ENTRIES: Record< + string, + CustomTileFeatureEntry | undefined +> = {}; +customTileFeatures.forEach((feature) => { + CUSTOM_FEATURE_ENTRIES[feature.type] = feature; +}); + declare global { interface HASSDomEvents { "features-changed": { @@ -64,6 +86,45 @@ export class HuiTileCardFeaturesEditor extends LitElement { this._destroySortable(); } + private _supportsFeatureType(type: string): boolean { + if (!this.stateObj) return false; + + if (isCustomType(type)) { + const customType = stripCustomPrefix(type); + const customFeatureEntry = CUSTOM_FEATURE_ENTRIES[customType]; + if (!customFeatureEntry?.supported) return true; + try { + return customFeatureEntry.supported(this.stateObj); + } catch { + return false; + } + } + + const supportsFeature = SUPPORTS_FEATURE_TYPES[type]; + return !supportsFeature || supportsFeature(this.stateObj); + } + + private _isFeatureTypeEditable(type: string) { + if (isCustomType(type)) { + const customType = stripCustomPrefix(type); + const customFeatureEntry = CUSTOM_FEATURE_ENTRIES[customType]; + return customFeatureEntry?.configurable; + } + + return EDITABLES_FEATURE_TYPES.has(type as FeatureType); + } + + private _getFeatureTypeLabel(type: string) { + if (isCustomType(type)) { + const customType = stripCustomPrefix(type); + const customFeatureEntry = CUSTOM_FEATURE_ENTRIES[customType]; + return customFeatureEntry?.name || type; + } + return this.hass!.localize( + `ui.panel.lovelace.editor.card.tile.features.types.${type}.label` + ); + } + private _getKey(feature: LovelaceTileFeatureConfig) { if (!this._featuresKeys.has(feature)) { this._featuresKeys.set(feature, Math.random().toString()); @@ -72,19 +133,32 @@ export class HuiTileCardFeaturesEditor extends LitElement { return this._featuresKeys.get(feature)!; } - private get _supportedFeatureTypes() { - if (!this.stateObj) return []; + protected firstUpdated() { + this._createSortable(); + } - return FEATURES_TYPE.filter((type) => - supportsTileFeature(this.stateObj!, type) + private _getSupportedFeaturesType() { + const featuresTypes = FEATURE_TYPES as string[]; + const customFeaturesTypes = customTileFeatures.map( + (feature) => `${CUSTOM_TYPE_PREFIX}${feature.type}` ); + return featuresTypes + .concat(customFeaturesTypes) + .filter((type) => this._supportsFeatureType(type)); } protected render(): TemplateResult { if (!this.features || !this.hass) { - return html``; + return null; } + const supportedFeaturesType = this._getSupportedFeaturesType(); + + const types = supportedFeaturesType.filter((type) => !isCustomType(type)); + const customTypes = supportedFeaturesType.filter((type) => + isCustomType(type) + ); + return html`

    @@ -94,8 +168,7 @@ export class HuiTileCardFeaturesEditor extends LitElement { )}

    - ${this._supportedFeatureTypes.length === 0 && - this.features.length === 0 + ${supportedFeaturesType.length === 0 && this.features.length === 0 ? html` ${this.hass!.localize( @@ -108,53 +181,58 @@ export class HuiTileCardFeaturesEditor extends LitElement { ${repeat( this.features, (featureConf) => this._getKey(featureConf), - (featureConf, index) => html` -
    -
    - -
    -
    -
    - - ${this.hass!.localize( - `ui.panel.lovelace.editor.card.tile.features.types.${featureConf.type}.label` - )} - - ${this.stateObj && - !supportsTileFeature(this.stateObj, featureConf.type) - ? html` - ${this.hass!.localize( - "ui.panel.lovelace.editor.card.tile.features.not_compatible" - )} - ` - : null} + (featureConf, index) => { + const type = featureConf.type; + const supported = this._supportsFeatureType(type); + const editable = this._isFeatureTypeEditable(type); + return html` +
    +
    +
    +
    +
    + ${this._getFeatureTypeLabel(type)} + ${this.stateObj && !supported + ? html` + + ${this.hass!.localize( + "ui.panel.lovelace.editor.card.tile.features.not_compatible" + )} + + ` + : null} +
    +
    + ${editable + ? html` + + ` + : null} +
    - ${isTileFeatureEditable(featureConf.type) - ? html`` - : null} - -
    - ` + `; + } )}
    - ${this._supportedFeatureTypes.length > 0 + ${supportedFeaturesType.length > 0 ? html` - ${this._supportedFeatureTypes.map( - (featureType) => html` - - ${this.hass!.localize( - `ui.panel.lovelace.editor.card.tile.features.types.${featureType}.label` - )} - ` + ${types.map( + (type) => html` + + ${this._getFeatureTypeLabel(type)} + + ` + )} + ${types.length > 0 && customTypes.length > 0 + ? html`
  • ` + : null} + ${customTypes.map( + (type) => html` + + ${this._getFeatureTypeLabel(type)} + + ` )}
    ` @@ -189,10 +273,6 @@ export class HuiTileCardFeaturesEditor extends LitElement { `; } - protected firstUpdated(): void { - this._createSortable(); - } - private async _createSortable() { const Sortable = await loadSortable(); this._sortable = new Sortable( @@ -228,7 +308,9 @@ export class HuiTileCardFeaturesEditor extends LitElement { if (index == null) return; - const value = this._supportedFeatureTypes[index]; + const value = this._getSupportedFeaturesType()[index]; + if (!value) return; + const elClass = await getTileFeatureElementClass(value); let newFeature: LovelaceTileFeatureConfig; @@ -340,6 +422,10 @@ export class HuiTileCardFeaturesEditor extends LitElement { font-size: 12px; color: var(--secondary-text-color); } + + li[divider] { + border-bottom-color: var(--divider-color); + } `, ]; } diff --git a/src/panels/lovelace/editor/get-card-documentation-url.ts b/src/panels/lovelace/editor/get-card-documentation-url.ts index 7d01eb9419..e312463d4b 100644 --- a/src/panels/lovelace/editor/get-card-documentation-url.ts +++ b/src/panels/lovelace/editor/get-card-documentation-url.ts @@ -1,6 +1,7 @@ import { - CUSTOM_TYPE_PREFIX, getCustomCardEntry, + isCustomType, + stripCustomPrefix, } from "../../../data/lovelace_custom_cards"; import { HomeAssistant } from "../../../types"; import { documentationUrl } from "../../../util/documentation-url"; @@ -9,9 +10,8 @@ export const getCardDocumentationURL = ( hass: HomeAssistant, type: string ): string | undefined => { - if (type.startsWith(CUSTOM_TYPE_PREFIX)) { - return getCustomCardEntry(type.slice(CUSTOM_TYPE_PREFIX.length)) - ?.documentationURL; + if (isCustomType(type)) { + return getCustomCardEntry(stripCustomPrefix(type))?.documentationURL; } return `${documentationUrl(hass, "/lovelace/")}${type}`; diff --git a/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts b/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts index 9f2813b157..8a4fe2c7cb 100644 --- a/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-cover-open-close-tile-feature.ts @@ -2,6 +2,7 @@ import { mdiStop } from "@mdi/js"; import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { computeDomain } from "../../../common/entity/compute_domain"; import { computeCloseIcon, computeOpenIcon, @@ -19,6 +20,15 @@ import { HomeAssistant } from "../../../types"; import { LovelaceTileFeature } from "../types"; import { CoverOpenCloseTileFeatureConfig } from "./types"; +export const supportsCoverOpenCloseTileFeature = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + return ( + domain === "cover" && + (supportsFeature(stateObj, CoverEntityFeature.OPEN) || + supportsFeature(stateObj, CoverEntityFeature.CLOSE)) + ); +}; + @customElement("hui-cover-open-close-tile-feature") class HuiCoverOpenCloseTileFeature extends LitElement @@ -64,9 +74,14 @@ class HuiCoverOpenCloseTileFeature }); } - protected render(): TemplateResult { - if (!this._config || !this.hass || !this.stateObj) { - return html``; + protected render(): TemplateResult | null { + if ( + !this._config || + !this.hass || + !this.stateObj || + !supportsCoverOpenCloseTileFeature(this.stateObj) + ) { + return null; } return html` diff --git a/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts b/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts index 43f03fbd80..e2545048e7 100644 --- a/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-cover-tilt-tile-feature.ts @@ -2,6 +2,7 @@ import { mdiArrowBottomLeft, mdiArrowTopRight, mdiStop } from "@mdi/js"; import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { computeDomain } from "../../../common/entity/compute_domain"; import { supportsFeature } from "../../../common/entity/supports-feature"; import "../../../components/ha-control-button"; import "../../../components/ha-control-button-group"; @@ -15,6 +16,15 @@ import { HomeAssistant } from "../../../types"; import { LovelaceTileFeature } from "../types"; import { CoverTiltTileFeatureConfig } from "./types"; +export const supportsCoverTiltTileFeature = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + return ( + domain === "cover" && + (supportsFeature(stateObj, CoverEntityFeature.OPEN_TILT) || + supportsFeature(stateObj, CoverEntityFeature.CLOSE_TILT)) + ); +}; + @customElement("hui-cover-tilt-tile-feature") class HuiCoverTiltTileFeature extends LitElement @@ -60,9 +70,14 @@ class HuiCoverTiltTileFeature }); } - protected render(): TemplateResult { - if (!this._config || !this.hass || !this.stateObj) { - return html``; + protected render(): TemplateResult | null { + if ( + !this._config || + !this.hass || + !this.stateObj || + !supportsCoverTiltTileFeature + ) { + return null; } return html` diff --git a/src/panels/lovelace/tile-features/hui-light-brightness-tile-feature.ts b/src/panels/lovelace/tile-features/hui-light-brightness-tile-feature.ts index 6848604e21..f73261a41c 100644 --- a/src/panels/lovelace/tile-features/hui-light-brightness-tile-feature.ts +++ b/src/panels/lovelace/tile-features/hui-light-brightness-tile-feature.ts @@ -1,13 +1,20 @@ import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { computeDomain } from "../../../common/entity/compute_domain"; import { stateActive } from "../../../common/entity/state_active"; import "../../../components/tile/ha-tile-slider"; import { UNAVAILABLE } from "../../../data/entity"; +import { lightSupportsBrightness } from "../../../data/light"; import { HomeAssistant } from "../../../types"; import { LovelaceTileFeature } from "../types"; import { LightBrightnessTileFeatureConfig } from "./types"; +export const supportsLightBrightnessTileFeature = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + return domain === "light" && lightSupportsBrightness(stateObj); +}; + @customElement("hui-light-brightness-tile-feature") class HuiLightBrightnessTileFeature extends LitElement @@ -32,9 +39,14 @@ class HuiLightBrightnessTileFeature this._config = config; } - protected render(): TemplateResult { - if (!this._config || !this.hass || !this.stateObj) { - return html``; + protected render(): TemplateResult | null { + if ( + !this._config || + !this.hass || + !this.stateObj || + !supportsLightBrightnessTileFeature(this.stateObj) + ) { + return null; } const position = 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 8089c55d23..4b1993fa2f 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 @@ -10,6 +10,7 @@ import { import { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { computeDomain } from "../../../common/entity/compute_domain"; import { supportsFeature } from "../../../common/entity/supports-feature"; import "../../../components/ha-control-button"; import "../../../components/ha-control-button-group"; @@ -113,6 +114,14 @@ export const VACUUM_COMMANDS_BUTTONS: Record< }), }; +export const supportsVacuumCommandTileFeature = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + return ( + domain === "vacuum" && + VACUUM_COMMANDS.some((c) => supportsVacuumCommand(stateObj, c)) + ); +}; + @customElement("hui-vacuum-commands-tile-feature") class HuiVacuumCommandTileFeature extends LitElement @@ -160,9 +169,14 @@ class HuiVacuumCommandTileFeature }); } - protected render(): TemplateResult { - if (!this._config || !this.hass || !this.stateObj) { - return html``; + protected render(): TemplateResult | null { + if ( + !this._config || + !this.hass || + !this.stateObj || + !supportsVacuumCommandTileFeature(this.stateObj) + ) { + return null; } const stateObj = this.stateObj as VacuumEntity; diff --git a/src/panels/lovelace/tile-features/tile-features.ts b/src/panels/lovelace/tile-features/tile-features.ts deleted file mode 100644 index 5dfdb32a7f..0000000000 --- a/src/panels/lovelace/tile-features/tile-features.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { HassEntity } from "home-assistant-js-websocket"; -import { computeDomain } from "../../../common/entity/compute_domain"; -import { supportsFeature } from "../../../common/entity/supports-feature"; -import { CoverEntityFeature } from "../../../data/cover"; -import { lightSupportsBrightness } from "../../../data/light"; -import { supportsVacuumCommand } from "./hui-vacuum-commands-tile-feature"; -import { LovelaceTileFeatureConfig, VACUUM_COMMANDS } from "./types"; - -type TileFeatureType = LovelaceTileFeatureConfig["type"]; -export type SupportsTileFeature = (stateObj: HassEntity) => boolean; - -const TILE_FEATURES_SUPPORT: Record = { - "cover-open-close": (stateObj) => - computeDomain(stateObj.entity_id) === "cover" && - (supportsFeature(stateObj, CoverEntityFeature.OPEN) || - supportsFeature(stateObj, CoverEntityFeature.CLOSE)), - "cover-tilt": (stateObj) => - computeDomain(stateObj.entity_id) === "cover" && - (supportsFeature(stateObj, CoverEntityFeature.OPEN_TILT) || - supportsFeature(stateObj, CoverEntityFeature.CLOSE_TILT)), - "light-brightness": (stateObj) => - computeDomain(stateObj.entity_id) === "light" && - lightSupportsBrightness(stateObj), - "vacuum-commands": (stateObj) => - computeDomain(stateObj.entity_id) === "vacuum" && - VACUUM_COMMANDS.some((c) => supportsVacuumCommand(stateObj, c)), -}; - -const TILE_FEATURE_EDITABLE: Set = new Set([ - "vacuum-commands", -]); - -export const supportsTileFeature = ( - stateObj: HassEntity, - feature: TileFeatureType -): boolean => { - const supportFunction = TILE_FEATURES_SUPPORT[feature] as - | SupportsTileFeature - | undefined; - return !supportFunction || supportFunction(stateObj); -}; - -export const isTileFeatureEditable = (feature: TileFeatureType): boolean => - TILE_FEATURE_EDITABLE.has(feature); diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index 3e0652437b..c99e6a51c9 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -109,6 +109,7 @@ export interface LovelaceTileFeatureConstructor hass: HomeAssistant, stateObj?: HassEntity ) => LovelaceTileFeatureConfig; + isSupported?: (stateObj?: HassEntity) => boolean; } export interface LovelaceTileFeatureEditor From 6e153cb3076992c499647e257aba138be3c2123c Mon Sep 17 00:00:00 2001 From: Jc2k Date: Tue, 21 Feb 2023 10:58:40 +0000 Subject: [PATCH 117/138] Fix a typo: Add OpenTread Border Router (#15528) --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index 42bbb77173..9e4e4cb204 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3269,7 +3269,7 @@ "other_networks": "Other networks", "my_network": "My network", "no_preferred_network": "You don't have a preferred network yet.", - "add_open_thread_border_router": "Add an OpenTread border router", + "add_open_thread_border_router": "Add an OpenThread border router", "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", From a03c3353311568ee9a1f7657a8e2a7e2a1cee12c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 21 Feb 2023 12:03:07 +0100 Subject: [PATCH 118/138] Bump formatjs intl polyfills (#15527) --- package.json | 6 +++--- yarn.lock | 43 ++++++++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index e35362f545..6a1ac6a95f 100644 --- a/package.json +++ b/package.json @@ -34,9 +34,9 @@ "@codemirror/view": "^6.9.1", "@formatjs/intl-datetimeformat": "^6.5.1", "@formatjs/intl-getcanonicallocales": "^2.1.0", - "@formatjs/intl-locale": "^3.0.11", - "@formatjs/intl-numberformat": "^8.3.3", - "@formatjs/intl-pluralrules": "^5.1.8", + "@formatjs/intl-locale": "^3.1.1", + "@formatjs/intl-numberformat": "^8.3.5", + "@formatjs/intl-pluralrules": "^5.1.10", "@formatjs/intl-relativetimeformat": "^11.1.10", "@fullcalendar/core": "^6.1.4", "@fullcalendar/daygrid": "^6.1.4", diff --git a/yarn.lock b/yarn.lock index 88ab3165f2..cbf9568529 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1525,16 +1525,16 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-getcanonicallocales@npm:2.0.5": - version: 2.0.5 - resolution: "@formatjs/intl-getcanonicallocales@npm:2.0.5" +"@formatjs/intl-enumerator@npm:1.2.1": + version: 1.2.1 + resolution: "@formatjs/intl-enumerator@npm:1.2.1" dependencies: tslib: ^2.4.0 - checksum: 8276c055fe35c48cdc2125f1b32b04275b2a19df228c82fbb4b9eae0f2684e50f353c60e228fad15e6134097078e513c961088c257d97bc076fd81dbec203d10 + checksum: d1971913230d16a576fc9920b3dfb5640977086686c78e533ed8393c2da5b0c26e91712a93e76ac9bc43f241517ac4ee2bc5236863ac398aa4e1b6b66fe0a3e5 languageName: node linkType: hard -"@formatjs/intl-getcanonicallocales@npm:^2.1.0": +"@formatjs/intl-getcanonicallocales@npm:2.1.0, @formatjs/intl-getcanonicallocales@npm:^2.1.0": version: 2.1.0 resolution: "@formatjs/intl-getcanonicallocales@npm:2.1.0" dependencies: @@ -1543,14 +1543,15 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-locale@npm:^3.0.11": - version: 3.0.11 - resolution: "@formatjs/intl-locale@npm:3.0.11" +"@formatjs/intl-locale@npm:^3.1.1": + version: 3.1.1 + resolution: "@formatjs/intl-locale@npm:3.1.1" dependencies: "@formatjs/ecma402-abstract": 1.14.3 - "@formatjs/intl-getcanonicallocales": 2.0.5 + "@formatjs/intl-enumerator": 1.2.1 + "@formatjs/intl-getcanonicallocales": 2.1.0 tslib: ^2.4.0 - checksum: 615a2293e561398f72b979533d40708b741e4bde384a924f15e55b9a38c2d42e78c497c7e6060e0c9cc2789bb444816005a5bc13a88e29db1211fb5332f9c416 + checksum: 4e7272199581526f1226e6daef3c2434429f8ec6ceb3b3ce3362209f9e7dd5b34c57a2933f8a63b04be9e44af89548f5e457f2e1d4e9ded96c23c6555aad7f94 languageName: node linkType: hard @@ -1563,25 +1564,25 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-numberformat@npm:^8.3.3": - version: 8.3.3 - resolution: "@formatjs/intl-numberformat@npm:8.3.3" +"@formatjs/intl-numberformat@npm:^8.3.5": + version: 8.3.5 + resolution: "@formatjs/intl-numberformat@npm:8.3.5" dependencies: "@formatjs/ecma402-abstract": 1.14.3 "@formatjs/intl-localematcher": 0.2.32 tslib: ^2.4.0 - checksum: 56fc8e25c445944f43295ee28a8f2dd059770e28e4a368b977787591157f3da357528ee8bcab5e00a54c9f850a879b1fedb92cc1934b93400a30699a3834c119 + checksum: 6eb305b20ae5a639e5e721ed425387bfd58b427e17ba9c15e23e56e45e65fa4c6065f5237577c3b763c000aad2f6d3f1140fd89ab89ce21ac0fc25f84e68032e languageName: node linkType: hard -"@formatjs/intl-pluralrules@npm:^5.1.8": - version: 5.1.8 - resolution: "@formatjs/intl-pluralrules@npm:5.1.8" +"@formatjs/intl-pluralrules@npm:^5.1.10": + version: 5.1.10 + resolution: "@formatjs/intl-pluralrules@npm:5.1.10" dependencies: "@formatjs/ecma402-abstract": 1.14.3 "@formatjs/intl-localematcher": 0.2.32 tslib: ^2.4.0 - checksum: 89c2cb25ab073da29a7951ee381206f92458403c13481f9bebecdf488ae6e0d5dace3bead796c499ba7cbe38800b0b5d561fe849cdeb6365f9c0685ac8c43c91 + checksum: c93e6ac888d20421bbdc203e0258fddfd91bd47933dacc3bb1b9329096a0b8cc8dc030a951665449a5feeb51a0cc439b7bacd75cd2f2b990dff5020905251db5 languageName: node linkType: hard @@ -9524,9 +9525,9 @@ fsevents@^1.2.7: "@codemirror/view": ^6.9.1 "@formatjs/intl-datetimeformat": ^6.5.1 "@formatjs/intl-getcanonicallocales": ^2.1.0 - "@formatjs/intl-locale": ^3.0.11 - "@formatjs/intl-numberformat": ^8.3.3 - "@formatjs/intl-pluralrules": ^5.1.8 + "@formatjs/intl-locale": ^3.1.1 + "@formatjs/intl-numberformat": ^8.3.5 + "@formatjs/intl-pluralrules": ^5.1.10 "@formatjs/intl-relativetimeformat": ^11.1.10 "@fullcalendar/core": ^6.1.4 "@fullcalendar/daygrid": ^6.1.4 From 3e72b1cb5dbc0310ae382b2655e0858528b99df7 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 21 Feb 2023 12:11:44 +0100 Subject: [PATCH 119/138] Fix tile card typings (#15529) --- .../editor/config-elements/hui-tile-card-features-editor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts b/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts index 372901d0f6..798c634936 100644 --- a/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-tile-card-features-editor.ts @@ -147,7 +147,7 @@ export class HuiTileCardFeaturesEditor extends LitElement { .filter((type) => this._supportsFeatureType(type)); } - protected render(): TemplateResult { + protected render(): TemplateResult | null { if (!this.features || !this.hass) { return null; } From 3066a9d10dea4ba72ad35b8d16a76975346dd1e0 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 21 Feb 2023 12:49:13 +0100 Subject: [PATCH 120/138] Use new restart dialog in dev tools (#15530) --- src/dialogs/restart/dialog-restart.ts | 9 ++++++++- .../developer-yaml-config.ts | 20 ++----------------- src/translations/en.json | 5 ++--- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/dialogs/restart/dialog-restart.ts b/src/dialogs/restart/dialog-restart.ts index 156fb3b826..62f8232000 100644 --- a/src/dialogs/restart/dialog-restart.ts +++ b/src/dialogs/restart/dialog-restart.ts @@ -211,7 +211,14 @@ class DialogRestart extends LitElement { duration: 1000, }); - await this.hass.callService("homeassistant", "reload_all"); + try { + await this.hass.callService("homeassistant", "reload_all"); + } catch (err: any) { + showAlertDialog(this, { + title: this.hass.localize("ui.dialogs.restart.reload.failed"), + text: err.message, + }); + } } private async _restart(ev) { 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 933d42c730..8b67a7e7a5 100644 --- a/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts +++ b/src/panels/developer-tools/yaml_configuration/developer-yaml-config.ts @@ -7,7 +7,7 @@ import "../../../components/ha-card"; import "../../../components/ha-circular-progress"; import { checkCoreConfig } from "../../../data/core"; import { domainToName } from "../../../data/integration"; -import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; +import { showRestartDialog } from "../../../dialogs/restart/show-dialog-restart"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant, Route, TranslationDict } from "../../../types"; @@ -181,23 +181,7 @@ export class DeveloperYamlConfig extends LitElement { } private _restart() { - showConfirmationDialog(this, { - title: this.hass.localize( - "ui.panel.developer-tools.tabs.yaml.section.server_management.confirm_restart_title" - ), - text: this.hass.localize( - "ui.panel.developer-tools.tabs.yaml.section.server_management.confirm_restart_text" - ), - confirmText: this.hass.localize( - "ui.panel.developer-tools.tabs.yaml.section.server_management.restart" - ), - confirm: () => { - this.hass.callService("homeassistant", "restart").catch((reason) => { - this._isValid = false; - this._validateLog = reason.message; - }); - }, - }); + showRestartDialog(this); } static get styles(): CSSResultGroup { diff --git a/src/translations/en.json b/src/translations/en.json index 9e4e4cb204..fac38732c1 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1016,7 +1016,8 @@ "reload": { "title": "Quick reload", "description": "Load new YAML configurations without a restart.", - "reloading": "Reloading configuration" + "reloading": "Reloading configuration", + "failed": "Failed to reload configuration" }, "restart": { "title": "Restart Home Assistant", @@ -4942,8 +4943,6 @@ }, "server_management": { "heading": "Home Assistant", - "confirm_restart_text": "Restarting Home Assistant will stop all your active dashboards, automations and scripts.", - "confirm_restart_title": "Restart Home Assistant?", "restart": "Restart", "stop": "Stop", "confirm_stop": "Are you sure you want to stop Home Assistant?", From cf304d91c7cb9b473e2b75442ec2eb2f58af310b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 21 Feb 2023 14:51:34 +0100 Subject: [PATCH 121/138] Use @egjs/hammerjs (#15532) --- package.json | 3 +-- src/components/ha-control-slider.ts | 10 +++++----- yarn.lock | 21 +++++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 6a1ac6a95f..e0da7f28e9 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@codemirror/search": "^6.2.3", "@codemirror/state": "^6.2.0", "@codemirror/view": "^6.9.1", + "@egjs/hammerjs": "^2.0.17", "@formatjs/intl-datetimeformat": "^6.5.1", "@formatjs/intl-getcanonicallocales": "^2.1.0", "@formatjs/intl-locale": "^3.1.1", @@ -106,7 +107,6 @@ "deep-freeze": "^0.0.1", "fuse.js": "^6.6.2", "google-timezones-json": "^1.0.2", - "hammerjs": "^2.0.8", "hls.js": "^1.3.3", "home-assistant-js-websocket": "^8.0.1", "idb-keyval": "^6.2.0", @@ -170,7 +170,6 @@ "@types/chromecast-caf-receiver": "5.0.12", "@types/chromecast-caf-sender": "^1.0.5", "@types/glob": "^8", - "@types/hammerjs": "^2.0.41", "@types/js-yaml": "^4", "@types/leaflet": "^1", "@types/leaflet-draw": "^1", diff --git a/src/components/ha-control-slider.ts b/src/components/ha-control-slider.ts index 44fea413ab..34cdf0bb6b 100644 --- a/src/components/ha-control-slider.ts +++ b/src/components/ha-control-slider.ts @@ -1,4 +1,4 @@ -import "hammerjs"; +import { DIRECTION_ALL, Manager, Pan, Tap } from "@egjs/hammerjs"; import { css, CSSResultGroup, @@ -131,18 +131,18 @@ export class HaControlSlider extends LitElement { setupListeners() { if (this.slider && !this._mc) { - this._mc = new Hammer.Manager(this.slider, { + this._mc = new Manager(this.slider, { touchAction: this.vertical ? "pan-x" : "pan-y", }); this._mc.add( - new Hammer.Pan({ + new Pan({ threshold: 10, - direction: Hammer.DIRECTION_ALL, + direction: DIRECTION_ALL, enable: true, }) ); - this._mc.add(new Hammer.Tap({ event: "singletap" })); + this._mc.add(new Tap({ event: "singletap" })); let savedValue; this._mc.on("panstart", () => { diff --git a/yarn.lock b/yarn.lock index cbf9568529..ccaab7c5ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1457,6 +1457,15 @@ __metadata: languageName: node linkType: hard +"@egjs/hammerjs@npm:^2.0.17": + version: 2.0.17 + resolution: "@egjs/hammerjs@npm:2.0.17" + dependencies: + "@types/hammerjs": ^2.0.36 + checksum: 8945137cec5837edd70af3f2e0ea621543eb0aa3b667e6269ec6485350f4d120c2434b37c7c30b1cf42a65275dd61c1f24626749c616696d3956ac0c008c4766 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^0.4.3": version: 0.4.3 resolution: "@eslint/eslintrc@npm:0.4.3" @@ -4141,7 +4150,7 @@ __metadata: languageName: node linkType: hard -"@types/hammerjs@npm:^2.0.41": +"@types/hammerjs@npm:^2.0.36": version: 2.0.41 resolution: "@types/hammerjs@npm:2.0.41" checksum: d16fbd688fc9b18cc270abe8dea8d4c50ef7bd8375e593d92c233d299387933a6b003c8db69819344833052458bc5f9ef1b472001277a49f095928d184356006 @@ -9361,13 +9370,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"hammerjs@npm:^2.0.8": - version: 2.0.8 - resolution: "hammerjs@npm:2.0.8" - checksum: b092da7d1565a165d7edb53ef0ce212837a8b11f897aa3cf81a7818b66686b0ab3f4747fbce8fc8a41d1376594639ce3a054b0fd4889ca8b5b136a29ca500e27 - languageName: node - linkType: hard - "handle-thing@npm:^2.0.0": version: 2.0.0 resolution: "handle-thing@npm:2.0.0" @@ -9523,6 +9525,7 @@ fsevents@^1.2.7: "@codemirror/search": ^6.2.3 "@codemirror/state": ^6.2.0 "@codemirror/view": ^6.9.1 + "@egjs/hammerjs": ^2.0.17 "@formatjs/intl-datetimeformat": ^6.5.1 "@formatjs/intl-getcanonicallocales": ^2.1.0 "@formatjs/intl-locale": ^3.1.1 @@ -9590,7 +9593,6 @@ fsevents@^1.2.7: "@types/chromecast-caf-receiver": 5.0.12 "@types/chromecast-caf-sender": ^1.0.5 "@types/glob": ^8 - "@types/hammerjs": ^2.0.41 "@types/js-yaml": ^4 "@types/leaflet": ^1 "@types/leaflet-draw": ^1 @@ -9646,7 +9648,6 @@ fsevents@^1.2.7: gulp-merge-json: ^2.1.2 gulp-rename: ^2.0.0 gulp-zopfli-green: ^6.0.1 - hammerjs: ^2.0.8 hls.js: ^1.3.3 home-assistant-js-websocket: ^8.0.1 html-minifier: ^4.0.0 From 4e841c4a06c25378f0edb7d2a2e12592af8a40eb Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 21 Feb 2023 15:07:53 +0100 Subject: [PATCH 122/138] fix more info history tooltips (#15533) --- src/dialogs/more-info/ha-more-info-dialog.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 77adbfff55..83cb151925 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -350,8 +350,9 @@ export class MoreInfoDialog extends LitElement { haStyleDialog, css` ha-dialog { + /* This is needed for the tooltip of the history charts to be positioned correctly */ --dialog-surface-position: static; - --dialog-content-position: relative; + --dialog-content-position: static; --vertical-align-dialog: flex-start; --dialog-content-padding: 0; --content-padding: 24px; From d00467a39c77da4809bee7f368c3ffd25a113b13 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Tue, 21 Feb 2023 08:27:56 -0800 Subject: [PATCH 123/138] Add `for` to UI for template trigger (#15534) --- src/data/automation.ts | 1 + src/data/automation_i18n.ts | 51 ++++++------ .../types/ha-automation-trigger-template.ts | 80 +++++++++++++------ src/translations/en.json | 3 +- 4 files changed, 82 insertions(+), 53 deletions(-) diff --git a/src/data/automation.ts b/src/data/automation.ts index b3dba670f6..7ac5a88792 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -146,6 +146,7 @@ export interface TimeTrigger extends BaseTrigger { export interface TemplateTrigger extends BaseTrigger { platform: "template"; value_template: string; + for?: string | number | ForDict; } export interface EventTrigger extends BaseTrigger { diff --git a/src/data/automation_i18n.ts b/src/data/automation_i18n.ts index 564d5bf95d..876e2cbef3 100644 --- a/src/data/automation_i18n.ts +++ b/src/data/automation_i18n.ts @@ -3,7 +3,7 @@ import secondsToDuration from "../common/datetime/seconds_to_duration"; import { ensureArray } from "../common/array/ensure-array"; import { computeStateName } from "../common/entity/compute_state_name"; import type { HomeAssistant } from "../types"; -import { Condition, Trigger } from "./automation"; +import { Condition, Trigger, ForDict } from "./automation"; import { DeviceCondition, DeviceTrigger, @@ -12,6 +12,18 @@ import { } from "./device_automation"; import { formatAttributeName } from "./entity_attributes"; +const describeDuration = (forTime: number | string | ForDict) => { + let duration: string | null; + if (typeof forTime === "number") { + duration = secondsToDuration(forTime); + } else if (typeof forTime === "string") { + duration = forTime; + } else { + duration = formatDuration(forTime); + } + return duration; +}; + export const describeTrigger = ( trigger: Trigger, hass: HomeAssistant, @@ -73,14 +85,7 @@ export const describeTrigger = ( } if (trigger.for) { - let duration: string | null; - if (typeof trigger.for === "number") { - duration = secondsToDuration(trigger.for); - } else if (typeof trigger.for === "string") { - duration = trigger.for; - } else { - duration = formatDuration(trigger.for); - } + const duration = describeDuration(trigger.for); if (duration) { base += ` for ${duration}`; } @@ -156,15 +161,7 @@ export const describeTrigger = ( } if (trigger.for) { - let duration: string | null; - if (typeof trigger.for === "number") { - duration = secondsToDuration(trigger.for); - } else if (typeof trigger.for === "string") { - duration = trigger.for; - } else { - duration = formatDuration(trigger.for); - } - + const duration = describeDuration(trigger.for); if (duration) { base += ` for ${duration}`; } @@ -319,7 +316,14 @@ export const describeTrigger = ( // Template Trigger if (trigger.platform === "template") { - return "When a template triggers"; + let base = "When a template triggers"; + if (trigger.for) { + const duration = describeDuration(trigger.for); + if (duration) { + base += ` for ${duration}`; + } + } + return base; } // Webhook Trigger @@ -440,14 +444,7 @@ export const describeCondition = ( base += ` ${entity} is ${states}`; if (condition.for) { - let duration: string | null; - if (typeof condition.for === "number") { - duration = secondsToDuration(condition.for); - } else if (typeof condition.for === "string") { - duration = condition.for; - } else { - duration = formatDuration(condition.for); - } + const duration = describeDuration(condition.for); if (duration) { base += ` for ${duration}`; } diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-template.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-template.ts index 3aa1c02367..b1c85eb460 100644 --- a/src/panels/config/automation/trigger/types/ha-automation-trigger-template.ts +++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-template.ts @@ -1,9 +1,18 @@ import "../../../../../components/ha-textarea"; -import { css, html, LitElement } from "lit"; +import { html, LitElement, PropertyValues } from "lit"; import { customElement, property } from "lit/decorators"; import type { TemplateTrigger } from "../../../../../data/automation"; import type { HomeAssistant } from "../../../../../types"; -import { handleChangeEvent } from "../ha-automation-trigger-row"; +import "../../../../../components/ha-form/ha-form"; +import { createDurationData } from "../../../../../common/datetime/create_duration_data"; +import { fireEvent } from "../../../../../common/dom/fire_event"; +import { hasTemplate } from "../../../../../common/string/has-template"; +import type { SchemaUnion } from "../../../../../components/ha-form/types"; + +const SCHEMA = [ + { name: "value_template", required: true, selector: { template: {} } }, + { name: "for", selector: { duration: {} } }, +] as const; @customElement("ha-automation-trigger-template") export class HaTemplateTrigger extends LitElement { @@ -17,39 +26,60 @@ export class HaTemplateTrigger extends LitElement { return { value_template: "" }; } + public willUpdate(changedProperties: PropertyValues) { + if (!changedProperties.has("trigger")) { + return; + } + // Check for templates in trigger. If found, revert to YAML mode. + if (this.trigger && hasTemplate(this.trigger.for)) { + fireEvent( + this, + "ui-mode-not-available", + Error(this.hass.localize("ui.errors.config.no_template_editor_support")) + ); + } + } + protected render() { - const { value_template } = this.trigger; + const trgFor = createDurationData(this.trigger.for); + + const data = { + ...this.trigger, + for: trgFor, + }; + return html` -

    - ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.type.template.value_template" - )} - * -

    - + .computeLabel=${this._computeLabelCallback} + .disabled=${this.disabled} + > `; } private _valueChanged(ev: CustomEvent): void { - handleChangeEvent(this, ev); + ev.stopPropagation(); + const newTrigger = ev.detail.value; + + if ( + newTrigger.for && + Object.values(newTrigger.for).every((value) => value === 0) + ) { + delete newTrigger.for; + } + + fireEvent(this, "value-changed", { value: newTrigger }); } - static get styles() { - return css` - p { - margin-top: 0; - } - `; - } + private _computeLabelCallback = ( + schema: SchemaUnion + ): string => + this.hass.localize( + `ui.panel.config.automation.editor.triggers.type.template.${schema.name}` + ); } declare global { diff --git a/src/translations/en.json b/src/translations/en.json index fac38732c1..deb63a5d80 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2129,7 +2129,8 @@ }, "template": { "label": "Template", - "value_template": "Value template" + "value_template": "Value template", + "for": "For" }, "time": { "type_value": "Fixed time", From e44ccb057498284e3aa36f1a3fb149416f36d83a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 21 Feb 2023 19:02:30 +0100 Subject: [PATCH 124/138] bump eslint (#15535) --- package.json | 6 +- yarn.lock | 353 ++++++++++++++++++++------------------------------- 2 files changed, 142 insertions(+), 217 deletions(-) diff --git a/package.json b/package.json index e0da7f28e9..a9af1595db 100644 --- a/package.json +++ b/package.json @@ -169,6 +169,7 @@ "@rollup/plugin-replace": "^2.3.2", "@types/chromecast-caf-receiver": "5.0.12", "@types/chromecast-caf-sender": "^1.0.5", + "@types/esprima": "^4", "@types/glob": "^8", "@types/js-yaml": "^4", "@types/leaflet": "^1", @@ -186,7 +187,7 @@ "babel-loader": "^9.1.2", "chai": "^4.3.7", "del": "^7.0.0", - "eslint": "^7.32.0", + "eslint": "^8.34.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.6.0", @@ -195,8 +196,9 @@ "eslint-plugin-import": "^2.27.5", "eslint-plugin-lit": "^1.8.2", "eslint-plugin-lit-a11y": "^2.3.0", - "eslint-plugin-unused-imports": "^1.1.5", + "eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-wc": "^1.4.0", + "esprima": "^4.0.1", "fancy-log": "^2.0.0", "fs-extra": "^11.1.0", "glob": "^8.1.0", diff --git a/yarn.lock b/yarn.lock index ccaab7c5ae..834e424c65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,15 +28,6 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:7.12.11": - version: 7.12.11 - resolution: "@babel/code-frame@npm:7.12.11" - dependencies: - "@babel/highlight": ^7.10.4 - checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3 - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.5.5": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -352,7 +343,7 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.18.6": +"@babel/highlight@npm:^7.18.6": version: 7.18.6 resolution: "@babel/highlight@npm:7.18.6" dependencies: @@ -1466,20 +1457,20 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^0.4.3": - version: 0.4.3 - resolution: "@eslint/eslintrc@npm:0.4.3" +"@eslint/eslintrc@npm:^1.4.1": + version: 1.4.1 + resolution: "@eslint/eslintrc@npm:1.4.1" dependencies: ajv: ^6.12.4 - debug: ^4.1.1 - espree: ^7.3.0 - globals: ^13.9.0 - ignore: ^4.0.6 + debug: ^4.3.2 + espree: ^9.4.0 + globals: ^13.19.0 + ignore: ^5.2.0 import-fresh: ^3.2.1 - js-yaml: ^3.13.1 - minimatch: ^3.0.4 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3 + checksum: cd3e5a8683db604739938b1c1c8b77927dc04fce3e28e0c88e7f2cd4900b89466baf83dfbad76b2b9e4d2746abdd00dd3f9da544d3e311633d8693f327d04cd7 languageName: node linkType: hard @@ -1662,21 +1653,28 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.5.0": - version: 0.5.0 - resolution: "@humanwhocodes/config-array@npm:0.5.0" +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" dependencies: - "@humanwhocodes/object-schema": ^1.2.0 + "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 - minimatch: ^3.0.4 - checksum: 44ee6a9f05d93dd9d5935a006b17572328ba9caff8002442f601736cbda79c580cc0f5a49ce9eb88fbacc5c3a6b62098357c2e95326cd17bb9f1a6c61d6e95e7 + minimatch: ^3.0.5 + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.0": - version: 1.2.0 - resolution: "@humanwhocodes/object-schema@npm:1.2.0" - checksum: 40b75480376de8104d65f7c44a7dd76d30fb57823ca8ba3a3239b2b568323be894d93440578a72fd8e5e2cc3df3577ce0d2f0fe308b990dd51cf35392bf3c9a2 +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 languageName: node linkType: hard @@ -3121,20 +3119,20 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.scandir@npm:2.1.3": - version: 2.1.3 - resolution: "@nodelib/fs.scandir@npm:2.1.3" +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" dependencies: - "@nodelib/fs.stat": 2.0.3 + "@nodelib/fs.stat": 2.0.5 run-parallel: ^1.1.9 - checksum: 0054efbba1385629886fe017d99f7045cb8300d6de1923f7a37e05e480c853abbedaff90f6a6b88fd0d406e1cd1e97fb60bd4e059b44468b174f46bef2e21dd1 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.3, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.3 - resolution: "@nodelib/fs.stat@npm:2.0.3" - checksum: d3612efceea83fb0bec4e64967888ff0c3e5fbbae96121bc526bbbe5529f32fc6f8a785b550f397d20f09c84dc1e5a6c8e9fd7f9b8b62387a8f80f680be8430e +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard @@ -3145,13 +3143,13 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.4 - resolution: "@nodelib/fs.walk@npm:1.2.4" +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - "@nodelib/fs.scandir": 2.1.3 + "@nodelib/fs.scandir": 2.1.5 fastq: ^1.6.0 - checksum: a971d1dcc1cf593e25651738e915be201053b63775c39c1ee221d2adee6316503ad6043136ceda0e099724875f2d72ea04b3b57c0e3a20b7f280bd3e951ae2e4 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 languageName: node linkType: hard @@ -4080,6 +4078,15 @@ __metadata: languageName: node linkType: hard +"@types/esprima@npm:^4": + version: 4.0.3 + resolution: "@types/esprima@npm:4.0.3" + dependencies: + "@types/estree": "*" + checksum: 266d1f87a9469688af0f143dec47caae25e6f689194da0d57d03d796cf8bdbfb99593717885e98d9538f1beff967a642f126d693e0e4b5fa4f4605fb55866919 + languageName: node + linkType: hard + "@types/estree@npm:*, @types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" @@ -5253,25 +5260,16 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1": - version: 5.3.1 - resolution: "acorn-jsx@npm:5.3.1" +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: daf441a9d7b59c0ea1f7fe2934c48aca604a007455129ce35fa62ec3d4c8363e2efc2d4da636d18ce0049979260ba07d8b42bc002ae95182916d2c90901529c2 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 languageName: node linkType: hard -"acorn@npm:^7.4.0": - version: 7.4.1 - resolution: "acorn@npm:7.4.1" - bin: - acorn: bin/acorn - checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.5.0": +"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.8.0": version: 8.8.2 resolution: "acorn@npm:8.8.2" bin: @@ -5378,7 +5376,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.6.0, ajv@npm:^8.8.0": +"ajv@npm:^8.0.0, ajv@npm:^8.6.0, ajv@npm:^8.8.0": version: 8.11.2 resolution: "ajv@npm:8.11.2" dependencies: @@ -5399,7 +5397,7 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:4.1.1, ansi-colors@npm:^4.1.1": +"ansi-colors@npm:4.1.1": version: 4.1.1 resolution: "ansi-colors@npm:4.1.1" checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 @@ -5613,15 +5611,6 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -7113,7 +7102,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -7600,15 +7589,6 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.5": - version: 2.3.6 - resolution: "enquirer@npm:2.3.6" - dependencies: - ansi-colors: ^4.1.1 - checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -7985,18 +7965,18 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-unused-imports@npm:^1.1.5": - version: 1.1.5 - resolution: "eslint-plugin-unused-imports@npm:1.1.5" +"eslint-plugin-unused-imports@npm:^2.0.0": + version: 2.0.0 + resolution: "eslint-plugin-unused-imports@npm:2.0.0" dependencies: eslint-rule-composer: ^0.3.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^4.14.2 - eslint: ^6.0.0 || ^7.0.0 + "@typescript-eslint/eslint-plugin": ^5.0.0 + eslint: ^8.0.0 peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true - checksum: fd1ef93fd414240594ea2f78cd7334523c244af12a610442c6dbf78b0058915c363ce78032730962f510fdd2792ded0607bc13adea9a724d1c5cec736704c99d + checksum: 8aa1e03e75da2a62a354065e0cb8fe370118c6f8d9720a32fe8c1da937de6adb81a4fed7d0d391d115ac9453b49029fb19f970d180a2cf3dba451fd4c20f0dc4 languageName: node linkType: hard @@ -8036,12 +8016,13 @@ __metadata: languageName: node linkType: hard -"eslint-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "eslint-utils@npm:2.1.0" +"eslint-scope@npm:^7.1.1": + version: 7.1.1 + resolution: "eslint-scope@npm:7.1.1" dependencies: - eslint-visitor-keys: ^1.1.0 - checksum: 27500938f348da42100d9e6ad03ae29b3de19ba757ae1a7f4a087bdcf83ac60949bbb54286492ca61fac1f5f3ac8692dd21537ce6214240bf95ad0122f24d71d + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e languageName: node linkType: hard @@ -8056,13 +8037,6 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0": - version: 1.3.0 - resolution: "eslint-visitor-keys@npm:1.3.0" - checksum: 37a19b712f42f4c9027e8ba98c2b06031c17e0c0a4c696cd429bd9ee04eb43889c446f2cd545e1ff51bef9593fcec94ecd2c2ef89129fcbbf3adadbef520376a - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^2.0.0": version: 2.0.0 resolution: "eslint-visitor-keys@npm:2.0.0" @@ -8077,68 +8051,67 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^7.32.0": - version: 7.32.0 - resolution: "eslint@npm:7.32.0" +"eslint@npm:^8.34.0": + version: 8.34.0 + resolution: "eslint@npm:8.34.0" dependencies: - "@babel/code-frame": 7.12.11 - "@eslint/eslintrc": ^0.4.3 - "@humanwhocodes/config-array": ^0.5.0 + "@eslint/eslintrc": ^1.4.1 + "@humanwhocodes/config-array": ^0.11.8 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 ajv: ^6.10.0 chalk: ^4.0.0 cross-spawn: ^7.0.2 - debug: ^4.0.1 + debug: ^4.3.2 doctrine: ^3.0.0 - enquirer: ^2.3.5 escape-string-regexp: ^4.0.0 - eslint-scope: ^5.1.1 - eslint-utils: ^2.1.0 - eslint-visitor-keys: ^2.0.0 - espree: ^7.3.1 + eslint-scope: ^7.1.1 + eslint-utils: ^3.0.0 + eslint-visitor-keys: ^3.3.0 + espree: ^9.4.0 esquery: ^1.4.0 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 file-entry-cache: ^6.0.1 - functional-red-black-tree: ^1.0.1 - glob-parent: ^5.1.2 - globals: ^13.6.0 - ignore: ^4.0.6 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 - js-yaml: ^3.13.1 + is-path-inside: ^3.0.3 + js-sdsl: ^4.1.4 + js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 levn: ^0.4.1 lodash.merge: ^4.6.2 - minimatch: ^3.0.4 + minimatch: ^3.1.2 natural-compare: ^1.4.0 optionator: ^0.9.1 - progress: ^2.0.0 - regexpp: ^3.1.0 - semver: ^7.2.1 - strip-ansi: ^6.0.0 + regexpp: ^3.2.0 + strip-ansi: ^6.0.1 strip-json-comments: ^3.1.0 - table: ^6.0.9 text-table: ^0.2.0 - v8-compile-cache: ^2.0.3 bin: eslint: bin/eslint.js - checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37 + checksum: 4e13e9eb05ac2248efbb6acae0b2325091235d5c47ba91a4775c7d6760778cbcd358a773ebd42f4629d2ad89e27c02f5d66eb1f737d75d9f5fc411454f83b2e5 languageName: node linkType: hard -"espree@npm:^7.3.0, espree@npm:^7.3.1": - version: 7.3.1 - resolution: "espree@npm:7.3.1" +"espree@npm:^9.4.0": + version: 9.4.1 + resolution: "espree@npm:9.4.1" dependencies: - acorn: ^7.4.0 - acorn-jsx: ^5.3.1 - eslint-visitor-keys: ^1.3.0 - checksum: aa9b50dcce883449af2e23bc2b8d9abb77118f96f4cb313935d6b220f77137eaef7724a83c3f6243b96bc0e4ab14766198e60818caad99f9519ae5a336a39b45 + acorn: ^8.8.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.3.0 + checksum: 4d266b0cf81c7dfe69e542c7df0f246e78d29f5b04dda36e514eb4c7af117ee6cfbd3280e560571ed82ff6c9c3f0003c05b82583fc7a94006db7497c4fe4270e languageName: node linkType: hard -"esprima@npm:^4.0.0": +"esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -8619,7 +8592,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:5.0.0": +"find-up@npm:5.0.0, find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" dependencies: @@ -8918,13 +8891,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - "functions-have-names@npm:^1.2.2": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" @@ -9061,6 +9027,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + "glob-stream@npm:^6.1.0": version: 6.1.0 resolution: "glob-stream@npm:6.1.0" @@ -9176,12 +9151,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"globals@npm:^13.6.0, globals@npm:^13.9.0": - version: 13.10.0 - resolution: "globals@npm:13.10.0" +"globals@npm:^13.19.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" dependencies: type-fest: ^0.20.2 - checksum: 64e45d96d634d2b047385eb5925de3abb5964cf4f3564eba493694f5ab1a8818b333f89d34b0f71f9b1d87391e6e25c5ca1a87094dd80a657d1d99b9321e1f4e + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a languageName: node linkType: hard @@ -9592,6 +9567,7 @@ fsevents@^1.2.7: "@thomasloven/round-slider": 0.6.0 "@types/chromecast-caf-receiver": 5.0.12 "@types/chromecast-caf-sender": ^1.0.5 + "@types/esprima": ^4 "@types/glob": ^8 "@types/js-yaml": ^4 "@types/leaflet": ^1 @@ -9626,7 +9602,7 @@ fsevents@^1.2.7: deep-clone-simple: ^1.1.1 deep-freeze: ^0.0.1 del: ^7.0.0 - eslint: ^7.32.0 + eslint: ^8.34.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-airbnb-typescript: ^17.0.0 eslint-config-prettier: ^8.6.0 @@ -9635,8 +9611,9 @@ fsevents@^1.2.7: eslint-plugin-import: ^2.27.5 eslint-plugin-lit: ^1.8.2 eslint-plugin-lit-a11y: ^2.3.0 - eslint-plugin-unused-imports: ^1.1.5 + eslint-plugin-unused-imports: ^2.0.0 eslint-plugin-wc: ^1.4.0 + esprima: ^4.0.1 fancy-log: ^2.0.0 fs-extra: ^11.1.0 fuse.js: ^6.6.2 @@ -9997,13 +9974,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"ignore@npm:^4.0.6": - version: 4.0.6 - resolution: "ignore@npm:4.0.6" - checksum: 248f82e50a430906f9ee7f35e1158e3ec4c3971451dd9f99c9bc1548261b4db2b99709f60ac6c6cac9333494384176cc4cc9b07acbe42d52ac6a09cad734d800 - languageName: node - linkType: hard - "ignore@npm:^5.2.0": version: 5.2.0 resolution: "ignore@npm:5.2.0" @@ -10523,6 +10493,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + "is-path-inside@npm:^4.0.0": version: 4.0.0 resolution: "is-path-inside@npm:4.0.0" @@ -10862,6 +10839,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"js-sdsl@npm:^4.1.4": + version: 4.3.0 + resolution: "js-sdsl@npm:4.3.0" + checksum: ce908257cf6909e213af580af3a691a736f5ee8b16315454768f917a682a4ea0c11bde1b241bbfaecedc0eb67b72101b2c2df2ffaed32aed5d539fca816f054e + languageName: node + linkType: hard + "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -10880,18 +10864,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"js-yaml@npm:^3.13.1": - version: 3.13.1 - resolution: "js-yaml@npm:3.13.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: 7511b764abb66d8aa963379f7d2a404f078457d106552d05a7b556d204f7932384e8477513c124749fa2de52eb328961834562bd09924902c6432e40daa408bc - languageName: node - linkType: hard - "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -11443,13 +11415,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lodash.clonedeep@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.clonedeep@npm:4.5.0" - checksum: 92c46f094b064e876a23c97f57f81fbffd5d760bf2d8a1c61d85db6d1e488c66b0384c943abee4f6af7debf5ad4e4282e74ff83177c9e63d8ff081a4837c3489 - languageName: node - linkType: hard - "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -11511,13 +11476,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lodash.truncate@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.truncate@npm:4.4.2" - checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 - languageName: node - linkType: hard - "lodash@npm:^4.17.14, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -11872,7 +11830,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -13288,13 +13246,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"progress@npm:^2.0.0": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 - languageName: node - linkType: hard - "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -13620,7 +13571,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"regexpp@npm:^3.1.0, regexpp@npm:^3.2.0": +"regexpp@npm:^3.2.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 @@ -14186,7 +14137,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7": +"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -14711,13 +14662,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - "ssri@npm:^8.0.0, ssri@npm:^8.0.1": version: 8.0.1 resolution: "ssri@npm:8.0.1" @@ -15094,20 +15038,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"table@npm:^6.0.9": - version: 6.7.1 - resolution: "table@npm:6.7.1" - dependencies: - ajv: ^8.0.1 - lodash.clonedeep: ^4.5.0 - lodash.truncate: ^4.4.2 - slice-ansi: ^4.0.0 - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - checksum: 053b61fa4e8f8396c65ff7a95da90e85620370932652d501ff7a0a3ed7317f1cc549702bd2abf2bd9ed01e20757b73a8b57374f8a8a2ac02fbe0550276263fb6 - languageName: node - linkType: hard - "tapable@npm:^0.1.8": version: 0.1.10 resolution: "tapable@npm:0.1.10" @@ -15980,13 +15910,6 @@ typescript@^3.8.3: languageName: node linkType: hard -"v8-compile-cache@npm:^2.0.3": - version: 2.2.0 - resolution: "v8-compile-cache@npm:2.2.0" - checksum: b5916ac2079a4d3de003d9d657d37e1b96453603158ccf6f3d2cc64d0018b71f3576fd3534f519829f9641b4588c830b9363dc5821fe213a51c1b1b3728a382a - languageName: node - linkType: hard - "v8flags@npm:^3.2.0": version: 3.2.0 resolution: "v8flags@npm:3.2.0" From 25d8550dd7c0a44b3c2187d8b4f7bd7e66c1cbde Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 21 Feb 2023 20:28:21 +0100 Subject: [PATCH 125/138] Fix double defined cloud-account (#15537) --- demo/src/custom-cards/ha-demo-card.ts | 5 ++--- demo/src/ha-demo.ts | 6 +++--- hassio/src/addon-store/hassio-addon-repository.ts | 7 +++---- hassio/src/addon-store/hassio-addon-store.ts | 7 +++---- src/auth/ha-auth-flow.ts | 6 +++--- src/auth/ha-authorize.ts | 6 +++--- src/auth/ha-pick-auth-provider.ts | 6 +++--- src/components/buttons/ha-call-api-button.ts | 5 ++--- src/components/ha-icon-next.ts | 4 ++-- src/components/ha-icon-prev.ts | 4 ++-- src/components/ha-label-badge.ts | 5 ++--- src/components/ha-service-picker.ts | 5 ++--- src/components/ha-toast.ts | 4 ++-- src/panels/calendar/ha-full-calendar.ts | 5 ++--- src/panels/config/cloud/account/cloud-account.ts | 2 -- src/panels/lovelace/ha-panel-lovelace.ts | 7 +++---- src/panels/lovelace/hui-root.ts | 5 ++--- src/panels/map/ha-panel-map.ts | 5 ++--- 18 files changed, 41 insertions(+), 53 deletions(-) diff --git a/demo/src/custom-cards/ha-demo-card.ts b/demo/src/custom-cards/ha-demo-card.ts index 0f27328ecf..89835b5174 100644 --- a/demo/src/custom-cards/ha-demo-card.ts +++ b/demo/src/custom-cards/ha-demo-card.ts @@ -1,6 +1,6 @@ import "@material/mwc-button"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import { until } from "lit/directives/until"; import "../../../src/components/ha-card"; import "../../../src/components/ha-circular-progress"; @@ -14,6 +14,7 @@ import { setDemoConfig, } from "../configs/demo-configs"; +@customElement("ha-demo-card") export class HADemoCard extends LitElement implements LovelaceCard { @property({ attribute: false }) public lovelace?: Lovelace; @@ -154,5 +155,3 @@ declare global { "ha-demo-card": HADemoCard; } } - -customElements.define("ha-demo-card", HADemoCard); diff --git a/demo/src/ha-demo.ts b/demo/src/ha-demo.ts index 4b527df487..d542477be9 100644 --- a/demo/src/ha-demo.ts +++ b/demo/src/ha-demo.ts @@ -1,5 +1,6 @@ // Compat needs to be first import import "../../src/resources/compatibility"; +import { customElement } from "lit/decorators"; import { isNavigationClick } from "../../src/common/dom/is-navigation-click"; import { navigate } from "../../src/common/navigate"; import { @@ -26,7 +27,8 @@ import { mockSystemLog } from "./stubs/system_log"; import { mockTemplate } from "./stubs/template"; import { mockTranslations } from "./stubs/translations"; -class HaDemo extends HomeAssistantAppEl { +@customElement("ha-demo") +export class HaDemo extends HomeAssistantAppEl { protected async _initializeHass() { const initial: Partial = { panelUrl: (this as any)._panelUrl, @@ -123,8 +125,6 @@ class HaDemo extends HomeAssistantAppEl { } } -customElements.define("ha-demo", HaDemo); - declare global { interface HTMLElementTagNameMap { "ha-demo": HaDemo; diff --git a/hassio/src/addon-store/hassio-addon-repository.ts b/hassio/src/addon-store/hassio-addon-repository.ts index 0d22c49ad2..7b1d18f529 100644 --- a/hassio/src/addon-store/hassio-addon-repository.ts +++ b/hassio/src/addon-store/hassio-addon-repository.ts @@ -1,6 +1,6 @@ import { mdiArrowUpBoldCircle, mdiPuzzle } from "@mdi/js"; import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; -import { property } from "lit/decorators"; +import { customElement, property } from "lit/decorators"; import memoizeOne from "memoize-one"; import { atLeastVersion } from "../../../src/common/config/version"; import { navigate } from "../../../src/common/navigate"; @@ -14,7 +14,8 @@ import "../components/hassio-card-content"; import { filterAndSort } from "../components/hassio-filter-addons"; import { hassioStyle } from "../resources/hassio-style"; -class HassioAddonRepositoryEl extends LitElement { +@customElement("hassio-addon-repository") +export class HassioAddonRepositoryEl extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public supervisor!: Supervisor; @@ -140,5 +141,3 @@ class HassioAddonRepositoryEl extends LitElement { ]; } } - -customElements.define("hassio-addon-repository", HassioAddonRepositoryEl); diff --git a/hassio/src/addon-store/hassio-addon-store.ts b/hassio/src/addon-store/hassio-addon-store.ts index 0623e2bf44..0ae00d5453 100644 --- a/hassio/src/addon-store/hassio-addon-store.ts +++ b/hassio/src/addon-store/hassio-addon-store.ts @@ -9,7 +9,7 @@ import { PropertyValues, TemplateResult, } from "lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { atLeastVersion } from "../../../src/common/config/version"; import { fireEvent } from "../../../src/common/dom/fire_event"; @@ -49,7 +49,8 @@ const sortRepos = (a: HassioAddonRepository, b: HassioAddonRepository) => { return a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1; }; -class HassioAddonStore extends LitElement { +@customElement("hassio-addon-store") +export class HassioAddonStore extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public supervisor!: Supervisor; @@ -250,5 +251,3 @@ class HassioAddonStore extends LitElement { `; } } - -customElements.define("hassio-addon-store", HassioAddonStore); diff --git a/src/auth/ha-auth-flow.ts b/src/auth/ha-auth-flow.ts index 1fea597049..f151fea546 100644 --- a/src/auth/ha-auth-flow.ts +++ b/src/auth/ha-auth-flow.ts @@ -8,7 +8,7 @@ import { PropertyValues, TemplateResult, } from "lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import "../components/ha-alert"; import "../components/ha-checkbox"; import { computeInitialHaFormData } from "../components/ha-form/compute-initial-ha-form-data"; @@ -25,7 +25,8 @@ import "./ha-password-manager-polyfill"; type State = "loading" | "error" | "step"; -class HaAuthFlow extends litLocalizeLiteMixin(LitElement) { +@customElement("ha-auth-flow") +export class HaAuthFlow extends litLocalizeLiteMixin(LitElement) { @property({ attribute: false }) public authProvider?: AuthProvider; @property() public clientId?: string; @@ -407,7 +408,6 @@ class HaAuthFlow extends litLocalizeLiteMixin(LitElement) { `; } } -customElements.define("ha-auth-flow", HaAuthFlow); declare global { interface HTMLElementTagNameMap { diff --git a/src/auth/ha-authorize.ts b/src/auth/ha-authorize.ts index add29139bc..9f780facc2 100644 --- a/src/auth/ha-authorize.ts +++ b/src/auth/ha-authorize.ts @@ -1,5 +1,5 @@ import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import punycode from "punycode"; import { applyThemesOnElement } from "../common/dom/apply_themes_on_element"; import { extractSearchParamsObject } from "../common/url/search-params"; @@ -14,7 +14,8 @@ import "./ha-auth-flow"; import("./ha-pick-auth-provider"); -class HaAuthorize extends litLocalizeLiteMixin(LitElement) { +@customElement("ha-authorize") +export class HaAuthorize extends litLocalizeLiteMixin(LitElement) { @property() public clientId?: string; @property() public redirectUri?: string; @@ -183,4 +184,3 @@ class HaAuthorize extends litLocalizeLiteMixin(LitElement) { `; } } -customElements.define("ha-authorize", HaAuthorize); diff --git a/src/auth/ha-pick-auth-provider.ts b/src/auth/ha-pick-auth-provider.ts index 3ee7638b10..5d9b480030 100644 --- a/src/auth/ha-pick-auth-provider.ts +++ b/src/auth/ha-pick-auth-provider.ts @@ -1,7 +1,7 @@ import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; import { css, html, LitElement } from "lit"; -import { property } from "lit/decorators"; +import { customElement, property } from "lit/decorators"; import { fireEvent } from "../common/dom/fire_event"; import "../components/ha-icon-next"; import { AuthProvider } from "../data/auth"; @@ -13,7 +13,8 @@ declare global { } } -class HaPickAuthProvider extends litLocalizeLiteMixin(LitElement) { +@customElement("ha-pick-auth-provider") +export class HaPickAuthProvider extends litLocalizeLiteMixin(LitElement) { @property() public authProviders: AuthProvider[] = []; protected render() { @@ -47,4 +48,3 @@ class HaPickAuthProvider extends litLocalizeLiteMixin(LitElement) { } `; } -customElements.define("ha-pick-auth-provider", HaPickAuthProvider); diff --git a/src/components/buttons/ha-call-api-button.ts b/src/components/buttons/ha-call-api-button.ts index 34013a1102..05fc1f878d 100644 --- a/src/components/buttons/ha-call-api-button.ts +++ b/src/components/buttons/ha-call-api-button.ts @@ -1,9 +1,10 @@ import { css, CSSResultGroup, html, LitElement } from "lit"; -import { property, query } from "lit/decorators"; +import { customElement, property, query } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; import { HomeAssistant } from "../../types"; import "./ha-progress-button"; +@customElement("ha-call-api-button") class HaCallApiButton extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -69,8 +70,6 @@ class HaCallApiButton extends LitElement { } } -customElements.define("ha-call-api-button", HaCallApiButton); - declare global { interface HTMLElementTagNameMap { "ha-call-api-button": HaCallApiButton; diff --git a/src/components/ha-icon-next.ts b/src/components/ha-icon-next.ts index 6b6eef9b01..0752f492fe 100644 --- a/src/components/ha-icon-next.ts +++ b/src/components/ha-icon-next.ts @@ -1,6 +1,8 @@ import { mdiChevronLeft, mdiChevronRight } from "@mdi/js"; +import { customElement } from "lit/decorators"; import { HaSvgIcon } from "./ha-svg-icon"; +@customElement("ha-icon-next") export class HaIconNext extends HaSvgIcon { public connectedCallback() { super.connectedCallback(); @@ -20,5 +22,3 @@ declare global { "ha-icon-next": HaIconNext; } } - -customElements.define("ha-icon-next", HaIconNext); diff --git a/src/components/ha-icon-prev.ts b/src/components/ha-icon-prev.ts index 29712fc89b..f6744a1b20 100644 --- a/src/components/ha-icon-prev.ts +++ b/src/components/ha-icon-prev.ts @@ -1,6 +1,8 @@ import { mdiChevronLeft, mdiChevronRight } from "@mdi/js"; +import { customElement } from "lit/decorators"; import { HaSvgIcon } from "./ha-svg-icon"; +@customElement("ha-icon-prev") export class HaIconPrev extends HaSvgIcon { public connectedCallback() { super.connectedCallback(); @@ -20,5 +22,3 @@ declare global { "ha-icon-prev": HaIconPrev; } } - -customElements.define("ha-icon-prev", HaIconPrev); diff --git a/src/components/ha-label-badge.ts b/src/components/ha-label-badge.ts index a8bbf838a5..707952b9e1 100644 --- a/src/components/ha-label-badge.ts +++ b/src/components/ha-label-badge.ts @@ -6,9 +6,10 @@ import { PropertyValues, TemplateResult, } from "lit"; -import { property } from "lit/decorators"; +import { customElement, property } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; +@customElement("ha-label-badge") class HaLabelBadge extends LitElement { @property() public label?: string; @@ -132,5 +133,3 @@ declare global { "ha-label-badge": HaLabelBadge; } } - -customElements.define("ha-label-badge", HaLabelBadge); diff --git a/src/components/ha-service-picker.ts b/src/components/ha-service-picker.ts index b631085996..76532a331d 100644 --- a/src/components/ha-service-picker.ts +++ b/src/components/ha-service-picker.ts @@ -1,6 +1,6 @@ import { html, LitElement } from "lit"; import { ComboBoxLitRenderer } from "@vaadin/combo-box/lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../common/dom/fire_event"; import { LocalizeFunc } from "../common/translations/localize"; @@ -17,6 +17,7 @@ const rowRenderer: ComboBoxLitRenderer<{ service: string; name: string }> = ( > `; +@customElement("ha-service-picker") class HaServicePicker extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -113,8 +114,6 @@ class HaServicePicker extends LitElement { } } -customElements.define("ha-service-picker", HaServicePicker); - declare global { interface HTMLElementTagNameMap { "ha-service-picker": HaServicePicker; diff --git a/src/components/ha-toast.ts b/src/components/ha-toast.ts index f29fda318c..99d6e4f872 100644 --- a/src/components/ha-toast.ts +++ b/src/components/ha-toast.ts @@ -1,11 +1,13 @@ import "@polymer/paper-toast/paper-toast"; import type { PaperToastElement } from "@polymer/paper-toast/paper-toast"; +import { customElement } from "lit/decorators"; import type { Constructor } from "../types"; const PaperToast = customElements.get( "paper-toast" ) as Constructor; +@customElement("ha-toast") export class HaToast extends PaperToast { private _resizeListener?: (obj: { matches: boolean }) => unknown; @@ -34,5 +36,3 @@ declare global { "ha-toast": HaToast; } } - -customElements.define("ha-toast", HaToast); diff --git a/src/panels/calendar/ha-full-calendar.ts b/src/panels/calendar/ha-full-calendar.ts index bad1abd75d..56ff0fd8d7 100644 --- a/src/panels/calendar/ha-full-calendar.ts +++ b/src/panels/calendar/ha-full-calendar.ts @@ -20,7 +20,7 @@ import { PropertyValues, TemplateResult, } from "lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import memoize from "memoize-one"; import { firstWeekdayIndex } from "../../common/datetime/first_weekday"; import { useAmPm } from "../../common/datetime/use_am_pm"; @@ -71,6 +71,7 @@ const defaultFullCalendarConfig: CalendarOptions = { }, }; +@customElement("ha-full-calendar") export class HAFullCalendar extends LitElement { public hass!: HomeAssistant; @@ -673,5 +674,3 @@ export class HAFullCalendar extends LitElement { ]; } } - -window.customElements.define("ha-full-calendar", HAFullCalendar); diff --git a/src/panels/config/cloud/account/cloud-account.ts b/src/panels/config/cloud/account/cloud-account.ts index e3a8fbd494..fdd3e20689 100644 --- a/src/panels/config/cloud/account/cloud-account.ts +++ b/src/panels/config/cloud/account/cloud-account.ts @@ -321,8 +321,6 @@ export class CloudAccount extends SubscribeMixin(LitElement) { } } -customElements.define("cloud-account", CloudAccount); - declare global { interface HTMLElementTagNameMap { "cloud-account": CloudAccount; diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index 1590a44cb3..40c2a678f0 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -1,7 +1,7 @@ import "@material/mwc-button"; import deepFreeze from "deep-freeze"; import { html, LitElement, TemplateResult } from "lit"; -import { property, state } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import { constructUrlCurrentPath } from "../../common/url/construct-url"; import { addSearchParam, @@ -38,7 +38,8 @@ interface LovelacePanelConfig { let editorLoaded = false; let resourcesLoaded = false; -class LovelacePanel extends LitElement { +@customElement("ha-panel-lovelace") +export class LovelacePanel extends LitElement { @property() public panel?: PanelInfo; @property({ attribute: false }) public hass?: HomeAssistant; @@ -448,5 +449,3 @@ class LovelacePanel extends LitElement { } } } - -customElements.define("ha-panel-lovelace", LovelacePanel); diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index 5582c6d67b..ae5bef430e 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -29,7 +29,7 @@ import { PropertyValues, TemplateResult, } from "lit"; -import { property, query, state } from "lit/decorators"; +import { customElement, property, query, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { ifDefined } from "lit/directives/if-defined"; import memoizeOne from "memoize-one"; @@ -78,6 +78,7 @@ import type { Lovelace } from "./types"; import "./views/hui-view"; import type { HUIView } from "./views/hui-view"; +@customElement("hui-root") class HUIRoot extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -1066,5 +1067,3 @@ declare global { "hui-root": HUIRoot; } } - -customElements.define("hui-root", HUIRoot); diff --git a/src/panels/map/ha-panel-map.ts b/src/panels/map/ha-panel-map.ts index 89b9351473..57a055c379 100644 --- a/src/panels/map/ha-panel-map.ts +++ b/src/panels/map/ha-panel-map.ts @@ -1,7 +1,7 @@ import { mdiPencil } from "@mdi/js"; import "@polymer/app-layout/app-toolbar/app-toolbar"; import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit"; -import { property } from "lit/decorators"; +import { customElement, property } from "lit/decorators"; import { computeStateDomain } from "../../common/entity/compute_state_domain"; import { navigate } from "../../common/navigate"; import "../../components/ha-menu-button"; @@ -11,6 +11,7 @@ import "../../layouts/ha-app-layout"; import { haStyle } from "../../resources/styles"; import { HomeAssistant } from "../../types"; +@customElement("ha-panel-map") class HaPanelMap extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -95,8 +96,6 @@ class HaPanelMap extends LitElement { } } -customElements.define("ha-panel-map", HaPanelMap); - declare global { interface HTMLElementTagNameMap { "ha-panel-map": HaPanelMap; From 0fc36823da5a881c72d73a67bc8854a12594ffe0 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 21 Feb 2023 21:01:24 +0100 Subject: [PATCH 126/138] More info light redesign (#15482) Co-authored-by: Bram Kragten --- package.json | 1 + src/components/ha-control-slider.ts | 26 +- src/components/ha-control-switch.ts | 5 +- .../components/ha-more-info-state-header.ts | 85 ++ .../components/ha-more-info-toggle.ts | 149 ++++ .../lights/ha-more-info-light-brightness.ts | 102 +++ .../ha-more-info-view-light-color-picker.ts | 551 +++++++++++++ .../lights/show-view-light-color-picker.ts | 21 + src/dialogs/more-info/const.ts | 3 +- .../more-info/controls/more-info-light.ts | 735 +++++------------- src/dialogs/more-info/ha-more-info-dialog.ts | 158 ++-- src/dialogs/more-info/ha-more-info-info.ts | 4 +- .../more-info/state_more_info_control.ts | 9 +- src/translations/en.json | 16 + yarn.lock | 13 +- 15 files changed, 1263 insertions(+), 615 deletions(-) create mode 100644 src/dialogs/more-info/components/ha-more-info-state-header.ts create mode 100644 src/dialogs/more-info/components/ha-more-info-toggle.ts create mode 100644 src/dialogs/more-info/components/lights/ha-more-info-light-brightness.ts create mode 100644 src/dialogs/more-info/components/lights/ha-more-info-view-light-color-picker.ts create mode 100644 src/dialogs/more-info/components/lights/show-view-light-color-picker.ts diff --git a/package.json b/package.json index a9af1595db..bef9fe4631 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "@material/mwc-textfield": "^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.2", "@mdi/js": "7.1.96", "@mdi/svg": "7.1.96", "@polymer/app-layout": "^3.1.0", diff --git a/src/components/ha-control-slider.ts b/src/components/ha-control-slider.ts index 34cdf0bb6b..2b761d4c30 100644 --- a/src/components/ha-control-slider.ts +++ b/src/components/ha-control-slider.ts @@ -44,7 +44,7 @@ const getPercentageFromEvent = (e: HammerInput, vertical: boolean) => { @customElement("ha-control-slider") export class HaControlSlider extends LitElement { - @property({ type: Boolean }) + @property({ type: Boolean, reflect: true }) public disabled = false; @property() @@ -245,14 +245,16 @@ export class HaControlSlider extends LitElement { >
    ${this.mode === "cursor" - ? html` -
    - ` + ? this.value != null + ? html` +
    + ` + : null : html`
    + `; + } + + const stateDisplay = computeStateDisplay( + this.hass!.localize, + stateObj, + this.hass!.locale, + this.hass!.entities + ); + + return stateDisplay; + } + + protected render(): TemplateResult { + const name = this.stateObj.attributes.friendly_name; + + const stateDisplay = + this.stateOverride ?? this._computeStateDisplay(this.stateObj); + + return html` +

    ${name}

    +

    ${stateDisplay}

    + `; + } + + static get styles(): CSSResultGroup { + return css` + p { + text-align: center; + margin: 0; + } + .name { + font-style: normal; + font-weight: 400; + font-size: 28px; + line-height: 36px; + margin-bottom: 4px; + } + .state { + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 24px; + letter-spacing: 0.1px; + margin-bottom: 24px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-more-info-state-header": HaMoreInfoStateHeader; + } +} diff --git a/src/dialogs/more-info/components/ha-more-info-toggle.ts b/src/dialogs/more-info/components/ha-more-info-toggle.ts new file mode 100644 index 0000000000..fabf68d407 --- /dev/null +++ b/src/dialogs/more-info/components/ha-more-info-toggle.ts @@ -0,0 +1,149 @@ +import { mdiFlash, mdiFlashOff } from "@mdi/js"; +import { HassEntity } from "home-assistant-js-websocket"; +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property } from "lit/decorators"; +import { classMap } from "lit/directives/class-map"; +import { styleMap } from "lit/directives/style-map"; +import { computeDomain } from "../../../common/entity/compute_domain"; +import { stateActive } from "../../../common/entity/state_active"; +import { stateColorCss } from "../../../common/entity/state_color"; +import "../../../components/ha-control-button"; +import "../../../components/ha-control-switch"; +import { UNAVAILABLE, UNKNOWN } from "../../../data/entity"; +import { HomeAssistant } from "../../../types"; + +@customElement("ha-more-info-toggle") +export class HaMoreInfoToggle extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj!: HassEntity; + + @property({ attribute: false }) public iconPathOn?: string; + + @property({ attribute: false }) public iconPathOff?: string; + + private _valueChanged(ev) { + const checked = ev.target.checked as boolean; + + if (checked) { + this._turnOn(); + } else { + this._turnOff(); + } + } + + private _turnOn() { + const domain = computeDomain(this.stateObj!.entity_id); + this.hass.callService(domain, "turn_on", { + entity_id: this.stateObj!.entity_id, + }); + } + + private _turnOff() { + const domain = computeDomain(this.stateObj!.entity_id); + this.hass.callService(domain, "turn_off", { + entity_id: this.stateObj!.entity_id, + }); + } + + protected render(): TemplateResult { + const color = stateColorCss(this.stateObj); + const isOn = this.stateObj.state === "on"; + const isOff = this.stateObj.state === "off"; + + if ( + this.stateObj.attributes.assumed_state || + this.stateObj.state === UNKNOWN + ) { + return html` +
    + + + + + + +
    + `; + } + + return html` + + + `; + } + + static get styles(): CSSResultGroup { + return css` + ha-control-switch { + height: 320px; + --control-switch-thickness: 100px; + --control-switch-border-radius: 24px; + --control-switch-padding: 6px; + --mdc-icon-size: 24px; + } + .buttons { + display: flex; + flex-direction: column; + width: 100px; + height: 320px; + padding: 6px; + box-sizing: border-box; + } + ha-control-button { + flex: 1; + width: 100%; + --button-bar-border-radius: 18px; + } + ha-control-button.active { + --button-bar-icon-color: white; + --button-bar-background-color: var(--color); + --button-bar-background-opacity: 1; + } + ha-control-button:not(:last-child) { + margin-bottom: 6px; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-more-info-toggle": HaMoreInfoToggle; + } +} diff --git a/src/dialogs/more-info/components/lights/ha-more-info-light-brightness.ts b/src/dialogs/more-info/components/lights/ha-more-info-light-brightness.ts new file mode 100644 index 0000000000..b82226ec6f --- /dev/null +++ b/src/dialogs/more-info/components/lights/ha-more-info-light-brightness.ts @@ -0,0 +1,102 @@ +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property, state } from "lit/decorators"; +import { styleMap } from "lit/directives/style-map"; +import { + hsv2rgb, + rgb2hex, + rgb2hsv, +} from "../../../../common/color/convert-color"; +import { stateActive } from "../../../../common/entity/state_active"; +import { stateColorCss } from "../../../../common/entity/state_color"; +import "../../../../components/ha-control-slider"; +import { UNAVAILABLE } from "../../../../data/entity"; +import { LightEntity } from "../../../../data/light"; +import { HomeAssistant } from "../../../../types"; + +@customElement("ha-more-info-light-brightness") +export class HaMoreInfoLightBrightness extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj!: LightEntity; + + @state() value?: number; + + protected updated(changedProp: Map): void { + if (changedProp.has("stateObj")) { + this.value = + this.stateObj.attributes.brightness != null + ? Math.max( + Math.round((this.stateObj.attributes.brightness * 100) / 255), + 1 + ) + : undefined; + } + } + + private _valueChanged(ev: CustomEvent) { + const value = (ev.detail as any).value; + if (isNaN(value)) return; + + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + brightness_pct: value, + }); + } + + protected render(): TemplateResult { + let color = stateColorCss(this.stateObj); + + if (this.stateObj.attributes.rgb_color) { + const hsvColor = rgb2hsv(this.stateObj.attributes.rgb_color); + + // Modify the real rgb color for better contrast + if (hsvColor[1] < 0.4) { + // Special case for very light color (e.g: white) + if (hsvColor[1] < 0.1) { + hsvColor[2] = 225; + } else { + hsvColor[1] = 0.4; + } + } + color = rgb2hex(hsv2rgb(hsvColor)); + } + + return html` + + + `; + } + + static get styles(): CSSResultGroup { + return css` + ha-control-slider { + height: 320px; + --control-slider-thickness: 100px; + --control-slider-border-radius: 24px; + --control-slider-color: var(--primary-color); + --control-slider-background: var(--disabled-color); + --control-slider-background-opacity: 0.2; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-more-info-light-brightness": HaMoreInfoLightBrightness; + } +} diff --git a/src/dialogs/more-info/components/lights/ha-more-info-view-light-color-picker.ts b/src/dialogs/more-info/components/lights/ha-more-info-view-light-color-picker.ts new file mode 100644 index 0000000000..33058b76a7 --- /dev/null +++ b/src/dialogs/more-info/components/lights/ha-more-info-view-light-color-picker.ts @@ -0,0 +1,551 @@ +import "@material/mwc-button"; +import "@material/mwc-tab-bar/mwc-tab-bar"; +import "@material/mwc-tab/mwc-tab"; +import { mdiPalette } from "@mdi/js"; +import { + css, + CSSResultGroup, + html, + LitElement, + PropertyValues, + TemplateResult, +} from "lit"; +import { customElement, property, state } from "lit/decorators"; +import "../../../../components/ha-button-toggle-group"; +import "../../../../components/ha-color-picker"; +import "../../../../components/ha-control-slider"; +import "../../../../components/ha-icon-button-prev"; +import "../../../../components/ha-labeled-slider"; +import { + getLightCurrentModeRgbColor, + LightColorMode, + LightEntity, + lightSupportsColor, + lightSupportsColorMode, +} from "../../../../data/light"; +import { haStyleDialog } from "../../../../resources/styles"; +import { HomeAssistant } from "../../../../types"; +import { LightColorPickerViewParams } from "./show-view-light-color-picker"; + +type Mode = "color_temp" | "color"; + +@customElement("ha-more-info-view-light-color-picker") +class MoreInfoViewLightColorPicker extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property() public params?: LightColorPickerViewParams; + + @state() private _ctSliderValue?: number; + + @state() private _cwSliderValue?: number; + + @state() private _wwSliderValue?: number; + + @state() private _wvSliderValue?: number; + + @state() private _colorBrightnessSliderValue?: number; + + @state() private _brightnessAdjusted?: number; + + @state() private _hueSegments = 24; + + @state() private _saturationSegments = 8; + + @state() private _colorPickerColor?: [number, number, number]; + + @state() private _mode?: Mode; + + @state() private _modes: Mode[] = []; + + get stateObj() { + return this.params + ? (this.hass.states[this.params.entityId] as LightEntity) + : undefined; + } + + protected render(): TemplateResult { + if (!this.params || !this.stateObj) { + return html``; + } + + const supportsRgbww = lightSupportsColorMode( + this.stateObj, + LightColorMode.RGBWW + ); + + const supportsRgbw = + !supportsRgbww && + lightSupportsColorMode(this.stateObj, LightColorMode.RGBW); + + return html` +
    + ${this._modes.length > 1 + ? html` + + ${this._modes.map( + (value) => + html`` + )} + + ` + : ""} +
    + ${this._mode === LightColorMode.COLOR_TEMP + ? html` + + + ` + : ""} + ${this._mode === "color" + ? html` +
    + + + +
    + + ${supportsRgbw || supportsRgbww + ? html`` + : ""} + ${supportsRgbw + ? html` + + ` + : ""} + ${supportsRgbww + ? html` + + + ` + : ""} + ` + : ""} +
    +
    + `; + } + + public _updateSliderValues() { + const stateObj = this.stateObj; + + if (stateObj?.state === "on") { + this._brightnessAdjusted = undefined; + if ( + stateObj.attributes.color_mode === LightColorMode.RGB && + !lightSupportsColorMode(stateObj, LightColorMode.RGBWW) && + !lightSupportsColorMode(stateObj, LightColorMode.RGBW) + ) { + const maxVal = Math.max(...stateObj.attributes.rgb_color!); + + if (maxVal < 255) { + this._brightnessAdjusted = maxVal; + } + } + this._ctSliderValue = stateObj.attributes.color_temp_kelvin; + this._wvSliderValue = + stateObj.attributes.color_mode === LightColorMode.RGBW + ? Math.round((stateObj.attributes.rgbw_color![3] * 100) / 255) + : undefined; + this._cwSliderValue = + stateObj.attributes.color_mode === LightColorMode.RGBWW + ? Math.round((stateObj.attributes.rgbww_color![3] * 100) / 255) + : undefined; + this._wwSliderValue = + stateObj.attributes.color_mode === LightColorMode.RGBWW + ? Math.round((stateObj.attributes.rgbww_color![4] * 100) / 255) + : undefined; + + const currentRgbColor = getLightCurrentModeRgbColor(stateObj); + + this._colorBrightnessSliderValue = currentRgbColor + ? Math.round((Math.max(...currentRgbColor.slice(0, 3)) * 100) / 255) + : undefined; + + this._colorPickerColor = currentRgbColor?.slice(0, 3) as [ + number, + number, + number + ]; + } else { + this._colorPickerColor = [0, 0, 0]; + this._ctSliderValue = undefined; + this._wvSliderValue = undefined; + this._cwSliderValue = undefined; + this._wwSliderValue = undefined; + } + } + + public willUpdate(changedProps: PropertyValues) { + super.willUpdate(changedProps); + + if (!changedProps.has("params") || !changedProps.has("hass")) { + return; + } + + if (changedProps.has("params")) { + const supportsTemp = lightSupportsColorMode( + this.stateObj!, + LightColorMode.COLOR_TEMP + ); + + const supportsColor = lightSupportsColor(this.stateObj!); + + const modes: Mode[] = []; + if (supportsColor) { + modes.push("color"); + } + if (supportsTemp) { + modes.push("color_temp"); + } + + this._modes = modes; + this._mode = + this.stateObj!.attributes.color_mode === LightColorMode.COLOR_TEMP + ? LightColorMode.COLOR_TEMP + : "color"; + } + + this._updateSliderValues(); + } + + private _handleTabChanged(ev: CustomEvent): void { + const newMode = this._modes[ev.detail.index]; + if (newMode === this._mode) { + return; + } + this._mode = newMode; + } + + private _ctSliderChanged(ev: CustomEvent) { + const ct = ev.detail.value; + + if (isNaN(ct)) { + return; + } + + this._ctSliderValue = ct; + + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + color_temp_kelvin: ct, + }); + } + + private _wvSliderChanged(ev: CustomEvent) { + const target = ev.target as any; + let wv = Number(target.value); + const name = target.name; + + if (isNaN(wv)) { + return; + } + + if (name === "wv") { + this._wvSliderValue = wv; + } else if (name === "cw") { + this._cwSliderValue = wv; + } else if (name === "ww") { + this._wwSliderValue = wv; + } + + wv = Math.min(255, Math.round((wv * 255) / 100)); + + const rgb = getLightCurrentModeRgbColor(this.stateObj!); + + if (name === "wv") { + const rgbw_color = rgb || [0, 0, 0, 0]; + rgbw_color[3] = wv; + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + rgbw_color, + }); + return; + } + + const rgbww_color = rgb || [0, 0, 0, 0, 0]; + while (rgbww_color.length < 5) { + rgbww_color.push(0); + } + rgbww_color[name === "cw" ? 3 : 4] = wv; + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + rgbww_color, + }); + } + + private _colorBrightnessSliderChanged(ev: CustomEvent) { + const target = ev.target as any; + let value = Number(target.value); + + if (isNaN(value)) { + return; + } + + const oldValue = this._colorBrightnessSliderValue; + this._colorBrightnessSliderValue = value; + + value = (value * 255) / 100; + + const rgb = (getLightCurrentModeRgbColor(this.stateObj!)?.slice(0, 3) || [ + 255, 255, 255, + ]) as [number, number, number]; + + this._setRgbWColor( + this._adjustColorBrightness( + // first normalize the value + oldValue + ? this._adjustColorBrightness(rgb, (oldValue * 255) / 100, true) + : rgb, + value + ) + ); + } + + private _segmentClick() { + if (this._hueSegments === 24 && this._saturationSegments === 8) { + this._hueSegments = 0; + this._saturationSegments = 0; + } else { + this._hueSegments = 24; + this._saturationSegments = 8; + } + } + + private _adjustColorBrightness( + rgbColor: [number, number, number], + value?: number, + invert = false + ) { + if (value !== undefined && value !== 255) { + let ratio = value / 255; + if (invert) { + ratio = 1 / ratio; + } + rgbColor[0] = Math.min(255, Math.round(rgbColor[0] * ratio)); + rgbColor[1] = Math.min(255, Math.round(rgbColor[1] * ratio)); + rgbColor[2] = Math.min(255, Math.round(rgbColor[2] * ratio)); + } + return rgbColor; + } + + private _setRgbWColor(rgbColor: [number, number, number]) { + if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGBWW)) { + const rgbww_color: [number, number, number, number, number] = this + .stateObj!.attributes.rgbww_color + ? [...this.stateObj!.attributes.rgbww_color] + : [0, 0, 0, 0, 0]; + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + rgbww_color: rgbColor.concat(rgbww_color.slice(3)), + }); + } else if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGBW)) { + const rgbw_color: [number, number, number, number] = this.stateObj! + .attributes.rgbw_color + ? [...this.stateObj!.attributes.rgbw_color] + : [0, 0, 0, 0]; + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + rgbw_color: rgbColor.concat(rgbw_color.slice(3)), + }); + } + } + + /** + * Called when a new color has been picked. + * should be throttled with the 'throttle=' attribute of the color picker + */ + private _colorPicked( + ev: CustomEvent<{ + hs: { h: number; s: number }; + rgb: { r: number; g: number; b: number }; + }> + ) { + this._colorPickerColor = [ + ev.detail.rgb.r, + ev.detail.rgb.g, + ev.detail.rgb.b, + ]; + + if ( + lightSupportsColorMode(this.stateObj!, LightColorMode.RGBWW) || + lightSupportsColorMode(this.stateObj!, LightColorMode.RGBW) + ) { + this._setRgbWColor( + this._colorBrightnessSliderValue + ? this._adjustColorBrightness( + [ev.detail.rgb.r, ev.detail.rgb.g, ev.detail.rgb.b], + (this._colorBrightnessSliderValue * 255) / 100 + ) + : [ev.detail.rgb.r, ev.detail.rgb.g, ev.detail.rgb.b] + ); + } else if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGB)) { + const rgb_color: [number, number, number] = [ + ev.detail.rgb.r, + ev.detail.rgb.g, + ev.detail.rgb.b, + ]; + if (this._brightnessAdjusted) { + const brightnessAdjust = (this._brightnessAdjusted / 255) * 100; + const brightnessPercentage = Math.round( + ((this.stateObj!.attributes.brightness || 0) * brightnessAdjust) / 255 + ); + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + brightness_pct: brightnessPercentage, + rgb_color: this._adjustColorBrightness( + rgb_color, + this._brightnessAdjusted, + true + ), + }); + } else { + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + rgb_color, + }); + } + } else { + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + hs_color: [ev.detail.hs.h, ev.detail.hs.s * 100], + }); + } + } + + static get styles(): CSSResultGroup { + return [ + haStyleDialog, + css` + .content { + display: flex; + flex-direction: column; + align-items: center; + padding: 16px; + } + + .segmentationContainer { + position: relative; + max-height: 500px; + display: flex; + justify-content: center; + } + + .segmentationButton { + position: absolute; + top: 5%; + left: 0; + color: var(--secondary-text-color); + } + + ha-color-picker { + --ha-color-picker-wheel-borderwidth: 5; + --ha-color-picker-wheel-bordercolor: white; + --ha-color-picker-wheel-shadow: none; + --ha-color-picker-marker-borderwidth: 2; + --ha-color-picker-marker-bordercolor: white; + } + + ha-control-slider { + height: 320px; + margin: 20px 0; + } + + ha-labeled-slider { + width: 100%; + } + + .color_temp { + --control-slider-thickness: 100px; + --control-slider-border-radius: 24px; + --control-slider-background: -webkit-linear-gradient( + top, + rgb(166, 209, 255) 0%, + white 50%, + rgb(255, 160, 0) 100% + ); + --control-slider-background-opacity: 1; + } + + hr { + border-color: var(--divider-color); + border-bottom: none; + margin: 16px 0; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-more-info-view-light-color-picker": MoreInfoViewLightColorPicker; + } +} diff --git a/src/dialogs/more-info/components/lights/show-view-light-color-picker.ts b/src/dialogs/more-info/components/lights/show-view-light-color-picker.ts new file mode 100644 index 0000000000..c59cc031e9 --- /dev/null +++ b/src/dialogs/more-info/components/lights/show-view-light-color-picker.ts @@ -0,0 +1,21 @@ +import { fireEvent } from "../../../../common/dom/fire_event"; + +export interface LightColorPickerViewParams { + entityId: string; +} + +export const loadLightColorPickerView = () => + import("./ha-more-info-view-light-color-picker"); + +export const showLightColorPickerView = ( + element: HTMLElement, + title: string, + params: LightColorPickerViewParams +): void => { + fireEvent(element, "show-child-view", { + viewTag: "ha-more-info-view-light-color-picker", + viewImport: loadLightColorPickerView, + viewTitle: title, + viewParams: params, + }); +}; diff --git a/src/dialogs/more-info/const.ts b/src/dialogs/more-info/const.ts index 30ac679e33..fde9c34c5f 100644 --- a/src/dialogs/more-info/const.ts +++ b/src/dialogs/more-info/const.ts @@ -13,7 +13,8 @@ export const EDITABLE_DOMAINS_WITH_ID = ["scene", "automation"]; * Entity Domains that should always be editable; {@see shouldShowEditIcon}. * */ export const EDITABLE_DOMAINS_WITH_UNIQUE_ID = ["script"]; - +/** Domains with with new more info design. */ +export const DOMAINS_WITH_NEW_MORE_INFO = ["light"]; /** Domains with separate more info dialog. */ export const DOMAINS_WITH_MORE_INFO = [ "alarm_control_panel", diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 7ce94dabbf..90befc078e 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -1,5 +1,12 @@ import "@material/mwc-list/mwc-list-item"; -import { mdiPalette } from "@mdi/js"; +import "@material/web/iconbutton/outlined-icon-button"; +import { + mdiCreation, + mdiLightbulb, + mdiLightbulbOff, + mdiPalette, + mdiPower, +} from "@mdi/js"; import { css, CSSResultGroup, @@ -9,26 +16,26 @@ import { TemplateResult, } from "lit"; import { customElement, property, state } from "lit/decorators"; -import memoizeOne from "memoize-one"; import { stopPropagation } from "../../../common/dom/stop_propagation"; import { supportsFeature } from "../../../common/entity/supports-feature"; +import { blankBeforePercent } from "../../../common/translations/blank_before_percent"; import "../../../components/ha-attributes"; -import "../../../components/ha-button-toggle-group"; -import "../../../components/ha-color-picker"; -import "../../../components/ha-icon-button"; -import "../../../components/ha-labeled-slider"; +import "../../../components/ha-button-menu"; import "../../../components/ha-select"; +import { UNAVAILABLE } from "../../../data/entity"; import { - getLightCurrentModeRgbColor, LightColorMode, LightEntity, LightEntityFeature, - lightIsInColorMode, + lightSupportsBrightness, lightSupportsColor, lightSupportsColorMode, - lightSupportsBrightness, } from "../../../data/light"; import type { HomeAssistant } from "../../../types"; +import "../components/ha-more-info-state-header"; +import "../components/ha-more-info-toggle"; +import "../components/lights/ha-more-info-light-brightness"; +import { showLightColorPickerView } from "../components/lights/show-view-light-color-picker"; @customElement("more-info-light") class MoreInfoLight extends LitElement { @@ -36,198 +43,152 @@ class MoreInfoLight extends LitElement { @property({ attribute: false }) public stateObj?: LightEntity; - @state() private _brightnessSliderValue = 0; + @state() private _selectedBrightness?: number; - @state() private _ctSliderValue?: number; + private _brightnessChanged(ev) { + const value = (ev.detail as any).value; + if (isNaN(value)) return; + this._selectedBrightness = value; + } - @state() private _cwSliderValue?: number; + protected updated(changedProps: PropertyValues): void { + if (changedProps.has("stateObj")) { + this._selectedBrightness = this.stateObj?.attributes.brightness + ? Math.round((this.stateObj.attributes.brightness * 100) / 255) + : undefined; + } + } - @state() private _wwSliderValue?: number; - - @state() private _wvSliderValue?: number; - - @state() private _colorBrightnessSliderValue?: number; - - @state() private _brightnessAdjusted?: number; - - @state() private _hueSegments = 24; - - @state() private _saturationSegments = 8; - - @state() private _colorPickerColor?: [number, number, number]; - - @state() private _mode?: "color" | LightColorMode; - - protected render(): TemplateResult { + protected render(): TemplateResult | null { if (!this.hass || !this.stateObj) { - return html``; + return null; } - const supportsTemp = lightSupportsColorMode( + const supportsColorTemp = lightSupportsColorMode( this.stateObj, LightColorMode.COLOR_TEMP ); - const supportsWhite = lightSupportsColorMode( + const supportsColor = lightSupportsColor(this.stateObj); + + const supportsBrightness = lightSupportsBrightness(this.stateObj); + + const supportsEffects = supportsFeature( this.stateObj, - LightColorMode.WHITE + LightEntityFeature.EFFECT ); - const supportsRgbww = lightSupportsColorMode( - this.stateObj, - LightColorMode.RGBWW - ); - - const supportsRgbw = - !supportsRgbww && - lightSupportsColorMode(this.stateObj, LightColorMode.RGBW); - - const supportsColor = - supportsRgbww || supportsRgbw || lightSupportsColor(this.stateObj); + const stateOverride = this._selectedBrightness + ? `${Math.round(this._selectedBrightness)}${blankBeforePercent( + this.hass!.locale + )}%` + : undefined; return html`
    - ${lightSupportsBrightness(this.stateObj) - ? html` - - ` - : ""} - ${this.stateObj.state === "on" - ? html` - ${supportsTemp || supportsColor ? html`
    ` : ""} - ${supportsColor && (supportsTemp || supportsWhite) - ? html`` - : ""} - ${supportsTemp && - ((!supportsColor && !supportsWhite) || - this._mode === LightColorMode.COLOR_TEMP) - ? html` - - ` - : ""} - ${supportsColor && - ((!supportsTemp && !supportsWhite) || this._mode === "color") - ? html` -
    - - - -
    - - ${supportsRgbw || supportsRgbww - ? html` + + ${ + supportsBrightness + ? html` + + + ` + : html` + + ` + } + ${ + supportsColorTemp || + supportsColor || + supportsEffects || + supportsBrightness + ? html` +
    + ${supportsBrightness + ? html` + ` - : ""} - ${supportsRgbw - ? html` - + + + ` + : null} + ${supportsColorTemp || supportsColor + ? html` + + + + ` + : null} + ${supportsEffects + ? html` + + - ` - : ""} - ${supportsRgbww - ? html` - - - ` - : ""} - ` - : ""} - ${supportsFeature(this.stateObj, LightEntityFeature.EFFECT) && - this.stateObj!.attributes.effect_list?.length - ? html` -
    - - ${this.stateObj.attributes.effect_list.map( - (effect: string) => html` - - ${effect} - - ` - )} - - ` - : ""} - ` - : ""} + > + +
    + ${this.stateObj.attributes.effect_list!.map( + (effect: string) => html` + + ${effect} + + ` + )} +
    + ` + : null} +
    + ` + : null + } ) { - super.willUpdate(changedProps); - - if (!changedProps.has("stateObj")) { - return; - } - const stateObj = this.stateObj! as LightEntity; - const oldStateObj = changedProps.get("stateObj") as LightEntity | undefined; - - if (stateObj.state === "on") { - // Don't change tab when the color mode changes - if ( - oldStateObj?.entity_id !== stateObj.entity_id || - oldStateObj?.state !== stateObj.state - ) { - this._mode = lightIsInColorMode(this.stateObj!) - ? "color" - : this.stateObj!.attributes.color_mode; - } - - let brightnessAdjust = 100; - this._brightnessAdjusted = undefined; - if ( - stateObj.attributes.color_mode === LightColorMode.RGB && - !lightSupportsColorMode(stateObj, LightColorMode.RGBWW) && - !lightSupportsColorMode(stateObj, LightColorMode.RGBW) - ) { - const maxVal = Math.max(...stateObj.attributes.rgb_color!); - if (maxVal < 255) { - this._brightnessAdjusted = maxVal; - brightnessAdjust = (this._brightnessAdjusted / 255) * 100; - } - } - this._brightnessSliderValue = Math.round( - ((stateObj.attributes.brightness || 0) * brightnessAdjust) / 255 - ); - this._ctSliderValue = stateObj.attributes.color_temp_kelvin; - this._wvSliderValue = - stateObj.attributes.color_mode === LightColorMode.RGBW - ? Math.round((stateObj.attributes.rgbw_color![3] * 100) / 255) - : undefined; - this._cwSliderValue = - stateObj.attributes.color_mode === LightColorMode.RGBWW - ? Math.round((stateObj.attributes.rgbww_color![3] * 100) / 255) - : undefined; - this._wwSliderValue = - stateObj.attributes.color_mode === LightColorMode.RGBWW - ? Math.round((stateObj.attributes.rgbww_color![4] * 100) / 255) - : undefined; - - const currentRgbColor = getLightCurrentModeRgbColor(stateObj); - - this._colorBrightnessSliderValue = currentRgbColor - ? Math.round((Math.max(...currentRgbColor.slice(0, 3)) * 100) / 255) - : undefined; - - this._colorPickerColor = currentRgbColor?.slice(0, 3) as [ - number, - number, - number - ]; - } else { - this._brightnessSliderValue = 0; - } - } - - private _toggleButtons = memoizeOne( - (supportsTemp: boolean, supportsWhite: boolean) => { - const modes = [{ label: "Color", value: "color" }]; - if (supportsTemp) { - modes.push({ label: "Temperature", value: LightColorMode.COLOR_TEMP }); - } - if (supportsWhite) { - modes.push({ label: "White", value: LightColorMode.WHITE }); - } - return modes; - } - ); - - private _modeChanged(ev: CustomEvent) { - this._mode = ev.detail.value; - } - - private _effectChanged(ev) { - const newVal = ev.target.value; - - if (!newVal || this.stateObj!.attributes.effect === newVal) { - return; - } - - this.hass.callService("light", "turn_on", { + private _toggle = () => { + this.hass.callService("light", "toggle", { entity_id: this.stateObj!.entity_id, - effect: newVal, }); - } + }; - private _brightnessSliderChanged(ev: CustomEvent) { - const bri = Number((ev.target as any).value); - - if (isNaN(bri)) { - return; - } - - this._brightnessSliderValue = bri; - - if (this._mode === LightColorMode.WHITE) { - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - white: Math.min(255, Math.round((bri * 255) / 100)), - }); - return; - } - - if (this._brightnessAdjusted) { - const rgb = - this.stateObj!.attributes.rgb_color || - ([0, 0, 0] as [number, number, number]); - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - brightness_pct: bri, - rgb_color: this._adjustColorBrightness( - rgb, - this._brightnessAdjusted, - true - ), - }); - return; - } - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - brightness_pct: bri, - }); - } - - private _ctSliderChanged(ev: CustomEvent) { - const ct = Number((ev.target as any).value); - - if (isNaN(ct)) { - return; - } - - this._ctSliderValue = ct; - - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - color_temp_kelvin: ct, - }); - } - - private _wvSliderChanged(ev: CustomEvent) { - const target = ev.target as any; - let wv = Number(target.value); - const name = target.name; - - if (isNaN(wv)) { - return; - } - - if (name === "wv") { - this._wvSliderValue = wv; - } else if (name === "cw") { - this._cwSliderValue = wv; - } else if (name === "ww") { - this._wwSliderValue = wv; - } - - wv = Math.min(255, Math.round((wv * 255) / 100)); - - const rgb = getLightCurrentModeRgbColor(this.stateObj!); - - if (name === "wv") { - const rgbw_color = rgb || [0, 0, 0, 0]; - rgbw_color[3] = wv; - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - rgbw_color, - }); - return; - } - - const rgbww_color = rgb || [0, 0, 0, 0, 0]; - while (rgbww_color.length < 5) { - rgbww_color.push(0); - } - rgbww_color[name === "cw" ? 3 : 4] = wv; - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - rgbww_color, - }); - } - - private _colorBrightnessSliderChanged(ev: CustomEvent) { - const target = ev.target as any; - let value = Number(target.value); - - if (isNaN(value)) { - return; - } - - const oldValue = this._colorBrightnessSliderValue; - this._colorBrightnessSliderValue = value; - - value = (value * 255) / 100; - - const rgb = (getLightCurrentModeRgbColor(this.stateObj!)?.slice(0, 3) || [ - 255, 255, 255, - ]) as [number, number, number]; - - this._setRgbWColor( - this._adjustColorBrightness( - // first normalize the value - oldValue - ? this._adjustColorBrightness(rgb, (oldValue * 255) / 100, true) - : rgb, - value - ) + private _showLightColorPickerView = () => { + showLightColorPickerView( + this, + this.hass.localize( + "ui.dialogs.more_info_control.light.color_picker.title" + ), + { + entityId: this.stateObj!.entity_id, + } ); - } + }; - private _segmentClick() { - if (this._hueSegments === 24 && this._saturationSegments === 8) { - this._hueSegments = 0; - this._saturationSegments = 0; - } else { - this._hueSegments = 24; - this._saturationSegments = 8; + private _handleEffectButton(ev) { + ev.stopPropagation(); + ev.preventDefault(); + + const index = ev.detail.index; + const effect = this.stateObj!.attributes.effect_list![index]; + + if (!effect || this.stateObj!.attributes.effect === effect) { + return; } - } - private _adjustColorBrightness( - rgbColor: [number, number, number], - value?: number, - invert = false - ) { - if (value !== undefined && value !== 255) { - let ratio = value / 255; - if (invert) { - ratio = 1 / ratio; - } - rgbColor[0] = Math.min(255, Math.round(rgbColor[0] * ratio)); - rgbColor[1] = Math.min(255, Math.round(rgbColor[1] * ratio)); - rgbColor[2] = Math.min(255, Math.round(rgbColor[2] * ratio)); - } - return rgbColor; - } - - private _setRgbWColor(rgbColor: [number, number, number]) { - if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGBWW)) { - const rgbww_color: [number, number, number, number, number] = this - .stateObj!.attributes.rgbww_color - ? [...this.stateObj!.attributes.rgbww_color] - : [0, 0, 0, 0, 0]; - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - rgbww_color: rgbColor.concat(rgbww_color.slice(3)), - }); - } else if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGBW)) { - const rgbw_color: [number, number, number, number] = this.stateObj! - .attributes.rgbw_color - ? [...this.stateObj!.attributes.rgbw_color] - : [0, 0, 0, 0]; - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - rgbw_color: rgbColor.concat(rgbw_color.slice(3)), - }); - } - } - - /** - * Called when a new color has been picked. - * should be throttled with the 'throttle=' attribute of the color picker - */ - private _colorPicked( - ev: CustomEvent<{ - hs: { h: number; s: number }; - rgb: { r: number; g: number; b: number }; - }> - ) { - this._colorPickerColor = [ - ev.detail.rgb.r, - ev.detail.rgb.g, - ev.detail.rgb.b, - ]; - - if ( - lightSupportsColorMode(this.stateObj!, LightColorMode.RGBWW) || - lightSupportsColorMode(this.stateObj!, LightColorMode.RGBW) - ) { - this._setRgbWColor( - this._colorBrightnessSliderValue - ? this._adjustColorBrightness( - [ev.detail.rgb.r, ev.detail.rgb.g, ev.detail.rgb.b], - (this._colorBrightnessSliderValue * 255) / 100 - ) - : [ev.detail.rgb.r, ev.detail.rgb.g, ev.detail.rgb.b] - ); - } else if (lightSupportsColorMode(this.stateObj!, LightColorMode.RGB)) { - const rgb_color: [number, number, number] = [ - ev.detail.rgb.r, - ev.detail.rgb.g, - ev.detail.rgb.b, - ]; - if (this._brightnessAdjusted) { - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - brightness_pct: this._brightnessSliderValue, - rgb_color: this._adjustColorBrightness( - rgb_color, - this._brightnessAdjusted, - true - ), - }); - } else { - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - rgb_color, - }); - } - } else { - this.hass.callService("light", "turn_on", { - entity_id: this.stateObj!.entity_id, - hs_color: [ev.detail.hs.h, ev.detail.hs.s * 100], - }); - } + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + effect, + }); } static get styles(): CSSResultGroup { @@ -573,52 +241,31 @@ class MoreInfoLight extends LitElement { align-items: center; } - .content > * { + .buttons { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 12px; + } + .buttons > * { + margin: 4px; + } + + ha-more-info-light-brightness, + ha-more-info-light-toggle { + margin-bottom: 24px; + } + + ha-attributes { width: 100%; } - .color_temp { - --ha-slider-background: -webkit-linear-gradient( - var(--float-end), - rgb(166, 209, 255) 0%, - white 50%, - rgb(255, 160, 0) 100% - ); - /* The color temp minimum value shouldn't be rendered differently. It's not "off". */ - --paper-slider-knob-start-border-color: var(--primary-color); - margin-bottom: 4px; - } - - .segmentationContainer { - position: relative; - max-height: 500px; - display: flex; - justify-content: center; - } - - ha-button-toggle-group { - margin-bottom: 8px; - } - - ha-color-picker { - --ha-color-picker-wheel-borderwidth: 5; - --ha-color-picker-wheel-bordercolor: white; - --ha-color-picker-wheel-shadow: none; - --ha-color-picker-marker-borderwidth: 2; - --ha-color-picker-marker-bordercolor: white; - } - - .segmentationButton { - position: absolute; - top: 5%; - left: 0; - color: var(--secondary-text-color); - } - - hr { - border-color: var(--divider-color); - border-bottom: none; - margin: 16px 0; + md-outlined-icon-button-toggle, + md-outlined-icon-button { + --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); } `; } diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 83cb151925..94a3942a2c 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -11,6 +11,7 @@ import type { HassEntity } from "home-assistant-js-websocket"; import { css, html, LitElement, PropertyValues } from "lit"; import { customElement, property, state } from "lit/decorators"; import { cache } from "lit/directives/cache"; +import { dynamicElement } from "../../common/dom/dynamic-element-directive"; import { fireEvent } from "../../common/dom/fire_event"; import { stopPropagation } from "../../common/dom/stop_propagation"; import { computeDomain } from "../../common/entity/compute_domain"; @@ -31,6 +32,7 @@ import { HomeAssistant } from "../../types"; import { computeShowHistoryComponent, computeShowLogBookComponent, + DOMAINS_WITH_NEW_MORE_INFO, DOMAINS_WITH_MORE_INFO, EDITABLE_DOMAINS_WITH_ID, EDITABLE_DOMAINS_WITH_UNIQUE_ID, @@ -50,6 +52,19 @@ export interface MoreInfoDialogParams { type View = "info" | "history" | "settings" | "related"; +type ChildView = { + viewTag: string; + viewTitle?: string; + viewImport?: () => Promise; + viewParams?: any; +}; + +declare global { + interface HASSDomEvents { + "show-child-view": ChildView; + } +} + @customElement("ha-more-info-dialog") export class MoreInfoDialog extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -60,6 +75,8 @@ export class MoreInfoDialog extends LitElement { @state() private _currView: View = "info"; + @state() private _childView?: ChildView; + public showDialog(params: MoreInfoDialogParams) { this._entityId = params.entityId; if (!this._entityId) { @@ -67,11 +84,13 @@ export class MoreInfoDialog extends LitElement { return; } this._currView = params.view || "info"; + this._childView = undefined; this.large = false; } public closeDialog() { this._entityId = undefined; + this._childView = undefined; fireEvent(this, "dialog-closed", { dialog: this.localName }); } @@ -110,8 +129,12 @@ export class MoreInfoDialog extends LitElement { return entity?.device_id ?? null; } - private back() { - this._currView = "info"; + private _goBack() { + if (this._childView) { + this._childView = undefined; + } else { + this._currView = "info"; + } } private _goToHistory() { @@ -122,6 +145,14 @@ export class MoreInfoDialog extends LitElement { this._currView = "settings"; } + private async _showChildView(ev: CustomEvent): Promise { + const view = ev.detail as ChildView; + if (view.viewImport) { + await view.viewImport(); + } + this._childView = view; + } + private _goToDevice(ev): void { if (!shouldHandleRequestSelectedEvent(ev)) return; const deviceId = this._getDeviceId(); @@ -167,17 +198,21 @@ export class MoreInfoDialog extends LitElement { const deviceId = this._getDeviceId(); + const title = this._childView?.viewTitle ?? name; + + const isInfoView = this._currView === "info" && !this._childView; + return html`
    - ${this._currView === "info" + ${isInfoView ? html` `} -
    - ${name} -
    - ${this._currView === "info" + ${!isInfoView || !DOMAINS_WITH_NEW_MORE_INFO.includes(domain) + ? html`
    + ${title} +
    ` + : null} + ${isInfoView ? html` ${this.shouldShowHistory(domain) ? html` @@ -291,39 +328,50 @@ export class MoreInfoDialog extends LitElement { : null}
    - -
    - ${cache( - this._currView === "info" - ? html` - - ` - : this._currView === "history" - ? html` - - ` - : this._currView === "settings" - ? html` - - ` - : html` - - ` - )} +
    + ${this._childView + ? dynamicElement(this._childView.viewTag, { + hass: this.hass, + params: this._childView.viewParams, + }) + : cache( + this._currView === "info" + ? html` + + ` + : this._currView === "history" + ? html` + + ` + : this._currView === "settings" + ? html` + + ` + : this._currView === "related" + ? html` + + ` + : null + )}
    `; @@ -338,6 +386,10 @@ export class MoreInfoDialog extends LitElement { super.updated(changedProps); if (changedProps.has("_currView")) { this.setAttribute("view", this._currView); + this._childView = undefined; + } + if (changedProps.has("_childView")) { + this.toggleAttribute("has-child-view", !!this._childView); } } @@ -374,10 +426,6 @@ export class MoreInfoDialog extends LitElement { var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); } - ha-dialog .content { - padding: var(--content-padding); - } - :host([view="settings"]) ha-dialog { --content-padding: 0; } @@ -388,6 +436,14 @@ export class MoreInfoDialog extends LitElement { --video-max-height: calc(100vh - 65px - 72px); } + :host([has-child-view]) ha-dialog { + --content-padding: 0; + } + + .content { + padding: var(--content-padding); + } + .main-title { overflow: hidden; text-overflow: ellipsis; diff --git a/src/dialogs/more-info/ha-more-info-info.ts b/src/dialogs/more-info/ha-more-info-info.ts index 85cb076a4e..3461c7e314 100644 --- a/src/dialogs/more-info/ha-more-info-info.ts +++ b/src/dialogs/more-info/ha-more-info-info.ts @@ -12,6 +12,7 @@ import { computeShowLogBookComponent, DOMAINS_NO_INFO, DOMAINS_WITH_MORE_INFO, + DOMAINS_WITH_NEW_MORE_INFO, } from "./const"; import "./ha-more-info-history"; import "./ha-more-info-logbook"; @@ -47,7 +48,8 @@ export class MoreInfoInfo extends LitElement { )} ` : ""} - ${DOMAINS_NO_INFO.includes(domain) + ${DOMAINS_NO_INFO.includes(domain) || + DOMAINS_WITH_NEW_MORE_INFO.includes(domain) ? "" : html` import("./controls/more-info-alarm_control_panel"), @@ -33,7 +33,6 @@ const LAZY_LOADED_MORE_INFO_CONTROL = { export const stateMoreInfoType = (stateObj: HassEntity): string => { const domain = computeStateDomain(stateObj); - return domainMoreInfoType(domain); }; diff --git a/src/translations/en.json b/src/translations/en.json index deb63a5d80..86166dd30e 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -841,6 +841,9 @@ "last_changed": "Last changed", "last_updated": "Last updated", "show_more": "Show more", + "turn_on": "Turn on", + "turn_off": "Turn off", + "toggle": "Toggle", "script": { "last_action": "Last action", "last_triggered": "Last triggered" @@ -892,6 +895,19 @@ }, "zone": { "graph_unit": "People home" + }, + "light": { + "toggle": "Toggle", + "change_color": "Change color", + "select_effect": "Select effect", + "brightness": "Brightness", + "color_picker": { + "title": "Change color", + "mode": { + "color": "Color", + "color_temp": "Temperature" + } + } } }, "entity_registry": { diff --git a/yarn.lock b/yarn.lock index 834e424c65..a29047c3cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3095,6 +3095,16 @@ __metadata: languageName: node linkType: hard +"@material/web@npm:=1.0.0-pre.2": + version: 1.0.0-pre.2 + resolution: "@material/web@npm:1.0.0-pre.2" + dependencies: + lit: ^2.3.0 + tslib: ^2.4.0 + checksum: 7c6733fae5fb67c43d7c49fab70f7893defd95e4fcbe996d06057882e47c0121760546cc5d1c407a9dbd11c5f02f3f278016c52922e6a9e97db0c0b52d7133f2 + languageName: node + linkType: hard + "@mdi/js@npm:7.1.96": version: 7.1.96 resolution: "@mdi/js@npm:7.1.96" @@ -9540,6 +9550,7 @@ fsevents@^1.2.7: "@material/mwc-textfield": ^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.2 "@mdi/js": 7.1.96 "@mdi/svg": 7.1.96 "@octokit/auth-oauth-device": ^4.0.4 @@ -11336,7 +11347,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lit@npm:^2.0.0, lit@npm:^2.0.0-rc.2, lit@npm:^2.2.1, lit@npm:^2.5.0, lit@npm:^2.6.1": +"lit@npm:^2.0.0, lit@npm:^2.0.0-rc.2, lit@npm:^2.2.1, lit@npm:^2.3.0, lit@npm:^2.5.0, lit@npm:^2.6.1": version: 2.6.1 resolution: "lit@npm:2.6.1" dependencies: From fef74b0b8ac0ce5cf3db42a7c4261e8900c770d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:26:06 +0100 Subject: [PATCH 127/138] Bump @web/dev-server from 0.0.24 to 0.1.35 (#15280) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bram Kragten --- package.json | 2 +- yarn.lock | 206 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 126 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index bef9fe4631..998f5eda7b 100644 --- a/package.json +++ b/package.json @@ -183,7 +183,7 @@ "@types/webspeechapi": "^0.0.29", "@typescript-eslint/eslint-plugin": "^5.53.0", "@typescript-eslint/parser": "^5.53.0", - "@web/dev-server": "^0.0.24", + "@web/dev-server": "^0.1.35", "@web/dev-server-rollup": "^0.2.11", "babel-loader": "^9.1.2", "chai": "^4.3.7", diff --git a/yarn.lock b/yarn.lock index a29047c3cc..a9c6e3a82d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28,7 +28,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.5.5": +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.11, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.5.5": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" dependencies: @@ -3847,6 +3847,22 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-node-resolve@npm:^13.0.4": + version: 13.3.0 + resolution: "@rollup/plugin-node-resolve@npm:13.3.0" + dependencies: + "@rollup/pluginutils": ^3.1.0 + "@types/resolve": 1.17.1 + deepmerge: ^4.2.2 + is-builtin-module: ^3.1.0 + is-module: ^1.0.0 + resolve: ^1.19.0 + peerDependencies: + rollup: ^2.42.0 + checksum: ec5418e6b3c23a9e30683056b3010e9d325316dcfae93fbc673ae64dad8e56a2ce761c15c48f5e2dcfe0c822fdc4a4905ee6346e3dcf90603ba2260afef5a5e6 + languageName: node + linkType: hard + "@rollup/plugin-node-resolve@npm:^7.1.3": version: 7.1.3 resolution: "@rollup/plugin-node-resolve@npm:7.1.3" @@ -3862,23 +3878,6 @@ __metadata: languageName: node linkType: hard -"@rollup/plugin-node-resolve@npm:^8.4.0": - version: 8.4.0 - resolution: "@rollup/plugin-node-resolve@npm:8.4.0" - dependencies: - "@rollup/pluginutils": ^3.1.0 - "@types/resolve": 1.17.1 - builtin-modules: ^3.1.0 - deep-freeze: ^0.0.1 - deepmerge: ^4.2.2 - is-module: ^1.0.0 - resolve: ^1.17.0 - peerDependencies: - rollup: ^1.20.0||^2.0.0 - checksum: 9bd26070d525473e971fb78a4ee583da95263d855c9bf710f6c2a322f184b6806fb86c602750b9592f12f06c6459edb4f7afdba65dd73c0767f95ea7f74db077 - languageName: node - linkType: hard - "@rollup/plugin-replace@npm:^2.3.2, @rollup/plugin-replace@npm:^2.4.1": version: 2.4.2 resolution: "@rollup/plugin-replace@npm:2.4.2" @@ -4900,12 +4899,12 @@ __metadata: languageName: node linkType: hard -"@web/config-loader@npm:^0.1.1": - version: 0.1.2 - resolution: "@web/config-loader@npm:0.1.2" +"@web/config-loader@npm:^0.1.3": + version: 0.1.3 + resolution: "@web/config-loader@npm:0.1.3" dependencies: - semver: ^7.3.2 - checksum: 303023846d6f51d52c7420dbfdfcf87a84968683790273823924ae79e58d5b44c8a0013f4e9f85d0cab8f037e7bfbecc3a2abac30c6750d2b7bcb358f1aea217 + semver: ^7.3.4 + checksum: 278554bd00b757eaf296ba904a224c61d4698df1a5d6c04931c40bc6bb308e81e767055cbf283b763cc530aae6b200bb950aa19eb41aa8979a3a2b29e5f0ac7a languageName: node linkType: hard @@ -4934,7 +4933,7 @@ __metadata: languageName: node linkType: hard -"@web/dev-server-core@npm:^0.3.10": +"@web/dev-server-core@npm:^0.3.10, @web/dev-server-core@npm:^0.3.19": version: 0.3.19 resolution: "@web/dev-server-core@npm:0.3.19" dependencies: @@ -4982,29 +4981,42 @@ __metadata: languageName: node linkType: hard -"@web/dev-server@npm:^0.0.24": - version: 0.0.24 - resolution: "@web/dev-server@npm:0.0.24" +"@web/dev-server-rollup@npm:^0.3.19": + version: 0.3.21 + resolution: "@web/dev-server-rollup@npm:0.3.21" dependencies: - "@babel/code-frame": ^7.10.4 - "@rollup/plugin-node-resolve": ^8.4.0 + "@rollup/plugin-node-resolve": ^13.0.4 + "@web/dev-server-core": ^0.3.19 + nanocolors: ^0.2.1 + parse5: ^6.0.1 + rollup: ^2.67.0 + whatwg-url: ^11.0.0 + checksum: 70fb5c638872f547bae1f78c304837c77deaf6c2dbdf6d0a7e3b141a61d2227ecb29fc7de902d4ef79b10c4c3856aa6598523b80110f2060a75467fe3d3b7be7 + languageName: node + linkType: hard + +"@web/dev-server@npm:^0.1.35": + version: 0.1.35 + resolution: "@web/dev-server@npm:0.1.35" + dependencies: + "@babel/code-frame": ^7.12.11 "@types/command-line-args": ^5.0.0 - "@web/config-loader": ^0.1.1 - "@web/dev-server-core": ^0.2.18 - "@web/dev-server-rollup": ^0.2.11 + "@web/config-loader": ^0.1.3 + "@web/dev-server-core": ^0.3.19 + "@web/dev-server-rollup": ^0.3.19 camelcase: ^6.2.0 - chalk: ^4.1.0 command-line-args: ^5.1.1 command-line-usage: ^6.1.1 debounce: ^1.2.0 deepmerge: ^4.2.2 ip: ^1.1.5 - open: ^7.3.0 - portfinder: ^1.0.28 + nanocolors: ^0.2.1 + open: ^8.0.2 + portfinder: ^1.0.32 bin: wds: dist/bin.js web-dev-server: dist/bin.js - checksum: 6731c5e2761dab2a09987da027daafd75fabcb0a74ea5a4eb3c9fa0dea92c36789814755340edadfae94379b74739a25c7d15031fa523731e6210c5f8776bc96 + checksum: eccaf90e2bcb25c8a1584a714e3139b63a67b969dc9df40910848e6f56de7eea22de67b80a2400580cab625cab7a00b2711aea742c112207d3e80a2791f6fc9c languageName: node linkType: hard @@ -5886,7 +5898,7 @@ __metadata: languageName: node linkType: hard -"async@npm:^2.6.2": +"async@npm:^2.6.4": version: 2.6.4 resolution: "async@npm:2.6.4" dependencies: @@ -6238,10 +6250,10 @@ __metadata: languageName: node linkType: hard -"builtin-modules@npm:^3.1.0": - version: 3.2.0 - resolution: "builtin-modules@npm:3.2.0" - checksum: 0265aa1ba78e1a16f4e18668d815cb43fb364e6a6b8aa9189c6f44c7b894a551a43b323c40206959d2d4b2568c1f2805607ad6c88adc306a776ce6904cca6715 +"builtin-modules@npm:^3.1.0, builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d languageName: node linkType: hard @@ -7124,7 +7136,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0, debug@npm:^3.1.1, debug@npm:^3.2.7": +"debug@npm:^3.1.0, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -8863,7 +8875,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.1#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" dependencies: @@ -8872,7 +8884,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"fsevents@~2.3.1, fsevents@~2.3.2": +fsevents@~2.3.2: version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -9597,7 +9609,7 @@ fsevents@^1.2.7: "@vibrant/core": ^3.2.1-alpha.1 "@vibrant/quantizer-mmcq": ^3.2.1-alpha.1 "@vue/web-component-wrapper": ^1.3.0 - "@web/dev-server": ^0.0.24 + "@web/dev-server": ^0.1.35 "@web/dev-server-rollup": ^0.2.11 "@webcomponents/scoped-custom-element-registry": ^0.0.8 "@webcomponents/webcomponentsjs": ^2.7.0 @@ -10266,6 +10278,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-builtin-module@npm:^3.1.0": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: ^3.3.0 + checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -10730,7 +10751,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-wsl@npm:^2.1.1, is-wsl@npm:^2.2.0": +"is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" dependencies: @@ -11859,7 +11880,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.6": version: 1.2.7 resolution: "minimist@npm:1.2.7" checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec @@ -11972,14 +11993,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5": - version: 0.5.5 - resolution: "mkdirp@npm:0.5.5" +"mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.6": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" dependencies: - minimist: ^1.2.5 + minimist: ^1.2.6 bin: mkdirp: bin/cmd.js - checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 languageName: node linkType: hard @@ -12084,6 +12105,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"nanocolors@npm:^0.2.1": + version: 0.2.13 + resolution: "nanocolors@npm:0.2.13" + checksum: 01ac5aab77295c66cef83ea5f595e22f5f91518f19fae12f93ca2cba98703f971e32611fea2983f333eb7e60604043005690f61d9759e7c0a32314942fe6ddb8 + languageName: node + linkType: hard + "nanoid@npm:3.3.3": version: 3.3.3 resolution: "nanoid@npm:3.3.3" @@ -12617,24 +12645,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"open@npm:^7.3.0": - version: 7.3.0 - resolution: "open@npm:7.3.0" - dependencies: - is-docker: ^2.0.0 - is-wsl: ^2.1.1 - checksum: e9ea5cb5a2cb2c9446a8c6c38a1dc20b7ecd8703d2299b95fceead9ddd41d579f494d6f3295c39499e769c0a5003a9b1312b6e8986111ed45bb7b9db60a0102e - languageName: node - linkType: hard - -"open@npm:^8.0.9, open@npm:^8.4.0, open@npm:^8.4.1": - version: 8.4.1 - resolution: "open@npm:8.4.1" +"open@npm:^8.0.2, open@npm:^8.0.9, open@npm:^8.4.0, open@npm:^8.4.1": + version: 8.4.2 + resolution: "open@npm:8.4.2" dependencies: define-lazy-prop: ^2.0.0 is-docker: ^2.1.1 is-wsl: ^2.2.0 - checksum: dbe8e1d98889df60b5179eab8b94b9591744d1f0033bce1a9a10738ba140bd9d625d6bcde7ff9f043e379aafb918975c2daa03b87cef13eb046ac18ed807f06d + checksum: 6388bfff21b40cb9bd8f913f9130d107f2ed4724ea81a8fd29798ee322b361ca31fa2cdfb491a5c31e43a3996cfe9566741238c7a741ada8d7af1cb78d85cf26 languageName: node linkType: hard @@ -13163,14 +13181,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"portfinder@npm:^1.0.28": - version: 1.0.28 - resolution: "portfinder@npm:1.0.28" +"portfinder@npm:^1.0.32": + version: 1.0.32 + resolution: "portfinder@npm:1.0.32" dependencies: - async: ^2.6.2 - debug: ^3.1.1 - mkdirp: ^0.5.5 - checksum: 91fef602f13f8f4c64385d0ad2a36cc9dc6be0b8d10a2628ee2c3c7b9917ab4fefb458815b82cea2abf4b785cd11c9b4e2d917ac6fa06f14b6fa880ca8f8928c + async: ^2.6.4 + debug: ^3.2.7 + mkdirp: ^0.5.6 + checksum: 116b4aed1b9e16f6d5503823d966d9ffd41b1c2339e27f54c06cd2f3015a9d8ef53e2a53b57bc0a25af0885977b692007353aa28f9a0a98a44335cb50487240d languageName: node linkType: hard @@ -13822,7 +13840,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0, resolve@npm:^1.22.1": +"resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0, resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -13835,7 +13853,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.11.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.4.0#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.11.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.4.0#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" dependencies: @@ -13988,17 +14006,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"rollup@npm:^2.33.2, rollup@npm:^2.43.1, rollup@npm:^2.8.2": - version: 2.45.2 - resolution: "rollup@npm:2.45.2" +"rollup@npm:^2.33.2, rollup@npm:^2.43.1, rollup@npm:^2.67.0, rollup@npm:^2.8.2": + version: 2.79.1 + resolution: "rollup@npm:2.79.1" dependencies: - fsevents: ~2.3.1 + fsevents: ~2.3.2 dependenciesMeta: fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: c049bedc191199842fab13248fdd74dbb33262b5a42ce35abe268037aa8be0f9a32739f2e28c74e7aaacae514fbb637ef79a20ef784f7a33b33587da479065bb + checksum: 6a2bf167b3587d4df709b37d149ad0300692cc5deb510f89ac7bdc77c8738c9546ae3de9322b0968e1ed2b0e984571f5f55aae28fa7de4cfcb1bc5402a4e2be6 languageName: node linkType: hard @@ -14148,7 +14166,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7": +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -15373,6 +15391,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -16186,6 +16213,13 @@ typescript@^3.8.3: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + "webpack-cli@npm:^5.0.1": version: 5.0.1 resolution: "webpack-cli@npm:5.0.1" @@ -16392,6 +16426,16 @@ typescript@^3.8.3: languageName: node linkType: hard +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" From dfb74fd57690bd3a41fe269e1d454fb992a24275 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 22 Feb 2023 11:27:57 +0100 Subject: [PATCH 128/138] Center icon in md-icon-button (#15541) --- src/dialogs/more-info/controls/more-info-light.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 90befc078e..77e0a696ab 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -262,6 +262,7 @@ class MoreInfoLight extends LitElement { md-outlined-icon-button-toggle, 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); From 2bd6d9d202329fa446a38630732963b69d17b1c0 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 22 Feb 2023 12:20:45 +0100 Subject: [PATCH 129/138] Add group support to new more info light (#15543) --- src/data/group.ts | 11 +++++++ .../components/ha-more-info-toggle.ts | 31 ++++++++++++++----- src/dialogs/more-info/const.ts | 15 +++++++++ .../more-info/controls/more-info-group.ts | 18 +++++------ .../more-info/controls/more-info-light.ts | 3 +- src/dialogs/more-info/ha-more-info-dialog.ts | 4 +-- src/dialogs/more-info/ha-more-info-info.ts | 7 ++--- 7 files changed, 65 insertions(+), 24 deletions(-) diff --git a/src/data/group.ts b/src/data/group.ts index 3284358f31..cfae3ed858 100644 --- a/src/data/group.ts +++ b/src/data/group.ts @@ -2,6 +2,7 @@ import { HassEntityAttributeBase, HassEntityBase, } from "home-assistant-js-websocket"; +import { computeDomain } from "../common/entity/compute_domain"; interface GroupEntityAttributes extends HassEntityAttributeBase { entity_id: string[]; @@ -13,3 +14,13 @@ interface GroupEntityAttributes extends HassEntityAttributeBase { export interface GroupEntity extends HassEntityBase { attributes: GroupEntityAttributes; } + +export const computeGroupDomain = ( + stateObj: GroupEntity +): string | undefined => { + const entityIds = stateObj.attributes.entity_id || []; + const uniqueDomains = [ + ...new Set(entityIds.map((entityId) => computeDomain(entityId))), + ]; + return uniqueDomains.length === 1 ? uniqueDomains[0] : undefined; +}; diff --git a/src/dialogs/more-info/components/ha-more-info-toggle.ts b/src/dialogs/more-info/components/ha-more-info-toggle.ts index fabf68d407..a275ace41f 100644 --- a/src/dialogs/more-info/components/ha-more-info-toggle.ts +++ b/src/dialogs/more-info/components/ha-more-info-toggle.ts @@ -10,6 +10,7 @@ import { stateColorCss } from "../../../common/entity/state_color"; import "../../../components/ha-control-button"; import "../../../components/ha-control-switch"; import { UNAVAILABLE, UNKNOWN } from "../../../data/entity"; +import { forwardHaptic } from "../../../data/haptics"; import { HomeAssistant } from "../../../types"; @customElement("ha-more-info-toggle") @@ -33,16 +34,32 @@ export class HaMoreInfoToggle extends LitElement { } private _turnOn() { - const domain = computeDomain(this.stateObj!.entity_id); - this.hass.callService(domain, "turn_on", { - entity_id: this.stateObj!.entity_id, - }); + this._callService(true); } private _turnOff() { - const domain = computeDomain(this.stateObj!.entity_id); - this.hass.callService(domain, "turn_off", { - entity_id: this.stateObj!.entity_id, + this._callService(false); + } + + private async _callService(turnOn): Promise { + if (!this.hass || !this.stateObj) { + return; + } + forwardHaptic("light"); + const stateDomain = computeDomain(this.stateObj.entity_id); + let serviceDomain; + let service; + + if (stateDomain === "group") { + serviceDomain = "homeassistant"; + service = turnOn ? "turn_on" : "turn_off"; + } else { + serviceDomain = stateDomain; + service = turnOn ? "turn_on" : "turn_off"; + } + + await this.hass.callService(serviceDomain, service, { + entity_id: this.stateObj.entity_id, }); } diff --git a/src/dialogs/more-info/const.ts b/src/dialogs/more-info/const.ts index fde9c34c5f..3d36b61020 100644 --- a/src/dialogs/more-info/const.ts +++ b/src/dialogs/more-info/const.ts @@ -1,5 +1,7 @@ +import { HassEntity } from "home-assistant-js-websocket"; import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { computeDomain } from "../../common/entity/compute_domain"; +import { computeGroupDomain, GroupEntity } from "../../data/group"; import { CONTINUOUS_DOMAINS } from "../../data/logbook"; import { HomeAssistant } from "../../types"; @@ -89,3 +91,16 @@ export const computeShowLogBookComponent = ( return true; }; + +export const computeShowNewMoreInfo = (stateObj: HassEntity) => { + const domain = computeDomain(stateObj.entity_id); + if (domain === "group") { + const groupDomain = computeGroupDomain(stateObj as GroupEntity); + return ( + groupDomain && + groupDomain !== "group" && + DOMAINS_WITH_NEW_MORE_INFO.includes(groupDomain) + ); + } + return DOMAINS_WITH_NEW_MORE_INFO.includes(domain); +}; diff --git a/src/dialogs/more-info/controls/more-info-group.ts b/src/dialogs/more-info/controls/more-info-group.ts index c8b2e7bdbb..bc5536541d 100644 --- a/src/dialogs/more-info/controls/more-info-group.ts +++ b/src/dialogs/more-info/controls/more-info-group.ts @@ -9,8 +9,7 @@ import { } from "lit"; import { property, state } from "lit/decorators"; import { dynamicElement } from "../../../common/dom/dynamic-element-directive"; -import { computeStateDomain } from "../../../common/entity/compute_state_domain"; -import { GroupEntity } from "../../../data/group"; +import { computeGroupDomain, GroupEntity } from "../../../data/group"; import "../../../state-summary/state-card-content"; import { HomeAssistant } from "../../../types"; import { @@ -47,20 +46,19 @@ class MoreInfoGroup extends LitElement { } const baseStateObj = states.find((s) => s.state === "on") || states[0]; - const groupDomain = computeStateDomain(baseStateObj); + + const groupDomain = computeGroupDomain(this.stateObj); // Groups need to be filtered out or we'll show content of // first child above the children of the current group - if ( - groupDomain !== "group" && - states.every( - (entityState) => groupDomain === computeStateDomain(entityState) - ) - ) { + if (groupDomain && groupDomain !== "group") { this._groupDomainStateObj = { ...baseStateObj, entity_id: this.stateObj.entity_id, - attributes: { ...baseStateObj.attributes }, + attributes: { + ...baseStateObj.attributes, + friendly_name: this.stateObj.attributes.friendly_name, + }, }; const type = domainMoreInfoType(groupDomain); importMoreInfoControl(type); diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 77e0a696ab..4500fc3f42 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -199,7 +199,8 @@ class MoreInfoLight extends LitElement { } private _toggle = () => { - this.hass.callService("light", "toggle", { + const service = this.stateObj?.state === "on" ? "turn_off" : "turn_on"; + this.hass.callService("light", service, { entity_id: this.stateObj!.entity_id, }); }; diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 94a3942a2c..30beffa90b 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -32,7 +32,7 @@ import { HomeAssistant } from "../../types"; import { computeShowHistoryComponent, computeShowLogBookComponent, - DOMAINS_WITH_NEW_MORE_INFO, + computeShowNewMoreInfo, DOMAINS_WITH_MORE_INFO, EDITABLE_DOMAINS_WITH_ID, EDITABLE_DOMAINS_WITH_UNIQUE_ID, @@ -232,7 +232,7 @@ export class MoreInfoDialog extends LitElement { )} > `} - ${!isInfoView || !DOMAINS_WITH_NEW_MORE_INFO.includes(domain) + ${!isInfoView || !computeShowNewMoreInfo(stateObj) ? html`
    ` : ""} - ${DOMAINS_NO_INFO.includes(domain) || - DOMAINS_WITH_NEW_MORE_INFO.includes(domain) + ${DOMAINS_NO_INFO.includes(domain) || computeShowNewMoreInfo(stateObj) ? "" : html` Date: Wed, 22 Feb 2023 16:59:01 +0100 Subject: [PATCH 130/138] Fix more info control assumed state color (#15548) --- .../components/ha-more-info-toggle.ts | 8 +- .../more-info/controls/more-info-light.ts | 175 +++++++++--------- 2 files changed, 89 insertions(+), 94 deletions(-) diff --git a/src/dialogs/more-info/components/ha-more-info-toggle.ts b/src/dialogs/more-info/components/ha-more-info-toggle.ts index a275ace41f..540cb1d028 100644 --- a/src/dialogs/more-info/components/ha-more-info-toggle.ts +++ b/src/dialogs/more-info/components/ha-more-info-toggle.ts @@ -145,12 +145,12 @@ export class HaMoreInfoToggle extends LitElement { ha-control-button { flex: 1; width: 100%; - --button-bar-border-radius: 18px; + --control-button-border-radius: 18px; } ha-control-button.active { - --button-bar-icon-color: white; - --button-bar-background-color: var(--color); - --button-bar-background-opacity: 1; + --control-button-icon-color: white; + --control-button-background-color: var(--color); + --control-button-background-opacity: 1; } ha-control-button:not(:last-child) { margin-bottom: 6px; diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 4500fc3f42..55c6da44ec 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -91,104 +91,99 @@ class MoreInfoLight extends LitElement { .stateObj=${this.stateObj} .stateOverride=${stateOverride} > - - ${ - supportsBrightness - ? html` - - - ` - : html` - - ` - } - ${ - supportsColorTemp || - supportsColor || - supportsEffects || - supportsBrightness - ? html` -
    - ${supportsBrightness - ? html` + ${supportsBrightness + ? html` + + + ` + : html` + + `} + ${supportsColorTemp || + supportsColor || + supportsEffects || + supportsBrightness + ? html` +
    + ${supportsBrightness + ? html` + + + + ` + : null} + ${supportsColorTemp || supportsColor + ? html` + + + + ` + : null} + ${supportsEffects + ? html` + - + - ` - : null} - ${supportsColorTemp || supportsColor - ? html` - - - - ` - : null} - ${supportsEffects - ? html` - - - - - ${this.stateObj.attributes.effect_list!.map( - (effect: string) => html` - - ${effect} - - ` - )} - - ` - : null} -
    - ` - : null - } + ${this.stateObj.attributes.effect_list!.map( + (effect: string) => html` + + ${effect} + + ` + )} + + ` + : null} +
    + ` + : null} Date: Wed, 22 Feb 2023 17:00:02 +0100 Subject: [PATCH 131/138] Add restart action to config dashboard overflow menu (#15544) --- .../config/core/ha-config-section-updates.ts | 4 +-- .../config/dashboard/ha-config-dashboard.ts | 27 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/panels/config/core/ha-config-section-updates.ts b/src/panels/config/core/ha-config-section-updates.ts index cbf8804759..eccb13bcec 100644 --- a/src/panels/config/core/ha-config-section-updates.ts +++ b/src/panels/config/core/ha-config-section-updates.ts @@ -1,5 +1,5 @@ import { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item"; -import { mdiDotsVertical, mdiRefresh } from "@mdi/js"; +import { mdiDotsVertical, mdiUpdate } from "@mdi/js"; import { HassEntities } from "home-assistant-js-websocket"; import { css, html, LitElement, TemplateResult } from "lit"; import { customElement, property, state } from "lit/decorators"; @@ -66,7 +66,7 @@ class HaConfigSectionUpdates extends LitElement { .label=${this.hass.localize( "ui.panel.config.updates.check_updates" )} - .path=${mdiRefresh} + .path=${mdiUpdate} @click=${this._checkUpdates} > diff --git a/src/panels/config/dashboard/ha-config-dashboard.ts b/src/panels/config/dashboard/ha-config-dashboard.ts index 76fc85056c..fadd8f6650 100644 --- a/src/panels/config/dashboard/ha-config-dashboard.ts +++ b/src/panels/config/dashboard/ha-config-dashboard.ts @@ -1,6 +1,11 @@ import type { ActionDetail } from "@material/mwc-list"; -import "@material/mwc-list/mwc-list-item"; -import { mdiCloudLock, mdiDotsVertical, mdiMagnify } from "@mdi/js"; +import { + mdiCloudLock, + mdiDotsVertical, + mdiMagnify, + mdiPower, + mdiUpdate, +} from "@mdi/js"; import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; import { HassEntities, UnsubscribeFunc } from "home-assistant-js-websocket"; @@ -19,6 +24,7 @@ import "../../../components/ha-button-menu"; import "../../../components/ha-card"; import "../../../components/ha-icon-button"; import "../../../components/ha-icon-next"; +import "../../../components/ha-list-item"; import "../../../components/ha-menu-button"; import "../../../components/ha-svg-icon"; import "../../../components/ha-tip"; @@ -34,6 +40,7 @@ import { UpdateEntity, } from "../../../data/update"; import { showQuickBar } from "../../../dialogs/quick-bar/show-dialog-quick-bar"; +import { showRestartDialog } from "../../../dialogs/restart/show-dialog-restart"; import "../../../layouts/ha-app-layout"; import { PageNavigation } from "../../../layouts/hass-tabs-subpage"; import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; @@ -190,7 +197,6 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) { - + ${this.hass.localize("ui.panel.config.updates.check_updates")} - + + + + + ${this.hass.localize( + "ui.panel.config.system_dashboard.restart_homeassistant" + )} + + @@ -312,6 +326,9 @@ class HaConfigDashboard extends SubscribeMixin(LitElement) { case 0: checkForEntityUpdates(this, this.hass); break; + case 1: + showRestartDialog(this); + break; } } From 3158e6043d84f7371672ce0be23d9fda4b2a937e Mon Sep 17 00:00:00 2001 From: chiahsing Date: Thu, 23 Feb 2023 00:15:16 +0800 Subject: [PATCH 132/138] Fix a bug in cast launcher that hassURL and path are incorrectly passed (#15546) --- cast/src/launcher/layout/hc-cast.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cast/src/launcher/layout/hc-cast.ts b/cast/src/launcher/layout/hc-cast.ts index 28d26a9df1..4df33bc876 100644 --- a/cast/src/launcher/layout/hc-cast.ts +++ b/cast/src/launcher/layout/hc-cast.ts @@ -181,7 +181,7 @@ class HcCast extends LitElement { private async _handlePickView(ev: Event) { const path = (ev.currentTarget as any).getAttribute("data-path"); await ensureConnectedCastSession(this.castManager!, this.auth!); - castSendShowLovelaceView(this.castManager, path, this.auth.data.hassUrl); + castSendShowLovelaceView(this.castManager, this.auth.data.hassUrl, path); } private async _handleLogout() { From e697a09e5341dda53a2efe2e6c876c45b656a460 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 22 Feb 2023 17:17:39 +0100 Subject: [PATCH 133/138] Only show heading divider on more info dialog scroll (#15545) --- src/components/ha-dialog.ts | 15 +++++++++++++++ src/dialogs/more-info/ha-more-info-dialog.ts | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 080dc647d9..76007a3cc1 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -40,6 +40,21 @@ export class HaDialog extends DialogBase { this.suppressDefaultPressSelector, SUPPRESS_DEFAULT_PRESS_SELECTOR, ].join(", "); + this._updateScrolledAttribute(); + this.contentElement?.addEventListener("scroll", this._onScroll); + } + + disconnectedCallback(): void { + this.contentElement.removeEventListener("scroll", this._onScroll); + } + + private _onScroll = () => { + this._updateScrolledAttribute(); + }; + + private _updateScrolledAttribute() { + if (!this.contentElement) return; + this.toggleAttribute("scrolled", this.contentElement.scrollTop !== 0); } static override styles = [ diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 30beffa90b..a3cae303a4 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -421,7 +421,7 @@ export class MoreInfoDialog extends LitElement { outline: none; } - .heading { + ha-dialog[scrolled] .heading { border-bottom: 1px solid var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); } From e46803cb4e59b182868cea02dfa78674d54a0ac0 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 22 Feb 2023 17:24:26 +0100 Subject: [PATCH 134/138] Add more info for switch and siren (#15547) * Add more info for switch and siren * Fix attributes --- .../components/ha-more-info-toggle.ts | 1 + src/dialogs/more-info/const.ts | 4 +- .../more-info/controls/more-info-light.ts | 2 +- .../more-info/controls/more-info-siren.ts | 64 +++++++++++++++++++ .../more-info/controls/more-info-switch.ts | 64 +++++++++++++++++++ .../more-info/state_more_info_control.ts | 2 + 6 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/dialogs/more-info/controls/more-info-siren.ts create mode 100644 src/dialogs/more-info/controls/more-info-switch.ts diff --git a/src/dialogs/more-info/components/ha-more-info-toggle.ts b/src/dialogs/more-info/components/ha-more-info-toggle.ts index 540cb1d028..5f10a849e2 100644 --- a/src/dialogs/more-info/components/ha-more-info-toggle.ts +++ b/src/dialogs/more-info/components/ha-more-info-toggle.ts @@ -146,6 +146,7 @@ export class HaMoreInfoToggle extends LitElement { flex: 1; width: 100%; --control-button-border-radius: 18px; + --mdc-icon-size: 24px; } ha-control-button.active { --control-button-icon-color: white; diff --git a/src/dialogs/more-info/const.ts b/src/dialogs/more-info/const.ts index 3d36b61020..7a33ea20fa 100644 --- a/src/dialogs/more-info/const.ts +++ b/src/dialogs/more-info/const.ts @@ -16,7 +16,7 @@ export const EDITABLE_DOMAINS_WITH_ID = ["scene", "automation"]; * */ export const EDITABLE_DOMAINS_WITH_UNIQUE_ID = ["script"]; /** Domains with with new more info design. */ -export const DOMAINS_WITH_NEW_MORE_INFO = ["light"]; +export const DOMAINS_WITH_NEW_MORE_INFO = ["light", "siren", "switch"]; /** Domains with separate more info dialog. */ export const DOMAINS_WITH_MORE_INFO = [ "alarm_control_panel", @@ -37,7 +37,9 @@ export const DOMAINS_WITH_MORE_INFO = [ "remote", "script", "scene", + "siren", "sun", + "switch", "timer", "update", "vacuum", diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 55c6da44ec..0204eb7687 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -248,7 +248,7 @@ class MoreInfoLight extends LitElement { } ha-more-info-light-brightness, - ha-more-info-light-toggle { + ha-more-info-toggle { margin-bottom: 24px; } diff --git a/src/dialogs/more-info/controls/more-info-siren.ts b/src/dialogs/more-info/controls/more-info-siren.ts new file mode 100644 index 0000000000..b57d58bf45 --- /dev/null +++ b/src/dialogs/more-info/controls/more-info-siren.ts @@ -0,0 +1,64 @@ +import { mdiVolumeHigh, mdiVolumeOff } from "@mdi/js"; +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property } from "lit/decorators"; +import "../../../components/ha-attributes"; +import { LightEntity } from "../../../data/light"; +import type { HomeAssistant } from "../../../types"; +import "../components/ha-more-info-state-header"; +import "../components/ha-more-info-toggle"; + +@customElement("more-info-siren") +class MoreInfoSiren extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj?: LightEntity; + + protected render(): TemplateResult | null { + if (!this.hass || !this.stateObj) { + return null; + } + + return html` +
    + + + +
    + `; + } + + static get styles(): CSSResultGroup { + return css` + .content { + display: flex; + flex-direction: column; + align-items: center; + } + + ha-more-info-toggle { + margin-bottom: 24px; + } + + ha-attributes { + width: 100%; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "more-info-siren": MoreInfoSiren; + } +} diff --git a/src/dialogs/more-info/controls/more-info-switch.ts b/src/dialogs/more-info/controls/more-info-switch.ts new file mode 100644 index 0000000000..0849fa9bff --- /dev/null +++ b/src/dialogs/more-info/controls/more-info-switch.ts @@ -0,0 +1,64 @@ +import { mdiPower, mdiPowerOff } from "@mdi/js"; +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property } from "lit/decorators"; +import "../../../components/ha-attributes"; +import { LightEntity } from "../../../data/light"; +import type { HomeAssistant } from "../../../types"; +import "../components/ha-more-info-state-header"; +import "../components/ha-more-info-toggle"; + +@customElement("more-info-switch") +class MoreInfoSwitch extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) public stateObj?: LightEntity; + + protected render(): TemplateResult | null { + if (!this.hass || !this.stateObj) { + return null; + } + + return html` +
    + + + +
    + `; + } + + static get styles(): CSSResultGroup { + return css` + .content { + display: flex; + flex-direction: column; + align-items: center; + } + + ha-more-info-toggle { + margin-bottom: 24px; + } + + ha-attributes { + width: 100%; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "more-info-switch": MoreInfoSwitch; + } +} diff --git a/src/dialogs/more-info/state_more_info_control.ts b/src/dialogs/more-info/state_more_info_control.ts index ad5d0b64e0..b0e0172adb 100644 --- a/src/dialogs/more-info/state_more_info_control.ts +++ b/src/dialogs/more-info/state_more_info_control.ts @@ -23,7 +23,9 @@ const LAZY_LOADED_MORE_INFO_CONTROL = { person: () => import("./controls/more-info-person"), remote: () => import("./controls/more-info-remote"), script: () => import("./controls/more-info-script"), + siren: () => import("./controls/more-info-siren"), sun: () => import("./controls/more-info-sun"), + switch: () => import("./controls/more-info-switch"), timer: () => import("./controls/more-info-timer"), update: () => import("./controls/more-info-update"), vacuum: () => import("./controls/more-info-vacuum"), From 6b9e0405d040bab56221f5497415c3e13edfbf79 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 22 Feb 2023 11:29:58 -0500 Subject: [PATCH 135/138] Add download diagnostics to Thread panel (#15550) --- .../thread/thread-config-panel.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) 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 f706f586e2..13c935e4d2 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 @@ -5,7 +5,10 @@ import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; import { stringCompare } from "../../../../../common/string/compare"; +import { extractSearchParam } from "../../../../../common/url/search-params"; import "../../../../../components/ha-card"; +import { getSignedPath } from "../../../../../data/auth"; +import { getConfigEntryDiagnosticsDownloadUrl } from "../../../../../data/diagnostics"; import { getOTBRInfo } from "../../../../../data/otbr"; import { listThreadDataSets, @@ -20,6 +23,7 @@ import { SubscribeMixin } from "../../../../../mixins/subscribe-mixin"; import { haStyle } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; import { brandsUrl } from "../../../../../util/brands-url"; +import { fileDownload } from "../../../../../util/file_download"; interface ThreadNetwork { name: string; @@ -33,6 +37,8 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { @property({ type: Boolean }) public narrow!: boolean; + @state() private _configEntryId: string | null = null; + @state() private _routers: ThreadRouter[] = []; @state() private _datasets: ThreadDataSet[] = []; @@ -47,6 +53,19 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { .path=${mdiDotsVertical} slot="trigger" > + + + ${this.hass.localize( + "ui.panel.config.integrations.config_entry.download_diagnostics" + )} + + ${this.hass.localize( "ui.panel.config.thread.add_open_thread_border_router" @@ -177,6 +196,8 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { super.firstUpdated(changedProps); this._refresh(); + + this._configEntryId = extractSearchParam("config_entry"); } private _groupRoutersByNetwork = memoizeOne( @@ -226,6 +247,16 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { }); } + private async _signUrl(ev) { + const anchor = ev.target.closest("a"); + ev.preventDefault(); + const signedUrl = await getSignedPath( + this.hass, + anchor.getAttribute("href") + ); + fileDownload(signedUrl.path); + } + private _addOTBR() { showConfigFlowDialog(this, { dialogClosedCallback: () => { @@ -245,6 +276,9 @@ export class ThreadConfigPanel extends SubscribeMixin(LitElement) { margin: 0 auto; direction: ltr; } + ha-button-menu a { + text-decoration: none; + } .routers { padding-bottom: 0; } From ca6ade4858386f4d24c3e9c840f347749ea7f63f Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 22 Feb 2023 17:34:02 +0100 Subject: [PATCH 136/138] Bumped version to 20230222.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9440b6a7d4..01692958c7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "home-assistant-frontend" -version = "20230202.0" +version = "20230222.0" license = {text = "Apache-2.0"} description = "The Home Assistant frontend" readme = "README.md" From 5629346fc35fb35f8b95fd6df0becd8e9afae385 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 22 Feb 2023 17:53:58 +0100 Subject: [PATCH 137/138] Add support for Z-Wave DSK QR codes (#15542 Add support for zwave dsk qr codes --- src/data/zwave_js.ts | 15 +++++++++- .../zwave_js/dialog-zwave_js-add-node.ts | 28 ++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 779566e5e8..b6ad8ce800 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -440,7 +440,8 @@ export const subscribeAddZwaveNode = ( inclusion_strategy: InclusionStrategy = InclusionStrategy.Default, qr_provisioning_information?: QRProvisioningInformation, qr_code_string?: string, - planned_provisioning_entry?: PlannedProvisioningEntry + planned_provisioning_entry?: PlannedProvisioningEntry, + dsk?: string ): Promise => hass.connection.subscribeMessage((message) => callbackFunction(message), { type: "zwave_js/add_node", @@ -449,6 +450,7 @@ export const subscribeAddZwaveNode = ( qr_code_string, qr_provisioning_information, planned_provisioning_entry, + dsk, }); export const stopZwaveInclusion = (hass: HomeAssistant, entry_id: string) => @@ -476,6 +478,17 @@ export const zwaveGrantSecurityClasses = ( client_side_auth, }); +export const zwaveTryParseDskFromQrCode = ( + hass: HomeAssistant, + entry_id: string, + qr_code_string: string +) => + hass.callWS({ + type: "zwave_js/try_parse_dsk_from_qr_code_string", + entry_id, + qr_code_string, + }); + export const zwaveValidateDskAndEnterPin = ( hass: HomeAssistant, entry_id: string, diff --git a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-add-node.ts index 9f6cb644dc..6e645beb1a 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 @@ -17,7 +17,6 @@ import type { HaTextField } from "../../../../../components/ha-textfield"; import { InclusionStrategy, MINIMUM_QR_STRING_LENGTH, - PlannedProvisioningEntry, provisionZwaveSmartStartNode, QRProvisioningInformation, RequestedGrant, @@ -28,6 +27,7 @@ import { zwaveGrantSecurityClasses, zwaveParseQrCode, zwaveSupportsFeature, + zwaveTryParseDskFromQrCode, zwaveValidateDskAndEnterPin, } from "../../../../../data/zwave_js"; import { haStyle, haStyleDialog } from "../../../../../resources/styles"; @@ -515,6 +515,21 @@ class DialogZWaveJSAddNode extends LitElement { return; } this._qrProcessing = true; + const dsk = await zwaveTryParseDskFromQrCode( + this.hass, + this._entryId!, + qrCodeString + ); + if (dsk) { + this._status = "loading"; + // wait for QR scanner to be removed before resetting qr processing + this.updateComplete.then(() => { + this._qrProcessing = false; + }); + this._inclusionStrategy = InclusionStrategy.Security_S2; + this._startInclusion(undefined, dsk); + return; + } if ( qrCodeString.length < MINIMUM_QR_STRING_LENGTH || !qrCodeString.startsWith("90") @@ -623,15 +638,13 @@ class DialogZWaveJSAddNode extends LitElement { private _startInclusion( qrProvisioningInformation?: QRProvisioningInformation, - qrCodeString?: string, - plannedProvisioningEntry?: PlannedProvisioningEntry + dsk?: string ): void { if (!this.hass) { return; } this._lowSecurity = false; - const specificDevice = - qrProvisioningInformation || qrCodeString || plannedProvisioningEntry; + const specificDevice = qrProvisioningInformation || dsk; this._subscribed = subscribeAddZwaveNode( this.hass, this._entryId!, @@ -697,8 +710,9 @@ class DialogZWaveJSAddNode extends LitElement { }, this._inclusionStrategy, qrProvisioningInformation, - qrCodeString, - plannedProvisioningEntry + undefined, + undefined, + dsk ); this._addNodeTimeoutHandle = window.setTimeout(() => { this._unsubscribe(); From 19d721f193bb97d9fa45a3d73ce60c8e8c8df15f Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:54:53 -0500 Subject: [PATCH 138/138] Add support for zwave_js controller firmware updates (#15515) --- src/data/zwave_js.ts | 28 ++++- .../zwave_js/device-actions.ts | 111 ++++++++++-------- .../dialog-zwave_js-update-firmware-node.ts | 74 +++++++----- src/translations/en.json | 11 +- 4 files changed, 140 insertions(+), 84 deletions(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index b6ad8ce800..2b0b88d8cc 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -108,7 +108,7 @@ enum RFRegion { "Default (EU)" = 0xff, } -export enum FirmwareUpdateStatus { +export enum NodeFirmwareUpdateStatus { Error_Timeout = -1, Error_Checksum = 0, Error_TransmissionFailed = 1, @@ -124,6 +124,19 @@ export enum FirmwareUpdateStatus { OK_RestartPending = 0xff, } +export enum ControllerFirmwareUpdateStatus { + // An expected response was not received from the controller in time + Error_Timeout = 0, + /** The maximum number of retry attempts for a firmware fragments were reached */ + Error_RetryLimitReached, + /** The update was aborted by the bootloader */ + Error_Aborted, + /** This controller does not support firmware updates */ + Error_NotSupported, + + OK = 0xff, +} + export interface QRProvisioningInformation { version: QRCodeVersion; securityClasses: SecurityClass[]; @@ -322,7 +335,7 @@ export interface ZWaveJSNodeStatusUpdatedMessage { status: NodeStatus; } -export interface ZWaveJSNodeFirmwareUpdateProgressMessage { +export interface ZWaveJSFirmwareUpdateProgressMessage { event: "firmware update progress"; current_file: number; total_files: number; @@ -333,12 +346,18 @@ export interface ZWaveJSNodeFirmwareUpdateProgressMessage { export interface ZWaveJSNodeFirmwareUpdateFinishedMessage { event: "firmware update finished"; - status: FirmwareUpdateStatus; + status: NodeFirmwareUpdateStatus; success: boolean; wait_time?: number; reinterview: boolean; } +export interface ZWaveJSControllerFirmwareUpdateFinishedMessage { + event: "firmware update finished"; + status: ControllerFirmwareUpdateStatus; + success: boolean; +} + export type ZWaveJSNodeFirmwareUpdateCapabilities = | { firmware_upgradable: false } | { @@ -760,8 +779,9 @@ export const subscribeZwaveNodeFirmwareUpdate = ( device_id: string, callbackFunction: ( message: + | ZWaveJSFirmwareUpdateProgressMessage + | ZWaveJSControllerFirmwareUpdateFinishedMessage | ZWaveJSNodeFirmwareUpdateFinishedMessage - | ZWaveJSNodeFirmwareUpdateProgressMessage ) => void ): Promise => hass.connection.subscribeMessage( diff --git a/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts b/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts index a6fd80387f..ff37acf6f9 100644 --- a/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts +++ b/src/panels/config/devices/device-detail/integration-elements/zwave_js/device-actions.ts @@ -43,59 +43,68 @@ export const getZwaveDeviceActions = async ( const nodeStatus = await fetchZwaveNodeStatus(hass, device.id); - if (!nodeStatus || nodeStatus.is_controller_node) { + if (!nodeStatus) { return []; } - const actions = [ - { - label: hass.localize( - "ui.panel.config.zwave_js.device_info.device_config" - ), - icon: mdiCog, - href: `/config/zwave_js/node_config/${device.id}?config_entry=${entryId}`, - }, - { - label: hass.localize( - "ui.panel.config.zwave_js.device_info.reinterview_device" - ), - icon: mdiChatQuestion, - action: () => - showZWaveJSReinterviewNodeDialog(el, { - device_id: device.id, - }), - }, - { - label: hass.localize("ui.panel.config.zwave_js.device_info.heal_node"), - icon: mdiHospitalBox, - action: () => - showZWaveJSHealNodeDialog(el, { - device, - }), - }, - { - label: hass.localize( - "ui.panel.config.zwave_js.device_info.remove_failed" - ), - icon: mdiDeleteForever, - action: () => - showZWaveJSRemoveFailedNodeDialog(el, { - device_id: device.id, - }), - }, - { - label: hass.localize( - "ui.panel.config.zwave_js.device_info.node_statistics" - ), - icon: mdiInformation, - action: () => - showZWaveJSNodeStatisticsDialog(el, { - device, - }), - }, - ]; + const actions: DeviceAction[] = []; - if (!nodeStatus.ready || !nodeStatus.has_firmware_update_cc) { + if (!nodeStatus.is_controller_node) { + actions.push( + { + label: hass.localize( + "ui.panel.config.zwave_js.device_info.device_config" + ), + icon: mdiCog, + href: `/config/zwave_js/node_config/${device.id}?config_entry=${entryId}`, + }, + { + label: hass.localize( + "ui.panel.config.zwave_js.device_info.reinterview_device" + ), + icon: mdiChatQuestion, + action: () => + showZWaveJSReinterviewNodeDialog(el, { + device_id: device.id, + }), + }, + { + label: hass.localize("ui.panel.config.zwave_js.device_info.heal_node"), + icon: mdiHospitalBox, + action: () => + showZWaveJSHealNodeDialog(el, { + device, + }), + }, + { + label: hass.localize( + "ui.panel.config.zwave_js.device_info.remove_failed" + ), + icon: mdiDeleteForever, + action: () => + showZWaveJSRemoveFailedNodeDialog(el, { + device_id: device.id, + }), + }, + { + label: hass.localize( + "ui.panel.config.zwave_js.device_info.node_statistics" + ), + icon: mdiInformation, + action: () => + showZWaveJSNodeStatisticsDialog(el, { + device, + }), + } + ); + } + + if ( + !( + nodeStatus.ready && + (nodeStatus.is_controller_node || nodeStatus.has_firmware_update_cc) + ) + ) { return actions; } @@ -117,7 +126,9 @@ export const getZwaveDeviceActions = async ( (await fetchZwaveIsNodeFirmwareUpdateInProgress(hass, device.id)) || (await showConfirmationDialog(el, { text: hass.localize( - "ui.panel.config.zwave_js.update_firmware.warning" + `ui.panel.config.zwave_js.update_firmware.${ + nodeStatus.is_controller_node ? "warning_controller" : "warning" + }` ), dismissText: hass.localize("ui.common.no"), confirmText: hass.localize("ui.common.yes"), diff --git a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts index 4c8b194b92..d58c1822b1 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/dialog-zwave_js-update-firmware-node.ts @@ -15,17 +15,19 @@ import { } from "../../../../../data/device_registry"; import { abortZwaveNodeFirmwareUpdate, + ControllerFirmwareUpdateStatus, fetchZwaveIsNodeFirmwareUpdateInProgress, fetchZwaveNodeStatus, - FirmwareUpdateStatus, + NodeFirmwareUpdateStatus, NodeStatus, subscribeZwaveNodeStatus, subscribeZwaveNodeFirmwareUpdate, uploadFirmwareAndBeginUpdate, ZWaveJSNodeFirmwareUpdateFinishedMessage, - ZWaveJSNodeFirmwareUpdateProgressMessage, + ZWaveJSFirmwareUpdateProgressMessage, ZWaveJSNodeStatusUpdatedMessage, ZWaveJSNodeStatus, + ZWaveJSControllerFirmwareUpdateFinishedMessage, } from "../../../../../data/zwave_js"; import { haStyleDialog } from "../../../../../resources/styles"; import { HomeAssistant } from "../../../../../types"; @@ -44,10 +46,12 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { @state() private _uploading = false; @state() - private _updateFinishedMessage?: ZWaveJSNodeFirmwareUpdateFinishedMessage; + private _updateFinishedMessage?: + | ZWaveJSNodeFirmwareUpdateFinishedMessage + | ZWaveJSControllerFirmwareUpdateFinishedMessage; @state() - private _updateProgressMessage?: ZWaveJSNodeFirmwareUpdateProgressMessage; + private _updateProgressMessage?: ZWaveJSFirmwareUpdateProgressMessage; @state() private _updateInProgress = false; @@ -71,12 +75,11 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { public closeDialog(): void { this._unsubscribeNodeFirmwareUpdate(); this._unsubscribeNodeStatus(); - this.device = - this._updateProgressMessage = - this._updateFinishedMessage = - this._firmwareFile = - this._nodeStatus = - undefined; + this.device = undefined; + this._updateProgressMessage = undefined; + this._updateFinishedMessage = undefined; + this._firmwareFile = undefined; + this._nodeStatus = undefined; this._uploading = this._updateInProgress = false; fireEvent(this, "dialog-closed", { dialog: this.localName }); @@ -111,18 +114,26 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { )} `; - const abortFirmwareUpdateButton = html` - - ${this.hass.localize("ui.panel.config.zwave_js.update_firmware.abort")} - - `; - const status = this._updateFinishedMessage - ? FirmwareUpdateStatus[this._updateFinishedMessage.status] - .split("_")[0] - .toLowerCase() + ? this._updateFinishedMessage.success + ? "success" + : "error" : undefined; + const localizationKeySuffix = this._nodeStatus.is_controller_node + ? "_controller" + : ""; + + const abortFirmwareUpdateButton = this._nodeStatus.is_controller_node + ? html`` + : html` + + ${this.hass.localize( + "ui.panel.config.zwave_js.update_firmware.abort" + )} + + `; + return html` ${this.hass.localize( - "ui.panel.config.zwave_js.update_firmware.introduction", + `ui.panel.config.zwave_js.update_firmware.introduction${localizationKeySuffix}`, { device: html`${this._deviceName}`, } @@ -210,7 +221,9 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { : html`
    @@ -221,9 +234,13 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { device: html`${this._deviceName}`, message: this.hass.localize( `ui.panel.config.zwave_js.update_firmware.finished_status.${ - FirmwareUpdateStatus[ - this._updateFinishedMessage!.status - ] + this._nodeStatus.is_controller_node + ? ControllerFirmwareUpdateStatus[ + this._updateFinishedMessage!.status + ] + : NodeFirmwareUpdateStatus[ + this._updateFinishedMessage!.status + ] }` ), } @@ -231,10 +248,10 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement {

    - ${status === "ok" + ${this._updateFinishedMessage!.success ? html`

    ${this.hass.localize( - "ui.panel.config.zwave_js.update_firmware.finished_status.done" + `ui.panel.config.zwave_js.update_firmware.finished_status.done${localizationKeySuffix}` )}

    ` : html`

    @@ -345,8 +362,9 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { this.device.id, ( message: + | ZWaveJSFirmwareUpdateProgressMessage + | ZWaveJSControllerFirmwareUpdateFinishedMessage | ZWaveJSNodeFirmwareUpdateFinishedMessage - | ZWaveJSNodeFirmwareUpdateProgressMessage ) => { if (message.event === "firmware update progress") { if (!this._updateFinishedMessage) { @@ -378,7 +396,7 @@ class DialogZWaveJSUpdateFirmwareNode extends LitElement { return [ haStyleDialog, css` - .ok { + .success { color: var(--success-color); } diff --git a/src/translations/en.json b/src/translations/en.json index 86166dd30e..b2d36c0337 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3688,7 +3688,9 @@ "update_firmware": { "title": "Update Device Firmware", "warning": "WARNING: Firmware updates can brick your device if you do not correctly follow the manufacturer's guidance. The Home Assistant and Z-Wave JS teams do not take any responsibility for any damages to your device as a result of the firmware update and will not be able to help you if you brick your device. Would you still like to continue?", + "warning_controller": "WARNING: Firmware updates can brick your controller if you do not use the right firmware files, or if you attempt to stop the firmware update before it completes. The Home Assistant and Z-Wave JS teams do not take any responsibility for any damages to your controller as a result of the firmware update and will not be able to help you if you brick your controller. Would you still like to continue?", "introduction": "Select the firmware file you would like to use to update {device}.", + "introduction_controller": "Select the firmware file you would like to use to update {device}. Note that once you start a firmware update, you MUST wait for the update to complete.", "upload_firmware": "Upload Firmware", "upload_failed": "Upload Failed", "begin_update": "Begin Firmware Update", @@ -3701,10 +3703,11 @@ "abort_failed": "Abort Failed", "confirm_abort": "Are you sure you want to abort the firmware update on {device}?", "finished_status": { - "ok": "Successfully updated firmware on {device}: {message}.", + "success": "Successfully updated firmware on {device}: {message}.", "error": "Unable to update firmware on {device}: {message}.", "try_again": "To attempt the firmware update again, select the new firmware file you would like to use.", "done": "The firmware update is complete! If you want to attempt another firmware update on this device, please wait until it gets re-interviewed.", + "done_controller": "The firmware update is complete! Your controller is being restarted and your network will temporarily be unavailable.", "Error_Timeout": "Timed Out", "Error_Checksum": "Checksum Error", "Error_TransmissionFailed": "Transmission Failed", @@ -3717,7 +3720,11 @@ "Error_InvalidHardwareVersion": "Invalid Hardware Version", "OK_WaitingForActivation": "Waiting for Activation", "OK_NoRestart": "No Restart", - "OK_RestartPending": "Restart Pending" + "OK_RestartPending": "Restart Pending", + "Error_RetryLimitReached": "Retry Limit Reached", + "Error_Aborted": "Update Aborted by Bootloader", + "Error_NotSupported": "Firmware Updates Not Supported", + "OK": "Success" } }, "logs": {