Update Pickers and selectors with required (#12151)

* Update Pickers and selectors with required

* Use native * for device and entity
This commit is contained in:
Zack Barett 2022-03-30 06:48:56 -05:00 committed by GitHub
parent f5af63a50e
commit 7ab54ee5ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 159 additions and 50 deletions

View File

@ -363,9 +363,11 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
<span slot="heading">${value?.name || key}</span> <span slot="heading">${value?.name || key}</span>
<span slot="description">${value?.description}</span> <span slot="description">${value?.description}</span>
<ha-selector <ha-selector
.required=${true}
.hass=${this.hass} .hass=${this.hass}
.selector=${value!.selector} .selector=${value!.selector}
.key=${key} .key=${key}
.label=${value?.name || key}
.value=${data[key] ?? value!.default} .value=${data[key] ?? value!.default}
@value-changed=${valueChanged} @value-changed=${valueChanged}
></ha-selector> ></ha-selector>

View File

@ -86,6 +86,8 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) {
@property({ type: Boolean }) public disabled?: boolean; @property({ type: Boolean }) public disabled?: boolean;
@property({ type: Boolean }) public required?: boolean;
@state() private _opened?: boolean; @state() private _opened?: boolean;
@query("ha-combo-box", true) public comboBox!: HaComboBox; @query("ha-combo-box", true) public comboBox!: HaComboBox;
@ -269,6 +271,7 @@ export class HaDevicePicker extends SubscribeMixin(LitElement) {
.value=${this._value} .value=${this._value}
.renderer=${rowRenderer} .renderer=${rowRenderer}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
item-value-path="id" item-value-path="id"
item-label-path="name" item-label-path="name"
@opened-changed=${this._openedChanged} @opened-changed=${this._openedChanged}

View File

@ -11,6 +11,8 @@ class HaDevicesPicker extends LitElement {
@property() public value?: string[]; @property() public value?: string[];
@property({ type: Boolean }) public required?: boolean;
/** /**
* Show entities from specific domains. * Show entities from specific domains.
* @type {string} * @type {string}
@ -66,6 +68,7 @@ class HaDevicesPicker extends LitElement {
.excludeDomains=${this.excludeDomains} .excludeDomains=${this.excludeDomains}
.includeDeviceClasses=${this.includeDeviceClasses} .includeDeviceClasses=${this.includeDeviceClasses}
.label=${this.pickDeviceLabel} .label=${this.pickDeviceLabel}
.required=${this.required}
@value-changed=${this._addDevice} @value-changed=${this._addDevice}
></ha-device-picker> ></ha-device-picker>
</div> </div>

View File

@ -14,6 +14,8 @@ class HaEntitiesPickerLight extends LitElement {
@property({ type: Array }) public value?: string[]; @property({ type: Array }) public value?: string[];
@property({ type: Boolean }) public required?: boolean;
/** /**
* Show entities from specific domains. * Show entities from specific domains.
* @type {string} * @type {string}
@ -108,6 +110,7 @@ class HaEntitiesPickerLight extends LitElement {
.includeUnitOfMeasurement=${this.includeUnitOfMeasurement} .includeUnitOfMeasurement=${this.includeUnitOfMeasurement}
.entityFilter=${this._entityFilter} .entityFilter=${this._entityFilter}
.label=${this.pickEntityLabel} .label=${this.pickEntityLabel}
.required=${this.required}
@value-changed=${this._addEntity} @value-changed=${this._addEntity}
></ha-entity-picker> ></ha-entity-picker>
</div> </div>

View File

@ -19,6 +19,8 @@ class HaEntityAttributePicker extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = false;
@property({ type: Boolean, attribute: "allow-custom-value" }) @property({ type: Boolean, attribute: "allow-custom-value" })
public allowCustomValue; public allowCustomValue;
@ -61,6 +63,7 @@ class HaEntityAttributePicker extends LitElement {
"ui.components.entity.entity-attribute-picker.attribute" "ui.components.entity.entity-attribute-picker.attribute"
)} )}
.disabled=${this.disabled || !this.entityId} .disabled=${this.disabled || !this.entityId}
.required=${this.required}
.allowCustomValue=${this.allowCustomValue} .allowCustomValue=${this.allowCustomValue}
item-value-path="value" item-value-path="value"
item-label-path="label" item-label-path="label"

View File

@ -39,6 +39,8 @@ export class HaEntityPicker extends LitElement {
@property({ type: Boolean }) public disabled?: boolean; @property({ type: Boolean }) public disabled?: boolean;
@property({ type: Boolean }) public required?: boolean;
@property({ type: Boolean, attribute: "allow-custom-entity" }) @property({ type: Boolean, attribute: "allow-custom-entity" })
public allowCustomEntity; public allowCustomEntity;
@ -305,6 +307,7 @@ export class HaEntityPicker extends LitElement {
.allowCustomValue=${this.allowCustomEntity} .allowCustomValue=${this.allowCustomEntity}
.filteredItems=${this._states} .filteredItems=${this._states}
.renderer=${rowRenderer} .renderer=${rowRenderer}
.required=${this.required}
@opened-changed=${this._openedChanged} @opened-changed=${this._openedChanged}
@value-changed=${this._valueChanged} @value-changed=${this._valueChanged}
@filter-changed=${this._filterChanged} @filter-changed=${this._filterChanged}

View File

@ -30,6 +30,8 @@ class HaAddonPicker extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = false;
@query("ha-combo-box") private _comboBox!: HaComboBox; @query("ha-combo-box") private _comboBox!: HaComboBox;
public open() { public open() {
@ -55,6 +57,8 @@ class HaAddonPicker extends LitElement {
? this.hass.localize("ui.components.addon-picker.addon") ? this.hass.localize("ui.components.addon-picker.addon")
: this.label} : this.label}
.value=${this._value} .value=${this._value}
.required=${this.required}
.disabled=${this.disabled}
.renderer=${rowRenderer} .renderer=${rowRenderer}
.items=${this._addons} .items=${this._addons}
item-value-path="slug" item-value-path="slug"

View File

@ -28,8 +28,8 @@ import { SubscribeMixin } from "../mixins/subscribe-mixin";
import { PolymerChangedEvent } from "../polymer-types"; import { PolymerChangedEvent } from "../polymer-types";
import { HomeAssistant } from "../types"; import { HomeAssistant } from "../types";
import type { HaDevicePickerDeviceFilterFunc } from "./device/ha-device-picker"; import type { HaDevicePickerDeviceFilterFunc } from "./device/ha-device-picker";
import type { HaComboBox } from "./ha-combo-box";
import "./ha-combo-box"; import "./ha-combo-box";
import type { HaComboBox } from "./ha-combo-box";
import "./ha-icon-button"; import "./ha-icon-button";
import "./ha-svg-icon"; import "./ha-svg-icon";
@ -84,6 +84,8 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) {
@property({ type: Boolean }) public disabled?: boolean; @property({ type: Boolean }) public disabled?: boolean;
@property({ type: Boolean }) public required?: boolean;
@state() private _areas?: AreaRegistryEntry[]; @state() private _areas?: AreaRegistryEntry[];
@state() private _devices?: DeviceRegistryEntry[]; @state() private _devices?: DeviceRegistryEntry[];
@ -315,6 +317,7 @@ export class HaAreaPicker extends SubscribeMixin(LitElement) {
item-label-path="name" item-label-path="name"
.value=${this.value} .value=${this.value}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
.label=${this.label === undefined && this.hass .label=${this.label === undefined && this.hass
? this.hass.localize("ui.components.area-picker.area") ? this.hass.localize("ui.components.area-picker.area")
: this.label} : this.label}

View File

@ -56,6 +56,8 @@ export class HaAreasPicker extends SubscribeMixin(LitElement) {
@property({ type: Boolean }) public disabled?: boolean; @property({ type: Boolean }) public disabled?: boolean;
@property({ type: Boolean }) public required?: boolean;
protected render(): TemplateResult { protected render(): TemplateResult {
if (!this.hass) { if (!this.hass) {
return html``; return html``;
@ -95,6 +97,7 @@ export class HaAreasPicker extends SubscribeMixin(LitElement) {
.entityFilter=${this.entityFilter} .entityFilter=${this.entityFilter}
.disabled=${this.disabled} .disabled=${this.disabled}
.placeholder=${this.placeholder} .placeholder=${this.placeholder}
.required=${this.required}
@value-changed=${this._addArea} @value-changed=${this._addArea}
></ha-area-picker> ></ha-area-picker>
</div> </div>

View File

@ -129,7 +129,9 @@ export class HaBaseTimeInput extends LitElement {
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
${this.label ? html`<label>${this.label}</label>` : ""} ${this.label
? html`<label>${this.label}${this.required ? "*" : ""}</label>`
: ""}
<div class="time-input-wrap"> <div class="time-input-wrap">
${this.enableDay ${this.enableDay
? html` ? html`

View File

@ -87,6 +87,8 @@ export class HaComboBox extends LitElement {
@property({ type: Boolean }) public disabled?: boolean; @property({ type: Boolean }) public disabled?: boolean;
@property({ type: Boolean }) public required?: boolean;
@property({ type: Boolean, reflect: true, attribute: "opened" }) @property({ type: Boolean, reflect: true, attribute: "opened" })
private _opened?: boolean; private _opened?: boolean;
@ -119,6 +121,7 @@ export class HaComboBox extends LitElement {
.filteredItems=${this.filteredItems} .filteredItems=${this.filteredItems}
.allowCustomValue=${this.allowCustomValue} .allowCustomValue=${this.allowCustomValue}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
${comboBoxRenderer(this.renderer || this._defaultRowRenderer)} ${comboBoxRenderer(this.renderer || this._defaultRowRenderer)}
@opened-changed=${this._openedChanged} @opened-changed=${this._openedChanged}
@filter-changed=${this._filterChanged} @filter-changed=${this._filterChanged}
@ -129,6 +132,7 @@ export class HaComboBox extends LitElement {
.label=${this.label} .label=${this.label}
.placeholder=${this.placeholder} .placeholder=${this.placeholder}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
.validationMessage=${this.validationMessage} .validationMessage=${this.validationMessage}
.errorMessage=${this.errorMessage} .errorMessage=${this.errorMessage}
class="input" class="input"

View File

@ -35,6 +35,8 @@ export class HaDateInput extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = false;
@property() public label?: string; @property() public label?: string;
render() { render() {
@ -46,6 +48,7 @@ export class HaDateInput extends LitElement {
.value=${this.value .value=${this.value
? formatDateNumeric(new Date(this.value), this.locale) ? formatDateNumeric(new Date(this.value), this.locale)
: ""} : ""}
.required=${this.required}
> >
<ha-svg-icon slot="trailingIcon" .path=${mdiCalendar}></ha-svg-icon> <ha-svg-icon slot="trailingIcon" .path=${mdiCalendar}></ha-svg-icon>
</ha-textfield>`; </ha-textfield>`;

View File

@ -39,6 +39,8 @@ export class HaIconPicker extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = false;
@property({ type: Boolean }) public invalid = false; @property({ type: Boolean }) public invalid = false;
@state() private _opened = false; @state() private _opened = false;
@ -56,6 +58,7 @@ export class HaIconPicker extends LitElement {
.filteredItems=${iconItems} .filteredItems=${iconItems}
.label=${this.label} .label=${this.label}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
.placeholder=${this.placeholder} .placeholder=${this.placeholder}
.errorMessage=${this.errorMessage} .errorMessage=${this.errorMessage}
.invalid=${this.invalid} .invalid=${this.invalid}

View File

@ -33,7 +33,7 @@ class HaLabeledSlider extends PolymerElement {
} }
</style> </style>
<div class="title">[[caption]]</div> <div class="title">[[_getTitle()]]</div>
<div class="extra-container"><slot name="extra"></slot></div> <div class="extra-container"><slot name="extra"></slot></div>
<div class="slider-container"> <div class="slider-container">
<ha-icon icon="[[icon]]" hidden$="[[!icon]]"></ha-icon> <ha-icon icon="[[icon]]" hidden$="[[!icon]]"></ha-icon>
@ -49,10 +49,15 @@ class HaLabeledSlider extends PolymerElement {
`; `;
} }
_getTitle() {
return `${this.caption}${this.required ? "*" : ""}`;
}
static get properties() { static get properties() {
return { return {
caption: String, caption: String,
disabled: Boolean, disabled: Boolean,
required: Boolean,
min: Number, min: Number,
max: Number, max: Number,
pin: Boolean, pin: Boolean,

View File

@ -14,11 +14,17 @@ export class HaAddonSelector extends LitElement {
@property() public label?: string; @property() public label?: string;
@property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html`<ha-addon-picker return html`<ha-addon-picker
.hass=${this.hass} .hass=${this.hass}
.value=${this.value} .value=${this.value}
.label=${this.label} .label=${this.label}
.disabled=${this.disabled}
.required=${this.required}
allow-custom-entity allow-custom-entity
></ha-addon-picker>`; ></ha-addon-picker>`;
} }

View File

@ -22,6 +22,8 @@ export class HaAreaSelector extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected updated(changedProperties) { protected updated(changedProperties) {
if (changedProperties.has("selector")) { if (changedProperties.has("selector")) {
const oldSelector = changedProperties.get("selector"); const oldSelector = changedProperties.get("selector");
@ -55,6 +57,7 @@ export class HaAreaSelector extends LitElement {
? [this.selector.area.entity.domain] ? [this.selector.area.entity.domain]
: undefined} : undefined}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
></ha-area-picker> ></ha-area-picker>
`; `;
} }
@ -74,6 +77,7 @@ export class HaAreaSelector extends LitElement {
? [this.selector.area.entity.domain] ? [this.selector.area.entity.domain]
: undefined} : undefined}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
></ha-areas-picker> ></ha-areas-picker>
`; `;
} }

View File

@ -1,10 +1,10 @@
import "../entity/ha-entity-attribute-picker";
import { html, LitElement, PropertyValues } from "lit"; import { html, LitElement, PropertyValues } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { fireEvent } from "../../common/dom/fire_event";
import { AttributeSelector } from "../../data/selector"; import { AttributeSelector } from "../../data/selector";
import { SubscribeMixin } from "../../mixins/subscribe-mixin"; import { SubscribeMixin } from "../../mixins/subscribe-mixin";
import { HomeAssistant } from "../../types"; import { HomeAssistant } from "../../types";
import { fireEvent } from "../../common/dom/fire_event"; import "../entity/ha-entity-attribute-picker";
@customElement("ha-selector-attribute") @customElement("ha-selector-attribute")
export class HaSelectorAttribute extends SubscribeMixin(LitElement) { 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 disabled = false;
@property({ type: Boolean }) public required = true;
@property() public context?: { @property() public context?: {
filter_entity?: string; filter_entity?: string;
}; };
@ -31,6 +33,7 @@ export class HaSelectorAttribute extends SubscribeMixin(LitElement) {
.value=${this.value} .value=${this.value}
.label=${this.label} .label=${this.label}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
allow-custom-value allow-custom-value
></ha-entity-attribute-picker> ></ha-entity-attribute-picker>
`; `;

View File

@ -1,9 +1,9 @@
import { css, html, LitElement } from "lit"; import { css, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators"; 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 { 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"; import "../ha-textfield";
@customElement("ha-selector-color_rgb") @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, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html` return html`
<ha-textfield <ha-textfield
type="color" type="color"
.value=${this.value ? rgb2hex(this.value as any) : ""} .value=${this.value ? rgb2hex(this.value as any) : ""}
.label=${this.label || ""} .label=${this.label || ""}
.required=${this.required}
.disalbled=${this.disabled}
@change=${this._valueChanged} @change=${this._valueChanged}
></ha-textfield> ></ha-textfield>
`; `;

View File

@ -1,8 +1,8 @@
import { css, html, LitElement } from "lit"; import { css, html, LitElement } from "lit";
import { customElement, property } from "lit/decorators"; 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 { fireEvent } from "../../common/dom/fire_event";
import type { ColorTempSelector } from "../../data/selector";
import type { HomeAssistant } from "../../types";
import "../ha-labeled-slider"; import "../ha-labeled-slider";
@customElement("ha-selector-color_temp") @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, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html` return html`
<ha-labeled-slider <ha-labeled-slider
@ -26,6 +28,8 @@ export class HaColorTempSelector extends LitElement {
.min=${this.selector.color_temp.min_mireds ?? 153} .min=${this.selector.color_temp.min_mireds ?? 153}
.max=${this.selector.color_temp.max_mireds ?? 500} .max=${this.selector.color_temp.max_mireds ?? 500}
.value=${this.value} .value=${this.value}
.disabled=${this.disabled}
.required=${this.required}
@change=${this._valueChanged} @change=${this._valueChanged}
></ha-labeled-slider> ></ha-labeled-slider>
`; `;

View File

@ -1,7 +1,7 @@
import { html, LitElement } from "lit"; import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import type { HomeAssistant } from "../../types";
import type { DateSelector } from "../../data/selector"; import type { DateSelector } from "../../data/selector";
import type { HomeAssistant } from "../../types";
import "../ha-date-input"; import "../ha-date-input";
@customElement("ha-selector-date") @customElement("ha-selector-date")
@ -16,6 +16,8 @@ export class HaDateSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false; @property({ type: Boolean, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html` return html`
<ha-date-input <ha-date-input
@ -23,6 +25,7 @@ export class HaDateSelector extends LitElement {
.locale=${this.hass.locale} .locale=${this.hass.locale}
.disabled=${this.disabled} .disabled=${this.disabled}
.value=${this.value} .value=${this.value}
.required=${this.required}
> >
</ha-date-input> </ha-date-input>
`; `;

View File

@ -1,12 +1,12 @@
import { css, html, LitElement } from "lit"; import { css, html, LitElement } from "lit";
import { customElement, property, query } from "lit/decorators"; 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 { fireEvent } from "../../common/dom/fire_event";
import type { DateTimeSelector } from "../../data/selector";
import type { HomeAssistant } from "../../types";
import "../ha-date-input"; import "../ha-date-input";
import type { HaDateInput } from "../ha-date-input";
import "../ha-time-input"; import "../ha-time-input";
import type { HaTimeInput } from "../ha-time-input";
@customElement("ha-selector-datetime") @customElement("ha-selector-datetime")
export class HaDateTimeSelector extends LitElement { 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, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = true;
@query("ha-date-input") private _dateInput!: HaDateInput; @query("ha-date-input") private _dateInput!: HaDateInput;
@query("ha-time-input") private _timeInput!: HaTimeInput; @query("ha-time-input") private _timeInput!: HaTimeInput;
@ -32,6 +34,7 @@ export class HaDateTimeSelector extends LitElement {
.label=${this.label} .label=${this.label}
.locale=${this.hass.locale} .locale=${this.hass.locale}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
.value=${values?.[0]} .value=${values?.[0]}
@value-changed=${this._valueChanged} @value-changed=${this._valueChanged}
> >
@ -41,6 +44,7 @@ export class HaDateTimeSelector extends LitElement {
.value=${values?.[1] || "0:00:00"} .value=${values?.[1] || "0:00:00"}
.locale=${this.hass.locale} .locale=${this.hass.locale}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
@value-changed=${this._valueChanged} @value-changed=${this._valueChanged}
></ha-time-input> ></ha-time-input>
`; `;

View File

@ -21,6 +21,8 @@ export class HaDeviceSelector extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected updated(changedProperties) { protected updated(changedProperties) {
if (changedProperties.has("selector")) { if (changedProperties.has("selector")) {
const oldSelector = changedProperties.get("selector"); const oldSelector = changedProperties.get("selector");
@ -36,20 +38,23 @@ export class HaDeviceSelector extends LitElement {
protected render() { protected render() {
if (!this.selector.device.multiple) { if (!this.selector.device.multiple) {
return html`<ha-device-picker return html`
.hass=${this.hass} <ha-device-picker
.value=${this.value} .hass=${this.hass}
.label=${this.label} .value=${this.value}
.deviceFilter=${this._filterDevices} .label=${this.label}
.includeDeviceClasses=${this.selector.device.entity?.device_class .deviceFilter=${this._filterDevices}
? [this.selector.device.entity.device_class] .includeDeviceClasses=${this.selector.device.entity?.device_class
: undefined} ? [this.selector.device.entity.device_class]
.includeDomains=${this.selector.device.entity?.domain : undefined}
? [this.selector.device.entity.domain] .includeDomains=${this.selector.device.entity?.domain
: undefined} ? [this.selector.device.entity.domain]
.disabled=${this.disabled} : undefined}
allow-custom-entity .disabled=${this.disabled}
></ha-device-picker> `; .required=${this.required}
allow-custom-entity
></ha-device-picker>
`;
} }
return html` return html`
@ -63,6 +68,7 @@ export class HaDeviceSelector extends LitElement {
.includeDomains=${this.selector.device.entity?.domain .includeDomains=${this.selector.device.entity?.domain
? [this.selector.device.entity.domain] ? [this.selector.device.entity.domain]
: undefined} : undefined}
.required=${this.required}
></ha-devices-picker> ></ha-devices-picker>
`; `;
} }

View File

@ -25,6 +25,8 @@ export class HaEntitySelector extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
if (!this.selector.entity.multiple) { if (!this.selector.entity.multiple) {
return html`<ha-entity-picker return html`<ha-entity-picker
@ -35,6 +37,7 @@ export class HaEntitySelector extends LitElement {
.excludeEntities=${this.selector.entity.exclude_entities} .excludeEntities=${this.selector.entity.exclude_entities}
.entityFilter=${this._filterEntities} .entityFilter=${this._filterEntities}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
allow-custom-entity allow-custom-entity
></ha-entity-picker>`; ></ha-entity-picker>`;
} }
@ -47,6 +50,7 @@ export class HaEntitySelector extends LitElement {
.entityFilter=${this._filterEntities} .entityFilter=${this._filterEntities}
.includeEntities=${this.selector.entity.include_entities} .includeEntities=${this.selector.entity.include_entities}
.excludeEntities=${this.selector.entity.exclude_entities} .excludeEntities=${this.selector.entity.exclude_entities}
.required=${this.required}
></ha-entities-picker> ></ha-entities-picker>
`; `;
} }

View File

@ -1,9 +1,9 @@
import "../ha-icon-picker";
import { html, LitElement } from "lit"; import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { HomeAssistant } from "../../types";
import { IconSelector } from "../../data/selector";
import { fireEvent } from "../../common/dom/fire_event"; import { fireEvent } from "../../common/dom/fire_event";
import { IconSelector } from "../../data/selector";
import { HomeAssistant } from "../../types";
import "../ha-icon-picker";
@customElement("ha-selector-icon") @customElement("ha-selector-icon")
export class HaIconSelector extends LitElement { 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, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html` return html`
<ha-icon-picker <ha-icon-picker
.label=${this.label} .label=${this.label}
.value=${this.value} .value=${this.value}
.required=${this.required}
.disabled=${this.disabled}
.fallbackPath=${this.selector.icon.fallbackPath} .fallbackPath=${this.selector.icon.fallbackPath}
.placeholder=${this.selector.icon.placeholder} .placeholder=${this.selector.icon.placeholder}
@value-changed=${this._valueChanged} @value-changed=${this._valueChanged}

View File

@ -35,6 +35,8 @@ export class HaMediaSelector extends LitElement {
@property({ type: Boolean, reflect: true }) public disabled = false; @property({ type: Boolean, reflect: true }) public disabled = false;
@property({ type: Boolean, reflect: true }) public required = true;
@state() private _thumbnailUrl?: string | null; @state() private _thumbnailUrl?: string | null;
willUpdate(changedProps: PropertyValues<this>) { willUpdate(changedProps: PropertyValues<this>) {
@ -84,6 +86,7 @@ export class HaMediaSelector extends LitElement {
.label=${this.label || .label=${this.label ||
this.hass.localize("ui.components.selectors.media.pick_media_player")} this.hass.localize("ui.components.selectors.media.pick_media_player")}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
include-domains='["media_player"]' include-domains='["media_player"]'
allow-custom-entity allow-custom-entity
@value-changed=${this._entityChanged} @value-changed=${this._entityChanged}

View File

@ -27,7 +27,7 @@ export class HaNumberSelector extends LitElement {
protected render() { protected render() {
return html`${this.selector.number.mode !== "box" return html`${this.selector.number.mode !== "box"
? html`${this.label}<ha-slider ? html`${this.label}${this.required ? "*" : ""}<ha-slider
.min=${this.selector.number.min} .min=${this.selector.number.min}
.max=${this.selector.number.max} .max=${this.selector.number.max}
.value=${this._value} .value=${this._value}

View File

@ -16,10 +16,13 @@ export class HaObjectSelector extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html`<ha-yaml-editor return html`<ha-yaml-editor
.hass=${this.hass} .hass=${this.hass}
.disabled=${this.disabled} .readonly=${this.disabled}
.required=${this.required}
.placeholder=${this.placeholder} .placeholder=${this.placeholder}
.defaultValue=${this.value} .defaultValue=${this.value}
@value-changed=${this._handleChange} @value-changed=${this._handleChange}

View File

@ -6,8 +6,8 @@ import { fireEvent } from "../../common/dom/fire_event";
import { stopPropagation } from "../../common/dom/stop_propagation"; import { stopPropagation } from "../../common/dom/stop_propagation";
import type { SelectOption, SelectSelector } from "../../data/selector"; import type { SelectOption, SelectSelector } from "../../data/selector";
import type { HomeAssistant } from "../../types"; import type { HomeAssistant } from "../../types";
import "../ha-select";
import "../ha-radio"; import "../ha-radio";
import "../ha-select";
@customElement("ha-selector-select") @customElement("ha-selector-select")
export class HaSelectSelector extends LitElement { export class HaSelectSelector extends LitElement {
@ -57,6 +57,7 @@ export class HaSelectSelector extends LitElement {
.value=${this.value} .value=${this.value}
.helper=${this.helper} .helper=${this.helper}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
@closed=${stopPropagation} @closed=${stopPropagation}
@selected=${this._valueChanged} @selected=${this._valueChanged}
> >

View File

@ -1,8 +1,8 @@
import "../ha-theme-picker";
import { html, LitElement } from "lit"; import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import type { HomeAssistant } from "../../types";
import type { ThemeSelector } from "../../data/selector"; import type { ThemeSelector } from "../../data/selector";
import type { HomeAssistant } from "../../types";
import "../ha-theme-picker";
@customElement("ha-selector-theme") @customElement("ha-selector-theme")
export class HaThemeSelector extends LitElement { 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, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = true;
protected render() { protected render() {
return html` return html`
<ha-theme-picker <ha-theme-picker
.hass=${this.hass} .hass=${this.hass}
.value=${this.value} .value=${this.value}
.label=${this.label} .label=${this.label}
.disabled=${this.disabled}
.required=${this.required}
></ha-theme-picker> ></ha-theme-picker>
`; `;
} }

View File

@ -16,12 +16,15 @@ export class HaTimeSelector extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = false;
protected render() { protected render() {
return html` return html`
<ha-time-input <ha-time-input
.value=${this.value} .value=${this.value}
.locale=${this.hass.locale} .locale=${this.hass.locale}
.disabled=${this.disabled} .disabled=${this.disabled}
.required=${this.required}
.label=${this.label} .label=${this.label}
enable-second enable-second
></ha-time-input> ></ha-time-input>

View File

@ -4,8 +4,8 @@ import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { fireEvent } from "../common/dom/fire_event"; import { fireEvent } from "../common/dom/fire_event";
import { stopPropagation } from "../common/dom/stop_propagation"; import { stopPropagation } from "../common/dom/stop_propagation";
import "./ha-select";
import { HomeAssistant } from "../types"; import { HomeAssistant } from "../types";
import "./ha-select";
@customElement("ha-theme-picker") @customElement("ha-theme-picker")
export class HaThemePicker extends LitElement { export class HaThemePicker extends LitElement {
@ -15,12 +15,18 @@ export class HaThemePicker extends LitElement {
@property({ attribute: false }) public hass?: HomeAssistant; @property({ attribute: false }) public hass?: HomeAssistant;
@property({ type: Boolean, reflect: true }) public disabled = false;
@property({ type: Boolean }) public required = false;
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
<ha-select <ha-select
.label=${this.label || .label=${this.label ||
this.hass!.localize("ui.components.theme_picker.theme")} this.hass!.localize("ui.components.theme_picker.theme")}
.value=${this.value} .value=${this.value}
.required=${this.required}
.disabled=${this.disabled}
@selected=${this._changed} @selected=${this._changed}
@closed=${stopPropagation} @closed=${stopPropagation}
fixedMenuPosition fixedMenuPosition

View File

@ -2,8 +2,8 @@ import { html, LitElement } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { useAmPm } from "../common/datetime/use_am_pm"; import { useAmPm } from "../common/datetime/use_am_pm";
import { fireEvent } from "../common/dom/fire_event"; import { fireEvent } from "../common/dom/fire_event";
import "./ha-base-time-input";
import { FrontendLocaleData } from "../data/translation"; import { FrontendLocaleData } from "../data/translation";
import "./ha-base-time-input";
import type { TimeChangedEvent } from "./ha-base-time-input"; import type { TimeChangedEvent } from "./ha-base-time-input";
@customElement("ha-time-input") @customElement("ha-time-input")
@ -16,6 +16,8 @@ export class HaTimeInput extends LitElement {
@property({ type: Boolean }) public disabled = false; @property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public required = false;
@property({ type: Boolean, attribute: "enable-second" }) @property({ type: Boolean, attribute: "enable-second" })
public enableSecond = false; public enableSecond = false;
@ -43,6 +45,7 @@ export class HaTimeInput extends LitElement {
.disabled=${this.disabled} .disabled=${this.disabled}
@value-changed=${this._timeChanged} @value-changed=${this._timeChanged}
.enableSecond=${this.enableSecond} .enableSecond=${this.enableSecond}
.required=${this.required}
></ha-base-time-input> ></ha-base-time-input>
`; `;
} }

View File

@ -33,6 +33,8 @@ export class HaYamlEditor extends LitElement {
@property({ type: Boolean }) public readOnly = false; @property({ type: Boolean }) public readOnly = false;
@property({ type: Boolean }) public required = false;
@state() private _yaml = ""; @state() private _yaml = "";
public setValue(value): void { public setValue(value): void {
@ -59,7 +61,7 @@ export class HaYamlEditor extends LitElement {
return html``; return html``;
} }
return html` return html`
${this.label ? html`<p>${this.label}</p>` : ""} ${this.label ? html`<p>${this.label}${this.required ? "*" : ""}</p>` : ""}
<ha-code-editor <ha-code-editor
.hass=${this.hass} .hass=${this.hass}
.value=${this._yaml} .value=${this._yaml}

View File

@ -4,8 +4,8 @@ import { assert } from "superstruct";
import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event"; import { fireEvent, HASSDomEvent } from "../../../../common/dom/fire_event";
import "../../../../components/entity/ha-entity-picker"; import "../../../../components/entity/ha-entity-picker";
import "../../../../components/ha-formfield"; import "../../../../components/ha-formfield";
import "../../../../components/ha-textfield";
import "../../../../components/ha-switch"; import "../../../../components/ha-switch";
import "../../../../components/ha-textfield";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
import { graphHeaderFooterConfigStruct } from "../../header-footer/structs"; import { graphHeaderFooterConfigStruct } from "../../header-footer/structs";
import { GraphHeaderFooterConfig } from "../../header-footer/types"; import { GraphHeaderFooterConfig } from "../../header-footer/types";
@ -50,15 +50,14 @@ export class HuiGraphFooterEditor
<div class="card-config"> <div class="card-config">
<ha-entity-picker <ha-entity-picker
allow-custom-entity allow-custom-entity
.label="${this.hass.localize( .label=${this.hass.localize(
"ui.panel.lovelace.editor.card.generic.entity" "ui.panel.lovelace.editor.card.generic.entity"
)} (${this.hass.localize( )}
"ui.panel.lovelace.editor.card.config.required"
)})"
.hass=${this.hass} .hass=${this.hass}
.value=${this._entity} .value=${this._entity}
.configValue=${"entity"} .configValue=${"entity"}
.includeDomains=${includeDomains} .includeDomains=${includeDomains}
.required=${true}
@change=${this._valueChanged} @change=${this._valueChanged}
></ha-entity-picker> ></ha-entity-picker>
<div class="side-by-side"> <div class="side-by-side">

View File

@ -3,9 +3,9 @@ import { customElement, property, state } from "lit/decorators";
import { assert, assign, object, optional, string } from "superstruct"; import { assert, assign, object, optional, string } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/entity/ha-entity-picker"; import "../../../../components/entity/ha-entity-picker";
import "../../../../components/ha-theme-picker";
import { HomeAssistant } from "../../../../types"; import { HomeAssistant } from "../../../../types";
import { MediaControlCardConfig } from "../../cards/types"; import { MediaControlCardConfig } from "../../cards/types";
import "../../../../components/ha-theme-picker";
import { LovelaceCardEditor } from "../../types"; import { LovelaceCardEditor } from "../../types";
import { baseLovelaceCardConfig } from "../structs/base-card-struct"; import { baseLovelaceCardConfig } from "../structs/base-card-struct";
import { EditorTarget, EntitiesEditorEvent } from "../types"; import { EditorTarget, EntitiesEditorEvent } from "../types";
@ -50,15 +50,14 @@ export class HuiMediaControlCardEditor
return html` return html`
<div class="card-config"> <div class="card-config">
<ha-entity-picker <ha-entity-picker
.label="${this.hass.localize( .label=${this.hass.localize(
"ui.panel.lovelace.editor.card.generic.entity" "ui.panel.lovelace.editor.card.generic.entity"
)} (${this.hass.localize( )}
"ui.panel.lovelace.editor.card.config.required"
)})"
.hass=${this.hass} .hass=${this.hass}
.value=${this._entity} .value=${this._entity}
.configValue=${"entity"} .configValue=${"entity"}
.includeDomains=${includeDomains} .includeDomains=${includeDomains}
.required=${true}
@change=${this._valueChanged} @change=${this._valueChanged}
allow-custom-entity allow-custom-entity
></ha-entity-picker> ></ha-entity-picker>