mirror of
https://github.com/home-assistant/frontend.git
synced 2025-04-27 06:47:20 +00:00
parent
478a4b2593
commit
12b124e5a3
@ -26,7 +26,9 @@
|
|||||||
"@codemirror/commands": "^0.17.2",
|
"@codemirror/commands": "^0.17.2",
|
||||||
"@codemirror/gutter": "^0.17.2",
|
"@codemirror/gutter": "^0.17.2",
|
||||||
"@codemirror/highlight": "^0.17.2",
|
"@codemirror/highlight": "^0.17.2",
|
||||||
|
"@codemirror/history": "^0.17.2",
|
||||||
"@codemirror/legacy-modes": "^0.17.1",
|
"@codemirror/legacy-modes": "^0.17.1",
|
||||||
|
"@codemirror/search": "^0.17.1",
|
||||||
"@codemirror/state": "^0.17.1",
|
"@codemirror/state": "^0.17.1",
|
||||||
"@codemirror/stream-parser": "^0.17.1",
|
"@codemirror/stream-parser": "^0.17.1",
|
||||||
"@codemirror/text": "^0.17.2",
|
"@codemirror/text": "^0.17.2",
|
||||||
|
@ -129,28 +129,25 @@ export class HaCodeEditor extends UpdatingElement {
|
|||||||
doc: this._value,
|
doc: this._value,
|
||||||
extensions: [
|
extensions: [
|
||||||
loaded.lineNumbers(),
|
loaded.lineNumbers(),
|
||||||
|
loaded.history(),
|
||||||
|
loaded.highlightSelectionMatches(),
|
||||||
loaded.keymap.of([
|
loaded.keymap.of([
|
||||||
...loaded.defaultKeymap,
|
...loaded.defaultKeymap,
|
||||||
{
|
...loaded.searchKeymap,
|
||||||
key: "Tab",
|
...loaded.historyKeymap,
|
||||||
run: loaded.indentMore,
|
...loaded.tabKeyBindings,
|
||||||
},
|
|
||||||
{
|
|
||||||
key: "Shift-Tab",
|
|
||||||
run: loaded.indentLess,
|
|
||||||
},
|
|
||||||
saveKeyBinding,
|
saveKeyBinding,
|
||||||
]),
|
]),
|
||||||
loaded.tagExtension(modeTag, this._mode),
|
loaded.tagExtension(modeTag, this._mode),
|
||||||
loaded.theme,
|
loaded.theme,
|
||||||
loaded.Prec.fallback(loaded.highlightStyle),
|
loaded.Prec.fallback(loaded.highlightStyle),
|
||||||
loaded.EditorView.updateListener.of((update) =>
|
|
||||||
this._onUpdate(update)
|
|
||||||
),
|
|
||||||
loaded.tagExtension(
|
loaded.tagExtension(
|
||||||
readOnlyTag,
|
readOnlyTag,
|
||||||
loaded.EditorView.editable.of(!this.readOnly)
|
loaded.EditorView.editable.of(!this.readOnly)
|
||||||
),
|
),
|
||||||
|
loaded.EditorView.updateListener.of((update) =>
|
||||||
|
this._onUpdate(update)
|
||||||
|
),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
root: shadowRoot,
|
root: shadowRoot,
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { undoDepth } from "@codemirror/history";
|
||||||
import "@material/mwc-button";
|
import "@material/mwc-button";
|
||||||
import "@polymer/app-layout/app-header/app-header";
|
import "@polymer/app-layout/app-header/app-header";
|
||||||
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
||||||
@ -148,11 +149,13 @@ class LovelaceFullConfigEditor extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private _yamlChanged() {
|
private _yamlChanged() {
|
||||||
this._changed = true;
|
this._changed = undoDepth(this.yamlEditor.codemirror!.state) > 0;
|
||||||
if (!window.onbeforeunload) {
|
if (this._changed && !window.onbeforeunload) {
|
||||||
window.onbeforeunload = () => {
|
window.onbeforeunload = () => {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
} else if (!this._changed && window.onbeforeunload) {
|
||||||
|
window.onbeforeunload = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,24 +3,35 @@ import { EditorView as CMEditorView } from "@codemirror/view";
|
|||||||
import { StreamLanguage } from "@codemirror/stream-parser";
|
import { StreamLanguage } from "@codemirror/stream-parser";
|
||||||
import { jinja2 } from "@codemirror/legacy-modes/mode/jinja2";
|
import { jinja2 } from "@codemirror/legacy-modes/mode/jinja2";
|
||||||
import { yaml } from "@codemirror/legacy-modes/mode/yaml";
|
import { yaml } from "@codemirror/legacy-modes/mode/yaml";
|
||||||
|
import { indentLess, indentMore } from "@codemirror/commands";
|
||||||
|
|
||||||
export { keymap } from "@codemirror/view";
|
export { keymap } from "@codemirror/view";
|
||||||
export { CMEditorView as EditorView };
|
export { CMEditorView as EditorView };
|
||||||
export { EditorState, Prec, tagExtension } from "@codemirror/state";
|
export { EditorState, Prec, tagExtension } from "@codemirror/state";
|
||||||
export { defaultKeymap, indentLess, indentMore } from "@codemirror/commands";
|
export { defaultKeymap } from "@codemirror/commands";
|
||||||
export { lineNumbers } from "@codemirror/gutter";
|
export { lineNumbers } from "@codemirror/gutter";
|
||||||
|
export { searchKeymap, highlightSelectionMatches } from "@codemirror/search";
|
||||||
|
export { history, historyKeymap } from "@codemirror/history";
|
||||||
|
|
||||||
export const langs = {
|
export const langs = {
|
||||||
jinja2: StreamLanguage.define(jinja2),
|
jinja2: StreamLanguage.define(jinja2),
|
||||||
yaml: StreamLanguage.define(yaml),
|
yaml: StreamLanguage.define(yaml),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const tabKeyBindings = [
|
||||||
|
{ key: "Tab", run: indentMore },
|
||||||
|
{
|
||||||
|
key: "Shift-Tab",
|
||||||
|
run: indentLess,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export const theme = CMEditorView.theme({
|
export const theme = CMEditorView.theme({
|
||||||
$: {
|
$: {
|
||||||
color: "var(--primary-text-color)",
|
color: "var(--primary-text-color)",
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
"var(--code-editor-background-color, var(--card-background-color))",
|
"var(--code-editor-background-color, var(--card-background-color))",
|
||||||
"& ::selection": { backgroundColor: "rgba(var(--rgb-primary-color), 0.2)" },
|
"& ::selection": { backgroundColor: "rgba(var(--rgb-primary-color), 0.3)" },
|
||||||
height: "var(--code-mirror-height, auto)",
|
height: "var(--code-mirror-height, auto)",
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -30,7 +41,57 @@ export const theme = CMEditorView.theme({
|
|||||||
|
|
||||||
"$$focused $cursor": { borderLeftColor: "#var(--secondary-text-color)" },
|
"$$focused $cursor": { borderLeftColor: "#var(--secondary-text-color)" },
|
||||||
"$$focused $selectionBackground, $selectionBackground": {
|
"$$focused $selectionBackground, $selectionBackground": {
|
||||||
backgroundColor: "rgba(var(--rgb-primary-color), 0.2)",
|
backgroundColor: "rgba(var(--rgb-primary-color), 0.3)",
|
||||||
|
},
|
||||||
|
|
||||||
|
$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)" },
|
||||||
|
|
||||||
|
"$panel.search": {
|
||||||
|
padding: "2px 6px 4px",
|
||||||
|
position: "relative",
|
||||||
|
"& [name=close]": {
|
||||||
|
position: "absolute",
|
||||||
|
top: "0",
|
||||||
|
right: "4px",
|
||||||
|
backgroundColor: "inherit",
|
||||||
|
border: "none",
|
||||||
|
font: "inherit",
|
||||||
|
padding: "4px",
|
||||||
|
margin: 0,
|
||||||
|
outline: "none",
|
||||||
|
fontSize: "150%",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
$button: {
|
||||||
|
border: "1px solid var(--primary-color)",
|
||||||
|
padding: "8px",
|
||||||
|
textTransform: "uppercase",
|
||||||
|
margin: "4px",
|
||||||
|
background: "none",
|
||||||
|
},
|
||||||
|
|
||||||
|
$textfield: {
|
||||||
|
backgroundColor: "var(--secondary-background-color)",
|
||||||
|
padding: "8px",
|
||||||
|
},
|
||||||
|
|
||||||
|
$selectionMatch: {
|
||||||
|
backgroundColor: "rgba(var(--rgb-primary-color), 0.1)",
|
||||||
|
},
|
||||||
|
|
||||||
|
$searchMatch: {
|
||||||
|
backgroundColor: "rgba(var(--rgb-accent-color), .2)",
|
||||||
|
outline: "1px solid rgba(var(--rgb-accent-color), .4)",
|
||||||
|
},
|
||||||
|
"$searchMatch.selected": {
|
||||||
|
backgroundColor: "rgba(var(--rgb-accent-color), .4)",
|
||||||
|
outline: "1px solid var(--accent-color)",
|
||||||
},
|
},
|
||||||
|
|
||||||
$gutters: {
|
$gutters: {
|
||||||
@ -40,10 +101,12 @@ export const theme = CMEditorView.theme({
|
|||||||
border: "none",
|
border: "none",
|
||||||
borderRight:
|
borderRight:
|
||||||
"1px solid var(--paper-input-container-color, var(--secondary-text-color))",
|
"1px solid var(--paper-input-container-color, var(--secondary-text-color))",
|
||||||
|
paddingRight: "1px",
|
||||||
},
|
},
|
||||||
"$$focused $gutters": {
|
"$$focused $gutters": {
|
||||||
borderRight:
|
borderRight:
|
||||||
"2px solid var(--paper-input-container-focus-color, var(--primary-color))",
|
"2px solid var(--paper-input-container-focus-color, var(--primary-color))",
|
||||||
|
paddingRight: "0",
|
||||||
},
|
},
|
||||||
"$gutterElementags.lineNumber": { color: "inherit" },
|
"$gutterElementags.lineNumber": { color: "inherit" },
|
||||||
});
|
});
|
||||||
|
33
yarn.lock
33
yarn.lock
@ -1938,6 +1938,14 @@
|
|||||||
lezer-tree "^0.13.0"
|
lezer-tree "^0.13.0"
|
||||||
style-mod "^3.2.0"
|
style-mod "^3.2.0"
|
||||||
|
|
||||||
|
"@codemirror/history@^0.17.2":
|
||||||
|
version "0.17.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.17.2.tgz#d94273af95f7dbd8a0c41c370984e4bbf55d54e8"
|
||||||
|
integrity sha512-ML/FA6VJMMwsQrx7HFXaOAg/LqrLxUktE5pu230UOn0u5bxIPxbX0lLGs34994s9HPruqbCqIikSc+IfjLkFcA==
|
||||||
|
dependencies:
|
||||||
|
"@codemirror/state" "^0.17.0"
|
||||||
|
"@codemirror/view" "^0.17.0"
|
||||||
|
|
||||||
"@codemirror/language@^0.17.0":
|
"@codemirror/language@^0.17.0":
|
||||||
version "0.17.5"
|
version "0.17.5"
|
||||||
resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.17.5.tgz#77b551680f0bb8a6e40de7659e518de1e0c637a0"
|
resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.17.5.tgz#77b551680f0bb8a6e40de7659e518de1e0c637a0"
|
||||||
@ -1966,6 +1974,14 @@
|
|||||||
"@codemirror/view" "^0.17.0"
|
"@codemirror/view" "^0.17.0"
|
||||||
lezer-tree "^0.13.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==
|
||||||
|
dependencies:
|
||||||
|
"@codemirror/state" "^0.17.0"
|
||||||
|
"@codemirror/view" "^0.17.0"
|
||||||
|
|
||||||
"@codemirror/rangeset@^0.17.0":
|
"@codemirror/rangeset@^0.17.0":
|
||||||
version "0.17.1"
|
version "0.17.1"
|
||||||
resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.17.1.tgz#41066bcf4b70b2c7595cb1363780688cc3f1235b"
|
resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.17.1.tgz#41066bcf4b70b2c7595cb1363780688cc3f1235b"
|
||||||
@ -1973,6 +1989,18 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@codemirror/state" "^0.17.0"
|
"@codemirror/state" "^0.17.0"
|
||||||
|
|
||||||
|
"@codemirror/search@^0.17.1":
|
||||||
|
version "0.17.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-0.17.1.tgz#eb6ae529093b09f92b1d62c4d0ad8d09c4e218f7"
|
||||||
|
integrity sha512-wY0KP9my/0uKQk9AU39EqmkY6zMVv2Erej5b1rRBksM78JZXzjNUl4gyhtx1/0om84IZ1ocmW8MRElkAY6r1rw==
|
||||||
|
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"
|
||||||
|
crelt "^1.0.5"
|
||||||
|
|
||||||
"@codemirror/state@^0.17.0", "@codemirror/state@^0.17.1":
|
"@codemirror/state@^0.17.0", "@codemirror/state@^0.17.1":
|
||||||
version "0.17.2"
|
version "0.17.2"
|
||||||
resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.17.2.tgz#b94846def08c2258bfdf09839359c31823e663ff"
|
resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.17.2.tgz#b94846def08c2258bfdf09839359c31823e663ff"
|
||||||
@ -6199,6 +6227,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
|
|||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
sha.js "^2.4.8"
|
sha.js "^2.4.8"
|
||||||
|
|
||||||
|
crelt@^1.0.5:
|
||||||
|
version "1.0.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94"
|
||||||
|
integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==
|
||||||
|
|
||||||
cropperjs@^1.5.7:
|
cropperjs@^1.5.7:
|
||||||
version "1.5.7"
|
version "1.5.7"
|
||||||
resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.5.7.tgz#b65019725bae1c6285e881fb661b2141fa57025b"
|
resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.5.7.tgz#b65019725bae1c6285e881fb661b2141fa57025b"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user