From aa66d8891c98b68959f2734725710eb42f09f76a Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:39:54 +0200 Subject: [PATCH] Improve date-range-picker mobile presets (#51285) --- .../date-picker/date-range-picker.ts | 79 +++++++++++++++---- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/src/components/date-picker/date-range-picker.ts b/src/components/date-picker/date-range-picker.ts index 50072250c7..bd06241ad1 100644 --- a/src/components/date-picker/date-range-picker.ts +++ b/src/components/date-picker/date-range-picker.ts @@ -19,7 +19,12 @@ import { localizeContext, } from "../../data/context"; import { TimeZone } from "../../data/translation"; +import { MobileAwareMixin } from "../../mixins/mobile-aware-mixin"; +import { haStyleScrollbar } from "../../resources/styles"; import type { ValueChangedEvent } from "../../types"; +import "../chips/ha-chip-set"; +import "../chips/ha-filter-chip"; +import type { HaFilterChip } from "../chips/ha-filter-chip"; import type { HaBaseTimeInput } from "../ha-base-time-input"; import "../ha-icon-button"; import "../ha-icon-button-next"; @@ -27,12 +32,12 @@ import "../ha-icon-button-prev"; import "../ha-list"; import "../ha-list-item"; import "../ha-time-input"; +import type { HaTimeInput } from "../ha-time-input"; import type { DateRangePickerRanges } from "./ha-date-range-picker"; import { datePickerStyles, dateRangePickerStyles } from "./styles"; -import type { HaTimeInput } from "../ha-time-input"; @customElement("date-range-picker") -export class DateRangePicker extends LitElement { +export class DateRangePicker extends MobileAwareMixin(LitElement) { @property({ attribute: false }) public ranges?: DateRangePickerRanges | false; @property({ attribute: false }) public startDate?: Date; @@ -103,16 +108,38 @@ export class DateRangePicker extends LitElement { } } + private _renderRanges() { + if (this._isMobileSize) { + return html` + + ${Object.entries(this.ranges!).map( + ([name, range], index) => html` + + ${name} + + ` + )} + + `; + } + + return html` + + ${Object.keys(this.ranges!).map( + (name) => html`${name}` + )} + + `; + } + render() { return html`
${this.ranges !== false && this.ranges - ? html`
- - ${Object.keys(this.ranges).map( - (name) => html`${name}` - )} - -
` + ? html`
${this._renderRanges()}
` : nothing}
) { const dateRange: [Date, Date] = Object.values(this.ranges!)[ ev.detail.index ]; + this._saveDateRangePreset(dateRange, ev.detail.index); + } + + private _saveDateRangePreset(range: [Date, Date], index: number) { fireEvent(this, "value-changed", { value: { - startDate: dateRange[0], - endDate: dateRange[1], + startDate: range[0], + endDate: range[1], }, }); fireEvent(this, "preset-selected", { - index: ev.detail.index, + index, }); } @@ -306,6 +345,7 @@ export class DateRangePicker extends LitElement { static styles = [ datePickerStyles, dateRangePickerStyles, + haStyleScrollbar, css` .picker { display: flex; @@ -313,7 +353,7 @@ export class DateRangePicker extends LitElement { } .date-range-ranges { - border-right: 1px solid var(--divider-color); + border-right: var(--ha-border-width-sm) solid var(--divider-color); min-width: 140px; flex: 0 1 30%; } @@ -327,16 +367,21 @@ export class DateRangePicker extends LitElement { overflow-x: hidden; } - @media only screen and (max-width: 460px) { + @media all and (max-width: 450px), all and (max-height: 500px) { .picker { flex-direction: column; } .date-range-ranges { - flex-basis: 180px; border-bottom: 1px solid var(--divider-color); - border-right: none; - overflow-y: scroll; + margin-top: var(--ha-space-5); + overflow: visible; + } + + ha-chip-set { + padding: var(--ha-space-3); + flex-wrap: nowrap; + overflow-x: auto; } .range {