11import { HomeAssistant } from "../ha-types" ;
22import { html , LitElement } from "../lit-element" ;
3- import { ICardConfig } from "../types" ;
3+ import { ICardConfig , IEntityConfig } from "../types" ;
44import { GithubEntity } from "./entity" ;
5- import styles from "./styles" ;
5+ import styles from "./card- styles" ;
66
77export class GithubFlexiCard extends LitElement {
88
99 private cardTitle : string = "" ;
1010
1111 private entities : GithubEntity [ ] = [ ] ;
1212
13+ private cardSize = 0 ;
14+
1315 /**
1416 * CSS for the card
1517 */
1618 static get styles ( ) {
1719 return styles ;
1820 }
1921
22+ /**
23+ * List of properties which trigger update when changed
24+ */
2025 static get properties ( ) {
2126 return {
2227 cardTitle : { type : String } ,
2328 entities : { type : Array } ,
2429 } ;
2530 }
2631
32+ /**
33+ * Called whenever HS state is updated
34+ */
2735 set hass ( hass : HomeAssistant ) {
2836 this . entities . forEach ( entity => entity . hass = hass ) ;
2937 }
3038
39+ /**
40+ * Called whenever card config is updated
41+ */
3142 setConfig ( cardConfig : ICardConfig ) {
3243 this . cardTitle = cardConfig . title ;
3344
34- if ( this . entities . length != cardConfig . entities . length ) {
35- this . entities = cardConfig . entities . map ( entityConf => {
36- const elem = document . createElement ( "github-entity" ) as GithubEntity ;
37-
38- // we have to make a copy as the original one is immutable
39- const updatableConfig = { ...entityConf } ;
45+ this . cardSize = 0 ;
4046
41- // if property is not defined take the card-level one
42- updatableConfig . attributes = updatableConfig . attributes || cardConfig . attributes ;
43- updatableConfig . attribute_urls = updatableConfig . attribute_urls !== undefined ? updatableConfig . attribute_urls : cardConfig . attribute_urls ;
44- updatableConfig . icon = updatableConfig . icon || cardConfig . icon ;
45- updatableConfig . name = updatableConfig . name || cardConfig . name ;
46- updatableConfig . secondary_info = updatableConfig . secondary_info || cardConfig . secondary_info ;
47- updatableConfig . url = updatableConfig . url !== undefined ? updatableConfig . url : cardConfig . url ;
47+ if ( this . cardTitle ) {
48+ this . cardSize ++ ;
49+ }
4850
49- elem . setConfig ( updatableConfig ) ;
51+ if ( this . entities . length != cardConfig . entities . length ) {
52+ this . entities = cardConfig . entities . map ( e => getEntityConfig ( e , cardConfig ) ) . map ( entityConf => {
53+ const elem = document . createElement ( "github-entity" ) as GithubEntity ;
54+ elem . setConfig ( entityConf ) ;
55+ this . cardSize ++ ;
5056 return elem ;
5157 } )
5258 }
5359 else {
54- this . entities . forEach ( ( entity , index ) => entity . setConfig ( cardConfig . entities [ index ] ) ) ;
60+ this . entities . forEach ( ( entity , index ) => entity . setConfig ( getEntityConfig ( cardConfig . entities [ index ] , cardConfig ) ) ) ;
5561 }
5662 }
5763
64+ /**
65+ * Gets the height of your card.
66+ *
67+ * Home Assistant uses this to automatically distribute all cards over
68+ * the available columns. One is equal 50px.
69+ */
70+ getCardSize ( ) {
71+ return this . cardSize ;
72+ }
73+
74+ /**
75+ * Called when element rendering was triggered
76+ */
5877 render ( ) {
5978 return html `
6079 < ha-card >
61- ${ this . getHeader ( ) }
80+ ${ this . cardTitle && header ( this . cardTitle ) }
6281 < div class ="card-content ">
6382 ${ this . entities }
6483 </ div >
6584 </ ha-card >
6685 ` ;
6786 }
87+ }
6888
69- private getHeader ( ) {
70- return this . cardTitle && html `
71- < div class ="card-header ">
72- < div class ="truncate ">
73- ${ this . cardTitle }
74- </ div >
75- </ div >
76- ` ;
77- }
89+ /**
90+ * Header/title view
91+ */
92+ const header = ( title : string ) => html `
93+ < div class ="card-header ">
94+ < div class ="truncate ">
95+ ${ title }
96+ </ div >
97+ </ div >
98+ ` ;
99+
100+ /**
101+ * Converts string entry to proper config obj and applies card-level settings
102+ */
103+ const getEntityConfig = ( configEntry : IEntityConfig | string , cardConfig : ICardConfig ) : IEntityConfig => {
104+
105+ const entityConfig = typeof configEntry != "string" ?
106+ // we have to make a copy as the original one is immutable
107+ { ...configEntry } :
108+ // construct simple config entry
109+ { entity : configEntry } ;
110+
111+ // if property is not defined take the card-level one
112+ entityConfig . attributes = entityConfig . attributes || cardConfig . attributes ;
113+ entityConfig . attribute_urls = entityConfig . attribute_urls !== undefined ? entityConfig . attribute_urls : cardConfig . attribute_urls ;
114+ entityConfig . icon = entityConfig . icon || cardConfig . icon ;
115+ entityConfig . name = entityConfig . name || cardConfig . name ;
116+ entityConfig . secondary_info = entityConfig . secondary_info || cardConfig . secondary_info ;
117+ entityConfig . url = entityConfig . url !== undefined ? entityConfig . url : cardConfig . url ;
118+
119+ return entityConfig ;
78120}
0 commit comments