mirror of
https://github.com/home-assistant/frontend.git
synced 2025-04-25 22:07:20 +00:00

* Convert default state icons * update * Update cast/src/launcher/layout/hc-cast.ts Co-authored-by: Philip Allgaier <mail@spacegaier.de> * Update ha-config-core.js * Update * Finish * Add siren icon * FIx * Add curtain icons Co-authored-by: Philip Allgaier <mail@spacegaier.de>
135 lines
3.5 KiB
TypeScript
135 lines
3.5 KiB
TypeScript
import { mdiStop } from "@mdi/js";
|
|
import type { HassEntity } from "home-assistant-js-websocket";
|
|
import {
|
|
css,
|
|
CSSResultGroup,
|
|
html,
|
|
LitElement,
|
|
PropertyValues,
|
|
TemplateResult,
|
|
} from "lit";
|
|
import { customElement, property, state } from "lit/decorators";
|
|
import { classMap } from "lit/directives/class-map";
|
|
import { computeCloseIcon, computeOpenIcon } from "../common/entity/cover_icon";
|
|
import { UNAVAILABLE } from "../data/entity";
|
|
import type { HomeAssistant } from "../types";
|
|
import CoverEntity from "../util/cover-model";
|
|
import "./ha-icon-button";
|
|
|
|
@customElement("ha-cover-controls")
|
|
class HaCoverControls extends LitElement {
|
|
@property({ attribute: false }) public hass!: HomeAssistant;
|
|
|
|
@property({ attribute: false }) public stateObj!: HassEntity;
|
|
|
|
@state() private _entityObj?: CoverEntity;
|
|
|
|
public willUpdate(changedProperties: PropertyValues): void {
|
|
super.willUpdate(changedProperties);
|
|
|
|
if (changedProperties.has("stateObj")) {
|
|
this._entityObj = new CoverEntity(this.hass, this.stateObj);
|
|
}
|
|
}
|
|
|
|
protected render(): TemplateResult {
|
|
if (!this._entityObj) {
|
|
return html``;
|
|
}
|
|
|
|
return html`
|
|
<div class="state">
|
|
<ha-icon-button
|
|
class=${classMap({
|
|
hidden: !this._entityObj.supportsOpen,
|
|
})}
|
|
.label=${this.hass.localize(
|
|
"ui.dialogs.more_info_control.open_cover"
|
|
)}
|
|
@click=${this._onOpenTap}
|
|
.disabled=${this._computeOpenDisabled()}
|
|
.path=${computeOpenIcon(this.stateObj)}
|
|
>
|
|
</ha-icon-button>
|
|
<ha-icon-button
|
|
class=${classMap({
|
|
hidden: !this._entityObj.supportsStop,
|
|
})}
|
|
.label=${this.hass.localize(
|
|
"ui.dialogs.more_info_control.stop_cover"
|
|
)}
|
|
.path=${mdiStop}
|
|
@click=${this._onStopTap}
|
|
.disabled=${this.stateObj.state === UNAVAILABLE}
|
|
></ha-icon-button>
|
|
<ha-icon-button
|
|
class=${classMap({
|
|
hidden: !this._entityObj.supportsClose,
|
|
})}
|
|
.label=${this.hass.localize(
|
|
"ui.dialogs.more_info_control.close_cover"
|
|
)}
|
|
@click=${this._onCloseTap}
|
|
.disabled=${this._computeClosedDisabled()}
|
|
.path=${computeCloseIcon(this.stateObj)}
|
|
>
|
|
</ha-icon-button>
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
private _computeOpenDisabled(): boolean {
|
|
if (this.stateObj.state === UNAVAILABLE) {
|
|
return true;
|
|
}
|
|
const assumedState = this.stateObj.attributes.assumed_state === true;
|
|
return (
|
|
(this._entityObj.isFullyOpen || this._entityObj.isOpening) &&
|
|
!assumedState
|
|
);
|
|
}
|
|
|
|
private _computeClosedDisabled(): boolean {
|
|
if (this.stateObj.state === UNAVAILABLE) {
|
|
return true;
|
|
}
|
|
const assumedState = this.stateObj.attributes.assumed_state === true;
|
|
return (
|
|
(this._entityObj.isFullyClosed || this._entityObj.isClosing) &&
|
|
!assumedState
|
|
);
|
|
}
|
|
|
|
private _onOpenTap(ev): void {
|
|
ev.stopPropagation();
|
|
this._entityObj.openCover();
|
|
}
|
|
|
|
private _onCloseTap(ev): void {
|
|
ev.stopPropagation();
|
|
this._entityObj.closeCover();
|
|
}
|
|
|
|
private _onStopTap(ev): void {
|
|
ev.stopPropagation();
|
|
this._entityObj.stopCover();
|
|
}
|
|
|
|
static get styles(): CSSResultGroup {
|
|
return css`
|
|
.state {
|
|
white-space: nowrap;
|
|
}
|
|
.hidden {
|
|
visibility: hidden !important;
|
|
}
|
|
`;
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
"ha-cover-controls": HaCoverControls;
|
|
}
|
|
}
|