Don't use combine mode

This commit is contained in:
Paul Bottein 2025-07-17 17:34:06 +02:00
parent ea5c014552
commit 06f653117a
No known key found for this signature in database
4 changed files with 13 additions and 58 deletions

View File

@ -16,8 +16,6 @@ interface StateOption {
label: string;
}
const DEFAULT_COMBINE_MODE: "union" | "intersection" = "union";
@customElement("ha-entity-state-picker")
class HaEntityStatePicker extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@ -41,9 +39,6 @@ class HaEntityStatePicker extends LitElement {
@property({ attribute: false })
public hideStates?: string[];
@property({ attribute: "combine-mode" })
public combineMode?: "union" | "intersection";
@property() public label?: string;
@property() public value?: string;
@ -74,47 +69,25 @@ class HaEntityStatePicker extends LitElement {
}
const states = getStates(this.hass, stateObj, this.attribute).filter(
(s) => !this.hideStates || !this.hideStates.includes(s)
(s) => !this.hideStates?.includes(s)
);
return states.map((s) => ({
value: s,
label: !this.attribute
? this.hass.formatEntityState(stateObj, s)
: this.hass.formatEntityAttributeValue(stateObj, this.attribute, s),
label: this.attribute
? this.hass.formatEntityAttributeValue(stateObj, this.attribute, s)
: this.hass.formatEntityState(stateObj, s),
}));
});
const mode: "union" | "intersection" =
this.combineMode || DEFAULT_COMBINE_MODE;
let options: StateOption[] = [];
if (mode === "union") {
// Union: combine all unique states from all entities
options = entitiesOptions.reduce(
(acc, curr) => [
...acc,
...curr.filter(
(item) => !acc.some((existing) => existing.value === item.value)
),
],
[] as StateOption[]
);
} else if (mode === "intersection") {
// Intersection: only states that exist in ALL entities
if (entitiesOptions.length === 0) {
options = [];
} else if (entitiesOptions.length === 1) {
options = entitiesOptions[0];
} else {
options = entitiesOptions[0].filter((item) =>
entitiesOptions
.slice(1)
.every((entityOptions) =>
entityOptions.some((option) => option.value === item.value)
)
);
const options: StateOption[] = [];
const optionsSet = new Set<string>();
for (const entityOptions of entitiesOptions) {
for (const option of entityOptions) {
if (!optionsSet.has(option.value)) {
optionsSet.add(option.value);
options.push(option);
}
}
}

View File

@ -42,7 +42,6 @@ export class HaSelectorState extends SubscribeMixin(LitElement) {
.required=${this.required}
allow-custom-value
.hideStates=${this.selector.state?.hide_states}
.combineMode=${this.selector.state?.combine_mode}
></ha-entity-state-picker>
`;
}

View File

@ -55,20 +55,6 @@ const showOptionalToggle = (field) =>
!field.required &&
!("boolean" in field.selector && field.default);
const enrichSelector = (selector: Selector): Selector => {
// Default combine_mode to intersection for state selectors
if ("state" in selector) {
return {
...selector,
state: {
...selector.state,
combine_mode: selector.state?.combine_mode || "intersection",
},
};
}
return selector;
};
interface Field extends Omit<HassService["fields"][string], "selector"> {
key: string;
selector?: Selector;
@ -258,9 +244,7 @@ export class HaServiceControl extends LitElement {
).map(([key, value]) => ({
key,
...value,
selector: (value.selector
? enrichSelector(value.selector)
: undefined) as Selector | undefined,
selector: (value.selector || undefined) as Selector | undefined,
}));
const flatFields: Field[] = [];

View File

@ -396,7 +396,6 @@ export interface StateSelector {
entity_id?: string | string[];
attribute?: string;
hide_states?: string[];
combine_mode?: "union" | "intersection";
} | null;
}