@@ -6,16 +6,10 @@ import { customElement, property, query } from "lit/decorators";
66import memoizeOne from "memoize-one" ;
77import { fireEvent } from "../common/dom/fire_event" ;
88import { computeAreaName } from "../common/entity/compute_area_name" ;
9- import { computeDomain } from "../common/entity/compute_domain" ;
109import { computeFloorName } from "../common/entity/compute_floor_name" ;
1110import { getAreaContext } from "../common/entity/context/get_area_context" ;
12- import { createAreaRegistryEntry } from "../data/area_registry" ;
13- import type {
14- DeviceEntityDisplayLookup ,
15- DeviceRegistryEntry ,
16- } from "../data/device/device_registry" ;
17- import { getDeviceEntityDisplayLookup } from "../data/device/device_registry" ;
18- import type { EntityRegistryDisplayEntry } from "../data/entity/entity_registry" ;
11+ import { areaComboBoxKeys , getAreas } from "../data/area/area_picker" ;
12+ import { createAreaRegistryEntry } from "../data/area/area_registry" ;
1913import { showAlertDialog } from "../dialogs/generic/show-dialog-box" ;
2014import { showAreaRegistryDetailDialog } from "../panels/config/areas/show-dialog-area-registry-detail" ;
2115import type { HomeAssistant , ValueChangedEvent } from "../types" ;
@@ -30,12 +24,6 @@ import "./ha-svg-icon";
3024
3125const ADD_NEW_ID = "___ADD_NEW___" ;
3226
33- const SEARCH_KEYS = [
34- { name : "search_labels.areaName" , weight : 10 } ,
35- { name : "search_labels.aliases" , weight : 8 } ,
36- { name : "search_labels.floorName" , weight : 6 } ,
37- { name : "search_labels.id" , weight : 3 } ,
38- ] ;
3927@customElement ( "ha-area-picker" )
4028export class HaAreaPicker extends LitElement {
4129 @property ( { attribute : false } ) public hass ! : HomeAssistant ;
@@ -102,6 +90,8 @@ export class HaAreaPicker extends LitElement {
10290 await this . _picker ?. open ( ) ;
10391 }
10492
93+ private _getAreasMemoized = memoizeOne ( getAreas ) ;
94+
10595 // Recompute value renderer when the areas change
10696 private _computeValueRenderer = memoizeOne (
10797 ( _haAreas : HomeAssistant [ "areas" ] ) : PickerValueRenderer =>
@@ -137,183 +127,13 @@ export class HaAreaPicker extends LitElement {
137127 }
138128 ) ;
139129
140- private _getAreas = memoizeOne (
141- (
142- haAreas : HomeAssistant [ "areas" ] ,
143- haDevices : HomeAssistant [ "devices" ] ,
144- haEntities : HomeAssistant [ "entities" ] ,
145- includeDomains : this[ "includeDomains" ] ,
146- excludeDomains : this[ "excludeDomains" ] ,
147- includeDeviceClasses : this[ "includeDeviceClasses" ] ,
148- deviceFilter : this[ "deviceFilter" ] ,
149- entityFilter : this[ "entityFilter" ] ,
150- excludeAreas : this[ "excludeAreas" ]
151- ) : PickerComboBoxItem [ ] => {
152- let deviceEntityLookup : DeviceEntityDisplayLookup = { } ;
153- let inputDevices : DeviceRegistryEntry [ ] | undefined ;
154- let inputEntities : EntityRegistryDisplayEntry [ ] | undefined ;
155-
156- const areas = Object . values ( haAreas ) ;
157- const devices = Object . values ( haDevices ) ;
158- const entities = Object . values ( haEntities ) ;
159-
160- if (
161- includeDomains ||
162- excludeDomains ||
163- includeDeviceClasses ||
164- deviceFilter ||
165- entityFilter
166- ) {
167- deviceEntityLookup = getDeviceEntityDisplayLookup ( entities ) ;
168- inputDevices = devices ;
169- inputEntities = entities . filter ( ( entity ) => entity . area_id ) ;
170-
171- if ( includeDomains ) {
172- inputDevices = inputDevices ! . filter ( ( device ) => {
173- const devEntities = deviceEntityLookup [ device . id ] ;
174- if ( ! devEntities || ! devEntities . length ) {
175- return false ;
176- }
177- return deviceEntityLookup [ device . id ] . some ( ( entity ) =>
178- includeDomains . includes ( computeDomain ( entity . entity_id ) )
179- ) ;
180- } ) ;
181- inputEntities = inputEntities ! . filter ( ( entity ) =>
182- includeDomains . includes ( computeDomain ( entity . entity_id ) )
183- ) ;
184- }
185-
186- if ( excludeDomains ) {
187- inputDevices = inputDevices ! . filter ( ( device ) => {
188- const devEntities = deviceEntityLookup [ device . id ] ;
189- if ( ! devEntities || ! devEntities . length ) {
190- return true ;
191- }
192- return entities . every (
193- ( entity ) =>
194- ! excludeDomains . includes ( computeDomain ( entity . entity_id ) )
195- ) ;
196- } ) ;
197- inputEntities = inputEntities ! . filter (
198- ( entity ) =>
199- ! excludeDomains . includes ( computeDomain ( entity . entity_id ) )
200- ) ;
201- }
202-
203- if ( includeDeviceClasses ) {
204- inputDevices = inputDevices ! . filter ( ( device ) => {
205- const devEntities = deviceEntityLookup [ device . id ] ;
206- if ( ! devEntities || ! devEntities . length ) {
207- return false ;
208- }
209- return deviceEntityLookup [ device . id ] . some ( ( entity ) => {
210- const stateObj = this . hass . states [ entity . entity_id ] ;
211- if ( ! stateObj ) {
212- return false ;
213- }
214- return (
215- stateObj . attributes . device_class &&
216- includeDeviceClasses . includes ( stateObj . attributes . device_class )
217- ) ;
218- } ) ;
219- } ) ;
220- inputEntities = inputEntities ! . filter ( ( entity ) => {
221- const stateObj = this . hass . states [ entity . entity_id ] ;
222- return (
223- stateObj . attributes . device_class &&
224- includeDeviceClasses . includes ( stateObj . attributes . device_class )
225- ) ;
226- } ) ;
227- }
228-
229- if ( deviceFilter ) {
230- inputDevices = inputDevices ! . filter ( ( device ) =>
231- deviceFilter ! ( device )
232- ) ;
233- }
234-
235- if ( entityFilter ) {
236- inputDevices = inputDevices ! . filter ( ( device ) => {
237- const devEntities = deviceEntityLookup [ device . id ] ;
238- if ( ! devEntities || ! devEntities . length ) {
239- return false ;
240- }
241- return deviceEntityLookup [ device . id ] . some ( ( entity ) => {
242- const stateObj = this . hass . states [ entity . entity_id ] ;
243- if ( ! stateObj ) {
244- return false ;
245- }
246- return entityFilter ( stateObj ) ;
247- } ) ;
248- } ) ;
249- inputEntities = inputEntities ! . filter ( ( entity ) => {
250- const stateObj = this . hass . states [ entity . entity_id ] ;
251- if ( ! stateObj ) {
252- return false ;
253- }
254- return entityFilter ! ( stateObj ) ;
255- } ) ;
256- }
257- }
258-
259- let outputAreas = areas ;
260-
261- let areaIds : string [ ] | undefined ;
262-
263- if ( inputDevices ) {
264- areaIds = inputDevices
265- . filter ( ( device ) => device . area_id )
266- . map ( ( device ) => device . area_id ! ) ;
267- }
268-
269- if ( inputEntities ) {
270- areaIds = ( areaIds ?? [ ] ) . concat (
271- inputEntities
272- . filter ( ( entity ) => entity . area_id )
273- . map ( ( entity ) => entity . area_id ! )
274- ) ;
275- }
276-
277- if ( areaIds ) {
278- outputAreas = outputAreas . filter ( ( area ) =>
279- areaIds ! . includes ( area . area_id )
280- ) ;
281- }
282-
283- if ( excludeAreas ) {
284- outputAreas = outputAreas . filter (
285- ( area ) => ! excludeAreas ! . includes ( area . area_id )
286- ) ;
287- }
288-
289- const items = outputAreas . map < PickerComboBoxItem > ( ( area ) => {
290- const { floor } = getAreaContext ( area , this . hass . floors ) ;
291- const floorName = floor ? computeFloorName ( floor ) : undefined ;
292- const areaName = computeAreaName ( area ) ;
293- return {
294- id : area . area_id ,
295- primary : areaName || area . area_id ,
296- secondary : floorName ,
297- icon : area . icon || undefined ,
298- icon_path : area . icon ? undefined : mdiTextureBox ,
299- search_labels : {
300- areaName : areaName || null ,
301- floorName : floorName || null ,
302- id : area . area_id ,
303- aliases : area . aliases . join ( " " ) ,
304- } ,
305- } ;
306- } ) ;
307-
308- return items ;
309- }
310- ) ;
311-
312130 private _getItems = ( ) =>
313- this . _getAreas (
131+ this . _getAreasMemoized (
314132 this . hass . areas ,
133+ this . hass . floors ,
315134 this . hass . devices ,
316135 this . hass . entities ,
136+ this . hass . states ,
317137 this . includeDomains ,
318138 this . excludeDomains ,
319139 this . includeDeviceClasses ,
@@ -394,7 +214,7 @@ export class HaAreaPicker extends LitElement {
394214 .getAdditionalItems=${ this . _getAdditionalItems }
395215 .valueRenderer=${ valueRenderer }
396216 .addButtonLabel=${ this . addButtonLabel }
397- .searchKeys=${ SEARCH_KEYS }
217+ .searchKeys=${ areaComboBoxKeys }
398218 .unknownItemText=${ this . hass . localize (
399219 "ui.components.area-picker.unknown"
400220 ) }
0 commit comments