Skip to content

Commit 5e53dbf

Browse files
committed
Add entity-first card picker for dashboard
1 parent 541c112 commit 5e53dbf

14 files changed

Lines changed: 1230 additions & 279 deletions

File tree

src/components/ha-generic-picker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,10 +440,13 @@ export class HaGenericPicker extends PickerMixin(LitElement) {
440440
}
441441
442442
wa-popover::part(body) {
443-
width: max(var(--body-width), 250px);
443+
width: max(
444+
var(--body-width),
445+
var(--ha-generic-picker-min-width, 250px)
446+
);
444447
max-width: var(
445448
--ha-generic-picker-max-width,
446-
max(var(--body-width), 250px)
449+
max(var(--body-width), var(--ha-generic-picker-min-width, 250px))
447450
);
448451
max-height: 500px;
449452
height: 70vh;
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
import type { HomeAssistant } from "../../../types";
2+
import { supportsAlarmModesCardFeature } from "./hui-alarm-modes-card-feature";
3+
import { supportsAreaControlsCardFeature } from "./hui-area-controls-card-feature";
4+
import { supportsBarGaugeCardFeature } from "./hui-bar-gauge-card-feature";
5+
import { supportsButtonCardFeature } from "./hui-button-card-feature";
6+
import { supportsClimateFanModesCardFeature } from "./hui-climate-fan-modes-card-feature";
7+
import { supportsClimateHvacModesCardFeature } from "./hui-climate-hvac-modes-card-feature";
8+
import { supportsClimatePresetModesCardFeature } from "./hui-climate-preset-modes-card-feature";
9+
import { supportsClimateSwingHorizontalModesCardFeature } from "./hui-climate-swing-horizontal-modes-card-feature";
10+
import { supportsClimateSwingModesCardFeature } from "./hui-climate-swing-modes-card-feature";
11+
import { supportsCounterActionsCardFeature } from "./hui-counter-actions-card-feature";
12+
import { supportsCoverOpenCloseCardFeature } from "./hui-cover-open-close-card-feature";
13+
import { supportsCoverPositionFavoriteCardFeature } from "./hui-cover-position-favorite-card-feature";
14+
import { supportsCoverPositionCardFeature } from "./hui-cover-position-card-feature";
15+
import { supportsCoverTiltCardFeature } from "./hui-cover-tilt-card-feature";
16+
import { supportsCoverTiltFavoriteCardFeature } from "./hui-cover-tilt-favorite-card-feature";
17+
import { supportsCoverTiltPositionCardFeature } from "./hui-cover-tilt-position-card-feature";
18+
import { supportsDateSetCardFeature } from "./hui-date-set-card-feature";
19+
import { supportsFanDirectionCardFeature } from "./hui-fan-direction-card-feature";
20+
import { supportsFanOscilatteCardFeature } from "./hui-fan-oscillate-card-feature";
21+
import { supportsFanPresetModesCardFeature } from "./hui-fan-preset-modes-card-feature";
22+
import { supportsFanSpeedCardFeature } from "./hui-fan-speed-card-feature";
23+
import { supportsHourlyForecastCardFeature } from "./hui-hourly-forecast-card-feature";
24+
import { supportsHumidifierModesCardFeature } from "./hui-humidifier-modes-card-feature";
25+
import { supportsHumidifierToggleCardFeature } from "./hui-humidifier-toggle-card-feature";
26+
import { supportsLawnMowerCommandCardFeature } from "./hui-lawn-mower-commands-card-feature";
27+
import { supportsLightBrightnessCardFeature } from "./hui-light-brightness-card-feature";
28+
import { supportsLightColorFavoritesCardFeature } from "./hui-light-color-favorites-card-feature";
29+
import { supportsLightColorTempCardFeature } from "./hui-light-color-temp-card-feature";
30+
import { supportsLockCommandsCardFeature } from "./hui-lock-commands-card-feature";
31+
import { supportsLockOpenDoorCardFeature } from "./hui-lock-open-door-card-feature";
32+
import { supportsMediaPlayerPlaybackCardFeature } from "./hui-media-player-playback-card-feature";
33+
import { supportsMediaPlayerSoundModeCardFeature } from "./hui-media-player-sound-mode-card-feature";
34+
import { supportsMediaPlayerSourceCardFeature } from "./hui-media-player-source-card-feature";
35+
import { supportsMediaPlayerVolumeButtonsCardFeature } from "./hui-media-player-volume-buttons-card-feature";
36+
import { supportsMediaPlayerVolumeSliderCardFeature } from "./hui-media-player-volume-slider-card-feature";
37+
import { supportsNumericInputCardFeature } from "./hui-numeric-input-card-feature";
38+
import { supportsSelectOptionsCardFeature } from "./hui-select-options-card-feature";
39+
import { supportsTargetHumidityCardFeature } from "./hui-target-humidity-card-feature";
40+
import { supportsTargetTemperatureCardFeature } from "./hui-target-temperature-card-feature";
41+
import { supportsToggleCardFeature } from "./hui-toggle-card-feature";
42+
import { supportsTrendGraphCardFeature } from "./hui-trend-graph-card-feature";
43+
import { supportsUpdateActionsCardFeature } from "./hui-update-actions-card-feature";
44+
import { supportsVacuumCommandsCardFeature } from "./hui-vacuum-commands-card-feature";
45+
import { supportsValveOpenCloseCardFeature } from "./hui-valve-open-close-card-feature";
46+
import { supportsValvePositionFavoriteCardFeature } from "./hui-valve-position-favorite-card-feature";
47+
import { supportsValvePositionCardFeature } from "./hui-valve-position-card-feature";
48+
import { supportsWaterHeaterOperationModesCardFeature } from "./hui-water-heater-operation-modes-card-feature";
49+
import type {
50+
LovelaceCardFeatureConfig,
51+
LovelaceCardFeatureContext,
52+
} from "./types";
53+
54+
export type FeatureType = LovelaceCardFeatureConfig["type"];
55+
56+
export type SupportsFeature = (
57+
hass: HomeAssistant,
58+
context: LovelaceCardFeatureContext
59+
) => boolean;
60+
61+
export const UI_FEATURE_TYPES = [
62+
"alarm-modes",
63+
"area-controls",
64+
"bar-gauge",
65+
"button",
66+
"climate-fan-modes",
67+
"climate-hvac-modes",
68+
"climate-preset-modes",
69+
"climate-swing-modes",
70+
"climate-swing-horizontal-modes",
71+
"counter-actions",
72+
"cover-open-close",
73+
"cover-position-favorite",
74+
"cover-position",
75+
"cover-tilt-favorite",
76+
"cover-tilt-position",
77+
"cover-tilt",
78+
"date-set",
79+
"fan-direction",
80+
"fan-oscillate",
81+
"fan-preset-modes",
82+
"fan-speed",
83+
"hourly-forecast",
84+
"humidifier-modes",
85+
"humidifier-toggle",
86+
"lawn-mower-commands",
87+
"light-brightness",
88+
"light-color-temp",
89+
"light-color-favorites",
90+
"lock-commands",
91+
"lock-open-door",
92+
"media-player-playback",
93+
"media-player-sound-mode",
94+
"media-player-source",
95+
"media-player-volume-buttons",
96+
"media-player-volume-slider",
97+
"numeric-input",
98+
"select-options",
99+
"trend-graph",
100+
"target-humidity",
101+
"target-temperature",
102+
"toggle",
103+
"update-actions",
104+
"vacuum-commands",
105+
"valve-open-close",
106+
"valve-position-favorite",
107+
"valve-position",
108+
"water-heater-operation-modes",
109+
] as const satisfies readonly FeatureType[];
110+
111+
export type UiFeatureType = (typeof UI_FEATURE_TYPES)[number];
112+
113+
export const SUPPORTS_FEATURE_TYPES: Record<UiFeatureType, SupportsFeature> = {
114+
"alarm-modes": supportsAlarmModesCardFeature,
115+
"area-controls": supportsAreaControlsCardFeature,
116+
"bar-gauge": supportsBarGaugeCardFeature,
117+
button: supportsButtonCardFeature,
118+
"climate-fan-modes": supportsClimateFanModesCardFeature,
119+
"climate-swing-modes": supportsClimateSwingModesCardFeature,
120+
"climate-swing-horizontal-modes":
121+
supportsClimateSwingHorizontalModesCardFeature,
122+
"climate-hvac-modes": supportsClimateHvacModesCardFeature,
123+
"climate-preset-modes": supportsClimatePresetModesCardFeature,
124+
"counter-actions": supportsCounterActionsCardFeature,
125+
"cover-open-close": supportsCoverOpenCloseCardFeature,
126+
"cover-position-favorite": supportsCoverPositionFavoriteCardFeature,
127+
"cover-position": supportsCoverPositionCardFeature,
128+
"cover-tilt-favorite": supportsCoverTiltFavoriteCardFeature,
129+
"cover-tilt-position": supportsCoverTiltPositionCardFeature,
130+
"cover-tilt": supportsCoverTiltCardFeature,
131+
"date-set": supportsDateSetCardFeature,
132+
"fan-direction": supportsFanDirectionCardFeature,
133+
"fan-oscillate": supportsFanOscilatteCardFeature,
134+
"fan-preset-modes": supportsFanPresetModesCardFeature,
135+
"fan-speed": supportsFanSpeedCardFeature,
136+
"hourly-forecast": supportsHourlyForecastCardFeature,
137+
"humidifier-modes": supportsHumidifierModesCardFeature,
138+
"humidifier-toggle": supportsHumidifierToggleCardFeature,
139+
"lawn-mower-commands": supportsLawnMowerCommandCardFeature,
140+
"light-brightness": supportsLightBrightnessCardFeature,
141+
"light-color-temp": supportsLightColorTempCardFeature,
142+
"light-color-favorites": supportsLightColorFavoritesCardFeature,
143+
"lock-commands": supportsLockCommandsCardFeature,
144+
"lock-open-door": supportsLockOpenDoorCardFeature,
145+
"media-player-playback": supportsMediaPlayerPlaybackCardFeature,
146+
"media-player-sound-mode": supportsMediaPlayerSoundModeCardFeature,
147+
"media-player-source": supportsMediaPlayerSourceCardFeature,
148+
"media-player-volume-buttons": supportsMediaPlayerVolumeButtonsCardFeature,
149+
"media-player-volume-slider": supportsMediaPlayerVolumeSliderCardFeature,
150+
"numeric-input": supportsNumericInputCardFeature,
151+
"select-options": supportsSelectOptionsCardFeature,
152+
"trend-graph": supportsTrendGraphCardFeature,
153+
"target-humidity": supportsTargetHumidityCardFeature,
154+
"target-temperature": supportsTargetTemperatureCardFeature,
155+
toggle: supportsToggleCardFeature,
156+
"update-actions": supportsUpdateActionsCardFeature,
157+
"vacuum-commands": supportsVacuumCommandsCardFeature,
158+
"valve-open-close": supportsValveOpenCloseCardFeature,
159+
"valve-position-favorite": supportsValvePositionFavoriteCardFeature,
160+
"valve-position": supportsValvePositionCardFeature,
161+
"water-heater-operation-modes": supportsWaterHeaterOperationModesCardFeature,
162+
};
163+
164+
export const supportsFeatureType = (
165+
hass: HomeAssistant,
166+
context: LovelaceCardFeatureContext,
167+
type: UiFeatureType
168+
): boolean => SUPPORTS_FEATURE_TYPES[type](hass, context);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { computeDomain } from "../../../common/entity/compute_domain";
2+
import type { CalendarCardConfig } from "../cards/types";
3+
import type { CardSuggestionProvider } from "./types";
4+
5+
export const calendarCardSuggestions: CardSuggestionProvider<CalendarCardConfig> =
6+
{
7+
getEntitySuggestion(_hass, entityId) {
8+
if (computeDomain(entityId) !== "calendar") return null;
9+
return {
10+
id: "calendar",
11+
label: "Calendar",
12+
config: { type: "calendar", entities: [entityId] },
13+
};
14+
},
15+
};

0 commit comments

Comments
 (0)