From dbebfc88d3f13b038159de975cdca2bb1082fe14 Mon Sep 17 00:00:00 2001 From: Wallerand Delevacq Date: Sat, 19 Oct 2024 12:27:42 +0200 Subject: [PATCH] Support Select/InputSelect mushroom cards (#151) Add cards * Select Card. * Input Select Card Contribution by wallforfry --- src/cards/InputSelectCard.ts | 41 +++++++++++++++++++ src/cards/SelectCard.ts | 41 +++++++++++++++++++ src/configurationDefaults.ts | 10 +++++ .../cards/select-card-config.ts | 18 ++++++++ src/types/strategy/cards.ts | 3 ++ 5 files changed, 113 insertions(+) create mode 100644 src/cards/InputSelectCard.ts create mode 100644 src/cards/SelectCard.ts create mode 100644 src/types/lovelace-mushroom/cards/select-card-config.ts diff --git a/src/cards/InputSelectCard.ts b/src/cards/InputSelectCard.ts new file mode 100644 index 0000000..1aee6a9 --- /dev/null +++ b/src/cards/InputSelectCard.ts @@ -0,0 +1,41 @@ +import {cards} from "../types/strategy/cards"; +import {EntityRegistryEntry} from "../types/homeassistant/data/entity_registry"; +import {SelectCardConfig} from "../types/lovelace-mushroom/cards/select-card-config"; +import {SelectCard} from './SelectCard'; + +// noinspection JSUnusedGlobalSymbols Class is dynamically imported +/** + * InputSelect Card Class + * + * Used to create a card for controlling an entity of the input_select domain. + * + * @class + * @extends AbstractCard + */ +class InputSelectCard extends SelectCard { + /** + * Default configuration of the card. + * + * @type {SelectCardConfig} + * @private + */ + #defaultConfig: SelectCardConfig = { + type: "custom:mushroom-select-card", + icon: undefined, + }; + + /** + * Class constructor. + * + * @param {EntityRegistryEntry} entity The hass entity to create a card for. + * @param {cards.InputSelectCardOptions} [options={}] Options for the card. + * @throws {Error} If the Helper module isn't initialized. + */ + constructor(entity: EntityRegistryEntry, options: cards.InputSelectCardOptions = {}) { + super(entity); + + this.config = Object.assign(this.config, this.#defaultConfig, options); + } +} + +export {InputSelectCard}; diff --git a/src/cards/SelectCard.ts b/src/cards/SelectCard.ts new file mode 100644 index 0000000..a1c7ad3 --- /dev/null +++ b/src/cards/SelectCard.ts @@ -0,0 +1,41 @@ +import {AbstractCard} from "./AbstractCard"; +import {cards} from "../types/strategy/cards"; +import {EntityRegistryEntry} from "../types/homeassistant/data/entity_registry"; +import {SelectCardConfig} from "../types/lovelace-mushroom/cards/select-card-config"; + +// noinspection JSUnusedGlobalSymbols Class is dynamically imported +/** + * Select Card Class + * + * Used to create a card for controlling an entity of the select domain. + * + * @class + * @extends AbstractCard + */ +class SelectCard extends AbstractCard { + /** + * Default configuration of the card. + * + * @type {SelectCardConfig} + * @private + */ + #defaultConfig: SelectCardConfig = { + type: "custom:mushroom-select-card", + icon: undefined, + }; + + /** + * Class constructor. + * + * @param {EntityRegistryEntry} entity The hass entity to create a card for. + * @param {cards.SelectCardOptions} [options={}] Options for the card. + * @throws {Error} If the Helper module isn't initialized. + */ + constructor(entity: EntityRegistryEntry, options: cards.SelectCardOptions = {}) { + super(entity); + + this.config = Object.assign(this.config, this.#defaultConfig, options); + } +} + +export {SelectCard}; diff --git a/src/configurationDefaults.ts b/src/configurationDefaults.ts index d5366b3..c777041 100644 --- a/src/configurationDefaults.ts +++ b/src/configurationDefaults.ts @@ -100,6 +100,16 @@ export const configurationDefaults: StrategyDefaults = { showControls: true, hidden: false, }, + select: { + title: "Selects", + showControls: false, + hidden: false, + }, + input_select: { + title: "Input Selects", + showControls: false, + hidden: false, + }, }, home_view: { hidden: [], diff --git a/src/types/lovelace-mushroom/cards/select-card-config.ts b/src/types/lovelace-mushroom/cards/select-card-config.ts new file mode 100644 index 0000000..2a7361b --- /dev/null +++ b/src/types/lovelace-mushroom/cards/select-card-config.ts @@ -0,0 +1,18 @@ +import {ActionsSharedConfig} from "../shared/config/actions-config"; +import {LovelaceCardConfig} from "../../homeassistant/data/lovelace"; +import {EntitySharedConfig} from "../shared/config/entity-config"; +import {AppearanceSharedConfig} from "../shared/config/appearance-config"; + +/** + * Select Card Config. + * + * @property {string} [icon_color=blue] Custom color for icon when entity state is active. + * + * @see https://github.com/piitaya/lovelace-mushroom/blob/main/docs/cards/select.md + */ +export type SelectCardConfig = LovelaceCardConfig & + EntitySharedConfig & + AppearanceSharedConfig & + ActionsSharedConfig & { + icon_color?: string; +}; diff --git a/src/types/strategy/cards.ts b/src/types/strategy/cards.ts index b8582a2..a5574a8 100644 --- a/src/types/strategy/cards.ts +++ b/src/types/strategy/cards.ts @@ -16,6 +16,7 @@ import {MediaPlayerCardConfig} from "../lovelace-mushroom/cards/media-player-car import {NumberCardConfig} from "../lovelace-mushroom/cards/number-card-config"; import {PersonCardConfig} from "../lovelace-mushroom/cards/person-card-config"; import {VacuumCardConfig} from "../lovelace-mushroom/cards/vacuum-card-config"; +import {SelectCardConfig} from '../lovelace-mushroom/cards/select-card-config'; export namespace cards { /** @@ -58,6 +59,8 @@ export namespace cards { export type PictureEntityCardOptions = Omit; export type TemplateCardOptions = Omit; export type VacuumCardOptions = Omit; + export type SelectCardOptions = Omit; + export type InputSelectCardOptions = Omit; }