Make card-maker auto-update to latest version

This commit is contained in:
Thomas Lovén 2019-11-12 15:17:39 +01:00
parent 4bcbb48158
commit 96ff241199
2 changed files with 62 additions and 13 deletions

File diff suppressed because one or more lines are too long

View File

@ -2,22 +2,27 @@ import { LitElement, html } from "./lit-element.js";
import { createCard, createEntityRow, createElement } from "./lovelace-element.js"; import { createCard, createEntityRow, createElement } from "./lovelace-element.js";
import { provideHass } from "./hass.js"; import { provideHass } from "./hass.js";
const VERSION = 2;
class ThingMaker extends LitElement { class ThingMaker extends LitElement {
static get version() {
return VERSION;
}
static get properties() { static get properties() {
return { return {
'hass': {},
'config': {},
'noHass': {type: Boolean }, 'noHass': {type: Boolean },
}; };
} }
setConfig(config) { setConfig(config) {
this._config = config; this._config = config;
if(!this.el) if(!this.el) {
this.el = this.create(config); this.el = this.create(config);
else
this.el.setConfig(config);
if(this._hass) this.el.hass = this._hass; if(this._hass) this.el.hass = this._hass;
if(this.noHass) provideHass(this); if(this.noHass) provideHass(this);
} else {
this.el.setConfig(config);
}
} }
set config(config) { set config(config) {
this.setConfig(config); this.setConfig(config);
@ -35,7 +40,35 @@ class ThingMaker extends LitElement {
} }
} }
if(!customElements.get("card-maker")) {
const redefineElement = function(element, newClass) {
// Non-static properties of class
const properties = Object.getOwnPropertyDescriptors(newClass.prototype);
for(const [k,v] of Object.entries(properties)) {
Object.defineProperty(element, k, v);
}
// Static properties of class
const staticProperties = Object.getOwnPropertyDescriptors(newClass);
for(const [k,v] of Object.entries(staticProperties)) {
if(k === "prototype") continue;
Object.defineProperty(element, k, v);
}
const superclass = Object.getPrototypeOf(newClass);
// Non-static properties of superclass
const baseProperties = Object.getOwnPropertyDescriptors(superclass.prototype);
for(const [k,v] of Object.entries(baseProperties)) {
Object.defineProperty(Object.getPrototypeOf(element).prototype, k, v);
}
// Static properties of superclassk
const staticBaseProperties = Object.getOwnPropertyDescriptors(superclass);
for(const [k,v] of Object.entries(staticBaseProperties)) {
if(k === "prototype") continue;
Object.defineProperty(Object.getPrototypeOf(element), k, v);
}
}
const cardMaker = customElements.get("card-maker");
if(!cardMaker || !cardMaker.version || cardMaker.version < VERSION) {
class CardMaker extends ThingMaker { class CardMaker extends ThingMaker {
create(config) { create(config) {
return createCard(config); return createCard(config);
@ -46,23 +79,39 @@ if(!customElements.get("card-maker")) {
return 1; return 1;
} }
} }
if(cardMaker) {
redefineElement(cardMaker, CardMaker);
} else {
customElements.define("card-maker", CardMaker); customElements.define("card-maker", CardMaker);
}
} }
if(!customElements.get("element-maker")) { const elementMaker = customElements.get("element-maker");
if(!elementMaker || !elementMaker.version || elementMaker.version < VERSION) {
class ElementMaker extends ThingMaker { class ElementMaker extends ThingMaker {
create(config) { create(config) {
return createElement(config); return createElement(config);
} }
} }
if(elementMaker) {
redefineElement(elementMaker, ElementMaker);
} else {
customElements.define("element-maker", ElementMaker); customElements.define("element-maker", ElementMaker);
}
} }
if(!customElements.get("entity-row-maker")) { const entityRowMaker = customElements.get("entity-row-maker");
if(!entityRowMaker || !entityRowMaker.version || entityRowMaker.version < VERSION) {
class EntityRowMaker extends ThingMaker { class EntityRowMaker extends ThingMaker {
create(config) { create(config) {
return createEntityRow(config); return createEntityRow(config);
} }
} }
if(entityRowMaker) {
redefineElement(entityRowMaker, EntityRowMaker);
} else {
customElements.define("entity-row-maker", EntityRowMaker); customElements.define("entity-row-maker", EntityRowMaker);
}
} }