From a92bb7915cd6205c83f030f837115792aa844333 Mon Sep 17 00:00:00 2001 From: Georgi Gardev Date: Fri, 8 May 2020 00:34:45 +0300 Subject: [PATCH] Add Visual Editor support --- README.md | 15 ++- examples/visual_editor.png | Bin 0 -> 46231 bytes src/editor.ts | 185 +++++++++++++++++++++++++++++++++++++ src/time-picker-card.ts | 36 +++++++- 4 files changed, 229 insertions(+), 7 deletions(-) create mode 100644 examples/visual_editor.png create mode 100644 src/editor.ts diff --git a/README.md b/README.md index a822999..75b727b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ ## Overview -This is a Time Picker card for [Home Assistant](https://www.home-assistant.io/)'s [Lovelace UI](https://www.home-assistant.io/lovelace). +This is a Time Picker Card for [Home Assistant](https://www.home-assistant.io/)'s [Lovelace UI](https://www.home-assistant.io/lovelace). Requires an [Input Datetime](https://www.home-assistant.io/integrations/input_datetime/) that has time (`has_time: true`). @@ -29,7 +29,7 @@ Requires an [Input Datetime](https://www.home-assistant.io/integrations/input_da ### Using a custom theme -![Cudtom theme](examples/custom.png) +![Custom theme](examples/custom.png) ## Installation @@ -43,6 +43,15 @@ resources: ## Usage +### Visual Editor + +Time Picker Card supports Lovelace's Visual Editor. Click the + button to add a card and search for time picker. + +![Visual Editor](examples/visual_editor.png) + + +### YAML + ```yaml type: 'custom:time-picker-card' entity: input_datetime.alarm_time @@ -81,7 +90,7 @@ hide: ## Theme Variables -Time Picker card will automatically pick up colors from your lovelace theme, but if you want to customize some of them, +Time Picker Card will automatically pick up colors from your lovelace theme, but if you want to customize some of them, you can use the following variables in your theme's config file: | Name | Default | Description | diff --git a/examples/visual_editor.png b/examples/visual_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..8108b92d2d226b91cf33c1d281aea3d13cff4d9e GIT binary patch literal 46231 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

g#&;Y=<4nTdoQ_w*vP^pl-_Wlw5 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 { + // Find all input_datetime entities + const datetimeEntities = Object.keys(this.hass.states) + .filter((entityId) => computeDomain(entityId) === ENTITY_DOMAIN) + .map((entityId) => this.hass.states[entityId]); + + // Return only the datetime entities that have time. + return datetimeEntities + .filter((entity) => entity.attributes.has_time === true) + .map((entity) => entity.entity_id); + } + + render(): TemplateResult { + return html`

+ + + ${this.datetimeEntities.map((entity) => html`${entity}`)} + + +
+ + + Show name? + +
+
+ + +
+
+ + 12-Hour mode + + + "Single" hour mode layout (in 12-Hour mode only) + +
+
`; + } + + setConfig(config): void { + this.config = config; + } + + private onHourModeChange({ target: { checked } }): void { + const hourMode: HourMode = checked ? 12 : 24; + + const newConfig = { ...this.config, hour_mode: hourMode }; + this.dispatch(newConfig); + } + + private onHourModeLayoutChange({ target: { checked } }): void { + const hourModeLayout: HourModeLayout = checked ? 'single' : 'double'; + + const newConfig = { ...this.config, layout: { hour_mode: hourModeLayout } }; + this.dispatch(newConfig); + } + + private onHideNameChange({ target: { checked } }): void { + const newConfig = { ...this.config, hide: { name: !checked } }; + this.dispatch(newConfig); + } + + private onValueChange(e: CustomEvent): void { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const property = (e.target as any).configValue; + let value = e.detail.value; + + if (TimePickerCardEditor.NUMBER_PROPERTIES.indexOf(property) > -1) { + value = parseInt(value); + + if (isNaN(value)) { + return; + } + } + + if (this.config[property] === value) { + return; + } + + const newConfig = { ...this.config, [property]: value }; + + this.dispatch(newConfig); + } + + private dispatch(config: TimePickerCardConfig): void { + const event = new CustomEvent(TimePickerCardEditor.CONFIG_CHANGED_EVENT, { + bubbles: true, + composed: true, + detail: { config }, + }); + + this.dispatchEvent(event); + } + + static get styles(): CSSResult { + return css` + ha-switch { + padding: 16px 0; + } + .side-by-side { + display: flex; + } + .side-by-side > * { + flex: 1; + padding-right: 4px; + } + .suffix { + margin: 0 8px; + } + `; + } +} diff --git a/src/time-picker-card.ts b/src/time-picker-card.ts index bfea9ca..60e9ee3 100644 --- a/src/time-picker-card.ts +++ b/src/time-picker-card.ts @@ -1,4 +1,4 @@ -import { computeDomain, HomeAssistant } from 'custom-card-helpers'; +import { computeDomain, HomeAssistant, LovelaceCard } from 'custom-card-helpers'; import { HassEntity } from 'home-assistant-js-websocket'; import { css, @@ -11,7 +11,8 @@ import { } from 'lit-element'; import './components/time-period.component'; import './components/time-unit.component'; -import { CARD_SIZE, CARD_VERSION, ENTITY_DOMAIN, DEFAULT_LAYOUT_HOUR_MODE } from './const'; +import './editor'; +import { CARD_SIZE, CARD_VERSION, DEFAULT_LAYOUT_HOUR_MODE, ENTITY_DOMAIN } from './const'; import { Hour } from './models/hour'; import { Minute } from './models/minute'; import { Partial } from './partials'; @@ -23,9 +24,18 @@ console.info( 'color: white; font-weight: bold; background: dimgray' ); +/* eslint-disable @typescript-eslint/no-explicit-any */ +(window as any).customCards = (window as any).customCards || []; +(window as any).customCards.push({ + type: 'time-picker-card', + name: 'Time Picker Card', + description: 'A Time Picker card for setting the time value of Input Datetime entities.', +}); +/* eslint-enable @typescript-eslint/no-explicit-any */ + @customElement('time-picker-card') -export class TimePickerCard extends LitElement { - @property() private hass!: HomeAssistant; +export class TimePickerCard extends LitElement implements LovelaceCard { + @property({ type: Object }) hass!: HomeAssistant; @property() private config!: TimePickerCardConfig; @property() private hour!: Hour; @property() private minute!: Minute; @@ -157,4 +167,22 @@ export class TimePickerCard extends LitElement { } `; } + + static getStubConfig( + _: HomeAssistant, + entities: Array + ): Omit { + const datetimeEntity = entities.find((entityId) => computeDomain(entityId) === ENTITY_DOMAIN); + + return { + entity: datetimeEntity || 'input_datetime.example_entity', + hour_mode: 24, + hour_step: 1, + minute_step: 5, + }; + } + + static getConfigElement(): LovelaceCard { + return document.createElement('time-picker-card-editor') as LovelaceCard; + } }