From 072ad878311c294408527fd4c8935e76aca25c5e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 2 Jul 2020 20:09:58 +0200 Subject: [PATCH 01/58] Prevent doing yaml conversion twice (#6308) --- .../editor/card-editor/hui-card-editor.ts | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts index 0f58b84822..74d3d02511 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts @@ -24,6 +24,7 @@ import type { EntityConfig } from "../../entity-rows/types"; import type { LovelaceCardEditor } from "../../types"; import type { GUIModeChangedEvent } from "../types"; import "../../../../components/ha-circular-progress"; +import { deepEqual } from "../../../../common/util/deep-equal"; export interface ConfigChangedEvent { config: LovelaceCardConfig; @@ -81,16 +82,11 @@ export class HuiCardEditor extends LitElement { this._yaml = _yaml; try { this._config = safeLoad(this.yaml); - this._updateConfigElement(); this._error = undefined; } catch (err) { this._error = err.message; } - fireEvent(this, "config-changed", { - config: this.value!, - error: this._error, - guiModeAvailable: !(this.hasWarning || this.hasError), - }); + this._setConfig(); } public get value(): LovelaceCardConfig | undefined { @@ -98,9 +94,29 @@ export class HuiCardEditor extends LitElement { } public set value(config: LovelaceCardConfig | undefined) { - if (JSON.stringify(config) !== JSON.stringify(this._config || {})) { - this.yaml = safeDump(config); + if (this._config && deepEqual(config, this._config)) { + return; } + this._config = config; + this._yaml = safeDump(config); + this._error = undefined; + this._setConfig(); + } + + private _setConfig() { + if (!this._error) { + try { + this._updateConfigElement(); + this._error = undefined; + } catch (err) { + this._error = err.message; + } + } + fireEvent(this, "config-changed", { + config: this.value!, + error: this._error, + guiModeAvailable: !(this.hasWarning || this.hasError), + }); } public get hasWarning(): boolean { From 6c73392a57000dd2a0cbc7ea0f8c607dcf7c4d67 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 2 Jul 2020 23:18:11 +0200 Subject: [PATCH 02/58] Bump mdc and mwc elements (#6313) * Bump mdc to stable 7.0.0 * Bump mdc and mwc * Update ha-config-logs.ts * Correct changed radius variable --- package.json | 39 +- src/panels/config/logs/ha-config-logs.ts | 4 +- src/resources/styles.ts | 2 +- yarn.lock | 639 +++++++++++------------ 4 files changed, 314 insertions(+), 370 deletions(-) diff --git a/package.json b/package.json index 87a988abf4..403b5d5d79 100644 --- a/package.json +++ b/package.json @@ -25,18 +25,18 @@ "@formatjs/intl-pluralrules": "^1.5.8", "@fullcalendar/core": "^5.0.0-beta.2", "@fullcalendar/daygrid": "^5.0.0-beta.2", - "@material/chips": "7.0.0-canary.d92d8c93e.0", - "@material/circular-progress": "7.0.0-canary.d92d8c93e.0", - "@material/mwc-button": "^0.15.0", - "@material/mwc-checkbox": "^0.15.0", - "@material/mwc-dialog": "^0.15.0", - "@material/mwc-fab": "^0.15.0", - "@material/mwc-formfield": "^0.15.0", - "@material/mwc-icon-button": "^0.15.0", - "@material/mwc-list": "^0.15.0", - "@material/mwc-menu": "^0.15.0", - "@material/mwc-ripple": "^0.15.0", - "@material/mwc-switch": "^0.15.0", + "@material/chips": "=8.0.0-canary.a78ceb112.0", + "@material/circular-progress": "=8.0.0-canary.a78ceb112.0", + "@material/mwc-button": "^0.17.2", + "@material/mwc-checkbox": "^0.17.2", + "@material/mwc-dialog": "^0.17.2", + "@material/mwc-fab": "^0.17.2", + "@material/mwc-formfield": "^0.17.2", + "@material/mwc-icon-button": "^0.17.2", + "@material/mwc-list": "^0.17.2", + "@material/mwc-menu": "^0.17.2", + "@material/mwc-ripple": "^0.17.2", + "@material/mwc-switch": "^0.17.2", "@mdi/js": "4.9.95", "@mdi/svg": "4.9.95", "@polymer/app-layout": "^3.0.2", @@ -206,20 +206,7 @@ "@webcomponents/webcomponentsjs": "^2.2.10", "@polymer/polymer": "3.1.0", "lit-html": "1.2.1", - "lit-element": "2.3.1", - "@material/animation": "7.0.0-canary.d92d8c93e.0", - "@material/base": "7.0.0-canary.d92d8c93e.0", - "@material/checkbox": "7.0.0-canary.d92d8c93e.0", - "@material/density": "7.0.0-canary.d92d8c93e.0", - "@material/dom": "7.0.0-canary.d92d8c93e.0", - "@material/elevation": "7.0.0-canary.d92d8c93e.0", - "@material/feature-targeting": "7.0.0-canary.d92d8c93e.0", - "@material/ripple": "7.0.0-canary.d92d8c93e.0", - "@material/rtl": "7.0.0-canary.d92d8c93e.0", - "@material/shape": "7.0.0-canary.d92d8c93e.0", - "@material/theme": "7.0.0-canary.d92d8c93e.0", - "@material/touch-target": "7.0.0-canary.d92d8c93e.0", - "@material/typography": "7.0.0-canary.d92d8c93e.0" + "lit-element": "2.3.1" }, "main": "src/home-assistant.js", "husky": { diff --git a/src/panels/config/logs/ha-config-logs.ts b/src/panels/config/logs/ha-config-logs.ts index dd4a40c91c..f1a1bf764a 100644 --- a/src/panels/config/logs/ha-config-logs.ts +++ b/src/panels/config/logs/ha-config-logs.ts @@ -17,7 +17,7 @@ import { configSections } from "../ha-panel-config"; import "../../../layouts/hass-tabs-subpage"; @customElement("ha-config-logs") -export class HaPanelDevLogs extends LitElement { +export class HaConfigLogs extends LitElement { @property() public hass!: HomeAssistant; @property() public narrow!: boolean; @@ -74,6 +74,6 @@ export class HaPanelDevLogs extends LitElement { declare global { interface HTMLElementTagNameMap { - "developer-tools-logs": HaPanelDevLogs; + "ha-config-logs": HaConfigLogs; } } diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 53d84dfc49..ea6ba3cfbc 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -242,7 +242,7 @@ export const haStyleDialog = css` ha-dialog { --mdc-dialog-min-width: 100vw; --mdc-dialog-max-height: 100vh; - --mdc-dialog-shape-radius: 0px; + --mdc-shape-medium: 0px; --vertial-align-dialog: flex-end; } } diff --git a/yarn.lock b/yarn.lock index 06be65a121..226a024ee2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1330,465 +1330,422 @@ "@babel/runtime" "^7.7.2" core-js "^3.4.1" -"@material/animation@7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-7.0.0-canary.d92d8c93e.0.tgz#7aa9f15b710c478c84ac31e239f0c3d85192fbc1" - integrity sha512-MeOcW2xEyeHTwCrGERStR3lbPlDIZLqAe9d4gTHAZjf7lnTSzjOpJiXiaX8GRjBAlQ9Z4Ucy8rfCSHjKa4BU2Q== +"@material/animation@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-8.0.0-canary.a78ceb112.0.tgz#b7bd0c91f6431f3294224936b7e37827ca2f77ee" + integrity sha512-avnYo5iXt64I5nJfNbiYebtZ8sYcgxbje1JpU0mr58VpgDpSRbQCDoJi+/LPDQiNDr/lU3vUM9MEQaECY8KVzw== dependencies: tslib "^1.9.3" -"@material/base@7.0.0-canary.d92d8c93e.0", "@material/base@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-7.0.0-canary.d92d8c93e.0.tgz#e111a21bc5ae1a9c4cb6ae37d09edd791aaadcc1" - integrity sha512-ey7Sz8E1A/u0lqCahn57seXYOglJk+bwBgHB+ErJICdUpVD8OhKYtAb++2+eNXVujsHohXx8TM/tZOsefATsQg== +"@material/base@8.0.0-canary.a78ceb112.0", "@material/base@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-8.0.0-canary.a78ceb112.0.tgz#65bb27333255fb0cc3047d79115a82d540f5b9d8" + integrity sha512-gSCgOkjtyrpxGm8BC7mx0dM6yyWda/jSvBcCejlydHQ76fwJ/uV8snBvCdyqgW+E2fDt8Y2o5HyeJSFHAb9q/w== dependencies: tslib "^1.9.3" -"@material/button@7.0.0-canary.d92d8c93e.0", "@material/button@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/button/-/button-7.0.0-canary.d92d8c93e.0.tgz#14fa7bea4a082f43839593c0883addb6f3fdab15" - integrity sha512-YJqwOB6Xr619nSuWGUmkJN/+bj5sV/AsDfaE28Mv3xjoFqPK19I5RsDI62uZCmODGQfgxkY768JziT49zY9LXg== +"@material/button@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-8.0.0-canary.a78ceb112.0.tgz#79b13900307f769e7b63f9eef1d209b40df7fc2c" + integrity sha512-HQExVH0zD7VIYt+48YOaHRcCXYRiMeGsVwhYDeLJilipqxAjniDLhudlBjnmAFBOFs0kWAYuIyXRiszJfgOVUQ== dependencies: - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/shape" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/touch-target" "7.0.0-canary.d92d8c93e.0" - "@material/typography" "7.0.0-canary.d92d8c93e.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/shape" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/touch-target" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" -"@material/checkbox@7.0.0-canary.d92d8c93e.0", "@material/checkbox@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-7.0.0-canary.d92d8c93e.0.tgz#547af5361e3f8f02b0e58ac952309ab7d673217d" - integrity sha512-yI0C0ua5JJn6qezG71cNWJC6uBxIlyqCDv/3s+aE8j/pHYel2IAJw9wWXA33Xi1QzFpjY8+gAmvN6Go3jS8JDg== +"@material/checkbox@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-8.0.0-canary.a78ceb112.0.tgz#4222388f5bbb1aba3bdc6639060049cebe6fde1e" + integrity sha512-ke91NUbI+j8/zzpBr0Iw4MjUF8gj5VNmdTTJP8dvHmRNObSBwXo6ZERactzndK7/CG+dVV0hkwQfcTqC52DrTg== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/touch-target" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/touch-target" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/chips@7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/chips/-/chips-7.0.0-canary.d92d8c93e.0.tgz#c96849885e32b61c0486e9f5259aeb1ea1e3f851" - integrity sha512-W0jUAYQyZwzowgWDCkTPGOpLAhiFyD6GgMMnBv7oHMF8nWKTVrdU6deTbTjMXQtgBtNCyXaISmOFyoiU8+bixw== +"@material/chips@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-8.0.0-canary.a78ceb112.0.tgz#e1d9e3c5b5dc34a70edd669048a8a34a5e390964" + integrity sha512-ZZYTMb4CP7dSy/8BGpIQu1ejFHJv1/tdLxAWEDXI28OTTka3H9I74SExUkC3htqpV22xfWjSUZt+XnPMzIqffA== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/checkbox" "7.0.0-canary.d92d8c93e.0" - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/shape" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/touch-target" "7.0.0-canary.d92d8c93e.0" - "@material/typography" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/checkbox" "8.0.0-canary.a78ceb112.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/shape" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/touch-target" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/circular-progress@7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-7.0.0-canary.d92d8c93e.0.tgz#f644c90076cdf30208201dfb37e0d7c8f2c58724" - integrity sha512-Xoj6E+HtvxesuRo/u8xLqDQ0rJY9DKXOelKErrOkxJskkS4G30jFRvdlDWXenBjzRaynH/Iu3RcnNOUTrcSL4A== +"@material/circular-progress@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-8.0.0-canary.a78ceb112.0.tgz#6e65832501dd975b0438abc98eabfaf7072e5c30" + integrity sha512-jMg57QaFHCgls5WYkKONUlqmHbzVy3EDJkgtcUOnNTzuG1FnO99Ddg/O02RYf5U9siUGvpS+ve2GHLobSE//CA== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/progress-indicator" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/progress-indicator" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/density@7.0.0-canary.d92d8c93e.0", "@material/density@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/density/-/density-7.0.0-canary.d92d8c93e.0.tgz#a7a3b0a4fdb4ce92487611a18af4bf51b8f7b09f" - integrity sha512-yUZw5NSTp7Aj/6Qu5bqLmX23X1QWBfShAoKIwFFZMpLkgWQPy2+p+o9JqaPXN9U824/sDFDP9nofR5VosaNyVg== +"@material/density@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-8.0.0-canary.a78ceb112.0.tgz#f84414a9d87a932e6857b7c979166e57563865ac" + integrity sha512-1fZUwRxnCvVbDA2cEtkbGjGSkvsjsUSFAfN4eWCqylUqbkQC0AWO5EDmrYH+sT3VpHAZ+Hr3cLcydydsT3o2wQ== -"@material/dialog@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-7.0.0-canary.d92d8c93e.0.tgz#d11440345d57ed7f86eb2186c0e9cb72ba8938ed" - integrity sha512-2CX0C9gAXm1hNlGBGNk8fA0hnBZF2Ehtr+KDAGO/EaYJDL72cXFsd6lWewjG2MuKk0XorVlv7EaHEZpUoprA3w== +"@material/dialog@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-8.0.0-canary.a78ceb112.0.tgz#09948b18d3286154dfb2ada24b2b50d13fe652d0" + integrity sha512-DnMCAlCHDP6LdPpxksrKJs/go/37sZpFHkYG3YaFd7yNoO8K1isRbsf7U6H9KQvE0tGAXZLDY7vy4ERiLxKoYg== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/button" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/shape" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/touch-target" "7.0.0-canary.d92d8c93e.0" - "@material/typography" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/button" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/shape" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/touch-target" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/dom@7.0.0-canary.d92d8c93e.0", "@material/dom@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-7.0.0-canary.d92d8c93e.0.tgz#079c9d4e0a5e926acc26b22277bca94750122e9f" - integrity sha512-mHMF2dkKbymywgkOdMPdW1+MbQn2GzvdSpjfRDX/cGh6lKQ0/fado276b/vpXRQb7vNXG1Z21TUtBiZyuyf/PA== +"@material/dom@8.0.0-canary.a78ceb112.0", "@material/dom@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-8.0.0-canary.a78ceb112.0.tgz#3c9d3f8f177a8b723e4fdd95651f7288f5fa3a27" + integrity sha512-FmmLO+F/kyo/0rbkkp955JiN8ZCG9CI5g3VH4Ru02jtZdXnGSzo8Cdqjq2fzgP7MQ//eTTwMdeCZfp81UCwjQw== dependencies: - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/elevation@7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-7.0.0-canary.d92d8c93e.0.tgz#9403d7abf0019b2864c672e7d9de6409f2c48670" - integrity sha512-qBIxG2wKZCsKN99zfss9xcI312dOnnkp6HfRSdnVSIsJd/c5RicY0hw/EE+hS+VYc8M0rnc+HSgM/+MMbFzz9w== +"@material/elevation@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-8.0.0-canary.a78ceb112.0.tgz#811b3e2990434cddb6a44dafd8d3a3945513cda0" + integrity sha512-eTBJ0NCDpfD9pc6AJjzkWGtXSHybKO9+RlxSyIGhax7xiMaIFlXqsk9SlLXwNlbwyU0EqIjPPJdKE9492EavDA== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" -"@material/fab@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/fab/-/fab-7.0.0-canary.d92d8c93e.0.tgz#b36379e02bf6e29699b50e0951751dc65dbe87bc" - integrity sha512-MMunuvYq7CnVKpV4nIdevFo02Cbypx9QtyTUYQ/RncRRXSlt5myZBk90dBvInp2B5Tq9XcbkbyIK2WCvS8d1FQ== +"@material/feature-targeting@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-8.0.0-canary.a78ceb112.0.tgz#998c7b2331796fee6489b2eaf95a9a75683ed60b" + integrity sha512-pYiHlUwKiAwBAULUDVxADD2eHb80cuzwQsQI9IpNr1mgdLcoKomWYxmHYzyD9AUIOlYsPrft+ozyC4gXt5kOtg== + +"@material/form-field@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-8.0.0-canary.a78ceb112.0.tgz#232db5ce9d76935524242a9ee23e6931257b1189" + integrity sha512-VIDXQjthFqk3S5w7IgziErin/3p+L/c6lnw6e0E/DiUFgf6gTUenbbzx1+9plBOGqCl67wTN9NwQBekHUOKxhQ== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/shape" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/touch-target" "7.0.0-canary.d92d8c93e.0" - "@material/typography" "7.0.0-canary.d92d8c93e.0" - -"@material/feature-targeting@7.0.0-canary.d92d8c93e.0", "@material/feature-targeting@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-7.0.0-canary.d92d8c93e.0.tgz#7fd210bebaf260ce8b3db8a27100b9716d807bab" - integrity sha512-0avhPtQSnHrQV6jeBZpnqLq51KFjP1oHaQKr2Tm+eqZXqQibNTUyds9oXVTzukd9v3NYTsbdMBpeiKyNrPfHMA== - -"@material/form-field@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-7.0.0-canary.d92d8c93e.0.tgz#1ebe0866ba81bf5c155a753d3741f0490cdf9320" - integrity sha512-/F9jAGYCX5m1hNuyTgXUUdTqQDuYRirkZ8vIDcgPImCb/a/LiYI8KuIhUjXsS8vuiVmTgQTPxYMJ4QPoiFoI3Q== - dependencies: - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/typography" "7.0.0-canary.d92d8c93e.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/icon-button@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-7.0.0-canary.d92d8c93e.0.tgz#e3cb688d9d0bd185f8c67e4d255c5095ea9941fd" - integrity sha512-7LWQ4rStg7xiLSQ1DUSOXmuS5oyLFWt4kuDiMeqraapluMFHwFZ9RwmmliE+KhhZGHpe/4VT+M+mR9ZlG507oQ== +"@material/list@8.0.0-canary.a78ceb112.0", "@material/list@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-8.0.0-canary.a78ceb112.0.tgz#0b986116de8d99daf50867a82219552bdc0cc854" + integrity sha512-B6ysRJm6HOTQdrAyYcRqZv807vbSrsOnxk3AE9Qscx6erdoJLm9lLX066YfFVk5iGbMzebhFi8lkEIVJBLKwSg== dependencies: - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/shape" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/list@7.0.0-canary.d92d8c93e.0", "@material/list@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/list/-/list-7.0.0-canary.d92d8c93e.0.tgz#fbc46ddc860c67dc4fe466b872abfa90e13d1514" - integrity sha512-7hdSglQRGOg4y8tGx6dega12VQp1B8/SbjIsJ5fLH9gvnvusJCNVexvBO4bAa6D4ul4eWv8buJgu517plbnthA== +"@material/menu-surface@8.0.0-canary.a78ceb112.0", "@material/menu-surface@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-8.0.0-canary.a78ceb112.0.tgz#88617336a0369cd71ec0430914bdf202cf464fa1" + integrity sha512-PRzYXJz/VmLTmAMJMs6U+BRAAH1+Gn36vVAGtFptYFHk1XO/BTrHKqMmriXPsRE4Kqw8BBf6fTsIImvZcqxhYA== dependencies: - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/shape" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/typography" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/shape" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/menu-surface@7.0.0-canary.d92d8c93e.0", "@material/menu-surface@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-7.0.0-canary.d92d8c93e.0.tgz#21c6b0efcc5f781bf4aef846f45c93a0c8fb7cea" - integrity sha512-TGxf+gMy1JjBxJhVFydWYt9ikE4mrMwA1Ki0Ts3n/Og6GizYUk1nsV6QTPUVlzOgX4vHkKHIfSCh+3tf9VokHA== +"@material/menu@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-8.0.0-canary.a78ceb112.0.tgz#259c76ac52b769dde9309e385a72db1f2ae8ed7e" + integrity sha512-Z9D8MyNjtMeZ47jwlcnvbGCLLsLSGc4h+a2g/LWnlpbMSyAa91d0x2XlQANmfIzFah3nTcjoon08q/9g8up93Q== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/shape" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/list" "8.0.0-canary.a78ceb112.0" + "@material/menu-surface" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/menu@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/menu/-/menu-7.0.0-canary.d92d8c93e.0.tgz#496ca4b078bc0072308d89905bd3c8788a4af8b9" - integrity sha512-//ZbJmt4qepOu+i8VmgLevYAm4TtGTs4Q6k7NsZTbcaLKPM61upszM5oZ/YnlNELWZ3CUFweY2tdQIn6AnFkjw== +"@material/mwc-base@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-base/-/mwc-base-0.17.2.tgz#90c863f428c281c2d71465d89958dd2fbe4b5e3f" + integrity sha512-SJ4GLhikChTp7HwyAqccIk1usxwLporj5EWCNx+1h2ECWIY5BdIySFkmq9uqrVLEDTwW0wPB+0ZD+E3ScJdvZw== dependencies: - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/list" "7.0.0-canary.d92d8c93e.0" - "@material/menu-surface" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - tslib "^1.9.3" - -"@material/mwc-base@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-base/-/mwc-base-0.15.0.tgz#ddc8271c0f8b06c9098436ff8a9892ed0dcab5dc" - integrity sha512-TlZQtwKMhU5e4GMQ3ZFwhJ2ANQJHTnPMRq6ZDEIG2vfoxx8JIWJ2f/yoI8MkoYUJ1Q6t5arBaBaI2Qr0JEstWw== - dependencies: - "@material/base" "=7.0.0-canary.d92d8c93e.0" - "@material/dom" "=7.0.0-canary.d92d8c93e.0" - "@material/ripple" "=7.0.0-canary.d92d8c93e.0" + "@material/base" "=8.0.0-canary.a78ceb112.0" + "@material/dom" "=8.0.0-canary.a78ceb112.0" lit-element "^2.3.0" tslib "^1.10.0" -"@material/mwc-button@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-button/-/mwc-button-0.15.0.tgz#8ebe3718f2f23207d60e069c49235a607120012b" - integrity sha512-vwwT5I8b7mMAH4UzGZdfStbWx+/blhBlZ/wZM+CKbolwPuOeMLeTMMawhyRnLqMxedCPExQ1koYoABXNoUB4lQ== +"@material/mwc-button@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-button/-/mwc-button-0.17.2.tgz#90924f028ac52fd462d127a8b5587be8eca6877c" + integrity sha512-2fNVfF2tL1yywufCY4qLgqBR5lS2QFUIu9AqOmImN0MNmFk3jhXAiVSdWbuMKruiGI0HW4DAzM/w+uiAVu83KA== dependencies: - "@material/button" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/mwc-icon" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" + "@material/mwc-icon" "^0.17.2" + "@material/mwc-ripple" "^0.17.2" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-checkbox@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-checkbox/-/mwc-checkbox-0.15.0.tgz#57cd3cb194102951639ed0a6675f5a19bab988ad" - integrity sha512-ssjko688R/qPAfn4E79hFMyHq91h2rHqrAtvt7rFZT8to0uOurnXNwFLyuzwruhMbPjDRSr5fVcJWqWBV/SN3Q== +"@material/mwc-checkbox@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-checkbox/-/mwc-checkbox-0.17.2.tgz#e4185cd88857fbe25946a27edfa46cd950062bd9" + integrity sha512-y+9VJ2dvcQloShRv/wYJDUjp6H0rWGu7MbhqvxlKeDOcCBz9a/3eGZQj7MnWwz2vkRPfIBwVRsJRO5HxIwZvuQ== dependencies: - "@material/checkbox" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" + "@material/mwc-base" "^0.17.2" + "@material/mwc-ripple" "^0.17.2" lit-element "^2.3.0" + lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-dialog@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-dialog/-/mwc-dialog-0.15.0.tgz#1b5266123ee4eac2274d9410ef7eadb354d27008" - integrity sha512-3zIu0gVJyAAeKW/57/+4tsgaVKPUvo33ciZ8oDzGvOdbnkZIyWwylx6ydnPCuWED9BkQekAgH7YM+vzutP0UhQ== +"@material/mwc-dialog@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-dialog/-/mwc-dialog-0.17.2.tgz#3ae79c74d94e3a773a11e3d744be78c713a3bc0a" + integrity sha512-U9iLbDfpzkDAKtQKOSWACDqBCiYu6POymdIPmA4N9yRJGX1v2sNDulaGhDu/IqINz26TKT6FUMWmto18E70xrA== dependencies: - "@material/dialog" "=7.0.0-canary.d92d8c93e.0" - "@material/dom" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/touch-target" "=7.0.0-canary.d92d8c93e.0" + "@material/dialog" "=8.0.0-canary.a78ceb112.0" + "@material/dom" "=8.0.0-canary.a78ceb112.0" + "@material/mwc-base" "^0.17.2" blocking-elements "^0.1.0" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" wicg-inert "^3.0.0" -"@material/mwc-fab@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-fab/-/mwc-fab-0.15.0.tgz#b0bdd664f61250e4f3a593ca8656cdd37bb3a487" - integrity sha512-VejrZQgwAwcV72xOBaROxl3GQVg4nqczaxEZAmhVCJ5DNW58vhd32xmfXAtcySjKEROZbyIo24e3EZp8di/1Xg== +"@material/mwc-fab@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-fab/-/mwc-fab-0.17.2.tgz#837e1aa489b7673a434fa49a3c319e8081721a6a" + integrity sha512-YmN+IlP4sca3dD5kHi79WDaha862QH1FzsgNLuOeL9tz3dE6cmuYZ7v7cok1LZVQOd0oVbGmJsTdfdJsFYMDXg== dependencies: - "@material/fab" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/mwc-icon" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" + "@material/mwc-ripple" "^0.17.2" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-formfield@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-formfield/-/mwc-formfield-0.15.0.tgz#ff06babe3c6aa522e33daf2e9dc507f18896a819" - integrity sha512-LLzG9/35LrHW1rx5pVUmOmpvSZRw8yD3H7HkQvYeTUbEKP7quRj7v+VMFRQkvznYIWMqEudgTFhNyUAD9DrUPQ== +"@material/mwc-formfield@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-formfield/-/mwc-formfield-0.17.2.tgz#b69a9423d4dd7cc83145d7cc7ad5bb0a030fa622" + integrity sha512-3VN0Nzh7IwlknCHcOedLTLIROvkHnjQ6M38kHL9MOZm8DnCTduJ4eYY4sQyoZxtnkZR3E1e4sA8+bnpSj4ggPA== dependencies: - "@material/form-field" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" + "@material/form-field" "=8.0.0-canary.a78ceb112.0" + "@material/mwc-base" "^0.17.2" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-icon-button@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-icon-button/-/mwc-icon-button-0.15.0.tgz#cad5a841ea58ba1f39003ba17f99a6ae55fbd0ac" - integrity sha512-7Xw4uYdMSRWBmviMB0i1BoacX/cnlA3JKT2kKipnXlj1JP0Y8hwLebXn18m0z8TbDhwAQnXuKp6cWSZMgcVcWw== +"@material/mwc-icon-button@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-icon-button/-/mwc-icon-button-0.17.2.tgz#b068c3ea7b6c2e92312ab9ec20baac0cff3dfb20" + integrity sha512-kA0RaOmE35yaTCMlqZT7m6A/lJfcsgBKnutAQlhzHlwANTDbWApVi9CjvvN4568EXlBfvfCEL7oUdMDy219K0Q== dependencies: - "@material/icon-button" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/mwc-icon" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" + "@material/mwc-ripple" "^0.17.2" lit-element "^2.3.0" tslib "^1.10.0" -"@material/mwc-icon@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-icon/-/mwc-icon-0.15.0.tgz#3f4aab00aa137f6f109d42180aeb2dd55f5981a1" - integrity sha512-jKTwh9pNYn/DgQ1jmh3J7cl8CpOz7/seqLs70mURs2pMlbv9DIQiiYYprADExko7aaOwig9+lGmKQlEyLeV6DQ== +"@material/mwc-icon@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-icon/-/mwc-icon-0.17.2.tgz#06f019525001b3e42e18106fc6f321b4c8ca0b3c" + integrity sha512-9EpoLbn82RD5Wsxv0J7o1hTyn+WLfC1tdaTBvDmkRJZhfFheXYKUWNQXWrra0I/BpmojOGvijStOH0rga513WA== dependencies: - "@material/mwc-base" "^0.15.0" lit-element "^2.3.0" tslib "^1.10.0" -"@material/mwc-list@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-list/-/mwc-list-0.15.0.tgz#3f8a9e17f303107ba2cd24dfb95dc5017f8562c9" - integrity sha512-LEjy+nnsL6r6RAqef/zgk9aRIClyOtXp2k73AncHJMFdYhjQfgVNJLl+RChlxTuyCafKclVD+ufQFphD+cPZBw== +"@material/mwc-list@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-list/-/mwc-list-0.17.2.tgz#f09fc4cf1a0ca03d097938c7bcc75682cec39eb3" + integrity sha512-fKGJkfWntNUQxfRSM/G7Zsaq0SD8JsFi730BS7q8X3OlFhuOGGeMP7sY5FtBVX0hjAO1/khp9KKgmvZunUoXkg== dependencies: - "@material/base" "=7.0.0-canary.d92d8c93e.0" - "@material/density" "=7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "=7.0.0-canary.d92d8c93e.0" - "@material/list" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/mwc-checkbox" "^0.15.0" - "@material/mwc-radio" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" - "@material/ripple" "=7.0.0-canary.d92d8c93e.0" - "@material/rtl" "=7.0.0-canary.d92d8c93e.0" - "@material/theme" "=7.0.0-canary.d92d8c93e.0" - "@material/typography" "=7.0.0-canary.d92d8c93e.0" + "@material/base" "=8.0.0-canary.a78ceb112.0" + "@material/list" "=8.0.0-canary.a78ceb112.0" + "@material/mwc-base" "^0.17.2" + "@material/mwc-checkbox" "^0.17.2" + "@material/mwc-radio" "^0.17.2" + "@material/mwc-ripple" "^0.17.2" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-menu@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-menu/-/mwc-menu-0.15.0.tgz#f23eec7fdfd59e7268be6769b1adfc2af2642084" - integrity sha512-LG3VpP34woRMrIJn40bkrEMuv8CXmFJ70GLFEMmNFYp8z53ftIxQ9oL3kz09q0mOwgyThZAKrXJbyluO43NMlg== +"@material/mwc-menu@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-menu/-/mwc-menu-0.17.2.tgz#53cfb5edf6ebc7c9e992a6909f211d529375effd" + integrity sha512-WrQalgdp2NYr/ws5rX9ify8trKiqNUy7tAXlHYAg5qKRb3HpHV6gsmNCScOZ4e95xXJvEOaUp67YDZsma3/rzQ== dependencies: - "@material/menu" "=7.0.0-canary.d92d8c93e.0" - "@material/menu-surface" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/mwc-list" "^0.15.0" + "@material/menu" "=8.0.0-canary.a78ceb112.0" + "@material/menu-surface" "=8.0.0-canary.a78ceb112.0" + "@material/mwc-base" "^0.17.2" + "@material/mwc-list" "^0.17.2" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-radio@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-radio/-/mwc-radio-0.15.0.tgz#629f362ddb951b331c41798214a2d347b446ac6e" - integrity sha512-SbemYU6ZvqUGTNi62yQ6p9GIOBH2WajQFebgEsSCaaxWNJqTQGCh3vw7Wbx+75ZTTjGY6VQL0oeXDKoz2cRwmA== +"@material/mwc-radio@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-radio/-/mwc-radio-0.17.2.tgz#101c41eedcd947f6159f2b3cbdd52d1a6b4bb277" + integrity sha512-+aPdJBUWTfT4pQg7s7g4wDvTvNE9gdBywJICtgaRM5z8NjYoWnF3aZGwb49yz+TAbf6d3ZYwRWPnXYx4sfh/gg== dependencies: - "@material/mwc-base" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" - "@material/radio" "=7.0.0-canary.d92d8c93e.0" + "@material/mwc-base" "^0.17.2" + "@material/mwc-ripple" "^0.17.2" + "@material/radio" "=8.0.0-canary.a78ceb112.0" lit-element "^2.3.0" tslib "^1.10.0" -"@material/mwc-ripple@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-ripple/-/mwc-ripple-0.15.0.tgz#ec451c85671573d42cda9745847b922b053f83f2" - integrity sha512-3elf4ysHoURfdoWRle/0zQ2l7OUSWE7Ah73B/PYr/DgHISmYYUjg2k/K5NSro9UcmshAVnppIujlcZN3GbQIyA== +"@material/mwc-ripple@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-ripple/-/mwc-ripple-0.17.2.tgz#327eb714d1e3445e7c80a2ae92a1e293919c69af" + integrity sha512-rdx/mR9vxPS6ZnM7oWP4E5FGRQ3pgo7n/hGUPcGMxFfXaxaHs1evoIQscp9a6HcXVrLPXemKD6msObwMDKetQA== dependencies: - "@material/dom" "=7.0.0-canary.d92d8c93e.0" - "@material/mwc-base" "^0.15.0" - "@material/ripple" "=7.0.0-canary.d92d8c93e.0" + "@material/dom" "=8.0.0-canary.a78ceb112.0" + "@material/mwc-base" "^0.17.2" + "@material/ripple" "=8.0.0-canary.a78ceb112.0" lit-element "^2.3.0" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-switch@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@material/mwc-switch/-/mwc-switch-0.15.0.tgz#f9f24e57d53df92bd2fd4a65ebde89a8ea4aa177" - integrity sha512-z4bOJgm9PYACk6JtFCQWMHpfO3HQOALmnV4EUDrUL4628oGcIfa3VJPeINDAoNzjwIvjY5EtoGKWEBDJpFnrfw== +"@material/mwc-switch@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-switch/-/mwc-switch-0.17.2.tgz#4bdff3f981958cb0b396bc38a8b27f094fc0195c" + integrity sha512-HgNYKKAKcVEOxVeIoHtvYd5Y7Pb3laHRSKX9cLgKivUgwjBx62QdU0q8KcqQAySklI+6MUXAMqofZj8eggkCzw== dependencies: - "@material/mwc-base" "^0.15.0" - "@material/mwc-ripple" "^0.15.0" - "@material/switch" "=7.0.0-canary.d92d8c93e.0" + "@material/mwc-base" "^0.17.2" + "@material/mwc-ripple" "^0.17.2" + "@material/switch" "=8.0.0-canary.a78ceb112.0" lit-element "^2.3.0" tslib "^1.10.0" -"@material/progress-indicator@7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-7.0.0-canary.d92d8c93e.0.tgz#e49e3d22ed594f53624eae5c8b82b19fa13e93d8" - integrity sha512-ibwqKAKd8xJqN2SceGo7fsjwdy7E2yjmP8V3ASUqUnK+MXepKoxdjfj+pXBAuCwNy8ehx1b4HzYq7LA20PKWKw== +"@material/progress-indicator@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-8.0.0-canary.a78ceb112.0.tgz#70a769d413910daf8ea1c4d51712487e381eaeab" + integrity sha512-r54SULT+K9TfvsMmBf4fkUFrblRmBssCEzqQD9DN/La3iidsWmhmId7wEuUukYtmFEQyIZUFo1Q9sqMlfyCCow== dependencies: tslib "^1.9.3" -"@material/radio@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/radio/-/radio-7.0.0-canary.d92d8c93e.0.tgz#bf112f224cc3f3d64021e2ba45def87203dfc3fe" - integrity sha512-ldDuoAMGy0bDNmIiYIro/N4XdoFERgM+7sJ+eHSlXUvR9Tl/YDkkGHvjRmEcl9E2CwjI9Oa3tPlj5dkggIBMGA== +"@material/radio@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-8.0.0-canary.a78ceb112.0.tgz#82ff41946e3cfc34af7a056f242700d34e00eda2" + integrity sha512-wjJ4MP9In0mhh+vafraFeuVa/M8HImwpFPzIkgH7TcSS4yIPK3KnTK5RHyWWEUA+Lk3DK02B8VRCqNPjRUhUBQ== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" - "@material/touch-target" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/touch-target" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/ripple@7.0.0-canary.d92d8c93e.0", "@material/ripple@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-7.0.0-canary.d92d8c93e.0.tgz#f617d942cecce3f219a15e46d0e540bde355e5f5" - integrity sha512-lnusvG5+xsaNsmj4MbUdzKeATzJ9uY8oWwSIApxyj4JOoHZzgwtkp/FTxri/rT0nE9wK7+h1oh+bEgZn7VCkZw== +"@material/ripple@8.0.0-canary.a78ceb112.0", "@material/ripple@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-8.0.0-canary.a78ceb112.0.tgz#98f03a91f42d730a0a6ef72f8025c4e27d09d500" + integrity sha512-0vftc/VRNBGNkVeaumc+ztN6cPUDUXL0+X1HQSuNGn4tS0slqQH6yi9+juZhteOGY9Ca+1D3agsB7H9eNzdM8Q== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/rtl@7.0.0-canary.d92d8c93e.0", "@material/rtl@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-7.0.0-canary.d92d8c93e.0.tgz#23b16cee381f52d31a25a424bbb921a3b23ba266" - integrity sha512-HmxYd7BKsR37QZQWX7lrZepvaZGCc9kJn5CBv3b8d9i3Oo+m6aJttDU/U0f7QNBTNBD+kLAlTL9pDd9CgvsYuQ== - -"@material/shape@7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/shape/-/shape-7.0.0-canary.d92d8c93e.0.tgz#85f3b60118dec525260dca048ec351520bb14b0f" - integrity sha512-ymVfwUsitJWLpUtsn4bjJo0+cvfkAWvjQbwFj7mDViF3FvLwZEp1pHeuuciso+YDYo4l3NAz/fG/xAy+FBMTfw== +"@material/rtl@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-8.0.0-canary.a78ceb112.0.tgz#1e2f515735c96afaace5c91aac14c168c6270e9a" + integrity sha512-+R/yFoO1Olt9hY0nvWRbTIQ7/PG9r7iv35J2Ld3Gx6CNZM2utql16bOG+5Ec81C6gBdvlgBcrCdQ8NdgYiablA== dependencies: - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" -"@material/switch@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/switch/-/switch-7.0.0-canary.d92d8c93e.0.tgz#b8f293b3a38c39a0f41e2d44163c45d2bd57a7d0" - integrity sha512-wWgObFNBl5oSnUZ+I3jZydQFmuv+H1sgBwSxdDTw0MJG/snZYX5V8KastUbqyG/uzuXnAtUNnhHLlPEmLDW/QQ== +"@material/shape@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-8.0.0-canary.a78ceb112.0.tgz#b652e07486250b36346246c4db07d5b2dab3e145" + integrity sha512-82fYRqdoBoFyS9+zuqqd9YJrsw8XykLA2xEf/ybtRGifwbLlk8ACrGN9dEwX6ixl7gt+JsXKBR9piF4XvxVjaw== dependencies: - "@material/animation" "7.0.0-canary.d92d8c93e.0" - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/density" "7.0.0-canary.d92d8c93e.0" - "@material/dom" "7.0.0-canary.d92d8c93e.0" - "@material/elevation" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/ripple" "7.0.0-canary.d92d8c93e.0" - "@material/rtl" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + +"@material/switch@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-8.0.0-canary.a78ceb112.0.tgz#bb735bfc32cfe0a5959ece836976d9706bfbf96a" + integrity sha512-Bu2Q8bjUCry4CAGLaaPQ83ID4xHp7BZyC3tJCvSbdX5qb7NGDDquTSIQ5YlJub5yfKPOyzHvBzbhmzFMym0j0g== + dependencies: + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" -"@material/theme@7.0.0-canary.d92d8c93e.0", "@material/theme@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-7.0.0-canary.d92d8c93e.0.tgz#24da57015cba9d4759dade806a0ce92e10bf937a" - integrity sha512-Qx1ZPWDQVzE2adGGuVZ3wT0/jXvF8dW2Vei3oIbe52jNmHKS81ZMPgkHlYonKX5v53nKuxEdMIclZcFaEoBZWQ== +"@material/theme@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-8.0.0-canary.a78ceb112.0.tgz#0a32294d806f16ebfab42025d35056a6954863a0" + integrity sha512-/hBvqcXYDuCG0nWEJ8uYsM/XxrCE4EHcel7N6WYwZDRHlPfKQis3qPEJCJicdHckVFdOUvGr9KO2h5BWUNA90Q== dependencies: - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" -"@material/touch-target@7.0.0-canary.d92d8c93e.0", "@material/touch-target@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-7.0.0-canary.d92d8c93e.0.tgz#90c568ae9fcf083ddeb00dc1930ea722c39177b6" - integrity sha512-md7J3xLYHej2k2yQy/T7SJRCf9nOKsn7J8ufWsamy6HvGXOCvZivFlf70eDbdz7wUQiG0H6kT5KywQtdP16uvQ== +"@material/touch-target@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-8.0.0-canary.a78ceb112.0.tgz#dcacd182c99e3eae5547ffe26bc758fca252cfae" + integrity sha512-ZnwbC6Cd5Z5Fep1GGQozL5GQXbSSwNehdIbyOs5nDJCFikJIX5DYlYHVFvwhzB/rexhTzGQPaKLjUPUhYXGpoA== dependencies: - "@material/base" "7.0.0-canary.d92d8c93e.0" - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" -"@material/typography@7.0.0-canary.d92d8c93e.0", "@material/typography@=7.0.0-canary.d92d8c93e.0": - version "7.0.0-canary.d92d8c93e.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-7.0.0-canary.d92d8c93e.0.tgz#5523b743ed8a86156627264f2546f32c000538bd" - integrity sha512-R7oAH4hi8EASn3Vetl+ZYIZkYQ6Cq2zVEE5zb1Iy6ELtwEL63lcb2oXEkvnTTYrS/XkQA7o4bs/HUAM+ojWECA== +"@material/typography@8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-8.0.0-canary.a78ceb112.0.tgz#15b17f1c2a7c86406221317ff8f7f0f455fe2410" + integrity sha512-8OaNJzeVeYAxwWUjHR1QSxc6n68gL+xBQ2MYncStyyoHnaAL184OCGbPob2+11wuAmkE3XRnl7WdmVt2TtPu4Q== dependencies: - "@material/feature-targeting" "7.0.0-canary.d92d8c93e.0" - "@material/theme" "7.0.0-canary.d92d8c93e.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" "@mdi/js@4.9.95": version "4.9.95" From 351962475fad249f5753a21bed1944cb455251f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Z=C3=A1hradn=C3=ADk?= Date: Thu, 2 Jul 2020 23:18:40 +0200 Subject: [PATCH 03/58] Custom Door controls (#6195) --- src/components/ha-cover-controls.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/ha-cover-controls.js b/src/components/ha-cover-controls.js index 3cf69923d3..1849439d4a 100644 --- a/src/components/ha-cover-controls.js +++ b/src/components/ha-cover-controls.js @@ -65,6 +65,7 @@ class HaCoverControls extends PolymerElement { computeOpenIcon(stateObj) { switch (stateObj.attributes.device_class) { case "awning": + case "door": case "gate": return "hass:arrow-expand-horizontal"; default: @@ -75,6 +76,7 @@ class HaCoverControls extends PolymerElement { computeCloseIcon(stateObj) { switch (stateObj.attributes.device_class) { case "awning": + case "door": case "gate": return "hass:arrow-collapse-horizontal"; default: From cc528e41cf7f0a3ba0917fb4216d39e051e51f6a Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 3 Jul 2020 00:32:26 +0000 Subject: [PATCH 04/58] [ci skip] Translation update --- translations/frontend/cs.json | 1 + translations/frontend/en.json | 4 ++++ translations/frontend/fr.json | 28 ++++++++++++++++++++++-- translations/frontend/ko.json | 1 + translations/frontend/lt.json | 41 ++++++++++++++++++++++++++++++++++- translations/frontend/pl.json | 7 +++--- translations/frontend/pt.json | 25 +++++++++++++-------- 7 files changed, 92 insertions(+), 15 deletions(-) diff --git a/translations/frontend/cs.json b/translations/frontend/cs.json index d89e99aadb..e3c9659867 100644 --- a/translations/frontend/cs.json +++ b/translations/frontend/cs.json @@ -1431,6 +1431,7 @@ "delete_confirm": "Opravdu chcete odstranit tuto integraci?", "device_unavailable": "zařízení není k dispozici", "devices": "{count} {count, plural,\n one {zařízení}\n other {zařízení}\n}", + "documentation": "Dokumentace", "entities": "{count} {count, plural,\n one {entita}\n other {entit}\n}", "entity_unavailable": "entita není k dispozici", "firmware": "Firmware: {version}", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index d66d8e20c7..0533854e00 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -2678,6 +2678,10 @@ "not_used": "Has never been used", "token_title": "Refresh token for {clientId}" }, + "suspend": { + "description": "Should we close the connection to the server after being hidden for 5 minutes?", + "header": "Automatically close connection" + }, "themes": { "dropdown_label": "Theme", "error_no_theme": "No themes available.", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 234dde16f8..55c7cba8f7 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -48,6 +48,19 @@ "none": "Aucun", "sleep": "Veille" } + }, + "humidifier": { + "mode": { + "auto": "Auto", + "away": "Absent", + "baby": "Bébé", + "boost": "Boost", + "comfort": "Confort", + "eco": "Éco", + "home": "Présent", + "normal": "Normal", + "sleep": "Sommeil" + } } }, "state_badge": { @@ -388,6 +401,12 @@ "reverse": "Sens inverse", "speed": "Vitesse" }, + "humidifier": { + "humidity": "Humidité cible", + "mode": "Mode", + "on_entity": "{name} on", + "target_humidity_entity": "{name} humidité cible" + }, "light": { "brightness": "Luminosité", "color_temperature": "Température de couleur", @@ -870,8 +889,8 @@ "label": "Pas" }, "numeric_state": { - "above": "Au-Dessus", - "below": "En-Dessous", + "above": "Au dessus de", + "below": "En-dessous de", "label": "Valeur numérique", "value_template": "Contenu du modèle (optionnel)" }, @@ -1412,6 +1431,7 @@ "delete_confirm": "Êtes-vous sûr de vouloir supprimer cette intégration?", "device_unavailable": "appareil indisponible", "devices": "{count} {count, plural,\n zero {appareil}\n one {appareil}\n other {appareils}\n}", + "documentation": "Documentation", "entities": "{count} {count, plural,\n zero {entité}\n one {entité}\n other {entités}\n}", "entity_unavailable": "entité indisponible", "firmware": "Firmware: {version}", @@ -2198,6 +2218,10 @@ "description": "La carte de pile horizontale vous permet d'empiler plusieurs cartes, de sorte qu'elles soient toujours côte à côte dans l'espace d'une colonne.", "name": "Pile horizontale" }, + "humidifier": { + "description": "La carte humidificateur donne le contrôle de votre entité humidificateur. Vous permettant de modifier l'humidité et le mode de l'entité.", + "name": "Humidificateur" + }, "iframe": { "description": "La carte Page Web vous permet d'intégrer votre page Web préférée directement dans Home Assistant.", "name": "Page Web" diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index dba4fdec40..5d3084a0e0 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -1431,6 +1431,7 @@ "delete_confirm": "이 통합 구성요소를 제거하시겠습니까?", "device_unavailable": "기기 사용불가", "devices": "{count} {count, plural,\none {기기}\nother {기기}\n}", + "documentation": "관련문서", "entities": "{count} {count, plural,\none {구성요소}\nother {구성요소}\n}", "entity_unavailable": "구성요소 사용불가", "firmware": "펌웨어: {version}", diff --git a/translations/frontend/lt.json b/translations/frontend/lt.json index cc0a53ba9f..568dd51c70 100644 --- a/translations/frontend/lt.json +++ b/translations/frontend/lt.json @@ -181,6 +181,13 @@ "active": "aktyvus", "paused": "pristabdytas" }, + "weather": { + "clear-night": "Giedra naktis", + "cloudy": "Debesuota", + "partlycloudy": "Nepastoviai debesuota", + "sunny": "Saulėta", + "windy": "Vėjuota" + }, "zwave": { "query_stage": { "dead": " ({query_stage})", @@ -192,6 +199,25 @@ "card": { "alarm_control_panel": { "arm_custom_bypass": "Individualizuotas apėjimas" + }, + "weather": { + "attributes": { + "air_pressure": "Atmosferos slėgis", + "humidity": "Santykinė oro drėgmė", + "temperature": "Temperatūra", + "wind_speed": "Vėjo greitis" + }, + "cardinal_direction": { + "e": "R", + "n": "Š", + "ne": "ŠR", + "nw": "ŠV", + "s": "P", + "se": "PR", + "sw": "PV", + "w": "V" + }, + "forecast": "Prognozė" } }, "common": { @@ -428,8 +454,17 @@ "question_trust": "Ar pasitikite išoriniu skydeliu {name} adresu {link}?" } }, + "history": { + "ranges": { + "today": "Šiandien", + "yesterday": "Vakar" + } + }, "logbook": { - "period": "Laikotarpis" + "period": "Laikotarpis", + "ranges": { + "today": "Šiandien" + } }, "lovelace": { "cards": { @@ -541,6 +576,10 @@ "header": "Keisti slaptažodį", "new_password": "Naujas slaptažodis" }, + "language": { + "dropdown_label": "Kalba", + "header": "Kalba" + }, "mfa_setup": { "close": "Uždaryti", "title_aborted": "Nutraukta" diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index ab994f8749..a83ea6a983 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -1431,6 +1431,7 @@ "delete_confirm": "Czy na pewno chcesz usunąć tę integrację?", "device_unavailable": "urządzenie niedostępne", "devices": "{count} {count, plural,\n one {urządzenie}\n few {urządzenia}\n many {urządzeń}\n other {urządzeń}\n}", + "documentation": "Dokumentacja", "entities": "{count} {count, plural,\n one {encja}\n few {encje}\n many {encji}\n other {encji}\n}", "entity_unavailable": "encja niedostępna", "firmware": "oprogramowanie: {version}", @@ -1583,7 +1584,7 @@ } }, "mqtt": { - "button": "Konfiguruj", + "button": "Konfiguracja", "description_listen": "Nasłuch tematu", "description_publish": "Opublikuj pakiet", "listening_to": "Nasłuchiwanie...", @@ -1784,7 +1785,7 @@ "caption": "Dodaj urządzenia", "description": "Dodaj urządzenia do sieci Zigbee" }, - "button": "Konfiguruj", + "button": "Konfiguracja", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atrybuty wybranego klastra", @@ -1905,7 +1906,7 @@ "no_zones_created_yet": "Wygląda na to, że nie utworzyłeś jeszcze żadnych stref." }, "zwave": { - "button": "Konfiguruj", + "button": "Konfiguracja", "caption": "Z-Wave", "common": { "index": "Indeks", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index d25874f22f..4223f46171 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -519,6 +519,11 @@ "clear": "Limpar", "show_areas": "Mostrar áreas" }, + "date-range-picker": { + "end_date": "Data de fim", + "select": "Selecione", + "start_date": "Data de início" + }, "device-picker": { "clear": "Apagar", "device": "Dispositivo", @@ -706,10 +711,10 @@ }, "zha_device_info": { "buttons": { - "add": "Adicionar Dispositivos", + "add": "Adicionar dispositivos através deste dispositivo", "reconfigure": "Reconfigurar Dispositivo", "remove": "Remover Dispositivo", - "zigbee_information": "Informação Zigbee" + "zigbee_information": "Assinatura do dispositivo Zigbee" }, "confirmations": { "remove": "Tem a certeza que deseja remover este dispositivo?" @@ -729,7 +734,7 @@ "unknown": "Desconhecido", "zha_device_card": { "area_picker_label": "Área", - "device_name_placeholder": "Nome do utilizador", + "device_name_placeholder": "Alterar o nome do dispositivo", "update_name_button": "Atualizar Nome" } } @@ -1076,7 +1081,7 @@ }, "integrations": "Integrações", "integrations_introduction": "As integrações para o Home Assistant Cloud permitem-lhe ligar-se aos serviços na nuvem sem ter de expor publicamente o seu Home Assistant na Internet.", - "integrations_introduction2": "Consulte o site para ", + "integrations_introduction2": "Consulte o site para", "integrations_link_all_features": " todas as funcionalidades disponíveis", "manage_account": "Gerir conta", "nabu_casa_account": "Conta Nabu Casa", @@ -1185,7 +1190,7 @@ "information2": "A avaliação gratuita dará acesso a todos os benefícios do Home Assistant Cloud, incluindo:", "information3": "Este serviço é executado pelo nosso parceiro", "information3a": ", uma empresa criada pelos fundadores do Home Assistant e do Hass.io.", - "information4": "Ao registrar uma conta, concorda com os seguintes termos e condições.", + "information4": "Ao registar uma conta, concorda com os seguintes termos e condições.", "link_privacy_policy": "Política de privacidade", "link_terms_conditions": "Termos e condições", "password": "Palavra-passe", @@ -1283,7 +1288,7 @@ "device_not_found": "Dispositivo não encontrado.", "entities": { "add_entities_lovelace": "Adicionar ao Lovelace", - "disabled_entities": "+{count} {count, plural,\n uma {entity}\n outras {entities}\n}", + "disabled_entities": "+{count} {count, plural,\n one {entidade inactiva}\n other {entidades inactivas}\n}", "entities": "Entidades", "hide_disabled": "Mostrar entidades desativadas", "none": "Este dispositivo não possui entidades" @@ -1338,6 +1343,7 @@ "button": "Remover selecionado", "confirm_partly_text": "Você pode remover apenas {removable} das {selected} entidades selecionadas. As entidades só podem ser removidas quando a integração deixar de suportá-las. Por vezes é necessário reiniciar o Home Assistant antes de poder remover as entidades de uma integração removida. Tem a certeza de que deseja remover as entidades removíveis?", "confirm_partly_title": "Somente {número} entidades selecionadas podem ser removidas.", + "confirm_text": "Deve remover da configuração do Lovelace e das automações se contêm estas entidades", "confirm_title": "Deseja remover {number} entidades?" }, "selected": "Selecionou {number}", @@ -1406,8 +1412,9 @@ "delete_button": "Apagar {integration}", "delete_confirm": "Tem a certeza que pretende apagar esta integração?", "device_unavailable": "Dispositivo indisponível", - "devices": "{count} {count, plural,\n um {entity}\n outros {entities}\n}", - "entities": "{count} {count, plural,\n uma {entity}\n outras {entities}\n}", + "devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}", + "documentation": "Documentação", + "entities": "{count} {count, plural,\n one {entidade}\n other {entidades}\n}", "entity_unavailable": "Entidade indisponível", "firmware": "Firmware: {version}", "hub": "Conectado via", @@ -1679,7 +1686,7 @@ "group": "Recarregar grupos", "heading": "A recarregar a configuração YAML", "input_datetime": "Recarregar input date times", - "input_select": "Recarregar da", + "input_select": "Recarregar input selects", "introduction": "Algumas partes do Home Assistant podem ser recarregadas sem a necessidade de reiniciar. Ao carregar em Recarregar a configuração irá descartar a configuração atual e carregar a nova.", "person": "Recarregar pessoas", "scene": "Recarregar cenas", From a71c22bedd502d6f593fc9c81797f49f5790014a Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 4 Jul 2020 00:32:24 +0000 Subject: [PATCH 05/58] [ci skip] Translation update --- translations/frontend/ca.json | 6 +- translations/frontend/es.json | 4 + translations/frontend/fr.json | 3 + translations/frontend/he.json | 13 +- translations/frontend/ko.json | 10 +- translations/frontend/lv.json | 255 ++++++++++++++++++++++++++--- translations/frontend/pt.json | 55 ++++++- translations/frontend/vi.json | 51 +++++- translations/frontend/zh-Hant.json | 4 + 9 files changed, 362 insertions(+), 39 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index f28caf3ae0..0b9246869e 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1465,7 +1465,7 @@ }, "configure": "Configurar", "configured": "Configurades", - "description": "Gestionar i configurar integracións", + "description": "Gestiona i configura les integracions", "details": "Detalls de la integració", "discovered": "Descobertes", "home_assistant_website": "lloc web de Home Assistant", @@ -2678,6 +2678,10 @@ "not_used": "Mai no s'ha utilitzat", "token_title": "Token d'actualització de {clientId}" }, + "suspend": { + "description": "Tancar la connexió amb el servidor després d'haver estat ocult durant 5 minuts?", + "header": "Tanca la connexió automàticament" + }, "themes": { "dropdown_label": "Tema", "error_no_theme": "No hi ha temes disponibles.", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 9f4537b1cc..23a42ebbfd 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -2678,6 +2678,10 @@ "not_used": "Nunca ha sido usado", "token_title": "Actualizar token para {clientId}" }, + "suspend": { + "description": "¿Deberíamos cerrar la conexión con el servidor después de estar oculto durante 5 minutos?", + "header": "Cerrar automáticamente la conexión" + }, "themes": { "dropdown_label": "Tema", "error_no_theme": "No hay temas disponibles", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 55c7cba8f7..258e5fdafa 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -2678,6 +2678,9 @@ "not_used": "N'a jamais été utilisé", "token_title": "Actualiser le jeton de {clientId}" }, + "suspend": { + "header": "Fermer automatiquement la connexion" + }, "themes": { "dropdown_label": "Thème", "error_no_theme": "Aucun thème disponible.", diff --git a/translations/frontend/he.json b/translations/frontend/he.json index 1783a8686d..062d5d5618 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -21,7 +21,7 @@ "map": "מפה", "profile": "פרופיל", "shopping_list": "רשימת קניות", - "states": "סקירה כללית" + "states": "ראשי" }, "state_attributes": { "climate": { @@ -1431,6 +1431,7 @@ "delete_confirm": "האם אתה בטוח שברצונך למחוק אינטגרציה זו?", "device_unavailable": "מכשיר אינו זמין", "devices": "{count} {count, plural,\n one {device}\n other {devices}\n}", + "documentation": "תיעוד", "entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}", "entity_unavailable": "ישות לא זמינה", "firmware": "קושחה: {version}", @@ -2187,7 +2188,7 @@ "icon_height": "גובה אייקון", "image": "נתיב תמונה", "manual": "ידני", - "manual_description": "צריך להוסיף כרטיס מותאם אישית או פשוט רוצה לכתוב באופן ידני את yaml?", + "manual_description": "צריך להוסיף כרטיס מותאם אישית או פשוט רוצה לכתוב באופן ידני את ה-yaml?", "maximum": "מקסימום", "minimum": "מינימום", "name": "שם", @@ -2347,9 +2348,9 @@ "confirm_unsaved_changes": "יש לך שינויים שלא נשמרו, אתה בטוח שברצונך לצאת?", "confirm_unsaved_comments": "התצורה שלך מכילה הערות, אלה לא יישמרו. האם אתה רוצה להמשיך?", "error_invalid_config": "התצורה שלך אינה תקפה: {error}", - "error_parse_yaml": "לא ניתן לנתח את YAML: {error}", + "error_parse_yaml": "לא ניתן לנתח את ה-YAML: {error}", "error_remove": "לא ניתן להסיר את הקונפיגורציה: {error}", - "error_save_yaml": "אין אפשרות לשמור את YAML: {error}", + "error_save_yaml": "אין אפשרות לשמור את ה-YAML: {error}", "header": "עריכת קונפיגורציה", "resources_moved": "אין להוסיף עוד משאבים לתצורת Lovelace אך ניתן להוסיף אותם בלוח התצורה של Lovelace.", "save": "שמור", @@ -2677,6 +2678,10 @@ "not_used": "לא היה בשימוש", "token_title": "אסימון רענון עבור {clientId}" }, + "suspend": { + "description": "האם עלינו לסגור את החיבור לשרת לאחר שהוסתרנו במשך 5 דקות?", + "header": "סגור חיבור באופן אוטומטי" + }, "themes": { "dropdown_label": "ערכת נושא", "error_no_theme": "אין ערכות נושא זמינות.", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index 5d3084a0e0..17de7351c6 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -646,7 +646,7 @@ "pattern": "클라이언트 측 검증을 위한 정규표현식", "text": "텍스트" }, - "platform_not_loaded": "{platform} 통합 구성요소가 로드되지 않았습니다. 'default_config:' 또는 \"{platform}:\" 을 추가하여 구성을 추가해주세요.", + "platform_not_loaded": "{platform} 통합 구성요소가 로드되지 않았습니다. 'default_config:' 또는 \"{platform}:\" 을 configuration.yaml 에 추가해주세요.", "required_error_msg": "이 입력란은 필수 요소입니다", "yaml_not_editable": "이 구성요소의 설정은 UI 에서 편집할 수 없습니다. UI 에서 설정한 구성요소만 UI 에서 구성할 수 있습니다." }, @@ -2219,8 +2219,8 @@ "name": "수평 모아보기" }, "humidifier": { - "description": "가습기 카드는 가습 기기를 제어합니다. 구성요소의 가습 모드를 변경할 수 있습니다.", - "name": "가습기" + "description": "습도 조절기 카드는 가습 및 제습 기기와 같은 습도 조절기기를 제어합니다. 구성요소의 습도 조절 모드를 변경할 수 있습니다.", + "name": "습도 조절기" }, "iframe": { "description": "웹 페이지 카드를 사용하면 즐겨 찾는 웹 페이지를 Home Assistant 에 삽입할 수 있습니다.", @@ -2678,6 +2678,10 @@ "not_used": "사용된 적이 없음", "token_title": "{clientId} 의 리프레시 토큰" }, + "suspend": { + "description": "Home Assistant UI 가 5분 동안 보이지 않는 경우 서버와의 연결을 종료시킬까요?", + "header": "자동 연결 종료" + }, "themes": { "dropdown_label": "테마", "error_no_theme": "사용할 수 있는 테마가 없습니다.", diff --git a/translations/frontend/lv.json b/translations/frontend/lv.json index 51b27da212..649bb7cbb0 100644 --- a/translations/frontend/lv.json +++ b/translations/frontend/lv.json @@ -329,8 +329,8 @@ "ui": { "auth_store": { "ask": "Vai vēlaties saglabāt šo pieteikšanos?", - "confirm": "Saglabāt pieteikšanos", - "decline": "Nē, paldies" + "confirm": "Jā", + "decline": "Nē" }, "card": { "alarm_control_panel": { @@ -460,7 +460,7 @@ } }, "common": { - "back": "Tilbake", + "back": "Atpakaļ", "cancel": "Atcelt", "loading": "Ielāde", "no": "Nē", @@ -476,6 +476,11 @@ }, "clear": "Notīrīt" }, + "date-range-picker": { + "end_date": "Beigu datums", + "select": "Pielietot", + "start_date": "Sākuma datums" + }, "device-picker": { "clear": "Notīrīt", "device": "Ierīce" @@ -491,8 +496,15 @@ "no_history_found": "Vēsturiskie ieraksti par stāvokli netika atrasti." }, "related-items": { + "area": "Apgabals", + "automation": "Izmantojas automatizācijās", "device": "Ierīce", - "integration": "Integrācija" + "entity": "Saistītās vienības", + "group": "Iekļauta grupās", + "integration": "Integrācija", + "no_related_found": "Nekādas saistības nav atrastas.", + "scene": "Izmantojas ainās", + "script": "Izmantojas skriptos" }, "relative_time": { "duration": { @@ -515,12 +527,23 @@ "update": "Atjaunināt" }, "entity_registry": { + "dismiss": "Aizvērt", "editor": { - "delete": "DZĒST", + "confirm_delete": "Vai tiešām vēlaties dzēst šo vienību?", + "delete": "Dzēst", + "enabled_cause": "Atspējots dēļ {cause}.", + "enabled_description": "Atspējotās vienības netiks pievienotas Home Assistant.", + "enabled_label": "Iespējot vienību", + "entity_id": "Vienības ID", + "icon": "Pielāgota ikona", + "icon_error": "Ikonām jābūt formātā “prefikss:nosaukums”, piemēram, “mdi:home”", "name": "Nosaukuma pārlabošana", "note": "Ievērībai: pašlaik tas var nedarboties ar visām integrācijām.", - "unavailable": "Šī vienība pašlaik nav pieejama." + "unavailable": "Šī vienība pašlaik nav pieejama.", + "update": "Atjaunināt" }, + "no_unique_id": "Šai vienībai nav unikāla ID, tāpēc tās iestatījumus nevar pārvaldīt, izmantojot lietotāja saskarni.", + "related": "Saistības", "settings": "Iestatījumi" }, "generic": { @@ -529,18 +552,40 @@ }, "helper_settings": { "generic": { - "icon": "Ikona" + "icon": "Ikona", + "name": "Nosaukums" + }, + "input_datetime": { + "date": "Datums", + "datetime": "Datums un laiks", + "mode": "Ko vēlaties ievadīt", + "time": "Laiks" + }, + "input_number": { + "box": "Ievades lauks", + "max": "Maksimālā vērtība", + "min": "Minimālā vērtība", + "mode": "Rādīšanas režīms", + "step": "Soļa lielums", + "unit_of_measurement": "Mērvienība" }, "input_select": { "add": "Pievienot", "add_option": "Pievienot iespēju", + "no_options": "Vēl nav nevienas opcijas", "options": "Iespējas" }, "input_text": { + "max": "Maksimālais garums", + "min": "Minimālais garums", + "mode": "Rādīšanas režīms", "password": "Parole", + "pattern": "Regex izteiksme klienta puses validācijai", "text": "Teksts" }, - "required_error_msg": "Šis lauks ir obligāts" + "platform_not_loaded": "{platform} integrācija nav ielādēta. Lūdzu, pievienojiet 'default_config:' vai ''{platform}:'' savā konfigurācijā.", + "required_error_msg": "Šis lauks ir obligāts", + "yaml_not_editable": "Šīs vienības iestatījumus nevar rediģēt, izmantojot lietotāja saskarni. Tikai lietotāja saskarnē iestatītie vienumi ir konfigurējami no lietotāja saskarnes." }, "more_info_control": { "dismiss": "Aizvērt dialogu", @@ -632,7 +677,7 @@ "editor": { "create": "IZVEIDOT", "delete": "DZĒST", - "name": "Navn", + "name": "Nosaukums", "update": "ATJAUNINĀT" }, "picker": { @@ -863,6 +908,9 @@ "delete_confirm": "Vai tiešām vēlaties dzēst šo automatizāciju?", "edit_automation": "Rediģēt automatizāciju", "header": "Automatizāciju redaktors", + "headers": { + "name": "Nosaukums" + }, "introduction": "Automatizācijas redaktors ļauj jums izveidot un rediģēt automatizācijas. Lūdzu, sekojiet saitei zemāk, lai pārliecinātos, ka esat pareizi konfigurējis Home Assistant.", "learn_more": "Uzziniet vairāk par automatizācijām", "no_automations": "Mēs nevarējām atrast rediģējamas automatizācijas", @@ -913,7 +961,9 @@ "edit_requires_storage": "Redaktors ir atspējots, jo konfigurācija ir definēta configuration.yaml.", "elevation": "Augstums", "elevation_meters": "metri", + "external_url": "Ārējais URL", "imperial_example": "Fārenheita, mārciņas", + "internal_url": "Iekšējais URL", "latitude": "Platums", "location_name": "Jūsu Home Assistant instalācijas nosaukums", "longitude": "Garums", @@ -930,12 +980,16 @@ } }, "customize": { + "attributes_customize": "Šie atribūti jau ir iestatīti customize.yaml konfigurācijā", "attributes_not_set": "Šie atribūti netika iestatīti. Iestatiet tos, ja vēlaties.", + "attributes_outside": "Šie atribūti tiek pielāgoti ārpus customize.yaml", "attributes_override": "Varat pārlabot pēc savas patikas.", + "attributes_set": "Šie vienības atribūti ir iestatīti programmatiski.", "caption": "Pielāgojumi", "description": "Pielāgojiet jūsu iekārtas", "pick_attribute": "Izvēlieties atribūtu, kuru pārlabot", "picker": { + "entity": "Vienība", "header": "Pielāgojumi", "introduction": "Uzlabojiet atribūtus katrai vienībai. Pievienotie jeb mainīties pielāgojumi stāsies spēkā nekavējoties. Noņemtie pielāgojumi stāsies spēkā, kad vienība tiks atjaunināta." }, @@ -944,7 +998,21 @@ } }, "devices": { + "automation": { + "automations": "Automatizācijas", + "conditions": { + "caption": "Darīt kaut ko tikai tad, ja ..." + }, + "create": "Izveidot automatizāciju ar ierīci", + "no_automations": "Nav automatizāciju", + "no_device_automations": "Šai ierīcei nav pieejamas automatizācijas", + "triggers": { + "caption": "Darīt kaut ko tad, kad ..." + } + }, + "cant_edit": "Rediģējamas ir tikai tās vienības, kas izveidotas, izmantojot lietotāja saskarni.", "caption": "Ierīces", + "confirm_delete": "Vai tiešām vēlaties izdzēst šo ierīci?", "confirm_rename_entity_ids": "Vai vēlaties pārdēvēt arī vienības ID no Jūsu vinībām?", "data_table": { "area": "Apgabals", @@ -952,10 +1020,35 @@ "device": "Ierīce", "integration": "Integrācija", "manufacturer": "Ražotājs", - "model": "Modelis" + "model": "Modelis", + "no_area": "Apgabals nav norādīts", + "no_devices": "Nav ierīču" }, + "delete": "Dzēst", "description": "Pievienoto ierīču pārvaldība", + "device_info": "Informācija par ierīci", "device_not_found": "Ierīce nav atrasta.", + "entities": { + "add_entities_lovelace": "Pievienot Lovelace", + "disabled_entities": "+{count} {count, plural,\n one {atspējota ierīce}\n other {atspējotas ierīces}\n}", + "entities": "Vienības", + "hide_disabled": "Slēpt atspējotās", + "none": "Šai ierīcei nav vienību" + }, + "name": "Nosaukums", + "no_devices": "Nav ierīču", + "scene": { + "create": "Izveidot ainu ar ierīci", + "no_scenes": "Nav ainas", + "scenes": "Ainas" + }, + "scenes": "Ainas", + "script": { + "create": "Izveidot skriptu ar ierīci", + "no_scripts": "Nav skriptu", + "scripts": "Skripti" + }, + "scripts": "Skripti", "unknown_error": "Nezināma kļūda", "unnamed_device": "Nenosaukta ierīce", "update": "Atjaunināt" @@ -994,7 +1087,7 @@ "confirm_text": "Vienības var noņemt tikai tad, kad tās vairs nerada attiecīgā integrācija.", "confirm_title": "Vai vēlaties noņemt {number} vienības?" }, - "selected": "{numurs} atlasītas", + "selected": "{number} atlasītas", "status": { "disabled": "Atspējota", "ok": "Labi", @@ -1005,21 +1098,47 @@ }, "header": "Home Assistant konfigurēšana", "helpers": { + "caption": "Palīgi", + "description": "Elementi, kas var palīdzēt automatizāciju veidošanā", "dialog": { + "add_helper": "Pievienot palīgu", + "add_platform": "Pievienot {platform}", "create": "Izveidot" }, "picker": { + "add_helper": "Pievienot palīgu", "headers": { + "editable": "Rediģējams", + "entity_id": "Vienības ID", + "name": "Nosaukums", "type": "Veids" } }, "types": { + "input_boolean": "Pārslēdzējs", + "input_datetime": "Datums un/vai laiks", + "input_number": "Skaitlis", + "input_select": "Izkrītošā izvēlne", "input_text": "Teksts" } }, "info": { + "built_using": "Veidots, izmantojot", + "caption": "Informācija", + "custom_uis": "Pielāgots UI:", + "description": "Informācija par šo Home Assistant instalāciju", + "documentation": "Dokumentācija", + "frontend": "lietotāja saskarne", + "frontend_version": "Lietotāja saskarnes versija: {version} - {type}", + "home_assistant_logo": "Home Assistant logotips", + "icons_by": "Ikonas no", + "integrations": "Integrācijas", + "issues": "Problēmas", + "license": "Publicēts saskaņā ar Apache 2.0 licenci", + "path_configuration": "Ceļš uz configuration.yaml: {path}", "server": "serveris", - "source": "Avots:", + "source": "Pirmkods:", + "system_health_error": "System Health komponents nav ielādēts. Pievienojiet “system_health:” bloku configuration.yaml", "title": "Informācija" }, "integrations": { @@ -1029,6 +1148,7 @@ "delete_button": "Dzēst {integration}", "delete_confirm": "Vai tiešām vēlaties dzēst šo integrāciju?", "device_unavailable": "ierīce nav pieejama", + "documentation": "Dokumentācija", "entity_unavailable": "vienība nav pieejama", "firmware": "Programmaparatūra: {version}", "hub": "Savienots caur", @@ -1072,15 +1192,82 @@ "stop_ignore": "Pārtraukt ignorēšanu" }, "integration_not_found": "Integrācija nav atrasta.", - "new": "Izveidot jaunu integrāciju", + "new": "Pievienot jaunu integrāciju", "none": "Pagaidām nekas nav nokonfigurēts", + "none_found_detail": "Pielāgot meklēšanas kritērijus.", "note_about_integrations": "Pagaidām ne visas integrācijas var nokonfigurēt, izmantojot lietotāja saskarni.", "note_about_website_reference": "Vairāk informācijas vietnē " }, - "introduction": "Šeit iespējams konfigurēt Jūsu komponentus un pašu Home Assistant. Pagaidām ne visu ir iespējams konfigurēt no lietotāja saskarnes, bet mēs strādājam pie tā.", + "introduction": "Šeit iespējams konfigurēt Jūsu komponentus un pašu Home Assistant. Pagaidām ne visu ir iespējams konfigurēt, izmantojot lietotāja saskarni, bet mēs strādājam pie tā.", "logs": { + "caption": "Žurnāli", "clear": "Notīrīt", - "refresh": "Atsvaidzināt" + "description": "Pārskatiet Home Assistant žurnālus", + "details": "Detaļas ({level})", + "load_full_log": "Ielādēt pilnu Home Assistant žurnālu", + "loading_log": "Kļūdu žurnāla ielāde...", + "multiple_messages": "ieraksts pirmo reizi parādījās {time} un pārādas {counter} reizes", + "no_errors": "Par kļūdām nav ziņots", + "no_issues": "Nav jaunu problēmu!", + "refresh": "Atsvaidzināt", + "title": "Žurnāli" + }, + "lovelace": { + "caption": "Lovelace infopaneļi", + "dashboards": { + "cant_edit_default": "Standarta Lovelace infopaneli nevar rediģēt lietotāja saskarnē. Varat to paslēpt, iestatot citu infopaneli kā noklusēto.", + "cant_edit_yaml": "YAML definētos infopaneļus nevar rediģēt, izmantojot lietotāja saskarni. Mainiet tos konfigurācijā.yaml.", + "caption": "Infopaneļi", + "conf_mode": { + "storage": "UI kontrolēts", + "yaml": "YAML fails" + }, + "confirm_delete": "Vai tiešām vēlaties izdzēst šo infopaneli?", + "default_dashboard": "Šis ir noklusējuma infopanelis", + "detail": { + "create": "Izveidot", + "delete": "Dzēst", + "dismiss": "Aizvērt", + "edit_dashboard": "Rediģēt infopaneli", + "icon": "Ikona", + "new_dashboard": "Pievienot jaunu infopaneli", + "remove_default": "Noņemt kā noklusējumu šajā ierīcē", + "require_admin": "Tikai administratoram", + "set_default": "Iestatīt kā noklusējumu šajā ierīcē", + "show_sidebar": "Rādīt sānjoslā", + "title": "Nosaukums", + "title_required": "Nosaukums ir obligāts.", + "update": "Atjaunināt", + "url": "URL", + "url_error_msg": "URL ir jāsatur - un tajā nedrīkst būt atstarpes vai speciālās rakstzīmes, izņemot _ un -" + }, + "picker": { + "add_dashboard": "Pievienot infopaneli", + "headers": { + "conf_mode": "Konfigurācijas metode", + "default": "Noklusējuma", + "filename": "Faila nosaukums", + "require_admin": "Tikai administratoram", + "sidebar": "Rādīt sānjoslā", + "title": "Nosaukums" + }, + "open": "Atvērt" + } + }, + "description": "Konfigurējiet savus Lovelace infopaneļus", + "resources": { + "cant_edit_yaml": "Jūs izmantojat Lovelace YAML režīmā, tāpēc jūs nevarat pārvaldīt savus resursus, izmantojot lietotāja saskarni. Pārvaldiet tos konfigurācijā.yaml.", + "caption": "Resursi", + "detail": { + "url": "URL" + }, + "picker": { + "headers": { + "url": "URL" + }, + "no_resources": "Nav resursu" + } + } }, "mqtt": { "publish": "Publicēt", @@ -1176,6 +1363,7 @@ "introduction": "Skriptu redaktors ļauj jums izveidot un rediģēt skriptus. Lūdzu, izmantojiet zemāk esošo saiti, lai izlasītu instrukcijas, lai pārliecinātos, ka esat pareizi konfigurējis Home Assistant.", "learn_more": "Uzziniet vairāk par skriptiem", "no_scripts": "Rediģējami skripti nav atrasti", + "show_info": "Rādīt informāciju par skriptu", "trigger_script": "Izpildīt skriptu" } }, @@ -1220,10 +1408,11 @@ "username": "Lietotājvārds" }, "caption": "Lietotāji", - "description": "Pārvaldīt lietotājus", + "description": "Pārvaldiet lietotājus", "editor": { "activate_user": "Aktivizēt lietotāju", "active": "Aktīvs", + "admin": "Administrators", "caption": "Skatīt lietotāju", "change_password": "Mainīt paroli", "confirm_user_deletion": "Vai tiešām vēlaties dzēst {name}?", @@ -1231,11 +1420,22 @@ "delete_user": "Dzēst lietotāju", "group": "Grupa", "id": "ID", + "name": "Vārds", "owner": "Īpašnieks", "system_generated": "Sistēmas ģenerēts", - "system_generated_users_not_removable": "Nevar noņemt sistēmas ģenerētos lietotājus.", - "unnamed_user": "Lietotājs bez vārda" - } + "system_generated_users_not_editable": "Sistēmas ģenerētos lietotājus nevar atjaunināt.", + "system_generated_users_not_removable": "Sistēmas ģenerētos lietotājus nevar dzēst.", + "unnamed_user": "Lietotājs bez vārda", + "update_user": "Atjaunināt" + }, + "picker": { + "headers": { + "group": "Grupa", + "name": "Vārds", + "system": "Sistēmas" + } + }, + "users_privileges_note": "Lietotāju grupa ir izstrādes procesā. Lietotājs nevarēs administrēt instalāciju, izmantojot lietotāja saskarni. Mēs joprojām pārbaudām pārvaldības API, lai pārliecinātos, ka tie pareizi ierobežo piekļuvi administratoriem." }, "zha": { "add_device_page": { @@ -1378,6 +1578,12 @@ "logbook": { "entries_not_found": "Neviens žurnāla ieraksts nav atrasts.", "period": "Periods", + "ranges": { + "last_week": "Iepriekšējā nedēļā", + "this_week": "Šonedēļ", + "today": "Šodien", + "yesterday": "Vakardien" + }, "showing_entries": "Ieraksti par" }, "lovelace": { @@ -1414,7 +1620,8 @@ "toggle": "Pārslēgt vienības." }, "generic": { - "icon": "Ikona" + "icon": "Ikona", + "url": "URL" }, "iframe": { "name": "iFrame" @@ -1479,6 +1686,7 @@ "error_parse_yaml": "Nevar noparsēt YAML: {error}", "error_save_yaml": "Nevar saglabāt YAML: {error}", "header": "Konfigurācijas redaktors", + "resources_moved": "Resursus vairs nevajadzētu pievienot Lovelace konfigurācijai, bet tos var pievienot Lovelace konfigurācijas panelī.", "save": "Saglabāt", "saved": "Saglabāts", "unsaved_changes": "Nesaglabātās izmaiņas" @@ -1497,7 +1705,8 @@ "configure_ui": "Konfigurēt lietotāja saskarni", "exit_edit_mode": "Iziet no UI rediģēšanas režīma", "help": "Palīdzība", - "refresh": "Atsvaidzināt" + "refresh": "Atsvaidzināt", + "reload_resources": "Pārlādēt resursus" }, "reload_lovelace": "Pārlādēt lietotāja saskarni", "unused_entities": { @@ -1764,6 +1973,10 @@ "not_used": "Nekad nav izmantots", "token_title": "{clientId} atsvaidzināšanas pilnvara" }, + "suspend": { + "description": "Vai pārtraukt savienojumu ar serveri pēc 5 neativitātes minūtēm?", + "header": "Automātiski pārtraukt savienojumu" + }, "themes": { "dropdown_label": "Tēma", "error_no_theme": "Nav nevienas tēmas", diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 4223f46171..42b6d09ba4 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -52,9 +52,14 @@ "humidifier": { "mode": { "auto": "Auto", + "away": "Ausente", + "baby": "Bebê", + "boost": "Impulso", "comfort": "Conforto", "eco": "Eco", - "normal": "Normal" + "home": "Início", + "normal": "Normal", + "sleep": "Dormir" } } }, @@ -497,6 +502,7 @@ "menu": "Menu", "next": "Seguinte", "no": "Não", + "overflow_menu": "Abrir menu Lovelace IU", "previous": "Anterior", "refresh": "Atualizar", "save": "Guardar", @@ -712,6 +718,7 @@ "zha_device_info": { "buttons": { "add": "Adicionar dispositivos através deste dispositivo", + "clusters": "Gerir utilizadores", "reconfigure": "Reconfigurar Dispositivo", "remove": "Remover Dispositivo", "zigbee_information": "Assinatura do dispositivo Zigbee" @@ -1387,7 +1394,9 @@ }, "info": { "built_using": "Construído com", + "caption": "Informação", "custom_uis": "IUs personalizados:", + "description": "Saiba mais sobre o Home Assistant Cloud", "developed_by": "Desenvolvido por um punhado de pessoas incríveis.", "documentation": "Documentação", "frontend": "", @@ -1403,6 +1412,11 @@ "system_health_error": "O componente System Health não está carregado. Adicione 'system_health:' ao configuration.yaml", "title": "Informações" }, + "integration_panel_move": { + "link_integration_page": "Página de Integrações", + "missing_zha": "Está faltando o painel de configuração do Z-Wave? Foi movido para a entrada do Z-Wave na {integrations_page} .", + "missing_zwave": "Está faltando o painel de configuração do Z-Wave? Foi movido para a entrada do Z-Wave na {integrations_page} ." + }, "integrations": { "add_integration": "Adicionar integração", "caption": "Integrações", @@ -1476,7 +1490,9 @@ }, "introduction": "Aqui é possível configurar os seus componentes e o Home Assistant. Nem tudo é possível de ser configurado a partir da Interface Gráfica, mas estamos a trabalhar para isso.", "logs": { + "caption": "Logs", "clear": "Limpar", + "description": "Exibir os logs do Assistente Inicial", "details": "Detalhes do log ( {level} )", "load_full_log": "Carregar log completo do Home Assistant", "loading_log": "A carregar o log de erros...", @@ -1685,8 +1701,11 @@ "core": "Recarregar localização e personalizações", "group": "Recarregar grupos", "heading": "A recarregar a configuração YAML", + "input_boolean": "Recarregar booleanos de entrada", "input_datetime": "Recarregar input date times", + "input_number": "Recarregar input numbers", "input_select": "Recarregar input selects", + "input_text": "Recarregar input texts", "introduction": "Algumas partes do Home Assistant podem ser recarregadas sem a necessidade de reiniciar. Ao carregar em Recarregar a configuração irá descartar a configuração atual e carregar a nova.", "person": "Recarregar pessoas", "scene": "Recarregar cenas", @@ -1745,12 +1764,16 @@ "name": "Nome", "system": "Sistema" } - } + }, + "users_privileges_note": "O grupo de usuários é um trabalho em andamento. O usuário não poderá administrar a instância por meio da interface do usuário. Ainda estamos auditando todos os pontos de extremidade da API de gerenciamento para garantir que eles limitem corretamente o acesso aos administradores." }, "zha": { "add_device_page": { + "discovered_text": "Os dispositivos aparecerão aqui uma vez descobertos.", "discovery_text": "Os dispositivos descobertos aparecerão aqui. Siga as instruções para o(s) seu(s) dispositivo(s) e coloque o(s) dispositivo(s) em modo de emparelhamento.", "header": "Zigbee Home Automation - Adicionar dispositivos", + "no_devices_found": "Nenhum dispositivo encontrado, verifique se eles estão no modo de emparelhamento e mantenha-os acordados enquanto a descoberta está em execução.", + "pairing_mode": "Verifique se seus dispositivos estão no modo de emparelhamento. Verifique as instruções do seu dispositivo sobre como fazer isso.", "search_again": "Pesquisar Novamente", "spinner": "À procura de dispositivos ZHA Zigbee..." }, @@ -1758,6 +1781,7 @@ "caption": "Adicionar Dispositivos", "description": "Adicionar dispositivos à rede Zigbee" }, + "button": "Configurar", "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributos do cluster selecionado", @@ -1836,6 +1860,9 @@ "header": "Gestão ", "introduction": "Comandos que afetam toda a rede" }, + "network": { + "caption": "Rede" + }, "node_management": { "header": "Gestão dispositivos", "help_node_dropdown": "Selecione um dispositivo para visualizar as opções por dispositivo.", @@ -1875,6 +1902,7 @@ "no_zones_created_yet": "Parece que você ainda não criou nenhuma zona." }, "zwave": { + "button": "Configurar UI", "caption": "Z-Wave", "common": { "index": "Índice", @@ -1908,7 +1936,18 @@ "true": "Verdadeiro" }, "node_management": { - "exclude_entity": "Excluir esta entidade do Home Assistant" + "entities": "Entidades deste nó", + "entity_info": "Definições da entidade", + "exclude_entity": "Excluir esta entidade do Home Assistant", + "group": "Grupo", + "node_group_associations": "Associações de grupos de nós", + "node_protection": "Proteção de nó", + "node_to_control": "Configurar opçoes do nó", + "nodes": "Nós", + "nodes_hint": "Selecione o nó para visualizar as opções por nó", + "pooling_intensity": "Intensidade da votação", + "protection": "Proteção", + "set_protection": "Definir proteção" }, "ozw_log": { "header": "Log OZW", @@ -1919,14 +1958,17 @@ "add_node_secure": "Adicionar nó seguro", "cancel_command": "Cancelar comando", "heal_network": "Curar a Rede", + "heal_node": "Adicionar nó", "node_info": "Informação do Nó", + "print_node": "Nó de impressão", "refresh_entity": "Actualizar entidade", "remove_node": "Remover nó", "save_config": "Guardar configuração", "soft_reset": "Reinicio suave", "start_network": "Iniciar a rede", "stop_network": "Parar a rede", - "test_network": "Testar rede" + "test_network": "Testar rede", + "test_node": "Nó de Teste" }, "values": { "header": "Valores do Nó" @@ -2158,6 +2200,7 @@ "name": "Agrupamento Horizontal" }, "humidifier": { + "description": "O cartão Termóstato dá-lhe o controle da sua entidade de climatização. Permitindo alterar a temperatura e o modo dessa entidade.", "name": "Humidificador" }, "iframe": { @@ -2615,6 +2658,10 @@ "not_used": "Nunca foi utilizado", "token_title": "Atualizar o token de {clientId}" }, + "suspend": { + "description": "Devemos fechar a conexão com o servidor depois de ficar oculto por 5 minutos?", + "header": "Fechar automaticamente a conexão" + }, "themes": { "dropdown_label": "Tema", "error_no_theme": "Não há temas disponíveis.", diff --git a/translations/frontend/vi.json b/translations/frontend/vi.json index 99807773aa..5c8f715fba 100644 --- a/translations/frontend/vi.json +++ b/translations/frontend/vi.json @@ -624,6 +624,7 @@ "yaml_not_editable": "Không thể sửa cài đặt của thực thể này từ giao diện người dùng. Chỉ các thực thể được thiết lập từ giao diện người dùng mới có thể được sửa chữa từ giao diện người dùng." }, "more_info_control": { + "dismiss": "Bỏ qua hộp thoại", "edit": "Chỉnh sửa thực thể", "person": { "create_zone": "Tạo vùng từ vị trí hiện tại" @@ -639,6 +640,7 @@ "last_action": "Hành động cuối", "last_triggered": "Lần kích hoạt cuối" }, + "settings": "Các cài đặt thực thể", "sun": { "elevation": "Độ cao", "rising": "Mọc lên", @@ -672,6 +674,8 @@ "triggers": "Các kích hoạt" }, "voice_command": { + "did_not_hear": "Home Assistant không nghe thấy gì cả", + "how_can_i_help": "Tôi có thể giúp gì nào?", "label": "Nhập câu hỏi và nhấn 'Enter'" }, "zha_device_info": { @@ -703,6 +707,7 @@ }, "notification_drawer": { "click_to_configure": "Nhấp vào nút để cấu hình {entity}", + "close": "Đóng", "empty": "Không có thông báo", "title": "Thông báo" }, @@ -850,6 +855,8 @@ "unsupported_condition": "Điều kiện không được hỗ trợ: {condition}" }, "default_name": "Thêm Tự động hóa", + "edit_ui": "Chỉnh sửa với UI", + "edit_yaml": "Chỉnh sửa dưới dạng YAML", "enable_disable": "Bật/Tắt tự động hóa", "introduction": "Sử dụng tự động hóa để mang sự sống cho nhà bạn", "load_error_not_editable": "Chỉ tự động hóa trong automations.yaml là có thể chỉnh sửa.", @@ -1012,6 +1019,10 @@ "entity": "Thực thể", "header": "Tùy chỉnh", "introduction": "Tinh chỉnh thuộc tính mỗi thực thể. Các tùy chỉnh được thêm / chỉnh sửa sẽ có hiệu lực ngay lập tức. Các tùy chỉnh bị xóa sẽ có hiệu lực khi thực thể được cập nhật." + }, + "warning": { + "include_link": "bao gồm customize.yaml", + "include_sentence": "Có vẻ như cấu hình trong configuration.yaml của bạn chưa đúng" } }, "devices": { @@ -1071,10 +1082,13 @@ "description": "Tổng quan tất cả các thực thể đã biết.", "picker": { "disable_selected": { - "button": "Vô hiệu hoá các mục đã chọn" + "button": "Vô hiệu hoá các mục đã chọn", + "confirm_text": "Các thực thể bị vô hiệu hoá sẽ không được thêm vào Home Assistant.", + "confirm_title": "Bạn có muốn vô hiệu hoá {number} thực thể không?" }, "enable_selected": { - "button": "Kích hoạt các mục đã chọn" + "button": "Kích hoạt các mục đã chọn", + "confirm_title": "Bạn có muốn kích hoạt {number} thực thể?" }, "filter": { "filter": "Lọc", @@ -1084,13 +1098,17 @@ }, "header": "Đăng ký thực thể", "headers": { + "entity_id": "Mã định danh Thực thể", + "integration": "Tích hợp", + "name": "Tên", "status": "Trạng thái" }, "introduction": "Home Assistant giữ một sổ đăng ký của mọi thực thể mà nó từng thấy có thể được xác định duy nhất. Mỗi thực thể này sẽ có một ID thực thể được gán sẽ chỉ dành riêng cho thực thể này.", "introduction2": "Sử dụng sổ đăng ký thực thể để ghi đè tên, thay đổi ID thực thể hoặc xóa mục nhập khỏi Home Assistant. Lưu ý, xóa mục đăng ký thực thể sẽ không xóa thực thể. Để làm điều đó, hãy theo liên kết dưới đây và xóa nó khỏi trang tích hợp.", "remove_selected": { "button": "Loại bỏ mục đã chọn", - "confirm_partly_title": "Chỉ {number} thực thể đã chọn có thể bị xoá." + "confirm_partly_title": "Chỉ {number} thực thể đã chọn có thể bị xoá.", + "confirm_title": "Bạn có muốn xoá bỏ {number} thực thể không?" }, "selected": "{number} đã chọn", "status": { @@ -1162,6 +1180,7 @@ "delete_confirm": "Bạn chắc chắn muốn xóa bộ tích hợp này?", "device_unavailable": "Thiết bị không khả dụng", "devices": "{count} {count, plural,\n one { thiết bị }\n other { các thiết bị }\n}", + "documentation": "Tài liệu", "entities": "{count} {count, plural,\n one { thực thể }\n other { các thực thể }\n}", "entity_unavailable": "Thiết bị không khả dụng", "firmware": "Firmware: {version}", @@ -1193,10 +1212,13 @@ "configure": "Cấu hình", "configured": "Đã cấu hình", "description": "Quản lý thiết bị và dịch vụ đã kết nối", + "details": "Chi tiết về tích hợp", "discovered": "Đã quét", "ignore": { "confirm_delete_ignore_title": "Ngừng bỏ qua {name}?", + "confirm_ignore_title": "Bỏ qua tự động phát hiện {name}?", "hide_ignored": "Ẩn các tích hợp bị bỏ qua", + "ignore": "Bỏ qua", "ignored": "Đã bỏ qua", "show_ignored": "Hiển thị các tích hợp bị bỏ qua", "stop_ignore": "Ngừng bỏ qua" @@ -1373,6 +1395,7 @@ "caption": "Kịch bản", "description": "Tạo và chỉnh sửa các tập lệnh", "editor": { + "alias": "Tên", "delete_script": "Xóa kịch bản", "link_available_actions": "Tìm hiểu thêm về các hành động khả dụng.", "sequence": "Trình tự", @@ -1440,6 +1463,7 @@ "deactivate_user": "Hủy kích hoạt người dùng", "delete_user": "Xóa người dùng", "name": "Tên", + "system_generated_users_not_editable": "Không thể chỉnh sửa người dùng do hệ thống tạo ra.", "update_user": "Cập nhật" }, "picker": { @@ -1481,7 +1505,9 @@ "bind_button_label": "Liên kết Nhóm", "cluster_selection_help": "Chọn các cụm để liên kết với nhóm đã chọn.", "group_picker_help": "Chọn một nhóm để thi hành một lệnh liên kết.", + "group_picker_label": "Các nhóm có thể Liên kết", "header": "Ràng buộc Nhóm", + "introduction": "Liên kết và ngừng liên kết các nhóm.", "unbind_button_help": "Hủy liên kết nhóm đã chọn khỏi cụm thiết bị đã chọn.", "unbind_button_label": "Ngừng liên kết Nhóm" }, @@ -1564,13 +1590,15 @@ }, "node_management": { "add_to_group": "Thêm vào Nhóm", + "entities": "Các thực thể của nút này", "group": "Nhóm", "node_to_control": "Nút để điều khiển", "remove_from_group": "Xóa Khỏi Nhóm" }, "ozw_log": { "last_log_lines": "Số dòng nhật ký gần nhất", - "load": "Tải" + "load": "Tải", + "tail": "Đuôi" }, "services": { "cancel_command": "Hủy lệnh", @@ -1642,6 +1670,7 @@ }, "templates": { "editor": "Trình soạn thảo bản mẫu", + "jinja_documentation": "Tài liệu về Jinja2", "title": "Mẫu sẵn", "unknown_error_template": "Lỗi không xác định khi kết xuất bản mẫu" } @@ -1729,7 +1758,9 @@ "state_not_equal": "Trạng thái không bằng với" }, "entities": { - "description": "Thẻ Các Thực thể là loại thẻ phổ biến nhất. Nó nhóm các mục với nhau thành một danh sách." + "description": "Thẻ Các Thực thể là loại thẻ phổ biến nhất. Nó nhóm các mục với nhau thành một danh sách.", + "name": "Các Thực thể", + "show_header_toggle": "Hiển thị Nút chuyển đổi ở Trên cùng" }, "entity-filter": { "description": "Thẻ Bộ lọc Thực thể cho phép bạn xác định danh sách các thực thể mà bạn muốn theo dõi chỉ khi chúng ở trạng thái nhất định.", @@ -1745,6 +1776,7 @@ "generic": { "attribute": "Thuộc tính", "double_tap_action": "Hành động khi Nhấn Đôi", + "entities": "Các Thực thể", "manual": "Thủ công", "manual_description": "Cần thêm một thẻ tuỳ chỉnh hay chỉ muốn viết cấu hình yaml thủ công?", "no_theme": "Không có theme.", @@ -1845,6 +1877,7 @@ "delete": "Xóa Tầm nhìn", "edit": "Chỉnh sửa Tầm nhìn", "header": "Cấu hình Tầm nhìn", + "move_left": "Chuyển tầm nhìn sang trái", "move_right": "Di chuyển tầm nhìn sang phải", "tab_badges": "Huy hiệu", "tab_settings": "Cài đặt", @@ -1907,6 +1940,7 @@ "menu": { "close": "Đóng", "configure_ui": "Cấu hình giao diện", + "exit_edit_mode": "Thoát khỏi chế độ chỉnh sửa với UI", "help": "Trợ giúp", "refresh": "Làm tươi", "reload_resources": "Tải lại các tài nguyên" @@ -2177,6 +2211,10 @@ "not_used": "Chưa bao giờ được sử dụng", "token_title": "Làm mới token cho {clientId}" }, + "suspend": { + "description": "Chúng ta có nên đóng kết nối đến máy chủ sau khi trình duyệt được ẩn trong 5 phút?", + "header": "Tự động đóng kết nối" + }, "themes": { "dropdown_label": "Giao diện", "error_no_theme": "Không có giao diện nào.", @@ -2191,7 +2229,8 @@ } }, "sidebar": { - "external_app_configuration": "Cấu hình ứng dụng" + "external_app_configuration": "Cấu hình ứng dụng", + "sidebar_toggle": "Ẩn/Hiện Thanh Bên" } } } \ No newline at end of file diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 8cd8272259..3a1d810592 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -2678,6 +2678,10 @@ "not_used": "從未使用過", "token_title": "{clientId}更新密鑰" }, + "suspend": { + "description": "於隱藏五分鐘後關閉連線?", + "header": "自動關閉連線" + }, "themes": { "dropdown_label": "主題", "error_no_theme": "無主題可使用。", From f236b76d5c855527a7a71e45b630df89cbf0375f Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 5 Jul 2020 00:32:32 +0000 Subject: [PATCH 06/58] [ci skip] Translation update --- translations/frontend/he.json | 2 +- translations/frontend/it.json | 5 +++++ translations/frontend/th.json | 24 +++++++++++++++++++----- translations/frontend/zh-Hans.json | 4 ++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/translations/frontend/he.json b/translations/frontend/he.json index 062d5d5618..c4bb425e09 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -577,7 +577,7 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "אם הם מושבתים, ישויות שהתגלו לאחרונה עבור {integration} לא יתווספו אוטומטית ל Home Assistant.", + "enable_new_entities_description": "אם הן מושבתות, ישויות שהתגלו לאחרונה עבור {integration} לא יתווספו אוטומטית ל Home Assistant.", "enable_new_entities_label": "הפוך ישויות חדשות שנוספו לזמינות.", "title": "אפשרויות מערכת", "update": "עדכון" diff --git a/translations/frontend/it.json b/translations/frontend/it.json index 681720b018..9a915b5d6a 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -1431,6 +1431,7 @@ "delete_confirm": "Sei sicuro di voler eliminare questa integrazione?", "device_unavailable": "dispositivo non disponibile", "devices": "{count} {count, plural, \none {dispositivo}\nother {dispositivi}\n}", + "documentation": "Documentazione", "entities": "{count} {count, plural, \none {entità}\nother {entità }\n}", "entity_unavailable": "entità non disponibile", "firmware": "Firmware: {version}", @@ -2677,6 +2678,10 @@ "not_used": "Non è mai stato usato", "token_title": "Token di aggiornamento per {clientId}" }, + "suspend": { + "description": "Dovremmo chiudere la connessione al server dopo essere stati nascosti per 5 minuti?", + "header": "Chiudi automaticamente la connessione" + }, "themes": { "dropdown_label": "Tema", "error_no_theme": "Nessun tema disponibile.", diff --git a/translations/frontend/th.json b/translations/frontend/th.json index cb7f26dd0a..06203fdf6e 100644 --- a/translations/frontend/th.json +++ b/translations/frontend/th.json @@ -448,7 +448,7 @@ "components": { "entity": { "entity-picker": { - "entity": "เลือกเอนทิตี" + "entity": "เอนทิตี" } }, "history_charts": { @@ -743,7 +743,7 @@ }, "cloud": { "caption": "Home Assistant Cloud", - "description_features": "ควบคุมการทำงานเมื่อออกจากบ้านร่วมกับ Alexa และ Google Assistant", + "description_features": "ควบคุมการทำงานจากนอกบ้าน ร่วมกับ Alexa และ Google Assistant", "description_login": "ลงชื่อเข้าใช้เป็น {email}", "description_not_login": "ยังไม่ได้เข้าสู่ระบบ", "forgot_password": { @@ -793,7 +793,13 @@ } }, "devices": { - "caption": "อุปกรณ์" + "caption": "อุปกรณ์", + "scene": { + "create": "สร้างฉากด้วยอุปกรณ์", + "no_scenes": "ไม่มีฉาก", + "scenes": "ฉาก" + }, + "scenes": "ฉาก" }, "entities": { "caption": "เอนทิตีรีจิสทรี", @@ -835,7 +841,7 @@ "new": "สร้างการทำงานร่วมกันอันใหม่", "none": "ยังไม่มีการกำหนดค่าใดๆ เลย" }, - "introduction": "ดูสิ! สามารถกำหนดค่าส่วนประกอบต่างๆ ของคุณได้ด้วย รวมถึงส่วนของระบบของ Home Assistant เลยเชียวนะ! ถึงแม้ตอนนี้ส่วนการแสดงผลยังทำไม่ได้ก็ตาม แต่เรากำลังพัฒนามันอยู่ คงจะใช้ได้เร็วๆ นี้ละ", + "introduction": "ที่นี่คือที่สำหรับกำหนดค่าองค์ประกอบต่างๆ รวมถึงระบบของ Home Assistant ไม่ใช่ทุกอย่างที่จะสามารถตั้งค่าได้ผ่าน UI ในขณะนี้ แต่เรากำลังพัฒนาเพิ่มเติมอยู่นะ", "mqtt": { "title": "MQTT" }, @@ -849,6 +855,14 @@ "name": "ชื่อ" } }, + "scene": { + "editor": { + "entities": { + "add": "เพิ่มเอนทิตี", + "delete": "ลบเอนทิตี" + } + } + }, "script": { "caption": "สคริปต์", "description": "สร้างและแก้ไขสคริปต์", @@ -1023,7 +1037,7 @@ }, "header": "แก้ไข UI", "menu": { - "raw_editor": "ตัวแก้ไข config แบบดิบๆ" + "raw_editor": "ตัวแก้ไขไฟล์ตั้งค่าแบบหยาบ" }, "migrate": { "header": "การกำหนดค่าไม่ถูกต้อง", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 8dac5f5969..eeb8678938 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -2678,6 +2678,10 @@ "not_used": "从未使用过", "token_title": "{clientId} 的刷新令牌" }, + "suspend": { + "description": "是否要在转至后台 5 分钟后,关闭与服务器的连接?", + "header": "自动关闭连接" + }, "themes": { "dropdown_label": "主题", "error_no_theme": "没有可用的主题。", From da10da79b3e07d27dda80d23d0d14684ad1d52f9 Mon Sep 17 00:00:00 2001 From: Yosi Levy Date: Sun, 5 Jul 2020 06:23:35 +0300 Subject: [PATCH 07/58] RTL fixes - cloud section, ha-formfield, some missing + (mwc-fab) --- src/components/ha-dialog.ts | 6 ++ src/components/ha-formfield.ts | 4 +- .../dialog-config-entry-system-options.ts | 2 + .../config/cloud/account/cloud-account.js | 14 +++- .../config/cloud/account/cloud-alexa-pref.ts | 4 + .../config/cloud/account/cloud-google-pref.ts | 4 + .../config/cloud/account/cloud-remote-pref.ts | 4 + src/panels/config/cloud/alexa/cloud-alexa.ts | 2 + .../forgot-password/cloud-forgot-password.js | 1 - .../cloud-google-assistant.ts | 56 +++++++------- src/panels/config/cloud/login/cloud-login.js | 1 - .../config/cloud/register/cloud-register.js | 4 - .../mqtt/dialog-mqtt-device-debug-info.ts | 50 ++++++------ .../dialog-lovelace-dashboard-detail.ts | 50 ++++++------ .../ha-config-lovelace-dashboards.ts | 6 ++ src/panels/config/users/dialog-add-user.ts | 2 + src/panels/config/users/dialog-user-detail.ts | 2 + src/panels/config/zone/dialog-zone-detail.ts | 2 + src/panels/config/zone/ha-config-zone.ts | 6 ++ .../config-elements/hui-button-card-editor.ts | 51 +++++++------ .../hui-entities-card-editor.ts | 2 + .../config-elements/hui-gauge-card-editor.ts | 2 + .../config-elements/hui-glance-card-editor.ts | 76 +++++++++++-------- .../config-elements/hui-map-card-editor.ts | 2 + .../hui-picture-entity-card-editor.ts | 51 +++++++------ .../hui-weather-forecast-card-editor.ts | 2 + .../lovelace/editor/hui-dialog-save-config.ts | 2 + .../editor/view-editor/hui-view-editor.ts | 4 +- 28 files changed, 252 insertions(+), 160 deletions(-) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 6a6d35a031..d341cf2b8c 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -5,6 +5,7 @@ import "./ha-icon-button"; import { css, CSSResult, customElement, html } from "lit-element"; import type { Constructor, HomeAssistant } from "../types"; import { mdiClose } from "@mdi/js"; +import { computeRTL } from "../common/util/compute_rtl"; const MwcDialog = customElements.get("mwc-dialog") as Constructor; @@ -13,6 +14,7 @@ export const createCloseHeading = (hass: HomeAssistant, title: string) => html` @@ -48,6 +50,10 @@ export class HaDialog extends MwcDialog { text-decoration: none; color: inherit; } + mwc-icon-button[rtl].header_button { + right: auto; + left: 16px; + } `, ]; } diff --git a/src/components/ha-formfield.ts b/src/components/ha-formfield.ts index 45462d0689..211ee8d0b0 100644 --- a/src/components/ha-formfield.ts +++ b/src/components/ha-formfield.ts @@ -17,9 +17,9 @@ export class HaFormfield extends MwcFormfield { ::slotted(ha-switch) { margin-right: 10px; } - [dir="rtl"] ::slotted(ha-switch), - ::slotted(ha-switch)[dir="rtl"] { + :host([dir="rtl"]:not([alignEnd])) ::slotted(ha-switch) { margin-left: 10px; + margin-right: auto; } `, ]; diff --git a/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts b/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts index cb2f95a287..04055aeefa 100644 --- a/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts +++ b/src/dialogs/config-entry-system-options/dialog-config-entry-system-options.ts @@ -22,6 +22,7 @@ import type { PolymerChangedEvent } from "../../polymer-types"; import { haStyleDialog } from "../../resources/styles"; import type { HomeAssistant } from "../../types"; import { ConfigEntrySystemOptionsDialogParams } from "./show-dialog-config-entry-system-options"; +import { computeRTLDirection } from "../../common/util/compute_rtl"; @customElement("dialog-config-entry-system-options") class DialogConfigEntrySystemOptions extends LitElement { @@ -99,6 +100,7 @@ class DialogConfigEntrySystemOptions extends LitElement { ) || this._params.entry.domain )}

`} + .dir="${computeRTLDirection(this.hass)}" > @@ -163,6 +167,10 @@ class CloudAccount extends EventsMixin(LocalizeMixin(PolymerElement)) { type: Object, value: null, }, + _rtlDirection: { + type: Boolean, + computed: "_computeRTLDirection(hass)", + }, }; } @@ -215,6 +223,10 @@ class CloudAccount extends EventsMixin(LocalizeMixin(PolymerElement)) { return description; } + + _computeRTLDirection(hass) { + return computeRTLDirection(hass); + } } customElements.define("cloud-account", CloudAccount); diff --git a/src/panels/config/cloud/account/cloud-alexa-pref.ts b/src/panels/config/cloud/account/cloud-alexa-pref.ts index bedd66fe3e..8fae8a1895 100644 --- a/src/panels/config/cloud/account/cloud-alexa-pref.ts +++ b/src/panels/config/cloud/account/cloud-alexa-pref.ts @@ -167,6 +167,10 @@ export class CloudAlexaPref extends LitElement { right: 24px; top: 32px; } + :host([dir="rtl"]) .switch { + right: auto; + left: 24px; + } .card-actions { display: flex; } diff --git a/src/panels/config/cloud/account/cloud-google-pref.ts b/src/panels/config/cloud/account/cloud-google-pref.ts index f701a27e8c..ed9db0a768 100644 --- a/src/panels/config/cloud/account/cloud-google-pref.ts +++ b/src/panels/config/cloud/account/cloud-google-pref.ts @@ -205,6 +205,10 @@ export class CloudGooglePref extends LitElement { right: 24px; top: 32px; } + :host([dir="rtl"]) .switch { + right: auto; + left: 24px; + } ha-call-api-button { color: var(--primary-color); font-weight: 500; diff --git a/src/panels/config/cloud/account/cloud-remote-pref.ts b/src/panels/config/cloud/account/cloud-remote-pref.ts index 7455d1d9bc..c2c72c1ed7 100644 --- a/src/panels/config/cloud/account/cloud-remote-pref.ts +++ b/src/panels/config/cloud/account/cloud-remote-pref.ts @@ -150,6 +150,10 @@ export class CloudRemotePref extends LitElement { right: 24px; top: 32px; } + :host([dir="rtl"]) .switch { + right: auto; + left: 24px; + } .card-actions { display: flex; } diff --git a/src/panels/config/cloud/alexa/cloud-alexa.ts b/src/panels/config/cloud/alexa/cloud-alexa.ts index e0218135b6..69332699a7 100644 --- a/src/panels/config/cloud/alexa/cloud-alexa.ts +++ b/src/panels/config/cloud/alexa/cloud-alexa.ts @@ -34,6 +34,7 @@ import "../../../../layouts/hass-loading-screen"; import "../../../../layouts/hass-subpage"; import type { HomeAssistant } from "../../../../types"; import "../../../../components/ha-formfield"; +import { computeRTLDirection } from "../../../../common/util/compute_rtl"; const DEFAULT_CONFIG_EXPOSE = true; const IGNORE_INTERFACES = ["Alexa.EndpointHealth"]; @@ -132,6 +133,7 @@ class CloudAlexa extends LitElement { .label=${this.hass!.localize( "ui.panel.config.cloud.alexa.expose" )} + .dir="${computeRTLDirection(this.hass!)}" > .content { padding-bottom: 24px; - direction: ltr; } ha-card { 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 a6738488cc..e96500a6a7 100644 --- a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts +++ b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts @@ -39,6 +39,7 @@ import "../../../../layouts/hass-subpage"; import type { HomeAssistant } from "../../../../types"; import { showToast } from "../../../../util/toast"; import "../../../../components/ha-formfield"; +import { computeRTLDirection } from "../../../../common/util/compute_rtl"; const DEFAULT_CONFIG_EXPOSE = true; @@ -128,32 +129,38 @@ class CloudGoogleAssistant extends LitElement { .map((trait) => trait.substr(trait.lastIndexOf(".") + 1)) .join(", ")} - - + - - + + + + ${entity.might_2fa ? html` - - - +
+ + + +
` : ""} @@ -377,9 +384,6 @@ class CloudGoogleAssistant extends LitElement { state-info { cursor: pointer; } - ha-formfield { - display: block; - } ha-switch { padding: 8px 0; } diff --git a/src/panels/config/cloud/login/cloud-login.js b/src/panels/config/cloud/login/cloud-login.js index c251be6ffe..c5ac31c43d 100644 --- a/src/panels/config/cloud/login/cloud-login.js +++ b/src/panels/config/cloud/login/cloud-login.js @@ -30,7 +30,6 @@ class CloudLogin extends LocalizeMixin( diff --git a/src/dialogs/ha-more-info-dialog.js b/src/dialogs/ha-more-info-dialog.js deleted file mode 100644 index 1f80d19aec..0000000000 --- a/src/dialogs/ha-more-info-dialog.js +++ /dev/null @@ -1,155 +0,0 @@ -import "@polymer/paper-dialog-behavior/paper-dialog-shared-styles"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { computeStateDomain } from "../common/entity/compute_state_domain"; -import DialogMixin from "../mixins/dialog-mixin"; -import "../styles/polymer-ha-style-dialog"; -import "./more-info/more-info-controls"; - -/* - * @appliesMixin DialogMixin - */ -class HaMoreInfoDialog extends DialogMixin(PolymerElement) { - static get template() { - return html` - - - - `; - } - - static get properties() { - return { - hass: Object, - stateObj: { - type: Object, - computed: "_computeStateObj(hass)", - observer: "_stateObjChanged", - }, - - large: { - type: Boolean, - reflectToAttribute: true, - observer: "_largeChanged", - }, - - dataDomain: { - computed: "_computeDomain(stateObj)", - reflectToAttribute: true, - }, - }; - } - - static get observers() { - return ["_dialogOpenChanged(opened)"]; - } - - _dialogElement() { - return this; - } - - _computeDomain(stateObj) { - return stateObj ? computeStateDomain(stateObj) : ""; - } - - _computeStateObj(hass) { - return hass.states[hass.moreInfoEntityId] || null; - } - - async _stateObjChanged(newVal) { - if (!newVal) { - this.setProperties({ - opened: false, - large: false, - }); - return; - } - - requestAnimationFrame(() => - requestAnimationFrame(() => { - // allow dialog to render content before showing it so it will be - // positioned correctly. - this.opened = true; - }) - ); - } - - _dialogOpenChanged(newVal) { - if (!newVal && this.stateObj) { - this.fire("hass-more-info", { entityId: null }); - } - } - - _equals(a, b) { - return a === b; - } - - _largeChanged() { - this.notifyResize(); - } -} -customElements.define("ha-more-info-dialog", HaMoreInfoDialog); diff --git a/src/dialogs/more-info/controls/more-info-light.js b/src/dialogs/more-info/controls/more-info-light.js index 83a0abf115..f961c9c6a8 100644 --- a/src/dialogs/more-info/controls/more-info-light.js +++ b/src/dialogs/more-info/controls/more-info-light.js @@ -28,6 +28,12 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) { return html` - - - -
- [[_computeStateName(stateObj)]] -
- - -
- - - - - - - - `; - } - - static get properties() { - return { - hass: Object, - - stateObj: { - type: Object, - observer: "_stateObjChanged", - }, - - dialogElement: Object, - registryEntry: Object, - - domain: { - type: String, - reflectToAttribute: true, - computed: "_computeDomain(stateObj)", - }, - - _stateHistory: Object, - _stateHistoryLoading: Boolean, - - large: { - type: Boolean, - value: false, - notify: true, - }, - - _cacheConfig: { - type: Object, - value: { - refresh: 60, - cacheKey: null, - hoursToShow: 24, - }, - }, - rtl: { - type: Boolean, - reflectToAttribute: true, - computed: "_computeRTL(hass)", - }, - }; - } - - enlarge() { - this.large = !this.large; - } - - _computeShowStateInfo(stateObj) { - return !stateObj || !DOMAINS_NO_INFO.includes(computeStateDomain(stateObj)); - } - - _computeShowRestored(stateObj) { - return stateObj && stateObj.attributes.restored; - } - - _computeShowHistoryComponent(hass, stateObj) { - return ( - hass && - stateObj && - isComponentLoaded(hass, "history") && - !DOMAINS_MORE_INFO_NO_HISTORY.includes(computeStateDomain(stateObj)) - ); - } - - _computeDomain(stateObj) { - return stateObj ? computeStateDomain(stateObj) : ""; - } - - _computeStateName(stateObj) { - return stateObj ? computeStateName(stateObj) : ""; - } - - _computeEdit(hass, stateObj) { - const domain = this._computeDomain(stateObj); - return ( - stateObj && - hass.user.is_admin && - ((EDITABLE_DOMAINS_WITH_ID.includes(domain) && stateObj.attributes.id) || - EDITABLE_DOMAINS.includes(domain)) - ); - } - - _stateObjChanged(newVal) { - if (!newVal) { - return; - } - - if (this._cacheConfig.cacheKey !== `more_info.${newVal.entity_id}`) { - this._cacheConfig = { - ...this._cacheConfig, - cacheKey: `more_info.${newVal.entity_id}`, - }; - } - } - - _removeEntity() { - showConfirmationDialog(this, { - title: this.localize( - "ui.dialogs.more_info_control.restored.confirm_remove_title" - ), - text: this.localize( - "ui.dialogs.more_info_control.restored.confirm_remove_text" - ), - confirmText: this.localize("ui.common.yes"), - dismissText: this.localize("ui.common.no"), - confirm: () => - removeEntityRegistryEntry(this.hass, this.stateObj.entity_id), - }); - } - - _gotoSettings() { - showEntityEditorDialog(this, { - entity_id: this.stateObj.entity_id, - }); - this.fire("hass-more-info", { entityId: null }); - } - - _gotoEdit() { - const domain = this._computeDomain(this.stateObj); - navigate( - this, - `/config/${domain}/edit/${ - EDITABLE_DOMAINS_WITH_ID.includes(domain) - ? this.stateObj.attributes.id - : this.stateObj.entity_id - }` - ); - this.fire("hass-more-info", { entityId: null }); - } - - _computeRTL(hass) { - return computeRTL(hass); - } -} -customElements.define("more-info-controls", MoreInfoControls); diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index 1e347183c6..f0c992e30c 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -147,19 +147,14 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { `; } - private _getStateHistory(): void { - getRecentWithCache( + private async _getStateHistory(): Promise { + this._stateHistory = getRecentWithCache( this.hass!, this._cacheConfig!.cacheKey, this._cacheConfig!, this.hass!.localize, this.hass!.language - ).then((stateHistory) => { - this._stateHistory = { - ...this._stateHistory, - ...stateHistory, - }; - }); + ); } private _clearInterval(): void { diff --git a/src/resources/styles.ts b/src/resources/styles.ts index ea6ba3cfbc..0b3c1b2678 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -241,7 +241,9 @@ export const haStyleDialog = css` @media all and (max-width: 450px), all and (max-height: 500px) { ha-dialog { --mdc-dialog-min-width: 100vw; - --mdc-dialog-max-height: 100vh; + --mdc-dialog-max-width: 100vw; + --mdc-dialog-min-height: 100%; + --mdc-dialog-max-height: 100%; --mdc-shape-medium: 0px; --vertial-align-dialog: flex-end; } diff --git a/src/state/more-info-mixin.ts b/src/state/more-info-mixin.ts index b2d3d852af..3dd6b3ed02 100644 --- a/src/state/more-info-mixin.ts +++ b/src/state/more-info-mixin.ts @@ -20,7 +20,7 @@ export default >(superClass: T) => // Load it once we are having the initial rendering done. import( - /* webpackChunkName: "more-info-dialog" */ "../dialogs/ha-more-info-dialog" + /* webpackChunkName: "more-info-dialog" */ "../dialogs/more-info/ha-more-info-dialog" ); } From d3f29362b9f554eba58dcd228c393cb20a86a4c4 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 9 Jul 2020 01:29:46 +0200 Subject: [PATCH 22/58] Fix optional with default value ha-form-integer (#6341) --- src/components/ha-form/ha-form-integer.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/ha-form/ha-form-integer.ts b/src/components/ha-form/ha-form-integer.ts index 0e5674edfb..e00aa40a0e 100644 --- a/src/components/ha-form/ha-form-integer.ts +++ b/src/components/ha-form/ha-form-integer.ts @@ -58,7 +58,9 @@ export class HaFormInteger extends LitElement implements HaFormElement { .value=${this._value} .min=${this.schema.valueMin} .max=${this.schema.valueMax} - .disabled=${this.data === undefined} + .disabled=${this.data === undefined && + this.schema.optional && + this.schema.default === undefined} @value-changed=${this._valueChanged} > From 58ffc2c6ca92f65e61976dabb1b69b85d673d7df Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 9 Jul 2020 00:32:29 +0000 Subject: [PATCH 23/58] [ci skip] Translation update --- translations/frontend/pt.json | 46 +++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/translations/frontend/pt.json b/translations/frontend/pt.json index 42b6d09ba4..d05b868f9f 100644 --- a/translations/frontend/pt.json +++ b/translations/frontend/pt.json @@ -628,6 +628,7 @@ "max": "Valor máximo", "min": "Valor mínimo", "mode": "Modo de exibição", + "slider": "Controlador deslizante", "step": "Tamanho do passo", "unit_of_measurement": "Unidade de medida" }, @@ -768,7 +769,7 @@ "connection_lost": "Ligação perdida. A ligar de novo...", "service_call_failed": "Falha ao chamar o serviço {service}.", "started": "Home Assistant já iniciou", - "starting": "Home Assistant está a inicializar, nem tudo estará disponivel até o processo concluir.", + "starting": "Home Assistant está a inicializar, nem tudo estará disponível até o processo concluir.", "triggered": "Despoletado {name}" }, "panel": { @@ -1147,12 +1148,12 @@ "webhook_for": "Webhook para {name}" }, "forgot_password": { - "check_your_email": "Verifique o seu e-mail para obter instruções sobre como redefinir a sua senha.", + "check_your_email": "Verifique o seu e-mail para obter instruções sobre como redefinir a sua palavra-passe.", "email": "", "email_error_msg": "E-mail inválido", "instructions": "Introduza o seu endereço de e-mail e nós lhe enviaremos um link para redefinir sua password.", "send_reset_email": "Enviar e-mail de redefinição", - "subtitle": "Esquecer a senha", + "subtitle": "Esqueceu-se da palavra-passe?", "title": "Esqueci-me da palavra-passe" }, "google": { @@ -1170,7 +1171,7 @@ "dismiss": "Fechar", "email": "", "email_error_msg": "E-mail inválido", - "forgot_password": "Esqueceu-se da senha?", + "forgot_password": "Esqueceu-se da palavra-passe?", "introduction": "O Home Assistant Cloud fornece uma conexão remota segura à sua instância enquanto estiver fora de casa. Também permite que você se conecte com serviços que apenas utilizam a nuvem: Amazon Alexa e Google Assistant.", "introduction2": "Este serviço é gerido pelo nosso parceiro ", "introduction2a": ", uma empresa criada pelos fundadores do Home Assistant e do Hass.io.", @@ -1247,6 +1248,7 @@ "attributes_set": "Os seguintes atributos de uma entidade são definidos por meio de programação.", "caption": "Personalização", "description": "Personalizar as suas entidades", + "different_include": "Possivelmente através de um domínio, um glob ou um include diferente.", "pick_attribute": "Escolha um atributo para substituir.", "picker": { "entity": "Entidade", @@ -1304,6 +1306,7 @@ "no_devices": "Sem dispositivos", "scene": { "create": "Criar cena com o dispositivo", + "no_scenes": "Sem cenários", "scenes": "Cenas" }, "scenes": "Cenas", @@ -1389,6 +1392,7 @@ "input_boolean": "Interruptor", "input_datetime": "Data e/ou hora", "input_number": "Número", + "input_select": "Lista de selecção", "input_text": "Texto" } }, @@ -1414,8 +1418,8 @@ }, "integration_panel_move": { "link_integration_page": "Página de Integrações", - "missing_zha": "Está faltando o painel de configuração do Z-Wave? Foi movido para a entrada do Z-Wave na {integrations_page} .", - "missing_zwave": "Está faltando o painel de configuração do Z-Wave? Foi movido para a entrada do Z-Wave na {integrations_page} ." + "missing_zha": "Falta o painel de configuração do Z-Wave? Foi movido para a entrada do Z-Wave na {integrations_page} .", + "missing_zwave": "Falta o painel de configuração do Z-Wave? Foi movido para a entrada do Z-Wave na {integrations_page} ." }, "integrations": { "add_integration": "Adicionar integração", @@ -1754,7 +1758,7 @@ "owner": "Proprietário", "system_generated": "Gerado pelo sistema", "system_generated_users_not_editable": "Não foi possível atualizar os utilizadores gerados pelo sistema.", - "system_generated_users_not_removable": "Não é possível remover usuários gerados pelo sistema.", + "system_generated_users_not_removable": "Não é possível remover utilizadores gerados pelo sistema.", "unnamed_user": "Utilizador sem nome", "update_user": "Atualizar" }, @@ -1765,11 +1769,11 @@ "system": "Sistema" } }, - "users_privileges_note": "O grupo de usuários é um trabalho em andamento. O usuário não poderá administrar a instância por meio da interface do usuário. Ainda estamos auditando todos os pontos de extremidade da API de gerenciamento para garantir que eles limitem corretamente o acesso aos administradores." + "users_privileges_note": "O grupo de utilizadores é um trabalho em progresso. O utilizador não poderá administrar a instância por meio da interface de utilizador. Ainda estamos a auditar todos os endpoints da API de gestão para garantir que eles limitam corretamente o acesso aos administradores." }, "zha": { "add_device_page": { - "discovered_text": "Os dispositivos aparecerão aqui uma vez descobertos.", + "discovered_text": "Os dispositivos aparecem aqui uma vez descobertos.", "discovery_text": "Os dispositivos descobertos aparecerão aqui. Siga as instruções para o(s) seu(s) dispositivo(s) e coloque o(s) dispositivo(s) em modo de emparelhamento.", "header": "Zigbee Home Automation - Adicionar dispositivos", "no_devices_found": "Nenhum dispositivo encontrado, verifique se eles estão no modo de emparelhamento e mantenha-os acordados enquanto a descoberta está em execução.", @@ -1936,22 +1940,32 @@ "true": "Verdadeiro" }, "node_management": { + "add_to_group": "Adicionar ao Grupo", "entities": "Entidades deste nó", "entity_info": "Definições da entidade", "exclude_entity": "Excluir esta entidade do Home Assistant", "group": "Grupo", + "header": "Gestão de nó Z-Wave", + "introduction": "Execute comandos do Z-Wave que afetam um único nó. Escolha um nó para ver uma lista dos comandos disponíveis.", + "max_associations": "Máximo de Associações:", "node_group_associations": "Associações de grupos de nós", "node_protection": "Proteção de nó", "node_to_control": "Configurar opçoes do nó", "nodes": "Nós", "nodes_hint": "Selecione o nó para visualizar as opções por nó", - "pooling_intensity": "Intensidade da votação", + "nodes_in_group": "Outros nós neste grupo:", + "pooling_intensity": "Intensidade de interrogação", "protection": "Proteção", + "remove_broadcast": "Remover Difusão", + "remove_from_group": "Remover do Grupo", "set_protection": "Definir proteção" }, "ozw_log": { "header": "Log OZW", - "introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. Ao carregar irá ser mostrado um log estático e a cauda será atualizada automaticamente com o último número especificado de linhas do log." + "introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. Ao carregar irá ser mostrado um log estático e a cauda será atualizada automaticamente com o último número especificado de linhas do log.", + "last_log_lines": "Número de últimas linhas de registos", + "load": "Carga", + "tail": "Cauda" }, "services": { "add_node": "Adicionar nó", @@ -1962,7 +1976,10 @@ "node_info": "Informação do Nó", "print_node": "Nó de impressão", "refresh_entity": "Actualizar entidade", + "refresh_node": "Atualizar nó", + "remove_failed_node": "Remover nó com falha", "remove_node": "Remover nó", + "replace_failed_node": "Substituir nó com falha", "save_config": "Guardar configuração", "soft_reset": "Reinicio suave", "start_network": "Iniciar a rede", @@ -2158,12 +2175,14 @@ } }, "generic": { + "aspect_ratio": "Rácio de Proporção", "attribute": "Atributo", "camera_image": "Entidade de Câmera", "camera_view": "Vista da Câmera", "double_tap_action": "Ação de toque duplo", "entities": "Entidades", "entity": "Entidade", + "hold_action": "Ação de retenção", "hours_to_show": "Horas a mostrar", "icon": "Ícone", "icon_height": "Altura do ícone", @@ -2238,7 +2257,8 @@ "name": "Entidade de imagem" }, "picture-glance": { - "description": "O cartão Vista de imagem mostra uma imagem e os estados das entidades correspondentes como um ícone. As entidades do lado direito permitem alternar ações, outras mostram a opção mais informações." + "description": "O cartão Vista de imagem mostra uma imagem e os estados das entidades correspondentes como um ícone. As entidades do lado direito permitem alternar ações, outras mostram a opção mais informações.", + "name": "Vista sobre imagem" }, "picture": { "description": "O cartão de imagem permite definir uma imagem a ser usada para navegação em vários pontos na sua interface ou para chamar um serviço.", @@ -2395,7 +2415,7 @@ "entity_non_numeric": "A entidade é não numérica: {entity}", "entity_not_found": "Entidade não disponível: {entity}", "entity_unavailable": "{entity} está indisponível no momento", - "starting": "Home Assistant está a inicializar, nem tudo está já disponivel" + "starting": "Home Assistant está a inicializar, nem tudo está já disponível" } }, "mailbox": { From e71dd7409eb18efa88e598f9504a2944f1d58152 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 9 Jul 2020 13:48:28 +0200 Subject: [PATCH 24/58] Scenes: Fix entity picked from device doesn't add device (#6343) Co-authored-by: Paulus Schoutsen --- src/panels/config/scene/ha-scene-editor.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/panels/config/scene/ha-scene-editor.ts b/src/panels/config/scene/ha-scene-editor.ts index 961d51672d..08f00562ef 100644 --- a/src/panels/config/scene/ha-scene-editor.ts +++ b/src/panels/config/scene/ha-scene-editor.ts @@ -532,6 +532,18 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { } this._entities = [...this._entities, entityId]; this._storeState(entityId); + + const entityRegistry = this._entityRegistryEntries.find( + (entityReg) => entityReg.entity_id === entityId + ); + + if ( + entityRegistry?.device_id && + !this._devices.includes(entityRegistry.device_id) + ) { + this._devices = [...this._devices, entityRegistry.device_id]; + } + this._dirty = true; } From 26e678a97d848b3cccb494bff7f2dedce14b6239 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Thu, 9 Jul 2020 15:00:01 +0300 Subject: [PATCH 25/58] mwc-fab fix where missing (#6352) --- src/panels/config/areas/ha-config-areas-dashboard.ts | 9 +++++---- src/panels/config/helpers/ha-config-helpers.ts | 11 +++++++++++ .../config/integrations/ha-config-integrations.ts | 2 +- .../resources/ha-config-lovelace-resources.ts | 11 +++++++++++ src/panels/config/person/ha-config-person.ts | 11 +++++++++++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/panels/config/areas/ha-config-areas-dashboard.ts b/src/panels/config/areas/ha-config-areas-dashboard.ts index 240c211fdb..2e0e56e9f2 100644 --- a/src/panels/config/areas/ha-config-areas-dashboard.ts +++ b/src/panels/config/areas/ha-config-areas-dashboard.ts @@ -38,6 +38,7 @@ import { showAreaRegistryDetailDialog, } from "./show-dialog-area-registry-detail"; import { mdiPlus } from "@mdi/js"; +import { computeRTL } from "../../../common/util/compute_rtl"; @customElement("ha-config-areas-dashboard") export class HaConfigAreasDashboard extends LitElement { @@ -126,6 +127,7 @@ export class HaConfigAreasDashboard extends LitElement { @@ -253,6 +255,15 @@ class HaConfigPerson extends LitElement { bottom: 24px; right: 24px; } + mwc-fab[rtl] { + right: auto; + left: 16px; + } + mwc-fab[is-wide][rtl] { + bottom: 24px; + left: 24px; + right: auto; + } `; } } From 8ce120b74d4b3f72c4cd4aba722381f3bdbc7198 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Thu, 9 Jul 2020 20:19:59 +0200 Subject: [PATCH 26/58] Round values for relative time instead of flooring (#6225) --- src/common/datetime/relative_time.ts | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/common/datetime/relative_time.ts b/src/common/datetime/relative_time.ts index 8eaafb4ad3..cc414b1e12 100644 --- a/src/common/datetime/relative_time.ts +++ b/src/common/datetime/relative_time.ts @@ -20,31 +20,24 @@ export default function relativeTime( let delta = (compareTime.getTime() - dateObj.getTime()) / 1000; const tense = delta >= 0 ? "past" : "future"; delta = Math.abs(delta); - - let timeDesc; + let roundedDelta = Math.round(delta); + let unit = "week"; for (let i = 0; i < tests.length; i++) { - if (delta < tests[i]) { - delta = Math.floor(delta); - timeDesc = localize( - `ui.components.relative_time.duration.${langKey[i]}`, - "count", - delta - ); + if (roundedDelta < tests[i]) { + unit = langKey[i]; break; } delta /= tests[i]; + roundedDelta = Math.round(delta); } - if (timeDesc === undefined) { - delta = Math.floor(delta); - timeDesc = localize( - "ui.components.relative_time.duration.week", - "count", - delta - ); - } + const timeDesc = localize( + `ui.components.relative_time.duration.${unit}`, + "count", + roundedDelta + ); return options.includeTense === false ? timeDesc From efa2b2db27d76a523d9ef93189b118ff6e674372 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 10 Jul 2020 00:32:45 +0000 Subject: [PATCH 27/58] [ci skip] Translation update --- translations/frontend/nl.json | 5 +++++ translations/frontend/ru.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index a9a90d8f8a..7e09673c70 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1941,9 +1941,14 @@ }, "node_management": { "add_to_group": "Toevoegen aan groep", + "entities": "Entiteiten van dit knooppunt", "entity_info": "Entiteitsinformatie", "exclude_entity": "Sluit deze entiteit uit van Home Assistant", "group": "Groep", + "header": "Z-Wave Knooppunt-beheer", + "introduction": "Voer Z-Wave commando's uit die een enkel knooppunt beïnvloeden. Kies een knooppunt om een lijst met beschikbare commando's te zien.", + "nodes": "Knooppunten", + "nodes_hint": "Selecteer knooppunt om de opties per knooppunt te bekijken", "protection": "Bescherming", "remove_from_group": "Verwijderen uit groep", "set_protection": "Bescherming instellen" diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index bc1d523cd8..4ebd82b8d1 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1836,7 +1836,7 @@ "adding_members": "Добавление участников", "caption": "Группы", "create": "Создать группу", - "create_group": "Zigbee Home Automation - Создать группу", + "create_group": "Создание новой группы", "create_group_details": "Укажите необходимые данные для создания новой группы Zigbee", "creating_group": "Создание группы", "description": "Создавайте и изменяйте группы Zigbee", From c9ec4b4e24adf157a35acd038acf547c8dcf60d5 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 10 Jul 2020 10:16:48 +0200 Subject: [PATCH 28/58] Migrate entity settings dialog (#6349) --- src/dialogs/more-info/ha-more-info-dialog.ts | 3 +- .../config/entities/dialog-entity-editor.ts | 219 ++++++++---------- .../settings/entity-settings-helper-tab.ts | 57 ++--- .../entities/entity-registry-settings.ts | 140 ++++++----- 4 files changed, 190 insertions(+), 229 deletions(-) diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index a52430bbd0..e4dff4b279 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -1,8 +1,9 @@ import "@material/mwc-button"; +import "@material/mwc-icon-button"; import "@polymer/app-layout/app-toolbar/app-toolbar"; import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import "../../components/ha-icon-button"; import "../../components/ha-dialog"; +import "../../components/ha-svg-icon"; import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { DOMAINS_MORE_INFO_NO_HISTORY } from "../../common/const"; import { computeStateName } from "../../common/entity/compute_state_name"; diff --git a/src/panels/config/entities/dialog-entity-editor.ts b/src/panels/config/entities/dialog-entity-editor.ts index 3aecc2b883..e765ddffb8 100644 --- a/src/panels/config/entities/dialog-entity-editor.ts +++ b/src/panels/config/entities/dialog-entity-editor.ts @@ -1,8 +1,7 @@ import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import "../../../components/ha-icon-button"; import "@polymer/paper-tabs/paper-tab"; import "@polymer/paper-tabs/paper-tabs"; +import "@material/mwc-icon-button"; import { HassEntity } from "home-assistant-js-websocket"; import { css, @@ -11,27 +10,26 @@ import { html, LitElement, property, - query, TemplateResult, } from "lit-element"; import { cache } from "lit-html/directives/cache"; import { dynamicElement } from "../../../common/dom/dynamic-element-directive"; import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import "../../../components/dialog/ha-paper-dialog"; -import type { HaPaperDialog } from "../../../components/dialog/ha-paper-dialog"; +import "../../../components/ha-dialog"; +import "../../../components/ha-svg-icon"; import "../../../components/ha-related-items"; import { EntityRegistryEntry, ExtEntityRegistryEntry, getExtendedEntityRegistryEntry, } from "../../../data/entity_registry"; -import type { PolymerChangedEvent } from "../../../polymer-types"; import { haStyleDialog } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import { PLATFORMS_WITH_SETTINGS_TAB } from "./const"; import "./entity-registry-settings"; import type { EntityRegistryDetailDialogParams } from "./show-dialog-entity-editor"; +import { mdiClose, mdiTune } from "@mdi/js"; interface Tabs { [key: string]: Tab; @@ -59,8 +57,6 @@ export class DialogEntityEditor extends LitElement { @property() private _settingsElementTag?: string; - @query("ha-paper-dialog") private _dialog!: HaPaperDialog; - private _curTabIndex = 0; public async showDialog( @@ -87,91 +83,97 @@ export class DialogEntityEditor extends LitElement { const stateObj: HassEntity | undefined = this.hass.states[entityId]; return html` - - - -
- ${stateObj ? computeStateName(stateObj) : entry?.name || entityId} -
- ${stateObj - ? html` - - ` - : ""} -
- - - ${this.hass.localize("ui.dialogs.entity_registry.settings")} - - ${Object.entries(this._extraTabs).map( - ([key, tab]) => html` - - ${this.hass.localize(tab.translationKey) || key} - - ` - )} - - ${this.hass.localize("ui.dialogs.entity_registry.related")} - - - ${cache( - this._curTab === "tab-settings" - ? entry - ? this._settingsElementTag - ? html` - ${dynamicElement(this._settingsElementTag, { - hass: this.hass, - entry, - entityId, - dialogElement: this._dialog, - })} - ` - : "" - : html` - - ${this.hass.localize( - "ui.dialogs.entity_registry.no_unique_id" +
+ + + + +
+ ${stateObj ? computeStateName(stateObj) : entry?.name || entityId} +
+ ${stateObj + ? html` + + @click=${this._openMoreInfo} + > + + ` - : this._curTab === "tab-related" - ? html` - - - + : ""} +
+ + + ${this.hass.localize("ui.dialogs.entity_registry.settings")} + + ${Object.entries(this._extraTabs).map( + ([key, tab]) => html` + + ${this.hass.localize(tab.translationKey) || key} + ` - : html`` - )} - + )} + + ${this.hass.localize("ui.dialogs.entity_registry.related")} + + +
+
+ ${cache(this._renderTab())} +
+ `; } + private _renderTab() { + switch (this._curTab) { + case "tab-settings": + if (this._entry) { + if (this._settingsElementTag) { + return html` + ${dynamicElement(this._settingsElementTag, { + hass: this.hass, + entry: this._entry, + entityId: this._params!.entity_id, + })} + `; + } + return html``; + } + return html` +
+ ${this.hass.localize("ui.dialogs.entity_registry.no_unique_id")} +
+ `; + case "tab-related": + return html` + + `; + default: + return html``; + } + } + private async _getEntityReg() { try { this._entry = await getExtendedEntityRegistryEntry( @@ -189,12 +191,6 @@ export class DialogEntityEditor extends LitElement { return; } this._curTab = ev.detail.value.id; - this._resizeDialog(); - } - - private async _resizeDialog(): Promise { - await this.updateComplete; - fireEvent(this._dialog as HTMLElement, "iron-resize"); } private async _loadPlatformSettingTabs(): Promise { @@ -219,12 +215,6 @@ export class DialogEntityEditor extends LitElement { this.closeDialog(); } - private _openedChanged(ev: PolymerChangedEvent): void { - if (!(ev.detail as any).value) { - this._params = undefined; - } - } - static get styles(): CSSResult[] { return [ haStyleDialog, @@ -249,16 +239,23 @@ export class DialogEntityEditor extends LitElement { text-overflow: ellipsis; } + ha-dialog { + --dialog-content-padding: 0; + } + @media all and (min-width: 451px) and (min-height: 501px) { .main-title { pointer-events: auto; cursor: default; } + .wrapper { + width: 400px; + } } - ha-paper-dialog { - width: 450px; - max-height: none !important; + .content { + display: block; + padding: 20px 24px; } /* overrule the ha-style-dialog max-height on small screens */ @@ -267,28 +264,6 @@ export class DialogEntityEditor extends LitElement { background-color: var(--app-header-background-color); color: var(--app-header-text-color, white); } - ha-paper-dialog { - height: 100%; - max-height: 100% !important; - width: 100% !important; - border-radius: 0px; - position: fixed !important; - margin: 0; - } - ha-paper-dialog::before { - content: ""; - position: fixed; - z-index: -1; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; - background-color: inherit; - } - } - - paper-dialog-scrollable { - padding-bottom: 16px; } mwc-button.warning { diff --git a/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts b/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts index e6aa99aa2f..dbf2a37a88 100644 --- a/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts +++ b/src/panels/config/entities/editor-tabs/settings/entity-settings-helper-tab.ts @@ -12,7 +12,6 @@ import { import { isComponentLoaded } from "../../../../../common/config/is_component_loaded"; import { dynamicElement } from "../../../../../common/dom/dynamic-element-directive"; import { fireEvent } from "../../../../../common/dom/fire_event"; -import { HaPaperDialog } from "../../../../../components/dialog/ha-paper-dialog"; import { ExtEntityRegistryEntry, removeEntityRegistryEntry, @@ -87,8 +86,6 @@ export class EntityRegistrySettingsHelper extends LitElement { @property() public entry!: ExtEntityRegistryEntry; - @property() public dialogElement!: HaPaperDialog; - @property() private _error?: string; @property() private _item?: Helper | null; @@ -120,32 +117,30 @@ export class EntityRegistrySettingsHelper extends LitElement { } const stateObj = this.hass.states[this.entry.entity_id]; return html` - - ${this._error ? html`
${this._error}
` : ""} -
- ${!this._componentLoaded - ? this.hass.localize( - "ui.dialogs.helper_settings.platform_not_loaded", - "platform", - this.entry.platform - ) - : this._item === null - ? this.hass.localize("ui.dialogs.helper_settings.yaml_not_editable") - : html` -
- ${dynamicElement(`ha-${this.entry.platform}-form`, { - hass: this.hass, - item: this._item, - entry: this.entry, - })} -
- `} - -
-
+ ${this._error ? html`
${this._error}
` : ""} +
+ ${!this._componentLoaded + ? this.hass.localize( + "ui.dialogs.helper_settings.platform_not_loaded", + "platform", + this.entry.platform + ) + : this._item === null + ? this.hass.localize("ui.dialogs.helper_settings.yaml_not_editable") + : html` + + ${dynamicElement(`ha-${this.entry.platform}-form`, { + hass: this.hass, + item: this._item, + entry: this.entry, + })} + + `} + +
item.id === this.entry.unique_id) || null; - await this.updateComplete; - fireEvent(this.dialogElement as HTMLElement, "iron-resize"); } private async _updateItem(): Promise { @@ -232,7 +225,7 @@ export class EntityRegistrySettingsHelper extends LitElement { padding: 0 !important; } .form { - padding-bottom: 24px; + padding: 20px 24px; } .buttons { display: flex; diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index 7fc445518b..d5f971dc36 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -33,8 +33,6 @@ export class EntityRegistrySettings extends LitElement { @property() public entry!: ExtEntityRegistryEntry; - @property() public dialogElement!: HTMLElement; - @property() private _name!: string; @property() private _icon!: string; @@ -72,82 +70,76 @@ export class EntityRegistrySettings extends LitElement { computeDomain(this._entityId.trim()) !== computeDomain(this.entry.entity_id); return html` - - ${!stateObj - ? html` -
- ${this.hass!.localize( - "ui.dialogs.entity_registry.editor.unavailable" - )} -
- ` - : ""} - ${this._error ? html`
${this._error}
` : ""} -
- - - -
- - + ${!stateObj + ? html`
-
- ${this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_label" - )} -
-
- ${this._disabledBy && this._disabledBy !== "user" - ? this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_cause", - "cause", - this.hass.localize( - `config_entry.disabled_by.${this._disabledBy}` - ) + ${this.hass!.localize( + "ui.dialogs.entity_registry.editor.unavailable" + )} +
+ ` + : ""} + ${this._error ? html`
${this._error}
` : ""} +
+ + + +
+ + +
+
+ ${this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_label" + )} +
+
+ ${this._disabledBy && this._disabledBy !== "user" + ? this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_cause", + "cause", + this.hass.localize( + `config_entry.disabled_by.${this._disabledBy}` ) - : ""} - ${this.hass.localize( - "ui.dialogs.entity_registry.editor.enabled_description" - )} -
${this.hass.localize( - "ui.dialogs.entity_registry.editor.note" - )} -
+ ) + : ""} + ${this.hass.localize( + "ui.dialogs.entity_registry.editor.enabled_description" + )} +
${this.hass.localize( + "ui.dialogs.entity_registry.editor.note" + )}
- +
Date: Fri, 10 Jul 2020 18:09:07 +0300 Subject: [PATCH 29/58] Fixed label + RTL + X position (#6348) --- .../forgot-password/cloud-forgot-password.js | 5 +++-- src/panels/config/cloud/login/cloud-login.js | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/panels/config/cloud/forgot-password/cloud-forgot-password.js b/src/panels/config/cloud/forgot-password/cloud-forgot-password.js index 65b0ee4708..35d3c7969e 100644 --- a/src/panels/config/cloud/forgot-password/cloud-forgot-password.js +++ b/src/panels/config/cloud/forgot-password/cloud-forgot-password.js @@ -125,8 +125,9 @@ class CloudForgotPassword extends LocalizeMixin(EventsMixin(PolymerElement)) { () => { this._requestInProgress = false; this.fire("cloud-done", { - flashMessage: - "[[localize('ui.panel.config.cloud.forgot_password.check_your_email')]]", + flashMessage: this.hass.localize( + "ui.panel.config.cloud.forgot_password.check_your_email" + ), }); }, (err) => diff --git a/src/panels/config/cloud/login/cloud-login.js b/src/panels/config/cloud/login/cloud-login.js index c5ac31c43d..3b060d9bd1 100644 --- a/src/panels/config/cloud/login/cloud-login.js +++ b/src/panels/config/cloud/login/cloud-login.js @@ -16,6 +16,7 @@ import LocalizeMixin from "../../../../mixins/localize-mixin"; import NavigateMixin from "../../../../mixins/navigate-mixin"; import "../../../../styles/polymer-ha-style"; import "../../ha-config-section"; +import { computeRTL } from "../../../../common/util/compute_rtl"; /* * @appliesMixin NavigateMixin @@ -66,10 +67,14 @@ class CloudLogin extends LocalizeMixin( } .flash-msg ha-icon-button { position: absolute; - top: 8px; + top: 4px; right: 8px; color: var(--secondary-text-color); } + :host([rtl]) .flash-msg ha-icon-button { + right: auto; + left: 8px; + }
@@ -191,6 +196,11 @@ class CloudLogin extends LocalizeMixin( type: String, notify: true, }, + rtl: { + type: Boolean, + reflectToAttribute: true, + computed: "_computeRTL(hass)", + }, _error: String, }; } @@ -306,6 +316,10 @@ class CloudLogin extends LocalizeMixin( this.flashMessage = ""; }, 200); } + + _computeRTL(hass) { + return computeRTL(hass); + } } customElements.define("cloud-login", CloudLogin); From 5078dc1cbf6cf1c08461278995e1f2429c2b15f3 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Fri, 10 Jul 2020 22:54:38 +0300 Subject: [PATCH 30/58] Fixed X placement (#6358) --- src/dialogs/config-flow/dialog-data-entry-flow.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 228cead5ce..5cb369c0f0 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -35,6 +35,7 @@ import "./step-flow-external"; import "./step-flow-form"; import "./step-flow-loading"; import "./step-flow-pick-handler"; +import { computeRTL } from "../../common/util/compute_rtl"; let instance = 0; @@ -147,6 +148,7 @@ class DataEntryFlowDialog extends LitElement { )} icon="hass:close" dialogAction="close" + ?rtl=${computeRTL(this.hass)} > ${this._step === null ? // Show handler picker @@ -318,6 +320,10 @@ class DataEntryFlowDialog extends LitElement { top: 0; right: 0; } + ha-icon-button[rtl] { + right: auto; + left: 0; + } `, ]; } From e37540877733b666340492dec52162bb4048fd37 Mon Sep 17 00:00:00 2001 From: Rohan Kapoor Date: Fri, 10 Jul 2020 17:29:29 -0700 Subject: [PATCH 31/58] Provide credentials to relative links only (#6360) Co-authored-by: Paulus Schoutsen --- src/common/dom/load_resource.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/dom/load_resource.ts b/src/common/dom/load_resource.ts index f8df3f2366..670afddc9e 100644 --- a/src/common/dom/load_resource.ts +++ b/src/common/dom/load_resource.ts @@ -23,7 +23,7 @@ const _load = ( if (type) { (element as HTMLScriptElement).type = type; // https://github.com/home-assistant/frontend/pull/6328 - (element as HTMLScriptElement).crossOrigin = "use-credentials"; + (element as HTMLScriptElement).crossOrigin = url.substr(0, 1) === "/" ? "use-credentials" : "anonymous"; } break; case "link": From 51be916f39a761a6b04cb2fbaa692b8df33440dc Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 11 Jul 2020 00:32:28 +0000 Subject: [PATCH 32/58] [ci skip] Translation update --- translations/frontend/he.json | 2 +- translations/frontend/ru.json | 2 +- translations/frontend/zh-Hans.json | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/translations/frontend/he.json b/translations/frontend/he.json index edcce1a12e..c283fd38cc 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -1046,7 +1046,7 @@ }, "introduction": "עורך אוטומציה מאפשר לך ליצור ולערוך אוטומציות. אנא עקוב אחר הקישור למטה וקרא את ההוראות כדי לוודא שהגדרת את ה - Home Assistant כהלכה.", "learn_more": "למד עוד על אוטומציות", - "no_automations": "לא הצלחנו למצוא שום אוטומציה הניתנת לעריכה", + "no_automations": "לא מצאנו אוטומציה הניתנת לעריכה", "only_editable": "רק אוטומציות שהוגדרו ב automations.yaml ניתנות לעריכה.", "pick_automation": "בחר אוטומציה לעריכה", "show_info_automation": "הצג מידע על אוטומציה" diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 4ebd82b8d1..a543b74b4a 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1472,7 +1472,7 @@ "ignore": { "confirm_delete_ignore": "Эта интеграция станет доступна для обнаружения системой. Обнаружение произойдёт автоматически в течении некоторого времени, либо после перезапуска системы.", "confirm_delete_ignore_title": "Прекратить игнорировать {name}?", - "confirm_ignore": "Вы сможете снова включить обнаружение этой интеграции системой. Для этого откройте меню в правом верхнем углу и нажмите «Показать игнорируемые интеграции».", + "confirm_ignore": "Вы сможете снова включить обнаружение этой интеграции. Для этого откройте меню в правом верхнем углу и нажмите «Показать игнорируемые интеграции».", "confirm_ignore_title": "Игнорировать обнаружение интеграции {name}?", "hide_ignored": "Скрыть игнорируемые интеграции", "ignore": "Игнорировать", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index eeb8678938..5bfaece08d 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -123,7 +123,7 @@ }, "default": { "off": "关闭", - "on": "开" + "on": "开启" }, "door": { "off": "关闭", @@ -229,7 +229,7 @@ }, "fan": { "off": "关闭", - "on": "开" + "on": "开启" }, "group": { "closed": "已关闭", @@ -251,7 +251,7 @@ "on": "开" }, "light": { - "off": "关闭", + "off": "关", "on": "开" }, "lock": { @@ -261,7 +261,7 @@ "media_player": { "idle": "空闲", "off": "关闭", - "on": "开", + "on": "开启", "paused": "已暂停", "playing": "正在播放", "standby": "待机" @@ -286,7 +286,7 @@ }, "sensor": { "off": "关闭", - "on": "开" + "on": "开启" }, "sun": { "above_horizon": "日出", From 833ccf363768c9aecf35dfec5d8b90c09c0c2283 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Sat, 11 Jul 2020 19:06:39 +0300 Subject: [PATCH 33/58] Card picker improvements (#6361) --- .../editor/card-editor/hui-card-picker.ts | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index 9fdf96e464..c9b7b8b963 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -116,16 +116,16 @@ export class HuiCardPicker extends LitElement { @click=${this._cardPicked} .config=${{ type: "" }} > -
- ${this.hass!.localize( - `ui.panel.lovelace.editor.card.generic.manual_description` - )} -
${this.hass!.localize( `ui.panel.lovelace.editor.card.generic.manual` )}
+
+ ${this.hass!.localize( + `ui.panel.lovelace.editor.card.generic.manual_description` + )} +
@@ -255,6 +255,7 @@ export class HuiCardPicker extends LitElement { color: var(--ha-card-header-color, --primary-text-color); font-family: var(--ha-card-header-font-family, inherit); font-size: 16px; + font-weight: bold; letter-spacing: -0.012em; line-height: 20px; padding: 12px 16px; @@ -265,7 +266,7 @@ export class HuiCardPicker extends LitElement { var(--paper-card-background-color, white) ); border-radius: 0 0 4px 4px; - border-top: 1px solid var(--divider-color); + border-bottom: 1px solid var(--divider-color); } .preview { @@ -377,6 +378,13 @@ export class HuiCardPicker extends LitElement { @click=${this._cardPicked} .config=${cardConfig} >
+
+ ${customCard + ? `${this.hass!.localize( + "ui.panel.lovelace.editor.cardpicker.custom_card" + )}: ${customCard.name || customCard.type}` + : name} +
-
- ${customCard - ? `${this.hass!.localize( - "ui.panel.lovelace.editor.cardpicker.custom_card" - )}: ${customCard.name || customCard.type}` - : name} -
`; } From 7d1835e59c74aa05e817a46a841f9e9898918d79 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Sat, 11 Jul 2020 19:07:22 +0300 Subject: [PATCH 34/58] Localization updates (#6359) --- src/common/search/search-input.ts | 5 ++++- src/dialogs/config-flow/step-flow-pick-handler.ts | 1 + src/layouts/hass-tabs-subpage-data-table.ts | 6 ++++++ src/panels/config/entities/ha-config-entities.ts | 3 +++ src/panels/config/helpers/ha-config-helpers.ts | 3 +++ .../config/integrations/ha-config-integrations.ts | 6 ++++++ .../lovelace/editor/card-editor/hui-card-picker.ts | 3 +++ src/translations/en.json | 11 +++++++++-- 8 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/common/search/search-input.ts b/src/common/search/search-input.ts index 0b819496f2..1d52dbcde6 100644 --- a/src/common/search/search-input.ts +++ b/src/common/search/search-input.ts @@ -26,6 +26,9 @@ class SearchInput extends LitElement { @property({ type: Boolean }) public autofocus = false; + @property({ type: String }) + public label?: string; + public focus() { this.shadowRoot!.querySelector("paper-input")!.focus(); } @@ -43,7 +46,7 @@ class SearchInput extends LitElement {
${this.activeFilters ? html`
@@ -172,6 +175,9 @@ export class HaTabsSubpageDataTable extends LitElement { no-label-float no-underline @value-changed=${this._handleSearchChange} + .label=${this.hass.localize( + "ui.components.data-table.search" + )} > ${this.activeFilters diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index e43f2ab103..c833a96faa 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -422,6 +422,9 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { no-underline @value-changed=${this._handleSearchChange} .filter=${this._filter} + .label=${this.hass.localize( + "ui.panel.config.entities.picker.search" + )} >${activeFilters ? html`
diff --git a/src/panels/config/helpers/ha-config-helpers.ts b/src/panels/config/helpers/ha-config-helpers.ts index aa9418b709..113f7d0655 100644 --- a/src/panels/config/helpers/ha-config-helpers.ts +++ b/src/panels/config/helpers/ha-config-helpers.ts @@ -155,6 +155,9 @@ export class HaConfigHelpers extends LitElement { .data=${this._getItems(this._stateItems)} @row-click=${this._openEditDialog} hasFab + .noDataText=${this.hass.localize( + "ui.panel.config.helpers.picker.no_helpers" + )} >
@@ -293,6 +296,9 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { no-underline .filter=${this._filter} @value-changed=${this._handleSearchChange} + .label=${this.hass.localize( + "ui.panel.config.integrations.search" + )} >
` diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index c9b7b8b963..ab87b56caa 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -97,6 +97,9 @@ export class HuiCardPicker extends LitElement { .filter=${this._filter} no-label-float @value-changed=${this._handleSearchChange} + .label=${this.hass.localize( + "ui.panel.lovelace.editor.card.generic.search" + )} >
Date: Sat, 11 Jul 2020 19:11:13 +0300 Subject: [PATCH 35/58] Added forceLTR attribute on a column in ha-data-table (#6363) --- src/components/data-table/ha-data-table.ts | 5 +++++ .../lovelace/resources/ha-config-lovelace-resources.ts | 1 + 2 files changed, 6 insertions(+) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index c6b38fc84b..3ec2aba13a 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -69,6 +69,7 @@ export interface DataTableColumnData extends DataTableSortColumnData { width?: string; maxWidth?: string; grows?: boolean; + forceLTR?: boolean; } export interface DataTableRowData { @@ -352,6 +353,7 @@ export class HaDataTable extends LitElement { column.type === "icon-button" ), grows: Boolean(column.grows), + forceLTR: Boolean(column.forceLTR), })}" style=${column.width ? styleMap({ @@ -855,6 +857,9 @@ export class HaDataTable extends LitElement { flex-grow: 1; flex-shrink: 1; } + .forceLTR { + direction: ltr; + } `; } } diff --git a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts index 72cb604d6c..1b31ba3e10 100644 --- a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts +++ b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts @@ -65,6 +65,7 @@ export class HaConfigLovelaceRescources extends LitElement { filterable: true, direction: "asc", grows: true, + forceLTR: true, }, type: { title: this.hass.localize( From 914b47f34090bbf381cbb7a6f4bd14586d44cbe9 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 11 Jul 2020 21:30:02 +0200 Subject: [PATCH 36/58] Bump MDI and add warning for removed and renamed icons (#6357) --- build-scripts/gulp/gen-icons-json.js | 10 +- build-scripts/removedIcons.json | 263 ++++++++++++++++++ package.json | 4 +- src/common/entity/domain_icon.ts | 6 +- src/components/entity/ha-state-label-badge.ts | 4 +- src/components/ha-icon.ts | 222 ++++++++++++++- src/components/ha-sidebar.ts | 4 +- src/dialogs/more-info/ha-more-info-dialog.ts | 4 +- src/fake_data/demo_panels.ts | 2 +- .../config/areas/ha-config-area-page.ts | 2 +- .../config/devices/ha-config-device-page.ts | 2 +- src/panels/config/ha-panel-config.ts | 4 +- .../lovelace/cards/hui-thermostat-card.ts | 2 +- src/state/hass-element.ts | 2 + src/state/logging-mixin.ts | 40 +++ yarn.lock | 16 +- 16 files changed, 561 insertions(+), 26 deletions(-) create mode 100644 build-scripts/removedIcons.json create mode 100644 src/state/logging-mixin.ts diff --git a/build-scripts/gulp/gen-icons-json.js b/build-scripts/gulp/gen-icons-json.js index 5648308486..58bb4faaaa 100644 --- a/build-scripts/gulp/gen-icons-json.js +++ b/build-scripts/gulp/gen-icons-json.js @@ -11,6 +11,7 @@ const META_PATH = path.resolve(ICON_PACKAGE_PATH, "meta.json"); const PACKAGE_PATH = path.resolve(ICON_PACKAGE_PATH, "package.json"); const ICON_PATH = path.resolve(ICON_PACKAGE_PATH, "svg"); const OUTPUT_DIR = path.resolve(__dirname, "../../build/mdi"); +const REMOVED_ICONS_PATH = path.resolve(__dirname, "../removedIcons.json"); const encoding = "utf8"; @@ -25,6 +26,13 @@ const getMeta = () => { }); }; +const addRemovedMeta = (meta) => { + const file = fs.readFileSync(REMOVED_ICONS_PATH, { encoding }); + const removed = JSON.parse(file); + const combinedMeta = [...meta, ...removed]; + return combinedMeta.sort((a, b) => a.name.localeCompare(b.name)); +}; + const splitBySize = (meta) => { const chunks = []; const CHUNK_SIZE = 50000; @@ -69,7 +77,7 @@ const findDifferentiator = (curString, prevString) => { }; gulp.task("gen-icons-json", (done) => { - const meta = getMeta(); + const meta = addRemovedMeta(getMeta()); const split = splitBySize(meta); if (!fs.existsSync(OUTPUT_DIR)) { diff --git a/build-scripts/removedIcons.json b/build-scripts/removedIcons.json new file mode 100644 index 0000000000..887da3dab7 --- /dev/null +++ b/build-scripts/removedIcons.json @@ -0,0 +1,263 @@ +[ + { + "path": "M17.5,15.61C17.33,15.37 9.53,5.4 9.27,5.08C9,4.75 9.08,4.65 9.13,4.59C9.22,4.5 9.36,4.5 9.93,4.5C10.26,4.5 13.59,4.5 13.94,4.47C14.66,4.47 14.78,4.53 14.85,4.56C14.93,4.58 15.13,4.75 15.26,4.92C15.33,5 22.32,13.36 22.39,13.45C22.46,13.54 22.59,13.69 22.67,13.84C22.76,14 22.77,14.18 22.64,14.25C22.56,14.3 18.7,15.89 18.59,15.93C18.5,16 18.27,16.06 18.11,16.04C18,16 17.77,15.92 17.5,15.61M21.47,15.42L21.75,15.47C21.75,15.47 22.68,15.65 22.77,15.67C22.87,15.69 22.96,15.76 22.95,15.79C22.94,15.87 22.9,15.91 22.83,15.95C22.77,16 18.58,18.58 18.5,18.62C18.43,18.66 18.33,18.72 18.11,18.75C17.7,18.83 16.91,18.61 16.66,18.56C16.41,18.5 6.15,16.23 6.06,16.2C5.97,16.17 5.91,16.16 5.9,16.08C5.89,15.94 6.11,15.88 6.28,15.81C6.46,15.75 11.28,14 11.45,13.93C11.62,13.86 11.84,13.84 11.95,13.83C12.06,13.82 12.73,13.93 13.03,13.97C13.34,14 14.2,14.15 14.2,14.15L16.16,16.7C16.5,17.09 16.72,17.25 17,17.28C17.15,17.29 17.31,17.25 17.42,17.2C17.5,17.16 21.47,15.42 21.47,15.42M10.25,9.18L11.96,11.37L12,11.45V11.5C11.96,11.54 8.93,14.32 8.91,14.35L5.72,15.5C5.72,15.5 5.63,15.55 5.58,15.58C5.53,15.61 5.47,15.67 5.5,15.82C5.5,15.87 5.5,16.59 5.5,16.79L1.56,18.04C1.37,18.1 1,18.23 0.95,18.19C0.88,18.14 0.97,18.03 1,17.97C1.06,17.91 9.08,10 9.39,9.7C9.84,9.24 10.25,9.18 10.25,9.18", + "name": "accusoft" + }, + { + "path": "M4.94,11.12C5.23,11.12 5.5,11.16 5.76,11.23C5.77,9.09 7.5,7.35 9.65,7.35C11.27,7.35 12.67,8.35 13.24,9.77C13.83,9 14.74,8.53 15.76,8.53C17.5,8.53 18.94,9.95 18.94,11.71C18.94,11.95 18.91,12.2 18.86,12.43C19.1,12.34 19.37,12.29 19.65,12.29C20.95,12.29 22,13.35 22,14.65C22,15.95 20.95,17 19.65,17C18.35,17 6.36,17 4.94,17C3.32,17 2,15.68 2,14.06C2,12.43 3.32,11.12 4.94,11.12Z", + "name": "amazon-drive" + }, + { + "path": "M8,11.5A1.25,1.25 0 0,0 6.75,12.75A1.25,1.25 0 0,0 8,14A1.25,1.25 0 0,0 9.25,12.75A1.25,1.25 0 0,0 8,11.5M16,11.5A1.25,1.25 0 0,0 14.75,12.75A1.25,1.25 0 0,0 16,14A1.25,1.25 0 0,0 17.25,12.75A1.25,1.25 0 0,0 16,11.5M12,7C13.5,7 14.9,7.33 16.18,7.91L18.34,5.75C18.73,5.36 19.36,5.36 19.75,5.75C20.14,6.14 20.14,6.77 19.75,7.16L17.95,8.96C20.41,10.79 22,13.71 22,17H2C2,13.71 3.59,10.79 6.05,8.96L4.25,7.16C3.86,6.77 3.86,6.14 4.25,5.75C4.64,5.36 5.27,5.36 5.66,5.75L7.82,7.91C9.1,7.33 10.5,7 12,7Z", + "name": "android-head" + }, + { + "path": "M2,16.25C2,16.25 4,3.75 12,3.75C20,3.75 22,16.25 22,16.25C22,16.25 20,20.25 12,20.25C4,20.25 2,16.25 2,16.25M3.35,15.65C3.35,15.65 4.3,19 12,19C17,19 20,17.8 20.65,15.85C21.3,13.9 15.65,7.6 14.65,7.6C13.65,7.6 11.2,12 10.45,12C8.45,12 8.9,10 7.15,10C5.4,10 3.35,15.65 3.35,15.65Z", + "name": "basecamp" + }, + { + "path": "M7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7C10.87,7 9.84,7.37 9,8V2.46C9.95,2.16 10.95,2 12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12C2,8.3 4,5.07 7,3.34V12M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z", + "name": "beats" + }, + { + "path": "M19.58,12.27C19.54,11.65 19.33,11.18 18.96,10.86C18.59,10.54 18.13,10.38 17.58,10.38C17,10.38 16.5,10.55 16.19,10.89C15.86,11.23 15.65,11.69 15.57,12.27M21.92,12.04C22,12.45 22,13.04 22,13.81H15.5C15.55,14.71 15.85,15.33 16.44,15.69C16.79,15.92 17.22,16.03 17.73,16.03C18.26,16.03 18.69,15.89 19,15.62C19.2,15.47 19.36,15.27 19.5,15H21.88C21.82,15.54 21.53,16.07 21,16.62C20.22,17.5 19.1,17.92 17.66,17.92C16.47,17.92 15.43,17.55 14.5,16.82C13.62,16.09 13.16,14.9 13.16,13.25C13.16,11.7 13.57,10.5 14.39,9.7C15.21,8.87 16.27,8.46 17.58,8.46C18.35,8.46 19.05,8.6 19.67,8.88C20.29,9.16 20.81,9.59 21.21,10.2C21.58,10.73 21.81,11.34 21.92,12.04M9.58,14.07C9.58,13.42 9.31,12.97 8.79,12.73C8.5,12.6 8.08,12.53 7.54,12.5H4.87V15.84H7.5C8.04,15.84 8.46,15.77 8.76,15.62C9.31,15.35 9.58,14.83 9.58,14.07M4.87,10.46H7.5C8.04,10.46 8.5,10.36 8.82,10.15C9.16,9.95 9.32,9.58 9.32,9.06C9.32,8.5 9.1,8.1 8.66,7.91C8.27,7.78 7.78,7.72 7.19,7.72H4.87M11.72,12.42C12.04,12.92 12.2,13.53 12.2,14.24C12.2,15 12,15.64 11.65,16.23C11.41,16.62 11.12,16.94 10.77,17.21C10.37,17.5 9.9,17.72 9.36,17.83C8.82,17.94 8.24,18 7.61,18H2V5.55H8C9.53,5.58 10.6,6 11.23,6.88C11.61,7.41 11.8,8.04 11.8,8.78C11.8,9.54 11.61,10.15 11.23,10.61C11,10.87 10.7,11.11 10.28,11.32C10.91,11.55 11.39,11.92 11.72,12.42M20.06,7.32H15.05V6.07H20.06V7.32Z", + "name": "behance" + }, + { + "path": "M5.45,10.28C6.4,10.28 7.5,11.05 7.5,12C7.5,12.95 6.4,13.72 5.45,13.72H2L2.69,10.28H5.45M6.14,4.76C7.09,4.76 8.21,5.53 8.21,6.5C8.21,7.43 7.09,8.21 6.14,8.21H2.69L3.38,4.76H6.14M13.03,4.76C14,4.76 15.1,5.53 15.1,6.5C15.1,7.43 14,8.21 13.03,8.21H9.41L10.1,4.76H13.03M12.34,10.28C13.3,10.28 14.41,11.05 14.41,12C14.41,12.95 13.3,13.72 12.34,13.72H8.72L9.41,10.28H12.34M10.97,15.79C11.92,15.79 13.03,16.57 13.03,17.5C13.03,18.47 11.92,19.24 10.97,19.24H7.5L8.21,15.79H10.97M18.55,13.72C19.5,13.72 20.62,14.5 20.62,15.45C20.62,16.4 19.5,17.17 18.55,17.17H15.1L15.79,13.72H18.55M19.93,8.21C20.88,8.21 22,9 22,9.93C22,10.88 20.88,11.66 19.93,11.66H16.5L17.17,8.21H19.93Z", + "name": "blackberry" + }, + { + "path": "M12,3A9,9 0 0,1 21,12A9,9 0 0,1 12,21A9,9 0 0,1 3,12A9,9 0 0,1 12,3M5.94,8.5C4,11.85 5.15,16.13 8.5,18.06C11.85,20 18.85,7.87 15.5,5.94C12.15,4 7.87,5.15 5.94,8.5Z", + "name": "cisco-webex" + }, + { + "path": "M11.9,14.5H10.8V9.5H11.9C13.5,9.5 14.6,10.4 14.6,12C14.6,13.6 13.5,14.5 11.9,14.5M11.9,7H8.1V17H11.8C15.3,17 17.4,14.9 17.4,12V12C17.4,9.1 15.4,7 11.9,7M12,20C10.1,20 8.3,19.3 6.9,18.1L6.2,17.5L4.5,17.7L5.2,16.1L4.9,15.3C4.4,14.2 4.2,13.1 4.2,11.9C4.2,7.5 7.8,3.9 12.1,3.9C16.4,3.9 19.9,7.6 19.9,12C19.9,16.4 16.3,20 12,20M12,2C6.5,2 2.1,6.5 2.1,12C2.1,13.5 2.4,14.9 3,16.2L1.4,20.3L5.7,19.7C7.4,21.2 9.7,22.1 12.1,22.1C17.6,22.1 22,17.6 22,12.1C22,6.6 17.5,2 12,2Z", + "name": "disqus-outline" + }, + { + "path": "M16.42,18.42C16,16.5 15.5,14.73 15,13.17C15.5,13.1 16,13.06 16.58,13.06H16.6V13.06H16.6C17.53,13.06 18.55,13.18 19.66,13.43C19.28,15.5 18.08,17.27 16.42,18.42M12,19.8C10.26,19.8 8.66,19.23 7.36,18.26C7.64,17.81 8.23,16.94 9.18,16.04C10.14,15.11 11.5,14.15 13.23,13.58C13.82,15.25 14.36,17.15 14.77,19.29C13.91,19.62 13,19.8 12,19.8M4.2,12C4.2,11.96 4.2,11.93 4.2,11.89C4.42,11.9 4.71,11.9 5.05,11.9H5.06C6.62,11.89 9.36,11.76 12.14,10.89C12.29,11.22 12.44,11.56 12.59,11.92C10.73,12.54 9.27,13.53 8.19,14.5C7.16,15.46 6.45,16.39 6.04,17C4.9,15.66 4.2,13.91 4.2,12M8.55,5C9.1,5.65 10.18,7.06 11.34,9.25C9,9.96 6.61,10.12 5.18,10.12C5.14,10.12 5.1,10.12 5.06,10.12H5.05C4.81,10.12 4.6,10.12 4.43,10.11C5,7.87 6.5,6 8.55,5M12,4.2C13.84,4.2 15.53,4.84 16.86,5.91C15.84,7.14 14.5,8 13.03,8.65C12,6.67 11,5.25 10.34,4.38C10.88,4.27 11.43,4.2 12,4.2M18.13,7.18C19.1,8.42 19.71,9.96 19.79,11.63C18.66,11.39 17.6,11.28 16.6,11.28V11.28H16.59C15.79,11.28 15.04,11.35 14.33,11.47C14.16,11.05 14,10.65 13.81,10.26C15.39,9.57 16.9,8.58 18.13,7.18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z", + "name": "dribbble" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M15.09,16.5C14.81,15.14 14.47,13.91 14.08,12.82L15.2,12.74H15.22V12.74C15.87,12.74 16.59,12.82 17.36,13C17.09,14.44 16.26,15.69 15.09,16.5M12,17.46C10.79,17.46 9.66,17.06 8.76,16.39C8.95,16.07 9.36,15.46 10,14.83C10.7,14.18 11.64,13.5 12.86,13.11C13.28,14.27 13.65,15.6 13.94,17.1C13.33,17.33 12.68,17.46 12,17.46M6.54,12V11.92L7.14,11.93V11.93C8.24,11.93 10.15,11.83 12.1,11.22L12.41,11.94C11.11,12.38 10.09,13.07 9.34,13.76C8.61,14.42 8.12,15.08 7.83,15.5C7.03,14.56 6.54,13.34 6.54,12M9.59,7.11C9.97,7.56 10.73,8.54 11.54,10.08C9.89,10.57 8.23,10.68 7.22,10.68H7.14V10.68H6.7C7.09,9.11 8.17,7.81 9.59,7.11M12,6.54C13.29,6.54 14.47,7 15.41,7.74C14.69,8.6 13.74,9.22 12.72,9.66C12,8.27 11.31,7.28 10.84,6.67C11.21,6.59 11.6,6.54 12,6.54M16.29,8.63C16.97,9.5 17.4,10.57 17.45,11.74C16.66,11.58 15.92,11.5 15.22,11.5V11.5C14.66,11.5 14.13,11.54 13.63,11.63L13.27,10.78C14.37,10.3 15.43,9.61 16.29,8.63M12,5A7,7 0 0,0 5,12A7,7 0 0,0 12,19A7,7 0 0,0 19,12A7,7 0 0,0 12,5Z", + "name": "dribbble-box" + }, + { + "path": "M6.72,20.78C8.23,20.71 10.07,20.78 11.87,20.78C13.72,20.78 15.62,20.66 17.12,20.78C17.72,20.83 18.28,21.19 18.77,20.87C19.16,20.38 18.87,19.71 18.96,19.05C19.12,17.78 20.28,16.27 18.59,15.95C17.87,16.61 18.35,17.23 17.95,18.05C17.45,19.03 15.68,19.37 14,19.5C12.54,19.62 10,19.76 9.5,18.77C9.04,17.94 9.29,16.65 9.29,15.58C9.29,14.38 9.16,13.22 9.5,12.3C11.32,12.43 13.7,11.69 15,12.5C15.87,13 15.37,14.06 16.38,14.4C17.07,14.21 16.7,13.32 16.66,12.5C16.63,11.94 16.63,11.19 16.66,10.57C16.69,9.73 17,8.76 16.1,8.74C15.39,9.3 15.93,10.23 15.18,10.75C14.95,10.92 14.43,11 14.08,11C12.7,11.17 10.54,11.05 9.38,10.84C9.23,9.16 9.24,6.87 9.38,5.19C10,4.57 11.45,4.54 12.42,4.55C14.13,4.55 16.79,4.7 17.3,5.55C17.58,6 17.36,7 17.85,7.1C18.85,7.33 18.36,5.55 18.41,4.73C18.44,4.11 18.71,3.72 18.59,3.27C18.27,2.83 17.79,3.05 17.5,3.09C14.35,3.5 9.6,3.27 6.26,3.27C5.86,3.27 5.16,3.07 4.88,3.54C4.68,4.6 6.12,4.16 6.62,4.73C6.79,4.91 7.03,5.73 7.08,6.28C7.23,7.74 7.08,9.97 7.08,12.12C7.08,14.38 7.26,16.67 7.08,18.05C7,18.53 6.73,19.3 6.62,19.41C6,20.04 4.34,19.35 4.5,20.69C5.09,21.08 5.93,20.82 6.72,20.78Z", + "name": "etsy" + }, + { + "path": "M12,17.5C10.15,17.5 8.42,16.56 7.41,15L17.41,12.75L22.08,11.75C22.05,10.32 21.71,8.92 21.08,7.64C18.66,2.61 12.62,0.5 7.58,2.92C2.55,5.34 0.44,11.38 2.86,16.41C5.29,21.44 11.33,23.56 16.36,21.14C18.5,20.09 20.25,18.31 21.22,16.11L16.61,15C15.6,16.57 13.86,17.5 12,17.5M12,6.5C13.76,6.5 15.41,7.34 16.44,8.77L6.57,11.19C6.96,8.5 9.28,6.5 12,6.5Z", + "name": "eventbrite" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M18,5H15.5A3.5,3.5 0 0,0 12,8.5V11H10V14H12V21H15V14H18V11H15V9A1,1 0 0,1 16,8H18V5Z", + "name": "facebook-box" + }, + { + "path": "M21,12A9,9 0 0,1 12,21H4.5L9.74,15.76L11.16,17.17L9.33,19H12A7,7 0 0,0 19,12V7L21,5V12M3,12A9,9 0 0,1 12,3H19.5L14.26,8.24L12.84,6.83L14.67,5H12A7,7 0 0,0 5,12V17L3,19V12Z", + "name": "flattr" + }, + { + "path": "M11,12C11,14.5 9,16.5 6.5,16.5C4,16.5 2,14.5 2,12C2,9.5 4,7.5 6.5,7.5C9,7.5 11,9.5 11,12M17.5,7.5C15,7.5 13,9.5 13,12C13,14.5 15,16.5 17.5,16.5C20,16.5 22,14.5 22,12C22,9.5 20,7.5 17.5,7.5Z", + "name": "flickr" + }, + { + "path": "M17,5L16.57,7.5C16.5,7.73 16.2,8 15.91,8C15.61,8 12,8 12,8C11.53,8 10.95,8.32 10.95,8.79V9.2C10.95,9.67 11.53,10 12,10C12,10 14.95,10 15.28,10C15.61,10 15.93,10.36 15.86,10.71C15.79,11.07 14.94,13.28 14.9,13.5C14.86,13.67 14.64,14 14.25,14C13.92,14 11.37,14 11.37,14C10.85,14 10.69,14.07 10.34,14.5C10,14.94 7.27,18.1 7.27,18.1C7.24,18.13 7,18.04 7,18V5C7,4.7 7.61,4 8,4C8,4 16.17,4 16.5,4C16.82,4 17.08,4.61 17,5M17,14.45C17.11,13.97 18.78,6.72 19.22,4.55M17.58,2C17.58,2 8.38,2 6.91,2C5.43,2 5,3.11 5,3.8C5,4.5 5,20.76 5,20.76C5,21.54 5.42,21.84 5.66,21.93C5.9,22.03 6.55,22.11 6.94,21.66C6.94,21.66 11.65,16.22 11.74,16.13C11.87,16 11.87,16 12,16C12.26,16 14.2,16 15.26,16C16.63,16 16.85,15 17,14.45C17.11,13.97 18.78,6.72 19.22,4.55C19.56,2.89 19.14,2 17.58,2Z", + "name": "foursquare" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H14.56C14.24,20.93 14.23,20.32 14.23,20.11L14.24,17.64C14.24,16.8 13.95,16.25 13.63,15.97C15.64,15.75 17.74,15 17.74,11.53C17.74,10.55 17.39,9.74 16.82,9.11C16.91,8.89 17.22,7.97 16.73,6.73C16.73,6.73 15.97,6.5 14.25,7.66C13.53,7.46 12.77,7.36 12,7.35C11.24,7.36 10.46,7.46 9.75,7.66C8.03,6.5 7.27,6.73 7.27,6.73C6.78,7.97 7.09,8.89 7.18,9.11C6.61,9.74 6.26,10.55 6.26,11.53C6.26,15 8.36,15.75 10.36,16C10.1,16.2 9.87,16.6 9.79,17.18C9.27,17.41 7.97,17.81 7.17,16.43C7.17,16.43 6.69,15.57 5.79,15.5C5.79,15.5 4.91,15.5 5.73,16.05C5.73,16.05 6.32,16.33 6.73,17.37C6.73,17.37 7.25,19.12 9.76,18.58L9.77,20.11C9.77,20.32 9.75,20.93 9.43,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z", + "name": "github-box" + }, + { + "path": "M20.38,8.53C20.54,8.13 21.06,6.54 20.21,4.39C20.21,4.39 18.9,4 15.91,6C14.66,5.67 13.33,5.62 12,5.62C10.68,5.62 9.34,5.67 8.09,6C5.1,3.97 3.79,4.39 3.79,4.39C2.94,6.54 3.46,8.13 3.63,8.53C2.61,9.62 2,11 2,12.72C2,19.16 6.16,20.61 12,20.61C17.79,20.61 22,19.16 22,12.72C22,11 21.39,9.62 20.38,8.53M12,19.38C7.88,19.38 4.53,19.19 4.53,15.19C4.53,14.24 5,13.34 5.8,12.61C7.14,11.38 9.43,12.03 12,12.03C14.59,12.03 16.85,11.38 18.2,12.61C19,13.34 19.5,14.23 19.5,15.19C19.5,19.18 16.13,19.38 12,19.38M8.86,13.12C8.04,13.12 7.36,14.12 7.36,15.34C7.36,16.57 8.04,17.58 8.86,17.58C9.69,17.58 10.36,16.58 10.36,15.34C10.36,14.11 9.69,13.12 8.86,13.12M15.14,13.12C14.31,13.12 13.64,14.11 13.64,15.34C13.64,16.58 14.31,17.58 15.14,17.58C15.96,17.58 16.64,16.58 16.64,15.34C16.64,14.11 16,13.12 15.14,13.12Z", + "name": "github-face" + }, + { + "path": "M8,2A3,3 0 0,0 5,5V16.5H8V5H19A3,3 0 0,0 16,2H8M16,7.5V19H5A3,3 0 0,0 8,22H16A3,3 0 0,0 19,19V7.5H16Z", + "name": "glassdoor" + }, + { + "path": "M2,22L8.5,2H15.4L9.2,20C9.2,20 8.6,22 7,22C5.9,22 2,22 2,22M16.4,5L13,15L15,20.7C15,20.7 15.4,22 17,22C18.3,22 22,22 22,22L16.4,5Z", + "name": "google-adwords" + }, + { + "path": "M19,3H13V8L17,7L16,11H21V5C21,3.89 20.1,3 19,3M17,17L13,16V21H19A2,2 0 0,0 21,19V13H16M8,13H3V19A2,2 0 0,0 5,21H11V16L7,17M3,5V11H8L7,7L11,8V3H5C3.89,3 3,3.89 3,5Z", + "name": "google-pages" + }, + { + "path": "M12,1.5A9,9 0 0,1 21,10.5C21,13.11 19.89,15.47 18.11,17.11L17.05,16.05C18.55,14.68 19.5,12.7 19.5,10.5A7.5,7.5 0 0,0 12,3A7.5,7.5 0 0,0 4.5,10.5C4.5,12.7 5.45,14.68 6.95,16.05L5.89,17.11C4.11,15.47 3,13.11 3,10.5A9,9 0 0,1 12,1.5M12,4.5A6,6 0 0,1 18,10.5C18,12.28 17.22,13.89 16,15L14.92,13.92C15.89,13.1 16.5,11.87 16.5,10.5C16.5,8 14.5,6 12,6C9.5,6 7.5,8 7.5,10.5C7.5,11.87 8.11,13.1 9.08,13.92L8,15C6.78,13.89 6,12.28 6,10.5A6,6 0 0,1 12,4.5M8.11,17.65L11.29,14.46C11.68,14.07 12.32,14.07 12.71,14.46L15.89,17.65C16.28,18.04 16.28,18.67 15.89,19.06L12.71,22.24C12.32,22.63 11.68,22.63 11.29,22.24L8.11,19.06C7.72,18.67 7.72,18.04 8.11,17.65Z", + "name": "google-physical-web" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M19.5,12H18V10.5H17V12H15.5V13H17V14.5H18V13H19.5V12M9.65,11.36V12.9H12.22C12.09,13.54 11.45,14.83 9.65,14.83C8.11,14.83 6.89,13.54 6.89,12C6.89,10.46 8.11,9.17 9.65,9.17C10.55,9.17 11.13,9.56 11.45,9.88L12.67,8.72C11.9,7.95 10.87,7.5 9.65,7.5C7.14,7.5 5.15,9.5 5.15,12C5.15,14.5 7.14,16.5 9.65,16.5C12.22,16.5 13.96,14.7 13.96,12.13C13.96,11.81 13.96,11.61 13.89,11.36H9.65Z", + "name": "google-plus-box" + }, + { + "path": "M14,20.95H20V10.78L8,7.34V3.05H4V20.95H10V15.31H14V20.95Z", + "name": "houzz" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M13.5,18.71H18V11.09L9,8.5V5.29H6V18.71H10.5V14.5H13.5V18.71Z", + "name": "houzz-box" + }, + { + "path": "M10,5A1,1 0 0,0 9,4H8V2H16V4H15A1,1 0 0,0 14,5V19A1,1 0 0,0 15,20H16V22H8V20H9A1,1 0 0,0 10,19V5Z", + "name": "instapaper" + }, + { + "path": "M7.85,17.07C7.03,17.17 3.5,17.67 4.06,20.26C4.69,23.3 9.87,22.59 9.83,19C9.81,16.57 9.83,9.2 9.83,9.2C9.83,9.2 9.76,8.53 10.43,8.39L18.19,6.79C18.19,6.79 18.83,6.65 18.83,7.29C18.83,7.89 18.83,14.2 18.83,14.2C18.83,14.2 18.9,14.83 18.12,15C17.34,15.12 13.91,15.4 14.19,18C14.5,21.07 20,20.65 20,17.07V2.61C20,2.61 20.04,1.62 18.9,1.87L9.5,3.78C9.5,3.78 8.66,3.96 8.66,4.77C8.66,5.5 8.66,16.11 8.66,16.11C8.66,16.11 8.66,16.96 7.85,17.07Z", + "name": "itunes" + }, + { + "path": "M2,5.69C8.92,1.07 11.1,7 11.28,10.27C11.46,13.53 8.29,17.64 4.31,14.92V20.3L2,18.77V5.69M4.22,7.4V12.78C7.84,14.95 9.08,13.17 9.08,10.09C9.08,5.74 6.57,5.59 4.22,7.4M15.08,4.15C15.08,4.15 14.9,7.64 15.08,11.07C15.44,14.5 19.69,11.84 19.69,11.84V4.92L22,5.2V14.44C22,20.6 15.85,20.3 15.85,20.3L15.08,18C20.46,18 19.78,14.43 19.78,14.43C13.27,16.97 12.77,12.61 12.77,12.61V5.69L15.08,4.15Z", + "name": "language-python-text" + }, + { + "path": "M18,17.93C15.92,17.92 14.81,16.9 14.04,15.09L13.82,14.6L11.92,10.23C11.29,8.69 9.72,7.64 7.96,7.64C5.57,7.64 3.63,9.59 3.63,12C3.63,14.41 5.57,16.36 7.96,16.36C9.62,16.36 11.08,15.41 11.8,14L12.57,15.81C11.5,17.15 9.82,18 7.96,18C4.67,18 2,15.32 2,12C2,8.69 4.67,6 7.96,6C10.44,6 12.45,7.34 13.47,9.7C13.54,9.89 14.54,12.24 15.42,14.24C15.96,15.5 16.42,16.31 17.91,16.36C19.38,16.41 20.39,15.5 20.39,14.37C20.39,13.26 19.62,13 18.32,12.56C16,11.79 14.79,11 14.79,9.15C14.79,7.33 16,6.12 18,6.12C19.31,6.12 20.24,6.7 20.89,7.86L19.62,8.5C19.14,7.84 18.61,7.57 17.94,7.57C17,7.57 16.33,8.23 16.33,9.1C16.33,10.34 17.43,10.53 18.97,11.03C21.04,11.71 22,12.5 22,14.42C22,16.45 20.27,17.93 18,17.93Z", + "name": "lastfm" + }, + { + "path": "M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3H19M18.5,18.5V13.2A3.26,3.26 0 0,0 15.24,9.94C14.39,9.94 13.4,10.46 12.92,11.24V10.13H10.13V18.5H12.92V13.57C12.92,12.8 13.54,12.17 14.31,12.17A1.4,1.4 0 0,1 15.71,13.57V18.5H18.5M6.88,8.56A1.68,1.68 0 0,0 8.56,6.88C8.56,5.95 7.81,5.19 6.88,5.19A1.69,1.69 0 0,0 5.19,6.88C5.19,7.81 5.95,8.56 6.88,8.56M8.27,18.5V10.13H5.5V18.5H8.27Z", + "name": "linkedin-box" + }, + { + "path": "M9.56,12.5C9.56,12.6 9.5,12.72 9.4,12.79C9.2,12.97 8.89,12.94 8.71,12.74C8.63,12.65 8.59,12.53 8.59,12.41V8.5H5.66V13.39A2.44,2.44 0 0,0 8.1,15.83C8.68,15.83 9.24,15.62 9.68,15.24C9.64,15.6 9.43,15.93 9.11,16.11C8.75,16.31 8.35,16.42 7.94,16.41C7.46,16.41 7,16.3 6.56,16.09L6.39,16V18.6C7.04,18.86 7.74,19 8.44,19C9.47,19 10.46,18.66 11.25,18C12.08,17.25 12.54,16.18 12.5,15.06V8.5H9.56V12.5M4.93,13.39V5.59H2V12.9C1.84,14.35 2.88,15.65 4.33,15.81C4.41,15.82 4.5,15.83 4.56,15.83V15.83C4.93,15.83 5.29,15.74 5.63,15.59L5.75,15.5L5.65,15.41C5.17,14.85 4.91,14.13 4.93,13.39M22,11.39V8.5H21C20.59,6.38 18.53,5 16.41,5.41C16.17,5.45 15.94,5.5 15.71,5.61C14.28,6.24 13.33,7.62 13.26,9.18V15.83H13.39C14.95,15.76 16.19,14.47 16.19,12.9H17.41V10H16.15V9.17C16.15,8.86 16.32,8.57 16.59,8.41C17.06,8.13 17.68,8.28 17.96,8.76C18.05,8.91 18.09,9.07 18.1,9.24V11.93C18.07,14.05 19.75,15.79 21.87,15.83H22V12.9H22A1,1 0 0,1 21,11.9V11.41L22,11.39Z", + "name": "lyft" + }, + { + "path": "M15.45,11.91C15.34,9.7 13.7,8.37 11.72,8.37H11.64C9.35,8.37 8.09,10.17 8.09,12.21C8.09,14.5 9.62,15.95 11.63,15.95C13.88,15.95 15.35,14.3 15.46,12.36M11.65,6.39C13.18,6.39 14.62,7.07 15.67,8.13V8.13C15.67,7.62 16,7.24 16.5,7.24H16.61C17.35,7.24 17.5,7.94 17.5,8.16V16.06C17.46,16.58 18.04,16.84 18.37,16.5C19.64,15.21 21.15,9.81 17.58,6.69C14.25,3.77 9.78,4.25 7.4,5.89C4.88,7.63 3.26,11.5 4.83,15.11C6.54,19.06 11.44,20.24 14.35,19.06C15.83,18.47 16.5,20.46 15,21.11C12.66,22.1 6.23,22 3.22,16.79C1.19,13.27 1.29,7.08 6.68,3.87C10.81,1.42 16.24,2.1 19.5,5.5C22.95,9.1 22.75,15.8 19.4,18.41C17.89,19.59 15.64,18.44 15.66,16.71L15.64,16.15C14.59,17.2 13.18,17.81 11.65,17.81C8.63,17.81 6,15.15 6,12.13C6,9.08 8.63,6.39 11.65,6.39Z", + "name": "mail-ru" + }, + { + "path": "M20.93,14C20.66,15.4 18.5,16.95 15.97,17.25C14.66,17.4 13.38,17.55 12,17.5C9.76,17.38 8,16.95 8,16.95L8.03,17.57C8.32,19.78 10.22,19.92 12.03,20C13.85,20.04 15.47,19.53 15.47,19.53L15.55,21.17C15.55,21.17 14.27,21.86 12,22C10.75,22.05 9.2,21.95 7.39,21.47C3.47,20.43 2.79,16.25 2.69,12L2.68,8.57C2.68,4.23 5.5,2.96 5.5,2.96C6.95,2.3 9.41,2 11.97,2H12.03C14.59,2 17.05,2.3 18.5,2.96C18.5,2.96 21.33,4.23 21.33,8.57C21.33,8.57 21.36,11.77 20.93,14M8.33,10.32C8.33,9.54 7.7,8.91 6.93,8.91C6.15,8.91 5.5,9.54 5.5,10.32C5.5,11.09 6.15,11.72 6.93,11.72A1.4,1.4 0 0,0 8.33,10.32M13.41,10.32A1.41,1.41 0 0,0 12,8.91A1.41,1.41 0 0,0 10.59,10.32C10.59,11.09 11.22,11.72 12,11.72C12.78,11.72 13.41,11.09 13.41,10.32M18.5,10.32C18.5,9.54 17.85,8.91 17.07,8.91C16.3,8.91 15.67,9.54 15.67,10.32A1.4,1.4 0 0,0 17.07,11.72C17.85,11.72 18.5,11.09 18.5,10.32Z", + "name": "mastodon-variant" + }, + { + "path": "M4.37,7.3C4.4,7.05 4.3,6.81 4.12,6.65L2.25,4.4V4.06H8.05L12.53,13.89L16.47,4.06H22V4.4L20.4,5.93C20.27,6.03 20.2,6.21 20.23,6.38V17.62C20.2,17.79 20.27,17.97 20.4,18.07L21.96,19.6V19.94H14.12V19.6L15.73,18.03C15.89,17.88 15.89,17.83 15.89,17.59V8.5L11.4,19.9H10.8L5.57,8.5V16.14C5.5,16.46 5.63,16.78 5.86,17L7.96,19.57V19.9H2V19.57L4.1,17C4.33,16.78 4.43,16.46 4.37,16.14V7.3Z", + "name": "medium" + }, + { + "path": "M19.61,14.86C19.61,16.68 18.3,18.25 16.5,18.55C16.29,18.59 16.07,18.62 15.84,18.61C15.76,18.61 15.73,18.64 15.71,18.71C15.35,19.74 14.64,20.35 13.57,20.5C12.86,20.6 12.22,20.41 11.65,19.97C11.57,19.9 11.5,19.9 11.44,19.96C10.78,20.43 10.04,20.64 9.23,20.59C7.66,20.5 6.33,19.29 6.08,17.74C6.06,17.63 6.04,17.5 6.04,17.41C6.04,17.32 6,17.29 5.92,17.27C5.44,17.18 5,17 4.63,16.68C3.92,16.13 3.5,15.41 3.4,14.5C3.29,13.5 3.61,12.62 4.32,11.89C4.38,11.83 4.38,11.79 4.34,11.72C4.07,11.24 3.94,10.72 3.96,10.17C4,8.79 4.97,7.65 6.31,7.37C6.46,7.33 6.54,7.27 6.61,7.13C7.27,5.71 8.37,4.85 9.91,4.56C11,4.36 12,4.58 12.94,5.13C13,5.18 13.08,5.18 13.17,5.16C14.67,4.72 16,5.04 17.12,6.11C17.78,6.74 18.15,7.54 18.26,8.46C18.28,8.66 18.29,8.86 18.28,9.06C18.27,9.14 18.29,9.17 18.37,9.19C19.04,9.44 19.5,9.91 19.71,10.6C19.96,11.45 19.75,12.21 19.11,12.83C19.05,12.89 19.07,12.92 19.1,12.97C19.44,13.56 19.61,14.18 19.61,14.86M12.93,14.57C12.93,15.34 13.43,16 14.14,16.26C14.5,16.37 14.85,16.43 15.22,16.45C15.5,16.46 15.75,16.44 16,16.32C16.19,16.22 16.28,16.06 16.27,15.85C16.26,15.64 16.16,15.5 15.96,15.4C15.89,15.37 15.82,15.34 15.74,15.33C15.5,15.29 15.3,15.26 15.07,15.21C14.71,15.14 14.55,14.95 14.55,14.57C14.54,14.24 14.63,13.93 14.73,13.63C14.92,13.07 15.17,12.53 15.41,12C15.64,11.47 15.88,10.95 16.04,10.4C16.13,10.1 16.18,9.8 16.09,9.5C15.97,9 15.69,8.7 15.2,8.61C14.75,8.5 14.3,8.5 13.9,8.78C13.76,8.87 13.63,8.85 13.5,8.74C13.43,8.67 13.34,8.58 13.26,8.5C12.84,8.12 12.3,8.1 11.85,8.45C11.67,8.59 11.5,8.76 11.33,8.89C11.16,9 11,9.03 10.79,8.92C10.6,8.83 10.42,8.74 10.23,8.65C10.03,8.57 9.85,8.46 9.63,8.44C8.95,8.38 8.24,8.79 7.94,9.41C7.8,9.68 7.69,9.96 7.59,10.25C7.11,11.57 6.72,12.91 6.32,14.26C6.14,14.86 6.35,15.45 6.86,15.77C7.26,16 7.69,16.09 8.14,15.95C8.5,15.84 8.71,15.55 8.85,15.22C9.31,14.13 9.73,13 10.17,11.91C10.29,11.61 10.41,11.3 10.54,11C10.67,10.7 11.04,10.6 11.26,10.8C11.4,10.92 11.44,11.09 11.42,11.26C11.41,11.45 11.34,11.62 11.27,11.79C11,12.5 10.69,13.24 10.4,13.97C10.34,14.11 10.28,14.26 10.25,14.42C10.21,14.69 10.31,14.93 10.54,15C10.76,15.12 11,15.14 11.23,15.05C11.5,14.95 11.67,14.74 11.79,14.5C12.22,13.65 12.65,12.8 13.08,11.95C13.28,11.56 13.5,11.17 13.68,10.78C13.76,10.64 13.85,10.5 14,10.41C14.12,10.33 14.25,10.33 14.38,10.4C14.5,10.47 14.5,10.6 14.5,10.73C14.5,10.8 14.5,10.87 14.47,10.93C14.41,11.07 14.36,11.2 14.3,11.33C13.94,12.09 13.57,12.84 13.22,13.59C13.07,13.91 12.91,14.23 12.93,14.57M17.96,20.12C17.96,19.62 17.54,19.2 17.04,19.2C16.5,19.2 16.1,19.61 16.1,20.12A0.93,0.93 0 0,0 17.03,21.05A0.93,0.93 0 0,0 17.96,20.12M2.38,12.46C2.86,12.46 3.27,12.05 3.27,11.57C3.27,11.09 2.87,10.69 2.39,10.69C1.89,10.69 1.5,11.08 1.5,11.57C1.5,12.06 1.89,12.46 2.38,12.46M13.26,2.55C12.77,2.55 12.37,2.94 12.37,3.42C12.37,3.91 12.77,4.3 13.25,4.3C13.74,4.3 14.13,3.92 14.13,3.43C14.13,2.95 13.74,2.55 13.26,2.55M20.45,8.03C20.45,7.63 20.11,7.29 19.71,7.29C19.3,7.28 18.95,7.63 18.95,8.04C18.95,8.45 19.28,8.78 19.7,8.78C20.12,8.78 20.46,8.45 20.45,8.03M5.04,5.89C5.04,6.27 5.34,6.56 5.71,6.56C6.09,6.56 6.39,6.26 6.38,5.88C6.38,5.5 6.09,5.22 5.72,5.22C5.33,5.22 5.04,5.5 5.04,5.89M12.06,21.44C12.06,21.12 11.81,20.86 11.5,20.86C11.16,20.86 10.91,21.11 10.91,21.44C10.91,21.75 11.16,22 11.5,22C11.8,22 12.06,21.75 12.06,21.44M21,12.5C20.71,12.5 20.45,12.78 20.45,13.08A0.55,0.55 0 0,0 21,13.63C21.33,13.63 21.57,13.4 21.57,13.08C21.57,12.77 21.33,12.5 21,12.5M7.62,2C7.35,2 7.14,2.2 7.14,2.47C7.14,2.73 7.35,2.94 7.62,2.94A0.47,0.47 0 0,0 8.09,2.47C8.09,2.2 7.89,2 7.62,2M22.08,10C21.86,10 21.67,10.17 21.66,10.4C21.66,10.63 21.85,10.82 22.08,10.82C22.32,10.82 22.5,10.64 22.5,10.41C22.5,10.17 22.32,10 22.08,10M5.5,18.26C5.5,18.04 5.29,17.85 5.06,17.84C4.84,17.84 4.65,18.03 4.65,18.27C4.65,18.5 4.84,18.68 5.07,18.68C5.3,18.68 5.5,18.5 5.5,18.26Z", + "name": "meetup" + }, + { + "path": "M21.11,18.5C20.97,18.5 20.83,18.44 20.71,18.36C20.37,18.13 20.28,17.68 20.5,17.34C21.18,16.34 21.54,15.16 21.54,13.93C21.54,12.71 21.18,11.53 20.5,10.5C20.28,10.18 20.37,9.73 20.71,9.5C21.04,9.28 21.5,9.37 21.72,9.7C22.56,10.95 23,12.41 23,13.93C23,15.45 22.56,16.91 21.72,18.16C21.58,18.37 21.35,18.5 21.11,18.5M19,17.29C18.88,17.29 18.74,17.25 18.61,17.17C18.28,16.94 18.19,16.5 18.42,16.15C18.86,15.5 19.1,14.73 19.1,13.93C19.1,13.14 18.86,12.37 18.42,11.71C18.19,11.37 18.28,10.92 18.61,10.69C18.95,10.47 19.4,10.55 19.63,10.89C20.24,11.79 20.56,12.84 20.56,13.93C20.56,15 20.24,16.07 19.63,16.97C19.5,17.18 19.25,17.29 19,17.29M14.9,15.73C15.89,15.73 16.7,14.92 16.7,13.93C16.7,13.17 16.22,12.5 15.55,12.25C15.5,12.55 15.43,12.85 15.34,13.14C15.23,13.44 14.95,13.64 14.64,13.64C14.57,13.64 14.5,13.62 14.41,13.6C14.03,13.47 13.82,13.06 13.95,12.67C14.09,12.24 14.17,11.78 14.17,11.32C14.17,8.93 12.22,7 9.82,7C8.1,7 6.56,8 5.87,9.5C6.54,9.7 7.16,10.04 7.66,10.54C7.95,10.83 7.95,11.29 7.66,11.58C7.38,11.86 6.91,11.86 6.63,11.58C6.17,11.12 5.56,10.86 4.9,10.86C3.56,10.86 2.46,11.96 2.46,13.3C2.46,14.64 3.56,15.73 4.9,15.73H14.9M15.6,10.75C17.06,11.07 18.17,12.37 18.17,13.93C18.17,15.73 16.7,17.19 14.9,17.19H4.9C2.75,17.19 1,15.45 1,13.3C1,11.34 2.45,9.73 4.33,9.45C5.12,7.12 7.33,5.5 9.82,5.5C12.83,5.5 15.31,7.82 15.6,10.75Z", + "name": "mixcloud" + }, + { + "path": "M3.25,4.03L19.95,20.73L18.7,22L14.86,18.13C14.77,18.12 14.68,18.09 14.59,18.05C14.26,17.89 14.14,17.62 14.11,17.38L12.18,15.45C12.14,15.53 12.09,15.6 12.05,15.66C11.62,16.26 11.19,16.26 10.86,16.04C10.54,15.83 5.5,12 5.23,11.87C4.95,11.76 4.85,12.03 5.12,13.5C5.39,15 4.95,15.39 4.57,15.45C4.2,15.5 3.06,15.18 3,12.14C2.95,9.11 3.76,8.62 4.14,8.62C4.6,8.62 7.08,10.69 8.84,12.12L2,5.28L3.25,4.03M18.38,16.56C18.75,15.4 19.12,13.8 19.1,12.03V12C19.14,8.5 17.66,5.58 17.66,5.58C17.66,5.58 17.42,4.72 18.12,4.39C18.83,4.06 19.3,4.61 19.3,4.61C21.12,8.22 21,11.64 21,12C21,12.27 21.09,14.96 19.88,18.05L18.38,16.56M15.14,13.31C15.19,12.92 15.22,12.5 15.24,12.03V12C15.14,8.5 14.13,7.21 14.13,7.21C14.13,7.21 13.89,6.34 14.59,6C15.3,5.69 15.77,6.23 15.77,6.23C17.26,8.94 17.16,11.64 17.14,12C17.15,12.2 17.2,13.38 16.82,15L15.14,13.31M10.2,8.38C10.23,7.77 10.59,7.64 10.59,7.64C10.59,7.64 11.19,7.37 11.57,7.8C11.91,8.19 12.72,9.57 12.89,11.07L10.2,8.38Z", + "name": "nfc-off" + }, + { "path": "M20,4H4V20H12V8H16V20H20V4", "name": "npm-variant" }, + { + "path": "M3,3V21H21V3H3M6,6H18V18H15V9H12V18H6V6Z", + "name": "npm-variant-outline" + }, + { + "path": "M8.32,21.97C8.21,21.92 8.08,21.76 8.06,21.65C8.03,21.5 8,21.76 8.66,17.56C9.26,13.76 9.25,13.82 9.33,13.71C9.46,13.54 9.44,13.54 10.94,13.53C12.26,13.5 12.54,13.5 13.13,13.41C16.38,12.96 18.39,11.05 19.09,7.75C19.13,7.53 19.17,7.34 19.18,7.34C19.18,7.33 19.25,7.38 19.33,7.44C20.36,8.22 20.71,9.66 20.32,11.58C19.86,13.87 18.64,15.39 16.74,16.04C15.93,16.32 15.25,16.43 14.05,16.46C13.25,16.5 13.23,16.5 13,16.65C12.83,16.82 12.84,16.79 12.45,19.2C12.18,20.9 12.08,21.45 12.04,21.55C11.97,21.71 11.83,21.85 11.67,21.93L11.56,22H10C8.71,22 8.38,22 8.32,21.97V21.97M3.82,19.74C3.63,19.64 3.5,19.47 3.5,19.27C3.5,19 6.11,2.68 6.18,2.5C6.27,2.32 6.5,2.13 6.68,2.06L6.83,2H10.36C14.27,2 14.12,2 15,2.2C17.62,2.75 18.82,4.5 18.37,7.13C17.87,10.06 16.39,11.8 13.87,12.43C13,12.64 12.39,12.7 10.73,12.7C9.42,12.7 9.32,12.71 9.06,12.85C8.8,13 8.59,13.27 8.5,13.6C8.46,13.67 8.23,15.07 7.97,16.7C7.71,18.33 7.5,19.69 7.5,19.72L7.47,19.78H5.69C4.11,19.78 3.89,19.78 3.82,19.74V19.74Z", + "name": "paypal" + }, + { + "path": "M12,7A2,2 0 0,1 10,9A2,2 0 0,1 8,7C7.37,7.84 7,8.87 7,10A5,5 0 0,0 12,15A5,5 0 0,0 17,10A5,5 0 0,0 12,5C11.57,5 11.16,5.05 10.77,5.15C11.5,5.45 12,6.17 12,7M12,2A8,8 0 0,1 20,10C20,11.05 19.8,12.04 19.43,12.96C17.89,17.38 13.63,22 12,22C10.37,22 6.11,17.38 4.57,12.96C4.2,12.04 4,11.05 4,10A8,8 0 0,1 12,2Z", + "name": "periscope" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H9.29C9.69,20.33 10.19,19.38 10.39,18.64L11.05,16.34C11.36,16.95 12.28,17.45 13.22,17.45C16.17,17.45 18.22,14.78 18.22,11.45C18.22,8.28 15.64,5.89 12.3,5.89C8.14,5.89 5.97,8.67 5.97,11.72C5.97,13.14 6.69,14.89 7.91,15.45C8.08,15.56 8.19,15.5 8.19,15.34L8.47,14.28C8.5,14.14 8.5,14.06 8.41,14C7.97,13.45 7.69,12.61 7.69,11.78C7.69,9.64 9.3,7.61 12.03,7.61C14.42,7.61 16.08,9.19 16.08,11.5C16.08,14.11 14.75,15.95 13.03,15.95C12.05,15.95 11.39,15.11 11.55,14.17C11.83,13.03 12.39,11.83 12.39,11C12.39,10.22 12,9.61 11.16,9.61C10.22,9.61 9.39,10.61 9.39,11.95C9.39,12.83 9.66,13.39 9.66,13.39L8.55,18.17C8.39,19 8.47,20.25 8.55,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z", + "name": "pinterest-box" + }, + { + "path": "M21.9,4.26C21.64,3.55 20.96,3.07 20.2,3.07H20.19L18.46,3.07H3.81C3.07,3.07 2.39,3.54 2.12,4.24C2.04,4.45 2,4.66 2,4.88V10.92L2.07,12.12C2.36,14.85 3.78,17.23 5.97,18.9C6,18.93 6.05,18.96 6.09,19H6.11C7.29,19.86 8.6,20.44 10,20.73C10.68,20.86 11.35,20.93 12,20.93C12.63,20.93 13.25,20.87 13.85,20.76C13.93,20.75 14,20.73 14.07,20.72C14.09,20.71 14.11,20.7 14.14,20.69C15.5,20.4 16.76,19.83 17.89,19H17.91C17.95,18.96 18,18.93 18.03,18.9C20.22,17.23 21.64,14.85 21.93,12.12L22,10.92V4.88C22,4.68 21.97,4.47 21.9,4.26M17.67,10.55L12.96,15.06C12.7,15.32 12.35,15.44 12,15.44C11.67,15.44 11.33,15.32 11.06,15.06L6.36,10.55C5.81,10.03 5.79,9.16 6.32,8.61C6.84,8.06 7.71,8.05 8.26,8.57L12,12.17L15.77,8.57C16.31,8.05 17.18,8.07 17.71,8.61C18.23,9.16 18.21,10.03 17.67,10.55Z", + "name": "pocket" + }, + { + "path": "M12,3A9,9 0 0,1 21,12C21,13.76 20.5,15.4 19.62,16.79L21,18.17V20A1,1 0 0,1 20,21H18.18L16.79,19.62C15.41,20.5 13.76,21 12,21A9,9 0 0,1 3,12A9,9 0 0,1 12,3M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17C12.65,17 13.26,16.88 13.83,16.65L10.95,13.77C10.17,13 10.17,11.72 10.95,10.94C11.73,10.16 13,10.16 13.78,10.94L16.66,13.82C16.88,13.26 17,12.64 17,12A5,5 0 0,0 12,7Z", + "name": "quicktime" + }, + { + "path": "M18.61,5.89C18.6,5.79 18.5,5.73 18.44,5.73C18.37,5.72 16.83,5.61 16.83,5.61C16.83,5.61 15.76,4.55 15.65,4.43C15.53,4.31 15.3,4.35 15.21,4.37C15.2,4.37 15,4.44 14.61,4.55C14.25,3.5 13.62,2.58 12.43,2.58C12.11,2.18 11.72,2 11.38,2C8.8,2 7.57,5.22 7.18,6.86C6.18,7.17 5.47,7.39 5.37,7.42C4.82,7.6 4.8,7.62 4.73,8.14C4.67,8.54 3.21,19.86 3.21,19.86L14.61,22L20.79,20.66C20.79,20.66 18.62,6 18.61,5.89M14,4.76C13.69,4.85 13.37,4.95 13,5.06C13,5 13,4.93 13,4.85C13,4.21 12.93,3.7 12.79,3.29C13.35,3.36 13.73,4 14,4.76M12.08,3.42C12.24,3.82 12.34,4.39 12.34,5.16C12.34,5.2 12.34,5.24 12.34,5.27C11.71,5.46 11.03,5.68 10.35,5.89C10.73,4.4 11.45,3.69 12.08,3.42M11.31,2.69C11.42,2.69 11.53,2.73 11.64,2.8C10.81,3.19 9.93,4.17 9.55,6.12C9,6.3 8.47,6.46 8,6.62C8.42,5.12 9.46,2.69 11.31,2.69M12.5,9.15L11.76,11.42C11.76,11.42 11.09,11.06 10.27,11.06C9.07,11.06 9,11.81 9,12C9,13.04 11.71,13.43 11.71,15.86C11.71,17.77 10.5,19 8.87,19C6.91,19 5.91,17.78 5.91,17.78L6.43,16.05C6.43,16.05 7.46,16.93 8.33,16.93C8.9,16.93 9.13,16.5 9.13,16.16C9.13,14.81 6.92,14.75 6.92,12.53C6.92,10.66 8.26,8.85 10.97,8.85C12,8.85 12.5,9.15 12.5,9.15M15.43,5.29L16.75,6.6L17.71,6.68C18.05,9 19.19,16.73 19.66,19.88L14.66,20.97L15.43,5.29Z", + "name": "shopify" + }, + { + "path": "M7.47,17.19C7.37,17.95 7.08,18.21 6.19,18.21C5.27,18.21 4.87,17.79 4.81,16.87L4.61,13.65C4.61,12.91 4.87,12.55 5.86,12.55C7.21,12.55 7.04,13.54 7.64,14.5C8.33,15.62 10,16.35 12.31,16.35C15.17,16.35 17,15.14 17,13.57C17,12.23 15.89,11.39 13.85,11.16L11.5,10.89C7.21,10.42 5.1,9.19 5.1,6.62C5.1,4.07 8.06,2 12.21,2C13.5,2 14.81,2.29 16.29,2.76C16.29,2.26 16.58,2.1 17.3,2.1C18.46,2.1 18.55,2.39 18.62,3.08L18.85,5.88C18.85,6.5 18.39,6.83 17.63,6.83C16.35,6.83 16.55,5.88 15.86,5.07C15.17,4.26 13.79,3.73 12.08,3.73C9.44,3.73 7.7,4.89 7.7,6.5C7.7,7.8 8.92,8.56 11.38,8.82L13.95,9.08C17.7,9.5 19.61,10.92 19.61,13.33C19.61,16.17 16.71,18.08 12.21,18.08C10.56,18.08 9.08,17.77 7.47,17.19M1,16H2V21H23V22H1V16Z", + "name": "slackware" + }, + { + "path": "M6,3H18A3,3 0 0,1 21,6V18A3,3 0 0,1 18,21H6A3,3 0 0,1 3,18V6A3,3 0 0,1 6,3M7,6A1,1 0 0,0 6,7V17A1,1 0 0,0 7,18H17A1,1 0 0,0 18,17V7A1,1 0 0,0 17,6H7M9.5,9H14.5A0.5,0.5 0 0,1 15,9.5V14.5A0.5,0.5 0 0,1 14.5,15H9.5A0.5,0.5 0 0,1 9,14.5V9.5A0.5,0.5 0 0,1 9.5,9Z", + "name": "square-inc" + }, + { + "path": "M5.5,0H18.5A5.5,5.5 0 0,1 24,5.5V18.5A5.5,5.5 0 0,1 18.5,24H5.5A5.5,5.5 0 0,1 0,18.5V5.5A5.5,5.5 0 0,1 5.5,0M15.39,15.18C15.39,16.76 14.5,17.81 12.85,17.95V12.61C14.55,13.13 15.39,13.66 15.39,15.18M11.65,6V10.88C10.34,10.5 9.03,9.93 9.03,8.43C9.03,6.94 10.18,6.12 11.65,6M15.5,7.6L16.5,6.8C15.62,5.66 14.4,4.92 12.85,4.77V3.8H11.65V3.8L11.65,4.75C9.5,4.89 7.68,6.17 7.68,8.5C7.68,11 9.74,11.78 11.65,12.29V17.96C10.54,17.84 9.29,17.31 8.43,16.03L7.3,16.78C8.2,18.12 9.76,19 11.65,19.14V20.2H12.07L12.85,20.2V19.16C15.35,19 16.7,17.34 16.7,15.14C16.7,12.58 14.81,11.76 12.85,11.19V6.05C14,6.22 14.85,6.76 15.5,7.6Z", + "name": "square-inc-cash" + }, + { + "path": "M19,3A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V15L6.19,16.31C6.45,17.6 7.6,18.58 8.97,18.58C10.53,18.58 11.8,17.31 11.8,15.75V15.62L15.2,13.19H15.28C17.36,13.19 19.05,11.5 19.05,9.42C19.05,7.34 17.36,5.65 15.28,5.65C13.2,5.65 11.5,7.34 11.5,9.42V9.47L9.13,12.93L8.97,12.92C8.38,12.92 7.83,13.1 7.38,13.41L3,11.6V5A2,2 0 0,1 5,3H19M8.28,17.17C9.08,17.5 10,17.13 10.33,16.33C10.66,15.53 10.28,14.62 9.5,14.29L8.22,13.76C8.71,13.58 9.26,13.57 9.78,13.79C10.31,14 10.72,14.41 10.93,14.94C11.15,15.46 11.15,16.04 10.93,16.56C10.5,17.64 9.23,18.16 8.15,17.71C7.65,17.5 7.27,17.12 7.06,16.67L8.28,17.17M17.8,9.42C17.8,10.81 16.67,11.94 15.28,11.94C13.9,11.94 12.77,10.81 12.77,9.42A2.51,2.51 0 0,1 15.28,6.91C16.67,6.91 17.8,8.04 17.8,9.42M13.4,9.42C13.4,10.46 14.24,11.31 15.29,11.31C16.33,11.31 17.17,10.46 17.17,9.42C17.17,8.38 16.33,7.53 15.29,7.53C14.24,7.53 13.4,8.38 13.4,9.42Z", + "name": "steam-box" + }, + { + "path": "M14.92,17.16L16.75,13.53H19.45L14.94,22.5L10.37,13.53H13.07L14.92,17.16M10.63,8.66L8.18,13.55H4.55L10.61,1.5L16.74,13.55H13.11L10.63,8.66Z", + "name": "strava" + }, + { + "path": "M12,14C11,14 9,15 9,16C9,18 12,18 12,18V17A1,1 0 0,1 11,16A1,1 0 0,1 12,15V14M12,19C12,19 8,18.5 8,16.5C8,13.5 11,12.75 12,12.75V11.5C11,11.5 7,13 7,16C7,20 12,20 12,20V19M10.07,7.03L11.26,7.56C11.69,5.12 12.84,3.5 12.84,3.5C12.41,4.53 12.13,5.38 11.95,6.05C13.16,3.55 15.61,2 15.61,2C14.43,3.18 13.56,4.46 12.97,5.53C14.55,3.85 16.74,2.75 16.74,2.75C14.05,4.47 12.84,7.2 12.54,7.96L13.09,8.04C13.09,8.56 13.09,9.04 13.34,9.42C14.1,11.31 18,11.47 18,16C18,20.53 13.97,22 11.83,22C9.69,22 5,21.03 5,16C5,10.97 9.95,10.93 10.83,8.92C10.95,8.54 10.07,7.03 10.07,7.03Z", + "name": "tor" + }, + { + "path": "M17,11H13V15.5C13,16.44 13.28,17 14.5,17H17V21C17,21 15.54,21.05 14.17,21.05C10.8,21.05 9.5,19 9.5,16.75V11H7V7C10.07,6.74 10.27,4.5 10.5,3H13V7H17", + "name": "tumblr" + }, + { + "path": "M16,11H13V14.9C13,15.63 13.14,16 14.1,16H16V19C16,19 14.97,19.1 13.9,19.1C11.25,19.1 10,17.5 10,15.7V11H8V8.2C10.41,8 10.62,6.16 10.8,5H13V8H16M20,2H4C2.89,2 2,2.89 2,4V20A2,2 0 0,0 4,22H20A2,2 0 0,0 22,20V4C22,2.89 21.1,2 20,2Z", + "name": "tumblr-box" + }, + { + "path": "M3.75,17L8,12.75V16H18V11.5L20,9.5V16A2,2 0 0,1 18,18H8V21.25L3.75,17M20.25,7L16,11.25V8H6V12.5L4,14.5V8A2,2 0 0,1 6,6H16V2.75L20.25,7Z", + "name": "tumblr-reblog" + }, + { + "path": "M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3M17.71,9.33C18.19,8.93 18.75,8.45 19,7.92C18.59,8.13 18.1,8.26 17.56,8.33C18.06,7.97 18.47,7.5 18.68,6.86C18.16,7.14 17.63,7.38 16.97,7.5C15.42,5.63 11.71,7.15 12.37,9.95C9.76,9.79 8.17,8.61 6.85,7.16C6.1,8.38 6.75,10.23 7.64,10.74C7.18,10.71 6.83,10.57 6.5,10.41C6.54,11.95 7.39,12.69 8.58,13.09C8.22,13.16 7.82,13.18 7.44,13.12C7.81,14.19 8.58,14.86 9.9,15C9,15.76 7.34,16.29 6,16.08C7.15,16.81 8.46,17.39 10.28,17.31C14.69,17.11 17.64,13.95 17.71,9.33Z", + "name": "twitter-box" + }, + { + "path": "M17.71,9.33C18.19,8.93 18.75,8.45 19,7.92C18.59,8.13 18.1,8.26 17.56,8.33C18.06,7.97 18.47,7.5 18.68,6.86C18.16,7.14 17.63,7.38 16.97,7.5C15.42,5.63 11.71,7.15 12.37,9.95C9.76,9.79 8.17,8.61 6.85,7.16C6.1,8.38 6.75,10.23 7.64,10.74C7.18,10.71 6.83,10.57 6.5,10.41C6.54,11.95 7.39,12.69 8.58,13.09C8.22,13.16 7.82,13.18 7.44,13.12C7.81,14.19 8.58,14.86 9.9,15C9,15.76 7.34,16.29 6,16.08C7.15,16.81 8.46,17.39 10.28,17.31C14.69,17.11 17.64,13.95 17.71,9.33M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2Z", + "name": "twitter-circle" + }, + { + "path": "M6.38,13.24V13.24C6.38,11.84 6.38,10.44 6.38,9.04H7.4V15.84H6.39C6.39,15.63 6.39,15.42 6.39,15.21C5.93,15.68 5.29,15.96 4.58,15.96C3.12,15.96 2,14.9 2,13.3V9.04H3V13.24C3,14.33 3.74,15.04 4.7,15.04C5.64,15.04 6.38,14.31 6.38,13.24M9.14,9.04V11.5C9.37,11.29 9.65,11.1 9.95,10.97C10.25,10.85 10.58,10.78 10.91,10.78C12.37,10.78 13.5,11.94 13.5,13.37C13.5,14.8 12.37,15.96 10.91,15.96C10.58,15.96 10.25,15.89 9.95,15.77C9.64,15.64 9.37,15.45 9.13,15.22C9.13,15.43 9.13,15.63 9.13,15.84C8.81,15.84 8.5,15.84 8.16,15.84V9.04H9.14M12.55,13.37V13.37C12.55,12.41 11.77,11.65 10.84,11.65C9.89,11.65 9.13,12.41 9.13,13.37C9.13,14.32 9.88,15.09 10.84,15.09C11.77,15.09 12.55,14.32 12.55,13.37M16.46,10.79C17.9,10.79 18.95,11.89 18.95,13.36V13.69H14.91C15.04,14.5 15.71,15.09 16.55,15.09C17.13,15.09 17.61,14.86 18,14.36L18.7,14.89C18.2,15.55 17.46,15.95 16.55,15.95C15.06,15.95 13.91,14.84 13.91,13.36C13.91,11.97 15,10.79 16.46,10.79M14.92,12.91H17.95C17.79,12.15 17.18,11.65 16.44,11.65C15.71,11.65 15.1,12.15 14.92,12.91M20.5,13V15.84H19.5V10.89C19.82,10.89 20.14,10.89 20.47,10.89V11.5C20.71,11.1 21.11,10.85 21.66,10.85H22V11.76H21.59C20.95,11.76 20.5,12.26 20.5,13", + "name": "uber" + }, + { + "path": "M19.5,3C20.14,4.08 20.44,5.19 20.44,6.6C20.44,11.08 16.61,16.91 13.5,21H6.41L3.56,4L9.77,3.39L11.28,15.5C12.69,13.21 14.42,9.61 14.42,7.16C14.42,5.81 14.19,4.9 13.83,4.15L19.5,3Z", + "name": "venmo" + }, + { + "path": "M5,3A2,2 0 0,0 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5A2,2 0 0,0 19,3H5M5.5,8.5H7C7.36,8.5 7.5,8.66 7.64,9.07C8.36,11.17 9.57,13 10.07,13C10.26,13 10.35,12.92 10.35,12.45V10.28C10.29,9.28 9.76,9.19 9.76,8.84C9.76,8.67 9.9,8.5 10.14,8.5H12.45C12.77,8.5 12.87,8.67 12.87,9.04V11.96C12.87,12.27 13,12.38 13.1,12.38C13.29,12.38 13.45,12.27 13.79,11.93C14.85,10.74 15.6,8.92 15.6,8.92C15.7,8.7 15.87,8.5 16.24,8.5H17.71C18.16,8.5 18.26,8.73 18.16,9.04C17.97,9.9 16.18,12.43 16.18,12.43C16,12.68 15.96,12.8 16.18,13.09C16.33,13.3 16.85,13.74 17.19,14.15C17.83,14.86 18.3,15.46 18.44,15.87C18.56,16.29 18.35,16.5 17.93,16.5H16.45C15.89,16.5 15.73,16.05 14.73,15.05C13.85,14.21 13.5,14.1 13.26,14.1C12.96,14.1 12.87,14.18 12.87,14.61V15.93C12.87,16.29 12.76,16.5 11.82,16.5C10.26,16.5 8.54,15.55 7.33,13.8C5.5,11.24 5,9.31 5,8.92C5,8.7 5.08,8.5 5.5,8.5Z", + "name": "vk-box" + }, + { + "path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M5.5,8.5H7C7.36,8.5 7.5,8.66 7.64,9.07C8.36,11.17 9.57,13 10.07,13C10.26,13 10.35,12.92 10.35,12.45V10.28C10.29,9.28 9.76,9.19 9.76,8.84C9.76,8.67 9.9,8.5 10.14,8.5H12.45C12.77,8.5 12.87,8.67 12.87,9.04V11.96C12.87,12.27 13,12.38 13.1,12.38C13.29,12.38 13.45,12.27 13.79,11.93C14.85,10.74 15.6,8.92 15.6,8.92C15.7,8.7 15.87,8.5 16.24,8.5H17.71C18.16,8.5 18.26,8.73 18.16,9.04C17.97,9.9 16.18,12.43 16.18,12.43C16,12.68 15.96,12.8 16.18,13.09C16.33,13.3 16.85,13.74 17.19,14.15C17.83,14.86 18.3,15.46 18.44,15.87C18.56,16.29 18.35,16.5 17.93,16.5H16.45C15.89,16.5 15.73,16.05 14.73,15.05C13.85,14.21 13.5,14.1 13.26,14.1C12.96,14.1 12.87,14.18 12.87,14.61V15.93C12.87,16.29 12.76,16.5 11.82,16.5C10.26,16.5 8.54,15.55 7.33,13.8C5.5,11.24 5,9.31 5,8.92C5,8.7 5.08,8.5 5.5,8.5Z", + "name": "vk-circle" + }, + { + "path": "M17,17.5L12,15L7,17.5V5H5V19H19V5H17V17.5M12,12.42L14.25,13.77L13.65,11.22L15.64,9.5L13,9.27L12,6.86L11,9.27L8.36,9.5L10.35,11.22L9.75,13.77L12,12.42M5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3Z", + "name": "wunderlist" + }, + { + "path": "M0 16.7L3.2 12.9L0 9.1L1.5 7.8L4.5 11.3L7.5 7.8L9 9.1L5.8 12.9L9 16.7L7.5 18L4.5 14.4L1.5 18L0 16.7M24 16.9C24 17.4 23.6 17.9 23 17.9H20C18.9 17.9 18 17 18 15.9V13.9C18 12.8 18.9 11.9 20 11.9H22V9.9H18V8H23C23.5 8 24 8.4 24 9M22 14H20V16H22V14M16 16.9C16 17.4 15.6 17.9 15 17.9H12C10.9 17.9 10 17 10 15.9V9.9C10 8.8 10.9 7.9 12 7.9H14V5H16V16.9M14 15.9V9.9H12V15.9H14Z", + "name": "xda" + }, + { + "path": "M4.8,3C3.8,3 3,3.8 3,4.8V19.2C3,20.2 3.8,21 4.8,21H19.2C20.2,21 21,20.2 21,19.2V4.8C21,3.8 20.2,3 19.2,3M16.07,5H18.11C18.23,5 18.33,5.04 18.37,5.13C18.43,5.22 18.43,5.33 18.37,5.44L13.9,13.36L16.75,18.56C16.81,18.67 16.81,18.78 16.75,18.87C16.7,18.95 16.61,19 16.5,19H14.47C14.16,19 14,18.79 13.91,18.61L11.04,13.35C11.18,13.1 15.53,5.39 15.53,5.39C15.64,5.19 15.77,5 16.07,5M7.09,7.76H9.1C9.41,7.76 9.57,7.96 9.67,8.15L11.06,10.57C10.97,10.71 8.88,14.42 8.88,14.42C8.77,14.61 8.63,14.81 8.32,14.81H6.3C6.18,14.81 6.09,14.76 6.04,14.67C6,14.59 6,14.47 6.04,14.36L8.18,10.57L6.82,8.2C6.77,8.09 6.75,8 6.81,7.89C6.86,7.81 6.96,7.76 7.09,7.76Z", + "name": "xing-box" + }, + { + "path": "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M15.85,6H17.74C17.86,6 17.94,6.04 18,6.12C18.04,6.2 18.04,6.3 18,6.41L13.84,13.76L16.5,18.59C16.53,18.69 16.53,18.8 16.5,18.88C16.43,18.96 16.35,19 16.24,19H14.36C14.07,19 13.93,18.81 13.84,18.64L11.17,13.76C11.31,13.5 15.35,6.36 15.35,6.36C15.45,6.18 15.57,6 15.85,6M7.5,8.57H9.39C9.67,8.57 9.81,8.75 9.9,8.92L11.19,11.17C11.12,11.3 9.17,14.75 9.17,14.75C9.07,14.92 8.94,15.11 8.66,15.11H6.78C6.67,15.11 6.59,15.06 6.54,15C6.5,14.9 6.5,14.8 6.54,14.69L8.53,11.17L7.27,9C7.21,8.87 7.2,8.77 7.25,8.69C7.3,8.61 7.39,8.57 7.5,8.57Z", + "name": "xing-circle" + }, + { + "path": "M10.59,2C11.23,2 11.5,2.27 11.58,2.97L11.79,6.14L12.03,10.29C12.05,10.64 12,11 11.86,11.32C11.64,11.77 11.14,11.89 10.73,11.58C10.5,11.39 10.31,11.14 10.15,10.87L6.42,4.55C6.06,3.94 6.17,3.54 6.77,3.16C7.5,2.68 9.73,2 10.59,2M14.83,14.85L15.09,14.91L18.95,16.31C19.61,16.55 19.79,16.92 19.5,17.57C19.06,18.7 18.34,19.66 17.42,20.45C16.96,20.85 16.5,20.78 16.21,20.28L13.94,16.32C13.55,15.61 14.03,14.8 14.83,14.85M4.5,14C4.5,13.26 4.5,12.55 4.75,11.87C4.97,11.2 5.33,11 6,11.27L9.63,12.81C10.09,13 10.35,13.32 10.33,13.84C10.3,14.36 9.97,14.58 9.53,14.73L5.85,15.94C5.15,16.17 4.79,15.96 4.64,15.25C4.55,14.83 4.47,14.4 4.5,14M11.97,21C11.95,21.81 11.6,22.12 10.81,22C9.77,21.8 8.81,21.4 7.96,20.76C7.54,20.44 7.45,19.95 7.76,19.53L10.47,15.97C10.7,15.67 11.03,15.6 11.39,15.74C11.77,15.88 11.97,16.18 11.97,16.59V21M14.45,13.32C13.73,13.33 13.23,12.5 13.64,11.91C14.47,10.67 15.35,9.46 16.23,8.26C16.5,7.85 16.94,7.82 17.31,8.16C18.24,9 18.91,10 19.29,11.22C19.43,11.67 19.25,12.08 18.83,12.2L15.09,13.17L14.45,13.32Z", + "name": "yelp" + } +] diff --git a/package.json b/package.json index 403b5d5d79..242fc7b1be 100644 --- a/package.json +++ b/package.json @@ -37,8 +37,8 @@ "@material/mwc-menu": "^0.17.2", "@material/mwc-ripple": "^0.17.2", "@material/mwc-switch": "^0.17.2", - "@mdi/js": "4.9.95", - "@mdi/svg": "4.9.95", + "@mdi/js": "5.3.45", + "@mdi/svg": "5.3.45", "@polymer/app-layout": "^3.0.2", "@polymer/app-route": "^3.0.2", "@polymer/app-storage": "^3.0.2", diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts index 650c4288e1..866b3a5afc 100644 --- a/src/common/entity/domain_icon.ts +++ b/src/common/entity/domain_icon.ts @@ -13,7 +13,7 @@ const fixedIcons = { calendar: "hass:calendar", camera: "hass:video", climate: "hass:thermostat", - configurator: "hass:settings", + configurator: "hass:cog", conversation: "hass:text-to-speech", counter: "hass:counter", device_tracker: "hass:account", @@ -29,7 +29,7 @@ const fixedIcons = { input_datetime: "hass:calendar-clock", input_number: "hass:ray-vertex", input_select: "hass:format-list-bulleted", - input_text: "hass:textbox", + input_text: "hass:form-textbox", light: "hass:lightbulb", mailbox: "hass:mailbox", notify: "hass:comment-alert", @@ -44,7 +44,7 @@ const fixedIcons = { simple_alarm: "hass:bell", sun: "hass:white-balance-sunny", switch: "hass:flash", - timer: "hass:timer", + timer: "hass:timer-outline", updater: "hass:cloud-upload", vacuum: "hass:robot-vacuum", water_heater: "hass:thermometer", diff --git a/src/components/entity/ha-state-label-badge.ts b/src/components/entity/ha-state-label-badge.ts index 1761191504..1c812a6065 100644 --- a/src/components/entity/ha-state-label-badge.ts +++ b/src/components/entity/ha-state-label-badge.ts @@ -155,7 +155,9 @@ export class HaStateLabelBadge extends LitElement { ? domainIcon(domain) : "hass:brightness-3"; case "timer": - return state.state === "active" ? "hass:timer" : "hass:timer-off"; + return state.state === "active" + ? "hass:timer-outline" + : "hass:timer-off-outline"; default: return null; } diff --git a/src/components/ha-icon.ts b/src/components/ha-icon.ts index 7a8eee1896..c89b1d2f51 100644 --- a/src/components/ha-icon.ts +++ b/src/components/ha-icon.ts @@ -21,6 +21,205 @@ import { writeCache, } from "../data/iconsets"; import { debounce } from "../common/util/debounce"; +import { fireEvent } from "../common/dom/fire_event"; + +const mdiRenameMapping = { + "account-badge": "badge-account", + "account-badge-alert": "badge-account-alert", + "account-badge-alert-outline": "badge-account-alert-outline", + "account-badge-horizontal": "badge-account-horizontal", + "account-badge-horizontal-outline": "badge-account-horizontal-outline", + "account-badge-outline": "badge-account-outline", + "account-card-details": "card-account-details", + "account-card-details-outline": "card-account-details-outline", + airplay: "apple-airplay", + artist: "account-music", + "artist-outline": "account-music-outline", + audiobook: "book-music", + azure: "microsoft-azure", + "azure-devops": "microsoft-azure-devops", + bible: "book-cross", + bowl: "bowl-mix", + "calendar-repeat": "calendar-sync", + "calendar-repeat-outline": "calendar-sync-outline", + "camcorder-box": "video-box", + "camcorder-box-off": "video-box-off", + "cellphone-settings-variant": "cellphone-cog", + "chart-snakey": "chart-sankey", + "chart-snakey-variant": "chart-sankey-variant", + coin: "currency-usd-circle", + "coin-outline": "currency-usd-circle-outline", + "coins-outline": "circle-multiple-outline", + "contact-mail": "card-account-mail", + "contact-mail-outline": "card-account-mail-outline", + "contact-phone": "card-account-phone", + "contact-phone-outline": "card-account-phone-outline", + cowboy: "account-cowboy-hat", + "database-refresh": "database-sync", + dictionary: "book-alphabet", + edge: "microsoft-edge", + "edge-legacy": "microsoft-edge-legacy", + "file-document-box": "text-box", + "file-document-box-check-outline": "text-box-check-outline", + "file-document-box-minus": "text-box-minus", + "file-document-box-minus-outline": "text-box-minus-outline", + "file-document-box-multiple": "text-box-multiple", + "file-document-box-multiple-outline": "text-box-multiple-outline", + "file-document-box-outline": "text-box-outline", + "file-document-box-plus": "text-box-plus", + "file-document-box-plus-outline": "text-box-plus-outline", + "file-document-box-remove": "text-box-remove", + "file-document-box-remove-outline": "text-box-remove-outline", + "file-document-box-search": "text-box-search", + "file-document-box-search-outline": "text-box-search-outline", + "file-settings-variant": "file-cog", + "file-settings-variant-outline": "file-cog-outline", + "folder-settings-variant": "folder-cog", + "folder-settings-variant-outline": "folder-cog-outline", + "github-circle": "github", + "google-adwords": "google-ads", + hackernews: "y-combinator", + hotel: "bed", + "image-filter": "image-multiple-outline", + "internet-explorer": "microsoft-internet-explorer", + json: "code-json", + kotlin: "language-kotlin", + "library-books": "filmstrip-box", + "library-movie": "filmstrip-box-multiple", + "library-music": "music-box-multiple", + "library-music-outline": "music-box-multiple-outline", + "library-video": "play-box-mutiple", + markdown: "language-markdown", + "markdown-outline": "language-markdown-outline", + "message-settings-variant": "message-cog", + "message-settings-variant-outline": "message-cog-outline", + "microsoft-dynamics": "microsoft-dynamics-365", + "network-router": "router-network", + office: "microsoft-office", + onedrive: "microsoft-onedrive", + onenote: "microsoft-onenote", + outlook: "microsoft-outlook", + playstation: "sony-playstation", + "periodic-table-co": "molecule-co", + "periodic-table-co2": "molecule-co2", + pot: "pot-steam", + ruby: "language-ruby", + sailing: "sail-boat", + settings: "cog", + "settings-box": "cog-box", + "settings-outline": "cog-outline", + "settings-transfer": "cog-transfer", + "settings-transfer-outline": "cog-transfer-outline", + "shield-refresh": "shield-sync", + "shield-refresh-outline": "shield-sync-outline", + "sort-alphabetical": "sort-alphabetical-variant", + "sort-alphabetical-ascending": "sort-alphabetical-ascending-variant", + "sort-alphabetical-descending": "sort-alphabetical-descending-variant", + "sort-numeric": "sort-numeric-variant", + "star-half": "star-half-full", + storefront: "storefront-outline", + timer: "timer-outline", + "timer-off": "timer-off-outline", + towing: "tow-truck", + voice: "account-voice", + "wall-sconce-variant": "wall-sconce-round-variant", + wii: "nintendo-wii", + wiiu: "nintendo-wiiu", + windows: "microsoft-windows", + "windows-classic": "microsoft-windows-classic", + worker: "account-hard-hat", + xbox: "microsoft-xbox", + "xbox-controller": "microsoft-xbox-controller", + "xbox-controller-battery-alert": "microsoft-xbox-controller-battery-alert", + "xbox-controller-battery-charging": + "microsoft-xbox-controller-battery-charging", + "xbox-controller-battery-empty": "microsoft-xbox-controller-battery-empty", + "xbox-controller-battery-full": "microsoft-xbox-controller-battery-full", + "xbox-controller-battery-low": "microsoft-xbox-controller-battery-low", + "xbox-controller-battery-medium": "microsoft-xbox-controller-battery-medium", + "xbox-controller-battery-unknown": + "microsoft-xbox-controller-battery-unknown", + "xbox-controller-menu": "microsoft-xbox-controller-menu", + "xbox-controller-off": "microsoft-xbox-controller-off", + "xbox-controller-view": "microsoft-xbox-controller-view", + yammer: "microsoft-yammer", + "youtube-creator-studio": "youtube-studio", + "selection-mutliple": "selection-multiple", + textarea: "form-textarea", + textbox: "form-textbox", + "textbox-lock": "form-textbox-lock", + "textbox-password": "form-textbox-password", + "syllabary-katakana-half-width": "syllabary-katakana-halfwidth", +}; + +const mdiRemovedIcons = new Set([ + "accusoft", + "amazon-drive", + "android-head", + "basecamp", + "beats", + "behance", + "blackberry", + "cisco-webex", + "disqus-outline", + "dribbble", + "dribbble-box", + "etsy", + "eventbrite", + "facebook-box", + "flattr", + "flickr", + "foursquare", + "github-box", + "github-face", + "glassdoor", + "google-adwords", + "google-pages", + "google-physical-web", + "google-plus-box", + "houzz", + "houzz-box", + "instapaper", + "itunes", + "language-python-text", + "lastfm", + "linkedin-box", + "lyft", + "mail-ru", + "mastodon-variant", + "medium", + "meetup", + "mixcloud", + "nfc-off", + "npm-variant", + "npm-variant-outline", + "paypal", + "periscope", + "pinterest-box", + "pocket", + "quicktime", + "shopify", + "slackware", + "square-inc", + "square-inc-cash", + "steam-box", + "strava", + "tor", + "tumblr", + "tumblr-box", + "tumblr-reblog", + "twitter-box", + "twitter-circle", + "uber", + "venmo", + "vk-box", + "vk-circle", + "wunderlist", + "xda", + "xing-box", + "xing-circle", + "yelp", +]); const chunks: Chunks = {}; @@ -65,7 +264,9 @@ export class HaIcon extends LitElement { if (!this.icon) { return; } - const [iconPrefix, iconName] = this.icon.split(":", 2); + const [iconPrefix, origIconName] = this.icon.split(":", 2); + + let iconName = origIconName; if (!iconPrefix || !iconName) { return; @@ -85,6 +286,25 @@ export class HaIcon extends LitElement { this._legacy = false; + if (iconName in mdiRenameMapping) { + iconName = mdiRenameMapping[iconName]; + const message = `Icon ${iconPrefix}:${origIconName} was renamed to ${iconPrefix}:${iconName}, please change your config, it will be removed in version 0.115.`; + // eslint-disable-next-line no-console + console.warn(message); + fireEvent(this, "write_log", { + level: "warning", + message, + }); + } else if (mdiRemovedIcons.has(iconName)) { + const message = `Icon ${this.icon} was removed from MDI, please replace this icon with an other icon in your config, it will be removed in version 0.115.`; + // eslint-disable-next-line no-console + console.warn(message); + fireEvent(this, "write_log", { + level: "warning", + message, + }); + } + if (iconName in cachedIcons) { this._path = cachedIcons[iconName]; return; diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 5b02f1896c..549b77c19f 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -1,7 +1,7 @@ import "@material/mwc-icon-button"; import { mdiBell, - mdiCellphoneSettingsVariant, + mdiCellphoneCog, mdiMenuOpen, mdiMenu, mdiViewDashboard, @@ -219,7 +219,7 @@ class HaSidebar extends LitElement { ${hass.localize("ui.sidebar.external_app_configuration")} diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index e4dff4b279..ef0a1fc9f7 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -27,7 +27,7 @@ import { HomeAssistant } from "../../types"; import { fireEvent } from "../../common/dom/fire_event"; import { getRecentWithCache } from "../../data/cached-history"; import { computeDomain } from "../../common/entity/compute_domain"; -import { mdiClose, mdiSettings, mdiPencil } from "@mdi/js"; +import { mdiClose, mdiCog, mdiPencil } from "@mdi/js"; import { HistoryResult } from "../../data/history"; const DOMAINS_NO_INFO = ["camera", "configurator", "history_graph"]; @@ -107,7 +107,7 @@ export class MoreInfoDialog extends LitElement { )} @click=${this._gotoSettings} > - + ` : ""} ${this.hass.user!.is_admin && diff --git a/src/fake_data/demo_panels.ts b/src/fake_data/demo_panels.ts index 000076eef1..71aa6ac0ff 100644 --- a/src/fake_data/demo_panels.ts +++ b/src/fake_data/demo_panels.ts @@ -74,7 +74,7 @@ export const demoPanels: Panels = { }, // config: { // component_name: "config", - // icon: "hass:settings", + // icon: "hass:cog", // title: "config", // config: null, // url_path: "config", diff --git a/src/panels/config/areas/ha-config-area-page.ts b/src/panels/config/areas/ha-config-area-page.ts index 46d0a0d026..d77c073ff3 100644 --- a/src/panels/config/areas/ha-config-area-page.ts +++ b/src/panels/config/areas/ha-config-area-page.ts @@ -106,7 +106,7 @@ class HaConfigAreaPage extends LitElement { diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 41f7906f0b..fd10d1d175 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -169,7 +169,7 @@ export class HaConfigDevicePage extends LitElement { diff --git a/src/panels/config/ha-panel-config.ts b/src/panels/config/ha-panel-config.ts index deebb5f057..c46dd0e967 100644 --- a/src/panels/config/ha-panel-config.ts +++ b/src/panels/config/ha-panel-config.ts @@ -21,7 +21,7 @@ import { mdiViewDashboard, mdiAccount, mdiMapMarkerRadius, - mdiAccountBadgeHorizontal, + mdiBadgeAccountHorizontal, mdiHomeAssistant, mdiServer, mdiInformation, @@ -119,7 +119,7 @@ export const configSections: { [name: string]: PageNavigation[] } = { component: "users", path: "/config/users", translationKey: "ui.panel.config.users.caption", - iconPath: mdiAccountBadgeHorizontal, + iconPath: mdiBadgeAccountHorizontal, core: true, }, ], diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index 5959b4decb..4a2de6b9ac 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -34,7 +34,7 @@ import { LovelaceCard, LovelaceCardEditor } from "../types"; import { ThermostatCardConfig } from "./types"; const modeIcons: { [mode in HvacMode]: string } = { - auto: "hass:calendar-repeat", + auto: "hass:calendar-sync", heat_cool: "hass:autorenew", heat: "hass:fire", cool: "hass:snowflake", diff --git a/src/state/hass-element.ts b/src/state/hass-element.ts index a5cb0992ae..0c9c1fd2c0 100644 --- a/src/state/hass-element.ts +++ b/src/state/hass-element.ts @@ -12,6 +12,7 @@ import SidebarMixin from "./sidebar-mixin"; import ThemesMixin from "./themes-mixin"; import TranslationsMixin from "./translations-mixin"; import { urlSyncMixin } from "./url-sync-mixin"; +import { loggingMixin } from "./logging-mixin"; const ext = (baseClass: T, mixins): T => mixins.reduceRight((base, mixin) => mixin(base), baseClass); @@ -29,4 +30,5 @@ export class HassElement extends ext(HassBaseEl, [ urlSyncMixin, hapticMixin, panelTitleMixin, + loggingMixin, ]) {} diff --git a/src/state/logging-mixin.ts b/src/state/logging-mixin.ts new file mode 100644 index 0000000000..1d1a232e31 --- /dev/null +++ b/src/state/logging-mixin.ts @@ -0,0 +1,40 @@ +import { HASSDomEvent } from "../common/dom/fire_event"; +import { Constructor } from "../types"; +import { HassBaseEl } from "./hass-base-mixin"; + +interface WriteLogParams { + level?: "debug" | "info" | "warning" | "error" | "critical"; + message: string; +} + +declare global { + // for fire event + interface HASSDomEvents { + write_log: WriteLogParams; + } + interface HTMLElementEventMap { + write_log: HASSDomEvent; + } +} + +export const loggingMixin = >( + superClass: T +) => + class extends superClass { + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + this.addEventListener("write_log", (ev) => { + this._writeLog(ev.detail); + }); + } + + private _writeLog(log: WriteLogParams) { + this.hass?.callService("system_log", "write", { + logger: `frontend.${ + __DEV__ ? "js_dev" : "js" + }.${__BUILD__}.${__VERSION__.replace(".", "")}`, + message: log.message, + level: log.level || "error", + }); + } + }; diff --git a/yarn.lock b/yarn.lock index 226a024ee2..632e037d05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1747,15 +1747,15 @@ "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" "@material/theme" "8.0.0-canary.a78ceb112.0" -"@mdi/js@4.9.95": - version "4.9.95" - resolved "https://registry.yarnpkg.com/@mdi/js/-/js-4.9.95.tgz#8984c2ac04c89913a3ff2bbe4d91f4ab51d8ef4f" - integrity sha512-6zKTCqZUCuDWJThdRcjdFTqp2BXfYwXI1UlYa68A1/kmCcy1ijpbpRbrJcUdZ+9WojencCh1DOGFqhj/x8I/eQ== +"@mdi/js@5.3.45": + version "5.3.45" + resolved "https://registry.yarnpkg.com/@mdi/js/-/js-5.3.45.tgz#c6f523311bf77e339051e24aaa3eddabf565a027" + integrity sha512-r05JoeUhokSERwW6yYi3WcKCBePHHqBvIikOD0X/dWyaZb6gIRth5Lya7VVTItvGo1qlpp8LpMJKmE6o49+G+Q== -"@mdi/svg@4.9.95": - version "4.9.95" - resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.9.95.tgz#4e9d2b26b12e22f751336b35ba3cb763817e4c45" - integrity sha512-4RBtbnPlILP5TIQJ2p3t3VD6D+HcCeQtrFTKoa5e+v3ZvRbylffttYovtcFKfgEJ+Tk0s9t2NgLcPUyQtD9Rxg== +"@mdi/svg@5.3.45": + version "5.3.45" + resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-5.3.45.tgz#27456a94ffa16b71c0a6581b584f24ed9d4f6b2e" + integrity sha512-MHUZBDSRDG6uWcRlQs4nALliPRT8u4gg5E+knk7FuFBUb3NjFgjT0PjdnTyEN0f3mwVLzLvggs7v7G/NVO+gaw== "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" From 077802f972eda49a54466370bc4cef06fbffbe96 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Sat, 11 Jul 2020 23:17:14 +0300 Subject: [PATCH 37/58] Added missing label to translations (#6362) --- .../lovelace/editor/lovelace-editor/hui-lovelace-editor.ts | 6 ++++-- src/translations/en.json | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts b/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts index 1163f71680..1e78a531ec 100644 --- a/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts +++ b/src/panels/lovelace/editor/lovelace-editor/hui-lovelace-editor.ts @@ -22,7 +22,7 @@ declare global { @customElement("hui-lovelace-editor") export class HuiLovelaceEditor extends LitElement { - @property() public hass?: HomeAssistant; + @property() public hass!: HomeAssistant; @property() public config?: LovelaceConfig; @@ -38,7 +38,9 @@ export class HuiLovelaceEditor extends LitElement { ${configElementStyle}
Date: Sun, 12 Jul 2020 00:32:40 +0000 Subject: [PATCH 38/58] [ci skip] Translation update --- translations/frontend/en.json | 14 +++++++++++--- translations/frontend/he.json | 2 +- translations/frontend/ru.json | 8 ++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 0533854e00..5084434a8f 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -525,6 +525,9 @@ "clear": "Clear", "show_areas": "Show areas" }, + "data-table": { + "search": "Search" + }, "date-range-picker": { "end_date": "End date", "select": "Select", @@ -1356,6 +1359,7 @@ "confirm_text": "You should remove them from your Lovelace config and automations if they contain these entities.", "confirm_title": "Do you want to remove {number} entities?" }, + "search": "Search entities", "selected": "{number} selected", "status": { "disabled": "Disabled", @@ -1386,7 +1390,8 @@ "entity_id": "Entity ID", "name": "Name", "type": "Type" - } + }, + "no_helpers": "Looks like you don't have any helpers yet!" }, "types": { "input_boolean": "Toggle", @@ -1490,7 +1495,8 @@ "note_about_integrations": "Not all integrations can be configured via the UI yet.", "note_about_website_reference": "More are available on the ", "rename_dialog": "Edit the name of this config entry", - "rename_input_label": "Entry name" + "rename_input_label": "Entry name", + "search": "Search integrations" }, "introduction": "Here it is possible to configure your components and Home Assistant. Not everything is possible to configure from the UI yet, but we're working on it.", "logs": { @@ -2194,6 +2200,7 @@ "name": "Name", "no_theme": "No theme", "refresh_interval": "Refresh Interval", + "search": "Search", "secondary_info_attribute": "Secondary Info Attribute", "show_icon": "Show Icon?", "show_name": "Show Name?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "Edit title", "explanation": "This title is shown above all your views in the Lovelace UI.", - "header": "Title of your Lovelace UI" + "header": "Title of your Lovelace UI", + "title": "Title" }, "edit_view": { "add": "Add view", diff --git a/translations/frontend/he.json b/translations/frontend/he.json index c283fd38cc..66e04373fd 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -1545,7 +1545,7 @@ "sidebar": "הצג בסרגל הצד", "title": "כותרת" }, - "open": "פתוח" + "open": "פתח" } }, "description": "הגדרת לוחות המחוונים של Lovelace", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index a543b74b4a..7472441028 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1440,7 +1440,7 @@ "no_area": "Не указано", "no_device": "Объекты без устройств", "no_devices": "Эта интеграция не имеет устройств", - "options": "Параметры", + "options": "Настройки", "rename": "Переименовать", "restart_confirm": "Перезапустите Home Assistant, чтобы завершить удаление этой интеграции", "settings_button": "Настройки интеграции {integration}", @@ -1584,7 +1584,7 @@ } }, "mqtt": { - "button": "Настройка", + "button": "Настройки", "description_listen": "Подписаться на топик", "description_publish": "Опубликовать данные", "listening_to": "Подписано на", @@ -1785,7 +1785,7 @@ "caption": "Добавить устройства", "description": "Добавить устройства в сеть Zigbee" }, - "button": "Настройка", + "button": "Настройки", "caption": "Zigbee Home Automation", "cluster_attributes": { "attributes_of_cluster": "Атрибуты выбранного кластера", @@ -1906,7 +1906,7 @@ "no_zones_created_yet": "У Вас еще нет добавленных зон." }, "zwave": { - "button": "Настройка", + "button": "Настройки", "caption": "Z-Wave", "common": { "index": "Индекс", From 3bc54aa9e03436489bc02bc9d5a7522f5ba48a67 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 12 Jul 2020 09:30:27 -1000 Subject: [PATCH 39/58] Show battery charging state in the config panels (#6356) --- src/common/entity/battery_icon.ts | 28 ++++++++ src/common/entity/sensor_icon.ts | 25 +------ src/components/entity/ha-battery-icon.ts | 20 ++++++ src/data/entity_registry.ts | 11 ++++ .../config/devices/ha-config-device-page.ts | 19 ++++-- .../devices/ha-config-devices-dashboard.ts | 65 ++++++++++++++----- 6 files changed, 124 insertions(+), 44 deletions(-) create mode 100644 src/common/entity/battery_icon.ts create mode 100644 src/components/entity/ha-battery-icon.ts diff --git a/src/common/entity/battery_icon.ts b/src/common/entity/battery_icon.ts new file mode 100644 index 0000000000..26ffb3a3d8 --- /dev/null +++ b/src/common/entity/battery_icon.ts @@ -0,0 +1,28 @@ +/** Return an icon representing a battery state. */ +import { HassEntity } from "home-assistant-js-websocket"; + +export const batteryIcon = ( + batteryState: HassEntity, + batteryChargingState?: HassEntity +) => { + const battery = Number(batteryState.state); + const battery_charging = + batteryChargingState && batteryChargingState.state === "on"; + + if (isNaN(battery)) { + return "hass:battery-unknown"; + } + + var icon = "hass:battery"; + const batteryRound = Math.round(battery / 10) * 10; + if (battery_charging && battery > 10) { + icon += `-charging-${batteryRound}`; + } else if (battery_charging) { + icon += "-outline"; + } else if (battery <= 5) { + icon += "-alert"; + } else if (battery > 5 && battery < 95) { + icon += `-${batteryRound}`; + } + return icon; +}; diff --git a/src/common/entity/sensor_icon.ts b/src/common/entity/sensor_icon.ts index 32d7436d3b..1ec97ff5d9 100644 --- a/src/common/entity/sensor_icon.ts +++ b/src/common/entity/sensor_icon.ts @@ -2,6 +2,7 @@ import { HassEntity } from "home-assistant-js-websocket"; import { UNIT_C, UNIT_F } from "../const"; import { domainIcon } from "./domain_icon"; +import { batteryIcon } from "./battery_icon"; const fixedDeviceClassIcons = { humidity: "hass:water-percent", @@ -19,29 +20,7 @@ export const sensorIcon = (state: HassEntity) => { return fixedDeviceClassIcons[dclass]; } if (dclass === "battery") { - const battery = Number(state.state); - if (isNaN(battery)) { - return "hass:battery-unknown"; - } - const batteryRound = Math.round(battery / 10) * 10; - if (batteryRound >= 100) { - return "hass:battery"; - } - if (batteryRound <= 0) { - return "hass:battery-alert"; - } - // Will return one of the following icons: (listed so extractor picks up) - // hass:battery-10 - // hass:battery-20 - // hass:battery-30 - // hass:battery-40 - // hass:battery-50 - // hass:battery-60 - // hass:battery-70 - // hass:battery-80 - // hass:battery-90 - // We obscure 'hass' in iconname so this name does not get picked up - return `${"hass"}:battery-${batteryRound}`; + return batteryIcon(state); } const unit = state.attributes.unit_of_measurement; diff --git a/src/components/entity/ha-battery-icon.ts b/src/components/entity/ha-battery-icon.ts new file mode 100644 index 0000000000..19429bd20c --- /dev/null +++ b/src/components/entity/ha-battery-icon.ts @@ -0,0 +1,20 @@ +import { batteryIcon } from "../../common/entity/battery_icon"; +import "../ha-icon"; +import { customElement, html, property, LitElement } from "lit-element"; + +@customElement("ha-battery-icon") +class HaBatteryIcon extends LitElement { + @property() public batteryStateObj; + + @property() public batteryChargingStateObj; + + protected render() { + return html` + + `; + } +} + +customElements.define("ha-battery-icon", HaBatteryIcon); diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 5abaa9084b..a5d897ca8b 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -37,6 +37,17 @@ export const findBatteryEntity = ( hass.states[entity.entity_id].attributes.device_class === "battery" ); +export const findBatteryChargingEntity = ( + hass: HomeAssistant, + entities: EntityRegistryEntry[] +): EntityRegistryEntry | undefined => + entities.find( + (entity) => + hass.states[entity.entity_id] && + hass.states[entity.entity_id].attributes.device_class === + "battery_charging" + ); + export const computeEntityRegistryName = ( hass: HomeAssistant, entry: EntityRegistryEntry diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index fd10d1d175..9987b894cc 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -14,7 +14,7 @@ import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { createValidEntityId } from "../../../common/entity/valid_entity_id"; import { compare } from "../../../common/string/compare"; -import "../../../components/entity/ha-state-icon"; +import "../../../components/entity/ha-battery-icon"; import "../../../components/ha-icon-next"; import { AreaRegistryEntry } from "../../../data/area_registry"; import { ConfigEntry } from "../../../data/config_entries"; @@ -26,6 +26,7 @@ import { import { EntityRegistryEntry, findBatteryEntity, + findBatteryChargingEntity, updateEntityRegistryEntry, } from "../../../data/entity_registry"; import { SceneEntities, showSceneEditor } from "../../../data/scene"; @@ -117,6 +118,11 @@ export class HaConfigDevicePage extends LitElement { | EntityRegistryEntry | undefined => findBatteryEntity(this.hass, entities)); + private _batteryChargingEntity = memoizeOne( + (entities: EntityRegistryEntry[]): EntityRegistryEntry | undefined => + findBatteryChargingEntity(this.hass, entities) + ); + protected firstUpdated(changedProps) { super.firstUpdated(changedProps); loadDeviceRegistryDetailDialog(); @@ -145,9 +151,13 @@ export class HaConfigDevicePage extends LitElement { const integrations = this._integrations(device, this.entries); const entities = this._entities(this.deviceId, this.entities); const batteryEntity = this._batteryEntity(entities); + const batteryChargingEntity = this._batteryChargingEntity(entities); const batteryState = batteryEntity ? this.hass.states[batteryEntity.entity_id] : undefined; + const batteryChargingState = batteryChargingEntity + ? this.hass.states[batteryChargingEntity.entity_id] + : undefined; const area = this._computeArea(this.areas, device); return html` @@ -201,10 +211,11 @@ export class HaConfigDevicePage extends LitElement { ? html`
${batteryState.state}% - + .batteryStateObj=${batteryState} + .batteryChargingStateObj=${batteryChargingState} + >
` : "" diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index 907756ad5f..673d0ff7f3 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -14,7 +14,7 @@ import { DataTableRowData, RowClickedEvent, } from "../../../components/data-table/ha-data-table"; -import "../../../components/entity/ha-state-icon"; +import "../../../components/entity/ha-battery-icon"; import { AreaRegistryEntry } from "../../../data/area_registry"; import { ConfigEntry } from "../../../data/config_entries"; import { @@ -25,6 +25,7 @@ import { import { EntityRegistryEntry, findBatteryEntity, + findBatteryChargingEntity, } from "../../../data/entity_registry"; import { domainToName } from "../../../data/integration"; import "../../../layouts/hass-tabs-subpage-data-table"; @@ -35,7 +36,7 @@ interface DeviceRowData extends DeviceRegistryEntry { device?: DeviceRowData; area?: string; integration?: string; - battery_entity?: string; + battery_entity?: [string | undefined, string | undefined]; } @customElement("ha-config-devices-dashboard") @@ -167,7 +168,10 @@ export class HaConfigDeviceDashboard extends LitElement { ) .join(", ") : "No integration", - battery_entity: this._batteryEntity(device.id, deviceEntityLookup), + battery_entity: [ + this._batteryEntity(device.id, deviceEntityLookup), + this._batteryChargingEntity(device.id, deviceEntityLookup), + ], }; }); @@ -201,17 +205,25 @@ export class HaConfigDeviceDashboard extends LitElement { sortable: true, type: "numeric", width: "90px", - template: (batteryEntity: string) => { - const battery = batteryEntity - ? this.hass.states[batteryEntity] - : undefined; + template: ( + batteryEntityPair: DeviceRowData["battery_entity"] + ) => { + const battery = + batteryEntityPair && batteryEntityPair[0] + ? this.hass.states[batteryEntityPair[0]] + : undefined; + const batteryCharging = + batteryEntityPair && batteryEntityPair[1] + ? this.hass.states[batteryEntityPair[1]] + : undefined; return battery ? html` ${isNaN(battery.state as any) ? "-" : battery.state}% - + .batteryStateObj=${battery} + .batteryChargingStateObj=${batteryCharging} + > ` : html` - `; }, @@ -267,17 +279,25 @@ export class HaConfigDeviceDashboard extends LitElement { type: "numeric", width: "15%", maxWidth: "90px", - template: (batteryEntity: string) => { - const battery = batteryEntity - ? this.hass.states[batteryEntity] - : undefined; + template: ( + batteryEntityPair: DeviceRowData["battery_entity"] + ) => { + const battery = + batteryEntityPair && batteryEntityPair[0] + ? this.hass.states[batteryEntityPair[0]] + : undefined; + const batteryCharging = + batteryEntityPair && batteryEntityPair[1] + ? this.hass.states[batteryEntityPair[1]] + : undefined; return battery && !isNaN(battery.state as any) ? html` ${battery.state}% - + .batteryStateObj=${battery} + .batteryChargingStateObj=${batteryCharging} + > ` : html` - `; }, @@ -336,6 +356,17 @@ export class HaConfigDeviceDashboard extends LitElement { return batteryEntity ? batteryEntity.entity_id : undefined; } + private _batteryChargingEntity( + deviceId: string, + deviceEntityLookup: DeviceEntityLookup + ): string | undefined { + const batteryChargingEntity = findBatteryChargingEntity( + this.hass, + deviceEntityLookup[deviceId] || [] + ); + return batteryChargingEntity ? batteryChargingEntity.entity_id : undefined; + } + private _handleRowClicked(ev: HASSDomEvent) { const deviceId = ev.detail.id; navigate(this, `/config/devices/device/${deviceId}`); From 3d32e6310d0fe5386b4e5a884069d86490ee6614 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sun, 12 Jul 2020 22:19:26 +0200 Subject: [PATCH 40/58] Close dialogs on history back (#6354) --- .../config-flow/dialog-data-entry-flow.ts | 24 ++-- src/dialogs/generic/dialog-box.ts | 21 +++- src/dialogs/make-dialog-manager.ts | 61 ++++++++- src/dialogs/more-info/ha-more-info-dialog.ts | 78 ++++++------ .../config/entities/dialog-entity-editor.ts | 3 +- .../config/logs/dialog-system-log-detail.ts | 8 +- src/panels/config/zone/dialog-zone-detail.ts | 15 +-- src/state/dialog-manager-mixin.ts | 7 +- src/state/more-info-mixin.ts | 49 +++++--- src/state/url-sync-mixin.ts | 116 +++++++++--------- 10 files changed, 236 insertions(+), 146 deletions(-) diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 5cb369c0f0..9ad6c60a4b 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -35,6 +35,7 @@ import "./step-flow-external"; import "./step-flow-form"; import "./step-flow-loading"; import "./step-flow-pick-handler"; +import { fireEvent } from "../../common/dom/fire_event"; import { computeRTL } from "../../common/util/compute_rtl"; let instance = 0; @@ -114,6 +115,17 @@ class DataEntryFlowDialog extends LitElement { this._loading = false; } + public closeDialog() { + if (this._step) { + this._flowDone(); + } else if (this._step === null) { + // Flow aborted during picking flow + this._step = undefined; + this._params = undefined; + } + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + protected render(): TemplateResult { if (!this._params) { return html``; @@ -122,7 +134,7 @@ class DataEntryFlowDialog extends LitElement { return html` { + private _dismiss(): void { if (this._params!.cancel) { this._params!.cancel(); } - this._params = undefined; + this._close(); } private _handleKeyUp(ev: KeyboardEvent) { @@ -113,15 +125,16 @@ class DialogBox extends LitElement { } } - private async _confirm(): Promise { + private _confirm(): void { if (this._params!.confirm) { this._params!.confirm(this._value); } - this._dismiss(); + this._close(); } private _close(): void { this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); } static get styles(): CSSResult[] { diff --git a/src/dialogs/make-dialog-manager.ts b/src/dialogs/make-dialog-manager.ts index 02af7d4e96..5baf4d3e65 100644 --- a/src/dialogs/make-dialog-manager.ts +++ b/src/dialogs/make-dialog-manager.ts @@ -6,15 +6,18 @@ declare global { interface HASSDomEvents { "show-dialog": ShowDialogParams; "close-dialog": undefined; + "dialog-closed": DialogClosedParams; } // for add event listener interface HTMLElementEventMap { "show-dialog": HASSDomEvent>; + "dialog-closed": HASSDomEvent; } } interface HassDialog extends HTMLElement { showDialog(params: T); + closeDialog?: () => boolean | void; } interface ShowDialogParams { @@ -23,16 +26,30 @@ interface ShowDialogParams { dialogParams: T; } +export interface DialogClosedParams { + dialog: string; +} + +export interface DialogState { + dialog: string; + open: boolean; + oldState: null | DialogState; + dialogParams?: unknown; +} + const LOADED = {}; export const showDialog = async ( element: HTMLElement & ProvideHassElement, root: ShadowRoot | HTMLElement, - dialogImport: () => Promise, dialogTag: string, - dialogParams: unknown + dialogParams: unknown, + dialogImport?: () => Promise ) => { if (!(dialogTag in LOADED)) { + if (!dialogImport) { + return; + } LOADED[dialogTag] = dialogImport().then(() => { const dialogEl = document.createElement(dialogTag) as HassDialog; element.provideHass(dialogEl); @@ -40,19 +57,55 @@ export const showDialog = async ( return dialogEl; }); } + + history.replaceState( + { + dialog: dialogTag, + open: false, + oldState: + history.state?.open && history.state?.dialog !== dialogTag + ? history.state + : null, + }, + "" + ); + try { + history.pushState( + { dialog: dialogTag, dialogParams: dialogParams, open: true }, + "" + ); + } catch (err) { + // dialogParams could not be cloned, probably contains callback + history.pushState( + { dialog: dialogTag, dialogParams: null, open: true }, + "" + ); + } + const dialogElement = await LOADED[dialogTag]; dialogElement.showDialog(dialogParams); }; +export const closeDialog = async (dialogTag: string): Promise => { + if (!(dialogTag in LOADED)) { + return true; + } + const dialogElement = await LOADED[dialogTag]; + if (dialogElement.closeDialog) { + return dialogElement.closeDialog() !== false; + } + return true; +}; + export const makeDialogManager = ( element: HTMLElement & ProvideHassElement, root: ShadowRoot | HTMLElement ) => { element.addEventListener( "show-dialog", - async (e: HASSDomEvent>) => { + (e: HASSDomEvent>) => { const { dialogTag, dialogImport, dialogParams } = e.detail; - showDialog(element, root, dialogImport, dialogTag, dialogParams); + showDialog(element, root, dialogTag, dialogParams, dialogImport); } ); }; diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index ef0a1fc9f7..2375bcbb10 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -8,6 +8,7 @@ import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { DOMAINS_MORE_INFO_NO_HISTORY } from "../../common/const"; import { computeStateName } from "../../common/entity/compute_state_name"; import { navigate } from "../../common/navigate"; +import { fireEvent } from "../../common/dom/fire_event"; import "../../components/state-history-charts"; import { removeEntityRegistryEntry } from "../../data/entity_registry"; import { showEntityEditorDialog } from "../../panels/config/entities/show-dialog-entity-editor"; @@ -24,7 +25,6 @@ import { } from "lit-element"; import { haStyleDialog } from "../../resources/styles"; import { HomeAssistant } from "../../types"; -import { fireEvent } from "../../common/dom/fire_event"; import { getRecentWithCache } from "../../data/cached-history"; import { computeDomain } from "../../common/entity/compute_domain"; import { mdiClose, mdiCog, mdiPencil } from "@mdi/js"; @@ -34,6 +34,10 @@ const DOMAINS_NO_INFO = ["camera", "configurator", "history_graph"]; const EDITABLE_DOMAINS_WITH_ID = ["scene", "automation"]; const EDITABLE_DOMAINS = ["script"]; +export interface MoreInfoDialogParams { + entityId: string | null; +} + @customElement("ha-more-info-dialog") export class MoreInfoDialog extends LitElement { @property() public hass!: HomeAssistant; @@ -42,39 +46,39 @@ export class MoreInfoDialog extends LitElement { @internalProperty() private _stateHistory?: HistoryResult; + @internalProperty() private _entityId?: string | null; + private _historyRefreshInterval?: number; - protected updated(changedProperties) { - super.updated(changedProperties); - if (!changedProperties.has("hass")) { - return; + public showDialog(params: MoreInfoDialogParams) { + this._entityId = params.entityId; + if (!this._entityId) { + this.closeDialog(); } - const oldHass = changedProperties.get("hass"); - if (oldHass && oldHass.moreInfoEntityId === this.hass.moreInfoEntityId) { - return; - } - if (this.hass.moreInfoEntityId) { - this.large = false; - this._stateHistory = undefined; - if (this._computeShowHistoryComponent(this.hass.moreInfoEntityId)) { - this._getStateHistory(); - clearInterval(this._historyRefreshInterval); - this._historyRefreshInterval = window.setInterval(() => { - this._getStateHistory(); - }, 60 * 1000); - } - } else { - this._stateHistory = undefined; + this.large = false; + this._stateHistory = undefined; + if (this._computeShowHistoryComponent(this._entityId)) { + this._getStateHistory(); clearInterval(this._historyRefreshInterval); - this._historyRefreshInterval = undefined; + this._historyRefreshInterval = window.setInterval(() => { + this._getStateHistory(); + }, 60 * 1000); } } + public closeDialog() { + this._entityId = undefined; + this._stateHistory = undefined; + clearInterval(this._historyRefreshInterval); + this._historyRefreshInterval = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + protected render() { - if (!this.hass.moreInfoEntityId) { + if (!this._entityId) { return html``; } - const entityId = this.hass.moreInfoEntityId; + const entityId = this._entityId; const stateObj = this.hass.states[entityId]; const domain = computeDomain(entityId); @@ -85,7 +89,7 @@ export class MoreInfoDialog extends LitElement { return html` { - if (!this.hass.moreInfoEntityId) { + if (!this._entityId) { return; } this._stateHistory = await getRecentWithCache( this.hass!, - this.hass.moreInfoEntityId, + this._entityId, { refresh: 60, - cacheKey: `more_info.${this.hass.moreInfoEntityId}`, + cacheKey: `more_info.${this._entityId}`, hoursToShow: 24, }, this.hass!.localize, @@ -198,7 +202,7 @@ export class MoreInfoDialog extends LitElement { } private _removeEntity() { - const entityId = this.hass.moreInfoEntityId!; + const entityId = this._entityId!; showConfirmationDialog(this, { title: this.hass.localize( "ui.dialogs.more_info_control.restored.confirm_remove_title" @@ -216,14 +220,14 @@ export class MoreInfoDialog extends LitElement { private _gotoSettings() { showEntityEditorDialog(this, { - entity_id: this.hass.moreInfoEntityId!, + entity_id: this._entityId!, }); - fireEvent(this, "hass-more-info", { entityId: null }); + this.closeDialog(); } private _gotoEdit() { - const stateObj = this.hass.states[this.hass.moreInfoEntityId!]; - const domain = computeDomain(this.hass.moreInfoEntityId!); + const stateObj = this.hass.states[this._entityId!]; + const domain = computeDomain(this._entityId!); navigate( this, `/config/${domain}/edit/${ @@ -232,11 +236,7 @@ export class MoreInfoDialog extends LitElement { : stateObj.entity_id }` ); - this._close(); - } - - private _close() { - fireEvent(this, "hass-more-info", { entityId: null }); + this.closeDialog(); } static get styles() { @@ -274,7 +274,7 @@ export class MoreInfoDialog extends LitElement { --mdc-dialog-max-width: 90vw; } - app-toolbar { + ha-dialog:not([data-domain="camera"]) app-toolbar { max-width: 368px; } diff --git a/src/panels/config/entities/dialog-entity-editor.ts b/src/panels/config/entities/dialog-entity-editor.ts index e765ddffb8..41fdcc279d 100644 --- a/src/panels/config/entities/dialog-entity-editor.ts +++ b/src/panels/config/entities/dialog-entity-editor.ts @@ -13,8 +13,8 @@ import { TemplateResult, } from "lit-element"; import { cache } from "lit-html/directives/cache"; -import { dynamicElement } from "../../../common/dom/dynamic-element-directive"; import { fireEvent } from "../../../common/dom/fire_event"; +import { dynamicElement } from "../../../common/dom/dynamic-element-directive"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/ha-dialog"; import "../../../components/ha-svg-icon"; @@ -72,6 +72,7 @@ export class DialogEntityEditor extends LitElement { public closeDialog(): void { this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); } protected render(): TemplateResult { diff --git a/src/panels/config/logs/dialog-system-log-detail.ts b/src/panels/config/logs/dialog-system-log-detail.ts index 237a42e90e..01c6ee0355 100644 --- a/src/panels/config/logs/dialog-system-log-detail.ts +++ b/src/panels/config/logs/dialog-system-log-detail.ts @@ -20,6 +20,7 @@ import { haStyleDialog } from "../../../resources/styles"; import { HomeAssistant } from "../../../types"; import { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail"; import { formatSystemLogTime } from "./util"; +import { fireEvent } from "../../../common/dom/fire_event"; class DialogSystemLogDetail extends LitElement { @property() public hass!: HomeAssistant; @@ -34,6 +35,11 @@ class DialogSystemLogDetail extends LitElement { await this.updateComplete; } + public closeDialog() { + this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + protected updated(changedProps) { super.updated(changedProps); if (!changedProps.has("_params") || !this._params) { @@ -137,7 +143,7 @@ class DialogSystemLogDetail extends LitElement { private _openedChanged(ev: PolymerChangedEvent): void { if (!(ev.detail as any).value) { - this._params = undefined; + this.closeDialog(); } } diff --git a/src/panels/config/zone/dialog-zone-detail.ts b/src/panels/config/zone/dialog-zone-detail.ts index 6899d1ed29..8de08f7218 100644 --- a/src/panels/config/zone/dialog-zone-detail.ts +++ b/src/panels/config/zone/dialog-zone-detail.ts @@ -8,6 +8,7 @@ import { property, TemplateResult, } from "lit-element"; +import { fireEvent } from "../../../common/dom/fire_event"; import { addDistanceToCoord } from "../../../common/location/add_distance_to_coord"; import { createCloseHeading } from "../../../components/ha-dialog"; import "../../../components/ha-switch"; @@ -45,7 +46,7 @@ class DialogZoneDetail extends LitElement { @property() private _submitting = false; - public async showDialog(params: ZoneDetailDialogParams): Promise { + public showDialog(params: ZoneDetailDialogParams): void { this._params = params; this._error = undefined; if (this._params.entry) { @@ -74,7 +75,11 @@ class DialogZoneDetail extends LitElement { this._passive = false; this._radius = 100; } - await this.updateComplete; + } + + public closeDialog(): void { + this._params = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); } protected render(): TemplateResult { @@ -93,7 +98,7 @@ class DialogZoneDetail extends LitElement { return html` >( superClass: T ) => class extends superClass { - protected firstUpdated(changedProps) { + protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); // deprecated this.addEventListener("register-dialog", (e) => @@ -42,9 +43,9 @@ export const dialogManagerMixin = >( showDialog( this, this.shadowRoot!, - dialogImport, dialogTag, - (showEv as HASSDomEvent).detail + (showEv as HASSDomEvent).detail, + dialogImport ); }); } diff --git a/src/state/more-info-mixin.ts b/src/state/more-info-mixin.ts index 3dd6b3ed02..2fc9088eb1 100644 --- a/src/state/more-info-mixin.ts +++ b/src/state/more-info-mixin.ts @@ -1,35 +1,46 @@ -import { Constructor } from "../types"; -import { HassBaseEl } from "./hass-base-mixin"; +import { showDialog } from "../dialogs/make-dialog-manager"; +import type { Constructor } from "../types"; +import type { HassBaseEl } from "./hass-base-mixin"; +import type { MoreInfoDialogParams } from "../dialogs/more-info/ha-more-info-dialog"; +import type { PropertyValues } from "lit-element"; +import type { HASSDomEvent } from "../common/dom/fire_event"; declare global { // for fire event interface HASSDomEvents { - "hass-more-info": { - entityId: string | null; - }; + "hass-more-info": MoreInfoDialogParams; } } +let moreInfoImportPromise; +const importMoreInfo = () => { + if (!moreInfoImportPromise) { + moreInfoImportPromise = import( + /* webpackChunkName: "more-info-dialog" */ "../dialogs/more-info/ha-more-info-dialog" + ); + } + return moreInfoImportPromise; +}; + export default >(superClass: T) => class extends superClass { - private _moreInfoEl?: any; - - protected firstUpdated(changedProps) { + protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); - this.addEventListener("hass-more-info", (e) => this._handleMoreInfo(e)); + this.addEventListener("hass-more-info", (ev) => this._handleMoreInfo(ev)); // Load it once we are having the initial rendering done. - import( - /* webpackChunkName: "more-info-dialog" */ "../dialogs/more-info/ha-more-info-dialog" - ); + importMoreInfo(); } - private async _handleMoreInfo(ev) { - if (!this._moreInfoEl) { - this._moreInfoEl = document.createElement("ha-more-info-dialog"); - this.shadowRoot!.appendChild(this._moreInfoEl); - this.provideHass(this._moreInfoEl); - } - this._updateHass({ moreInfoEntityId: ev.detail.entityId }); + private async _handleMoreInfo(ev: HASSDomEvent) { + showDialog( + this, + this.shadowRoot!, + "ha-more-info-dialog", + { + entityId: ev.detail.entityId, + }, + importMoreInfo + ); } }; diff --git a/src/state/url-sync-mixin.ts b/src/state/url-sync-mixin.ts index d7178b3fe0..ae5078e5d0 100644 --- a/src/state/url-sync-mixin.ts +++ b/src/state/url-sync-mixin.ts @@ -1,9 +1,15 @@ /* eslint-disable no-console */ -import { fireEvent } from "../common/dom/fire_event"; +import { + closeDialog, + showDialog, + DialogState, + DialogClosedParams, +} from "../dialogs/make-dialog-manager"; import { Constructor } from "../types"; import { HassBaseEl } from "./hass-base-mixin"; +import { HASSDomEvent } from "../common/dom/fire_event"; -const DEBUG = false; +const DEBUG = true; export const urlSyncMixin = >( superClass: T @@ -12,81 +18,77 @@ export const urlSyncMixin = >( __DEMO__ ? superClass : class extends superClass { - private _ignoreNextHassChange = false; - - private _ignoreNextPopstate = false; - - private _moreInfoOpenedFromPath?: string; + private _ignoreNextPopState = false; public connectedCallback(): void { super.connectedCallback(); window.addEventListener("popstate", this._popstateChangeListener); + this.addEventListener("dialog-closed", this._dialogClosedListener); } public disconnectedCallback(): void { super.disconnectedCallback(); window.removeEventListener("popstate", this._popstateChangeListener); + this.removeEventListener("dialog-closed", this._dialogClosedListener); } - protected hassChanged(newHass, oldHass): void { - super.hassChanged(newHass, oldHass); - - if (this._ignoreNextHassChange) { - if (DEBUG) { - console.log("ignore hasschange"); - } - this._ignoreNextHassChange = false; - return; - } + private _dialogClosedListener = ( + ev: HASSDomEvent + ) => { + // If not closed by navigating back, and not a new dialog is open, remove the open state from history if ( - !oldHass || - oldHass.moreInfoEntityId === newHass.moreInfoEntityId + history.state?.open && + history.state?.dialog === ev.detail.dialog ) { - if (DEBUG) { - console.log("ignoring hass change"); - } - return; - } - - if (newHass.moreInfoEntityId) { - if (DEBUG) { - console.log("pushing state"); - } - // We keep track of where we opened moreInfo from so that we don't - // pop the state when we close the modal if the modal has navigated - // us away. - this._moreInfoOpenedFromPath = window.location.pathname; - history.pushState(null, "", window.location.pathname); - } else if ( - window.location.pathname === this._moreInfoOpenedFromPath - ) { - if (DEBUG) { - console.log("history back"); - } - this._ignoreNextPopstate = true; + this._ignoreNextPopState = true; history.back(); } - } + }; - private _popstateChangeListener = (ev) => { - if (this._ignoreNextPopstate) { - if (DEBUG) { - console.log("ignore popstate"); - } - this._ignoreNextPopstate = false; + private _popstateChangeListener = (ev: PopStateEvent) => { + if (this._ignoreNextPopState) { + this._ignoreNextPopState = false; return; } - - if (DEBUG) { - console.log("popstate", ev); - } - - if (this.hass && this.hass.moreInfoEntityId) { + if (ev.state && "dialog" in ev.state) { if (DEBUG) { - console.log("deselect entity"); + console.log("popstate", ev); } - this._ignoreNextHassChange = true; - fireEvent(this, "hass-more-info", { entityId: null }); + this._handleDialogStateChange(ev.state); } }; + + private async _handleDialogStateChange(state: DialogState) { + if (DEBUG) { + console.log("handle state", state); + } + if (!state.open) { + const closed = await closeDialog(state.dialog); + if (!closed) { + // dialog could not be closed, push state again + history.pushState( + { + dialog: state.dialog, + open: true, + dialogParams: null, + oldState: null, + }, + "" + ); + return; + } + if (state.oldState) { + this._handleDialogStateChange(state.oldState); + } + return; + } + if (state.dialogParams !== null) { + showDialog( + this, + this.shadowRoot!, + state.dialog, + state.dialogParams + ); + } + } }; From 50c9a667b328dbfb772f764c3832850abecc57c7 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 13 Jul 2020 01:37:06 +0200 Subject: [PATCH 41/58] Fix graph mouse over in more info dialog (#6365) --- src/components/ha-dialog.ts | 2 ++ src/dialogs/more-info/ha-more-info-dialog.ts | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 8881fd2851..0bbcfd8307 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -47,9 +47,11 @@ export class HaDialog extends MwcDialog { height: 20px; } .mdc-dialog .mdc-dialog__content { + position: var(--dialog-content-position, relative); padding: var(--dialog-content-padding, 20px 24px); } .mdc-dialog .mdc-dialog__surface { + position: var(--dialog-content-position, relative); min-height: var(--mdc-dialog-min-height, auto); } .header_button { diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 2375bcbb10..9c4370397b 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -243,6 +243,10 @@ export class MoreInfoDialog extends LitElement { return [ haStyleDialog, css` + ha-dialog { + --dialog-content-position: static; + } + app-toolbar { flex-shrink: 0; color: var(--primary-text-color); From bd9b72fb2297af77e9319790d653cf49c4abc5f6 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 13 Jul 2020 00:32:42 +0000 Subject: [PATCH 42/58] [ci skip] Translation update --- translations/frontend/ca.json | 14 +++++++++++--- translations/frontend/fr.json | 14 +++++++++++--- translations/frontend/he.json | 16 ++++++++++++---- translations/frontend/ko.json | 14 +++++++++++--- translations/frontend/ru.json | 14 +++++++++++--- translations/frontend/zh-Hans.json | 14 +++++++++++--- 6 files changed, 67 insertions(+), 19 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 0b9246869e..232718650c 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -525,6 +525,9 @@ "clear": "Esborra", "show_areas": "Mostra àrees" }, + "data-table": { + "search": "Cerca" + }, "date-range-picker": { "end_date": "Data final", "select": "Selecciona", @@ -1356,6 +1359,7 @@ "confirm_text": "Les hauries d'eliminar de la configuració Lovelace i de les automatitzacions si contenen aquestes entitats.", "confirm_title": "Vols eliminar {number} entitat/s?" }, + "search": "Cerca entitats", "selected": "{number} seleccionada/es", "status": { "disabled": "Desactivada/es", @@ -1386,7 +1390,8 @@ "entity_id": "ID de l'entitat", "name": "Nom", "type": "Tipus" - } + }, + "no_helpers": "Sembla que encara no tens ajudants." }, "types": { "input_boolean": "Interruptor", @@ -1490,7 +1495,8 @@ "note_about_integrations": "Encara no es poden configurar totes les integracions a través de la UI.", "note_about_website_reference": "N'hi ha més disponibles al ", "rename_dialog": "Edita el nom de l'entrada de configuració", - "rename_input_label": "Nom de l'entrada" + "rename_input_label": "Nom de l'entrada", + "search": "Cerca integracions" }, "introduction": "Aquí pots configurar Home Assistant i els seus components. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.", "logs": { @@ -2194,6 +2200,7 @@ "name": "Nom", "no_theme": "Sense tema", "refresh_interval": "Interval d'actualització", + "search": "Cerca", "secondary_info_attribute": "Atribut d’informació secundària", "show_icon": "Mostra icona?", "show_name": "Mostra nom?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "Edita el títol", "explanation": "Aquest títol es mostra a sobre de cada panell Lovelace.", - "header": "Títol de la interfície d'usuari Lovelace" + "header": "Títol de la interfície d'usuari Lovelace", + "title": "Títol" }, "edit_view": { "add": "Afegeix visualització", diff --git a/translations/frontend/fr.json b/translations/frontend/fr.json index 8301ec927c..4da2ae549d 100644 --- a/translations/frontend/fr.json +++ b/translations/frontend/fr.json @@ -525,6 +525,9 @@ "clear": "Effacer", "show_areas": "Afficher les pièces" }, + "data-table": { + "search": "Chercher" + }, "date-range-picker": { "end_date": "Date de fin", "select": "Sélectionner", @@ -1356,6 +1359,7 @@ "confirm_text": "Les entités ne peuvent être supprimées que lorsque l'intégration ne fournit plus les entités.", "confirm_title": "Voulez-vous supprimer {number} entités ?" }, + "search": "Chercher les entités", "selected": "{number} sélectionné", "status": { "disabled": "Désactivé", @@ -1386,7 +1390,8 @@ "entity_id": "ID de l'entité", "name": "Nom", "type": "Type" - } + }, + "no_helpers": "On dirait que vous n'avez pas encore d'aide!" }, "types": { "input_boolean": "Interrupteur", @@ -1490,7 +1495,8 @@ "note_about_integrations": "Toutes les intégrations ne peuvent pas encore être configurées via l'interface utilisateur.", "note_about_website_reference": "D'autres sont disponibles sur le ", "rename_dialog": "Modifier le nom de cette entrée de configuration", - "rename_input_label": "Nom de l'entrée" + "rename_input_label": "Nom de l'entrée", + "search": "Chercher les intégrations" }, "introduction": "Ici, il est possible de configurer vos composants et Home Assistant. Tout n'est pas encore possible de configurer à partir de l'interface utilisateur, mais nous y travaillons.", "logs": { @@ -2194,6 +2200,7 @@ "name": "Nom", "no_theme": "Pas de thème", "refresh_interval": "Intervalle de rafraîchissement", + "search": "Chercher", "secondary_info_attribute": "Attribut d'informations secondaires", "show_icon": "Afficher l'icône ?", "show_name": "Afficher le nom ?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "Éditer le titre", "explanation": "Ce titre est affiché au-dessus de toutes vos vues dans Lovelace UI.", - "header": "Titre de votre UI Lovelace" + "header": "Titre de votre UI Lovelace", + "title": "Titre" }, "edit_view": { "add": "Ajouter la vue", diff --git a/translations/frontend/he.json b/translations/frontend/he.json index 66e04373fd..f758bc2eda 100644 --- a/translations/frontend/he.json +++ b/translations/frontend/he.json @@ -525,6 +525,9 @@ "clear": "נקה", "show_areas": "הצג אזורים" }, + "data-table": { + "search": "חיפוש" + }, "date-range-picker": { "end_date": "תאריך סיום", "select": "בחר", @@ -1356,6 +1359,7 @@ "confirm_text": "עליך להסיר אותם מתצורת ה- Lovelace ומהאוטומציות שלך אם הם מכילים ישויות אלה.", "confirm_title": "האם ברצונך להסיר {מספר} ישויות?" }, + "search": "חיפוש ישויות", "selected": "{number} נבחרו", "status": { "disabled": "מושבת", @@ -1386,7 +1390,8 @@ "entity_id": "מזהה ישות", "name": "שם", "type": "סוג" - } + }, + "no_helpers": "נראה שאין לך עדיין עזרים!" }, "types": { "input_boolean": "החלף מצב", @@ -1490,7 +1495,8 @@ "note_about_integrations": "קיימות אינטגרציות שלא ניתן עדיין להגדירן ע\"י ממשק המשתמש.", "note_about_website_reference": "מידע נוסף זמין ב:", "rename_dialog": "ערוך את שם ישות התצורה הזו", - "rename_input_label": "שם ישות" + "rename_input_label": "שם ישות", + "search": "חיפוש אינטגרציות" }, "introduction": "כאן ניתן להגדיר את הרכיבים ואת ה Home Assistant. לא הכל ניתן להגדיר את ממשק המשתמש עדיין, אבל אנחנו עובדים על זה.", "logs": { @@ -2194,6 +2200,7 @@ "name": "שם", "no_theme": "אין ערכת נושא", "refresh_interval": "מרווח זמן לרענון", + "search": "חיפוש", "secondary_info_attribute": "שדה מידע משני", "show_icon": "הצג סמל?", "show_name": "להציג שם?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "ערוך כותרת", "explanation": "כותרת זו מוצגת מעל לכל התצוגות שלך ב- Lovelace.", - "header": "כותרת ממשק ה- Lovelace שלך" + "header": "כותרת ממשק ה- Lovelace שלך", + "title": "כותרת" }, "edit_view": { "add": "הוסף תצוגה", @@ -2639,7 +2647,7 @@ "delete_failed": "מחיקת אסימון הגישה נכשלה.", "description": "צור אסימוני גישה ארוכי טווח כדי לאפשר לסקריפטים שלך לקיים אינטראקציה עם Home Assistant.\nאסימונים אלו פועלים כיום:", "empty_state": "אין לך עדיין אסימוני גישה ארוכים.", - "header": "אסימוני גישה ארוכים חיים", + "header": "אסימוני גישה ארוכי חיים", "last_used": "נעשה שימוש לאחרונה {date} מ{location}", "learn_auth_requests": "למד כיצד לבצע בקשות מאומתות.", "not_used": "לא היה בשימוש", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index 935beee48c..4c9d3da4b4 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -525,6 +525,9 @@ "clear": "지우기", "show_areas": "영역 표시" }, + "data-table": { + "search": "검색" + }, "date-range-picker": { "end_date": "종료 날짜", "select": "선택", @@ -1356,6 +1359,7 @@ "confirm_text": "이러한 구성요소가 포함된 경우 Lovelace 구성 및 자동화에서 제거해야 합니다.", "confirm_title": "{number} 개의 구성요소를 제거하시겠습니까?" }, + "search": "구성요소 검색", "selected": "{number} 개 선택됨", "status": { "disabled": "비활성화", @@ -1386,7 +1390,8 @@ "entity_id": "구성요소 ID", "name": "이름", "type": "유형" - } + }, + "no_helpers": "아직 설정한 도우미가 없는 것 같습니다." }, "types": { "input_boolean": "토글", @@ -1490,7 +1495,8 @@ "note_about_integrations": "아직 UI 에서 모든 통합 구성요소를 구성할 수 있는 것은 아닙니다.", "note_about_website_reference": "더 많은 구성요소는 다음에서 살펴 봐주세요. ", "rename_dialog": "이 구성 항목의 이름을 편집하기", - "rename_input_label": "구성 항목의 이름" + "rename_input_label": "구성 항목의 이름", + "search": "통합 구성요소 검색" }, "introduction": "여기에서 구성요소와 Home Assistant 를 설정할 수 있습니다. 아직 여기서 모두 설정할 수는 없지만, 모든 내용을 설정할 수 있도록 작업 중입니다.", "logs": { @@ -2194,6 +2200,7 @@ "name": "이름", "no_theme": "테마 없음", "refresh_interval": "새로 고침 간격", + "search": "검색", "secondary_info_attribute": "보조 정보 속성", "show_icon": "아이콘 표시", "show_name": "이름 표시", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "제목 편집", "explanation": "이 제목은 Lovelace UI 모든 뷰의 상단에 표시됩니다.", - "header": "Lovelace UI 의 제목" + "header": "Lovelace UI 의 제목", + "title": "제목" }, "edit_view": { "add": "뷰 추가", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 7472441028..e62fccb3d5 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -525,6 +525,9 @@ "clear": "Очистить", "show_areas": "Показать помещения" }, + "data-table": { + "search": "Поиск" + }, "date-range-picker": { "end_date": "До даты", "select": "Выбрать", @@ -1356,6 +1359,7 @@ "confirm_text": "Вы должны удалить эти объекты из конфигурации Lovelace и из правил автоматизации.", "confirm_title": "Вы уверены, что хотите удалить выбранные объекты? ({number})" }, + "search": "Поиск объектов", "selected": "Выбрано: {number}", "status": { "disabled": "Скрыто", @@ -1386,7 +1390,8 @@ "entity_id": "ID объекта", "name": "Название", "type": "Тип" - } + }, + "no_helpers": "У Вас еще нет вспомогательных элементов." }, "types": { "input_boolean": "Переключатель", @@ -1490,7 +1495,8 @@ "note_about_integrations": "Пока что не все интеграции могут быть настроены через пользовательский интерфейс.", "note_about_website_reference": "Все доступные интеграции Вы можете найти на ", "rename_dialog": "Изменение названия интеграции", - "rename_input_label": "Название" + "rename_input_label": "Название", + "search": "Поиск интеграций" }, "introduction": "Здесь можно настроить Home Assistant. Пока что не все настройки доступны из интерфейса, но мы работаем над этим.", "logs": { @@ -2194,6 +2200,7 @@ "name": "Название", "no_theme": "Нет темы", "refresh_interval": "Интервал обновления", + "search": "Поиск", "secondary_info_attribute": "Дополнительная информация", "show_icon": "Значок", "show_name": "Название", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "Изменить заголовок", "explanation": "Этот заголовок будет показан над всеми Вашими карточками и вкладками.", - "header": "Заголовок для Lovelace" + "header": "Заголовок для Lovelace", + "title": "Заголовок" }, "edit_view": { "add": "Добавить вкладку", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 5bfaece08d..04beaf70ed 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -525,6 +525,9 @@ "clear": "清除", "show_areas": "显示区域" }, + "data-table": { + "search": "搜索" + }, "date-range-picker": { "end_date": "结束日期", "select": "选定", @@ -1356,6 +1359,7 @@ "confirm_text": "如果它们包含这些实体,则应将它们从 Lovelace 配置和自动化中删除。", "confirm_title": "您要删除这 {number} 个实体吗?" }, + "search": "搜索实体", "selected": "选择了 {number} 项", "status": { "disabled": "已禁用", @@ -1386,7 +1390,8 @@ "entity_id": "实体 ID", "name": "名称", "type": "类型" - } + }, + "no_helpers": "您还没有辅助元素。" }, "types": { "input_boolean": "开关", @@ -1490,7 +1495,8 @@ "note_about_integrations": "并非所有集成都可以通过 UI 进行配置。", "note_about_website_reference": "更多可用信息,尽在 ", "rename_dialog": "编辑此配置项的名称", - "rename_input_label": "条目名称" + "rename_input_label": "条目名称", + "search": "搜索集成" }, "introduction": "您可以在此配置 Home Assistant 及组件。目前并非所有配置都能通过前端 UI 完成,但是我们在努力实现中。", "logs": { @@ -2194,6 +2200,7 @@ "name": "名称", "no_theme": "没有主题", "refresh_interval": "刷新间隔", + "search": "搜索", "secondary_info_attribute": "次要信息属性", "show_icon": "显示图标?", "show_name": "显示名称?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "编辑标题", "explanation": "此标题将显示在 Lovelace 的所有视图之上。", - "header": "Lovelace UI 标题" + "header": "Lovelace UI 标题", + "title": "标题" }, "edit_view": { "add": "添加视图", From 352214ba0ad857a75d41cf6d2580a62dd5ee6e65 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 13 Jul 2020 10:52:37 +0200 Subject: [PATCH 43/58] Add UI for the script and automation modes (#6367) --- src/data/automation.ts | 2 + src/data/script.ts | 2 + .../config/automation/ha-automation-editor.ts | 79 +++++++++++++++++- src/panels/config/script/ha-script-editor.ts | 80 ++++++++++++++++++- src/resources/styles.ts | 4 + src/translations/en.json | 26 ++++++ 6 files changed, 187 insertions(+), 6 deletions(-) diff --git a/src/data/automation.ts b/src/data/automation.ts index cf4ce18ebf..f495c59b48 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -20,6 +20,8 @@ export interface AutomationConfig { trigger: Trigger[]; condition?: Condition[]; action: Action[]; + mode?: "single" | "restart" | "queued" | "parallel"; + max?: number; } export interface ForDict { diff --git a/src/data/script.ts b/src/data/script.ts index 5f027ce413..5fdbbcfa46 100644 --- a/src/data/script.ts +++ b/src/data/script.ts @@ -16,6 +16,8 @@ export interface ScriptEntity extends HassEntityBase { export interface ScriptConfig { alias: string; sequence: Action[]; + mode?: "single" | "restart" | "queued" | "parallel"; + max?: number; } export interface EventAction { diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 8129605c23..cc70db4fe5 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -1,5 +1,6 @@ import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "@polymer/paper-input/paper-textarea"; import "../../../components/ha-icon-button"; import { @@ -43,6 +44,10 @@ import "./condition/ha-automation-condition"; import "./trigger/ha-automation-trigger"; import { HaDeviceTrigger } from "./trigger/types/ha-automation-trigger-device"; import { mdiContentSave } from "@mdi/js"; +import { PaperListboxElement } from "@polymer/paper-listbox"; + +const MODES = ["parallel", "single", "restart", "queued"]; +const MODES_MAX = ["queued", "parallel"]; export class HaAutomationEditor extends LitElement { @property() public hass!: HomeAssistant; @@ -129,6 +134,57 @@ export class HaAutomationEditor extends LitElement { .value=${this._config.description} @value-changed=${this._valueChanged} > +

+ ${this.hass.localize( + "ui.panel.config.automation.editor.modes.description", + "documentation_link", + html`${this.hass.localize( + "ui.panel.config.automation.editor.modes.documentation" + )}` + )} +

+ + + ${MODES.map( + (mode) => html` + + ${this.hass.localize( + `ui.panel.config.automation.editor.modes.${mode}` + ) || mode} + + ` + )} + + + ${this._config.mode && + MODES_MAX.includes(this._config.mode) + ? html` + ` + : html``}
${stateObj ? html` @@ -343,14 +399,28 @@ export class HaAutomationEditor extends LitElement { this._entityId = automation?.entity_id; } + private _modeChanged(ev: CustomEvent) { + const mode = ((ev.target as PaperListboxElement)?.selectedItem as any) + ?.mode; + + this._config = { ...this._config!, mode }; + if (!MODES_MAX.includes(mode)) { + delete this._config.max; + } + this._dirty = true; + } + private _valueChanged(ev: CustomEvent) { ev.stopPropagation(); - const name = (ev.target as any)?.name; + const target = ev.target as any; + const name = target.name; if (!name) { return; } - const newVal = ev.detail.value; - + let newVal = ev.detail.value; + if (target.type === "number") { + newVal = Number(newVal); + } if ((this._config![name] || "") === newVal) { return; } @@ -453,6 +523,9 @@ export class HaAutomationEditor extends LitElement { span[slot="introduction"] a { color: var(--primary-color); } + p { + margin-bottom: 0; + } ha-entity-toggle { margin-right: 8px; } diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index 85c35f7415..be5422de69 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -1,4 +1,5 @@ import "@polymer/app-layout/app-header/app-header"; +import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light"; import "@polymer/app-layout/app-toolbar/app-toolbar"; import "../../../components/ha-icon-button"; import { @@ -32,6 +33,10 @@ import "../ha-config-section"; import { configSections } from "../ha-panel-config"; import "../../../components/ha-svg-icon"; import { mdiContentSave } from "@mdi/js"; +import { PaperListboxElement } from "@polymer/paper-listbox"; + +const MODES = ["single", "restart", "queued", "parallel"]; +const MODES_MAX = ["queued", "parallel"]; export class HaScriptEditor extends LitElement { @property() public hass!: HomeAssistant; @@ -105,6 +110,58 @@ export class HaScriptEditor extends LitElement { @value-changed=${this._valueChanged} > + +

+ ${this.hass.localize( + "ui.panel.config.script.editor.modes.description", + "documentation_link", + html`${this.hass.localize( + "ui.panel.config.script.editor.modes.documentation" + )}` + )} +

+ + + ${MODES.map( + (mode) => html` + + ${this.hass.localize( + `ui.panel.config.script.editor.modes.${mode}` + ) || mode} + + ` + )} + + + ${this._config.mode && + MODES_MAX.includes(this._config.mode) + ? html` + ` + : html``}
@@ -216,14 +273,28 @@ export class HaScriptEditor extends LitElement { } } + private _modeChanged(ev: CustomEvent) { + const mode = ((ev.target as PaperListboxElement)?.selectedItem as any) + ?.mode; + + this._config = { ...this._config!, mode }; + if (!MODES_MAX.includes(mode)) { + delete this._config.max; + } + this._dirty = true; + } + private _valueChanged(ev: CustomEvent) { ev.stopPropagation(); - const name = (ev.target as any)?.name; + const target = ev.target as any; + const name = target.name; if (!name) { return; } - const newVal = ev.detail.value; - + let newVal = ev.detail.value; + if (target.type === "number") { + newVal = Number(newVal); + } if ((this._config![name] || "") === newVal) { return; } @@ -292,6 +363,9 @@ export class HaScriptEditor extends LitElement { ha-card { overflow: hidden; } + p { + margin-bottom: 0; + } .errors { padding: 20px; font-weight: bold; diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 0b3c1b2678..9eeeb4821d 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -100,6 +100,10 @@ export const haStyle = css` line-height: var(--paper-font-subhead_-_line-height); } + a { + color: var(--primary-color); + } + .secondary { color: var(--secondary-text-color); } diff --git a/src/translations/en.json b/src/translations/en.json index 5004b80530..1f454dbe12 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -841,6 +841,19 @@ "label": "Description", "placeholder": "Optional description" }, + "modes": { + "label": "Mode", + "description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.", + "documentation": "automation documentation", + "single": "Single", + "restart": "Restart", + "queued": "Queued", + "parallel": "Parallel (default)" + }, + "max": { + "queued": "Queue length", + "parallel": "Max number of parallel runs" + }, "edit_yaml": "Edit as YAML", "edit_ui": "Edit with UI", "triggers": { @@ -1068,6 +1081,19 @@ "introduction": "Use scripts to execute a sequence of actions.", "header": "Script: {name}", "default_name": "New Script", + "modes": { + "label": "Mode", + "description": "The mode controls what happens when script is invoked while it is still running from one or more previous invocations. Check the {documentation_link} for more info.", + "documentation": "script documentation", + "single": "Single (default)", + "restart": "Restart", + "queued": "Queued", + "parallel": "Parallel" + }, + "max": { + "queued": "Queue length", + "parallel": "Max number of parallel runs" + }, "load_error_not_editable": "Only scripts inside scripts.yaml are editable.", "delete_confirm": "Are you sure you want to delete this script?", "delete_script": "Delete script", From e2cba90f8d5e80e1320fb19efb8ca5a35d6f97b8 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 13 Jul 2020 16:18:23 +0200 Subject: [PATCH 44/58] Fix entity filter menu on mobile (#6366) Fixes #6364 --- src/layouts/hass-tabs-subpage-data-table.ts | 1 - src/layouts/hass-tabs-subpage.ts | 2 +- src/panels/config/entities/ha-config-entities.ts | 5 +++-- src/panels/config/integrations/ha-config-integrations.ts | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts index 6cd22e2052..b504b29947 100644 --- a/src/layouts/hass-tabs-subpage-data-table.ts +++ b/src/layouts/hass-tabs-subpage-data-table.ts @@ -242,7 +242,6 @@ export class HaTabsSubpageDataTable extends LitElement { } search-input.header { left: -8px; - top: -7px; } .active-filters { color: var(--primary-text-color); diff --git a/src/layouts/hass-tabs-subpage.ts b/src/layouts/hass-tabs-subpage.ts index d089792a7c..ebb3a8e4b8 100644 --- a/src/layouts/hass-tabs-subpage.ts +++ b/src/layouts/hass-tabs-subpage.ts @@ -240,7 +240,7 @@ class HassTabsSubpage extends LitElement { flex: 1; overflow: hidden; text-overflow: ellipsis; - max-height: 40px; + max-height: 58px; line-height: 20px; } diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index c833a96faa..729e26cc2a 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -768,8 +768,9 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { justify-content: space-between; align-items: center; color: var(--secondary-text-color); - position: relative; - top: -8px; + } + .search-toolbar ha-button-menu { + position: static; } .selected-txt { font-weight: bold; diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index 3f338f78a4..1db180f47f 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -679,7 +679,6 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) { display: block; position: relative; left: -8px; - top: -7px; color: var(--secondary-text-color); margin-left: 16px; } From 2f7d744228fdf0d4c0b9d3adac22f7291f6e143a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 13 Jul 2020 10:19:29 -0700 Subject: [PATCH 45/58] Rename whitelist error to allowed (#6372) --- src/translations/en.json | 2 +- test-mocha/common/entity/entity_filter.ts | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index 1f454dbe12..ea27d153e6 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2319,7 +2319,7 @@ } }, "abort": { - "not_whitelisted": "Your computer is not whitelisted." + "not_allowed": "Your computer is not allowed." } } } diff --git a/test-mocha/common/entity/entity_filter.ts b/test-mocha/common/entity/entity_filter.ts index 74f4b48e7b..35e1f7ac05 100644 --- a/test-mocha/common/entity/entity_filter.ts +++ b/test-mocha/common/entity/entity_filter.ts @@ -13,14 +13,14 @@ describe("EntityFilter", () => { }); // case 2 - it("allows whitelisting entities by entity id", () => { + it("allows entities by entity id", () => { const filter = generateFilter(undefined, ["light.kitchen"]); assert(filter("light.kitchen")); assert(!filter("light.living_room")); }); - it("allows whitelisting entities by domain", () => { + it("allows entities by domain", () => { const filter = generateFilter(["switch"]); assert(filter("switch.bla")); @@ -28,7 +28,7 @@ describe("EntityFilter", () => { }); // case 3 - it("allows blacklisting entities by entity id", () => { + it("excluding entities by entity id", () => { const filter = generateFilter(undefined, undefined, undefined, [ "light.kitchen", ]); @@ -37,7 +37,7 @@ describe("EntityFilter", () => { assert(filter("light.living_room")); }); - it("allows blacklisting entities by domain", () => { + it("excluding entities by domain", () => { const filter = generateFilter(undefined, undefined, ["switch"]); assert(!filter("switch.bla")); @@ -45,7 +45,7 @@ describe("EntityFilter", () => { }); // case 4a - it("allows whitelisting domain and blacklisting entity", () => { + it("allows domain and excluding entity", () => { const filter = generateFilter(["switch"], undefined, undefined, [ "switch.kitchen", ]); @@ -55,7 +55,7 @@ describe("EntityFilter", () => { assert(!filter("sensor.bla")); }); - it("allows whitelisting entity while whitelisting other domains", () => { + it("allows entity while other domains", () => { const filter = generateFilter(["switch"], ["light.kitchen"]); assert(filter("switch.living_room")); @@ -64,7 +64,7 @@ describe("EntityFilter", () => { }); // case 4b - it("allows blacklisting domain and whitelisting entity", () => { + it("excluding domain and entity", () => { const filter = generateFilter(undefined, ["switch.kitchen"], ["switch"]); assert(filter("switch.kitchen")); @@ -72,7 +72,7 @@ describe("EntityFilter", () => { assert(filter("sensor.bla")); }); - it("allows blacklisting domain and excluding entities", () => { + it("excluding domain and excluding entities", () => { const filter = generateFilter( undefined, undefined, @@ -86,7 +86,7 @@ describe("EntityFilter", () => { }); // case 4c - it("allows whitelisting entities", () => { + it("allows entities", () => { const filter = generateFilter(undefined, ["light.kitchen"]); assert(filter("light.kitchen")); From 1c73007ae6ec6f2fefd50d77c65ae25ed49f44e9 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 13 Jul 2020 19:37:48 +0200 Subject: [PATCH 46/58] Entity dialogs: Remove paper element and align dialog header style (#6370) * Entity dialogs: Remove paper element and align dialog header style * Remove centerTitle --- package.json | 3 + src/components/ha-dialog.ts | 2 +- src/components/ha-header-bar.ts | 47 ++++++++ src/dialogs/more-info/ha-more-info-dialog.ts | 41 +++---- .../config/entities/dialog-entity-editor.ts | 106 ++++++++-------- yarn.lock | 113 ++++++++++++++++++ 6 files changed, 228 insertions(+), 84 deletions(-) create mode 100644 src/components/ha-header-bar.ts diff --git a/package.json b/package.json index 242fc7b1be..9f61f7eba7 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,9 @@ "@material/mwc-menu": "^0.17.2", "@material/mwc-ripple": "^0.17.2", "@material/mwc-switch": "^0.17.2", + "@material/mwc-tab": "^0.17.2", + "@material/mwc-tab-bar": "^0.17.2", + "@material/top-app-bar": "=8.0.0-canary.a78ceb112.0", "@mdi/js": "5.3.45", "@mdi/svg": "5.3.45", "@polymer/app-layout": "^3.0.2", diff --git a/src/components/ha-dialog.ts b/src/components/ha-dialog.ts index 0bbcfd8307..03472c6495 100644 --- a/src/components/ha-dialog.ts +++ b/src/components/ha-dialog.ts @@ -57,7 +57,7 @@ export class HaDialog extends MwcDialog { .header_button { position: absolute; right: 16px; - top: 12px; + top: 10px; text-decoration: none; color: inherit; } diff --git a/src/components/ha-header-bar.ts b/src/components/ha-header-bar.ts new file mode 100644 index 0000000000..946c1979de --- /dev/null +++ b/src/components/ha-header-bar.ts @@ -0,0 +1,47 @@ +import { customElement, LitElement, html, unsafeCSS, css } from "lit-element"; +// @ts-ignore +import topAppBarStyles from "@material/top-app-bar/dist/mdc.top-app-bar.min.css"; + +@customElement("ha-header-bar") +export class HaHeaderBar extends LitElement { + protected render() { + return html`
+
+ + +
+
`; + } + + static get styles() { + return [ + unsafeCSS(topAppBarStyles), + css` + .mdc-top-app-bar { + position: static; + color: var(--mdc-theme-on-primary, #fff); + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-header-bar": HaHeaderBar; + } +} diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 9c4370397b..2ce4617e80 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -1,7 +1,6 @@ import "@material/mwc-button"; import "@material/mwc-icon-button"; -import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; +import "../../components/ha-header-bar"; import "../../components/ha-dialog"; import "../../components/ha-svg-icon"; import { isComponentLoaded } from "../../common/config/is_component_loaded"; @@ -94,18 +93,20 @@ export class MoreInfoDialog extends LitElement { hideActions data-domain=${domain} > - + -
+
${computeStateName(stateObj)}
${this.hass.user!.is_admin ? html` ` : ""} - +
${DOMAINS_NO_INFO.includes(domain) ? "" @@ -247,29 +249,19 @@ export class MoreInfoDialog extends LitElement { --dialog-content-position: static; } - app-toolbar { + ha-header-bar { + --mdc-theme-on-primary: var(--primary-text-color); + --mdc-theme-primary: var(--card-background-color); flex-shrink: 0; - color: var(--primary-text-color); - background-color: var(--secondary-background-color); - } - - app-toolbar [main-title] { - /* Design guideline states 24px, changed to 16 to align with state info */ - margin-left: 16px; - line-height: 1.3em; - max-height: 2.6em; - overflow: hidden; - /* webkit and blink still support simple multiline text-overflow */ - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - text-overflow: ellipsis; + border-bottom: 1px solid + var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); } @media all and (max-width: 450px), all and (max-height: 500px) { - app-toolbar { - background-color: var(--app-header-background-color); - color: var(--app-header-text-color, white); + ha-header-bar { + --mdc-theme-primary: var(--app-header-background-color); + --mdc-theme-on-primary: var(--app-header-text-color, white); + border-bottom: none; } } @@ -287,7 +279,6 @@ export class MoreInfoDialog extends LitElement { } .main-title { - pointer-events: auto; cursor: default; } diff --git a/src/panels/config/entities/dialog-entity-editor.ts b/src/panels/config/entities/dialog-entity-editor.ts index 41fdcc279d..4dbbb5b607 100644 --- a/src/panels/config/entities/dialog-entity-editor.ts +++ b/src/panels/config/entities/dialog-entity-editor.ts @@ -1,6 +1,5 @@ -import "@polymer/app-layout/app-toolbar/app-toolbar"; -import "@polymer/paper-tabs/paper-tab"; -import "@polymer/paper-tabs/paper-tabs"; +import "@material/mwc-tab-bar"; +import "@material/mwc-tab"; import "@material/mwc-icon-button"; import { HassEntity } from "home-assistant-js-websocket"; import { @@ -17,6 +16,7 @@ import { fireEvent } from "../../../common/dom/fire_event"; import { dynamicElement } from "../../../common/dom/dynamic-element-directive"; import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/ha-dialog"; +import "../../../components/ha-header-bar"; import "../../../components/ha-svg-icon"; import "../../../components/ha-related-items"; import { @@ -51,7 +51,7 @@ export class DialogEntityEditor extends LitElement { | ExtEntityRegistryEntry | null; - @property() private _curTab?: string; + @property() private _curTab = "tab-settings"; @property() private _extraTabs: Tabs = {}; @@ -92,19 +92,21 @@ export class DialogEntityEditor extends LitElement { @close-dialog=${this.closeDialog} >
- + -
+ ${stateObj ? computeStateName(stateObj) : entry?.name || entityId} -
+ ${stateObj ? html` ` : ""} -
- + - - ${this.hass.localize("ui.dialogs.entity_registry.settings")} - + + ${Object.entries(this._extraTabs).map( ([key, tab]) => html` - - ${this.hass.localize(tab.translationKey) || key} - + + ` )} - - ${this.hass.localize("ui.dialogs.entity_registry.related")} - - + + +
${cache(this._renderTab())} @@ -187,11 +198,12 @@ export class DialogEntityEditor extends LitElement { } } - private _handleTabSelected(ev: CustomEvent): void { - if (!ev.detail.value) { - return; - } - this._curTab = ev.detail.value.id; + private _handleTabActivated(ev: CustomEvent): void { + this._curTabIndex = ev.detail.index; + } + + private _handleTabInteracted(ev: CustomEvent): void { + this._curTab = ev.detail.tabId; } private async _loadPlatformSettingTabs(): Promise { @@ -220,24 +232,15 @@ export class DialogEntityEditor extends LitElement { return [ haStyleDialog, css` - app-toolbar { - color: var(--primary-text-color); - background-color: var(--secondary-background-color); - margin: 0; - padding: 0 16px; + ha-header-bar { + --mdc-theme-on-primary: var(--primary-text-color); + --mdc-theme-primary: var(--card-background-color); + flex-shrink: 0; } - app-toolbar [main-title] { - /* Design guideline states 24px, changed to 16 to align with state info */ - margin-left: 16px; - line-height: 1.3em; - max-height: 2.6em; - overflow: hidden; - /* webkit and blink still support simple multiline text-overflow */ - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - text-overflow: ellipsis; + mwc-tab-bar { + border-bottom: 1px solid + var(--mdc-dialog-scroll-divider-color, rgba(0, 0, 0, 0.12)); } ha-dialog { @@ -245,10 +248,6 @@ export class DialogEntityEditor extends LitElement { } @media all and (min-width: 451px) and (min-height: 501px) { - .main-title { - pointer-events: auto; - cursor: default; - } .wrapper { width: 400px; } @@ -261,9 +260,9 @@ export class DialogEntityEditor extends LitElement { /* overrule the ha-style-dialog max-height on small screens */ @media all and (max-width: 450px), all and (max-height: 500px) { - app-toolbar { - background-color: var(--app-header-background-color); - color: var(--app-header-text-color, white); + ha-header-bar { + --mdc-theme-primary: var(--app-header-background-color); + --mdc-theme-on-primary: var(--app-header-text-color, white); } } @@ -275,15 +274,6 @@ export class DialogEntityEditor extends LitElement { direction: rtl; text-align: right; } - :host { - --paper-font-title_-_white-space: normal; - } - paper-tabs { - --paper-tabs-selection-bar-color: var(--primary-color); - text-transform: uppercase; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - margin-top: 0; - } `, ]; } diff --git a/yarn.lock b/yarn.lock index 632e037d05..9701db610f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1658,6 +1658,54 @@ lit-element "^2.3.0" tslib "^1.10.0" +"@material/mwc-tab-bar@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-tab-bar/-/mwc-tab-bar-0.17.2.tgz#d89a290d4dda5f854ee51a539b69020c6634d1db" + integrity sha512-QsHOmxj6FM7jKYM9Dt6u7jKQv8r13z7/ryocQAAqyd13+LwAc+ec2o0hE6lTFpqNPAdlIhosip5Y3GDHdoKT5w== + dependencies: + "@material/mwc-base" "^0.17.2" + "@material/mwc-tab" "^0.17.2" + "@material/mwc-tab-scroller" "^0.17.2" + "@material/tab" "=8.0.0-canary.a78ceb112.0" + "@material/tab-bar" "=8.0.0-canary.a78ceb112.0" + lit-element "^2.3.0" + tslib "^1.10.0" + +"@material/mwc-tab-indicator@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-tab-indicator/-/mwc-tab-indicator-0.17.2.tgz#fc3ac2c7a53df20acc99e71599dd38e8abbc2cda" + integrity sha512-JaAyWLhU/FO1v0wX1LLk4nTph13kFla14tYzMNg1rK6DcHdU19FgpjO7T1D61AJXQUmOMJ5q1qX/8dWd7BLlXg== + dependencies: + "@material/mwc-base" "^0.17.2" + "@material/tab-indicator" "=8.0.0-canary.a78ceb112.0" + lit-element "^2.3.0" + lit-html "^1.1.2" + tslib "^1.10.0" + +"@material/mwc-tab-scroller@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-tab-scroller/-/mwc-tab-scroller-0.17.2.tgz#1f90691fe1bb91058cb884a72056951484967654" + integrity sha512-T03XsOQH457yhqeoZojMb2cfBshnBYCW4KIF8h2XqZiL9d47/E1OQqpWT/r1BbSZ7ysVhpH0TiwHvIaPzNW4ZA== + dependencies: + "@material/dom" "=8.0.0-canary.a78ceb112.0" + "@material/mwc-base" "^0.17.2" + "@material/tab-scroller" "=8.0.0-canary.a78ceb112.0" + lit-element "^2.3.0" + tslib "^1.10.0" + +"@material/mwc-tab@^0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@material/mwc-tab/-/mwc-tab-0.17.2.tgz#5629164b9099acd6d3d1109232b99ff23088f0ba" + integrity sha512-M8+T4jXL/noG3MAoxXNuN/or2Ky3Zozxa9XsgK4vGHK3rN5tB1w0t2ZMjmVgp8qJ4JIqgnYtsiM0Z1P/MLV4lw== + dependencies: + "@material/mwc-base" "^0.17.2" + "@material/mwc-ripple" "^0.17.2" + "@material/mwc-tab-indicator" "^0.17.2" + "@material/tab" "=8.0.0-canary.a78ceb112.0" + lit-element "^2.3.0" + lit-html "^1.1.2" + tslib "^1.10.0" + "@material/progress-indicator@8.0.0-canary.a78ceb112.0": version "8.0.0-canary.a78ceb112.0" resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-8.0.0-canary.a78ceb112.0.tgz#70a769d413910daf8ea1c4d51712487e381eaeab" @@ -1724,6 +1772,56 @@ "@material/theme" "8.0.0-canary.a78ceb112.0" tslib "^1.9.3" +"@material/tab-bar@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-8.0.0-canary.a78ceb112.0.tgz#f15dc55be11dbfe9d42d5a924e5ebe0e122fd430" + integrity sha512-OrrieVHPPdBPm7Nsc2rdjLWIH5S1+immZxDe3zmn8eX0kw+EZf1HucFUwPWYFVTj1bFQfAk+P5AOHbrpu0UeAA== + dependencies: + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/density" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/tab" "8.0.0-canary.a78ceb112.0" + "@material/tab-scroller" "8.0.0-canary.a78ceb112.0" + tslib "^1.9.3" + +"@material/tab-indicator@8.0.0-canary.a78ceb112.0", "@material/tab-indicator@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-8.0.0-canary.a78ceb112.0.tgz#24ad5d88b9fd652c91cfdb0c4f86eae7b7f48c4f" + integrity sha512-LPh3RZwzbyoaCnCkRw2GvEdH1m3m49H+jzJaA56vP7XCrSqlFD0UvGHM622ObkFbJb3xV+SKtq+jcRzHcSlQQw== + dependencies: + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + tslib "^1.9.3" + +"@material/tab-scroller@8.0.0-canary.a78ceb112.0", "@material/tab-scroller@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-8.0.0-canary.a78ceb112.0.tgz#393b79ed32bb6ceda87be8d4a6f64506b35e009d" + integrity sha512-of9L0foIN+jec1QRDnygTJ2vbK6MLGcJV1kPAFxBehObXo7MMisP8jZtxLCLaV5sdPpVvfIPdGdvvemYWUsysw== + dependencies: + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/dom" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/tab" "8.0.0-canary.a78ceb112.0" + tslib "^1.9.3" + +"@material/tab@8.0.0-canary.a78ceb112.0", "@material/tab@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-8.0.0-canary.a78ceb112.0.tgz#0591ce259891e2a6b121af40b9fb182da2911ad6" + integrity sha512-lExmfj6Hw2Q9rSVTmjc+ruipoFZIgta9CAATRgxbuhCapXO7BUDkBihQbcxwTqH6qe4G80hRnUcsqm2PzsAEVA== + dependencies: + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/tab-indicator" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" + tslib "^1.9.3" + "@material/theme@8.0.0-canary.a78ceb112.0": version "8.0.0-canary.a78ceb112.0" resolved "https://registry.yarnpkg.com/@material/theme/-/theme-8.0.0-canary.a78ceb112.0.tgz#0a32294d806f16ebfab42025d35056a6954863a0" @@ -1731,6 +1829,21 @@ dependencies: "@material/feature-targeting" "8.0.0-canary.a78ceb112.0" +"@material/top-app-bar@=8.0.0-canary.a78ceb112.0": + version "8.0.0-canary.a78ceb112.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-8.0.0-canary.a78ceb112.0.tgz#d84baf4a91cbaaf83b4bc7e798cbae0adff1b1b9" + integrity sha512-27bm0xPxepKSVh04FK7m0zUSP9FveIXv/qa2vJI3XTZWkFiNPrF+MGwkMPo83Z5TMqMFDRhDcjzSJlo9H4IrOg== + dependencies: + "@material/animation" "8.0.0-canary.a78ceb112.0" + "@material/base" "8.0.0-canary.a78ceb112.0" + "@material/elevation" "8.0.0-canary.a78ceb112.0" + "@material/ripple" "8.0.0-canary.a78ceb112.0" + "@material/rtl" "8.0.0-canary.a78ceb112.0" + "@material/shape" "8.0.0-canary.a78ceb112.0" + "@material/theme" "8.0.0-canary.a78ceb112.0" + "@material/typography" "8.0.0-canary.a78ceb112.0" + tslib "^1.9.3" + "@material/touch-target@8.0.0-canary.a78ceb112.0": version "8.0.0-canary.a78ceb112.0" resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-8.0.0-canary.a78ceb112.0.tgz#dcacd182c99e3eae5547ffe26bc758fca252cfae" From 894f4379e6f653f6944d8260bf973597d2b02657 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Tue, 14 Jul 2020 00:32:22 +0000 Subject: [PATCH 47/58] [ci skip] Translation update --- translations/frontend/de.json | 14 +++++++++++--- translations/frontend/en.json | 27 +++++++++++++++++++++++++++ translations/frontend/es.json | 14 +++++++++++--- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/translations/frontend/de.json b/translations/frontend/de.json index cba02e5af4..60752ca372 100644 --- a/translations/frontend/de.json +++ b/translations/frontend/de.json @@ -525,6 +525,9 @@ "clear": "Löschen", "show_areas": "Bereiche anzeigen" }, + "data-table": { + "search": "Suche" + }, "date-range-picker": { "end_date": "Enddatum", "select": "Auswählen", @@ -1356,6 +1359,7 @@ "confirm_text": "Du solltest sie aus deiner Lovelace-Konfiguration und deinen Automatisierungen entfernen, wenn sie diese Entitäten enthalten.", "confirm_title": "Möchtest du {number} Entitäten entfernen?" }, + "search": "Entitäten suchen", "selected": "{number} ausgewählt", "status": { "disabled": "Deaktiviert", @@ -1386,7 +1390,8 @@ "entity_id": "Entitäts-ID", "name": "Name", "type": "Typ" - } + }, + "no_helpers": "Sieht so aus, als hätten Sie noch keine Helfer!" }, "types": { "input_boolean": "Umschalten", @@ -1490,7 +1495,8 @@ "note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.", "note_about_website_reference": "Weitere Informationen findest Du auf der ", "rename_dialog": "Bearbeite den Namen dieses Konfigurationseintrags", - "rename_input_label": "Eintragsname" + "rename_input_label": "Eintragsname", + "search": "Such-Integrationen" }, "introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.", "logs": { @@ -2194,6 +2200,7 @@ "name": "Name", "no_theme": "Kein Theme", "refresh_interval": "Aktualisierungsintervall", + "search": "Suche", "secondary_info_attribute": "Zweites Infoattribut", "show_icon": "Symbol anzeigen?", "show_name": "Namen anzeigen?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "Titel bearbeiten", "explanation": "Dieser Titel wird überhalb aller deiner Lovelace Ansichten gezeigt.", - "header": "Titel deiner Lovelace UI" + "header": "Titel deiner Lovelace UI", + "title": "Titel" }, "edit_view": { "add": "Ansicht hinzufügen", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index 5084434a8f..20d8cc2a95 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -941,6 +941,19 @@ "introduction": "Use automations to bring your home alive.", "load_error_not_editable": "Only automations in automations.yaml are editable.", "load_error_unknown": "Error loading automation ({err_no}).", + "max": { + "parallel": "Max number of parallel runs", + "queued": "Queue length" + }, + "modes": { + "description": "The mode controls what happens when the automation is triggered while the actions are still running from a previous trigger. Check the {documentation_link} for more info.", + "documentation": "automation documentation", + "label": "Mode", + "parallel": "Parallel (default)", + "queued": "Queued", + "restart": "Restart", + "single": "Single" + }, "move_down": "Move down", "move_up": "Move up", "save": "Save", @@ -1685,6 +1698,19 @@ "introduction": "Use scripts to execute a sequence of actions.", "link_available_actions": "Learn more about available actions.", "load_error_not_editable": "Only scripts inside scripts.yaml are editable.", + "max": { + "parallel": "Max number of parallel runs", + "queued": "Queue length" + }, + "modes": { + "description": "The mode controls what happens when script is invoked while it is still running from one or more previous invocations. Check the {documentation_link} for more info.", + "documentation": "script documentation", + "label": "Mode", + "parallel": "Parallel", + "queued": "Queued", + "restart": "Restart", + "single": "Single (default)" + }, "sequence": "Sequence", "sequence_sentence": "The sequence of actions of this script." }, @@ -2511,6 +2537,7 @@ }, "trusted_networks": { "abort": { + "not_allowed": "Your computer is not allowed.", "not_whitelisted": "Your computer is not whitelisted." }, "step": { diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 23a42ebbfd..0bf1709566 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -525,6 +525,9 @@ "clear": "Limpiar", "show_areas": "Mostrar áreas" }, + "data-table": { + "search": "Buscar" + }, "date-range-picker": { "end_date": "Fecha de finalización", "select": "Seleccionar", @@ -1356,6 +1359,7 @@ "confirm_text": "Debes eliminarlos de la configuración y las automatizaciones de Lovelace si contienen estas entidades.", "confirm_title": "¿Deseas eliminar {number} entidades?" }, + "search": "Buscar entidades", "selected": "{number} seleccionadas", "status": { "disabled": "Deshabilitado", @@ -1386,7 +1390,8 @@ "entity_id": "ID de la entidad", "name": "Nombre", "type": "Tipo" - } + }, + "no_helpers": "¡Parece que aún no tienes ayudantes!" }, "types": { "input_boolean": "Alternar", @@ -1490,7 +1495,8 @@ "note_about_integrations": "Todavía no se pueden configurar todas las integraciones a través de la interfaz de usuario.", "note_about_website_reference": "Hay más disponibles en el ", "rename_dialog": "Edita el nombre de esta entrada de configuración", - "rename_input_label": "Nombre de la entrada" + "rename_input_label": "Nombre de la entrada", + "search": "Buscar integraciones" }, "introduction": "Aquí puedes configurar tus componentes y Home Assistant. Aún no es posible configurar todo desde la interfaz de usuario, pero estamos trabajando en ello.", "logs": { @@ -2194,6 +2200,7 @@ "name": "Nombre", "no_theme": "Sin tema", "refresh_interval": "Intervalo de actualización", + "search": "Buscar", "secondary_info_attribute": "Atributo de información secundaria", "show_icon": "¿Mostrar icono?", "show_name": "¿Mostrar nombre?", @@ -2314,7 +2321,8 @@ "edit_lovelace": { "edit_title": "Editar título", "explanation": "Este título se muestra sobre todas tus vistas en la IU Lovelace.", - "header": "Título de tu interfaz de usuario de Lovelace" + "header": "Título de tu interfaz de usuario de Lovelace", + "title": "Título" }, "edit_view": { "add": "Añadir vista", From acb471fbe5fc361388705bd13de906dcd476e143 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 18:13:04 +0200 Subject: [PATCH 48/58] Replace round slider gauge with svg-gauge (#6384) --- package.json | 1 + src/panels/lovelace/cards/hui-gauge-card.ts | 255 +++++++------------- yarn.lock | 5 + 3 files changed, 91 insertions(+), 170 deletions(-) diff --git a/package.json b/package.json index 9f61f7eba7..7b4ada4548 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,7 @@ "resize-observer-polyfill": "^1.5.1", "roboto-fontface": "^0.10.0", "superstruct": "^0.6.1", + "svg-gauge": "^1.0.6", "unfetch": "^4.1.0", "vue": "^2.6.11", "vue2-daterange-picker": "^0.5.1", diff --git a/src/panels/lovelace/cards/hui-gauge-card.ts b/src/panels/lovelace/cards/hui-gauge-card.ts index c8917be4ef..d5c1f1fd39 100644 --- a/src/panels/lovelace/cards/hui-gauge-card.ts +++ b/src/panels/lovelace/cards/hui-gauge-card.ts @@ -1,4 +1,5 @@ import { HassEntity } from "home-assistant-js-websocket/dist/types"; +import Gauge from "svg-gauge"; import { css, CSSResult, @@ -8,9 +9,8 @@ import { property, PropertyValues, TemplateResult, + query, } from "lit-element"; -import { styleMap } from "lit-html/directives/style-map"; -import "@thomasloven/round-slider"; import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; import { fireEvent } from "../../../common/dom/fire_event"; @@ -23,8 +23,6 @@ import { hasConfigOrEntityChanged } from "../common/has-changed"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import type { LovelaceCard, LovelaceCardEditor } from "../types"; import type { GaugeCardConfig } from "./types"; -import { debounce } from "../../../common/util/debounce"; -import { installResizeObserver } from "../common/install-resize-observer"; export const severityMap = { red: "var(--label-badge-red)", @@ -69,18 +67,9 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { @property() private _config?: GaugeCardConfig; - private _resizeObserver?: ResizeObserver; + @property() private _gauge?: any; - public connectedCallback(): void { - super.connectedCallback(); - this.updateComplete.then(() => this._attachObserver()); - } - - public disconnectedCallback(): void { - if (this._resizeObserver) { - this._resizeObserver.disconnect(); - } - } + @query("#gauge") private _gaugeElement!: HTMLDivElement; public getCardSize(): number { return 2; @@ -94,6 +83,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { throw new Error("Invalid Entity"); } this._config = { min: 0, max: 100, ...config }; + this._initGauge(); } protected render(): TemplateResult { @@ -125,42 +115,11 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { `; } - const sliderBarColor = this._computeSeverity(state); - - let value: number | undefined; - - if (this._config.max === null || isNaN(this._config.max!)) { - value = undefined; - } else { - value = Math.min(this._config.max!, state); - } - return html` - - -
-
- ${stateObj.state} - ${this._config.unit || - stateObj.attributes.unit_of_measurement || - ""} -
-
- ${this._config.name || computeStateName(stateObj)} -
+ +
+
+ ${this._config.name || computeStateName(stateObj)}
`; @@ -170,9 +129,11 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { return hasConfigOrEntityChanged(this, changedProps); } - protected firstUpdated(): void { - this._measureCard(); - this._attachObserver(); + protected firstUpdated(changedProps: PropertyValues): void { + super.firstUpdated(changedProps); + if (!this._gauge) { + this._initGauge(); + } } protected updated(changedProps: PropertyValues): void { @@ -194,76 +155,72 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { ) { applyThemesOnElement(this, this.hass.themes, this._config.theme); } + const oldState = oldHass?.states[this._config.entity]; + const stateObj = this.hass.states[this._config.entity]; + if (oldState?.state !== stateObj.state) { + this._gauge.setValueAnimated(stateObj.state, 1); + } } - private _computeSeverity(numberValue: number): string { - const sections = this._config!.severity; - - if (!sections) { - return severityMap.normal; + private _initGauge() { + if (!this._gaugeElement || !this._config || !this.hass) { + return; } + if (this._gauge) { + this._gaugeElement.removeChild(this._gaugeElement.lastChild!); + this._gauge = undefined; + } + this._gauge = Gauge(this._gaugeElement, { + min: this._config.min, + max: this._config.max, + dialStartAngle: 180, + dialEndAngle: 0, + viewBox: "0 0 100 55", + label: (value) => `${Math.round(value)} + ${ + this._config!.unit || + this.hass?.states[this._config!.entity].attributes + .unit_of_measurement || + "" + }`, + color: (value) => { + const sections = this._config!.severity; - const sectionsArray = Object.keys(sections); - const sortable = sectionsArray.map((severity) => [ - severity, - sections[severity], - ]); + if (!sections) { + return severityMap.normal; + } - for (const severity of sortable) { - if (severityMap[severity[0]] == null || isNaN(severity[1])) { + const sectionsArray = Object.keys(sections); + const sortable = sectionsArray.map((severity) => [ + severity, + sections[severity], + ]); + + for (const severity of sortable) { + if (severityMap[severity[0]] == null || isNaN(severity[1])) { + return severityMap.normal; + } + } + sortable.sort((a, b) => a[1] - b[1]); + + if (value >= sortable[0][1] && value < sortable[1][1]) { + return severityMap[sortable[0][0]]; + } + if (value >= sortable[1][1] && value < sortable[2][1]) { + return severityMap[sortable[1][0]]; + } + if (value >= sortable[2][1]) { + return severityMap[sortable[2][0]]; + } return severityMap.normal; - } - } - sortable.sort((a, b) => a[1] - b[1]); - - if (numberValue >= sortable[0][1] && numberValue < sortable[1][1]) { - return severityMap[sortable[0][0]]; - } - if (numberValue >= sortable[1][1] && numberValue < sortable[2][1]) { - return severityMap[sortable[1][0]]; - } - if (numberValue >= sortable[2][1]) { - return severityMap[sortable[2][0]]; - } - return severityMap.normal; + }, + }); } private _handleClick(): void { fireEvent(this, "hass-more-info", { entityId: this._config!.entity }); } - private async _attachObserver(): Promise { - if (!this._resizeObserver) { - await installResizeObserver(); - this._resizeObserver = new ResizeObserver( - debounce(() => this._measureCard(), 250, false) - ); - } - const card = this.shadowRoot!.querySelector("ha-card"); - // If we show an error or warning there is no ha-card - if (!card) { - return; - } - this._resizeObserver.observe(card); - } - - private _measureCard() { - if (!this.isConnected) { - return; - } - - if (this.offsetWidth < 200) { - this.setAttribute("narrow", ""); - } else { - this.removeAttribute("narrow"); - } - if (this.offsetWidth < 150) { - this.setAttribute("veryNarrow", ""); - } else { - this.removeAttribute("veryNarrow"); - } - } - static get styles(): CSSResult { return css` :host { @@ -286,73 +243,31 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { outline: none; background: var(--divider-color); } - - round-slider { - max-width: 200px; - --round-slider-path-width: 35px; - --round-slider-path-color: var(--primary-background-color); - --round-slider-linecap: "butt"; + #gauge { + width: 100%; + max-width: 300px; } - - .gauge-data { + .dial { + stroke: #ccc; + stroke-width: 15; + } + .value { + stroke-width: 15; + } + .value-text { + fill: #000; + font-size: var(--gauge-value-font-size, 1.1em); + transform: translate(0, -5px); + font-family: inherit; + } + .name { text-align: center; line-height: initial; color: var(--primary-text-color); - margin-top: -26px; width: 100%; - } - - .gauge-data .percent { - white-space: nowrap; - font-size: 28px; - } - - .gauge-data .name { font-size: 15px; } - /* ============= NARROW ============= */ - - :host([narrow]) ha-card { - padding: 8px; - } - - :host([narrow]) round-slider { - --round-slider-path-width: 22px; - } - - :host([narrow]) .gauge-data { - margin-top: -22px; - } - - :host([narrow]) .gauge-data .percent { - font-size: 24px; - } - - :host([narrow]) .gauge-data .name { - font-size: 14px; - } - - /* ============= VERY NARROW ============= */ - - :host([narrow]) ha-card { - padding: 4px; - } - - :host([veryNarrow]) round-slider { - --round-slider-path-width: 15px; - } - - :host([veryNarrow]) .gauge-data { - margin-top: -16px; - } - - :host([veryNarrow]) .gauge-data .percent { - font-size: 16px; - } - - :host([veryNarrow]) .gauge-data .name { - font-size: 12px; } `; } diff --git a/yarn.lock b/yarn.lock index 9701db610f..50621e3fee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11305,6 +11305,11 @@ sver-compat@^1.5.0: es6-iterator "^2.0.1" es6-symbol "^3.1.1" +svg-gauge@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/svg-gauge/-/svg-gauge-1.0.6.tgz#1e84a366b1cce5b95dab3e33f41fdde867692d28" + integrity sha512-gRkznVhtS18eOM/GMPDXAvrLZOpqzNVDg4bFAPAEjiDKd1tZHFIe8Bwt3G6TFg/H+pFboetPPI+zoV+bOL26QQ== + symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" From 5d6e33204435299602d251535a559123d917e3a2 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 18:13:24 +0200 Subject: [PATCH 49/58] Add more spacing around restored message more info (#6382) --- src/dialogs/more-info/ha-more-info-dialog.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 2ce4617e80..97fcf8a565 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -156,14 +156,16 @@ export class MoreInfoDialog extends LitElement { > ${stateObj.attributes.restored - ? html`${this.hass.localize( - "ui.dialogs.more_info_control.restored.not_provided" - )} -
- ${this.hass.localize( - "ui.dialogs.more_info_control.restored.remove_intro" - )} -
+ ? html`

+ ${this.hass.localize( + "ui.dialogs.more_info_control.restored.not_provided" + )} +

+

+ ${this.hass.localize( + "ui.dialogs.more_info_control.restored.remove_intro" + )} +

${this.hass.localize( "ui.dialogs.more_info_control.restored.remove_action" From f291ea6647131d6b5dde86e98b3628ad46e86185 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 18:14:26 +0200 Subject: [PATCH 50/58] Add link to related area (#6381) --- src/components/entity/ha-battery-icon.ts | 4 +--- src/components/ha-related-items.ts | 14 ++++---------- src/panels/config/areas/ha-config-area-page.ts | 4 +--- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/components/entity/ha-battery-icon.ts b/src/components/entity/ha-battery-icon.ts index 19429bd20c..1838f6af5e 100644 --- a/src/components/entity/ha-battery-icon.ts +++ b/src/components/entity/ha-battery-icon.ts @@ -3,7 +3,7 @@ import "../ha-icon"; import { customElement, html, property, LitElement } from "lit-element"; @customElement("ha-battery-icon") -class HaBatteryIcon extends LitElement { +export class HaBatteryIcon extends LitElement { @property() public batteryStateObj; @property() public batteryChargingStateObj; @@ -16,5 +16,3 @@ class HaBatteryIcon extends LitElement { `; } } - -customElements.define("ha-battery-icon", HaBatteryIcon); diff --git a/src/components/ha-related-items.ts b/src/components/ha-related-items.ts index 3e4df6d4e5..e056361c53 100644 --- a/src/components/ha-related-items.ts +++ b/src/components/ha-related-items.ts @@ -96,7 +96,6 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) { ${this.hass.localize(`component.${entry.domain}.title`)}: ${entry.title} @@ -116,10 +115,7 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) {

${this.hass.localize("ui.components.related-items.device")}:

-
+ ${device.name_by_user || device.name} `; @@ -137,7 +133,9 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) {

${this.hass.localize("ui.components.related-items.area")}:

- ${area.name} + + ${area.name} + `; }) : ""} @@ -290,10 +288,6 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) { fireEvent(this, "hass-more-info", { entityId }); } - private _close() { - fireEvent(this, "close-dialog"); - } - static get styles(): CSSResult { return css` a { diff --git a/src/panels/config/areas/ha-config-area-page.ts b/src/panels/config/areas/ha-config-area-page.ts index d77c073ff3..151ed75bb9 100644 --- a/src/panels/config/areas/ha-config-area-page.ts +++ b/src/panels/config/areas/ha-config-area-page.ts @@ -1,6 +1,4 @@ import "@material/mwc-button"; -import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable"; -import "@polymer/paper-input/paper-input"; import { css, CSSResult, @@ -14,7 +12,7 @@ import { ifDefined } from "lit-html/directives/if-defined"; import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import "../../../components/dialog/ha-paper-dialog"; +import "../../../components/ha-card"; import { AreaRegistryEntry, deleteAreaRegistryEntry, From 05d7b98ba0cb57c871d88cbba0b039a440cf844e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 18:19:08 +0200 Subject: [PATCH 51/58] Add icon to scenes (#6379) --- src/data/scene.ts | 1 + src/panels/config/scene/ha-scene-dashboard.ts | 8 + src/panels/config/scene/ha-scene-editor.ts | 279 ++++++++++-------- src/translations/en.json | 1 + 4 files changed, 165 insertions(+), 124 deletions(-) diff --git a/src/data/scene.ts b/src/data/scene.ts index c0245a4f24..6b029412c4 100644 --- a/src/data/scene.ts +++ b/src/data/scene.ts @@ -40,6 +40,7 @@ export interface SceneEntity extends HassEntityBase { export interface SceneConfig { name: string; + icon?: string; entities: SceneEntities; } diff --git a/src/panels/config/scene/ha-scene-dashboard.ts b/src/panels/config/scene/ha-scene-dashboard.ts index 1205108a92..51a2badf61 100644 --- a/src/panels/config/scene/ha-scene-dashboard.ts +++ b/src/panels/config/scene/ha-scene-dashboard.ts @@ -24,8 +24,10 @@ import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; import { showToast } from "../../../util/toast"; import { configSections } from "../ha-panel-config"; +import "../../../components/ha-icon"; import "../../../components/ha-svg-icon"; import { mdiPlus } from "@mdi/js"; +import { stateIcon } from "../../../common/entity/state_icon"; @customElement("ha-scene-dashboard") class HaSceneDashboard extends LitElement { @@ -44,6 +46,7 @@ class HaSceneDashboard extends LitElement { return { ...scene, name: computeStateName(scene), + icon: stateIcon(scene), }; }); }); @@ -66,6 +69,11 @@ class HaSceneDashboard extends LitElement { > `, }, + icon: { + title: "", + type: "icon", + template: (icon) => html` `, + }, name: { title: this.hass.localize( "ui.panel.config.scene.picker.headers.name" diff --git a/src/panels/config/scene/ha-scene-editor.ts b/src/panels/config/scene/ha-scene-editor.ts index 08f00562ef..89a46b3f20 100644 --- a/src/panels/config/scene/ha-scene-editor.ts +++ b/src/panels/config/scene/ha-scene-editor.ts @@ -23,6 +23,7 @@ import { computeRTL } from "../../../common/util/compute_rtl"; import "../../../components/device/ha-device-picker"; import "../../../components/entity/ha-entities-picker"; import "../../../components/ha-card"; +import "../../../components/ha-icon-input"; import "@material/mwc-fab"; import { computeDeviceName, @@ -87,7 +88,7 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { @property() private _errors?: string; - @property() private _config!: SceneConfig; + @property() private _config?: SceneConfig; @property() private _entities: string[] = []; @@ -210,115 +211,68 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { rtl: computeRTL(this.hass), })}" > - - ${!this.narrow ? html` ${name} ` : ""} -
- ${this.hass.localize("ui.panel.config.scene.editor.introduction")} -
- -
- -
-
-
- - -
- ${this.hass.localize( - "ui.panel.config.scene.editor.devices.header" - )} -
-
- ${this.hass.localize( - "ui.panel.config.scene.editor.devices.introduction" - )} -
- - ${devices.map( - (device) => - html` - -
- ${device.name} - -
- ${device.entities.map((entityId) => { - const entityStateObj = this.hass.states[entityId]; - if (!entityStateObj) { - return html``; - } - return html` - - - - ${computeStateName(entityStateObj)} - - - `; - })} -
- ` - )} - - -
- -
-
-
- - ${this.showAdvanced + ${this._config ? html` + + ${!this.narrow + ? html` ${name} ` + : ""} +
+ ${this.hass.localize( + "ui.panel.config.scene.editor.introduction" + )} +
+ +
+ + + +
+
+
+
${this.hass.localize( - "ui.panel.config.scene.editor.entities.header" + "ui.panel.config.scene.editor.devices.header" )}
${this.hass.localize( - "ui.panel.config.scene.editor.entities.introduction" + "ui.panel.config.scene.editor.devices.introduction" )}
- ${entities.length - ? html` - - ${entities.map((entityId) => { + + ${devices.map( + (device) => + html` + +
+ ${device.name} + +
+ ${device.entities.map((entityId) => { const entityStateObj = this.hass.states[entityId]; if (!entityStateObj) { return html``; @@ -336,41 +290,108 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { ${computeStateName(entityStateObj)} - `; })}
` - : ""} + )}
- ${this.hass.localize( - "ui.panel.config.scene.editor.entities.device_entities" - )} - + >
+ + ${this.showAdvanced + ? html` + +
+ ${this.hass.localize( + "ui.panel.config.scene.editor.entities.header" + )} +
+
+ ${this.hass.localize( + "ui.panel.config.scene.editor.entities.introduction" + )} +
+ ${entities.length + ? html` + + ${entities.map((entityId) => { + const entityStateObj = this.hass.states[ + entityId + ]; + if (!entityStateObj) { + return html``; + } + return html` + + + + ${computeStateName(entityStateObj)} + + + + `; + })} + + ` + : ""} + + +
+ ${this.hass.localize( + "ui.panel.config.scene.editor.entities.device_entities" + )} + +
+
+
+ ` + : ""} ` : ""}
@@ -587,11 +608,21 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { this._dirty = true; } - private _nameChanged(ev: CustomEvent) { - if (!this._config || this._config.name === ev.detail.value) { + private _valueChanged(ev: CustomEvent) { + ev.stopPropagation(); + const target = ev.target as any; + const name = target.name; + if (!name) { return; } - this._config.name = ev.detail.value; + let newVal = ev.detail.value; + if (target.type === "number") { + newVal = Number(newVal); + } + if ((this._config![name] || "") === newVal) { + return; + } + this._config = { ...this._config!, [name]: newVal }; this._dirty = true; } @@ -671,7 +702,7 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { private async _saveScene(): Promise { const id = !this.sceneId ? "" + Date.now() : this.sceneId!; - this._config = { ...this._config, entities: this._calculateStates() }; + this._config = { ...this._config!, entities: this._calculateStates() }; try { await saveScene(this.hass, id, this._config); this._dirty = false; diff --git a/src/translations/en.json b/src/translations/en.json index ea27d153e6..c6fb6c4a17 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1130,6 +1130,7 @@ "save": "Save", "unsaved_confirm": "You have unsaved changes. Are you sure you want to leave?", "name": "Name", + "icon": "Icon", "devices": { "header": "Devices", "introduction": "Add the devices that you want to be included in your scene. Set all the devices to the state you want for this scene.", From a48aa3c778e50a5b17ed05310e0f5b440f8f9880 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 18:19:42 +0200 Subject: [PATCH 52/58] Remove weblink and history_graph integrations (#6378) Closes #4941 --- gallery/src/data/demo_states.js | 21 --- src/cards/ha-history_graph-card.js | 131 ------------- src/common/const.ts | 10 +- src/common/entity/domain_icon.ts | 2 - src/data/entity.ts | 1 - src/data/ha-state-history-data.js | 178 ------------------ .../controls/more-info-history_graph.js | 33 ---- src/dialogs/more-info/ha-more-info-dialog.ts | 3 +- src/dialogs/more-info/more-info-content.ts | 1 - .../lovelace/cards/hui-history-graph-card.ts | 2 +- .../common/generate-lovelace-config.ts | 20 +- src/state-summary/state-card-content.js | 1 - src/state-summary/state-card-weblink.js | 61 ------ 13 files changed, 4 insertions(+), 460 deletions(-) delete mode 100644 src/cards/ha-history_graph-card.js delete mode 100644 src/data/ha-state-history-data.js delete mode 100644 src/dialogs/more-info/controls/more-info-history_graph.js delete mode 100644 src/state-summary/state-card-weblink.js diff --git a/gallery/src/data/demo_states.js b/gallery/src/data/demo_states.js index a00841ffc4..060ce56e29 100644 --- a/gallery/src/data/demo_states.js +++ b/gallery/src/data/demo_states.js @@ -420,15 +420,6 @@ export default { last_changed: "2018-07-19T10:44:46.105940+00:00", last_updated: "2018-07-19T10:44:46.105940+00:00", }, - "weblink.router": { - entity_id: "weblink.router", - state: "http://192.168.1.1", - attributes: { - friendly_name: "Router", - }, - last_changed: "2018-07-19T10:44:46.107286+00:00", - last_updated: "2018-07-19T10:44:46.107286+00:00", - }, "group.all_plants": { entity_id: "group.all_plants", state: "ok", @@ -1090,18 +1081,6 @@ export default { last_changed: "2018-07-19T10:44:46.510448+00:00", last_updated: "2018-07-19T10:44:46.510448+00:00", }, - "history_graph.recent_switches": { - entity_id: "history_graph.recent_switches", - state: "unknown", - attributes: { - hours_to_show: 1, - refresh: 60, - entity_id: ["switch.ac", "switch.decorative_lights"], - friendly_name: "Recent Switches", - }, - last_changed: "2018-07-19T10:44:46.512351+00:00", - last_updated: "2018-07-19T10:44:46.512351+00:00", - }, "scene.switch_on_and_off": { entity_id: "scene.switch_on_and_off", state: "scening", diff --git a/src/cards/ha-history_graph-card.js b/src/cards/ha-history_graph-card.js deleted file mode 100644 index 33e2472d82..0000000000 --- a/src/cards/ha-history_graph-card.js +++ /dev/null @@ -1,131 +0,0 @@ -import "@polymer/paper-card/paper-card"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { computeStateName } from "../common/entity/compute_state_name"; -import "../components/state-history-charts"; -import "../data/ha-state-history-data"; -import { EventsMixin } from "../mixins/events-mixin"; - -/* - * @appliesMixin EventsMixin - */ -class HaHistoryGraphCard extends EventsMixin(PolymerElement) { - static get template() { - return html` - - - -
[[computeTitle(stateObj)]]
-
- - -
-
- `; - } - - static get properties() { - return { - hass: Object, - stateObj: { - type: Object, - observer: "stateObjObserver", - }, - inDialog: { - type: Boolean, - value: false, - }, - stateHistory: Object, - stateHistoryLoading: Boolean, - cacheConfig: { - type: Object, - value: { - refresh: 0, - cacheKey: null, - hoursToShow: 24, - }, - }, - }; - } - - stateObjObserver(stateObj) { - if (!stateObj) return; - if ( - this.cacheConfig.cacheKey !== stateObj.entity_id || - this.cacheConfig.refresh !== (stateObj.attributes.refresh || 0) || - this.cacheConfig.hoursToShow !== (stateObj.attributes.hours_to_show || 24) - ) { - this.cacheConfig = { - refresh: stateObj.attributes.refresh || 0, - cacheKey: stateObj.entity_id, - hoursToShow: stateObj.attributes.hours_to_show || 24, - }; - } - } - - computeTitle(stateObj) { - return computeStateName(stateObj); - } - - computeContentClass(inDialog) { - return inDialog ? "" : "content"; - } - - computeHistoryEntities(stateObj) { - return stateObj.attributes.entity_id; - } - - computeElevation(inDialog) { - return inDialog ? 0 : 1; - } - - cardTapped(ev) { - const mq = window.matchMedia("(min-width: 610px) and (min-height: 550px)"); - if (mq.matches) { - ev.stopPropagation(); - this.fire("hass-more-info", { entityId: this.stateObj.entity_id }); - } - } -} -customElements.define("ha-history_graph-card", HaHistoryGraphCard); diff --git a/src/common/const.ts b/src/common/const.ts index b801ae37fc..dc2bf20595 100644 --- a/src/common/const.ts +++ b/src/common/const.ts @@ -22,7 +22,6 @@ export const DOMAINS_WITH_CARD = [ "timer", "vacuum", "water_heater", - "weblink", ]; /** Domains with separate more info dialog. */ @@ -36,7 +35,6 @@ export const DOMAINS_WITH_MORE_INFO = [ "cover", "fan", "group", - "history_graph", "humidifier", "input_datetime", "light", @@ -58,16 +56,10 @@ export const DOMAINS_HIDE_MORE_INFO = [ "input_select", "input_text", "scene", - "weblink", ]; /** Domains that should have the history hidden in the more info dialog. */ -export const DOMAINS_MORE_INFO_NO_HISTORY = [ - "camera", - "configurator", - "history_graph", - "scene", -]; +export const DOMAINS_MORE_INFO_NO_HISTORY = ["camera", "configurator", "scene"]; /** States that we consider "off". */ export const STATES_OFF = ["closed", "locked", "off"]; diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts index 866b3a5afc..82b8795454 100644 --- a/src/common/entity/domain_icon.ts +++ b/src/common/entity/domain_icon.ts @@ -20,7 +20,6 @@ const fixedIcons = { fan: "hass:fan", google_assistant: "hass:google-assistant", group: "hass:google-circles-communities", - history_graph: "hass:chart-line", homeassistant: "hass:home-assistant", homekit: "hass:home-automation", humidifier: "hass:air-humidifier", @@ -49,7 +48,6 @@ const fixedIcons = { vacuum: "hass:robot-vacuum", water_heater: "hass:thermometer", weather: "hass:weather-cloudy", - weblink: "hass:open-in-new", zone: "hass:map-marker-radius", }; diff --git a/src/data/entity.ts b/src/data/entity.ts index 80f4e7c820..f8dc2efe42 100644 --- a/src/data/entity.ts +++ b/src/data/entity.ts @@ -17,7 +17,6 @@ export const ENTITY_COMPONENT_DOMAINS = [ "fan", "geo_location", "group", - "history_graph", "image_processing", "input_boolean", "input_datetime", diff --git a/src/data/ha-state-history-data.js b/src/data/ha-state-history-data.js deleted file mode 100644 index bcce4509f8..0000000000 --- a/src/data/ha-state-history-data.js +++ /dev/null @@ -1,178 +0,0 @@ -import { timeOut } from "@polymer/polymer/lib/utils/async"; -import { Debouncer } from "@polymer/polymer/lib/utils/debounce"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import LocalizeMixin from "../mixins/localize-mixin"; -import { getRecent, getRecentWithCache } from "./cached-history"; -import { computeHistory, fetchDate } from "./history"; - -/* - * @appliesMixin LocalizeMixin - */ -class HaStateHistoryData extends LocalizeMixin(PolymerElement) { - static get properties() { - return { - hass: { - type: Object, - observer: "hassChanged", - }, - - filterType: String, - - cacheConfig: Object, - - startTime: Date, - endTime: Date, - - entityId: String, - - isLoading: { - type: Boolean, - value: true, - readOnly: true, - notify: true, - }, - - data: { - type: Object, - value: null, - readOnly: true, - notify: true, - }, - }; - } - - static get observers() { - return [ - "filterChangedDebouncer(filterType, entityId, startTime, endTime, cacheConfig, localize)", - ]; - } - - connectedCallback() { - super.connectedCallback(); - this.filterChangedDebouncer( - this.filterType, - this.entityId, - this.startTime, - this.endTime, - this.cacheConfig, - this.localize - ); - } - - disconnectedCallback() { - if (this._refreshTimeoutId) { - window.clearInterval(this._refreshTimeoutId); - this._refreshTimeoutId = null; - } - super.disconnectedCallback(); - } - - hassChanged(newHass, oldHass) { - if (!oldHass && !this._madeFirstCall) { - this.filterChangedDebouncer( - this.filterType, - this.entityId, - this.startTime, - this.endTime, - this.cacheConfig, - this.localize - ); - } - } - - filterChangedDebouncer(...args) { - this._debounceFilterChanged = Debouncer.debounce( - this._debounceFilterChanged, - timeOut.after(0), - () => { - this.filterChanged(...args); - } - ); - } - - filterChanged( - filterType, - entityId, - startTime, - endTime, - cacheConfig, - localize - ) { - if (!this.hass) { - return; - } - if (cacheConfig && !cacheConfig.cacheKey) { - return; - } - if (!localize) { - return; - } - this._madeFirstCall = true; - const language = this.hass.language; - let data; - - if (filterType === "date") { - if (!startTime || !endTime) return; - - data = fetchDate(this.hass, startTime, endTime).then((dateHistory) => - computeHistory(this.hass, dateHistory, localize, language) - ); - } else if (filterType === "recent-entity") { - if (!entityId) return; - if (cacheConfig) { - data = this.getRecentWithCacheRefresh( - entityId, - cacheConfig, - localize, - language - ); - } else { - data = getRecent( - this.hass, - entityId, - startTime, - endTime, - localize, - language - ); - } - } else { - return; - } - this._setIsLoading(true); - - data.then((stateHistory) => { - this._setData(stateHistory); - this._setIsLoading(false); - }); - } - - getRecentWithCacheRefresh(entityId, cacheConfig, localize, language) { - if (this._refreshTimeoutId) { - window.clearInterval(this._refreshTimeoutId); - this._refreshTimeoutId = null; - } - if (cacheConfig.refresh) { - this._refreshTimeoutId = window.setInterval(() => { - getRecentWithCache( - this.hass, - entityId, - cacheConfig, - localize, - language - ).then((stateHistory) => { - this._setData({ ...stateHistory }); - }); - }, cacheConfig.refresh * 1000); - } - return getRecentWithCache( - this.hass, - entityId, - cacheConfig, - localize, - language - ); - } -} -customElements.define("ha-state-history-data", HaStateHistoryData); diff --git a/src/dialogs/more-info/controls/more-info-history_graph.js b/src/dialogs/more-info/controls/more-info-history_graph.js deleted file mode 100644 index febd00b62f..0000000000 --- a/src/dialogs/more-info/controls/more-info-history_graph.js +++ /dev/null @@ -1,33 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../../../cards/ha-history_graph-card"; -import "../../../components/ha-attributes"; - -class MoreInfoHistoryGraph extends PolymerElement { - static get template() { - return html` - - - - - `; - } - - static get properties() { - return { - hass: Object, - stateObj: Object, - }; - } -} -customElements.define("more-info-history_graph", MoreInfoHistoryGraph); diff --git a/src/dialogs/more-info/ha-more-info-dialog.ts b/src/dialogs/more-info/ha-more-info-dialog.ts index 97fcf8a565..fb68cc7eec 100644 --- a/src/dialogs/more-info/ha-more-info-dialog.ts +++ b/src/dialogs/more-info/ha-more-info-dialog.ts @@ -29,7 +29,7 @@ import { computeDomain } from "../../common/entity/compute_domain"; import { mdiClose, mdiCog, mdiPencil } from "@mdi/js"; import { HistoryResult } from "../../data/history"; -const DOMAINS_NO_INFO = ["camera", "configurator", "history_graph"]; +const DOMAINS_NO_INFO = ["camera", "configurator"]; const EDITABLE_DOMAINS_WITH_ID = ["scene", "automation"]; const EDITABLE_DOMAINS = ["script"]; @@ -288,7 +288,6 @@ export class MoreInfoDialog extends LitElement { width: auto; } - ha-dialog[data-domain="history_graph"] .content, :host([large]) .content { width: calc(90vw - 48px); } diff --git a/src/dialogs/more-info/more-info-content.ts b/src/dialogs/more-info/more-info-content.ts index ceee8e630f..2038fb014b 100644 --- a/src/dialogs/more-info/more-info-content.ts +++ b/src/dialogs/more-info/more-info-content.ts @@ -13,7 +13,6 @@ import "./controls/more-info-cover"; import "./controls/more-info-default"; import "./controls/more-info-fan"; import "./controls/more-info-group"; -import "./controls/more-info-history_graph"; import "./controls/more-info-humidifier"; import "./controls/more-info-input_datetime"; import "./controls/more-info-light"; diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index f0c992e30c..cfd81c79a5 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -148,7 +148,7 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { } private async _getStateHistory(): Promise { - this._stateHistory = getRecentWithCache( + this._stateHistory = await getRecentWithCache( this.hass!, this._cacheConfig!.cacheKey, this._cacheConfig!, diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index cc6b24611c..b5301d37f9 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -43,7 +43,7 @@ import { ThermostatCardConfig, } from "../cards/types"; import { processEditorEntities } from "../editor/process-editor-entities"; -import { LovelaceRowConfig, WeblinkConfig } from "../entity-rows/types"; +import { LovelaceRowConfig } from "../entity-rows/types"; const DEFAULT_VIEW_ENTITY_ID = "group.default_view"; const DOMAINS_BADGES = [ @@ -143,15 +143,6 @@ export const computeCards = ( entity: entityId, }; cards.push(cardConfig); - } else if (domain === "history_graph" && stateObj) { - const cardConfig = { - type: "history-graph", - entities: stateObj.attributes.entity_id, - hours_to_show: stateObj.attributes.hours_to_show, - title: stateObj.attributes.friendly_name, - refresh_interval: stateObj.attributes.refresh, - }; - cards.push(cardConfig); } else if (domain === "humidifier") { const cardConfig: HumidifierCardConfig = { type: "humidifier", @@ -182,15 +173,6 @@ export const computeCards = ( entity: entityId, }; cards.push(cardConfig); - } else if (domain === "weblink" && stateObj) { - const conf: WeblinkConfig = { - type: "weblink", - url: stateObj.state, - }; - if ("icon" in stateObj.attributes) { - conf.icon = stateObj.attributes.icon; - } - entities.push(conf); } else if ( domain === "sensor" && stateObj?.attributes.device_class === SENSOR_DEVICE_CLASS_BATTERY diff --git a/src/state-summary/state-card-content.js b/src/state-summary/state-card-content.js index 22375c13f7..026b6287cb 100644 --- a/src/state-summary/state-card-content.js +++ b/src/state-summary/state-card-content.js @@ -17,7 +17,6 @@ import "./state-card-timer"; import "./state-card-toggle"; import "./state-card-vacuum"; import "./state-card-water_heater"; -import "./state-card-weblink"; class StateCardContent extends PolymerElement { static get properties() { diff --git a/src/state-summary/state-card-weblink.js b/src/state-summary/state-card-weblink.js deleted file mode 100644 index aeb233b61f..0000000000 --- a/src/state-summary/state-card-weblink.js +++ /dev/null @@ -1,61 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import { computeStateName } from "../common/entity/compute_state_name"; -import "../components/entity/state-badge"; - -class StateCardWeblink extends PolymerElement { - static get template() { - return html` - - - ${this.stateBadgeTemplate} - [[_computeStateName(stateObj)]] - `; - } - - static get stateBadgeTemplate() { - return html` `; - } - - static get properties() { - return { - stateObj: Object, - inDialog: { - type: Boolean, - value: false, - }, - }; - } - - ready() { - super.ready(); - this.addEventListener("click", (ev) => this.onTap(ev)); - } - - _computeStateName(stateObj) { - return computeStateName(stateObj); - } - - onTap(ev) { - ev.stopPropagation(); - ev.preventDefault(); - window.open(this.stateObj.state, "_blank"); - } -} -customElements.define("state-card-weblink", StateCardWeblink); From 98656b004450d5d9a6c9cbcb72926715773e6723 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 18:20:15 +0200 Subject: [PATCH 53/58] Little clean up (#6377) --- src/components/ha-card.ts | 2 +- src/entrypoints/app.ts | 2 -- src/panels/config/cloud/alexa/cloud-alexa.ts | 2 +- .../config/cloud/google-assistant/cloud-google-assistant.ts | 2 +- src/panels/lovelace/cards/hui-alarm-panel-card.ts | 2 +- src/panels/lovelace/editor/card-editor/hui-card-picker.ts | 2 +- src/resources/styles.ts | 2 +- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/ha-card.ts b/src/components/ha-card.ts index 9d48bca2cb..8b2cbd8292 100644 --- a/src/components/ha-card.ts +++ b/src/components/ha-card.ts @@ -19,7 +19,7 @@ class HaCard extends LitElement { :host { background: var( --ha-card-background, - var(--paper-card-background-color, white) + var(--card-background-color, white) ); border-radius: var(--ha-card-border-radius, 4px); box-shadow: var( diff --git a/src/entrypoints/app.ts b/src/entrypoints/app.ts index 934affb498..bb4b54b6e7 100644 --- a/src/entrypoints/app.ts +++ b/src/entrypoints/app.ts @@ -5,8 +5,6 @@ import "../layouts/home-assistant"; import "../util/legacy-support"; setPassiveTouchGestures(true); -/* LastPass createElement workaround. See #428 */ -document.createElement = Document.prototype.createElement; (window as any).frontendVersion = __VERSION__; diff --git a/src/panels/config/cloud/alexa/cloud-alexa.ts b/src/panels/config/cloud/alexa/cloud-alexa.ts index 5a3ae1ebd2..277d0022d4 100644 --- a/src/panels/config/cloud/alexa/cloud-alexa.ts +++ b/src/panels/config/cloud/alexa/cloud-alexa.ts @@ -323,7 +323,7 @@ class CloudAlexa extends LitElement { color: var(--primary-text-color); background-color: var( --ha-card-background, - var(--paper-card-background-color, white) + var(--card-background-color, white) ); padding: 16px 8px; text-align: center; 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 84e3c77d1c..ea09102aea 100644 --- a/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts +++ b/src/panels/config/cloud/google-assistant/cloud-google-assistant.ts @@ -361,7 +361,7 @@ class CloudGoogleAssistant extends LitElement { color: var(--primary-text-color); background-color: var( --ha-card-background, - var(--paper-card-background-color, white) + var(--card-background-color, white) ); padding: 16px 8px; text-align: center; diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts index bcb4343481..8fa590cf8f 100644 --- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts +++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts @@ -280,7 +280,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard { ha-label-badge { --ha-label-badge-color: var(--alarm-state-color); --label-badge-text-color: var(--alarm-state-color); - --label-badge-background-color: var(--paper-card-background-color); + --label-badge-background-color: var(--card-background-color); color: var(--alarm-state-color); position: absolute; right: 12px; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index ab87b56caa..e9dab6492d 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -266,7 +266,7 @@ export class HuiCardPicker extends LitElement { text-align: center; background: var( --ha-card-background, - var(--paper-card-background-color, white) + var(--card-background-color, white) ); border-radius: 0 0 4px 4px; border-bottom: 1px solid var(--divider-color); diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 9eeeb4821d..6cd52a0db8 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -21,7 +21,6 @@ export const derivedStyles = { "label-badge-grey": "var(--paper-grey-500)", "label-badge-background-color": "var(--card-background-color)", "label-badge-text-color": "rgba(var(--rgb-primary-text-color), 0.8)", - "paper-card-background-color": "var(--card-background-color)", "paper-listbox-background-color": "var(--card-background-color)", "paper-item-icon-color": "var(--state-icon-color)", "paper-item-icon-active-color": "var(--state-icon-active-color)", @@ -49,6 +48,7 @@ export const derivedStyles = { "material-secondary-background-color": "var(--secondary-background-color)", "mdc-checkbox-unchecked-color": "rgba(var(--rgb-primary-text-color), 0.54)", "mdc-checkbox-disabled-color": "var(--disabled-text-color)", + "mdc-tab-text-label-color-default": "var(--primary-text-color)", }; export const haStyle = css` From e70a3e09bfe09d493f2c5fede0cacf261b36a5df Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 19:48:11 +0200 Subject: [PATCH 54/58] Change UI of script entities (#6371) --- src/data/script.ts | 20 +++++ src/panels/config/script/ha-script-editor.ts | 5 +- .../entity-rows/hui-script-entity-row.ts | 60 +++++++++------ src/state-summary/state-card-script.js | 74 ------------------ src/state-summary/state-card-script.ts | 77 +++++++++++++++++++ src/translations/en.json | 4 +- 6 files changed, 138 insertions(+), 102 deletions(-) delete mode 100644 src/state-summary/state-card-script.js create mode 100644 src/state-summary/state-card-script.ts diff --git a/src/data/script.ts b/src/data/script.ts index 5fdbbcfa46..81f8292f24 100644 --- a/src/data/script.ts +++ b/src/data/script.ts @@ -7,9 +7,15 @@ import { navigate } from "../common/navigate"; import { HomeAssistant } from "../types"; import { Condition } from "./automation"; +export const MODES = ["single", "restart", "queued", "parallel"]; +export const MODES_MAX = ["queued", "parallel"]; + export interface ScriptEntity extends HassEntityBase { attributes: HassEntityAttributeBase & { last_triggered: string; + mode: "single" | "restart" | "queued" | "parallel"; + current?: number; + max?: number; }; } @@ -66,6 +72,20 @@ export const triggerScript = ( variables?: {} ) => hass.callService("script", computeObjectId(entityId), variables); +export const canExcecute = (state: ScriptEntity) => { + if (state.state === "off") { + return true; + } + if ( + state.state === "on" && + MODES_MAX.includes(state.attributes.mode) && + state.attributes.current! < state.attributes.max! + ) { + return true; + } + return false; +}; + export const deleteScript = (hass: HomeAssistant, objectId: string) => hass.callApi("DELETE", `config/script/config/${objectId}`); diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index be5422de69..68f334383a 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -22,6 +22,8 @@ import { deleteScript, getScriptEditorInitData, ScriptConfig, + MODES, + MODES_MAX, } from "../../../data/script"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import "../../../layouts/ha-app-layout"; @@ -35,9 +37,6 @@ import "../../../components/ha-svg-icon"; import { mdiContentSave } from "@mdi/js"; import { PaperListboxElement } from "@polymer/paper-listbox"; -const MODES = ["single", "restart", "queued", "parallel"]; -const MODES_MAX = ["queued", "parallel"]; - export class HaScriptEditor extends LitElement { @property() public hass!: HomeAssistant; diff --git a/src/panels/lovelace/entity-rows/hui-script-entity-row.ts b/src/panels/lovelace/entity-rows/hui-script-entity-row.ts index 1105b6216e..06a49f68c1 100644 --- a/src/panels/lovelace/entity-rows/hui-script-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-script-entity-row.ts @@ -9,17 +9,17 @@ import { PropertyValues, TemplateResult, } from "lit-element"; -import "../../../components/entity/ha-entity-toggle"; import { UNAVAILABLE_STATES } from "../../../data/entity"; import { HomeAssistant } from "../../../types"; import { hasConfigOrEntityChanged } from "../common/has-changed"; import "../components/hui-generic-entity-row"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import { ActionRowConfig, LovelaceRow } from "./types"; +import { canExcecute, ScriptEntity } from "../../../data/script"; @customElement("hui-script-entity-row") class HuiScriptEntityRow extends LitElement implements LovelaceRow { - public hass?: HomeAssistant; + @property() public hass?: HomeAssistant; @property() private _config?: ActionRowConfig; @@ -39,7 +39,7 @@ class HuiScriptEntityRow extends LitElement implements LovelaceRow { return html``; } - const stateObj = this.hass.states[this._config.entity]; + const stateObj = this.hass.states[this._config.entity] as ScriptEntity; if (!stateObj) { return html` @@ -51,39 +51,51 @@ class HuiScriptEntityRow extends LitElement implements LovelaceRow { return html` - ${stateObj.attributes.can_cancel - ? html` - - ` - : html` - - ${this._config.action_name || - this.hass!.localize("ui.card.script.execute")} - - `} + ${stateObj.state === "on" + ? html` + ${(stateObj.attributes.current || 0) > 0 + ? this.hass.localize( + "ui.card.script.cancel_multiple", + "number", + stateObj.attributes.current + ) + : this.hass.localize("ui.card.script.cancel")} + ` + : ""} + ${stateObj.state === "off" || stateObj.attributes.max + ? html` + ${this._config.action_name || + this.hass!.localize("ui.card.script.execute")} + ` + : ""} `; } static get styles(): CSSResult { return css` - mwc-button { + mwc-button:last-child { margin-right: -0.57em; } `; } - private _callService(ev): void { + private _cancelScript(ev): void { ev.stopPropagation(); - this.hass!.callService("script", "turn_on", { + this._callService("turn_off"); + } + + private _executeScript(ev): void { + ev.stopPropagation(); + this._callService("turn_on"); + } + + private _callService(service: string): void { + this.hass!.callService("script", service, { entity_id: this._config!.entity, }); } diff --git a/src/state-summary/state-card-script.js b/src/state-summary/state-card-script.js deleted file mode 100644 index 462467b363..0000000000 --- a/src/state-summary/state-card-script.js +++ /dev/null @@ -1,74 +0,0 @@ -import "@material/mwc-button"; -import "@polymer/iron-flex-layout/iron-flex-layout-classes"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -/* eslint-plugin-disable lit */ -import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "../components/entity/ha-entity-toggle"; -import "../components/entity/state-info"; -import LocalizeMixin from "../mixins/localize-mixin"; - -/* - * @appliesMixin LocalizeMixin - */ -class StateCardScript extends LocalizeMixin(PolymerElement) { - static get template() { - return html` - - - -
- ${this.stateInfoTemplate} - - -
- `; - } - - static get stateInfoTemplate() { - return html` - - `; - } - - static get properties() { - return { - hass: Object, - stateObj: Object, - inDialog: { - type: Boolean, - value: false, - }, - }; - } - - fireScript(ev) { - ev.stopPropagation(); - this.hass.callService("script", "turn_on", { - entity_id: this.stateObj.entity_id, - }); - } -} -customElements.define("state-card-script", StateCardScript); diff --git a/src/state-summary/state-card-script.ts b/src/state-summary/state-card-script.ts new file mode 100644 index 0000000000..da04bff86a --- /dev/null +++ b/src/state-summary/state-card-script.ts @@ -0,0 +1,77 @@ +import "@material/mwc-button"; +import "../components/entity/ha-entity-toggle"; +import "../components/entity/state-info"; +import { HomeAssistant } from "../types"; +import { + html, + customElement, + LitElement, + property, + CSSResult, +} from "lit-element"; +import { HassEntity } from "home-assistant-js-websocket"; +import { haStyle } from "../resources/styles"; +import { UNAVAILABLE_STATES } from "../data/entity"; +import { canExcecute, ScriptEntity } from "../data/script"; + +@customElement("state-card-script") +export class StateCardScript extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public stateObj!: HassEntity; + + @property({ type: Boolean }) public inDialog = false; + + protected render() { + const stateObj = this.stateObj as ScriptEntity; + return html` +
+ + ${stateObj.state === "on" + ? html` + ${(stateObj.attributes.current || 0) > 0 + ? this.hass.localize( + "ui.card.script.cancel_multiple", + "number", + stateObj.attributes.current + ) + : this.hass.localize("ui.card.script.cancel")} + ` + : ""} + ${stateObj.state === "off" || stateObj.attributes.max + ? html` + ${this.hass!.localize("ui.card.script.execute")} + ` + : ""} +
+ `; + } + + private _cancelScript(ev: Event) { + ev.stopPropagation(); + this._callService("turn_off"); + } + + private _executeScript(ev: Event) { + ev.stopPropagation(); + this._callService("turn_on"); + } + + private _callService(service: string): void { + this.hass.callService("script", service, { + entity_id: this.stateObj.entity_id, + }); + } + + static get styles(): CSSResult { + return haStyle; + } +} diff --git a/src/translations/en.json b/src/translations/en.json index c6fb6c4a17..9010307a42 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -188,7 +188,9 @@ "activate": "Activate" }, "script": { - "execute": "Execute" + "execute": "Execute", + "cancel": "Cancel", + "cancel_multiple": "Cancel {number}" }, "service": { "run": "Run" From d1dd8231cd4c28406ad87522fccebc3d98108181 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 21:58:24 +0200 Subject: [PATCH 55/58] Allow to set an id and icon when creating new script (#6373) Co-authored-by: Paulus Schoutsen --- src/common/string/slugify.ts | 16 ++--- src/data/script.ts | 1 + src/panels/config/script/ha-script-editor.ts | 70 ++++++++++++++++++-- src/panels/config/script/ha-script-picker.ts | 7 ++ src/translations/en.json | 4 ++ 5 files changed, 85 insertions(+), 13 deletions(-) diff --git a/src/common/string/slugify.ts b/src/common/string/slugify.ts index 05c6f3352c..a5f0c134cb 100644 --- a/src/common/string/slugify.ts +++ b/src/common/string/slugify.ts @@ -1,19 +1,19 @@ // https://gist.github.com/hagemann/382adfc57adbd5af078dc93feef01fe1 -export const slugify = (value: string) => { +export const slugify = (value: string, delimiter = "-") => { const a = "àáäâãåăæąçćčđďèéěėëêęğǵḧìíïîįłḿǹńňñòóöôœøṕŕřßşśšșťțùúüûǘůűūųẃẍÿýźžż·/_,:;"; - const b = - "aaaaaaaaacccddeeeeeeegghiiiiilmnnnnooooooprrsssssttuuuuuuuuuwxyyzzz------"; + const b = `aaaaaaaaacccddeeeeeeegghiiiiilmnnnnooooooprrsssssttuuuuuuuuuwxyyzzz${delimiter}${delimiter}${delimiter}${delimiter}${delimiter}${delimiter}`; const p = new RegExp(a.split("").join("|"), "g"); return value .toString() .toLowerCase() - .replace(/\s+/g, "-") // Replace spaces with - + .replace(/\s+/g, delimiter) // Replace spaces with delimiter .replace(p, (c) => b.charAt(a.indexOf(c))) // Replace special characters - .replace(/&/g, "-and-") // Replace & with 'and' + .replace(/&/g, `${delimiter}and${delimiter}`) // Replace & with 'and' .replace(/[^\w-]+/g, "") // Remove all non-word characters - .replace(/--+/g, "-") // Replace multiple - with single - - .replace(/^-+/, "") // Trim - from start of text - .replace(/-+$/, ""); // Trim - from end of text + .replace(/-/, delimiter) // Replace - with delimiter + .replace(new RegExp(`/${delimiter}${delimiter}+/`, "g"), delimiter) // Replace multiple delimiters with single delimiter + .replace(new RegExp(`/^${delimiter}+/`), "") // Trim delimiter from start of text + .replace(new RegExp(`/-+$/`), ""); // Trim delimiter from end of text }; diff --git a/src/data/script.ts b/src/data/script.ts index 81f8292f24..2a2cf1912c 100644 --- a/src/data/script.ts +++ b/src/data/script.ts @@ -22,6 +22,7 @@ export interface ScriptEntity extends HassEntityBase { export interface ScriptConfig { alias: string; sequence: Action[]; + icon?: string; mode?: "single" | "restart" | "queued" | "parallel"; max?: number; } diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index 68f334383a..4617f1a01b 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -10,12 +10,14 @@ import { property, PropertyValues, TemplateResult, + internalProperty, } from "lit-element"; import { classMap } from "lit-html/directives/class-map"; import { computeObjectId } from "../../../common/entity/compute_object_id"; import { navigate } from "../../../common/navigate"; import { computeRTL } from "../../../common/util/compute_rtl"; import "../../../components/ha-card"; +import "../../../components/ha-icon-input"; import "@material/mwc-fab"; import { Action, @@ -36,6 +38,7 @@ import { configSections } from "../ha-panel-config"; import "../../../components/ha-svg-icon"; import { mdiContentSave } from "@mdi/js"; import { PaperListboxElement } from "@polymer/paper-listbox"; +import { slugify } from "../../../common/string/slugify"; export class HaScriptEditor extends LitElement { @property() public hass!: HomeAssistant; @@ -48,11 +51,15 @@ export class HaScriptEditor extends LitElement { @property() public narrow!: boolean; - @property() private _config?: ScriptConfig; + @internalProperty() private _config?: ScriptConfig; - @property() private _dirty?: boolean; + @internalProperty() private _entityId?: string; - @property() private _errors?: string; + @internalProperty() private _idError = false; + + @internalProperty() private _dirty?: boolean; + + @internalProperty() private _errors?: string; protected render(): TemplateResult { return html` @@ -107,9 +114,32 @@ export class HaScriptEditor extends LitElement { name="alias" .value=${this._config.alias} @value-changed=${this._valueChanged} + @change=${this._aliasChanged} > - + + + ${!this.scriptEntityId + ? html` + ` + : ""}

${this.hass.localize( "ui.panel.config.script.editor.modes.description", @@ -283,6 +313,30 @@ export class HaScriptEditor extends LitElement { this._dirty = true; } + private _aliasChanged(ev: CustomEvent) { + if (this.scriptEntityId || this._entityId) { + return; + } + const aliasSlugify = slugify((ev.target as any).value, "_"); + let id = aliasSlugify; + let i = 2; + while (this.hass.states[`script.${id}`]) { + id = `${aliasSlugify}_${i}`; + i++; + } + this._entityId = id; + } + + private _idChanged(ev: CustomEvent) { + ev.stopPropagation(); + this._entityId = (ev.target as any).value; + if (this.hass.states[`script.${this._entityId}`]) { + this._idError = true; + } else { + this._idError = false; + } + } + private _valueChanged(ev: CustomEvent) { ev.stopPropagation(); const target = ev.target as any; @@ -337,9 +391,15 @@ export class HaScriptEditor extends LitElement { } private _saveScript(): void { + if (this._idError) { + this._errors = this.hass.localize( + "ui.panel.config.script.editor.id_already_exists_save_error" + ); + return; + } const id = this.scriptEntityId ? computeObjectId(this.scriptEntityId) - : Date.now(); + : this._entityId || Date.now(); this.hass!.callApi("POST", "config/script/config/" + id, this._config).then( () => { this._dirty = false; diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index 8fba4004ba..7135a80db0 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -25,6 +25,7 @@ import { showToast } from "../../../util/toast"; import { configSections } from "../ha-panel-config"; import "../../../components/ha-svg-icon"; import { mdiPlus } from "@mdi/js"; +import { stateIcon } from "../../../common/entity/state_icon"; @customElement("ha-script-picker") class HaScriptPicker extends LitElement { @@ -43,6 +44,7 @@ class HaScriptPicker extends LitElement { return { ...script, name: computeStateName(script), + icon: stateIcon(script), }; }); }); @@ -65,6 +67,11 @@ class HaScriptPicker extends LitElement { > `, }, + icon: { + title: "", + type: "icon", + template: (icon) => html` `, + }, name: { title: this.hass.localize( "ui.panel.config.script.picker.headers.name" diff --git a/src/translations/en.json b/src/translations/en.json index 9010307a42..cd2f1eb8a9 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1080,6 +1080,10 @@ }, "editor": { "alias": "Name", + "icon": "Icon", + "id": "Entity ID", + "id_already_exists_save_error": "You can't save this script because the ID is not unique, pick another ID or leave it blank to automatically generate one.", + "id_already_exists": "This ID already exists", "introduction": "Use scripts to execute a sequence of actions.", "header": "Script: {name}", "default_name": "New Script", From 90e14762e36b42bd64c40ef26443d01c48bbfdef Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 21:58:40 +0200 Subject: [PATCH 56/58] Fix double toolbars on error/loading in dev tools (#6380) --- cast/src/launcher/layout/hc-cast.ts | 4 +- cast/src/launcher/layout/hc-connect.ts | 4 +- hassio/src/addon-store/hassio-addon-store.ts | 4 +- .../hassio-addon-documentation-tab.ts | 4 +- hassio/src/system/hassio-supervisor-log.ts | 4 +- src/layouts/hass-error-screen.ts | 49 +++++++++++++---- src/layouts/hass-loading-screen.ts | 52 +++++++++++++------ src/layouts/hass-router-page.ts | 12 +++-- src/layouts/hass-subpage.ts | 5 +- src/layouts/loading-screen.ts | 33 ------------ .../developer-tools/developer-tools-router.ts | 12 +++++ .../ha-panel-developer-tools.ts | 10 ++-- 12 files changed, 115 insertions(+), 78 deletions(-) delete mode 100644 src/layouts/loading-screen.ts diff --git a/cast/src/launcher/layout/hc-cast.ts b/cast/src/launcher/layout/hc-cast.ts index 099c7f70be..32139fa557 100644 --- a/cast/src/launcher/layout/hc-cast.ts +++ b/cast/src/launcher/layout/hc-cast.ts @@ -28,7 +28,7 @@ import { getLovelaceCollection, LovelaceConfig, } from "../../../../src/data/lovelace"; -import "../../../../src/layouts/loading-screen"; +import "../../../../src/layouts/hass-loading-screen"; import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config"; import "./hc-layout"; import "@material/mwc-button/mwc-button"; @@ -47,7 +47,7 @@ class HcCast extends LitElement { protected render(): TemplateResult { if (this.lovelaceConfig === undefined) { - return html` > `; + return html` > `; } const error = diff --git a/cast/src/launcher/layout/hc-connect.ts b/cast/src/launcher/layout/hc-connect.ts index 048a69f403..2aa72385e9 100644 --- a/cast/src/launcher/layout/hc-connect.ts +++ b/cast/src/launcher/layout/hc-connect.ts @@ -27,7 +27,7 @@ import { saveTokens, } from "../../../../src/common/auth/token_storage"; import "../../../../src/components/ha-icon"; -import "../../../../src/layouts/loading-screen"; +import "../../../../src/layouts/hass-loading-screen"; import { registerServiceWorker } from "../../../../src/util/register-service-worker"; import "./hc-layout"; @@ -98,7 +98,7 @@ export class HcConnect extends LitElement { } if (this.castManager === undefined || this.loading) { - return html` `; + return html` `; } if (this.castManager === null) { diff --git a/hassio/src/addon-store/hassio-addon-store.ts b/hassio/src/addon-store/hassio-addon-store.ts index 80f210b6e3..88dfb115c6 100644 --- a/hassio/src/addon-store/hassio-addon-store.ts +++ b/hassio/src/addon-store/hassio-addon-store.ts @@ -19,7 +19,7 @@ import { reloadHassioAddons, } from "../../../src/data/hassio/addon"; import "../../../src/layouts/hass-tabs-subpage"; -import "../../../src/layouts/loading-screen"; +import "../../../src/layouts/hass-loading-screen"; import { HomeAssistant, Route } from "../../../src/types"; import { showRepositoriesDialog } from "../dialogs/repositories/show-dialog-repositories"; import { supervisorTabs } from "../hassio-tabs"; @@ -108,7 +108,7 @@ class HassioAddonStore extends LitElement { ${repos.length === 0 - ? html`` + ? html`` : html`

diff --git a/hassio/src/system/hassio-supervisor-log.ts b/hassio/src/system/hassio-supervisor-log.ts index af3b94665d..d9f3218a7a 100644 --- a/hassio/src/system/hassio-supervisor-log.ts +++ b/hassio/src/system/hassio-supervisor-log.ts @@ -13,7 +13,7 @@ import { } from "lit-element"; import "../../../src/components/ha-card"; import { fetchHassioLogs } from "../../../src/data/hassio/supervisor"; -import "../../../src/layouts/loading-screen"; +import "../../../src/layouts/hass-loading-screen"; import { haStyle } from "../../../src/resources/styles"; import { HomeAssistant } from "../../../src/types"; import "../components/hassio-ansi-to-html"; @@ -98,7 +98,7 @@ class HassioSupervisorLog extends LitElement { ? html`` - : html``} + : html``}
Refresh diff --git a/src/layouts/hass-error-screen.ts b/src/layouts/hass-error-screen.ts index f8838eff85..eab453b29e 100644 --- a/src/layouts/hass-error-screen.ts +++ b/src/layouts/hass-error-screen.ts @@ -12,29 +12,56 @@ import "./hass-subpage"; @customElement("hass-error-screen") class HassErrorScreen extends LitElement { - @property() - public error?: string; + @property({ type: Boolean }) public toolbar = true; + + @property() public error?: string; protected render(): TemplateResult { return html` - -
-

${this.error}

- - go back - -
-
+ ${this.toolbar + ? html`
+ +
` + : ""} +
+

${this.error}

+ + go back + +
`; } - private _backTapped(): void { + private _handleBack(): void { history.back(); } static get styles(): CSSResultArray { return [ css` + :host { + display: block; + height: 100%; + background-color: var(--primary-background-color); + } + .toolbar { + display: flex; + align-items: center; + font-size: 20px; + height: 65px; + padding: 0 16px; + pointer-events: none; + background-color: var(--app-header-background-color); + font-weight: 400; + color: var(--app-header-text-color, white); + border-bottom: var(--app-header-border-bottom, none); + box-sizing: border-box; + } + ha-icon-button-arrow-prev { + pointer-events: auto; + } .content { height: calc(100% - 64px); display: flex; diff --git a/src/layouts/hass-loading-screen.ts b/src/layouts/hass-loading-screen.ts index 83021927d9..c8cdf24d97 100644 --- a/src/layouts/hass-loading-screen.ts +++ b/src/layouts/hass-loading-screen.ts @@ -16,7 +16,10 @@ import { HomeAssistant } from "../types"; @customElement("hass-loading-screen") class HassLoadingScreen extends LitElement { - @property({ type: Boolean }) public rootnav? = false; + @property({ type: Boolean, attribute: "no-toolbar" }) + public noToolbar = false; + + @property({ type: Boolean }) public rootnav = false; @property() public hass?: HomeAssistant; @@ -24,20 +27,22 @@ class HassLoadingScreen extends LitElement { protected render(): TemplateResult { return html` - - ${this.rootnav - ? html` - - ` - : html` - - `} - + ${this.noToolbar + ? "" + : html`
+ ${this.rootnav + ? html` + + ` + : html` + + `} +
`}
@@ -57,6 +62,23 @@ class HassLoadingScreen extends LitElement { height: 100%; background-color: var(--primary-background-color); } + .toolbar { + display: flex; + align-items: center; + font-size: 20px; + height: 65px; + padding: 0 16px; + pointer-events: none; + background-color: var(--app-header-background-color); + font-weight: 400; + color: var(--app-header-text-color, white); + border-bottom: var(--app-header-border-bottom, none); + box-sizing: border-box; + } + ha-menu-button, + ha-icon-button-arrow-prev { + pointer-events: auto; + } .content { height: calc(100% - 64px); display: flex; diff --git a/src/layouts/hass-router-page.ts b/src/layouts/hass-router-page.ts index d463b86ca6..450e331a73 100644 --- a/src/layouts/hass-router-page.ts +++ b/src/layouts/hass-router-page.ts @@ -169,9 +169,9 @@ export class HassRouterPage extends UpdatingElement { } // Show error screen - const errorEl = document.createElement("hass-error-screen"); - errorEl.error = `Error while loading page ${newPage}.`; - this.appendChild(errorEl); + this.appendChild( + this.createErrorScreen(`Error while loading page ${newPage}.`) + ); }); // If we don't show loading screen, just show the panel. @@ -252,6 +252,12 @@ export class HassRouterPage extends UpdatingElement { return document.createElement("hass-loading-screen"); } + protected createErrorScreen(error: string) { + const errorEl = document.createElement("hass-error-screen"); + errorEl.error = error; + return errorEl; + } + /** * Rebuild the current panel. * diff --git a/src/layouts/hass-subpage.ts b/src/layouts/hass-subpage.ts index 4eb7a3153e..2039b7654f 100644 --- a/src/layouts/hass-subpage.ts +++ b/src/layouts/hass-subpage.ts @@ -36,7 +36,7 @@ class HassSubpage extends LitElement { class=${classMap({ hidden: !this.showBackButton })} > -
${this.header}
+
${this.header}
@@ -74,7 +74,6 @@ class HassSubpage extends LitElement { box-sizing: border-box; } - ha-menu-button, ha-icon-button-arrow-prev, ::slotted([slot="toolbar-icon"]) { pointer-events: auto; @@ -84,7 +83,7 @@ class HassSubpage extends LitElement { visibility: hidden; } - [main-title] { + .main-title { margin: 0 0 0 24px; line-height: 20px; flex-grow: 1; diff --git a/src/layouts/loading-screen.ts b/src/layouts/loading-screen.ts deleted file mode 100644 index 5d0270c261..0000000000 --- a/src/layouts/loading-screen.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { - css, - CSSResult, - customElement, - html, - LitElement, - TemplateResult, -} from "lit-element"; -import "../components/ha-circular-progress"; - -@customElement("loading-screen") -class LoadingScreen extends LitElement { - protected render(): TemplateResult { - return html` `; - } - - static get styles(): CSSResult { - return css` - :host { - height: 100%; - display: flex; - align-items: center; - justify-content: center; - } - `; - } -} - -declare global { - interface HTMLElementTagNameMap { - "loading-screen": LoadingScreen; - } -} diff --git a/src/panels/developer-tools/developer-tools-router.ts b/src/panels/developer-tools/developer-tools-router.ts index 26337446b3..e7f4e78c2a 100644 --- a/src/panels/developer-tools/developer-tools-router.ts +++ b/src/panels/developer-tools/developer-tools-router.ts @@ -40,6 +40,18 @@ class DeveloperToolsRouter extends HassRouterPage { }, }; + protected createLoadingScreen() { + const loadingScreen = super.createLoadingScreen(); + loadingScreen.noToolbar = true; + return loadingScreen; + } + + protected createErrorScreen(error: string) { + const errorEl = super.createErrorScreen(error); + errorEl.toolbar = false; + return errorEl; + } + protected updatePageEl(el) { if ("setProperties" in el) { // As long as we have Polymer pages diff --git a/src/panels/developer-tools/ha-panel-developer-tools.ts b/src/panels/developer-tools/ha-panel-developer-tools.ts index 98542c9365..b306a5fe33 100644 --- a/src/panels/developer-tools/ha-panel-developer-tools.ts +++ b/src/panels/developer-tools/ha-panel-developer-tools.ts @@ -1,6 +1,6 @@ -import "@polymer/app-layout/app-header-layout/app-header-layout"; import "@polymer/app-layout/app-header/app-header"; import "@polymer/app-layout/app-toolbar/app-toolbar"; +import "../../layouts/ha-app-layout"; import "../../components/ha-icon-button"; import "@polymer/paper-tabs/paper-tab"; import "@polymer/paper-tabs/paper-tabs"; @@ -36,7 +36,7 @@ class PanelDeveloperTools extends LitElement { protected render(): TemplateResult { const page = this._page; return html` - + - + `; } @@ -107,6 +107,10 @@ class PanelDeveloperTools extends LitElement { color: var(--primary-text-color); --paper-card-header-color: var(--primary-text-color); } + developer-tools-router { + display: block; + height: calc(100vh - 112px); + } paper-tabs { margin-left: 12px; --paper-tabs-selection-bar-color: #fff; From 8b3b40e6276c90c9499076d02201cd4fa15656f0 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Tue, 14 Jul 2020 16:26:21 -0500 Subject: [PATCH 57/58] Button Card: Option to show state (#6383) --- src/panels/lovelace/cards/hui-button-card.ts | 16 +++++++++++++ src/panels/lovelace/cards/types.ts | 1 + .../config-elements/hui-button-card-editor.ts | 23 +++++++++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 0e6bc2d874..9a65aad8fc 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -36,6 +36,7 @@ import { hasAction } from "../common/has-action"; import { createEntityNotFoundWarning } from "../components/hui-warning"; import { LovelaceCard, LovelaceCardEditor } from "../types"; import { ButtonCardConfig } from "./types"; +import { computeStateDisplay } from "../../../common/entity/compute_state_display"; @customElement("hui-button-card") export class HuiButtonCard extends LitElement implements LovelaceCard { @@ -66,6 +67,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { hold_action: { action: "more-info" }, show_icon: true, show_name: true, + show_state: false, entity: foundEntities[0] || "", }; } @@ -203,6 +205,15 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { ` : ""} + ${this._config.show_state && stateObj + ? html` + ${computeStateDisplay( + this.hass.localize, + stateObj, + this.hass.language + )} + ` + : ""} ${this._shouldRenderRipple ? html`` : ""} `; @@ -282,6 +293,11 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { outline: none; } + .state { + font-size: 0.9rem; + color: var(--secondary-text-color); + } + ${iconColorCSS} `; } diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index c003fb32ab..8ea3d859b5 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -71,6 +71,7 @@ export interface ButtonCardConfig extends LovelaceCardConfig { hold_action?: ActionConfig; double_tap_action?: ActionConfig; state_color?: boolean; + show_state?: boolean; } export interface EntityFilterCardConfig extends LovelaceCardConfig { diff --git a/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts index 0ff82af4c6..c76a8ded9c 100644 --- a/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts @@ -38,6 +38,7 @@ const cardConfigStruct = struct({ tap_action: struct.optional(actionConfigStruct), hold_action: struct.optional(actionConfigStruct), theme: "string?", + show_state: "boolean?", }); @customElement("hui-button-card-editor") @@ -64,6 +65,10 @@ export class HuiButtonCardEditor extends LitElement return this._config!.show_name || true; } + get _show_state(): boolean { + return this._config!.show_state || false; + } + get _icon(): string { return this._config!.icon || ""; } @@ -153,12 +158,26 @@ export class HuiButtonCardEditor extends LitElement .dir=${dir} >
+
+ + + +
From 7cf396b518900ee3b6a6a83cd9375e71df8aa0cf Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 14 Jul 2020 23:36:14 +0200 Subject: [PATCH 58/58] Bumped version to 20200714.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 904d1ff62f..6db083fc4d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200702.0", + version="20200714.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",