From c033db61a5edcd789886f8b587bade77964720bd Mon Sep 17 00:00:00 2001 From: Marco Kreeft Date: Thu, 29 Sep 2022 15:18:30 +0200 Subject: [PATCH] Hiding feature for entity rows (#74) * Hiding feature for entity rows --- info.md | 4 + package-lock.json | 4 +- package.json | 2 +- room-card.js | 8 +- room-card.js.gz | Bin 19192 -> 19265 bytes src/entity.ts | 21 ++-- src/index.ts | 12 +-- src/types/room-card-types.ts | 3 +- src/util.ts | 33 ++++-- tests/entity/renderEntity.test.ts | 2 +- tests/entity/renderValue.test.ts | 14 +-- .../{hideIf.test.ts => hideIfEntity.test.ts} | 30 +++--- tests/util/hideIfRow.test.ts | 101 ++++++++++++++++++ 13 files changed, 184 insertions(+), 50 deletions(-) rename tests/util/{hideIf.test.ts => hideIfEntity.test.ts} (87%) create mode 100644 tests/util/hideIfRow.test.ts diff --git a/info.md b/info.md index c5378f3..c728154 100644 --- a/info.md +++ b/info.md @@ -2,6 +2,10 @@ ### Features +{% if version_installed.replace("v", "").replace(".","") | int < 10610 %} +- Added `Hiding feature for entity rows` +{% endif %} + {% if version_installed.replace("v", "").replace(".","") | int < 10601 %} - Fixed `Formatting not working for entities and row entities` {% endif %} diff --git a/package-lock.json b/package-lock.json index ae5d30d..264a790 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "room-card", - "version": "1.06.01", + "version": "1.06.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "room-card", - "version": "1.06.01", + "version": "1.06.10", "license": "MIT", "dependencies": { "babel-jest": "^29.0.3", diff --git a/package.json b/package.json index 1ae3e24..6eb2ac1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "room-card", - "version": "1.06.01", + "version": "1.06.10", "description": "Show entities in Home Assistant's Lovelace UI", "keywords": [ "home-assistant", diff --git a/room-card.js b/room-card.js index 4751d14..24d1c95 100644 --- a/room-card.js +++ b/room-card.js @@ -1,5 +1,5 @@ /*! For license information please see room-card.js.LICENSE.txt */ -(()=>{"use strict";var t={197:(t,e,i)=>{i.r(e),i.d(e,{DEFAULT_DOMAIN_ICON:()=>Z,DEFAULT_PANEL:()=>Q,DEFAULT_VIEW_ENTITY_ID:()=>st,DOMAINS_HIDE_MORE_INFO:()=>et,DOMAINS_MORE_INFO_NO_HISTORY:()=>it,DOMAINS_TOGGLE:()=>rt,DOMAINS_WITH_CARD:()=>X,DOMAINS_WITH_MORE_INFO:()=>tt,NumberFormat:()=>n,STATES_OFF:()=>nt,TimeFormat:()=>r,UNIT_C:()=>ot,UNIT_F:()=>at,applyThemesOnElement:()=>U,computeCardSize:()=>R,computeDomain:()=>H,computeEntity:()=>L,computeRTL:()=>V,computeRTLDirection:()=>z,computeStateDisplay:()=>J,computeStateDomain:()=>q,createThing:()=>dt,debounce:()=>mt,domainIcon:()=>pt,evaluateFilter:()=>ft,fireEvent:()=>lt,fixedIcons:()=>ht,formatDate:()=>c,formatDateMonth:()=>g,formatDateMonthYear:()=>v,formatDateNumeric:()=>m,formatDateShort:()=>p,formatDateTime:()=>A,formatDateTimeNumeric:()=>T,formatDateTimeWithSeconds:()=>E,formatDateWeekday:()=>l,formatDateYear:()=>b,formatNumber:()=>Y,formatTime:()=>N,formatTimeWeekday:()=>x,formatTimeWithSeconds:()=>C,forwardHaptic:()=>vt,getLovelace:()=>Tt,handleAction:()=>wt,handleActionConfig:()=>bt,handleClick:()=>$t,hasAction:()=>At,hasConfigOrEntityChanged:()=>St,hasDoubleClick:()=>Et,isNumericState:()=>W,navigate:()=>yt,numberFormatToLocale:()=>B,relativeTime:()=>M,round:()=>K,stateIcon:()=>Dt,timerTimeRemaining:()=>P,toggleEntity:()=>_t,turnOnOffEntities:()=>Ot,turnOnOffEntity:()=>gt});var n,r,o,a=function(){return a=Object.assign||function(t){for(var e,i=1,n=arguments.length;i0)return{value:Math.round(m),unit:"year"};var h=12*m+c.getMonth()-d.getMonth();if(Math.round(Math.abs(h))>0)return{value:Math.round(h),unit:"month"};var p=r/604800;return{value:Math.round(p),unit:"week"}}(t,i);return n?function(t){return new Intl.RelativeTimeFormat(t.language,{numeric:"auto"})}(e).format(r.value,r.unit):Intl.NumberFormat(e.language,{style:"unit",unit:r.unit,unitDisplay:"long"}).format(Math.abs(r.value))};function P(t){var e,i=3600*(e=t.attributes.remaining.split(":").map(Number))[0]+60*e[1]+e[2];if("active"===t.state){var n=(new Date).getTime(),r=new Date(t.last_changed).getTime();i=Math.max(i-(n-r)/1e3,0)}return i}function F(){return(F=Object.assign||function(t){for(var e=1;e-1?t.split(".")[1].length:0;i.minimumFractionDigits=n,i.maximumFractionDigits=n}return i},J=function(t,e,i,n){var r=void 0!==n?n:e.state;if("unknown"===r||"unavailable"===r)return t("state.default."+r);if(W(e)){if("monetary"===e.attributes.device_class)try{return Y(r,i,{style:"currency",currency:e.attributes.unit_of_measurement})}catch(t){}return Y(r,i)+(e.attributes.unit_of_measurement?" "+e.attributes.unit_of_measurement:"")}var o=q(e);if("input_datetime"===o){var a;if(void 0===n)return e.attributes.has_date&&e.attributes.has_time?(a=new Date(e.attributes.year,e.attributes.month-1,e.attributes.day,e.attributes.hour,e.attributes.minute),A(a,i)):e.attributes.has_date?(a=new Date(e.attributes.year,e.attributes.month-1,e.attributes.day),c(a,i)):e.attributes.has_time?((a=new Date).setHours(e.attributes.hour,e.attributes.minute),N(a,i)):e.state;try{var s=n.split(" ");if(2===s.length)return A(new Date(s.join("T")),i);if(1===s.length){if(n.includes("-"))return c(new Date(n+"T00:00"),i);if(n.includes(":")){var l=new Date;return N(new Date(l.toISOString().split("T")[0]+"T"+n),i)}}return n}catch(t){return n}}return"humidifier"===o&&"on"===r&&e.attributes.humidity?e.attributes.humidity+" %":"counter"===o||"number"===o||"input_number"===o?Y(r,i):e.attributes.device_class&&t("component."+o+".state."+e.attributes.device_class+"."+r)||t("component."+o+".state._."+r)||r},Z="mdi:bookmark",Q="lovelace",X=["climate","cover","configurator","input_select","input_number","input_text","lock","media_player","scene","script","timer","vacuum","water_heater","weblink"],tt=["alarm_control_panel","automation","camera","climate","configurator","cover","fan","group","history_graph","input_datetime","light","lock","media_player","script","sun","updater","vacuum","water_heater","weather"],et=["input_number","input_select","input_text","scene","weblink"],it=["camera","configurator","history_graph","scene"],nt=["closed","locked","off"],rt=new Set(["fan","input_boolean","light","switch","group","automation"]),ot="°C",at="°F",st="group.default_view",lt=function(t,e,i,n){n=n||{},i=null==i?{}:i;var r=new Event(e,{bubbles:void 0===n.bubbles||n.bubbles,cancelable:Boolean(n.cancelable),composed:void 0===n.composed||n.composed});return r.detail=i,t.dispatchEvent(r),r},ut=new Set(["call-service","divider","section","weblink","cast","select"]),ct={alert:"toggle",automation:"toggle",climate:"climate",cover:"cover",fan:"toggle",group:"group",input_boolean:"toggle",input_number:"input-number",input_select:"input-select",input_text:"input-text",light:"toggle",lock:"lock",media_player:"media-player",remote:"toggle",scene:"scene",script:"script",sensor:"sensor",timer:"timer",switch:"toggle",vacuum:"toggle",water_heater:"climate",input_datetime:"input-datetime"},dt=function(t,e){void 0===e&&(e=!1);var i=function(t,e){return n("hui-error-card",{type:"error",error:t,config:e})},n=function(t,e){var n=window.document.createElement(t);try{if(!n.setConfig)return;n.setConfig(e)}catch(n){return console.error(t,n),i(n.message,e)}return n};if(!t||"object"!=typeof t||!e&&!t.type)return i("No type defined",t);var r=t.type;if(r&&r.startsWith("custom:"))r=r.substr("custom:".length);else if(e)if(ut.has(r))r="hui-"+r+"-row";else{if(!t.entity)return i("Invalid config given.",t);var o=t.entity.split(".",1)[0];r="hui-"+(ct[o]||"text")+"-entity-row"}else r="hui-"+r+"-card";if(customElements.get(r))return n(r,t);var a=i("Custom element doesn't exist: "+t.type+".",t);a.style.display="None";var s=setTimeout((function(){a.style.display=""}),2e3);return customElements.whenDefined(t.type).then((function(){clearTimeout(s),lt(a,"ll-rebuild",{},a)})),a},mt=function(t,e,i){var n;return void 0===i&&(i=!1),function(){var r=[].slice.call(arguments),o=this,a=function(){n=null,i||t.apply(o,r)},s=i&&!n;clearTimeout(n),n=setTimeout(a,e),s&&t.apply(o,r)}},ht={alert:"mdi:alert",automation:"mdi:playlist-play",calendar:"mdi:calendar",camera:"mdi:video",climate:"mdi:thermostat",configurator:"mdi:settings",conversation:"mdi:text-to-speech",device_tracker:"mdi:account",fan:"mdi:fan",group:"mdi:google-circles-communities",history_graph:"mdi:chart-line",homeassistant:"mdi:home-assistant",homekit:"mdi:home-automation",image_processing:"mdi:image-filter-frames",input_boolean:"mdi:drawing",input_datetime:"mdi:calendar-clock",input_number:"mdi:ray-vertex",input_select:"mdi:format-list-bulleted",input_text:"mdi:textbox",light:"mdi:lightbulb",mailbox:"mdi:mailbox",notify:"mdi:comment-alert",person:"mdi:account",plant:"mdi:flower",proximity:"mdi:apple-safari",remote:"mdi:remote",scene:"mdi:google-pages",script:"mdi:file-document",sensor:"mdi:eye",simple_alarm:"mdi:bell",sun:"mdi:white-balance-sunny",switch:"mdi:flash",timer:"mdi:timer",updater:"mdi:cloud-upload",vacuum:"mdi:robot-vacuum",water_heater:"mdi:thermometer",weblink:"mdi:open-in-new"};function pt(t,e){if(t in ht)return ht[t];switch(t){case"alarm_control_panel":switch(e){case"armed_home":return"mdi:bell-plus";case"armed_night":return"mdi:bell-sleep";case"disarmed":return"mdi:bell-outline";case"triggered":return"mdi:bell-ring";default:return"mdi:bell"}case"binary_sensor":return e&&"off"===e?"mdi:radiobox-blank":"mdi:checkbox-marked-circle";case"cover":return"closed"===e?"mdi:window-closed":"mdi:window-open";case"lock":return e&&"unlocked"===e?"mdi:lock-open":"mdi:lock";case"media_player":return e&&"off"!==e&&"idle"!==e?"mdi:cast-connected":"mdi:cast";case"zwave":switch(e){case"dead":return"mdi:emoticon-dead";case"sleeping":return"mdi:sleep";case"initializing":return"mdi:timer-sand";default:return"mdi:z-wave"}default:return console.warn("Unable to find icon for domain "+t+" ("+e+")"),"mdi:bookmark"}}var ft=function(t,e){var i=e.value||e,n=e.attribute?t.attributes[e.attribute]:t.state;switch(e.operator||"=="){case"==":return n===i;case"<=":return n<=i;case"<":return n=":return n>=i;case">":return n>i;case"!=":return n!==i;case"regex":return n.match(i);default:return!1}},vt=function(t){lt(window,"haptic",t)},yt=function(t,e,i){void 0===i&&(i=!1),i?history.replaceState(null,"",e):history.pushState(null,"",e),lt(window,"location-changed",{replace:i})},gt=function(t,e,i){void 0===i&&(i=!0);var n,r=H(e),o="group"===r?"homeassistant":r;switch(r){case"lock":n=i?"unlock":"lock";break;case"cover":n=i?"open_cover":"close_cover";break;default:n=i?"turn_on":"turn_off"}return t.callService(o,n,{entity_id:e})},_t=function(t,e){var i=nt.includes(t.states[e].state);return gt(t,e,i)},bt=function(t,e,i,n){if(n||(n={action:"more-info"}),!n.confirmation||n.confirmation.exemptions&&n.confirmation.exemptions.some((function(t){return t.user===e.user.id}))||(vt("warning"),confirm(n.confirmation.text||"Are you sure you want to "+n.action+"?")))switch(n.action){case"more-info":(i.entity||i.camera_image)&<(t,"hass-more-info",{entityId:i.entity?i.entity:i.camera_image});break;case"navigate":n.navigation_path&&yt(0,n.navigation_path);break;case"url":n.url_path&&window.open(n.url_path);break;case"toggle":i.entity&&(_t(e,i.entity),vt("success"));break;case"call-service":if(!n.service)return void vt("failure");var r=n.service.split(".",2);e.callService(r[0],r[1],n.service_data,n.target),vt("success");break;case"fire-dom-event":lt(t,"ll-custom",n)}},wt=function(t,e,i,n){var r;"double_tap"===n&&i.double_tap_action?r=i.double_tap_action:"hold"===n&&i.hold_action?r=i.hold_action:"tap"===n&&i.tap_action&&(r=i.tap_action),bt(t,e,i,r)},$t=function(t,e,i,n,r){var o;if(r&&i.double_tap_action?o=i.double_tap_action:n&&i.hold_action?o=i.hold_action:!n&&i.tap_action&&(o=i.tap_action),o||(o={action:"more-info"}),!o.confirmation||o.confirmation.exemptions&&o.confirmation.exemptions.some((function(t){return t.user===e.user.id}))||confirm(o.confirmation.text||"Are you sure you want to "+o.action+"?"))switch(o.action){case"more-info":(o.entity||i.entity||i.camera_image)&&(lt(t,"hass-more-info",{entityId:o.entity?o.entity:i.entity?i.entity:i.camera_image}),o.haptic&&vt(o.haptic));break;case"navigate":o.navigation_path&&(yt(0,o.navigation_path),o.haptic&&vt(o.haptic));break;case"url":o.url_path&&window.open(o.url_path),o.haptic&&vt(o.haptic);break;case"toggle":i.entity&&(_t(e,i.entity),o.haptic&&vt(o.haptic));break;case"call-service":if(!o.service)return;var a=o.service.split(".",2),s=a[0],l=a[1],u=F({},o.service_data);"entity"===u.entity_id&&(u.entity_id=i.entity),e.callService(s,l,u,o.target),o.haptic&&vt(o.haptic);break;case"fire-dom-event":lt(t,"ll-custom",o),o.haptic&&vt(o.haptic)}};function At(t){return void 0!==t&&"none"!==t.action}function St(t,e,i){if(e.has("config")||i)return!0;if(t.config.entity){var n=e.get("hass");return!n||n.states[t.config.entity]!==t.hass.states[t.config.entity]}return!1}function Et(t){return void 0!==t&&"none"!==t.action}var Ot=function(t,e,i){void 0===i&&(i=!0);var n={};e.forEach((function(e){if(nt.includes(t.states[e].state)===i){var r=H(e),o=["cover","lock"].includes(r)?r:"homeassistant";o in n||(n[o]=[]),n[o].push(e)}})),Object.keys(n).forEach((function(e){var r;switch(e){case"lock":r=i?"unlock":"lock";break;case"cover":r=i?"open_cover":"close_cover";break;default:r=i?"turn_on":"turn_off"}t.callService(e,r,{entity_id:n[e]})}))},Tt=function(){var t=document.querySelector("home-assistant");if(t=(t=(t=(t=(t=(t=(t=(t=t&&t.shadowRoot)&&t.querySelector("home-assistant-main"))&&t.shadowRoot)&&t.querySelector("app-drawer-layout partial-panel-resolver"))&&t.shadowRoot||t)&&t.querySelector("ha-panel-lovelace"))&&t.shadowRoot)&&t.querySelector("hui-root")){var e=t.lovelace;return e.current_view=t.___curView,e}return null},kt={humidity:"mdi:water-percent",illuminance:"mdi:brightness-5",temperature:"mdi:thermometer",pressure:"mdi:gauge",power:"mdi:flash",signal_strength:"mdi:wifi"},Nt={binary_sensor:function(t,e){var i="off"===t;switch(null==e?void 0:e.attributes.device_class){case"battery":return i?"mdi:battery":"mdi:battery-outline";case"battery_charging":return i?"mdi:battery":"mdi:battery-charging";case"cold":return i?"mdi:thermometer":"mdi:snowflake";case"connectivity":return i?"mdi:server-network-off":"mdi:server-network";case"door":return i?"mdi:door-closed":"mdi:door-open";case"garage_door":return i?"mdi:garage":"mdi:garage-open";case"power":case"plug":return i?"mdi:power-plug-off":"mdi:power-plug";case"gas":case"problem":case"safety":case"tamper":return i?"mdi:check-circle":"mdi:alert-circle";case"smoke":return i?"mdi:check-circle":"mdi:smoke";case"heat":return i?"mdi:thermometer":"mdi:fire";case"light":return i?"mdi:brightness-5":"mdi:brightness-7";case"lock":return i?"mdi:lock":"mdi:lock-open";case"moisture":return i?"mdi:water-off":"mdi:water";case"motion":return i?"mdi:walk":"mdi:run";case"occupancy":case"presence":return i?"mdi:home-outline":"mdi:home";case"opening":return i?"mdi:square":"mdi:square-outline";case"running":return i?"mdi:stop":"mdi:play";case"sound":return i?"mdi:music-note-off":"mdi:music-note";case"update":return i?"mdi:package":"mdi:package-up";case"vibration":return i?"mdi:crop-portrait":"mdi:vibrate";case"window":return i?"mdi:window-closed":"mdi:window-open";default:return i?"mdi:radiobox-blank":"mdi:checkbox-marked-circle"}},cover:function(t){var e="closed"!==t.state;switch(t.attributes.device_class){case"garage":return e?"mdi:garage-open":"mdi:garage";case"door":return e?"mdi:door-open":"mdi:door-closed";case"shutter":return e?"mdi:window-shutter-open":"mdi:window-shutter";case"blind":return e?"mdi:blinds-open":"mdi:blinds";case"window":return e?"mdi:window-open":"mdi:window-closed";default:return pt("cover",t.state)}},sensor:function(t){var e=t.attributes.device_class;if(e&&e in kt)return kt[e];if("battery"===e){var i=Number(t.state);if(isNaN(i))return"mdi:battery-unknown";var n=10*Math.round(i/10);return n>=100?"mdi:battery":n<=0?"mdi:battery-alert":"hass:battery-"+n}var r=t.attributes.unit_of_measurement;return"°C"===r||"°F"===r?"mdi:thermometer":pt("sensor")},input_datetime:function(t){return t.attributes.has_date?t.attributes.has_time?pt("input_datetime"):"mdi:calendar":"mdi:clock"}},Dt=function(t){if(!t)return"mdi:bookmark";if(t.attributes.icon)return t.attributes.icon;var e=H(t.entity_id);return e in Nt?Nt[e](t):pt(e,t.state)}},461:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.holdHandler=e.dblClickHandler=e.clickHandler=e.renderInfoEntity=e.renderTitle=e.renderMainEntity=e.renderValue=e.renderIcon=e.renderEntity=e.renderEntitiesRow=e.entityStyles=e.entityStateDisplay=e.renderCustomStateIcon=e.renderConditionIcons=e.entityIcon=e.entityName=e.computeEntity=e.checkConfig=void 0;const n=i(230),r=i(759),o=i(578),a=i(882),s=i(197),l=i(897),u=i(623),c=i(704);e.checkConfig=t=>{if(null==t.entities&&null==t.entity&&null==t.info_entities&&null==t.rows)throw new Error("Please define entities.")},e.computeEntity=t=>t.substr(t.indexOf(".")+1),e.entityName=t=>t.name||(t.entity?t.stateObj.attributes.friendly_name||(0,e.computeEntity)(t.stateObj.entity_id):null)||null,e.entityIcon=(t,i,n)=>{var r;if("icon"in i&&(void 0===i.show_icon||!1===i.show_icon))throw new Error(`Entity: ${i.entity} => Icon defined but show_icon is set to false or not defined. Please set show_icon to true`);return"icon"in i?"string"==typeof i.icon?i.icon:i.icon.state_on?(0,e.renderCustomStateIcon)(t,i.icon):i.icon.conditions?(0,e.renderConditionIcons)(t,i,n):(null===(r=i.icon.template)||void 0===r?void 0:r.icon)?(0,a.evalTemplate)(n,t,i.icon.template.icon):void 0:t.attributes.icon||null},e.renderConditionIcons=(t,e,i)=>{let n=t.state;return e.icon.conditions.filter((e=>{if(e.entity){const t=i.states[e.entity];n=e.attribute?t.attributes[e.attribute]:t.state}return e.attribute&&!e.entity&&(n=t.attributes[e.attribute]),(0,a.checkConditionalValue)(e,n)})).pop()},e.renderCustomStateIcon=(t,e)=>{switch((0,o.computeStateDomain)(t)){case"light":case"switch":case"binary_sensor":case"input_boolean":return"on"===t.state?e.state_on:e.state_off}},e.entityStateDisplay=(t,e)=>{if((0,a.isUnavailable)(e.stateObj))return t.localize(`state.default.${e.stateObj.state}`);let i=(0,a.getValue)(e),l=void 0!==e.attribute?e.unit:e.unit||e.stateObj.attributes.unit_of_measurement;if(e.format){if(e.format.startsWith("precision")){const n=parseInt(e.format.slice(-1),10),o=t.locale.number_format===s.NumberFormat.comma_decimal?i:i.toString().replaceAll(",",".");i=(0,r.formatNumber)(o,t.locale,{minimumFractionDigits:n,maximumFractionDigits:n})}else isNaN(parseFloat(i))||!isFinite(i)||("brightness"===e.format?(i=Math.round(i/255*100),l="%"):e.format.startsWith("duration")?(i=(0,n.secondsToDuration)("duration-m"===e.format?i/1e3:i),l=void 0):"kilo"===e.format?i=(0,r.formatNumber)(i/1e3,t.locale,{maximumFractionDigits:2}):"invert"===e.format?i=(0,r.formatNumber)(i-2*i,t.locale):"position"===e.format&&(i=(0,r.formatNumber)(100-i,t.locale)));return`${i}${l?` ${l}`:""}`}if(e.attribute)return`${isNaN(i)?i:(0,r.formatNumber)(i,t.locale)}${l?` ${l}`:""}`;const u=Object.assign(Object.assign({},e.stateObj),{attributes:Object.assign(Object.assign({},e.stateObj.attributes),{unit_of_measurement:l})});return(0,o.computeStateDisplay)(t.localize,u,t.locale)},e.entityStyles=t=>(0,a.isObject)(t)?Object.keys(t).map((e=>`${e}: ${t[e]};`)).join(""):"",e.renderEntitiesRow=(t,i,n,r)=>void 0===t?null:l.html`
${t.map((t=>(0,e.renderEntity)(t,i,n)))}
`,e.renderEntity=(t,i,n)=>{if(null==t.stateObj||(0,a.hideIf)(t,i))return null;const r=(0,e.clickHandler)(t.stateObj.entity_id,t.tap_action,i,n),o=(0,e.dblClickHandler)(t.stateObj.entity_id,t.double_tap_action,i,n),s=(0,e.holdHandler)(t.stateObj.entity_id,t.hold_action,i,n);let u,c,d;const m=()=>{u=!1,c=window.setTimeout((()=>{u=!0}),500)},h=e=>{e.preventDefault(),["touchend","touchcancel"].includes(e.type)&&void 0===c||(window.clearTimeout(c),c=void 0,u?s():void 0!==t.double_tap_action?"click"===e.type&&e.detail<2||!d?d=window.setTimeout((()=>{d=void 0,r()}),250):(window.clearTimeout(d),d=void 0,o()):r())};return l.html`
{"use strict";var t={197:(t,e,i)=>{i.r(e),i.d(e,{DEFAULT_DOMAIN_ICON:()=>Z,DEFAULT_PANEL:()=>Q,DEFAULT_VIEW_ENTITY_ID:()=>st,DOMAINS_HIDE_MORE_INFO:()=>et,DOMAINS_MORE_INFO_NO_HISTORY:()=>it,DOMAINS_TOGGLE:()=>rt,DOMAINS_WITH_CARD:()=>X,DOMAINS_WITH_MORE_INFO:()=>tt,NumberFormat:()=>n,STATES_OFF:()=>nt,TimeFormat:()=>r,UNIT_C:()=>ot,UNIT_F:()=>at,applyThemesOnElement:()=>F,computeCardSize:()=>R,computeDomain:()=>H,computeEntity:()=>L,computeRTL:()=>V,computeRTLDirection:()=>z,computeStateDisplay:()=>J,computeStateDomain:()=>q,createThing:()=>dt,debounce:()=>mt,domainIcon:()=>pt,evaluateFilter:()=>ft,fireEvent:()=>lt,fixedIcons:()=>ht,formatDate:()=>c,formatDateMonth:()=>g,formatDateMonthYear:()=>v,formatDateNumeric:()=>m,formatDateShort:()=>p,formatDateTime:()=>A,formatDateTimeNumeric:()=>T,formatDateTimeWithSeconds:()=>E,formatDateWeekday:()=>l,formatDateYear:()=>b,formatNumber:()=>Y,formatTime:()=>N,formatTimeWeekday:()=>x,formatTimeWithSeconds:()=>C,forwardHaptic:()=>vt,getLovelace:()=>Tt,handleAction:()=>wt,handleActionConfig:()=>bt,handleClick:()=>$t,hasAction:()=>At,hasConfigOrEntityChanged:()=>St,hasDoubleClick:()=>Et,isNumericState:()=>W,navigate:()=>yt,numberFormatToLocale:()=>B,relativeTime:()=>M,round:()=>K,stateIcon:()=>Dt,timerTimeRemaining:()=>P,toggleEntity:()=>_t,turnOnOffEntities:()=>Ot,turnOnOffEntity:()=>gt});var n,r,o,a=function(){return a=Object.assign||function(t){for(var e,i=1,n=arguments.length;i0)return{value:Math.round(m),unit:"year"};var h=12*m+c.getMonth()-d.getMonth();if(Math.round(Math.abs(h))>0)return{value:Math.round(h),unit:"month"};var p=r/604800;return{value:Math.round(p),unit:"week"}}(t,i);return n?function(t){return new Intl.RelativeTimeFormat(t.language,{numeric:"auto"})}(e).format(r.value,r.unit):Intl.NumberFormat(e.language,{style:"unit",unit:r.unit,unitDisplay:"long"}).format(Math.abs(r.value))};function P(t){var e,i=3600*(e=t.attributes.remaining.split(":").map(Number))[0]+60*e[1]+e[2];if("active"===t.state){var n=(new Date).getTime(),r=new Date(t.last_changed).getTime();i=Math.max(i-(n-r)/1e3,0)}return i}function U(){return(U=Object.assign||function(t){for(var e=1;e-1?t.split(".")[1].length:0;i.minimumFractionDigits=n,i.maximumFractionDigits=n}return i},J=function(t,e,i,n){var r=void 0!==n?n:e.state;if("unknown"===r||"unavailable"===r)return t("state.default."+r);if(W(e)){if("monetary"===e.attributes.device_class)try{return Y(r,i,{style:"currency",currency:e.attributes.unit_of_measurement})}catch(t){}return Y(r,i)+(e.attributes.unit_of_measurement?" "+e.attributes.unit_of_measurement:"")}var o=q(e);if("input_datetime"===o){var a;if(void 0===n)return e.attributes.has_date&&e.attributes.has_time?(a=new Date(e.attributes.year,e.attributes.month-1,e.attributes.day,e.attributes.hour,e.attributes.minute),A(a,i)):e.attributes.has_date?(a=new Date(e.attributes.year,e.attributes.month-1,e.attributes.day),c(a,i)):e.attributes.has_time?((a=new Date).setHours(e.attributes.hour,e.attributes.minute),N(a,i)):e.state;try{var s=n.split(" ");if(2===s.length)return A(new Date(s.join("T")),i);if(1===s.length){if(n.includes("-"))return c(new Date(n+"T00:00"),i);if(n.includes(":")){var l=new Date;return N(new Date(l.toISOString().split("T")[0]+"T"+n),i)}}return n}catch(t){return n}}return"humidifier"===o&&"on"===r&&e.attributes.humidity?e.attributes.humidity+" %":"counter"===o||"number"===o||"input_number"===o?Y(r,i):e.attributes.device_class&&t("component."+o+".state."+e.attributes.device_class+"."+r)||t("component."+o+".state._."+r)||r},Z="mdi:bookmark",Q="lovelace",X=["climate","cover","configurator","input_select","input_number","input_text","lock","media_player","scene","script","timer","vacuum","water_heater","weblink"],tt=["alarm_control_panel","automation","camera","climate","configurator","cover","fan","group","history_graph","input_datetime","light","lock","media_player","script","sun","updater","vacuum","water_heater","weather"],et=["input_number","input_select","input_text","scene","weblink"],it=["camera","configurator","history_graph","scene"],nt=["closed","locked","off"],rt=new Set(["fan","input_boolean","light","switch","group","automation"]),ot="°C",at="°F",st="group.default_view",lt=function(t,e,i,n){n=n||{},i=null==i?{}:i;var r=new Event(e,{bubbles:void 0===n.bubbles||n.bubbles,cancelable:Boolean(n.cancelable),composed:void 0===n.composed||n.composed});return r.detail=i,t.dispatchEvent(r),r},ut=new Set(["call-service","divider","section","weblink","cast","select"]),ct={alert:"toggle",automation:"toggle",climate:"climate",cover:"cover",fan:"toggle",group:"group",input_boolean:"toggle",input_number:"input-number",input_select:"input-select",input_text:"input-text",light:"toggle",lock:"lock",media_player:"media-player",remote:"toggle",scene:"scene",script:"script",sensor:"sensor",timer:"timer",switch:"toggle",vacuum:"toggle",water_heater:"climate",input_datetime:"input-datetime"},dt=function(t,e){void 0===e&&(e=!1);var i=function(t,e){return n("hui-error-card",{type:"error",error:t,config:e})},n=function(t,e){var n=window.document.createElement(t);try{if(!n.setConfig)return;n.setConfig(e)}catch(n){return console.error(t,n),i(n.message,e)}return n};if(!t||"object"!=typeof t||!e&&!t.type)return i("No type defined",t);var r=t.type;if(r&&r.startsWith("custom:"))r=r.substr("custom:".length);else if(e)if(ut.has(r))r="hui-"+r+"-row";else{if(!t.entity)return i("Invalid config given.",t);var o=t.entity.split(".",1)[0];r="hui-"+(ct[o]||"text")+"-entity-row"}else r="hui-"+r+"-card";if(customElements.get(r))return n(r,t);var a=i("Custom element doesn't exist: "+t.type+".",t);a.style.display="None";var s=setTimeout((function(){a.style.display=""}),2e3);return customElements.whenDefined(t.type).then((function(){clearTimeout(s),lt(a,"ll-rebuild",{},a)})),a},mt=function(t,e,i){var n;return void 0===i&&(i=!1),function(){var r=[].slice.call(arguments),o=this,a=function(){n=null,i||t.apply(o,r)},s=i&&!n;clearTimeout(n),n=setTimeout(a,e),s&&t.apply(o,r)}},ht={alert:"mdi:alert",automation:"mdi:playlist-play",calendar:"mdi:calendar",camera:"mdi:video",climate:"mdi:thermostat",configurator:"mdi:settings",conversation:"mdi:text-to-speech",device_tracker:"mdi:account",fan:"mdi:fan",group:"mdi:google-circles-communities",history_graph:"mdi:chart-line",homeassistant:"mdi:home-assistant",homekit:"mdi:home-automation",image_processing:"mdi:image-filter-frames",input_boolean:"mdi:drawing",input_datetime:"mdi:calendar-clock",input_number:"mdi:ray-vertex",input_select:"mdi:format-list-bulleted",input_text:"mdi:textbox",light:"mdi:lightbulb",mailbox:"mdi:mailbox",notify:"mdi:comment-alert",person:"mdi:account",plant:"mdi:flower",proximity:"mdi:apple-safari",remote:"mdi:remote",scene:"mdi:google-pages",script:"mdi:file-document",sensor:"mdi:eye",simple_alarm:"mdi:bell",sun:"mdi:white-balance-sunny",switch:"mdi:flash",timer:"mdi:timer",updater:"mdi:cloud-upload",vacuum:"mdi:robot-vacuum",water_heater:"mdi:thermometer",weblink:"mdi:open-in-new"};function pt(t,e){if(t in ht)return ht[t];switch(t){case"alarm_control_panel":switch(e){case"armed_home":return"mdi:bell-plus";case"armed_night":return"mdi:bell-sleep";case"disarmed":return"mdi:bell-outline";case"triggered":return"mdi:bell-ring";default:return"mdi:bell"}case"binary_sensor":return e&&"off"===e?"mdi:radiobox-blank":"mdi:checkbox-marked-circle";case"cover":return"closed"===e?"mdi:window-closed":"mdi:window-open";case"lock":return e&&"unlocked"===e?"mdi:lock-open":"mdi:lock";case"media_player":return e&&"off"!==e&&"idle"!==e?"mdi:cast-connected":"mdi:cast";case"zwave":switch(e){case"dead":return"mdi:emoticon-dead";case"sleeping":return"mdi:sleep";case"initializing":return"mdi:timer-sand";default:return"mdi:z-wave"}default:return console.warn("Unable to find icon for domain "+t+" ("+e+")"),"mdi:bookmark"}}var ft=function(t,e){var i=e.value||e,n=e.attribute?t.attributes[e.attribute]:t.state;switch(e.operator||"=="){case"==":return n===i;case"<=":return n<=i;case"<":return n=":return n>=i;case">":return n>i;case"!=":return n!==i;case"regex":return n.match(i);default:return!1}},vt=function(t){lt(window,"haptic",t)},yt=function(t,e,i){void 0===i&&(i=!1),i?history.replaceState(null,"",e):history.pushState(null,"",e),lt(window,"location-changed",{replace:i})},gt=function(t,e,i){void 0===i&&(i=!0);var n,r=H(e),o="group"===r?"homeassistant":r;switch(r){case"lock":n=i?"unlock":"lock";break;case"cover":n=i?"open_cover":"close_cover";break;default:n=i?"turn_on":"turn_off"}return t.callService(o,n,{entity_id:e})},_t=function(t,e){var i=nt.includes(t.states[e].state);return gt(t,e,i)},bt=function(t,e,i,n){if(n||(n={action:"more-info"}),!n.confirmation||n.confirmation.exemptions&&n.confirmation.exemptions.some((function(t){return t.user===e.user.id}))||(vt("warning"),confirm(n.confirmation.text||"Are you sure you want to "+n.action+"?")))switch(n.action){case"more-info":(i.entity||i.camera_image)&<(t,"hass-more-info",{entityId:i.entity?i.entity:i.camera_image});break;case"navigate":n.navigation_path&&yt(0,n.navigation_path);break;case"url":n.url_path&&window.open(n.url_path);break;case"toggle":i.entity&&(_t(e,i.entity),vt("success"));break;case"call-service":if(!n.service)return void vt("failure");var r=n.service.split(".",2);e.callService(r[0],r[1],n.service_data,n.target),vt("success");break;case"fire-dom-event":lt(t,"ll-custom",n)}},wt=function(t,e,i,n){var r;"double_tap"===n&&i.double_tap_action?r=i.double_tap_action:"hold"===n&&i.hold_action?r=i.hold_action:"tap"===n&&i.tap_action&&(r=i.tap_action),bt(t,e,i,r)},$t=function(t,e,i,n,r){var o;if(r&&i.double_tap_action?o=i.double_tap_action:n&&i.hold_action?o=i.hold_action:!n&&i.tap_action&&(o=i.tap_action),o||(o={action:"more-info"}),!o.confirmation||o.confirmation.exemptions&&o.confirmation.exemptions.some((function(t){return t.user===e.user.id}))||confirm(o.confirmation.text||"Are you sure you want to "+o.action+"?"))switch(o.action){case"more-info":(o.entity||i.entity||i.camera_image)&&(lt(t,"hass-more-info",{entityId:o.entity?o.entity:i.entity?i.entity:i.camera_image}),o.haptic&&vt(o.haptic));break;case"navigate":o.navigation_path&&(yt(0,o.navigation_path),o.haptic&&vt(o.haptic));break;case"url":o.url_path&&window.open(o.url_path),o.haptic&&vt(o.haptic);break;case"toggle":i.entity&&(_t(e,i.entity),o.haptic&&vt(o.haptic));break;case"call-service":if(!o.service)return;var a=o.service.split(".",2),s=a[0],l=a[1],u=U({},o.service_data);"entity"===u.entity_id&&(u.entity_id=i.entity),e.callService(s,l,u,o.target),o.haptic&&vt(o.haptic);break;case"fire-dom-event":lt(t,"ll-custom",o),o.haptic&&vt(o.haptic)}};function At(t){return void 0!==t&&"none"!==t.action}function St(t,e,i){if(e.has("config")||i)return!0;if(t.config.entity){var n=e.get("hass");return!n||n.states[t.config.entity]!==t.hass.states[t.config.entity]}return!1}function Et(t){return void 0!==t&&"none"!==t.action}var Ot=function(t,e,i){void 0===i&&(i=!0);var n={};e.forEach((function(e){if(nt.includes(t.states[e].state)===i){var r=H(e),o=["cover","lock"].includes(r)?r:"homeassistant";o in n||(n[o]=[]),n[o].push(e)}})),Object.keys(n).forEach((function(e){var r;switch(e){case"lock":r=i?"unlock":"lock";break;case"cover":r=i?"open_cover":"close_cover";break;default:r=i?"turn_on":"turn_off"}t.callService(e,r,{entity_id:n[e]})}))},Tt=function(){var t=document.querySelector("home-assistant");if(t=(t=(t=(t=(t=(t=(t=(t=t&&t.shadowRoot)&&t.querySelector("home-assistant-main"))&&t.shadowRoot)&&t.querySelector("app-drawer-layout partial-panel-resolver"))&&t.shadowRoot||t)&&t.querySelector("ha-panel-lovelace"))&&t.shadowRoot)&&t.querySelector("hui-root")){var e=t.lovelace;return e.current_view=t.___curView,e}return null},kt={humidity:"mdi:water-percent",illuminance:"mdi:brightness-5",temperature:"mdi:thermometer",pressure:"mdi:gauge",power:"mdi:flash",signal_strength:"mdi:wifi"},Nt={binary_sensor:function(t,e){var i="off"===t;switch(null==e?void 0:e.attributes.device_class){case"battery":return i?"mdi:battery":"mdi:battery-outline";case"battery_charging":return i?"mdi:battery":"mdi:battery-charging";case"cold":return i?"mdi:thermometer":"mdi:snowflake";case"connectivity":return i?"mdi:server-network-off":"mdi:server-network";case"door":return i?"mdi:door-closed":"mdi:door-open";case"garage_door":return i?"mdi:garage":"mdi:garage-open";case"power":case"plug":return i?"mdi:power-plug-off":"mdi:power-plug";case"gas":case"problem":case"safety":case"tamper":return i?"mdi:check-circle":"mdi:alert-circle";case"smoke":return i?"mdi:check-circle":"mdi:smoke";case"heat":return i?"mdi:thermometer":"mdi:fire";case"light":return i?"mdi:brightness-5":"mdi:brightness-7";case"lock":return i?"mdi:lock":"mdi:lock-open";case"moisture":return i?"mdi:water-off":"mdi:water";case"motion":return i?"mdi:walk":"mdi:run";case"occupancy":case"presence":return i?"mdi:home-outline":"mdi:home";case"opening":return i?"mdi:square":"mdi:square-outline";case"running":return i?"mdi:stop":"mdi:play";case"sound":return i?"mdi:music-note-off":"mdi:music-note";case"update":return i?"mdi:package":"mdi:package-up";case"vibration":return i?"mdi:crop-portrait":"mdi:vibrate";case"window":return i?"mdi:window-closed":"mdi:window-open";default:return i?"mdi:radiobox-blank":"mdi:checkbox-marked-circle"}},cover:function(t){var e="closed"!==t.state;switch(t.attributes.device_class){case"garage":return e?"mdi:garage-open":"mdi:garage";case"door":return e?"mdi:door-open":"mdi:door-closed";case"shutter":return e?"mdi:window-shutter-open":"mdi:window-shutter";case"blind":return e?"mdi:blinds-open":"mdi:blinds";case"window":return e?"mdi:window-open":"mdi:window-closed";default:return pt("cover",t.state)}},sensor:function(t){var e=t.attributes.device_class;if(e&&e in kt)return kt[e];if("battery"===e){var i=Number(t.state);if(isNaN(i))return"mdi:battery-unknown";var n=10*Math.round(i/10);return n>=100?"mdi:battery":n<=0?"mdi:battery-alert":"hass:battery-"+n}var r=t.attributes.unit_of_measurement;return"°C"===r||"°F"===r?"mdi:thermometer":pt("sensor")},input_datetime:function(t){return t.attributes.has_date?t.attributes.has_time?pt("input_datetime"):"mdi:calendar":"mdi:clock"}},Dt=function(t){if(!t)return"mdi:bookmark";if(t.attributes.icon)return t.attributes.icon;var e=H(t.entity_id);return e in Nt?Nt[e](t):pt(e,t.state)}},461:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.holdHandler=e.dblClickHandler=e.clickHandler=e.renderInfoEntity=e.renderTitle=e.renderMainEntity=e.renderValue=e.renderIcon=e.renderEntity=e.renderEntitiesRow=e.renderRows=e.entityStyles=e.entityStateDisplay=e.renderCustomStateIcon=e.renderConditionIcons=e.entityIcon=e.entityName=e.computeEntity=e.checkConfig=void 0;const n=i(230),r=i(759),o=i(578),a=i(882),s=i(197),l=i(897),u=i(623),c=i(704);e.checkConfig=t=>{if(null==t.entities&&null==t.entity&&null==t.info_entities&&null==t.rows)throw new Error("Please define entities.")},e.computeEntity=t=>t.substr(t.indexOf(".")+1),e.entityName=t=>t.name||(t.entity?t.stateObj.attributes.friendly_name||(0,e.computeEntity)(t.stateObj.entity_id):null)||null,e.entityIcon=(t,i,n)=>{var r;if("icon"in i&&(void 0===i.show_icon||!1===i.show_icon))throw new Error(`Entity: ${i.entity} => Icon defined but show_icon is set to false or not defined. Please set show_icon to true`);return"icon"in i?"string"==typeof i.icon?i.icon:i.icon.state_on?(0,e.renderCustomStateIcon)(t,i.icon):i.icon.conditions?(0,e.renderConditionIcons)(t,i,n):(null===(r=i.icon.template)||void 0===r?void 0:r.icon)?(0,a.evalTemplate)(n,t,i.icon.template.icon):void 0:t.attributes.icon||null},e.renderConditionIcons=(t,e,i)=>{let n=t.state;return e.icon.conditions.filter((e=>{if(e.entity){const t=i.states[e.entity];n=e.attribute?t.attributes[e.attribute]:t.state}return e.attribute&&!e.entity&&(n=t.attributes[e.attribute]),(0,a.checkConditionalValue)(e,n)})).pop()},e.renderCustomStateIcon=(t,e)=>{switch((0,o.computeStateDomain)(t)){case"light":case"switch":case"binary_sensor":case"input_boolean":return"on"===t.state?e.state_on:e.state_off}},e.entityStateDisplay=(t,e)=>{if((0,a.isUnavailable)(e.stateObj))return t.localize(`state.default.${e.stateObj.state}`);let i=(0,a.getValue)(e),s=void 0!==e.attribute?e.unit:e.unit||e.stateObj.attributes.unit_of_measurement;if(e.format){if(e.format.startsWith("precision")){const n=parseInt(e.format.slice(-1),10);i=(0,r.formatNumber)(i,t.locale,{minimumFractionDigits:n,maximumFractionDigits:n})}else isNaN(parseFloat(i))||!isFinite(i)||("brightness"===e.format?(i=Math.round(i/255*100),s="%"):e.format.startsWith("duration")?(i=(0,n.secondsToDuration)("duration-m"===e.format?i/1e3:i),s=void 0):"kilo"===e.format?i=(0,r.formatNumber)(i/1e3,t.locale,{maximumFractionDigits:2}):"invert"===e.format?i=(0,r.formatNumber)(i-2*i,t.locale):"position"===e.format&&(i=(0,r.formatNumber)(100-i,t.locale)));return`${i}${s?` ${s}`:""}`}if(e.attribute)return`${isNaN(i)?i:(0,r.formatNumber)(i,t.locale)}${s?` ${s}`:""}`;const l=Object.assign(Object.assign({},e.stateObj),{attributes:Object.assign(Object.assign({},e.stateObj.attributes),{unit_of_measurement:s})});return(0,o.computeStateDisplay)(t.localize,l,t.locale)},e.entityStyles=t=>(0,a.isObject)(t)?Object.keys(t).map((e=>`${e}: ${t[e]};`)).join(""):"",e.renderRows=(t,i,n)=>{const r=t.filter((t=>!(0,a.hideIfRow)(t,i)));return l.html`${r.map((t=>(0,e.renderEntitiesRow)(t.entities,i,n,"width-100")))}`},e.renderEntitiesRow=(t,i,n,r)=>void 0===t?null:l.html`
${t.map((t=>(0,e.renderEntity)(t,i,n)))}
`,e.renderEntity=(t,i,n)=>{if(null==t.stateObj||(0,a.hideIfEntity)(t,i))return null;const r=(0,e.clickHandler)(t.stateObj.entity_id,t.tap_action,i,n),o=(0,e.dblClickHandler)(t.stateObj.entity_id,t.double_tap_action,i,n),s=(0,e.holdHandler)(t.stateObj.entity_id,t.hold_action,i,n);let u,c,d;const m=()=>{u=!1,c=window.setTimeout((()=>{u=!0}),500)},h=e=>{e.preventDefault(),["touchend","touchcancel"].includes(e.type)&&void 0===c||(window.clearTimeout(c),c=void 0,u?s():void 0!==t.double_tap_action?"click"===e.type&&e.detail<2||!d?d=window.setTimeout((()=>{d=void 0,r()}),250):(window.clearTimeout(d),d=void 0,o()):r())};return l.html`
${void 0===t.show_name||t.show_name?l.html`${(0,e.entityName)(t)}`:""}
${(0,e.renderIcon)(t.stateObj,t,i)}
@@ -23,7 +23,7 @@ class="main-state entity" style="${(0,e.entityStyles)(t.styles)}"> ${0===(null===(r=i.entities)||void 0===r?void 0:r.length)||i.icon?(0,e.renderIcon)(t.stateObj,i,n,"main-icon"):void 0!==t.show_state&&!1===t.show_state?"":(0,e.renderValue)(t,n)} -
`},e.renderTitle=(t,i,n,r)=>{var o,a;if(!0===i.hide_title)return null;const s=(0,e.clickHandler)(null===(o=null==t?void 0:t.stateObj)||void 0===o?void 0:o.entity_id,i.tap_action,n,r),u=(0,e.dblClickHandler)(null===(a=null==t?void 0:t.stateObj)||void 0===a?void 0:a.entity_id,i.double_tap_action,n,r),c=void 0!==i.tap_action||void 0!==i.double_tap_action;return l.html`
${(0,e.renderMainEntity)(t,i,n)} ${i.title}
`},e.renderInfoEntity=(t,i,n)=>{if(void 0===t||!t.stateObj||(0,a.hideIf)(t,i))return null;const r=(0,e.clickHandler)(t.stateObj.entity_id,t.tap_action,i,n);return l.html`
${(0,e.renderValue)(t,i)}
`},e.clickHandler=(t,e,i,n)=>()=>(0,s.handleClick)(n,i,{entity:t,tap_action:e},!1,!1),e.dblClickHandler=(t,e,i,n)=>()=>(0,s.handleClick)(n,i,{entity:t,double_tap_action:e},!1,!0),e.holdHandler=(t,e,i,n)=>()=>(0,s.handleClick)(n,i,{entity:t,hold_action:e},!0,!1)},607:function(t,e,i){var n=this&&this.__decorate||function(t,e,i,n){var r,o=arguments.length,a=o<3?e:null===n?n=Object.getOwnPropertyDescriptor(e,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,i,n);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,i,a):r(e,i))||a);return o>3&&a&&Object.defineProperty(e,i,a),a};Object.defineProperty(e,"__esModule",{value:!0});const r=i(897),o=i(595),a=i(461),s=i(882),l=i(299),u=i(147);console.info(`%c ROOM-CARD %c ${u.version}`,"color: cyan; background: black; font-weight: bold;","color: darkblue; background: white; font-weight: bold;"),window.customCards=window.customCards||[],window.customCards.push({type:"room-card",name:"Room card",preview:!1,description:"Show multiple entity states, attributes and icons in a single card in Home Assistant's Lovelace UI"});let c=class extends r.LitElement{constructor(){super(...arguments),this.info_entities=[],this.entities=[],this.rows=[],this._refCards=[]}setConfig(t){(0,a.checkConfig)(t),this.config=Object.assign(Object.assign({},t),{entityIds:(0,s.getEntityIds)(t)})}shouldUpdate(t){return(0,s.hasConfigOrEntitiesChanged)(this.config,t)}set hass(t){var e,i,n,r,o,a,l;this._hass=t,t&&this.config&&(null!=this.config.entity&&(this.stateObj=t.states[this.config.entity],this.entity=Object.assign(Object.assign({},this.config),{stateObj:this.stateObj})),this.info_entities=null!==(i=null===(e=this.config.info_entities)||void 0===e?void 0:e.map((e=>(0,s.mapStateObject)(e,t,this.config))))&&void 0!==i?i:[],this.entities=null!==(r=null===(n=this.config.entities)||void 0===n?void 0:n.map((e=>(0,s.mapStateObject)(e,t,this.config))))&&void 0!==r?r:[],this.rows=null!==(a=null===(o=this.config.rows)||void 0===o?void 0:o.map((e=>{var i;return{entities:null===(i=e.entities)||void 0===i?void 0:i.map((e=>(0,s.mapStateObject)(e,t,this.config)))}})))&&void 0!==a?a:[],this._refCards=null===(l=this.config.cards)||void 0===l?void 0:l.map((e=>(0,s.createCardElement)(e,t))),this.config.hass=t)}static get styles(){return l.style}render(){var t;if(!this._hass||!this.config)return r.html``;try{return r.html` +
`},e.renderTitle=(t,i,n,r)=>{var o,a;if(!0===i.hide_title)return null;const s=(0,e.clickHandler)(null===(o=null==t?void 0:t.stateObj)||void 0===o?void 0:o.entity_id,i.tap_action,n,r),u=(0,e.dblClickHandler)(null===(a=null==t?void 0:t.stateObj)||void 0===a?void 0:a.entity_id,i.double_tap_action,n,r),c=void 0!==i.tap_action||void 0!==i.double_tap_action;return l.html`
${(0,e.renderMainEntity)(t,i,n)} ${i.title}
`},e.renderInfoEntity=(t,i,n)=>{if(void 0===t||!t.stateObj||(0,a.hideIfEntity)(t,i))return null;const r=(0,e.clickHandler)(t.stateObj.entity_id,t.tap_action,i,n);return l.html`
${(0,e.renderValue)(t,i)}
`},e.clickHandler=(t,e,i,n)=>()=>(0,s.handleClick)(n,i,{entity:t,tap_action:e},!1,!1),e.dblClickHandler=(t,e,i,n)=>()=>(0,s.handleClick)(n,i,{entity:t,double_tap_action:e},!1,!0),e.holdHandler=(t,e,i,n)=>()=>(0,s.handleClick)(n,i,{entity:t,hold_action:e},!0,!1)},607:function(t,e,i){var n=this&&this.__decorate||function(t,e,i,n){var r,o=arguments.length,a=o<3?e:null===n?n=Object.getOwnPropertyDescriptor(e,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,i,n);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(a=(o<3?r(a):o>3?r(e,i,a):r(e,i))||a);return o>3&&a&&Object.defineProperty(e,i,a),a};Object.defineProperty(e,"__esModule",{value:!0});const r=i(897),o=i(595),a=i(461),s=i(882),l=i(299),u=i(147);console.info(`%c ROOM-CARD %c ${u.version}`,"color: cyan; background: black; font-weight: bold;","color: darkblue; background: white; font-weight: bold;"),window.customCards=window.customCards||[],window.customCards.push({type:"room-card",name:"Room card",preview:!1,description:"Show multiple entity states, attributes and icons in a single card in Home Assistant's Lovelace UI"});let c=class extends r.LitElement{constructor(){super(...arguments),this.info_entities=[],this.entities=[],this.rows=[],this._refCards=[]}setConfig(t){(0,a.checkConfig)(t),this.config=Object.assign(Object.assign({},t),{entityIds:(0,s.getEntityIds)(t)})}shouldUpdate(t){return(0,s.hasConfigOrEntitiesChanged)(this.config,t)}set hass(t){var e,i,n,r,o,a,l;this._hass=t,t&&this.config&&(null!=this.config.entity&&(this.stateObj=t.states[this.config.entity],this.entity=Object.assign(Object.assign({},this.config),{stateObj:this.stateObj})),this.info_entities=null!==(i=null===(e=this.config.info_entities)||void 0===e?void 0:e.map((e=>(0,s.mapStateObject)(e,t,this.config))))&&void 0!==i?i:[],this.entities=null!==(r=null===(n=this.config.entities)||void 0===n?void 0:n.map((e=>(0,s.mapStateObject)(e,t,this.config))))&&void 0!==r?r:[],this.rows=null!==(a=null===(o=this.config.rows)||void 0===o?void 0:o.map((e=>{var i;return{entities:null===(i=e.entities)||void 0===i?void 0:i.map((e=>(0,s.mapStateObject)(e,t,this.config))),hide_if:e.hide_if}})))&&void 0!==a?a:[],this._refCards=null===(l=this.config.cards)||void 0===l?void 0:l.map((e=>(0,s.createCardElement)(e,t))),this.config.hass=t)}static get styles(){return l.style}render(){var t;if(!this._hass||!this.config)return r.html``;try{return r.html`
${(0,a.renderTitle)(this.entity,this.config,this._hass,this)} @@ -31,7 +31,7 @@ ${this.info_entities.map((t=>(0,a.renderInfoEntity)(t,this._hass,this)))}
- ${void 0!==this.rows&&this.rows.length>0?this.rows.map((t=>(0,a.renderEntitiesRow)(t.entities,this._hass,this,"width-100"))):(0,a.renderEntitiesRow)(this.entities,this._hass,this)} + ${void 0!==this.rows&&this.rows.length>0?(0,a.renderRows)(this.rows,this._hass,this):(0,a.renderEntitiesRow)(this.entities,this._hass,this)} ${this._refCards}
`}catch(t){return r.html`${t.toString()}`}}};n([(0,o.property)()],c.prototype,"_hass",void 0),n([(0,o.property)()],c.prototype,"config",void 0),c=n([(0,o.customElement)("room-card")],c),e.default=c},578:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.computeStateDisplay=e.computeStateDomain=void 0;const n=i(623),r=i(247),o=i(347),a=i(319),s=i(759);e.computeStateDomain=t=>t.entity_id.substr(0,t.entity_id.indexOf(".")),e.computeStateDisplay=(t,i,l,u)=>{const c=void 0!==u?u:i.state;if(c===n.UNKNOWN||c===n.UNAVAILABLE)return t(`state.default.${c}`);if((0,s.isNumericState)(i)){if("monetary"===i.attributes.device_class)try{return(0,s.formatNumber)(c,l,{style:"currency",currency:i.attributes.unit_of_measurement})}catch(t){}return`${(0,s.formatNumber)(c,l)}${i.attributes.unit_of_measurement?" "+i.attributes.unit_of_measurement:""}`}const d=(0,e.computeStateDomain)(i);if("input_datetime"===d){if(void 0===u){let t;return i.attributes.has_date&&i.attributes.has_time?(t=new Date(i.attributes.year,i.attributes.month-1,i.attributes.day,i.attributes.hour,i.attributes.minute),(0,o.formatDateTime)(t,l)):i.attributes.has_date?(t=new Date(i.attributes.year,i.attributes.month-1,i.attributes.day),(0,r.formatDate)(t,l)):i.attributes.has_time?(t=new Date,t.setHours(i.attributes.hour,i.attributes.minute),(0,a.formatTime)(t,l)):i.state}try{const t=u.split(" ");if(2===t.length)return(0,o.formatDateTime)(new Date(t.join("T")),l);if(1===t.length){if(u.includes("-"))return(0,r.formatDate)(new Date(`${u}T00:00`),l);if(u.includes(":")){const t=new Date;return(0,a.formatTime)(new Date(`${t.toISOString().split("T")[0]}T${u}`),l)}}return u}catch(t){return u}}return"humidifier"===d&&"on"===c&&i.attributes.humidity?`${i.attributes.humidity} %`:"counter"===d||"number"===d||"input_number"===d?(0,s.formatNumber)(c,l):"button"===d||"sensor"===d&&"timestamp"===i.attributes.device_class?(0,o.formatDateTime)(new Date(c),l):i.attributes.device_class&&t(`component.${d}.state.${i.attributes.device_class}.${c}`)||t(`component.${d}.state._.${c}`)||c}},623:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.TimeFormat=e.NumberFormat=e.SECONDARY_INFO_VALUES=e.TIMESTAMP_FORMATS=e.LAST_UPDATED=e.LAST_CHANGED=e.UNAVAILABLE_STATES=e.UNKNOWN=e.UNAVAILABLE=void 0,e.UNAVAILABLE="unavailable",e.UNKNOWN="unknown",e.UNAVAILABLE_STATES=[e.UNAVAILABLE,e.UNKNOWN],e.LAST_CHANGED="last-changed",e.LAST_UPDATED="last-updated",e.TIMESTAMP_FORMATS=["relative","total","date","time","datetime"],e.SECONDARY_INFO_VALUES=["entity-id","last-changed","last-updated","last-triggered","position","tilt-position","brightness"],e.NumberFormat={language:"language",system:"system",comma_decimal:"comma_decimal",decimal_comma:"decimal_comma",space_comma:"space_comma",none:"none"},e.TimeFormat={language:"language",system:"system",am_pm:"12",twenty_four:"24"}},247:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.formatDate=void 0,e.formatDate=(t,e)=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"long",day:"numeric"}).format(t)},347:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.formatDateTime=void 0;const n=i(269);e.formatDateTime=(t,e)=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"long",day:"numeric",hour:(0,n.useAmPm)(e)?"numeric":"2-digit",minute:"2-digit",hour12:(0,n.useAmPm)(e)}).format(t)},759:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.formatNumber=e.numberFormatToLocale=e.isNumericState=e.round=void 0;const n=i(623);e.round=(t,e=2)=>Math.round(t*Math.pow(10,e))/Math.pow(10,e),e.isNumericState=t=>!!t.attributes.unit_of_measurement||!!t.attributes.state_class,e.numberFormatToLocale=t=>{switch(t.number_format){case n.NumberFormat.comma_decimal:return["en-US","en"];case n.NumberFormat.decimal_comma:return["de","es","it"];case n.NumberFormat.space_comma:return["fr","sv","cs"];case n.NumberFormat.system:return;default:return t.language}},e.formatNumber=(t,i,o)=>{const a=i?(0,e.numberFormatToLocale)(i):void 0;if(Number.isNaN=Number.isNaN||function t(e){return"number"==typeof e&&t(e)},(null==i?void 0:i.number_format)!==n.NumberFormat.none&&!Number.isNaN(Number(t))&&Intl)try{return new Intl.NumberFormat(a,r(t,o)).format(Number(t))}catch(e){return console.error(e),new Intl.NumberFormat(void 0,r(t,o)).format(Number(t))}return"string"==typeof t?t:`${(0,e.round)(t,null==o?void 0:o.maximumFractionDigits).toString()}${"currency"===(null==o?void 0:o.style)?` ${o.currency}`:""}`};const r=(t,e)=>Object.assign({maximumFractionDigits:2},e)},319:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.formatTime=void 0;const n=i(269);e.formatTime=(t,e)=>new Intl.DateTimeFormat(e.language,{hour:"numeric",minute:"2-digit",hour12:(0,n.useAmPm)(e)}).format(t)},230:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.secondsToDuration=void 0;const i=t=>t<10?`0${t}`:t;e.secondsToDuration=function(t){const e=Math.floor(t/3600),n=Math.floor(t%3600/60),r=Math.floor(t%3600%60);return e>0?`${e}:${i(n)}:${i(r)}`:n>0?`${n}:${i(r)}`:r>0?""+r:null}},269:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.useAmPm=void 0;const n=i(623);e.useAmPm=t=>{if(t.time_format===n.TimeFormat.language||t.time_format===n.TimeFormat.system){const e=t.time_format===n.TimeFormat.language?t.language:void 0,i=(new Date).toLocaleString(e);return i.includes("AM")||i.includes("PM")}return t.time_format===n.TimeFormat.am_pm}},299:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.style=void 0;const n=i(897);e.style=n.css` @@ -112,4 +112,4 @@ .clickable { cursor: pointer; } -`},704:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.mapTemplate=e.templateStyling=void 0;const n=i(882);e.templateStyling=(t,e,i)=>{var r;const o=e.icon;return void 0!==(null===(r=null==o?void 0:o.template)||void 0===r?void 0:r.styles)?(0,n.evalTemplate)(i,t,o.template.styles):null},e.mapTemplate=(t,e)=>{if(void 0!==t&&t.template){const i=e.templates.filter((e=>e.name===t.template));if(i.length>0){const e=i[0];return Object.assign(Object.assign({stateObj:t.stateObj},t),e.template)}}return t}},882:function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.evalTemplate=e.createCardElement=e.mapStateObject=e.checkConditionalValue=e.hasConfigOrEntitiesChanged=e.getEntityIds=e.hideIf=e.getValue=e.hideUnavailable=e.isUnavailable=e.isObject=void 0;const n=i(197),r=i(897),o=i(623),a=i(704);e.isObject=t=>"object"==typeof t&&!Array.isArray(t)&&!!t,e.isUnavailable=t=>!t||o.UNAVAILABLE_STATES.includes(t.state),e.hideUnavailable=t=>t.hide_unavailable&&(0,e.isUnavailable)(t.stateObj),e.getValue=t=>{if(t.attribute&&void 0===t.stateObj.attributes[t.attribute])throw new Error(`Entity: '${t.entity}' has no attribute named '${t.attribute}'`);return t.attribute?t.stateObj.attributes[t.attribute]:t.stateObj.state},e.hideIf=(t,i)=>{var n;if((0,e.hideUnavailable)(t))return!0;if(void 0===t.hide_if)return!1;if(t.hide_if){let r=t.stateObj.state;const o=null===(n=t.hide_if.conditions)||void 0===n?void 0:n.filter((n=>{if(n.entity){const t=i.states[n.entity];r=n.attribute?t.attributes[n.attribute]:t.state}return n.attribute&&!n.entity&&(r=t.stateObj.attributes[n.attribute]),(0,e.checkConditionalValue)(n,r)}));return(null==o?void 0:o.length)>0}},e.getEntityIds=t=>{var e,i,n;return[t.entity].concat(null===(e=t.entities)||void 0===e?void 0:e.map((t=>t.entity))).concat(null===(i=t.info_entities)||void 0===i?void 0:i.map((t=>t.entity))).concat(null===(n=t.rows)||void 0===n?void 0:n.flatMap((t=>t.entities)).map((t=>null==t?void 0:t.entity))).filter((t=>t))},e.hasConfigOrEntitiesChanged=(t,e)=>{if(e.has("config"))return!0;const i=e.get("_hass");return!!i&&t.entityIds.some((e=>i.states[e]!==t.hass.states[e]))},e.checkConditionalValue=(t,e)=>"equals"==t.condition&&e==t.value||"not_equals"==t.condition&&e!=t.value||"above"==t.condition&&e>t.value||"below"==t.condition&&e{let n="string"==typeof t?{entity:t}:t;return n=(0,a.mapTemplate)(n,i),Object.assign(Object.assign({},n),{stateObj:e.states[n.entity]})},e.createCardElement=(t,e)=>{if(t.show_states&&!t.show_states.includes(e.states[t.entity].state))return;let i=t.type;i=i.startsWith("divider")?"hui-divider-row":i.startsWith("custom:")?i.substr("custom:".length):`hui-${i}-card`;const r=(0,n.createThing)(t);return r.hass=e,r.style.boxShadow="none",r.style.borderRadius="0",r},e.evalTemplate=(t,e,i)=>{try{return new Function("states","entity","user","hass","html",`'use strict'; ${i}`).call(this,null==t?void 0:t.states,e,null==t?void 0:t.user,t,r.html)}catch(t){const e=i.length<=100?i.trim():`${i.trim().substring(0,98)}...`;throw t.message=`${t.name}: ${t.message} in '${e}'`,t.name="RoomCardJSTemplateError",t}}},595:(t,e,i)=>{i.r(e),i.d(e,{customElement:()=>n,eventOptions:()=>l,property:()=>o,query:()=>u,queryAll:()=>c,queryAssignedElements:()=>p,queryAssignedNodes:()=>f,queryAsync:()=>d,state:()=>a});const n=t=>e=>"function"==typeof e?((t,e)=>(customElements.define(t,e),e))(t,e):((t,e)=>{const{kind:i,elements:n}=e;return{kind:i,elements:n,finisher(e){customElements.define(t,e)}}})(t,e),r=(t,e)=>"method"===e.kind&&e.descriptor&&!("value"in e.descriptor)?{...e,finisher(i){i.createProperty(e.key,t)}}:{kind:"field",key:Symbol(),placement:"own",descriptor:{},originalKey:e.key,initializer(){"function"==typeof e.initializer&&(this[e.key]=e.initializer.call(this))},finisher(i){i.createProperty(e.key,t)}};function o(t){return(e,i)=>void 0!==i?((t,e,i)=>{e.constructor.createProperty(i,t)})(t,e,i):r(t,e)}function a(t){return o({...t,state:!0})}const s=({finisher:t,descriptor:e})=>(i,n)=>{var r;if(void 0===n){const n=null!==(r=i.originalKey)&&void 0!==r?r:i.key,o=null!=e?{kind:"method",placement:"prototype",key:n,descriptor:e(i.key)}:{...i,key:n};return null!=t&&(o.finisher=function(e){t(e,n)}),o}{const r=i.constructor;void 0!==e&&Object.defineProperty(i,n,e(n)),null==t||t(r,n)}};function l(t){return s({finisher:(e,i)=>{Object.assign(e.prototype[i],t)}})}function u(t,e){return s({descriptor:i=>{const n={get(){var e,i;return null!==(i=null===(e=this.renderRoot)||void 0===e?void 0:e.querySelector(t))&&void 0!==i?i:null},enumerable:!0,configurable:!0};if(e){const e="symbol"==typeof i?Symbol():"__"+i;n.get=function(){var i,n;return void 0===this[e]&&(this[e]=null!==(n=null===(i=this.renderRoot)||void 0===i?void 0:i.querySelector(t))&&void 0!==n?n:null),this[e]}}return n}})}function c(t){return s({descriptor:e=>({get(){var e,i;return null!==(i=null===(e=this.renderRoot)||void 0===e?void 0:e.querySelectorAll(t))&&void 0!==i?i:[]},enumerable:!0,configurable:!0})})}function d(t){return s({descriptor:e=>({async get(){var e;return await this.updateComplete,null===(e=this.renderRoot)||void 0===e?void 0:e.querySelector(t)},enumerable:!0,configurable:!0})})}var m;const h=null!=(null===(m=window.HTMLSlotElement)||void 0===m?void 0:m.prototype.assignedElements)?(t,e)=>t.assignedElements(e):(t,e)=>t.assignedNodes(e).filter((t=>t.nodeType===Node.ELEMENT_NODE));function p(t){const{slot:e,selector:i}=null!=t?t:{};return s({descriptor:n=>({get(){var n;const r="slot"+(e?`[name=${e}]`:":not([name])"),o=null===(n=this.renderRoot)||void 0===n?void 0:n.querySelector(r),a=null!=o?h(o,t):[];return i?a.filter((t=>t.matches(i))):a},enumerable:!0,configurable:!0})})}function f(t,e,i){let n,r=t;return"object"==typeof t?(r=t.slot,n=t):n={flatten:e},i?p({slot:r,flatten:e,selector:i}):s({descriptor:t=>({get(){var t,e;const i="slot"+(r?`[name=${r}]`:":not([name])"),o=null===(t=this.renderRoot)||void 0===t?void 0:t.querySelector(i);return null!==(e=null==o?void 0:o.assignedNodes(n))&&void 0!==e?e:[]},enumerable:!0,configurable:!0})})}},897:(t,e,i)=>{i.r(e),i.d(e,{CSSResult:()=>s,LitElement:()=>ct,ReactiveElement:()=>b,UpdatingElement:()=>ut,_$LE:()=>mt,_$LH:()=>ot,adoptStyles:()=>c,css:()=>u,defaultConverter:()=>y,getCompatibleStyle:()=>d,html:()=>L,noChange:()=>z,notEqual:()=>g,nothing:()=>q,render:()=>B,supportsAdoptingStyleSheets:()=>r,svg:()=>V,unsafeCSS:()=>l});const n=window,r=n.ShadowRoot&&(void 0===n.ShadyCSS||n.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,o=Symbol(),a=new WeakMap;class s{constructor(t,e,i){if(this._$cssResult$=!0,i!==o)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const e=this.t;if(r&&void 0===t){const i=void 0!==e&&1===e.length;i&&(t=a.get(e)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&a.set(e,t))}return t}toString(){return this.cssText}}const l=t=>new s("string"==typeof t?t:t+"",void 0,o),u=(t,...e)=>{const i=1===t.length?t[0]:e.reduce(((e,i,n)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[n+1]),t[0]);return new s(i,t,o)},c=(t,e)=>{r?t.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):e.forEach((e=>{const i=document.createElement("style"),r=n.litNonce;void 0!==r&&i.setAttribute("nonce",r),i.textContent=e.cssText,t.appendChild(i)}))},d=r?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return l(e)})(t):t;var m;const h=window,p=h.trustedTypes,f=p?p.emptyScript:"",v=h.reactiveElementPolyfillSupport,y={toAttribute(t,e){switch(e){case Boolean:t=t?f:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},g=(t,e)=>e!==t&&(e==e||t==t),_={attribute:!0,type:String,converter:y,reflect:!1,hasChanged:g};class b extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(t){var e;null!==(e=this.h)&&void 0!==e||(this.h=[]),this.h.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((e,i)=>{const n=this._$Ep(i,e);void 0!==n&&(this._$Ev.set(n,i),t.push(n))})),t}static createProperty(t,e=_){if(e.state&&(e.attribute=!1),this.finalize(),this.elementProperties.set(t,e),!e.noAccessor&&!this.prototype.hasOwnProperty(t)){const i="symbol"==typeof t?Symbol():"__"+t,n=this.getPropertyDescriptor(t,i,e);void 0!==n&&Object.defineProperty(this.prototype,t,n)}}static getPropertyDescriptor(t,e,i){return{get(){return this[e]},set(n){const r=this[t];this[e]=n,this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||_}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const t=this.properties,e=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const i of e)this.createProperty(i,t[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(d(t))}else void 0!==t&&e.push(d(t));return e}static _$Ep(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}u(){var t;this._$E_=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(t=this.constructor.h)||void 0===t||t.forEach((t=>t(this)))}addController(t){var e,i;(null!==(e=this._$ES)&&void 0!==e?e:this._$ES=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(i=t.hostConnected)||void 0===i||i.call(t))}removeController(t){var e;null===(e=this._$ES)||void 0===e||e.splice(this._$ES.indexOf(t)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((t,e)=>{this.hasOwnProperty(e)&&(this._$Ei.set(e,this[e]),delete this[e])}))}createRenderRoot(){var t;const e=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return c(e,this.constructor.elementStyles),e}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostConnected)||void 0===e?void 0:e.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostDisconnected)||void 0===e?void 0:e.call(t)}))}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$EO(t,e,i=_){var n;const r=this.constructor._$Ep(t,i);if(void 0!==r&&!0===i.reflect){const o=(void 0!==(null===(n=i.converter)||void 0===n?void 0:n.toAttribute)?i.converter:y).toAttribute(e,i.type);this._$El=t,null==o?this.removeAttribute(r):this.setAttribute(r,o),this._$El=null}}_$AK(t,e){var i;const n=this.constructor,r=n._$Ev.get(t);if(void 0!==r&&this._$El!==r){const t=n.getPropertyOptions(r),o="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==(null===(i=t.converter)||void 0===i?void 0:i.fromAttribute)?t.converter:y;this._$El=r,this[r]=o.fromAttribute(e,t.type),this._$El=null}}requestUpdate(t,e,i){let n=!0;void 0!==t&&(((i=i||this.constructor.getPropertyOptions(t)).hasChanged||g)(this[t],e)?(this._$AL.has(t)||this._$AL.set(t,e),!0===i.reflect&&this._$El!==t&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(t,i))):n=!1),!this.isUpdatePending&&n&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((t,e)=>this[e]=t)),this._$Ei=void 0);let e=!1;const i=this._$AL;try{e=this.shouldUpdate(i),e?(this.willUpdate(i),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostUpdate)||void 0===e?void 0:e.call(t)})),this.update(i)):this._$Ek()}catch(t){throw e=!1,this._$Ek(),t}e&&this._$AE(i)}willUpdate(t){}_$AE(t){var e;null===(e=this._$ES)||void 0===e||e.forEach((t=>{var e;return null===(e=t.hostUpdated)||void 0===e?void 0:e.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(t){return!0}update(t){void 0!==this._$EC&&(this._$EC.forEach(((t,e)=>this._$EO(e,this[e],t))),this._$EC=void 0),this._$Ek()}updated(t){}firstUpdated(t){}}var w;b.finalized=!0,b.elementProperties=new Map,b.elementStyles=[],b.shadowRootOptions={mode:"open"},null==v||v({ReactiveElement:b}),(null!==(m=h.reactiveElementVersions)&&void 0!==m?m:h.reactiveElementVersions=[]).push("1.4.1");const $=window,A=$.trustedTypes,S=A?A.createPolicy("lit-html",{createHTML:t=>t}):void 0,E=`lit$${(Math.random()+"").slice(9)}$`,O="?"+E,T=`<${O}>`,k=document,N=(t="")=>k.createComment(t),D=t=>null===t||"object"!=typeof t&&"function"!=typeof t,C=Array.isArray,j=t=>C(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]),x=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,I=/-->/g,M=/>/g,P=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),F=/'/g,U=/"/g,R=/^(?:script|style|textarea|title)$/i,H=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),L=H(1),V=H(2),z=Symbol.for("lit-noChange"),q=Symbol.for("lit-nothing"),W=new WeakMap,B=(t,e,i)=>{var n,r;const o=null!==(n=null==i?void 0:i.renderBefore)&&void 0!==n?n:e;let a=o._$litPart$;if(void 0===a){const t=null!==(r=null==i?void 0:i.renderBefore)&&void 0!==r?r:null;o._$litPart$=a=new Q(e.insertBefore(N(),t),t,void 0,null!=i?i:{})}return a._$AI(t),a},K=k.createTreeWalker(k,129,null,!1),Y=(t,e)=>{const i=t.length-1,n=[];let r,o=2===e?"":"",a=x;for(let e=0;e"===l[0]?(a=null!=r?r:x,u=-1):void 0===l[1]?u=-2:(u=a.lastIndex-l[2].length,s=l[1],a=void 0===l[3]?P:'"'===l[3]?U:F):a===U||a===F?a=P:a===I||a===M?a=x:(a=P,r=void 0);const d=a===P&&t[e+1].startsWith("/>")?" ":"";o+=a===x?i+T:u>=0?(n.push(s),i.slice(0,u)+"$lit$"+i.slice(u)+E+d):i+E+(-2===u?(n.push(void 0),e):d)}const s=o+(t[i]||"")+(2===e?"":"");if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==S?S.createHTML(s):s,n]};class G{constructor({strings:t,_$litType$:e},i){let n;this.parts=[];let r=0,o=0;const a=t.length-1,s=this.parts,[l,u]=Y(t,e);if(this.el=G.createElement(l,i),K.currentNode=this.el.content,2===e){const t=this.el.content,e=t.firstChild;e.remove(),t.append(...e.childNodes)}for(;null!==(n=K.nextNode())&&s.length0){n.textContent=A?A.emptyScript:"";for(let i=0;i2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=q}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,e=this,i,n){const r=this.strings;let o=!1;if(void 0===r)t=J(this,t,e,0),o=!D(t)||t!==this._$AH&&t!==z,o&&(this._$AH=t);else{const n=t;let a,s;for(t=r[0],a=0;a{t._$AK(e,i)},_$AL:t=>t._$AL};(null!==(lt=globalThis.litElementVersions)&&void 0!==lt?lt:globalThis.litElementVersions=[]).push("3.2.2")},147:t=>{t.exports=JSON.parse('{"name":"room-card","version":"1.06.01","description":"Show entities in Home Assistant\'s Lovelace UI","keywords":["home-assistant","homeassistant","lovelace","custom-cards","multiple","entity","row"],"module":"room-card.js","license":"MIT","dependencies":{"babel-jest":"^29.0.3","custom-card-helpers":"^1.8.0","jest-environment-jsdom":"^29.0.3","jest-ts-auto-mock":"^2.1.0","lit":"^2.0.2","ts-auto-mock":"^3.6.2","ttypescript":"^1.5.13","yarn":"^1.22.18"},"devDependencies":{"@babel/core":"^7.19.1","@babel/plugin-transform-runtime":"^7.19.1","@babel/preset-env":"^7.19.1","@types/jest":"^29.0.3","@typescript-eslint/eslint-plugin":"^5.38.0","@typescript-eslint/parser":"^5.38.0","babel-loader":"^8.2.3","compression-webpack-plugin":"^10.0.0","eslint":"^8.24.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","jest":"^29.0.3","prettier":"^2.5.1","ts-jest":"^29.0.2","ts-loader":"^9.4.1","typescript":"^4.8.3","webpack":"^5.65.0","webpack-cli":"^4.9.1"},"scripts":{"lint":"eslint src/**/*.ts","dev":"webpack -c webpack.config.js","build":"yarn lint && webpack -c webpack.config.js","test":"jest","coverage":"jest --coverage","workflow":"jest --coverage --json --outputFile=/home/runner/work/room-card/room-card/jest.results.json"}}')}},e={};function i(n){var r=e[n];if(void 0!==r)return r.exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,i),o.exports}i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i(607)})(); \ No newline at end of file +`},704:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.mapTemplate=e.templateStyling=void 0;const n=i(882);e.templateStyling=(t,e,i)=>{var r;const o=e.icon;return void 0!==(null===(r=null==o?void 0:o.template)||void 0===r?void 0:r.styles)?(0,n.evalTemplate)(i,t,o.template.styles):null},e.mapTemplate=(t,e)=>{if(void 0!==t&&t.template){const i=e.templates.filter((e=>e.name===t.template));if(i.length>0){const e=i[0];return Object.assign(Object.assign({stateObj:t.stateObj},t),e.template)}}return t}},882:function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.evalTemplate=e.createCardElement=e.mapStateObject=e.checkConditionalValue=e.hasConfigOrEntitiesChanged=e.getEntityIds=e.hideIfEntity=e.hideIfRow=e.getValue=e.hideUnavailable=e.isUnavailable=e.isObject=void 0;const n=i(197),r=i(897),o=i(623),a=i(704);e.isObject=t=>"object"==typeof t&&!Array.isArray(t)&&!!t,e.isUnavailable=t=>!t||o.UNAVAILABLE_STATES.includes(t.state),e.hideUnavailable=t=>t.hide_unavailable&&(0,e.isUnavailable)(t.stateObj),e.getValue=t=>{if(t.attribute&&void 0===t.stateObj.attributes[t.attribute])throw new Error(`Entity: '${t.entity}' has no attribute named '${t.attribute}'`);return t.attribute?t.stateObj.attributes[t.attribute]:t.stateObj.state},e.hideIfRow=(t,i)=>{var n;if(void 0===t.hide_if)return!1;if(t.hide_if){const r=null===(n=t.hide_if.conditions)||void 0===n?void 0:n.filter((t=>{if(t.entity){const n=i.states[t.entity];return(0,e.checkConditionalValue)(t,t.attribute?n.attributes[t.attribute]:n.state)}}));return(null==r?void 0:r.length)>0}},e.hideIfEntity=(t,i)=>{var n;if((0,e.hideUnavailable)(t))return!0;if(void 0===t.hide_if)return!1;if(t.hide_if){let r=t.stateObj.state;const o=null===(n=t.hide_if.conditions)||void 0===n?void 0:n.filter((n=>{if(n.entity){const t=i.states[n.entity];r=n.attribute?t.attributes[n.attribute]:t.state}return n.attribute&&!n.entity&&(r=t.stateObj.attributes[n.attribute]),(0,e.checkConditionalValue)(n,r)}));return(null==o?void 0:o.length)>0}},e.getEntityIds=t=>{var e,i,n;return[t.entity].concat(null===(e=t.entities)||void 0===e?void 0:e.map((t=>t.entity))).concat(null===(i=t.info_entities)||void 0===i?void 0:i.map((t=>t.entity))).concat(null===(n=t.rows)||void 0===n?void 0:n.flatMap((t=>t.entities)).map((t=>null==t?void 0:t.entity))).filter((t=>t))},e.hasConfigOrEntitiesChanged=(t,e)=>{if(e.has("config"))return!0;const i=e.get("_hass");return!!i&&t.entityIds.some((e=>i.states[e]!==t.hass.states[e]))},e.checkConditionalValue=(t,e)=>{const i="boolean"==typeof t.value?String(t.value):t.value;return"equals"==t.condition&&e==i||"not_equals"==t.condition&&e!=i||"above"==t.condition&&e>i||"below"==t.condition&&e{let n="string"==typeof t?{entity:t}:t;return n=(0,a.mapTemplate)(n,i),Object.assign(Object.assign({},n),{stateObj:e.states[n.entity]})},e.createCardElement=(t,e)=>{if(t.show_states&&!t.show_states.includes(e.states[t.entity].state))return;let i=t.type;i=i.startsWith("divider")?"hui-divider-row":i.startsWith("custom:")?i.substr("custom:".length):`hui-${i}-card`;const r=(0,n.createThing)(t);return r.hass=e,r.style.boxShadow="none",r.style.borderRadius="0",r},e.evalTemplate=(t,e,i)=>{try{return new Function("states","entity","user","hass","html",`'use strict'; ${i}`).call(this,null==t?void 0:t.states,e,null==t?void 0:t.user,t,r.html)}catch(t){const e=i.length<=100?i.trim():`${i.trim().substring(0,98)}...`;throw t.message=`${t.name}: ${t.message} in '${e}'`,t.name="RoomCardJSTemplateError",t}}},595:(t,e,i)=>{i.r(e),i.d(e,{customElement:()=>n,eventOptions:()=>l,property:()=>o,query:()=>u,queryAll:()=>c,queryAssignedElements:()=>p,queryAssignedNodes:()=>f,queryAsync:()=>d,state:()=>a});const n=t=>e=>"function"==typeof e?((t,e)=>(customElements.define(t,e),e))(t,e):((t,e)=>{const{kind:i,elements:n}=e;return{kind:i,elements:n,finisher(e){customElements.define(t,e)}}})(t,e),r=(t,e)=>"method"===e.kind&&e.descriptor&&!("value"in e.descriptor)?{...e,finisher(i){i.createProperty(e.key,t)}}:{kind:"field",key:Symbol(),placement:"own",descriptor:{},originalKey:e.key,initializer(){"function"==typeof e.initializer&&(this[e.key]=e.initializer.call(this))},finisher(i){i.createProperty(e.key,t)}};function o(t){return(e,i)=>void 0!==i?((t,e,i)=>{e.constructor.createProperty(i,t)})(t,e,i):r(t,e)}function a(t){return o({...t,state:!0})}const s=({finisher:t,descriptor:e})=>(i,n)=>{var r;if(void 0===n){const n=null!==(r=i.originalKey)&&void 0!==r?r:i.key,o=null!=e?{kind:"method",placement:"prototype",key:n,descriptor:e(i.key)}:{...i,key:n};return null!=t&&(o.finisher=function(e){t(e,n)}),o}{const r=i.constructor;void 0!==e&&Object.defineProperty(i,n,e(n)),null==t||t(r,n)}};function l(t){return s({finisher:(e,i)=>{Object.assign(e.prototype[i],t)}})}function u(t,e){return s({descriptor:i=>{const n={get(){var e,i;return null!==(i=null===(e=this.renderRoot)||void 0===e?void 0:e.querySelector(t))&&void 0!==i?i:null},enumerable:!0,configurable:!0};if(e){const e="symbol"==typeof i?Symbol():"__"+i;n.get=function(){var i,n;return void 0===this[e]&&(this[e]=null!==(n=null===(i=this.renderRoot)||void 0===i?void 0:i.querySelector(t))&&void 0!==n?n:null),this[e]}}return n}})}function c(t){return s({descriptor:e=>({get(){var e,i;return null!==(i=null===(e=this.renderRoot)||void 0===e?void 0:e.querySelectorAll(t))&&void 0!==i?i:[]},enumerable:!0,configurable:!0})})}function d(t){return s({descriptor:e=>({async get(){var e;return await this.updateComplete,null===(e=this.renderRoot)||void 0===e?void 0:e.querySelector(t)},enumerable:!0,configurable:!0})})}var m;const h=null!=(null===(m=window.HTMLSlotElement)||void 0===m?void 0:m.prototype.assignedElements)?(t,e)=>t.assignedElements(e):(t,e)=>t.assignedNodes(e).filter((t=>t.nodeType===Node.ELEMENT_NODE));function p(t){const{slot:e,selector:i}=null!=t?t:{};return s({descriptor:n=>({get(){var n;const r="slot"+(e?`[name=${e}]`:":not([name])"),o=null===(n=this.renderRoot)||void 0===n?void 0:n.querySelector(r),a=null!=o?h(o,t):[];return i?a.filter((t=>t.matches(i))):a},enumerable:!0,configurable:!0})})}function f(t,e,i){let n,r=t;return"object"==typeof t?(r=t.slot,n=t):n={flatten:e},i?p({slot:r,flatten:e,selector:i}):s({descriptor:t=>({get(){var t,e;const i="slot"+(r?`[name=${r}]`:":not([name])"),o=null===(t=this.renderRoot)||void 0===t?void 0:t.querySelector(i);return null!==(e=null==o?void 0:o.assignedNodes(n))&&void 0!==e?e:[]},enumerable:!0,configurable:!0})})}},897:(t,e,i)=>{i.r(e),i.d(e,{CSSResult:()=>s,LitElement:()=>ct,ReactiveElement:()=>b,UpdatingElement:()=>ut,_$LE:()=>mt,_$LH:()=>ot,adoptStyles:()=>c,css:()=>u,defaultConverter:()=>y,getCompatibleStyle:()=>d,html:()=>L,noChange:()=>z,notEqual:()=>g,nothing:()=>q,render:()=>B,supportsAdoptingStyleSheets:()=>r,svg:()=>V,unsafeCSS:()=>l});const n=window,r=n.ShadowRoot&&(void 0===n.ShadyCSS||n.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,o=Symbol(),a=new WeakMap;class s{constructor(t,e,i){if(this._$cssResult$=!0,i!==o)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const e=this.t;if(r&&void 0===t){const i=void 0!==e&&1===e.length;i&&(t=a.get(e)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&a.set(e,t))}return t}toString(){return this.cssText}}const l=t=>new s("string"==typeof t?t:t+"",void 0,o),u=(t,...e)=>{const i=1===t.length?t[0]:e.reduce(((e,i,n)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[n+1]),t[0]);return new s(i,t,o)},c=(t,e)=>{r?t.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):e.forEach((e=>{const i=document.createElement("style"),r=n.litNonce;void 0!==r&&i.setAttribute("nonce",r),i.textContent=e.cssText,t.appendChild(i)}))},d=r?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return l(e)})(t):t;var m;const h=window,p=h.trustedTypes,f=p?p.emptyScript:"",v=h.reactiveElementPolyfillSupport,y={toAttribute(t,e){switch(e){case Boolean:t=t?f:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},g=(t,e)=>e!==t&&(e==e||t==t),_={attribute:!0,type:String,converter:y,reflect:!1,hasChanged:g};class b extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(t){var e;null!==(e=this.h)&&void 0!==e||(this.h=[]),this.h.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((e,i)=>{const n=this._$Ep(i,e);void 0!==n&&(this._$Ev.set(n,i),t.push(n))})),t}static createProperty(t,e=_){if(e.state&&(e.attribute=!1),this.finalize(),this.elementProperties.set(t,e),!e.noAccessor&&!this.prototype.hasOwnProperty(t)){const i="symbol"==typeof t?Symbol():"__"+t,n=this.getPropertyDescriptor(t,i,e);void 0!==n&&Object.defineProperty(this.prototype,t,n)}}static getPropertyDescriptor(t,e,i){return{get(){return this[e]},set(n){const r=this[t];this[e]=n,this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||_}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const t=this.properties,e=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const i of e)this.createProperty(i,t[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(d(t))}else void 0!==t&&e.push(d(t));return e}static _$Ep(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}u(){var t;this._$E_=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(t=this.constructor.h)||void 0===t||t.forEach((t=>t(this)))}addController(t){var e,i;(null!==(e=this._$ES)&&void 0!==e?e:this._$ES=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(i=t.hostConnected)||void 0===i||i.call(t))}removeController(t){var e;null===(e=this._$ES)||void 0===e||e.splice(this._$ES.indexOf(t)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((t,e)=>{this.hasOwnProperty(e)&&(this._$Ei.set(e,this[e]),delete this[e])}))}createRenderRoot(){var t;const e=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return c(e,this.constructor.elementStyles),e}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostConnected)||void 0===e?void 0:e.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostDisconnected)||void 0===e?void 0:e.call(t)}))}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$EO(t,e,i=_){var n;const r=this.constructor._$Ep(t,i);if(void 0!==r&&!0===i.reflect){const o=(void 0!==(null===(n=i.converter)||void 0===n?void 0:n.toAttribute)?i.converter:y).toAttribute(e,i.type);this._$El=t,null==o?this.removeAttribute(r):this.setAttribute(r,o),this._$El=null}}_$AK(t,e){var i;const n=this.constructor,r=n._$Ev.get(t);if(void 0!==r&&this._$El!==r){const t=n.getPropertyOptions(r),o="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==(null===(i=t.converter)||void 0===i?void 0:i.fromAttribute)?t.converter:y;this._$El=r,this[r]=o.fromAttribute(e,t.type),this._$El=null}}requestUpdate(t,e,i){let n=!0;void 0!==t&&(((i=i||this.constructor.getPropertyOptions(t)).hasChanged||g)(this[t],e)?(this._$AL.has(t)||this._$AL.set(t,e),!0===i.reflect&&this._$El!==t&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(t,i))):n=!1),!this.isUpdatePending&&n&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((t,e)=>this[e]=t)),this._$Ei=void 0);let e=!1;const i=this._$AL;try{e=this.shouldUpdate(i),e?(this.willUpdate(i),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostUpdate)||void 0===e?void 0:e.call(t)})),this.update(i)):this._$Ek()}catch(t){throw e=!1,this._$Ek(),t}e&&this._$AE(i)}willUpdate(t){}_$AE(t){var e;null===(e=this._$ES)||void 0===e||e.forEach((t=>{var e;return null===(e=t.hostUpdated)||void 0===e?void 0:e.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(t){return!0}update(t){void 0!==this._$EC&&(this._$EC.forEach(((t,e)=>this._$EO(e,this[e],t))),this._$EC=void 0),this._$Ek()}updated(t){}firstUpdated(t){}}var w;b.finalized=!0,b.elementProperties=new Map,b.elementStyles=[],b.shadowRootOptions={mode:"open"},null==v||v({ReactiveElement:b}),(null!==(m=h.reactiveElementVersions)&&void 0!==m?m:h.reactiveElementVersions=[]).push("1.4.1");const $=window,A=$.trustedTypes,S=A?A.createPolicy("lit-html",{createHTML:t=>t}):void 0,E=`lit$${(Math.random()+"").slice(9)}$`,O="?"+E,T=`<${O}>`,k=document,N=(t="")=>k.createComment(t),D=t=>null===t||"object"!=typeof t&&"function"!=typeof t,C=Array.isArray,j=t=>C(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]),x=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,I=/-->/g,M=/>/g,P=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),U=/'/g,F=/"/g,R=/^(?:script|style|textarea|title)$/i,H=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),L=H(1),V=H(2),z=Symbol.for("lit-noChange"),q=Symbol.for("lit-nothing"),W=new WeakMap,B=(t,e,i)=>{var n,r;const o=null!==(n=null==i?void 0:i.renderBefore)&&void 0!==n?n:e;let a=o._$litPart$;if(void 0===a){const t=null!==(r=null==i?void 0:i.renderBefore)&&void 0!==r?r:null;o._$litPart$=a=new Q(e.insertBefore(N(),t),t,void 0,null!=i?i:{})}return a._$AI(t),a},K=k.createTreeWalker(k,129,null,!1),Y=(t,e)=>{const i=t.length-1,n=[];let r,o=2===e?"":"",a=x;for(let e=0;e"===l[0]?(a=null!=r?r:x,u=-1):void 0===l[1]?u=-2:(u=a.lastIndex-l[2].length,s=l[1],a=void 0===l[3]?P:'"'===l[3]?F:U):a===F||a===U?a=P:a===I||a===M?a=x:(a=P,r=void 0);const d=a===P&&t[e+1].startsWith("/>")?" ":"";o+=a===x?i+T:u>=0?(n.push(s),i.slice(0,u)+"$lit$"+i.slice(u)+E+d):i+E+(-2===u?(n.push(void 0),e):d)}const s=o+(t[i]||"")+(2===e?"":"");if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==S?S.createHTML(s):s,n]};class G{constructor({strings:t,_$litType$:e},i){let n;this.parts=[];let r=0,o=0;const a=t.length-1,s=this.parts,[l,u]=Y(t,e);if(this.el=G.createElement(l,i),K.currentNode=this.el.content,2===e){const t=this.el.content,e=t.firstChild;e.remove(),t.append(...e.childNodes)}for(;null!==(n=K.nextNode())&&s.length0){n.textContent=A?A.emptyScript:"";for(let i=0;i2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=q}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,e=this,i,n){const r=this.strings;let o=!1;if(void 0===r)t=J(this,t,e,0),o=!D(t)||t!==this._$AH&&t!==z,o&&(this._$AH=t);else{const n=t;let a,s;for(t=r[0],a=0;a{t._$AK(e,i)},_$AL:t=>t._$AL};(null!==(lt=globalThis.litElementVersions)&&void 0!==lt?lt:globalThis.litElementVersions=[]).push("3.2.2")},147:t=>{t.exports=JSON.parse('{"name":"room-card","version":"1.06.10","description":"Show entities in Home Assistant\'s Lovelace UI","keywords":["home-assistant","homeassistant","lovelace","custom-cards","multiple","entity","row"],"module":"room-card.js","license":"MIT","dependencies":{"babel-jest":"^29.0.3","custom-card-helpers":"^1.8.0","jest-environment-jsdom":"^29.0.3","jest-ts-auto-mock":"^2.1.0","lit":"^2.0.2","ts-auto-mock":"^3.6.2","ttypescript":"^1.5.13","yarn":"^1.22.18"},"devDependencies":{"@babel/core":"^7.19.1","@babel/plugin-transform-runtime":"^7.19.1","@babel/preset-env":"^7.19.1","@types/jest":"^29.0.3","@typescript-eslint/eslint-plugin":"^5.38.0","@typescript-eslint/parser":"^5.38.0","babel-loader":"^8.2.3","compression-webpack-plugin":"^10.0.0","eslint":"^8.24.0","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0","jest":"^29.0.3","prettier":"^2.5.1","ts-jest":"^29.0.2","ts-loader":"^9.4.1","typescript":"^4.8.3","webpack":"^5.65.0","webpack-cli":"^4.9.1"},"scripts":{"lint":"eslint src/**/*.ts","dev":"webpack -c webpack.config.js","build":"yarn lint && webpack -c webpack.config.js","test":"jest","coverage":"jest --coverage","workflow":"jest --coverage --json --outputFile=/home/runner/work/room-card/room-card/jest.results.json"}}')}},e={};function i(n){var r=e[n];if(void 0!==r)return r.exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,i),o.exports}i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i(607)})(); \ No newline at end of file diff --git a/room-card.js.gz b/room-card.js.gz index b35d3684768cfe95885bbfa81ba5ddb2c22e123a..4e4d447270f657c601be11222468599ca4504444 100644 GIT binary patch delta 18316 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 HXzc(1@E2&C diff --git a/src/entity.ts b/src/entity.ts index ee4500d..1fae8a4 100644 --- a/src/entity.ts +++ b/src/entity.ts @@ -1,9 +1,9 @@ import { secondsToDuration } from './lib/seconds_to_duration'; import { formatNumber } from './lib/format_number'; import { computeStateDisplay, computeStateDomain } from './lib/compute_state_display'; -import { checkConditionalValue, evalTemplate, getValue, hideIf, isObject, isUnavailable } from './util'; +import { checkConditionalValue, evalTemplate, getValue, hideIfEntity, hideIfRow, isObject, isUnavailable } from './util'; import { ActionConfig, handleClick, HomeAssistant, NumberFormat } from 'custom-card-helpers'; -import { HomeAssistantEntity, EntityCondition, RoomCardEntity, RoomCardIcon, RoomCardConfig, EntityStyles } from './types/room-card-types'; +import { HomeAssistantEntity, EntityCondition, RoomCardEntity, RoomCardIcon, RoomCardConfig, EntityStyles, RoomCardRow } from './types/room-card-types'; import { html, HTMLTemplateResult, LitElement } from 'lit'; import { LAST_CHANGED, LAST_UPDATED, TIMESTAMP_FORMATS } from './lib/constants'; import { templateStyling } from './template'; @@ -83,8 +83,9 @@ export const entityStateDisplay = (hass: HomeAssistant, entity: RoomCardEntity) if (entity.format.startsWith('precision')) { const precision = parseInt(entity.format.slice(-1), 10); - const localizedValue = hass.locale.number_format === NumberFormat.comma_decimal ? value : value.toString().replaceAll(",",".") - value = formatNumber(localizedValue, hass.locale, { + //console.log(typeof value, value); + //const localizedValue = hass.locale.number_format === NumberFormat.comma_decimal ? value : value.replaceAll(",",".") + value = formatNumber(value, hass.locale, { minimumFractionDigits: precision, maximumFractionDigits: precision, }); @@ -123,6 +124,14 @@ export const entityStyles = (styles: EntityStyles) => .join('') : ''; +export const renderRows = (rows: RoomCardRow[], hass: HomeAssistant, element: LitElement) : HTMLTemplateResult => { + const filteredRows = rows.filter(row => { return !hideIfRow(row, hass); }); + + return html`${filteredRows.map((row) => { + return renderEntitiesRow(row.entities, hass, element, "width-100"); + })}`; +} + export const renderEntitiesRow = (entities: RoomCardEntity[], hass: HomeAssistant, element: LitElement, classes?: string) : HTMLTemplateResult => { if(entities === undefined) { return null; @@ -132,7 +141,7 @@ export const renderEntitiesRow = (entities: RoomCardEntity[], hass: HomeAssistan } export const renderEntity = (entity: RoomCardEntity, hass: HomeAssistant, element: LitElement) : HTMLTemplateResult => { - if (entity.stateObj == undefined || hideIf(entity, hass)) { + if (entity.stateObj == undefined || hideIfEntity(entity, hass)) { return null; } @@ -258,7 +267,7 @@ export const renderTitle = (entity: RoomCardEntity, config: RoomCardConfig, hass } export const renderInfoEntity = (entity: RoomCardEntity, hass: HomeAssistant, element: LitElement) : HTMLTemplateResult => { - if (entity === undefined || !entity.stateObj || hideIf(entity, hass)) { + if (entity === undefined || !entity.stateObj || hideIfEntity(entity, hass)) { return null; } diff --git a/src/index.ts b/src/index.ts index a873099..13ad1ef 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import { CSSResult, html, LitElement, PropertyValues, TemplateResult } from 'lit import { property, customElement } from 'lit/decorators.js'; import { HomeAssistant, LovelaceCard } from 'custom-card-helpers'; -import { checkConfig, entityStyles, renderEntitiesRow, renderInfoEntity, renderTitle } from './entity'; +import { checkConfig, entityStyles, renderEntitiesRow, renderInfoEntity, renderRows, renderTitle } from './entity'; import { getEntityIds, hasConfigOrEntitiesChanged, mapStateObject, createCardElement } from './util'; import { style } from './styles'; import { HomeAssistantEntity, RoomCardConfig, RoomCardEntity, RoomCardRow } from './types/room-card-types'; @@ -62,7 +62,7 @@ export default class RoomCard extends LitElement { this.rows = this.config.rows?.map((row) => { const rowEntities = row.entities?.map(entity => mapStateObject(entity, hass, this.config)); - return { entities: rowEntities }; + return { entities: rowEntities, hide_if: row.hide_if }; }) ?? []; this._refCards = this.config.cards?.map(card => createCardElement(card, hass)); @@ -87,11 +87,9 @@ export default class RoomCard extends LitElement { ${this.info_entities.map((entity) => renderInfoEntity(entity, this._hass, this))} - ${this.rows !== undefined && this.rows.length > 0 ? - this.rows.map((row) => { - return renderEntitiesRow(row.entities, this._hass, this, "width-100"); - }) - : renderEntitiesRow(this.entities, this._hass, this)} + ${this.rows !== undefined && this.rows.length > 0 ? + renderRows(this.rows, this._hass, this) : + renderEntitiesRow(this.entities, this._hass, this)} ${this._refCards} `; diff --git a/src/types/room-card-types.ts b/src/types/room-card-types.ts index d024e25..33a8313 100644 --- a/src/types/room-card-types.ts +++ b/src/types/room-card-types.ts @@ -47,6 +47,7 @@ export interface RoomCardConfig extends LovelaceCardConfig { export interface RoomCardRow { entities?: RoomCardEntity[]; + hide_if?: HideIfConfig; } export interface HomeAssistantEntity extends HassEntity { @@ -72,7 +73,7 @@ export interface HideIfConfig { export interface EntityCondition { condition?: string; - value?: string | number; + value?: string | number | boolean; attribute?: string; entity?: string; icon?: string; diff --git a/src/util.ts b/src/util.ts index 155ca7f..ee80fa8 100644 --- a/src/util.ts +++ b/src/util.ts @@ -2,7 +2,7 @@ import { HomeAssistant, LovelaceCardConfig, createThing } from 'custom-card-help import { html, PropertyValues } from 'lit'; import { HassEntity } from 'home-assistant-js-websocket'; import { UNAVAILABLE_STATES } from './lib/constants'; -import { HomeAssistantEntity, RoomCardConfig, RoomCardEntity, EntityCondition, HideIfConfig } from './types/room-card-types'; +import { HomeAssistantEntity, RoomCardConfig, RoomCardEntity, EntityCondition, HideIfConfig, RoomCardRow } from './types/room-card-types'; import { mapTemplate } from './template'; export const isObject = (obj: unknown) : boolean => typeof obj === 'object' && !Array.isArray(obj) && !!obj; @@ -20,7 +20,27 @@ export const getValue = (entity: RoomCardEntity) => { return entity.attribute ? entity.stateObj.attributes[entity.attribute] : entity.stateObj.state; } -export const hideIf = (entity: RoomCardEntity, hass: HomeAssistant) => { +export const hideIfRow = (row: RoomCardRow, hass: HomeAssistant) => { + if (row.hide_if === undefined) { + return false; + } + + if (row.hide_if) + { + const matchedConditions = (row.hide_if as HideIfConfig).conditions?.filter(item => { + + if(item.entity) { + const stateEntity = hass.states[item.entity]; + + return checkConditionalValue(item, item.attribute ? stateEntity.attributes[item.attribute] : stateEntity.state); + } + }); + + return matchedConditions?.length > 0; + } +}; + +export const hideIfEntity = (entity: RoomCardEntity, hass: HomeAssistant) => { if (hideUnavailable(entity)) { return true; } @@ -69,16 +89,17 @@ export const hasConfigOrEntitiesChanged = (node: RoomCardConfig, changedProps: P }; export const checkConditionalValue = (item: EntityCondition, checkValue: unknown) => { - if(item.condition == 'equals' && checkValue == item.value) { + const itemValue = typeof item.value === 'boolean' ? String(item.value) : item.value; + if(item.condition == 'equals' && checkValue == itemValue) { return true; } - if(item.condition == 'not_equals' && checkValue != item.value) { + if(item.condition == 'not_equals' && checkValue != itemValue) { return true; } - if(item.condition == 'above' && checkValue > item.value) { + if(item.condition == 'above' && checkValue > itemValue) { return true; } - if(item.condition == 'below' && checkValue < item.value) { + if(item.condition == 'below' && checkValue < itemValue) { return true; } } diff --git a/tests/entity/renderEntity.test.ts b/tests/entity/renderEntity.test.ts index 0ea4684..93718a9 100644 --- a/tests/entity/renderEntity.test.ts +++ b/tests/entity/renderEntity.test.ts @@ -250,7 +250,7 @@ describe('Testing entity file function renderEntity', () => { ${'brightness'} ${'77'} ${'30 %'} ${'duration'} ${'1000'} ${'16:40'} ${'duration-m'} ${'1000'} ${'1'} - ${'precision2'} ${'2,2324'} ${'2,23'} + ${'precision2'} ${2.2324} ${'2,23'} ${'kilo'} ${'1000'} ${'1'} ${'invert'} ${'1000'} ${'-1.000'} ${'position'} ${'10'} ${'90'} diff --git a/tests/entity/renderValue.test.ts b/tests/entity/renderValue.test.ts index 0f6b630..dca7860 100644 --- a/tests/entity/renderValue.test.ts +++ b/tests/entity/renderValue.test.ts @@ -83,13 +83,13 @@ describe('Testing entity file function renderValue', () => { }), test.each` format | state | expected - ${'brightness'} ${'77'} ${'30 %'} - ${'duration'} ${'1000'} ${'16:40'} - ${'duration-m'} ${'1000'} ${'1'} - ${'precision2'} ${'2,2324'} ${'2,23'} - ${'kilo'} ${'1000'} ${'1'} - ${'invert'} ${'1000'} ${'-1.000'} - ${'position'} ${'10'} ${'90'} + ${'brightness'} ${77} ${'30 %'} + ${'duration'} ${1000} ${'16:40'} + ${'duration-m'} ${1000} ${'1'} + ${'precision2'} ${2.2324} ${'2,23'} + ${'kilo'} ${1000} ${'1'} + ${'invert'} ${1000} ${'-1.000'} + ${'position'} ${10} ${'90'} ${'position'} ${'notanumber'} ${'notanumber'} `('Passing RoomCardEntity and HomeAssistant should return formatted value', ({format, state, expected}) => { diff --git a/tests/util/hideIf.test.ts b/tests/util/hideIfEntity.test.ts similarity index 87% rename from tests/util/hideIf.test.ts rename to tests/util/hideIfEntity.test.ts index 5487153..e7d6cad 100644 --- a/tests/util/hideIf.test.ts +++ b/tests/util/hideIfEntity.test.ts @@ -2,19 +2,19 @@ import { createMock } from 'ts-auto-mock'; import { HassEntity } from 'home-assistant-js-websocket'; import { UNAVAILABLE } from '../../src/lib/constants'; import { HideIfConfig } from '../../src/types/room-card-types'; -import { hideIf } from '../../src/util'; +import { hideIfEntity } from '../../src/util'; import { StubHassEntity, StubHomeAssistant, StubRoomCardEntity } from '../testdata'; -describe('Testing util file function hideIf', () => { +describe('Testing util file function hideIfEntity', () => { test('Passing RoomCardEntity with state unavailable and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = true; StubRoomCardEntity.stateObj.state = UNAVAILABLE; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if undefined and HomeAssistant should return false', () => { StubRoomCardEntity.hide_unavailable = false; StubRoomCardEntity.hide_if = undefined; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(false); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(false); }), test('Passing RoomCardEntity with hide_if and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -28,7 +28,7 @@ describe('Testing util file function hideIf', () => { attribute: 'hide_attribute' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if and HomeAssistant should return false', () => { StubRoomCardEntity.hide_unavailable = false; @@ -42,7 +42,7 @@ describe('Testing util file function hideIf', () => { attribute: 'hide_attribute' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(false); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(false); }), test('Passing RoomCardEntity with hide_if entity and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -62,7 +62,7 @@ describe('Testing util file function hideIf', () => { entity: 'sensor.test_entity' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if entity and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -91,7 +91,7 @@ describe('Testing util file function hideIf', () => { attribute: 'show_state' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if entity and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -116,7 +116,7 @@ describe('Testing util file function hideIf', () => { entity: 'sensor.test_entity' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if entity and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -141,7 +141,7 @@ describe('Testing util file function hideIf', () => { entity: 'sensor.test_entity' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if entity and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -161,7 +161,7 @@ describe('Testing util file function hideIf', () => { entity: 'sensor.test_entity' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if entity and HomeAssistant should return false', () => { StubRoomCardEntity.hide_unavailable = false; @@ -181,7 +181,7 @@ describe('Testing util file function hideIf', () => { entity: 'sensor.test_entity' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(false); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(false); }), test('Passing RoomCardEntity with hide_if entity attribute and HomeAssistant should return true', () => { StubRoomCardEntity.hide_unavailable = false; @@ -205,7 +205,7 @@ describe('Testing util file function hideIf', () => { attribute: 'show_state' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(true); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(true); }), test('Passing RoomCardEntity with hide_if entity attribute and HomeAssistant should return false', () => { StubRoomCardEntity.hide_unavailable = false; @@ -229,7 +229,7 @@ describe('Testing util file function hideIf', () => { attribute: 'show_state' }] } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(false); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(false); }), test('Passing RoomCardEntity with hide_if no conditions and HomeAssistant should return false', () => { StubRoomCardEntity.hide_unavailable = false; @@ -239,6 +239,6 @@ describe('Testing util file function hideIf', () => { StubRoomCardEntity.hide_if = { conditions: undefined } as HideIfConfig; - expect(hideIf(StubRoomCardEntity, StubHomeAssistant)).toBe(false); + expect(hideIfEntity(StubRoomCardEntity, StubHomeAssistant)).toBe(false); }) }) \ No newline at end of file diff --git a/tests/util/hideIfRow.test.ts b/tests/util/hideIfRow.test.ts new file mode 100644 index 0000000..706a1af --- /dev/null +++ b/tests/util/hideIfRow.test.ts @@ -0,0 +1,101 @@ +import { createMock } from 'ts-auto-mock'; +import { HassEntity } from 'home-assistant-js-websocket'; +import { UNAVAILABLE } from '../../src/lib/constants'; +import { HideIfConfig, RoomCardRow } from '../../src/types/room-card-types'; +import { hideIfRow } from '../../src/util'; +import { StubHassEntity, StubHomeAssistant, StubRoomCardEntity } from '../testdata'; + +describe('Testing util file function hideIfRow', () => { + const row: RoomCardRow = createMock(); + const hassEntity: HassEntity = createMock(); + + test('Passing RoomCardRow without hide_if and HomeAssistant should return false', () => { + expect(hideIfRow(row, StubHomeAssistant)).toBeFalsy(); + }), + test('Passing RoomCardRow with hide_if and HomeAssistant should return true', () => { + hassEntity.state = 'on' + StubHomeAssistant.states = { + 'sensor.test_entity': hassEntity + }; + + row.hide_if = { + conditions: [{ + condition: 'equals', + entity: 'sensor.test_entity', + value: 'on' + }] + } + + expect(hideIfRow(row, StubHomeAssistant)).toBeTruthy(); + }), + test('Passing RoomCardRow with hide_if without conditions and HomeAssistant should return false', () => { + + row.hide_if = { + conditions: undefined + } + + expect(hideIfRow(row, StubHomeAssistant)).toBeFalsy(); + }), + test('Passing RoomCardRow with hide_if with empty conditions and HomeAssistant should return false', () => { + + row.hide_if = { + conditions: [] + } + + expect(hideIfRow(row, StubHomeAssistant)).toBeFalsy(); + }), + test('Passing RoomCardRow with hide_if and HomeAssistant should return true', () => { + hassEntity.state = 'on' + hassEntity.attributes['test'] = 'money'; + StubHomeAssistant.states = { + 'sensor.test_entity': hassEntity + }; + + row.hide_if = { + conditions: [{ + condition: 'equals', + entity: 'sensor.test_entity', + attribute: 'test', + value: 'money' + }] + } + + expect(hideIfRow(row, StubHomeAssistant)).toBeTruthy(); + }), + test('Passing RoomCardRow with hide_if boolean value and HomeAssistant should return false', () => { + hassEntity.state = 'on' + hassEntity.attributes['test'] = true; + StubHomeAssistant.states = { + 'sensor.test_entity': hassEntity + }; + + row.hide_if = { + conditions: [{ + condition: 'equals', + entity: 'sensor.test_entity', + attribute: 'test', + value: true + }] + } + + expect(hideIfRow(row, StubHomeAssistant)).toBeFalsy(); + }), + test('Passing RoomCardRow with hide_if not matching and HomeAssistant should return false', () => { + hassEntity.state = 'on' + hassEntity.attributes['test'] = 'money'; + StubHomeAssistant.states = { + 'sensor.test_entity': hassEntity + }; + + row.hide_if = { + conditions: [{ + condition: 'equals', + entity: 'sensor.test_entity', + attribute: 'test', + value: 'paper' + }] + } + + expect(hideIfRow(row, StubHomeAssistant)).toBeFalsy(); + }) +}); \ No newline at end of file