From 7fcadc85fa3d66d4661ccf90edc65034788783f9 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 2 Mar 2021 21:43:45 +0100 Subject: [PATCH 01/16] Dont show config changes when user saved it (#8520) --- src/panels/lovelace/hui-editor.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/panels/lovelace/hui-editor.ts b/src/panels/lovelace/hui-editor.ts index 3044b78d0e..d1b42574ab 100644 --- a/src/panels/lovelace/hui-editor.ts +++ b/src/panels/lovelace/hui-editor.ts @@ -81,7 +81,7 @@ class LovelaceFullConfigEditor extends LitElement { ${this.hass!.localize( "ui.panel.lovelace.editor.raw_editor.save" @@ -95,8 +95,8 @@ class LovelaceFullConfigEditor extends LitElement { autofocus .rtl=${computeRTL(this.hass)} .hass=${this.hass} - @value-changed="${this._yamlChanged}" - @editor-save="${this._handleSave}" + @value-changed=${this._yamlChanged} + @editor-save=${this._handleSave} > @@ -112,6 +112,7 @@ class LovelaceFullConfigEditor extends LitElement { protected updated(changedProps: PropertyValues) { const oldLovelace = changedProps.get("lovelace") as Lovelace | undefined; if ( + !this._saving && oldLovelace && this.lovelace && oldLovelace.config !== this.lovelace.config && @@ -305,8 +306,8 @@ class LovelaceFullConfigEditor extends LitElement { }); } window.onbeforeunload = null; - this._saving = false; this._changed = false; + this._saving = false; } private get yamlEditor(): HaCodeEditor { From 6021bec5eee9800c010342a77e5532d5f30de501 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 3 Mar 2021 10:42:45 +0100 Subject: [PATCH 02/16] Bumped version to 20210302.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d5d36dcb34..1b07fcf8d8 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210302.0", + version="20210302.1", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 19ccf0ab401dfb1dc9dd54ea9b7d4cd7259b0e4c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 3 Mar 2021 12:25:51 +0100 Subject: [PATCH 03/16] Bump codemirror (#8524) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f2a742e304..bd86587600 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2026,9 +2026,9 @@ integrity sha512-KL+cM+uJPW5skyuTRoW43lOaSQq3YDNEPx5z0V/9Wsz9R9dK4kVP5NIRMUFgl9MUCQ9UxIotvgPDpz65j9wjuA== "@codemirror/view@^0.17.0": - version "0.17.12" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.17.12.tgz#3720323d32ad359372621f0b16f8e25a3d17a933" - integrity sha512-sHA57N2yfFQTgoOfF5OneHPAltupcSH4ps4cD3fj91F2EhWLqfzryImom8RxhJrwiE+3Kv3MiRtOXPthHIbswg== + version "0.17.13" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.17.13.tgz#e805ccaa31c22fcff87f0a1c88c143ff17960458" + integrity sha512-TWmQF2OMzWYY51gvzcq0ECvW1EyhEVpy//dmu1MDvJrv8nDZWGY/a414fUCc+v6DKNpujg7IIpP9sD2izYJFpg== dependencies: "@codemirror/rangeset" "^0.17.0" "@codemirror/state" "^0.17.0" From 98ae5270eff465e74e9a08444cb04a91fb291d6a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 3 Mar 2021 12:50:25 +0100 Subject: [PATCH 04/16] Bumped version to 20210302.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1b07fcf8d8..7226b1a02b 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210302.1", + version="20210302.2", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From e14d652651bfe45b6421a15f9a90f375135aab8c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 3 Mar 2021 13:19:12 +0100 Subject: [PATCH 05/16] Bumped version to 20210302.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7226b1a02b..ea7579a527 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210302.2", + version="20210302.3", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From e81002807f36b01c00a5a679f2d070433d23ef00 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 3 Mar 2021 14:31:39 +0100 Subject: [PATCH 06/16] Add max height to yaml editor (#8527) --- src/panels/lovelace/editor/hui-element-editor.ts | 3 +++ src/resources/codemirror.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/src/panels/lovelace/editor/hui-element-editor.ts b/src/panels/lovelace/editor/hui-element-editor.ts index 01fe25ec57..2906c73f13 100644 --- a/src/panels/lovelace/editor/hui-element-editor.ts +++ b/src/panels/lovelace/editor/hui-element-editor.ts @@ -359,6 +359,9 @@ export abstract class HuiElementEditor extends LitElement { .yaml-editor { padding: 8px 0px; } + ha-code-editor { + --code-mirror-max-height: calc(100vh - 245px); + } .error, .warning, .info { diff --git a/src/resources/codemirror.ts b/src/resources/codemirror.ts index f647b3e354..aedfd3f34a 100644 --- a/src/resources/codemirror.ts +++ b/src/resources/codemirror.ts @@ -33,6 +33,7 @@ export const theme = CMEditorView.theme({ "var(--code-editor-background-color, var(--card-background-color))", "& ::selection": { backgroundColor: "rgba(var(--rgb-primary-color), 0.3)" }, height: "var(--code-mirror-height, auto)", + maxHeight: "var(--code-mirror-max-height, unset)", }, $scroller: { outline: "none" }, From 701c188babfd810a88f02a17bf406f1f6450c725 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 4 Mar 2021 16:43:34 +0100 Subject: [PATCH 07/16] Bump codemirror to 0.18 (#8546) --- package.json | 21 +-- src/components/ha-code-editor.ts | 63 +++++---- src/resources/codemirror.ts | 58 +++++---- yarn.lock | 216 +++++++++++++++++-------------- 4 files changed, 189 insertions(+), 169 deletions(-) diff --git a/package.json b/package.json index 865b63a063..6a12d039ac 100644 --- a/package.json +++ b/package.json @@ -23,16 +23,17 @@ "license": "Apache-2.0", "dependencies": { "@braintree/sanitize-url": "^5.0.0", - "@codemirror/commands": "^0.17.0", - "@codemirror/gutter": "^0.17.0", - "@codemirror/highlight": "^0.17.0", - "@codemirror/history": "^0.17.0", - "@codemirror/legacy-modes": "^0.17.0", - "@codemirror/search": "^0.17.0", - "@codemirror/state": "^0.17.0", - "@codemirror/stream-parser": "^0.17.0", - "@codemirror/text": "^0.17.0", - "@codemirror/view": "^0.17.0", + "@codemirror/commands": "^0.18.0", + "@codemirror/gutter": "^0.18.0", + "@codemirror/highlight": "^0.18.1", + "@codemirror/history": "^0.18.0", + "@codemirror/legacy-modes": "^0.18.0", + "@codemirror/rectangular-selection": "^0.18.0", + "@codemirror/search": "^0.18.0", + "@codemirror/state": "^0.18.0", + "@codemirror/stream-parser": "^0.18.0", + "@codemirror/text": "^0.18.0", + "@codemirror/view": "^0.18.0", "@formatjs/intl-getcanonicallocales": "^1.4.6", "@formatjs/intl-pluralrules": "^3.4.10", "@fullcalendar/common": "5.1.0", diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts index 55cb03272d..8388d423be 100644 --- a/src/components/ha-code-editor.ts +++ b/src/components/ha-code-editor.ts @@ -1,4 +1,3 @@ -import type { StreamLanguage } from "@codemirror/stream-parser"; import type { EditorView, KeyBinding, ViewUpdate } from "@codemirror/view"; import { customElement, @@ -16,10 +15,6 @@ declare global { } } -const modeTag = Symbol("mode"); - -const readOnlyTag = Symbol("readOnly"); - const saveKeyBinding: KeyBinding = { key: "Mod-s", run: (view: EditorView) => { @@ -42,7 +37,7 @@ export class HaCodeEditor extends UpdatingElement { @internalProperty() private _value = ""; - @internalProperty() private _langs?: Record>; + private _loadedCodeMirror?: typeof import("../resources/codemirror"); public set value(value: string) { this._value = value; @@ -71,16 +66,16 @@ export class HaCodeEditor extends UpdatingElement { if (changedProps.has("mode")) { this.codemirror.dispatch({ - reconfigure: { - [modeTag]: this._mode, - }, + effects: this._loadedCodeMirror!.langCompartment!.reconfigure( + this._mode + ), }); } if (changedProps.has("readOnly")) { this.codemirror.dispatch({ - reconfigure: { - [readOnlyTag]: !this.readOnly, - }, + effects: this._loadedCodeMirror!.readonlyCompartment!.reconfigure( + this._loadedCodeMirror!.EditorView!.editable.of(!this.readOnly) + ), }); } if (changedProps.has("_value") && this._value !== this.value) { @@ -104,13 +99,11 @@ export class HaCodeEditor extends UpdatingElement { } private get _mode() { - return this._langs![this.mode]; + return this._loadedCodeMirror!.langs[this.mode]; } private async _load(): Promise { - const loaded = await loadCodeMirror(); - - this._langs = loaded.langs; + this._loadedCodeMirror = await loadCodeMirror(); const shadowRoot = this.attachShadow({ mode: "open" }); @@ -124,28 +117,32 @@ export class HaCodeEditor extends UpdatingElement { shadowRoot.appendChild(container); - this.codemirror = new loaded.EditorView({ - state: loaded.EditorState.create({ + this.codemirror = new this._loadedCodeMirror.EditorView({ + state: this._loadedCodeMirror.EditorState.create({ doc: this._value, extensions: [ - loaded.lineNumbers(), - loaded.history(), - loaded.highlightSelectionMatches(), - loaded.keymap.of([ - ...loaded.defaultKeymap, - ...loaded.searchKeymap, - ...loaded.historyKeymap, - ...loaded.tabKeyBindings, + this._loadedCodeMirror.lineNumbers(), + this._loadedCodeMirror.EditorState.allowMultipleSelections.of(true), + this._loadedCodeMirror.history(), + this._loadedCodeMirror.highlightSelectionMatches(), + this._loadedCodeMirror.highlightActiveLine(), + this._loadedCodeMirror.rectangularSelection(), + this._loadedCodeMirror.keymap.of([ + ...this._loadedCodeMirror.defaultKeymap, + ...this._loadedCodeMirror.searchKeymap, + ...this._loadedCodeMirror.historyKeymap, + ...this._loadedCodeMirror.tabKeyBindings, saveKeyBinding, ] as KeyBinding[]), - loaded.tagExtension(modeTag, this._mode), - loaded.theme, - loaded.Prec.fallback(loaded.highlightStyle), - loaded.tagExtension( - readOnlyTag, - loaded.EditorView.editable.of(!this.readOnly) + this._loadedCodeMirror.langCompartment.of(this._mode), + this._loadedCodeMirror.theme, + this._loadedCodeMirror.Prec.fallback( + this._loadedCodeMirror.highlightStyle ), - loaded.EditorView.updateListener.of((update) => + this._loadedCodeMirror.readonlyCompartment.of( + this._loadedCodeMirror.EditorView.editable.of(!this.readOnly) + ), + this._loadedCodeMirror.EditorView.updateListener.of((update) => this._onUpdate(update) ), ], diff --git a/src/resources/codemirror.ts b/src/resources/codemirror.ts index aedfd3f34a..e8162732a3 100644 --- a/src/resources/codemirror.ts +++ b/src/resources/codemirror.ts @@ -4,20 +4,25 @@ import { StreamLanguage } from "@codemirror/stream-parser"; import { jinja2 } from "@codemirror/legacy-modes/mode/jinja2"; import { yaml } from "@codemirror/legacy-modes/mode/yaml"; import { indentLess, indentMore } from "@codemirror/commands"; +import { Compartment } from "@codemirror/state"; -export { keymap } from "@codemirror/view"; +export { keymap, highlightActiveLine } from "@codemirror/view"; export { CMEditorView as EditorView }; -export { EditorState, Prec, tagExtension } from "@codemirror/state"; +export { EditorState, Prec } from "@codemirror/state"; export { defaultKeymap } from "@codemirror/commands"; export { lineNumbers } from "@codemirror/gutter"; export { searchKeymap, highlightSelectionMatches } from "@codemirror/search"; export { history, historyKeymap } from "@codemirror/history"; +export { rectangularSelection } from "@codemirror/rectangular-selection"; export const langs = { jinja2: StreamLanguage.define(jinja2), yaml: StreamLanguage.define(yaml), }; +export const langCompartment = new Compartment(); +export const readonlyCompartment = new Compartment(); + export const tabKeyBindings: KeyBinding[] = [ { key: "Tab", run: indentMore }, { @@ -27,7 +32,7 @@ export const tabKeyBindings: KeyBinding[] = [ ]; export const theme = CMEditorView.theme({ - $: { + "&": { color: "var(--primary-text-color)", backgroundColor: "var(--code-editor-background-color, var(--card-background-color))", @@ -36,27 +41,28 @@ export const theme = CMEditorView.theme({ maxHeight: "var(--code-mirror-max-height, unset)", }, - $scroller: { outline: "none" }, - - $content: { caretColor: "var(--secondary-text-color)" }, - - $$focused: { outline: "none" }, - - "$$focused $cursor": { borderLeftColor: "#var(--secondary-text-color)" }, - "$$focused $selectionBackground, $selectionBackground": { + "&.cm-focused": { outline: "none" }, + "&.cm-focused .cm-cursor": { + borderLeftColor: "#var(--secondary-text-color)", + }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground": { backgroundColor: "rgba(var(--rgb-primary-color), 0.3)", }, - $panels: { + ".cm-scroller": { outline: "none" }, + + ".cm-content": { caretColor: "var(--secondary-text-color)" }, + + ".cm-panels": { backgroundColor: "var(--primary-background-color)", color: "var(--primary-text-color)", }, - "$panels.top": { borderBottom: "1px solid var(--divider-color)" }, - "$panels.bottom": { borderTop: "1px solid var(--divider-color)" }, + ".cm-panels.top": { borderBottom: "1px solid var(--divider-color)" }, + ".cm-panels.bottom": { borderTop: "1px solid var(--divider-color)" }, - "$panel.search input": { margin: "4px 4px 0" }, + ".cm-panel.search input": { margin: "4px 4px 0" }, - $button: { + ".cm-button": { border: "1px solid var(--primary-color)", padding: "0px 16px", textTransform: "uppercase", @@ -72,7 +78,7 @@ export const theme = CMEditorView.theme({ letterSpacing: "var(--mdc-typography-button-letter-spacing, 0.0892857em)", }, - $textfield: { + ".cm-textfield": { padding: "4px 0px 5px", borderRadius: "0", fontSize: "16px", @@ -93,20 +99,20 @@ export const theme = CMEditorView.theme({ }, }, - $selectionMatch: { + ".cm-selectionMatch": { backgroundColor: "rgba(var(--rgb-primary-color), 0.1)", }, - $searchMatch: { + ".cm-searchMatch": { backgroundColor: "rgba(var(--rgb-accent-color), .2)", outline: "1px solid rgba(var(--rgb-accent-color), .4)", }, - "$searchMatch.selected": { + ".cm-searchMatch.selected": { backgroundColor: "rgba(var(--rgb-accent-color), .4)", outline: "1px solid var(--accent-color)", }, - $gutters: { + ".cm-gutters": { backgroundColor: "var(--paper-dialog-background-color, var(--primary-background-color))", color: "var(--paper-dialog-color, var(--secondary-text-color))", @@ -115,15 +121,15 @@ export const theme = CMEditorView.theme({ "1px solid var(--paper-input-container-color, var(--secondary-text-color))", paddingRight: "1px", }, - "$$focused $gutters": { + "&.cm-focused cm-gutters": { borderRight: "2px solid var(--paper-input-container-focus-color, var(--primary-color))", paddingRight: "0", }, - "$gutterElementags.lineNumber": { color: "inherit" }, + ".cm-gutterElementags.lineNumber": { color: "inherit" }, }); -export const highlightStyle = HighlightStyle.define( +export const highlightStyle = HighlightStyle.define([ { tag: tags.keyword, color: "var(--codemirror-keyword, #6262FF)" }, { tag: [ @@ -194,5 +200,5 @@ export const highlightStyle = HighlightStyle.define( { tag: tags.processingInstruction, color: "var(--secondary-text-color)" }, { tag: tags.string, color: "var(--codemirror-string, #07a)" }, { tag: tags.inserted, color: "var(--codemirror-string2, #07a)" }, - { tag: tags.invalid, color: "var(--error-color)" } -); + { tag: tags.invalid, color: "var(--error-color)" }, +]); diff --git a/yarn.lock b/yarn.lock index bd86587600..c43e85b834 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1905,135 +1905,144 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-5.0.0.tgz#3ba791f37b90e7f6170d252b63aacfcae943c039" integrity sha512-WmKrB/575EJCzbeSJR3YQ5sET5FaizeljLRw1382qVUeGqzuWBgIS+AF5a0FO51uQTrDpoRgvuHC2IWVsgwkkA== -"@codemirror/commands@^0.17.0": - version "0.17.5" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-0.17.5.tgz#0912955a614e554e4fbcb347a785c5c981f12826" - integrity sha512-9B/Zq6mBkSdf+2xWoOufJutNRhFdsgA9f2w9hfI7ujwFqFLIj7QKuYt+W1LAcJufHYy5BdVCyjgCamx65yb4MA== +"@codemirror/commands@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-0.18.0.tgz#10344d7d7a0fecad826e9853c1e6069d706298c6" + integrity sha512-4H63B4oqr8dmJ3VOKvMI7xrZIBJjAdtz3Z0V/Jt0HlIYTe76Omy4h9BS3b9EgyNaWjIO/Slz3KQPwihcC8uR5Q== dependencies: - "@codemirror/language" "^0.17.0" - "@codemirror/matchbrackets" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/text" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/language" "^0.18.0" + "@codemirror/matchbrackets" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" lezer-tree "^0.13.0" -"@codemirror/gutter@^0.17.0": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@codemirror/gutter/-/gutter-0.17.2.tgz#75c433090d05786614c0c7d14d2efae42c301151" - integrity sha512-kyfuNVg3B+yS9U3aNMK/AQ0NyOswOep8lrbldBL4BWXZ8mFzSifT3WNK887WYrEIhqeLjq5qjcsJgFyGrFR0Lg== +"@codemirror/gutter@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/gutter/-/gutter-0.18.0.tgz#b6fb340f7cc7b4ed1a67687e145489b3ed93098d" + integrity sha512-9hcKzBM5EjhWwrau5Xiv0ll/yOvkgiyLnH7DTsjFCUvuyfbS45WVEMhQ6C+HfsoRVR4TJqRVLJjaIktZqaAqnw== dependencies: - "@codemirror/rangeset" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" -"@codemirror/highlight@^0.17.0": - version "0.17.3" - resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.17.3.tgz#43f519ef93fa1c050ba2cd0631d9d855d9f3ec1e" - integrity sha512-pKuCQ/+CSbibK6ZO2E6YRowhf4LKERwCrSYmQyCw18Dgutt1D2d5t2fv0kziHYC7Jz3ZG2xnrsHABFjS57V6JA== +"@codemirror/highlight@^0.18.0", "@codemirror/highlight@^0.18.1": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.18.1.tgz#9ba1e842dd149b9985ee48cfdbeff6ef191378bb" + integrity sha512-SBbz6hS7/vUrgeiwTBByx/UXY8+Tkdyk7/CUq+XfgGUwPXpK8+llzBlQHa4mov46f/wAy1qoj0uobfgSjcvEpQ== dependencies: - "@codemirror/language" "^0.17.0" - "@codemirror/rangeset" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/language" "^0.18.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" lezer-tree "^0.13.0" - style-mod "^3.2.0" + style-mod "^4.0.0" -"@codemirror/history@^0.17.0": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.17.2.tgz#d94273af95f7dbd8a0c41c370984e4bbf55d54e8" - integrity sha512-ML/FA6VJMMwsQrx7HFXaOAg/LqrLxUktE5pu230UOn0u5bxIPxbX0lLGs34994s9HPruqbCqIikSc+IfjLkFcA== +"@codemirror/history@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.18.0.tgz#1267499e20f977b5b4179ec2cfd5013d78ab0cbc" + integrity sha512-oMpvu7c8GQnEn1nX98+WuVQuMEVxOPJFU1yrA22sWfqG7lkrJAv7p4geCWOpwQY9/LWw4sICkDbCeirre4BqBA== dependencies: - "@codemirror/state" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" -"@codemirror/language@^0.17.0": - version "0.17.5" - resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.17.5.tgz#77b551680f0bb8a6e40de7659e518de1e0c637a0" - integrity sha512-eFpWMv4anbinagEziYUO62mNKUFBPXeJ96HRuxYQI3yt4mJIVjzS7FkB/4VHqOcvfJYqYI3TURyu0T8MM4se2A== +"@codemirror/language@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.18.0.tgz#16c3beaf372d0ecfcb76d708a8f55efccaa25563" + integrity sha512-gryu0Sej1vG3S3njwsJ+bhz9zLoJxZ2TahLlxpqOB3uqVGZrGDyE+GmZBnA6I3hwHvaO1O4WXKScVsKoW6HqFA== dependencies: - "@codemirror/state" "^0.17.0" - "@codemirror/text" "^0.17.0" - "@codemirror/view" "^0.17.0" - lezer "^0.13.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + lezer "^0.13.4" lezer-tree "^0.13.0" -"@codemirror/legacy-modes@^0.17.0": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@codemirror/legacy-modes/-/legacy-modes-0.17.1.tgz#18a1a0f4a6b5745e521443525a243b9bc321e8ae" - integrity sha512-JafuzWLKuUfKh8rF2VYgUx+fzD4upFxV9kJuIUyv94/S9RcdrDPRU46AmfSpdumY6A9F2qQuTEc5ZLaK3g0iaw== +"@codemirror/legacy-modes@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/legacy-modes/-/legacy-modes-0.18.0.tgz#64bb6819758a50ccf777e4d64d59dec0fac2e169" + integrity sha512-ME/FnBTRf+nriCB1Racmwhl3tSSnIOobhLyK0kOX6mogKdcdkRxSVpeo1fAC8DddsXqi/NKRn8GUr/vUiHefdg== dependencies: - "@codemirror/stream-parser" "^0.17.0" + "@codemirror/stream-parser" "^0.18.0" -"@codemirror/matchbrackets@^0.17.0": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@codemirror/matchbrackets/-/matchbrackets-0.17.2.tgz#9dd72046d7bf09550612b2553c41317ed22577b1" - integrity sha512-E4TP7lNXk7VtmvvKYH59yNx0lf5ubv7iv0Ok0uWCjxm+RIPnXiOdRoNI7rxITJcgNROOyKnuKsd6AAnmuXxDEQ== +"@codemirror/matchbrackets@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/matchbrackets/-/matchbrackets-0.18.0.tgz#64a493090d942de19f15a9ed3cb0fa19ed55f18b" + integrity sha512-dPDopnZVkD54sSYdmQbyQbPdiuIA83p7XxX6Hp1ScEkOjukwCiFXiA/84x10FUTsQpUYp8bDzm7gwII119bGIw== dependencies: - "@codemirror/language" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/language" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" lezer-tree "^0.13.0" -"@codemirror/panel@^0.17.0": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@codemirror/panel/-/panel-0.17.1.tgz#9dfd3b464c537caebec43fffbd8a283b0210d4c1" - integrity sha512-2it2Sk02eF4WFwPVoRLhr9lPGq9lwwwHZFyb4olqI6tOyTPwk6leZ4ntabYrhvjRc7gD6S6vM14KhOtjm4hjqg== +"@codemirror/panel@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/panel/-/panel-0.18.0.tgz#79726a4506f45b5abbe31a6dd80f4cd29a810e49" + integrity sha512-wgKpe+QRjZwFKoMbMxqUFlV4j3dvgm8Q4v12SS0L6yxnFZkMsdbmowh0+pBa1Cp5iTSb0pdEOjAQaiWFZyIk9g== dependencies: - "@codemirror/state" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" -"@codemirror/rangeset@^0.17.0": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.17.1.tgz#41066bcf4b70b2c7595cb1363780688cc3f1235b" - integrity sha512-Qv8a8C5CZiUdXGvxniWdULJzXDiz5uSP5ddHFEmekGa9nNVCgdr05nH7R+h3NgJ2P40UEEOPykqXZyy8EHGggw== +"@codemirror/rangeset@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.18.0.tgz#8b3bec00c1cee8c3db3827a752a76819ead2dfab" + integrity sha512-+dpK3T6EFv2vkoAc3sTZld0N5SHZDjD3YowFYuMWn0Xw3t+u6k+JZlGBuaFTXdsLeF0auclsm0XhRUpMVuXhTg== dependencies: - "@codemirror/state" "^0.17.0" + "@codemirror/state" "^0.18.0" -"@codemirror/search@^0.17.0": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-0.17.1.tgz#eb6ae529093b09f92b1d62c4d0ad8d09c4e218f7" - integrity sha512-wY0KP9my/0uKQk9AU39EqmkY6zMVv2Erej5b1rRBksM78JZXzjNUl4gyhtx1/0om84IZ1ocmW8MRElkAY6r1rw== +"@codemirror/rectangular-selection@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/rectangular-selection/-/rectangular-selection-0.18.0.tgz#87e1a4d319b5d55b4e97294e6df0070164e836c0" + integrity sha512-BQ4pp2zhXCVZNqct5LtLR3AOWVseENBF/3oOgBmwsCKH7c11NfTqIqgWG5EW8NLOXp8HP8cDm3np8eWez0VkGQ== dependencies: - "@codemirror/panel" "^0.17.0" - "@codemirror/rangeset" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/text" "^0.17.0" - "@codemirror/view" "^0.17.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/search@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-0.18.0.tgz#aabb53d4678196e82309241753cd67403149e35d" + integrity sha512-gjg1yDz6gof0lhOEzjqofidd5tH2dwUwiyzym6E78n3tZBh/KygLKmw0B0T9a5s9JTVZtzup95i+TmcHrz2MQg== + dependencies: + "@codemirror/panel" "^0.18.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" crelt "^1.0.5" -"@codemirror/state@^0.17.0": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.17.2.tgz#b94846def08c2258bfdf09839359c31823e663ff" - integrity sha512-3WwDsBTMkiyFKJntIZjCiyq0KKo1OaKhq8k9vG/eGRm6bYL8rPOAEvufW6AKwuK3BSAftOAHFNXXq+GRNoL7zg== +"@codemirror/state@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.18.0.tgz#5bb5600c5bf32d4103b6576cd33bdb8cf926d602" + integrity sha512-E5Tgx/CVmQQdiIOoJ4xX4hy2RGqTjxbpzDifGn8wUu3Driq/uZ+ncr7M4ojWs1T83yYFevNBmPtT5vprD25vYA== dependencies: - "@codemirror/text" "^0.17.0" + "@codemirror/text" "^0.18.0" -"@codemirror/stream-parser@^0.17.0": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@codemirror/stream-parser/-/stream-parser-0.17.1.tgz#b8508676cffac1c34c98d4004a8449d762bef6cf" - integrity sha512-toCFLbPzzXNxCjyeNtu/s5Me1xDFQp6qCS4CNfslnW3iAg86M7W4v8SJocmVO3ALAr/6Ci/ECSIN7jsGZcAitw== +"@codemirror/stream-parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/stream-parser/-/stream-parser-0.18.0.tgz#d4eaf7043324bf9d20c518732a2ce2ff845256a5" + integrity sha512-qxtSBvn2kKMm0XlfJ0e7FbVIg10RsaNjX5n/jRWlK2Y0kHjk+Huk5vkkGR3vjwHDgRdfwQe/vqZtkPz3DFQpLQ== dependencies: - "@codemirror/highlight" "^0.17.0" - "@codemirror/language" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/text" "^0.17.0" + "@codemirror/highlight" "^0.18.0" + "@codemirror/language" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" lezer "^0.13.0" lezer-tree "^0.13.0" -"@codemirror/text@^0.17.0": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.17.2.tgz#7076feeaed16556b52d9b028429296ce10eb1280" - integrity sha512-KL+cM+uJPW5skyuTRoW43lOaSQq3YDNEPx5z0V/9Wsz9R9dK4kVP5NIRMUFgl9MUCQ9UxIotvgPDpz65j9wjuA== +"@codemirror/text@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.18.0.tgz#a4a98862989ccef5545e730b269136d524c6a7c7" + integrity sha512-HMzHNIAbjCiCf3tEJMRg6ul01KPuXxQGNiHlHgAnqPguq/CX+L4Nvj5JlWQAI91Pupk18zhmM1c6eaazX4YeTg== -"@codemirror/view@^0.17.0": - version "0.17.13" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.17.13.tgz#e805ccaa31c22fcff87f0a1c88c143ff17960458" - integrity sha512-TWmQF2OMzWYY51gvzcq0ECvW1EyhEVpy//dmu1MDvJrv8nDZWGY/a414fUCc+v6DKNpujg7IIpP9sD2izYJFpg== +"@codemirror/view@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.18.0.tgz#3bbb95d71fd526460acb0de724846851d0f7137c" + integrity sha512-+ll9SL8dIAvaI4OMv4wZWRrW6AGUY45Al5L88KIp+bd1jFKYO1cu21UXAG25EvqYInZ4ctc6el0vYRP9A+VOrw== dependencies: - "@codemirror/rangeset" "^0.17.0" - "@codemirror/state" "^0.17.0" - "@codemirror/text" "^0.17.0" - style-mod "^3.2.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + style-mod "^4.0.0" w3c-keyname "^2.2.4" "@discoveryjs/json-ext@^0.5.0": @@ -9441,6 +9450,13 @@ lezer@^0.13.0: dependencies: lezer-tree "^0.13.2" +lezer@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/lezer/-/lezer-0.13.4.tgz#f0396a3447c7a8f40391623f3f47a4d95559c42f" + integrity sha512-cLQxUVY28VBBqKBt/R8CYeH57KQnIvscAnoahzvhlZTK8qxMkIyGExR6ecEpYYDX06ZhROZrEm1IiPvjLAsTig== + dependencies: + lezer-tree "^0.13.2" + liftoff@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" @@ -12964,10 +12980,10 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -style-mod@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-3.2.2.tgz#fc445fdd08bd5a513363079ba625f69b2618f31d" - integrity sha512-7X3zF+GjUSQ/opNrzuEOqM+lF+4SOkG5aWxrNw/5rwBrHytsH1Ly8/o9e6Wnqoul2lLT1Pmue63LgiE6mEZAGw== +style-mod@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" + integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== subarg@^1.0.0: version "1.0.0" From a00961b9ef7d0794fc3ac12be6cfddcc5c43ccf6 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 4 Mar 2021 17:03:14 +0100 Subject: [PATCH 08/16] Bumped version to 20210302.4 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ea7579a527..442fe818e6 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210302.3", + version="20210302.4", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 9b39087102e0bb0294edfa413c02c3b9befea617 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Mar 2021 15:01:22 +0100 Subject: [PATCH 09/16] Fix codemirror active line (#8558) fixes #8556 --- src/components/ha-code-editor.ts | 1 + src/resources/codemirror.ts | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts index 8388d423be..1ec42a3dd8 100644 --- a/src/components/ha-code-editor.ts +++ b/src/components/ha-code-editor.ts @@ -126,6 +126,7 @@ export class HaCodeEditor extends UpdatingElement { this._loadedCodeMirror.history(), this._loadedCodeMirror.highlightSelectionMatches(), this._loadedCodeMirror.highlightActiveLine(), + this._loadedCodeMirror.drawSelection(), this._loadedCodeMirror.rectangularSelection(), this._loadedCodeMirror.keymap.of([ ...this._loadedCodeMirror.defaultKeymap, diff --git a/src/resources/codemirror.ts b/src/resources/codemirror.ts index e8162732a3..3ddbce40ad 100644 --- a/src/resources/codemirror.ts +++ b/src/resources/codemirror.ts @@ -6,7 +6,7 @@ import { yaml } from "@codemirror/legacy-modes/mode/yaml"; import { indentLess, indentMore } from "@codemirror/commands"; import { Compartment } from "@codemirror/state"; -export { keymap, highlightActiveLine } from "@codemirror/view"; +export { keymap, highlightActiveLine, drawSelection } from "@codemirror/view"; export { CMEditorView as EditorView }; export { EditorState, Prec } from "@codemirror/state"; export { defaultKeymap } from "@codemirror/commands"; @@ -49,6 +49,10 @@ export const theme = CMEditorView.theme({ backgroundColor: "rgba(var(--rgb-primary-color), 0.3)", }, + ".cm-activeLine": { + backgroundColor: "rgba(var(--rgb-secondary-text-color), 0.1)", + }, + ".cm-scroller": { outline: "none" }, ".cm-content": { caretColor: "var(--secondary-text-color)" }, From ba77a8871461cb641681b9150fe636fe26f9a16a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 5 Mar 2021 17:27:46 +0100 Subject: [PATCH 10/16] Bumped version to 20210302.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 442fe818e6..cd262e69cd 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210302.4", + version="20210302.5", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From d680fde759cd2a7cfcae90226b6c0fafb27bb5ed Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sun, 7 Mar 2021 21:02:44 +0100 Subject: [PATCH 11/16] Don't allow UI editor for service calls with templates (#8581) --- src/common/string/has-template.ts | 17 +++++++++++++++++ .../types/ha-automation-action-service.ts | 10 ++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/common/string/has-template.ts diff --git a/src/common/string/has-template.ts b/src/common/string/has-template.ts new file mode 100644 index 0000000000..b54af3307d --- /dev/null +++ b/src/common/string/has-template.ts @@ -0,0 +1,17 @@ +const isTemplateRegex = new RegExp("{%|{{|{#"); +export const isTemplate = (value: string): boolean => + isTemplateRegex.test(value); + +export const hasTemplate = (value: unknown): boolean => { + if (!value) { + return false; + } + if (typeof value === "string") { + return isTemplate(value); + } + if (typeof value === "object") { + const values = Array.isArray(value) ? value : Object.values(value!); + return values.some((val) => hasTemplate(val)); + } + return false; +}; diff --git a/src/panels/config/automation/action/types/ha-automation-action-service.ts b/src/panels/config/automation/action/types/ha-automation-action-service.ts index 984c2f0a52..4930c86b9b 100644 --- a/src/panels/config/automation/action/types/ha-automation-action-service.ts +++ b/src/panels/config/automation/action/types/ha-automation-action-service.ts @@ -16,6 +16,7 @@ import type { HomeAssistant } from "../../../../../types"; import { EntityIdOrAll } from "../../../../../common/structs/is-entity-id"; import { ActionElement } from "../ha-automation-action-row"; import "../../../../../components/ha-service-control"; +import { hasTemplate } from "../../../../../common/string/has-template"; const actionStruct = object({ service: optional(string()), @@ -46,6 +47,15 @@ export class HaServiceAction extends LitElement implements ActionElement { assert(this.action, actionStruct); } catch (error) { fireEvent(this, "ui-mode-not-available", error); + return; + } + if (this.action && hasTemplate(this.action)) { + fireEvent( + this, + "ui-mode-not-available", + Error(this.hass.localize("ui.errors.config.no_template_editor_support")) + ); + return; } if (this.action.entity_id) { this._action = { From 7449f7e73f57e6a37d42e1cd8c7e6b861ecbf6ee Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 7 Mar 2021 23:15:53 +0100 Subject: [PATCH 12/16] Handle delay templates properly + error handling tweaks (#8578) Co-authored-by: Bram Kragten --- src/data/script.ts | 2 +- .../action/ha-automation-action-row.ts | 21 ++++-- .../types/ha-automation-action-delay.ts | 67 ++++++++++++------- .../ha-automation-condition-editor.ts | 6 +- .../trigger/ha-automation-trigger-row.ts | 6 +- .../lovelace/editor/hui-element-editor.ts | 10 ++- src/translations/en.json | 13 ++-- 7 files changed, 83 insertions(+), 42 deletions(-) diff --git a/src/data/script.ts b/src/data/script.ts index 10f32a549e..bb04af28e5 100644 --- a/src/data/script.ts +++ b/src/data/script.ts @@ -55,7 +55,7 @@ export interface DelayActionParts { days?: number; } export interface DelayAction { - delay: number | Partial; + delay: number | Partial | string; } export interface SceneAction { diff --git a/src/panels/config/automation/action/ha-automation-action-row.ts b/src/panels/config/automation/action/ha-automation-action-row.ts index ed4f1be90c..61810c87e8 100644 --- a/src/panels/config/automation/action/ha-automation-action-row.ts +++ b/src/panels/config/automation/action/ha-automation-action-row.ts @@ -193,12 +193,16 @@ export default class HaAutomationActionRow extends LitElement { ${this._warnings ? html`
- UI editor is not supported for this config: + ${this.hass.localize("ui.errors.config.editor_not_supported")}:
-
    - ${this._warnings.map((warning) => html`
  • ${warning}
  • `)} -
- You can still edit your config in YAML. + ${this._warnings!.length > 0 && this._warnings![0] !== undefined + ? html`
    + ${this._warnings!.map( + (warning) => html`
  • ${warning}
  • ` + )} +
` + : ""} + ${this.hass.localize("ui.errors.config.edit_in_yaml_supported")}
` : ""} ${yamlMode @@ -212,7 +216,11 @@ export default class HaAutomationActionRow extends LitElement { )} ` : ""} -

Edit in YAML

+

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

- - `; + protected render() { + return html``; } private _valueChanged(ev: CustomEvent) { diff --git a/src/panels/config/automation/condition/ha-automation-condition-editor.ts b/src/panels/config/automation/condition/ha-automation-condition-editor.ts index 42dd2c34d8..e7a1c2f691 100644 --- a/src/panels/config/automation/condition/ha-automation-condition-editor.ts +++ b/src/panels/config/automation/condition/ha-automation-condition-editor.ts @@ -63,7 +63,11 @@ export default class HaAutomationConditionEditor extends LitElement { )} ` : ""} -

Edit in YAML

+

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

Edit in YAML +

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

extends LitElement {
${this.hass.localize("ui.errors.config.editor_not_supported")}:
-
    - ${this._warnings!.map((warning) => html`
  • ${warning}
  • `)} -
+ ${this._warnings!.length > 0 && this._warnings![0] !== undefined + ? html`
    + ${this._warnings!.map( + (warning) => html`
  • ${warning}
  • ` + )} +
` + : ""} ${this.hass.localize("ui.errors.config.edit_in_yaml_supported")}
` diff --git a/src/translations/en.json b/src/translations/en.json index 4c4ee6591a..bb8c6b5a14 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -797,7 +797,8 @@ "edit_in_yaml_supported": "You can still edit your config in YAML.", "key_missing": "Required key \"{key}\" is missing.", "key_not_expected": "Key \"{key}\" is not expected or not supported by the visual editor.", - "key_wrong_type": "The provided value for \"{key}\" is not supported by the visual editor. We support ({type_correct}) but received ({type_wrong})." + "key_wrong_type": "The provided value for \"{key}\" is not supported by the visual editor. We support ({type_correct}) but received ({type_wrong}).", + "no_template_editor_support": "Templates not supported in visual editor" } }, "login-form": { @@ -1232,8 +1233,8 @@ "queued": "Queue length", "parallel": "Max number of parallel runs" }, - "edit_yaml": "Edit as YAML", - "edit_ui": "Edit with UI", + "edit_yaml": "Edit in YAML", + "edit_ui": "Edit in visual editor", "copy_to_clipboard": "Copy to Clipboard", "triggers": { "name": "Trigger", @@ -1244,7 +1245,7 @@ "duplicate": "Duplicate", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "Are you sure you want to delete this?", - "unsupported_platform": "No UI support for platform: {platform}", + "unsupported_platform": "No visual editor support for platform: {platform}", "type_select": "Trigger type", "type": { "device": { @@ -1346,7 +1347,7 @@ "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]", - "unsupported_condition": "No UI support for condition: {condition}", + "unsupported_condition": "No visual editor support for condition: {condition}", "type_select": "Condition type", "type": { "and": { @@ -1422,7 +1423,7 @@ "duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]", "delete": "[%key:ui::panel::mailbox::delete_button%]", "delete_confirm": "[%key:ui::panel::config::automation::editor::triggers::delete_confirm%]", - "unsupported_action": "No UI support for action: {action}", + "unsupported_action": "No visual editor support for action: {action}", "type_select": "Action type", "type": { "service": { From 8ec3cbdb33e1ee992f3924f716e01bdd968b2983 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 6 Mar 2021 23:11:57 +0100 Subject: [PATCH 13/16] Fix codemirror cursor color (#8571) --- src/resources/codemirror.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/resources/codemirror.ts b/src/resources/codemirror.ts index 3ddbce40ad..18e353b4a5 100644 --- a/src/resources/codemirror.ts +++ b/src/resources/codemirror.ts @@ -37,14 +37,17 @@ export const theme = CMEditorView.theme({ backgroundColor: "var(--code-editor-background-color, var(--card-background-color))", "& ::selection": { backgroundColor: "rgba(var(--rgb-primary-color), 0.3)" }, + caretColor: "var(--secondary-text-color)", height: "var(--code-mirror-height, auto)", maxHeight: "var(--code-mirror-max-height, unset)", }, "&.cm-focused": { outline: "none" }, + "&.cm-focused .cm-cursor": { - borderLeftColor: "#var(--secondary-text-color)", + borderLeftColor: "var(--secondary-text-color)", }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground": { backgroundColor: "rgba(var(--rgb-primary-color), 0.3)", }, From 279f78e4a846acb9061e6da2d4a28630392e8236 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Sun, 7 Mar 2021 16:40:54 +0100 Subject: [PATCH 14/16] Ensure dev-tools state attribute checkbox state gets stored (#8579) --- src/panels/developer-tools/state/developer-tools-state.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/developer-tools/state/developer-tools-state.js b/src/panels/developer-tools/state/developer-tools-state.js index a170068bc1..e416414aa6 100644 --- a/src/panels/developer-tools/state/developer-tools-state.js +++ b/src/panels/developer-tools/state/developer-tools-state.js @@ -171,7 +171,7 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { [[localize('ui.panel.developer-tools.tabs.states.attributes')]] From fa7bd28c92ce475ecbed616f4ebe11caeed72da0 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sun, 7 Mar 2021 23:20:37 +0100 Subject: [PATCH 15/16] Bumped version to 20210302.6 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index cd262e69cd..3a49cf2d35 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20210302.5", + version="20210302.6", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors", From 9bdda77e8945ac89e9271d3aeb321f0abba91956 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 8 Mar 2021 13:02:28 +0100 Subject: [PATCH 16/16] Fix demo states translation (#8586) --- src/state/translations-mixin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/state/translations-mixin.ts b/src/state/translations-mixin.ts index cfb99bf845..2258833b72 100644 --- a/src/state/translations-mixin.ts +++ b/src/state/translations-mixin.ts @@ -230,7 +230,7 @@ export default >(superClass: T) => } this.__loadedFragmetTranslations.add(fragment); const result = await getTranslation(fragment, language); - this._updateResources(result.language, result.data); + await this._updateResources(result.language, result.data); } private async _loadCoreTranslations(language: string) {