mirror of
https://github.com/home-assistant/frontend.git
synced 2025-04-27 14:57:20 +00:00
Add entity include and exclude to selector (#12078)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
This commit is contained in:
parent
49124f6f09
commit
88af0aa788
@ -46,6 +46,22 @@ class HaEntitiesPickerLight extends LitElement {
|
|||||||
@property({ type: Array, attribute: "include-unit-of-measurement" })
|
@property({ type: Array, attribute: "include-unit-of-measurement" })
|
||||||
public includeUnitOfMeasurement?: string[];
|
public includeUnitOfMeasurement?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of allowed entities to show. Will ignore all other filters.
|
||||||
|
* @type {Array}
|
||||||
|
* @attr include-entities
|
||||||
|
*/
|
||||||
|
@property({ type: Array, attribute: "include-entities" })
|
||||||
|
public includeEntities?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of entities to be excluded.
|
||||||
|
* @type {Array}
|
||||||
|
* @attr exclude-entities
|
||||||
|
*/
|
||||||
|
@property({ type: Array, attribute: "exclude-entities" })
|
||||||
|
public excludeEntities?: string[];
|
||||||
|
|
||||||
@property({ attribute: "picked-entity-label" })
|
@property({ attribute: "picked-entity-label" })
|
||||||
public pickedEntityLabel?: string;
|
public pickedEntityLabel?: string;
|
||||||
|
|
||||||
@ -69,6 +85,8 @@ class HaEntitiesPickerLight extends LitElement {
|
|||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.includeDomains=${this.includeDomains}
|
.includeDomains=${this.includeDomains}
|
||||||
.excludeDomains=${this.excludeDomains}
|
.excludeDomains=${this.excludeDomains}
|
||||||
|
.includeEntities=${this.includeEntities}
|
||||||
|
.excludeEntities=${this.excludeEntities}
|
||||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||||
.includeUnitOfMeasurement=${this.includeUnitOfMeasurement}
|
.includeUnitOfMeasurement=${this.includeUnitOfMeasurement}
|
||||||
.entityFilter=${this._entityFilter}
|
.entityFilter=${this._entityFilter}
|
||||||
@ -84,6 +102,8 @@ class HaEntitiesPickerLight extends LitElement {
|
|||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.includeDomains=${this.includeDomains}
|
.includeDomains=${this.includeDomains}
|
||||||
.excludeDomains=${this.excludeDomains}
|
.excludeDomains=${this.excludeDomains}
|
||||||
|
.includeEntities=${this.includeEntities}
|
||||||
|
.excludeEntities=${this.excludeEntities}
|
||||||
.includeDeviceClasses=${this.includeDeviceClasses}
|
.includeDeviceClasses=${this.includeDeviceClasses}
|
||||||
.includeUnitOfMeasurement=${this.includeUnitOfMeasurement}
|
.includeUnitOfMeasurement=${this.includeUnitOfMeasurement}
|
||||||
.entityFilter=${this._entityFilter}
|
.entityFilter=${this._entityFilter}
|
||||||
|
@ -7,6 +7,7 @@ import memoizeOne from "memoize-one";
|
|||||||
import { fireEvent } from "../../common/dom/fire_event";
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
import { computeDomain } from "../../common/entity/compute_domain";
|
import { computeDomain } from "../../common/entity/compute_domain";
|
||||||
import { computeStateName } from "../../common/entity/compute_state_name";
|
import { computeStateName } from "../../common/entity/compute_state_name";
|
||||||
|
import { caseInsensitiveStringCompare } from "../../common/string/compare";
|
||||||
import { PolymerChangedEvent } from "../../polymer-types";
|
import { PolymerChangedEvent } from "../../polymer-types";
|
||||||
import { HomeAssistant } from "../../types";
|
import { HomeAssistant } from "../../types";
|
||||||
import "../ha-combo-box";
|
import "../ha-combo-box";
|
||||||
@ -77,6 +78,22 @@ export class HaEntityPicker extends LitElement {
|
|||||||
@property({ type: Array, attribute: "include-unit-of-measurement" })
|
@property({ type: Array, attribute: "include-unit-of-measurement" })
|
||||||
public includeUnitOfMeasurement?: string[];
|
public includeUnitOfMeasurement?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of allowed entities to show. Will ignore all other filters.
|
||||||
|
* @type {Array}
|
||||||
|
* @attr include-entities
|
||||||
|
*/
|
||||||
|
@property({ type: Array, attribute: "include-entities" })
|
||||||
|
public includeEntities?: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of entities to be excluded.
|
||||||
|
* @type {Array}
|
||||||
|
* @attr exclude-entities
|
||||||
|
*/
|
||||||
|
@property({ type: Array, attribute: "exclude-entities" })
|
||||||
|
public excludeEntities?: string[];
|
||||||
|
|
||||||
@property() public entityFilter?: HaEntityPickerEntityFilterFunc;
|
@property() public entityFilter?: HaEntityPickerEntityFilterFunc;
|
||||||
|
|
||||||
@property({ type: Boolean }) public hideClearIcon = false;
|
@property({ type: Boolean }) public hideClearIcon = false;
|
||||||
@ -109,7 +126,9 @@ export class HaEntityPicker extends LitElement {
|
|||||||
excludeDomains: this["excludeDomains"],
|
excludeDomains: this["excludeDomains"],
|
||||||
entityFilter: this["entityFilter"],
|
entityFilter: this["entityFilter"],
|
||||||
includeDeviceClasses: this["includeDeviceClasses"],
|
includeDeviceClasses: this["includeDeviceClasses"],
|
||||||
includeUnitOfMeasurement: this["includeUnitOfMeasurement"]
|
includeUnitOfMeasurement: this["includeUnitOfMeasurement"],
|
||||||
|
includeEntities: this["includeEntities"],
|
||||||
|
excludeEntities: this["excludeEntities"]
|
||||||
): HassEntityWithCachedName[] => {
|
): HassEntityWithCachedName[] => {
|
||||||
let states: HassEntityWithCachedName[] = [];
|
let states: HassEntityWithCachedName[] = [];
|
||||||
|
|
||||||
@ -139,6 +158,30 @@ export class HaEntityPicker extends LitElement {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (includeEntities) {
|
||||||
|
entityIds = entityIds.filter((entityId) =>
|
||||||
|
this.includeEntities!.includes(entityId)
|
||||||
|
);
|
||||||
|
|
||||||
|
return entityIds
|
||||||
|
.map((key) => ({
|
||||||
|
...hass!.states[key],
|
||||||
|
friendly_name: computeStateName(hass!.states[key]) || key,
|
||||||
|
}))
|
||||||
|
.sort((entityA, entityB) =>
|
||||||
|
caseInsensitiveStringCompare(
|
||||||
|
entityA.friendly_name,
|
||||||
|
entityB.friendly_name
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (excludeEntities) {
|
||||||
|
entityIds = entityIds.filter(
|
||||||
|
(entityId) => !excludeEntities!.includes(entityId)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (includeDomains) {
|
if (includeDomains) {
|
||||||
entityIds = entityIds.filter((eid) =>
|
entityIds = entityIds.filter((eid) =>
|
||||||
includeDomains.includes(computeDomain(eid))
|
includeDomains.includes(computeDomain(eid))
|
||||||
@ -151,10 +194,17 @@ export class HaEntityPicker extends LitElement {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
states = entityIds.sort().map((key) => ({
|
states = entityIds
|
||||||
|
.map((key) => ({
|
||||||
...hass!.states[key],
|
...hass!.states[key],
|
||||||
friendly_name: computeStateName(hass!.states[key]) || key,
|
friendly_name: computeStateName(hass!.states[key]) || key,
|
||||||
}));
|
}))
|
||||||
|
.sort((entityA, entityB) =>
|
||||||
|
caseInsensitiveStringCompare(
|
||||||
|
entityA.friendly_name,
|
||||||
|
entityB.friendly_name
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
if (includeDeviceClasses) {
|
if (includeDeviceClasses) {
|
||||||
states = states.filter(
|
states = states.filter(
|
||||||
@ -231,7 +281,9 @@ export class HaEntityPicker extends LitElement {
|
|||||||
this.excludeDomains,
|
this.excludeDomains,
|
||||||
this.entityFilter,
|
this.entityFilter,
|
||||||
this.includeDeviceClasses,
|
this.includeDeviceClasses,
|
||||||
this.includeUnitOfMeasurement
|
this.includeUnitOfMeasurement,
|
||||||
|
this.includeEntities,
|
||||||
|
this.excludeEntities
|
||||||
);
|
);
|
||||||
if (this._initedStates) {
|
if (this._initedStates) {
|
||||||
(this.comboBox as any).filteredItems = this._states;
|
(this.comboBox as any).filteredItems = this._states;
|
||||||
|
@ -6,8 +6,8 @@ import { subscribeEntityRegistry } from "../../data/entity_registry";
|
|||||||
import { EntitySelector } from "../../data/selector";
|
import { EntitySelector } from "../../data/selector";
|
||||||
import { SubscribeMixin } from "../../mixins/subscribe-mixin";
|
import { SubscribeMixin } from "../../mixins/subscribe-mixin";
|
||||||
import { HomeAssistant } from "../../types";
|
import { HomeAssistant } from "../../types";
|
||||||
import "../entity/ha-entity-picker";
|
|
||||||
import "../entity/ha-entities-picker";
|
import "../entity/ha-entities-picker";
|
||||||
|
import "../entity/ha-entity-picker";
|
||||||
|
|
||||||
@customElement("ha-selector-entity")
|
@customElement("ha-selector-entity")
|
||||||
export class HaEntitySelector extends SubscribeMixin(LitElement) {
|
export class HaEntitySelector extends SubscribeMixin(LitElement) {
|
||||||
@ -29,6 +29,8 @@ export class HaEntitySelector extends SubscribeMixin(LitElement) {
|
|||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.value=${this.value}
|
.value=${this.value}
|
||||||
.label=${this.label}
|
.label=${this.label}
|
||||||
|
.includeEntities=${this.selector.entity.includeEntities}
|
||||||
|
.excludeEntities=${this.selector.entity.excludeEntities}
|
||||||
.entityFilter=${this._filterEntities}
|
.entityFilter=${this._filterEntities}
|
||||||
.disabled=${this.disabled}
|
.disabled=${this.disabled}
|
||||||
allow-custom-entity
|
allow-custom-entity
|
||||||
@ -41,6 +43,8 @@ export class HaEntitySelector extends SubscribeMixin(LitElement) {
|
|||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.value=${this.value}
|
.value=${this.value}
|
||||||
.entityFilter=${this._filterEntities}
|
.entityFilter=${this._filterEntities}
|
||||||
|
.includeEntities=${this.selector.entity.includeEntities}
|
||||||
|
.excludeEntities=${this.selector.entity.excludeEntities}
|
||||||
></ha-entities-picker>
|
></ha-entities-picker>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,8 @@ export interface EntitySelector {
|
|||||||
domain?: string | string[];
|
domain?: string | string[];
|
||||||
device_class?: string;
|
device_class?: string;
|
||||||
multiple?: boolean;
|
multiple?: boolean;
|
||||||
|
includeEntities?: string[];
|
||||||
|
excludeEntities?: string[];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user