diff --git a/src/components/ha-date-input.ts b/src/components/ha-date-input.ts index 7504d38dcb..bdccf06cb3 100644 --- a/src/components/ha-date-input.ts +++ b/src/components/ha-date-input.ts @@ -1,127 +1,70 @@ -import "@polymer/paper-input/paper-input"; -import type { PaperInputElement } from "@polymer/paper-input/paper-input"; -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from "lit-element"; +import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker"; -@customElement("ha-date-input") -export class HaDateInput extends LitElement { - @property() public year?: string; +const VaadinDatePicker = customElements.get("vaadin-date-picker"); - @property() public month?: string; +export class HaDateInput extends VaadinDatePicker { + constructor() { + super(); - @property() public day?: string; + this.i18n.formatDate = this._formatISODate; + this.i18n.parseDate = this._parseISODate; + } - @property({ type: Boolean }) public disabled = false; - - static get styles() { - return css` + ready() { + super.ready(); + const styleEl = document.createElement("style"); + styleEl.innerHTML = ` :host { - display: block; - font-family: var(--paper-font-common-base_-_font-family); - -webkit-font-smoothing: var( - --paper-font-common-base_-_-webkit-font-smoothing - ); - } - - paper-input { - width: 30px; - text-align: center; - --paper-input-container-shared-input-style_-_-webkit-appearance: textfield; - --paper-input-container-input_-_-moz-appearance: textfield; - --paper-input-container-shared-input-style_-_appearance: textfield; - --paper-input-container-input-webkit-spinner_-_-webkit-appearance: none; - --paper-input-container-input-webkit-spinner_-_margin: 0; - --paper-input-container-input-webkit-spinner_-_display: none; - } - - paper-input#year { - width: 50px; - } - - .date-input-wrap { - display: flex; - flex-direction: row; + width: 12ex; + margin-top: -6px; + --material-body-font-size: 16px; + --_material-text-field-input-line-background-color: var(--primary-text-color); + --_material-text-field-input-line-opacity: 1; + --material-primary-color: var(--primary-text-color); } `; + this.shadowRoot.appendChild(styleEl); + this._inputElement.querySelector("[part='toggle-button']").style.display = + "none"; } - protected render(): TemplateResult { - return html` -
- - - - - - - - - - -
- `; + private _formatISODate(d) { + return [ + ("0000" + String(d.year)).slice(-4), + ("0" + String(d.month + 1)).slice(-2), + ("0" + String(d.day)).slice(-2), + ].join("-"); } - private _formatYear() { - const yearElement = this.shadowRoot!.getElementById( - "year" - ) as PaperInputElement; - this.year = yearElement.value!; - } + private _parseISODate(text) { + const parts = text.split("-"); + const today = new Date(); + let date; + let month = today.getMonth(); + let year = today.getFullYear(); + if (parts.length === 3) { + year = parseInt(parts[0]); + if (parts[0].length < 3 && year >= 0) { + year += year < 50 ? 2000 : 1900; + } + month = parseInt(parts[1]) - 1; + date = parseInt(parts[2]); + } else if (parts.length === 2) { + month = parseInt(parts[0]) - 1; + date = parseInt(parts[1]); + } else if (parts.length === 1) { + date = parseInt(parts[0]); + } - private _formatMonth() { - const monthElement = this.shadowRoot!.getElementById( - "month" - ) as PaperInputElement; - this.month = ("0" + monthElement.value!).slice(-2); - } - - private _formatDay() { - const dayElement = this.shadowRoot!.getElementById( - "day" - ) as PaperInputElement; - this.day = ("0" + dayElement.value!).slice(-2); - } - - get value() { - return `${this.year}-${this.month}-${this.day}`; + if (date !== undefined) { + return { day: date, month, year }; + } + return undefined; } } +customElements.define("ha-date-input", HaDateInput as any); + declare global { interface HTMLElementTagNameMap { "ha-date-input": HaDateInput; diff --git a/src/dialogs/more-info/controls/more-info-input_datetime.js b/src/dialogs/more-info/controls/more-info-input_datetime.js index f00a362820..b2e8c4453e 100644 --- a/src/dialogs/more-info/controls/more-info-input_datetime.js +++ b/src/dialogs/more-info/controls/more-info-input_datetime.js @@ -3,7 +3,7 @@ import "@polymer/paper-input/paper-input"; import { html } from "@polymer/polymer/lib/utils/html-tag"; /* eslint-plugin-disable lit */ import { PolymerElement } from "@polymer/polymer/polymer-element"; -import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker"; +import "../../../components/ha-date-input"; import { attributeClassNames } from "../../../common/entity/attribute_class_names"; import "../../../components/ha-relative-time"; import "../../../components/paper-time-input"; @@ -14,12 +14,12 @@ class DatetimeInput extends PolymerElement {