Skip to content

Commit 5eb1204

Browse files
committed
Support for Picture-Elements
Fixes #4
1 parent b3b0954 commit 5eb1204

File tree

5 files changed

+66
-11
lines changed

5 files changed

+66
-11
lines changed

.devcontainer/ui-lovelace.yaml

+20
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ decluttering_templates:
2222
height: 1px
2323
margin: 15px auto
2424
opacity: "[[opacity]]"
25+
demo_icon:
26+
element:
27+
type: icon
28+
icon: mdi:alert-circle
29+
title: Problem detected!
30+
entity: "[[entity]]"
31+
tap_action:
32+
action: more-info
33+
style:
34+
right: 50%
35+
top: 50%
36+
color: var(--google-red-500)
37+
filter: drop-shadow(black 0 0 1px)
2538

2639
views:
2740
- cards:
@@ -35,3 +48,10 @@ views:
3548
- type: custom:decluttering-card
3649
template: large_divider
3750
- sun.sun
51+
- type: picture-elements
52+
image: https://www.w3schools.com/w3css/img_lights.jpg
53+
elements:
54+
- type: custom:decluttering-card
55+
template: demo_icon
56+
variables:
57+
- entity: sun.sun

README.md

+16
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ This object needs to contains your templates declaration, each template has a na
3131

3232
You can also define default values for your variables in the `default` object.
3333

34+
For a card:
35+
3436
```yaml
3537
decluttering_templates:
3638
<template_name>
@@ -43,6 +45,20 @@ decluttering_templates:
4345
[...]
4446
```
4547

48+
For a Picture-Element:
49+
50+
```yaml
51+
decluttering_templates:
52+
<template_name>
53+
default: # This is optional
54+
- <variable_name>: <variable_value>
55+
- <variable_name>: <variable_value>
56+
[...]
57+
element: # This is where you put your element config
58+
type: icon
59+
[...]
60+
```
61+
4662
Example in your `lovelace-ui.yaml`:
4763
```yaml
4864
resources:

src/decluttering-card.ts

+27-9
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,16 @@ class DeclutteringCard extends LitElement {
3939
throw new Error("The object decluttering_templates doesn't exist in your main lovelace config.");
4040
}
4141
const templateConfig = ll.config.decluttering_templates[config.template] as TemplateConfig;
42-
if (!templateConfig || !templateConfig.card) {
42+
if (!templateConfig) {
4343
throw new Error(`The template "${config.template}" doesn't exist in decluttering_templates`);
44+
} else if (!(templateConfig.card || templateConfig.element)) {
45+
throw new Error('You shoud define either a card or an element in the template');
46+
} else if (templateConfig.card && templateConfig.element) {
47+
throw new Error('You can define a card and an element in the template');
4448
}
4549
this._config = deepReplace(config.variables, templateConfig);
46-
this._createCard(this._config).then(card => {
50+
const type = templateConfig.card ? 'card' : 'element';
51+
this._createCard(this._config, type).then(card => {
4752
this._card = card;
4853
return this._card;
4954
});
@@ -57,12 +62,21 @@ class DeclutteringCard extends LitElement {
5762
`;
5863
}
5964

60-
private async _createCard(config: LovelaceCardConfig): Promise<LovelaceCard> {
65+
private async _createCard(config: LovelaceCardConfig, type: 'element' | 'card'): Promise<LovelaceCard> {
6166
let element: LovelaceCard;
6267
if (HELPERS) {
63-
if (config.type === 'divider') element = (await HELPERS).createRowElement(config);
64-
else element = (await HELPERS).createCardElement(config);
65-
// fireEvent(element, 'll-rebuild');
68+
if (type === 'card') {
69+
if (config.type === 'divider') element = (await HELPERS).createRowElement(config);
70+
else element = (await HELPERS).createCardElement(config);
71+
// fireEvent(element, 'll-rebuild');
72+
} else {
73+
element = (await HELPERS).createHuiElement(config);
74+
if (config.style) {
75+
Object.keys(config.style).forEach(prop => {
76+
this.style.setProperty(prop, config.style[prop]);
77+
});
78+
}
79+
}
6680
} else {
6781
element = createThing(config);
6882
}
@@ -73,15 +87,19 @@ class DeclutteringCard extends LitElement {
7387
'll-rebuild',
7488
ev => {
7589
ev.stopPropagation();
76-
this._rebuildCard(element, config);
90+
this._rebuildCard(element, config, type);
7791
},
7892
{ once: true },
7993
);
8094
return element;
8195
}
8296

83-
private async _rebuildCard(element: LovelaceCard, config: LovelaceCardConfig): Promise<void> {
84-
const newCard = await this._createCard(config);
97+
private async _rebuildCard(
98+
element: LovelaceCard,
99+
config: LovelaceCardConfig,
100+
type: 'element' | 'card',
101+
): Promise<void> {
102+
const newCard = await this._createCard(config, type);
85103
element.replaceWith(newCard);
86104
return;
87105
}

src/deep-replace.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default (variables: VariablesConfig[] | undefined, templateConfig: Templa
1212
if (templateConfig.default) {
1313
variableArray = variableArray.concat(templateConfig.default);
1414
}
15-
let jsonConfig = JSON.stringify(templateConfig.card);
15+
let jsonConfig = templateConfig.card ? JSON.stringify(templateConfig.card) : JSON.stringify(templateConfig.element);
1616
variableArray.forEach(variable => {
1717
const key = Object.keys(variable)[0];
1818
const value = Object.values(variable)[0];

src/types.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ export interface VariablesConfig {
1010

1111
export interface TemplateConfig {
1212
default: VariablesConfig[];
13-
card: any;
13+
card?: any;
14+
element?: any;
1415
}

0 commit comments

Comments
 (0)