diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index 19136ce94e..ad3f1d0a2c 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -622,8 +622,20 @@ export class HaDataTable extends LitElement { .mdc-data-table__header-cell--icon-button, .mdc-data-table__cell--icon-button { - width: 40px; - padding: 4px; + width: 56px; + padding: 8px; + } + + .mdc-data-table__header-cell--icon-button:first-child, + .mdc-data-table__cell--icon-button:first-child { + width: 64px; + padding-left: 16px; + } + + .mdc-data-table__header-cell--icon-button:last-child, + .mdc-data-table__cell--icon-button:last-child { + width: 64px; + padding-right: 16px; } .mdc-data-table__cell--icon-button a { diff --git a/src/dialogs/generic/dialog-box.ts b/src/dialogs/generic/dialog-box.ts index ff19b3d4bb..1301347f7e 100644 --- a/src/dialogs/generic/dialog-box.ts +++ b/src/dialogs/generic/dialog-box.ts @@ -142,6 +142,9 @@ class DialogBox extends LitElement { min-width: initial; } } + a { + color: var(--primary-color); + } p { margin: 0; padding-top: 6px; diff --git a/src/panels/config/areas/ha-config-areas-dashboard.ts b/src/panels/config/areas/ha-config-areas-dashboard.ts index 25abaa7a17..81256f562a 100644 --- a/src/panels/config/areas/ha-config-areas-dashboard.ts +++ b/src/panels/config/areas/ha-config-areas-dashboard.ts @@ -172,29 +172,12 @@ export class HaConfigAreasDashboard extends LitElement { --app-header-background-color: var(--sidebar-background-color); --app-header-text-color: var(--sidebar-text-color); } - a { - color: var(--primary-color); - } - ha-card { - max-width: 600px; - margin: 16px auto; - overflow: hidden; - } - .empty { - text-align: center; - } - paper-item { - cursor: pointer; - padding-top: 4px; - padding-bottom: 4px; - } ha-fab { position: fixed; bottom: 16px; right: 16px; z-index: 1; } - ha-fab[is-wide] { bottom: 24px; right: 24px; diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 02ca4cd905..bee4982244 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -198,6 +198,7 @@ export class HaConfigDevicePage extends LitElement { integrations[0] }/logo@2x.png 2x " + referrerpolicy="no-referrer" @load=${this._onImageLoad} @error=${this._onImageError} /> diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index ae56c4e188..bc2cee95fe 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -1,31 +1,28 @@ -import { - LitElement, - html, - CSSResultArray, - css, - TemplateResult, - property, - customElement, -} from "lit-element"; import "@polymer/paper-icon-button/paper-icon-button"; -import "@polymer/paper-item/paper-item-body"; import { HassEntity } from "home-assistant-js-websocket"; - -import "../../../layouts/hass-tabs-subpage"; - -import { computeRTL } from "../../../common/util/compute_rtl"; - -import "../../../components/ha-card"; -import "../../../components/ha-fab"; - -import "../ha-config-section"; - +import { + css, + CSSResultArray, + customElement, + html, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import memoizeOne from "memoize-one"; +import { formatDateTime } from "../../../common/datetime/format_date_time"; +import { fireEvent } from "../../../common/dom/fire_event"; import { computeStateName } from "../../../common/entity/compute_state_name"; +import { computeRTL } from "../../../common/util/compute_rtl"; +import { DataTableColumnContainer } from "../../../components/data-table/ha-data-table"; +import "../../../components/ha-fab"; +import { triggerScript } from "../../../data/script"; +import "../../../layouts/hass-tabs-subpage-data-table"; import { haStyle } from "../../../resources/styles"; import { HomeAssistant, Route } from "../../../types"; -import { triggerScript } from "../../../data/script"; import { showToast } from "../../../util/toast"; import { configSections } from "../ha-panel-config"; +import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box"; @customElement("ha-script-picker") class HaScriptPicker extends LitElement { @@ -35,91 +32,123 @@ class HaScriptPicker extends LitElement { @property() public narrow!: boolean; @property() public route!: Route; + private _scripts = memoizeOne((scripts: HassEntity[]) => { + return scripts.map((script) => { + return { + ...script, + name: computeStateName(script), + }; + }); + }); + + private _columns = memoizeOne( + (_language): DataTableColumnContainer => { + return { + activate: { + title: "", + type: "icon-button", + template: (_toggle, script) => + html` + this._runScript(ev)} + > + `, + }, + name: { + title: this.hass.localize( + "ui.panel.config.script.picker.headers.name" + ), + sortable: true, + filterable: true, + direction: "asc", + grows: true, + template: (name, script: any) => html` + ${name} +
+ ${this.hass.localize("ui.card.automation.last_triggered")}: + ${script.attributes.last_triggered + ? formatDateTime( + new Date(script.attributes.last_triggered), + this.hass.language + ) + : this.hass.localize("ui.components.relative_time.never")} +
+ `, + }, + info: { + title: "", + type: "icon-button", + template: (_info, script) => html` + + `, + }, + edit: { + title: "", + type: "icon-button", + template: (_info, script: any) => html` + + + + `, + }, + }; + } + ); + protected render(): TemplateResult { return html` - - -
- ${this.hass.localize("ui.panel.config.script.picker.header")} -
-
- ${this.hass.localize("ui.panel.config.script.picker.introduction")} -

- - ${this.hass.localize( - "ui.panel.config.script.picker.learn_more" - )} - -

-
- - - ${this.scripts.length === 0 - ? html` -
-

- ${this.hass.localize( - "ui.panel.config.script.picker.no_scripts" - )} -

-
- ` - : this.scripts.map( - (script) => html` -
- - -
${computeStateName(script)}
-
-
- - - -
-
- ` - )} -
-
- - - - -
+ + + + + `; } private async _runScript(ev) { + ev.stopPropagation(); const script = ev.currentTarget.script as HassEntity; await triggerScript(this.hass, script.entity_id); showToast(this, { @@ -131,38 +160,34 @@ class HaScriptPicker extends LitElement { }); } + private _showInfo(ev) { + ev.stopPropagation(); + const entityId = ev.currentTarget.script.entity_id; + fireEvent(this, "hass-more-info", { entityId }); + } + + private _showHelp() { + showAlertDialog(this, { + title: this.hass.localize("ui.panel.config.script.caption"), + text: html` + ${this.hass.localize("ui.panel.config.script.picker.introduction")} +

+ + ${this.hass.localize("ui.panel.config.script.picker.learn_more")} + +

+ `, + }); + } + static get styles(): CSSResultArray { return [ haStyle, css` - :host { - display: block; - } - - ha-card { - margin-bottom: 56px; - } - - .script { - display: flex; - flex-direction: horizontal; - align-items: center; - padding: 0 8px 0 16px; - } - - .script > *:first-child { - margin-right: 8px; - } - - .script a[href], - paper-icon-button { - color: var(--primary-text-color); - } - - .actions { - display: flex; - } - ha-fab { position: fixed; bottom: 16px; @@ -187,10 +212,6 @@ class HaScriptPicker extends LitElement { right: auto; left: 24px; } - - a { - color: var(--primary-color); - } `, ]; } diff --git a/src/translations/en.json b/src/translations/en.json index 961a86dc8b..74f55b6c0a 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1230,7 +1230,10 @@ "no_scripts": "We couldn’t find any editable scripts", "add_script": "Add script", "trigger_script": "Trigger script", - "edit_script": "Edit script" + "edit_script": "Edit script", + "headers": { + "name": "Name" + } }, "editor": { "alias": "Name",