From 2e7f8fb46f9f94afcbff3aa5010e73bfb0cbe807 Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Thu, 17 Mar 2022 17:01:08 -0500 Subject: [PATCH] Add Date Time Selector (#12070) --- gallery/src/pages/components/ha-selector.ts | 1 + .../ha-selector/ha-selector-datetime.ts | 73 +++++++++++++++++++ src/components/ha-selector/ha-selector.ts | 1 + src/data/selector.ts | 6 ++ 4 files changed, 81 insertions(+) create mode 100644 src/components/ha-selector/ha-selector-datetime.ts diff --git a/gallery/src/pages/components/ha-selector.ts b/gallery/src/pages/components/ha-selector.ts index f38a494cb9..053c95d7da 100644 --- a/gallery/src/pages/components/ha-selector.ts +++ b/gallery/src/pages/components/ha-selector.ts @@ -147,6 +147,7 @@ const SCHEMAS: { boolean: { name: "Boolean", selector: { boolean: {} } }, time: { name: "Time", selector: { time: {} } }, date: { name: "Date", selector: { date: {} } }, + datetime: { name: "Date Time", selector: { datetime: {} } }, action: { name: "Action", selector: { action: {} } }, text: { name: "Text", diff --git a/src/components/ha-selector/ha-selector-datetime.ts b/src/components/ha-selector/ha-selector-datetime.ts new file mode 100644 index 0000000000..80add84bd4 --- /dev/null +++ b/src/components/ha-selector/ha-selector-datetime.ts @@ -0,0 +1,73 @@ +import { css, html, LitElement } from "lit"; +import { customElement, property, query } from "lit/decorators"; +import type { HomeAssistant } from "../../types"; +import type { DateTimeSelector } from "../../data/selector"; +import type { HaDateInput } from "../ha-date-input"; +import type { HaTimeInput } from "../ha-time-input"; +import { fireEvent } from "../../common/dom/fire_event"; +import "../ha-date-input"; +import "../ha-time-input"; + +@customElement("ha-selector-datetime") +export class HaDateTimeSelector extends LitElement { + @property() public hass!: HomeAssistant; + + @property() public selector!: DateTimeSelector; + + @property() public value?: string; + + @property() public label?: string; + + @property({ type: Boolean, reflect: true }) public disabled = false; + + @query("ha-date-input") private _dateInput!: HaDateInput; + + @query("ha-time-input") private _timeInput!: HaTimeInput; + + protected render() { + const values = this.value?.split(" "); + return html` + + + + `; + } + + private _valueChanged(ev: CustomEvent): void { + ev.stopPropagation(); + fireEvent(this, "value-changed", { + value: `${this._dateInput.value} ${this._timeInput.value}`, + }); + } + + static styles = css` + :host { + display: flex; + align-items: center; + flex-direction: row; + } + + ha-date-input { + min-width: 150px; + margin-right: 4px; + } + `; +} + +declare global { + interface HTMLElementTagNameMap { + "ha-selector-datetime": HaDateTimeSelector; + } +} diff --git a/src/components/ha-selector/ha-selector.ts b/src/components/ha-selector/ha-selector.ts index 365d22f6bf..09a234e55c 100644 --- a/src/components/ha-selector/ha-selector.ts +++ b/src/components/ha-selector/ha-selector.ts @@ -10,6 +10,7 @@ import "./ha-selector-attribute"; import "./ha-selector-boolean"; import "./ha-selector-color-rgb"; import "./ha-selector-date"; +import "./ha-selector-datetime"; import "./ha-selector-device"; import "./ha-selector-duration"; import "./ha-selector-entity"; diff --git a/src/data/selector.ts b/src/data/selector.ts index 1ecc64b2cf..b48c11b179 100644 --- a/src/data/selector.ts +++ b/src/data/selector.ts @@ -3,6 +3,7 @@ export type Selector = | AttributeSelector | EntitySelector | DateSelector + | DateTimeSelector | DeviceSelector | DurationSelector | AreaSelector @@ -46,6 +47,11 @@ export interface DateSelector { date: {}; } +export interface DateTimeSelector { + // eslint-disable-next-line @typescript-eslint/ban-types + datetime: {}; +} + export interface DeviceSelector { device: { integration?: string;