diff --git a/src/components/data-table/ha-data-table-labels.ts b/src/components/data-table/ha-data-table-labels.ts index 1c47f0bf64..66c137e92a 100644 --- a/src/components/data-table/ha-data-table-labels.ts +++ b/src/components/data-table/ha-data-table-labels.ts @@ -5,20 +5,22 @@ import { LabelRegistryEntry } from "../../data/label_registry"; import { computeCssColor } from "../../common/color/compute-color"; import { fireEvent } from "../../common/dom/fire_event"; import "../ha-label"; +import { stringCompare } from "../../common/string/compare"; @customElement("ha-data-table-labels") class HaDataTableLabels extends LitElement { @property({ attribute: false }) public labels!: LabelRegistryEntry[]; protected render(): TemplateResult { + const labels = this.labels.sort((a, b) => stringCompare(a.name, b.name)); return html` ${repeat( - this.labels.slice(0, 2), + labels.slice(0, 2), (label) => label.label_id, (label) => this._renderLabel(label, true) )} - ${this.labels.length > 2 + ${labels.length > 2 ? html` - +${this.labels.length - 2} + +${labels.length - 2} ${repeat( - this.labels.slice(2), + labels.slice(2), (label) => label.label_id, (label) => html` diff --git a/src/components/ha-labels-picker.ts b/src/components/ha-labels-picker.ts index ccf4511a61..2cc592e26e 100644 --- a/src/components/ha-labels-picker.ts +++ b/src/components/ha-labels-picker.ts @@ -17,6 +17,7 @@ import "./chips/ha-input-chip"; import type { HaDevicePickerDeviceFilterFunc } from "./device/ha-device-picker"; import "./ha-label-picker"; import type { HaLabelPicker } from "./ha-label-picker"; +import { stringCompare } from "../common/string/compare"; @customElement("ha-labels-picker") export class HaLabelsPicker extends SubscribeMixin(LitElement) { @@ -75,7 +76,7 @@ export class HaLabelsPicker extends SubscribeMixin(LitElement) { @property({ type: Boolean }) public required = false; - @state() private _labels?: LabelRegistryEntry[]; + @state() private _labels?: { [id: string]: LabelRegistryEntry }; @query("ha-label-picker", true) public labelPicker!: HaLabelPicker; @@ -92,22 +93,28 @@ export class HaLabelsPicker extends SubscribeMixin(LitElement) { protected hassSubscribe(): (UnsubscribeFunc | Promise)[] { return [ subscribeLabelRegistry(this.hass.connection, (labels) => { - this._labels = labels; + const lookUp = {}; + labels.forEach((label) => { + lookUp[label.label_id] = label; + }); + this._labels = lookUp; }), ]; } protected render(): TemplateResult { + const labels = this.value + ?.map((id) => this._labels?.[id]) + .sort((a, b) => + stringCompare(a?.name || "", b?.name || "", this.hass.locale.language) + ); return html` - ${this.value?.length + ${labels?.length ? html` ${repeat( - this.value, - (item) => item, - (item, idx) => { - const label = this._labels?.find( - (lbl) => lbl.label_id === item - ); + labels, + (label) => label?.label_id, + (label, idx) => { const color = label?.color ? computeCssColor(label.color) : undefined; @@ -168,9 +175,6 @@ export class HaLabelsPicker extends SubscribeMixin(LitElement) { label.label_id, values ); - this._labels = this._labels!.map((lbl) => - lbl.label_id === updated.label_id ? updated : lbl - ); return updated; }, });