diff --git a/docs/example-cfg-data.md b/docs/example-cfg-data.md index d4aad17..6abde9f 100644 --- a/docs/example-cfg-data.md +++ b/docs/example-cfg-data.md @@ -14,6 +14,9 @@ for the assigned value of `data`: * any `key in this.entity` (e.g., `entity_id`, `state`, ...) * otherwise a key within `this.entity.attributes` will be assumed +When accessing attributes, sometimes an attribute object will itself contain objects. +In that case, you can access the lower object using dotted notation. eg: object1.object2.field1 + If the chosen `data` selector does not resolve to something useful, the cell will be marked with an error - collection/rendering should continue w/o any issues. diff --git a/flex-table-card.js b/flex-table-card.js index 14d8fe1..c88f37d 100644 --- a/flex-table-card.js +++ b/flex-table-card.js @@ -281,7 +281,28 @@ class DataRow { } else { // no matching data found, complain: //raw_content.push("[[ no match ]]"); - raw_content.push(null); + + let pos = col_key.indexOf('.'); + if (pos < 0) + { + raw_content.push(null); + } + else + { + // if the col_key field contains a dotted object (eg: day.monday) + // then traverse each object to ensure that it exists + // until the final object value is found. + // if at any point in the traversal, the object is not found + // then null will be used as the value. + let objs = col_key.split('.'); + let value = this.entity.attributes; + if (value) { + for (let idx = 0; value && idx < objs.length; idx++) { + value = (objs[idx] in value) ? value[objs[idx]] : null; + } + } + raw_content.push(value); + } } // @todo: not really nice to clean `raw_content` up here, why