Freeze lovelace configuration on load (#4862)

* Freeze lovelace configuration on load

* Clone only when necessary

* Make cloning badges really work

* Freeze after checking

* Don't doublefreeze
This commit is contained in:
Thomas Lovén 2020-02-14 01:18:15 +01:00 committed by GitHub
parent 7903541689
commit c62a5a6dcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 5 deletions

View File

@ -79,6 +79,7 @@
"codemirror": "^5.49.0",
"cpx": "^1.5.0",
"deep-clone-simple": "^1.1.1",
"deep-freeze": "^0.0.1",
"es6-object-assign": "^1.1.0",
"fecha": "^3.0.2",
"fuse.js": "^3.4.4",

View File

@ -1,4 +1,5 @@
import "@material/mwc-button";
import * as deepFreeze from "deep-freeze";
import {
fetchConfig,
@ -263,15 +264,22 @@ class LovelacePanel extends LitElement {
private _checkLovelaceConfig(config: LovelaceConfig) {
// Somehow there can be badges with value null, we remove those
config.views.forEach((view) => {
if (view.badges) {
view.badges = view.badges.filter(Boolean);
let checkedConfig;
config.views.forEach((view, index) => {
if (view.badges && !view.badges.every(Boolean)) {
checkedConfig = checkedConfig || {
...config,
views: [...config.views],
};
checkedConfig.views[index] = { ...view };
checkedConfig.views[index].badges = view.badges.filter(Boolean);
}
});
return checkedConfig ? deepFreeze(checkedConfig) : config;
}
private _setLovelaceConfig(config: LovelaceConfig, mode: Lovelace["mode"]) {
this._checkLovelaceConfig(config);
config = this._checkLovelaceConfig(config);
this.lovelace = {
config,
mode,
@ -295,7 +303,7 @@ class LovelacePanel extends LitElement {
},
saveConfig: async (newConfig: LovelaceConfig): Promise<void> => {
const { config: previousConfig, mode: previousMode } = this.lovelace!;
this._checkLovelaceConfig(newConfig);
newConfig = this._checkLovelaceConfig(newConfig);
try {
// Optimistic update
this._updateLovelace({

View File

@ -5403,6 +5403,11 @@ deep-extend@^0.6.0, deep-extend@~0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-freeze@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84"
integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=
deep-is@~0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"