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 {
-
+ >
diff --git a/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts
index 46e5a1e88c..3d3ab67e60 100644
--- a/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts
+++ b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts
@@ -57,9 +57,7 @@ class HuiInputDatetimeEntityRow extends LitElement implements LovelaceRow {
? html`