${this.enableDay
? html`
diff --git a/src/components/ha-combo-box.ts b/src/components/ha-combo-box.ts
index f8f1bd5cde..7c44541bcc 100644
--- a/src/components/ha-combo-box.ts
+++ b/src/components/ha-combo-box.ts
@@ -87,6 +87,8 @@ export class HaComboBox extends LitElement {
@property({ type: Boolean }) public disabled?: boolean;
+ @property({ type: Boolean }) public required?: boolean;
+
@property({ type: Boolean, reflect: true, attribute: "opened" })
private _opened?: boolean;
@@ -119,6 +121,7 @@ export class HaComboBox extends LitElement {
.filteredItems=${this.filteredItems}
.allowCustomValue=${this.allowCustomValue}
.disabled=${this.disabled}
+ .required=${this.required}
${comboBoxRenderer(this.renderer || this._defaultRowRenderer)}
@opened-changed=${this._openedChanged}
@filter-changed=${this._filterChanged}
@@ -129,6 +132,7 @@ export class HaComboBox extends LitElement {
.label=${this.label}
.placeholder=${this.placeholder}
.disabled=${this.disabled}
+ .required=${this.required}
.validationMessage=${this.validationMessage}
.errorMessage=${this.errorMessage}
class="input"
diff --git a/src/components/ha-date-input.ts b/src/components/ha-date-input.ts
index 7575e3bcef..0963b1fd02 100644
--- a/src/components/ha-date-input.ts
+++ b/src/components/ha-date-input.ts
@@ -35,6 +35,8 @@ export class HaDateInput extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = false;
+
@property() public label?: string;
render() {
@@ -46,6 +48,7 @@ export class HaDateInput extends LitElement {
.value=${this.value
? formatDateNumeric(new Date(this.value), this.locale)
: ""}
+ .required=${this.required}
>
`;
diff --git a/src/components/ha-icon-picker.ts b/src/components/ha-icon-picker.ts
index 57ec368cdc..719976bde2 100644
--- a/src/components/ha-icon-picker.ts
+++ b/src/components/ha-icon-picker.ts
@@ -39,6 +39,8 @@ export class HaIconPicker extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = false;
+
@property({ type: Boolean }) public invalid = false;
@state() private _opened = false;
@@ -56,6 +58,7 @@ export class HaIconPicker extends LitElement {
.filteredItems=${iconItems}
.label=${this.label}
.disabled=${this.disabled}
+ .required=${this.required}
.placeholder=${this.placeholder}
.errorMessage=${this.errorMessage}
.invalid=${this.invalid}
diff --git a/src/components/ha-labeled-slider.js b/src/components/ha-labeled-slider.js
index f029b2f21f..af7134ab13 100644
--- a/src/components/ha-labeled-slider.js
+++ b/src/components/ha-labeled-slider.js
@@ -33,7 +33,7 @@ class HaLabeledSlider extends PolymerElement {
}
-
@@ -49,10 +49,15 @@ class HaLabeledSlider extends PolymerElement {
`;
}
+ _getTitle() {
+ return `${this.caption}${this.required ? "*" : ""}`;
+ }
+
static get properties() {
return {
caption: String,
disabled: Boolean,
+ required: Boolean,
min: Number,
max: Number,
pin: Boolean,
diff --git a/src/components/ha-selector/ha-selector-addon.ts b/src/components/ha-selector/ha-selector-addon.ts
index 47bb9c045b..acabb24cf5 100644
--- a/src/components/ha-selector/ha-selector-addon.ts
+++ b/src/components/ha-selector/ha-selector-addon.ts
@@ -14,11 +14,17 @@ export class HaAddonSelector extends LitElement {
@property() public label?: string;
+ @property({ type: Boolean }) public disabled = false;
+
+ @property({ type: Boolean }) public required = true;
+
protected render() {
return html`
`;
}
diff --git a/src/components/ha-selector/ha-selector-area.ts b/src/components/ha-selector/ha-selector-area.ts
index e6926c9701..8aaada7e23 100644
--- a/src/components/ha-selector/ha-selector-area.ts
+++ b/src/components/ha-selector/ha-selector-area.ts
@@ -22,6 +22,8 @@ export class HaAreaSelector extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected updated(changedProperties) {
if (changedProperties.has("selector")) {
const oldSelector = changedProperties.get("selector");
@@ -55,6 +57,7 @@ export class HaAreaSelector extends LitElement {
? [this.selector.area.entity.domain]
: undefined}
.disabled=${this.disabled}
+ .required=${this.required}
>
`;
}
@@ -74,6 +77,7 @@ export class HaAreaSelector extends LitElement {
? [this.selector.area.entity.domain]
: undefined}
.disabled=${this.disabled}
+ .required=${this.required}
>
`;
}
diff --git a/src/components/ha-selector/ha-selector-attribute.ts b/src/components/ha-selector/ha-selector-attribute.ts
index a75f9bb5ec..06baa1e6b6 100644
--- a/src/components/ha-selector/ha-selector-attribute.ts
+++ b/src/components/ha-selector/ha-selector-attribute.ts
@@ -1,10 +1,10 @@
-import "../entity/ha-entity-attribute-picker";
import { html, LitElement, PropertyValues } from "lit";
import { customElement, property } from "lit/decorators";
+import { fireEvent } from "../../common/dom/fire_event";
import { AttributeSelector } from "../../data/selector";
import { SubscribeMixin } from "../../mixins/subscribe-mixin";
import { HomeAssistant } from "../../types";
-import { fireEvent } from "../../common/dom/fire_event";
+import "../entity/ha-entity-attribute-picker";
@customElement("ha-selector-attribute")
export class HaSelectorAttribute extends SubscribeMixin(LitElement) {
@@ -18,6 +18,8 @@ export class HaSelectorAttribute extends SubscribeMixin(LitElement) {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
@property() public context?: {
filter_entity?: string;
};
@@ -31,6 +33,7 @@ export class HaSelectorAttribute extends SubscribeMixin(LitElement) {
.value=${this.value}
.label=${this.label}
.disabled=${this.disabled}
+ .required=${this.required}
allow-custom-value
>
`;
diff --git a/src/components/ha-selector/ha-selector-color-rgb.ts b/src/components/ha-selector/ha-selector-color-rgb.ts
index 5357a80db3..780d83c832 100644
--- a/src/components/ha-selector/ha-selector-color-rgb.ts
+++ b/src/components/ha-selector/ha-selector-color-rgb.ts
@@ -1,9 +1,9 @@
import { css, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
-import type { HomeAssistant } from "../../types";
-import type { ColorRGBSelector } from "../../data/selector";
-import { fireEvent } from "../../common/dom/fire_event";
import { hex2rgb, rgb2hex } from "../../common/color/convert-color";
+import { fireEvent } from "../../common/dom/fire_event";
+import type { ColorRGBSelector } from "../../data/selector";
+import type { HomeAssistant } from "../../types";
import "../ha-textfield";
@customElement("ha-selector-color_rgb")
@@ -18,12 +18,16 @@ export class HaColorRGBSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected render() {
return html`
`;
diff --git a/src/components/ha-selector/ha-selector-color-temp.ts b/src/components/ha-selector/ha-selector-color-temp.ts
index 684a813225..67ac8abcc7 100644
--- a/src/components/ha-selector/ha-selector-color-temp.ts
+++ b/src/components/ha-selector/ha-selector-color-temp.ts
@@ -1,8 +1,8 @@
import { css, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
-import type { HomeAssistant } from "../../types";
-import type { ColorTempSelector } from "../../data/selector";
import { fireEvent } from "../../common/dom/fire_event";
+import type { ColorTempSelector } from "../../data/selector";
+import type { HomeAssistant } from "../../types";
import "../ha-labeled-slider";
@customElement("ha-selector-color_temp")
@@ -17,6 +17,8 @@ export class HaColorTempSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected render() {
return html`
`;
diff --git a/src/components/ha-selector/ha-selector-date.ts b/src/components/ha-selector/ha-selector-date.ts
index d8b5742f90..47fa5b7d91 100644
--- a/src/components/ha-selector/ha-selector-date.ts
+++ b/src/components/ha-selector/ha-selector-date.ts
@@ -1,7 +1,7 @@
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
-import type { HomeAssistant } from "../../types";
import type { DateSelector } from "../../data/selector";
+import type { HomeAssistant } from "../../types";
import "../ha-date-input";
@customElement("ha-selector-date")
@@ -16,6 +16,8 @@ export class HaDateSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected render() {
return html`
`;
diff --git a/src/components/ha-selector/ha-selector-datetime.ts b/src/components/ha-selector/ha-selector-datetime.ts
index caee6d8457..c8d1dab2d3 100644
--- a/src/components/ha-selector/ha-selector-datetime.ts
+++ b/src/components/ha-selector/ha-selector-datetime.ts
@@ -1,12 +1,12 @@
import { css, html, LitElement } from "lit";
import { customElement, property, query } from "lit/decorators";
-import type { HomeAssistant } from "../../types";
-import type { DateTimeSelector } from "../../data/selector";
-import type { HaDateInput } from "../ha-date-input";
-import type { HaTimeInput } from "../ha-time-input";
import { fireEvent } from "../../common/dom/fire_event";
+import type { DateTimeSelector } from "../../data/selector";
+import type { HomeAssistant } from "../../types";
import "../ha-date-input";
+import type { HaDateInput } from "../ha-date-input";
import "../ha-time-input";
+import type { HaTimeInput } from "../ha-time-input";
@customElement("ha-selector-datetime")
export class HaDateTimeSelector extends LitElement {
@@ -20,6 +20,8 @@ export class HaDateTimeSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
@query("ha-date-input") private _dateInput!: HaDateInput;
@query("ha-time-input") private _timeInput!: HaTimeInput;
@@ -32,6 +34,7 @@ export class HaDateTimeSelector extends LitElement {
.label=${this.label}
.locale=${this.hass.locale}
.disabled=${this.disabled}
+ .required=${this.required}
.value=${values?.[0]}
@value-changed=${this._valueChanged}
>
@@ -41,6 +44,7 @@ export class HaDateTimeSelector extends LitElement {
.value=${values?.[1] || "0:00:00"}
.locale=${this.hass.locale}
.disabled=${this.disabled}
+ .required=${this.required}
@value-changed=${this._valueChanged}
>
`;
diff --git a/src/components/ha-selector/ha-selector-device.ts b/src/components/ha-selector/ha-selector-device.ts
index 945c0de795..efb5dee013 100644
--- a/src/components/ha-selector/ha-selector-device.ts
+++ b/src/components/ha-selector/ha-selector-device.ts
@@ -21,6 +21,8 @@ export class HaDeviceSelector extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected updated(changedProperties) {
if (changedProperties.has("selector")) {
const oldSelector = changedProperties.get("selector");
@@ -36,20 +38,23 @@ export class HaDeviceSelector extends LitElement {
protected render() {
if (!this.selector.device.multiple) {
- return html`
`;
+ return html`
+
+ `;
}
return html`
@@ -63,6 +68,7 @@ export class HaDeviceSelector extends LitElement {
.includeDomains=${this.selector.device.entity?.domain
? [this.selector.device.entity.domain]
: undefined}
+ .required=${this.required}
>
`;
}
diff --git a/src/components/ha-selector/ha-selector-entity.ts b/src/components/ha-selector/ha-selector-entity.ts
index 220550cf34..84f060ea0d 100644
--- a/src/components/ha-selector/ha-selector-entity.ts
+++ b/src/components/ha-selector/ha-selector-entity.ts
@@ -25,6 +25,8 @@ export class HaEntitySelector extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected render() {
if (!this.selector.entity.multiple) {
return html`
`;
}
@@ -47,6 +50,7 @@ export class HaEntitySelector extends LitElement {
.entityFilter=${this._filterEntities}
.includeEntities=${this.selector.entity.include_entities}
.excludeEntities=${this.selector.entity.exclude_entities}
+ .required=${this.required}
>
`;
}
diff --git a/src/components/ha-selector/ha-selector-icon.ts b/src/components/ha-selector/ha-selector-icon.ts
index 0e4a712588..69e11ed0ad 100644
--- a/src/components/ha-selector/ha-selector-icon.ts
+++ b/src/components/ha-selector/ha-selector-icon.ts
@@ -1,9 +1,9 @@
-import "../ha-icon-picker";
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
-import { HomeAssistant } from "../../types";
-import { IconSelector } from "../../data/selector";
import { fireEvent } from "../../common/dom/fire_event";
+import { IconSelector } from "../../data/selector";
+import { HomeAssistant } from "../../types";
+import "../ha-icon-picker";
@customElement("ha-selector-icon")
export class HaIconSelector extends LitElement {
@@ -17,11 +17,15 @@ export class HaIconSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected render() {
return html`
) {
@@ -84,6 +86,7 @@ export class HaMediaSelector extends LitElement {
.label=${this.label ||
this.hass.localize("ui.components.selectors.media.pick_media_player")}
.disabled=${this.disabled}
+ .required=${this.required}
include-domains='["media_player"]'
allow-custom-entity
@value-changed=${this._entityChanged}
diff --git a/src/components/ha-selector/ha-selector-number.ts b/src/components/ha-selector/ha-selector-number.ts
index ef3bc63fc0..84e8f0e12f 100644
--- a/src/components/ha-selector/ha-selector-number.ts
+++ b/src/components/ha-selector/ha-selector-number.ts
@@ -27,7 +27,7 @@ export class HaNumberSelector extends LitElement {
protected render() {
return html`${this.selector.number.mode !== "box"
- ? html`${this.label}
diff --git a/src/components/ha-selector/ha-selector-theme.ts b/src/components/ha-selector/ha-selector-theme.ts
index f90362b552..eccf3c5b23 100644
--- a/src/components/ha-selector/ha-selector-theme.ts
+++ b/src/components/ha-selector/ha-selector-theme.ts
@@ -1,8 +1,8 @@
-import "../ha-theme-picker";
import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators";
-import type { HomeAssistant } from "../../types";
import type { ThemeSelector } from "../../data/selector";
+import type { HomeAssistant } from "../../types";
+import "../ha-theme-picker";
@customElement("ha-selector-theme")
export class HaThemeSelector extends LitElement {
@@ -16,12 +16,16 @@ export class HaThemeSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false;
+ @property({ type: Boolean }) public required = true;
+
protected render() {
return html`
`;
}
diff --git a/src/components/ha-selector/ha-selector-time.ts b/src/components/ha-selector/ha-selector-time.ts
index ff829ff12b..caf2ee0d4d 100644
--- a/src/components/ha-selector/ha-selector-time.ts
+++ b/src/components/ha-selector/ha-selector-time.ts
@@ -16,12 +16,15 @@ export class HaTimeSelector extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public required = false;
+
protected render() {
return html`
diff --git a/src/components/ha-theme-picker.ts b/src/components/ha-theme-picker.ts
index 093865d3a7..af064958b5 100644
--- a/src/components/ha-theme-picker.ts
+++ b/src/components/ha-theme-picker.ts
@@ -4,8 +4,8 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
import { customElement, property } from "lit/decorators";
import { fireEvent } from "../common/dom/fire_event";
import { stopPropagation } from "../common/dom/stop_propagation";
-import "./ha-select";
import { HomeAssistant } from "../types";
+import "./ha-select";
@customElement("ha-theme-picker")
export class HaThemePicker extends LitElement {
@@ -15,12 +15,18 @@ export class HaThemePicker extends LitElement {
@property({ attribute: false }) public hass?: HomeAssistant;
+ @property({ type: Boolean, reflect: true }) public disabled = false;
+
+ @property({ type: Boolean }) public required = false;
+
protected render(): TemplateResult {
return html`
`;
}
diff --git a/src/components/ha-yaml-editor.ts b/src/components/ha-yaml-editor.ts
index 8f285cb439..d4a30cc158 100644
--- a/src/components/ha-yaml-editor.ts
+++ b/src/components/ha-yaml-editor.ts
@@ -33,6 +33,8 @@ export class HaYamlEditor extends LitElement {
@property({ type: Boolean }) public readOnly = false;
+ @property({ type: Boolean }) public required = false;
+
@state() private _yaml = "";
public setValue(value): void {
@@ -59,7 +61,7 @@ export class HaYamlEditor extends LitElement {
return html``;
}
return html`
- ${this.label ? html`${this.label}
` : ""}
+ ${this.label ? html`${this.label}${this.required ? "*" : ""}
` : ""}
diff --git a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts
index 9732c5b7a4..9470be0a78 100644
--- a/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts
+++ b/src/panels/lovelace/editor/config-elements/hui-media-control-card-editor.ts
@@ -3,9 +3,9 @@ import { customElement, property, state } from "lit/decorators";
import { assert, assign, object, optional, string } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/entity/ha-entity-picker";
+import "../../../../components/ha-theme-picker";
import { HomeAssistant } from "../../../../types";
import { MediaControlCardConfig } from "../../cards/types";
-import "../../../../components/ha-theme-picker";
import { LovelaceCardEditor } from "../../types";
import { baseLovelaceCardConfig } from "../structs/base-card-struct";
import { EditorTarget, EntitiesEditorEvent } from "../types";
@@ -50,15 +50,14 @@ export class HuiMediaControlCardEditor
return html`