diff --git a/src/data/script.ts b/src/data/script.ts index c52979b664..4315e1cd06 100644 --- a/src/data/script.ts +++ b/src/data/script.ts @@ -74,7 +74,7 @@ export const showScriptEditor = ( data?: Partial ) => { inititialScriptEditorData = data; - navigate(el, "/config/script/new"); + navigate(el, "/config/script/edit/new"); }; export const getScriptEditorInitData = () => { diff --git a/src/panels/config/script/ha-config-script.js b/src/panels/config/script/ha-config-script.js deleted file mode 100644 index 6a316d55f6..0000000000 --- a/src/panels/config/script/ha-config-script.js +++ /dev/null @@ -1,113 +0,0 @@ -import "@polymer/app-route/app-route"; -import { html } from "@polymer/polymer/lib/utils/html-tag"; -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -import "./ha-script-editor"; -import "./ha-script-picker"; - -import { computeStateDomain } from "../../../common/entity/compute_state_domain"; - -class HaConfigScript extends PolymerElement { - static get template() { - return html` - - - - - - - - `; - } - - static get properties() { - return { - hass: Object, - route: Object, - isWide: Boolean, - narrow: Boolean, - _routeData: Object, - _routeMatches: Boolean, - _creatingNew: Boolean, - _edittingScript: Boolean, - - scripts: { - type: Array, - computed: "computeScripts(hass)", - }, - - script: { - type: Object, - computed: "computeScript(scripts, _edittingScript, _routeData)", - }, - - showEditor: { - type: Boolean, - computed: "computeShowEditor(_edittingScript, _creatingNew)", - }, - }; - } - - computeScript(scripts, edittingAddon, routeData) { - if (!scripts || !edittingAddon) { - return null; - } - for (var i = 0; i < scripts.length; i++) { - if (scripts[i].entity_id === routeData.script) { - return scripts[i]; - } - } - return null; - } - - computeScripts(hass) { - var scripts = []; - - Object.keys(hass.states).forEach(function(key) { - var entity = hass.states[key]; - - if (computeStateDomain(entity) === "script") { - scripts.push(entity); - } - }); - - return scripts; - } - - computeShowEditor(_edittingScript, _creatingNew) { - return _creatingNew || _edittingScript; - } -} - -customElements.define("ha-config-script", HaConfigScript); diff --git a/src/panels/config/script/ha-config-script.ts b/src/panels/config/script/ha-config-script.ts new file mode 100644 index 0000000000..7ac95b8f72 --- /dev/null +++ b/src/panels/config/script/ha-config-script.ts @@ -0,0 +1,77 @@ +import { HassEntities, HassEntity } from "home-assistant-js-websocket"; +import { customElement, property, PropertyValues } from "lit-element"; +import memoizeOne from "memoize-one"; +import { computeStateDomain } from "../../../common/entity/compute_state_domain"; +import { + HassRouterPage, + RouterOptions, +} from "../../../layouts/hass-router-page"; +import { HomeAssistant } from "../../../types"; +import "./ha-script-editor"; +import "./ha-script-picker"; + +@customElement("ha-config-script") +class HaConfigScript extends HassRouterPage { + @property() public hass!: HomeAssistant; + @property() public narrow!: boolean; + @property() public isWide!: boolean; + @property() public showAdvanced!: boolean; + @property() public scripts: HassEntity[] = []; + + protected routerOptions: RouterOptions = { + defaultPage: "dashboard", + routes: { + dashboard: { + tag: "ha-script-picker", + cache: true, + }, + edit: { + tag: "ha-script-editor", + }, + }, + }; + + private _computeScripts = memoizeOne((states: HassEntities) => { + const scripts: HassEntity[] = []; + Object.values(states).forEach((state) => { + if (computeStateDomain(state) === "script" && !state.attributes.hidden) { + scripts.push(state); + } + }); + + return scripts; + }); + + protected updatePageEl(pageEl, changedProps: PropertyValues) { + pageEl.hass = this.hass; + pageEl.narrow = this.narrow; + pageEl.isWide = this.isWide; + pageEl.route = this.routeTail; + pageEl.showAdvanced = this.showAdvanced; + + if (this.hass) { + pageEl.scripts = this._computeScripts(this.hass.states); + } + + if ( + (!changedProps || changedProps.has("route")) && + this._currentPage === "edit" + ) { + pageEl.creatingNew = undefined; + const scriptEntityId = this.routeTail.path.substr(1); + pageEl.creatingNew = scriptEntityId === "new" ? true : false; + pageEl.script = + scriptEntityId === "new" + ? undefined + : pageEl.scripts.find( + (entity: HassEntity) => entity.entity_id === scriptEntityId + ); + } + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-config-script": HaConfigScript; + } +} diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index 7447e3fa04..c91aa68e6a 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -134,7 +134,7 @@ class HaScriptPicker extends LitElement { @click=${this._showHelp} > - +