Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/data/lovelace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,16 @@ export const deleteCard = (
type: "lovelace/config/card/delete",
card_id: cardId,
});

export const addCard = (
hass: HomeAssistant,
viewId: string,
config: LovelaceCardConfig | string,
configFormat: "json" | "yaml"
Comment thread
bramkragten marked this conversation as resolved.
Outdated
): Promise<void> =>
hass.callWS({
type: "lovelace/config/card/add",
view_id: viewId,
card_config: config,
format: configFormat,
Comment thread
bramkragten marked this conversation as resolved.
Outdated
});
5 changes: 5 additions & 0 deletions src/panels/lovelace/cards/hui-entities-card.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ class HuiEntitiesCard extends hassLocalizeLitMixin(LitElement)
await import("../editor/config-elements/hui-entities-card-editor");
return document.createElement("hui-entities-card-editor");
}

public static getStubConfig(hass: HomeAssistant): LovelaceCardConfig {
Comment thread
bramkragten marked this conversation as resolved.
Outdated
return { type: "entities", entities: [] };
}

protected _hass?: HomeAssistant;
protected _config?: Config;
protected _configEntities?: ConfigEntity[];
Expand Down
3 changes: 3 additions & 0 deletions src/panels/lovelace/cards/hui-glance-card.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ export class HuiGlanceCard extends hassLocalizeLitMixin(LitElement)
await import("../editor/config-elements/hui-glance-card-editor");
return document.createElement("hui-glance-card-editor");
}
public static getStubConfig(hass: HomeAssistant): LovelaceCardConfig {
return { type: "glance", entities: [] };
}

public hass?: HomeAssistant;
private _config?: Config;
Expand Down
7 changes: 7 additions & 0 deletions src/panels/lovelace/common/get-element-tag.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const CUSTOM_TYPE_PREFIX = "custom:";

export function getElementTag(type: string): string {
Comment thread
bramkragten marked this conversation as resolved.
Outdated
return type.startsWith(CUSTOM_TYPE_PREFIX)
? type.substr(CUSTOM_TYPE_PREFIX.length)
: `hui-${type}-card`;
}
18 changes: 3 additions & 15 deletions src/panels/lovelace/components/hui-card-options.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import "@polymer/paper-button/paper-button";
import { html, LitElement, PropertyDeclarations } from "@polymer/lit-element";
import { fireEvent } from "../../../common/dom/fire_event";
import {
showEditCardDialog,
registerEditCardDialog,
} from "../editor/hui-dialog-edit-card";
import { showEditCardDialog } from "../editor/hui-dialog-edit-card";

import { confDeleteCard } from "../editor/delete-card";
import { HomeAssistant } from "../../../types";
Expand All @@ -14,14 +11,13 @@ declare global {
// for fire event
interface HASSDomEvents {
"show-edit-card": {
cardConfig: LovelaceCardConfig;
cardConfig?: LovelaceCardConfig;
viewId?: string | number;
reloadLovelace: () => void;
};
}
}

let registeredDialog = false;

export class HuiCardOptions extends LitElement {
public cardConfig?: LovelaceCardConfig;
protected hass?: HomeAssistant;
Expand All @@ -30,14 +26,6 @@ export class HuiCardOptions extends LitElement {
return { hass: {} };
}

public connectedCallback() {
super.connectedCallback();
if (!registeredDialog) {
registeredDialog = true;
registerEditCardDialog(this);
}
}

protected render() {
return html`
<style>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import "../../components/hui-theme-select-editor";
import "../../components/hui-entity-editor";
import "../../../../components/ha-card";
import "../../../../components/ha-icon";
import { LovelaceCardConfig } from "../../../../data/lovelace";
Comment thread
bramkragten marked this conversation as resolved.
Outdated

const entitiesConfigStruct = struct.union([
{
Expand All @@ -42,10 +43,6 @@ const cardConfigStruct = struct({

export class HuiEntitiesCardEditor extends hassLocalizeLitMixin(LitElement)
implements LovelaceCardEditor {
public hass?: HomeAssistant;
private _config?: Config;
private _configEntities?: ConfigEntity[];

static get properties(): PropertyDeclarations {
return { hass: {}, _config: {}, _configEntities: {} };
}
Expand All @@ -58,6 +55,10 @@ export class HuiEntitiesCardEditor extends hassLocalizeLitMixin(LitElement)
return this._config!.theme || "Backend-selected";
}

public hass?: HomeAssistant;
private _config?: Config;
private _configEntities?: ConfigEntity[];

public setConfig(config: Config): void {
config = cardConfigStruct(config);

Expand Down
82 changes: 82 additions & 0 deletions src/panels/lovelace/editor/hui-card-picker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import { html, LitElement } from "@polymer/lit-element";
import { TemplateResult } from "lit-html";
import "@polymer/paper-button/paper-button";

import { HomeAssistant } from "../../../types";
import { fireEvent } from "../../../common/dom/fire_event";
import { LovelaceCardConfig } from "../../../data/lovelace";
import { getElementTag } from "../common/get-element-tag";
import { CardPickTarget } from "./types";

const cards = [
{ name: "Alarm panel", type: "alarm-panel" },
{ name: "Entities", type: "entities" },
{ name: "Glance", type: "glance" },
];

function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}

function uid() {
Comment thread
bramkragten marked this conversation as resolved.
Outdated
return s4() + s4() + s4() + s4() + s4();
}
export class HuiCardPicker extends LitElement {
protected hass?: HomeAssistant;

protected render(): TemplateResult {
return html`
${this.renderStyle()}
${
cards.map((card) => {
return html`
<paper-button
elevated
@click="${this._cardPicked}"
.type="${card.type}"
>${card.name}</paper-button
>
`;
})
}
`;
}

private renderStyle(): TemplateResult {
return html`
<style>
:host {
}
paper-button {
}
</style>
`;
}

private _cardPicked(ev: Event): void {
const type = (ev.currentTarget! as CardPickTarget).type;
const tag = getElementTag(type);

const elClass = customElements.get(tag);
let config: LovelaceCardConfig = { type, id: uid() };
Comment thread
bramkragten marked this conversation as resolved.

try {
const cardConfig = elClass.getStubConfig(this.hass);
Comment thread
bramkragten marked this conversation as resolved.
config = { ...config, ...cardConfig };
} finally {
fireEvent(this, "card-picked", {
config,
});
}
}
}

declare global {
interface HTMLElementTagNameMap {
"hui-card-picker": HuiCardPicker;
}
}

customElements.define("hui-card-picker", HuiCardPicker);
7 changes: 2 additions & 5 deletions src/panels/lovelace/editor/hui-card-preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ import { HomeAssistant } from "../../../types";
import { LovelaceCardConfig } from "../../../data/lovelace";
import { LovelaceCard } from "../types";
import { ConfigError } from "./types";

const CUSTOM_TYPE_PREFIX = "custom:";
import { getElementTag } from "../common/get-element-tag";

export class HuiCardPreview extends HTMLElement {
private _hass?: HomeAssistant;
Expand Down Expand Up @@ -39,9 +38,7 @@ export class HuiCardPreview extends HTMLElement {
return;
}

const tag = configValue.type.startsWith(CUSTOM_TYPE_PREFIX)
? configValue.type.substr(CUSTOM_TYPE_PREFIX.length)
: `hui-${configValue.type}-card`;
const tag = getElementTag(configValue.type);

if (tag.toUpperCase() === this._element.tagName) {
this._element.setConfig(configValue);
Expand Down
9 changes: 7 additions & 2 deletions src/panels/lovelace/editor/hui-dialog-edit-card.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ const dialogShowEvent = "show-edit-card";
const dialogTag = "hui-dialog-edit-card";

export interface EditCardDialogParams {
cardConfig: LovelaceCardConfig;
cardConfig?: LovelaceCardConfig;
viewId?: string | number;
reloadLovelace: () => void;
}

Expand Down Expand Up @@ -60,7 +61,10 @@ export class HuiDialogEditCard extends LitElement {
if (!this._params) {
return html``;
}
if (!this._params.cardConfig.id) {
if (
(this._params.cardConfig && !this._params.cardConfig.id) ||
(!this._params.cardConfig && !this._params.viewId)
) {
return html`
<hui-migrate-config
.hass="${this.hass}"
Expand All @@ -70,6 +74,7 @@ export class HuiDialogEditCard extends LitElement {
}
return html`
<hui-edit-card
.viewId="${this._params.viewId}"
.cardConfig="${this._params.cardConfig}"
.hass="${this.hass}"
@reload-lovelace="${this._params.reloadLovelace}"
Expand Down
Loading