custom-card-helpers
Version:
Set of helpful functions and types for Custom Card creators
3 lines (2 loc) • 18 kB
JavaScript
import{selectUnit as e}from"@formatjs/intl-utils";const t=(e,t)=>i(t).format(e),i=e=>new Intl.DateTimeFormat(e.language,{weekday:"long",month:"long",day:"numeric"}),r=(e,t)=>n(t).format(e),n=e=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"long",day:"numeric"}),a=(e,t)=>o(t).format(e),o=e=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"numeric",day:"numeric"}),c=(e,t)=>s(t).format(e),s=e=>new Intl.DateTimeFormat(e.language,{day:"numeric",month:"short"}),u=(e,t)=>m(t).format(e),m=e=>new Intl.DateTimeFormat(e.language,{month:"long",year:"numeric"}),l=(e,t)=>d(t).format(e),d=e=>new Intl.DateTimeFormat(e.language,{month:"long"}),g=(e,t)=>p(t).format(e),p=e=>new Intl.DateTimeFormat(e.language,{year:"numeric"});var f,h;!function(e){e.language="language",e.system="system",e.comma_decimal="comma_decimal",e.decimal_comma="decimal_comma",e.space_comma="space_comma",e.none="none"}(f||(f={})),function(e){e.language="language",e.system="system",e.am_pm="12",e.twenty_four="24"}(h||(h={}));const b=e=>{if(e.time_format===h.language||e.time_format===h.system){const t=e.time_format===h.language?e.language:void 0,i=(new Date).toLocaleString(t);return i.includes("AM")||i.includes("PM")}return e.time_format===h.am_pm},_=(e,t)=>y(t).format(e),y=e=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"long",day:"numeric",hour:b(e)?"numeric":"2-digit",minute:"2-digit",hour12:b(e)}),w=(e,t)=>v(t).format(e),v=e=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"long",day:"numeric",hour:b(e)?"numeric":"2-digit",minute:"2-digit",second:"2-digit",hour12:b(e)}),k=(e,t)=>x(t).format(e),x=e=>new Intl.DateTimeFormat(e.language,{year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"2-digit",hour12:b(e)}),D=(e,t)=>S(t).format(e),S=e=>new Intl.DateTimeFormat(e.language,{hour:"numeric",minute:"2-digit",hour12:b(e)}),F=(e,t)=>T(t).format(e),T=e=>new Intl.DateTimeFormat(e.language,{hour:b(e)?"numeric":"2-digit",minute:"2-digit",second:"2-digit",hour12:b(e)}),I=(e,t)=>$(t).format(e),$=e=>new Intl.DateTimeFormat(e.language,{hour:b(e)?"numeric":"2-digit",minute:"2-digit",second:"2-digit",hour12:b(e)}),N=(t,i,r,n=!0)=>{const a=e(t,r);return n?(e=>new Intl.RelativeTimeFormat(e.language,{numeric:"auto"}))(i).format(a.value,a.unit):Intl.NumberFormat(i.language,{style:"unit",unit:a.unit,unitDisplay:"long"}).format(Math.abs(a.value))};function C(e){let t=function(e){const t=e.split(":").map(Number);return 3600*t[0]+60*t[1]+t[2]}(e.attributes.remaining);if("active"===e.state){const i=(new Date).getTime(),r=new Date(e.last_changed).getTime();t=Math.max(t-(i-r)/1e3,0)}return t}function O(){return(O=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var i=arguments[t];for(var r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r])}return e}).apply(this,arguments)}const q=(e,t,i,r=!1)=>{e._themes||(e._themes={});let n=t.default_theme;("default"===i||i&&t.themes[i])&&(n=i);const a=O({},e._themes);if("default"!==n){const i=t.themes[n];Object.keys(i).forEach(t=>{const r="--"+t;e._themes[r]="",a[r]=i[t]})}if(e.updateStyles?e.updateStyles(a):window.ShadyCSS&&window.ShadyCSS.styleSubtree(e,a),!r)return;const o=document.querySelector("meta[name=theme-color]");if(o){o.hasAttribute("default-content")||o.setAttribute("default-content",o.getAttribute("content"));const e=a["--primary-color"]||o.getAttribute("default-content");o.setAttribute("content",e)}},A=e=>"function"==typeof e.getCardSize?e.getCardSize():4;function E(e){return e.substr(0,e.indexOf("."))}function M(e){return e.substr(e.indexOf(".")+1)}function j(e){var t;const i=(null==e||null==(t=e.locale)?void 0:t.language)||"en";return e.translationMetadata.translations[i]&&e.translationMetadata.translations[i].isRTL||!1}function R(e){return j(e)?"rtl":"ltr"}function z(e){return E(e.entity_id)}const L=e=>!!e.attributes.unit_of_measurement||!!e.attributes.state_class,P=e=>{switch(e.number_format){case f.comma_decimal:return["en-US","en"];case f.decimal_comma:return["de","es","it"];case f.space_comma:return["fr","sv","cs"];case f.system:return;default:return e.language}},U=(e,t=2)=>Math.round(e*10**t)/10**t,B=(e,t,i)=>{const r=t?P(t):void 0;if(Number.isNaN=Number.isNaN||function e(t){return"number"==typeof t&&e(t)},(null==t?void 0:t.number_format)!==f.none&&!Number.isNaN(Number(e))&&Intl)try{return new Intl.NumberFormat(r,H(e,i)).format(Number(e))}catch(t){return console.error(t),new Intl.NumberFormat(void 0,H(e,i)).format(Number(e))}return"string"==typeof e?e:`${U(e,null==i?void 0:i.maximumFractionDigits).toString()}${"currency"===(null==i?void 0:i.style)?` ${i.currency}`:""}`},H=(e,t)=>{const i=O({maximumFractionDigits:2},t);if("string"!=typeof e)return i;if(!t||!t.minimumFractionDigits&&!t.maximumFractionDigits){const t=e.indexOf(".")>-1?e.split(".")[1].length:0;i.minimumFractionDigits=t,i.maximumFractionDigits=t}return i},V=(e,t,i,n)=>{const a=void 0!==n?n:t.state;if("unknown"===a||"unavailable"===a)return e(`state.default.${a}`);if(L(t)){if("monetary"===t.attributes.device_class)try{return B(a,i,{style:"currency",currency:t.attributes.unit_of_measurement})}catch(e){}return`${B(a,i)}${t.attributes.unit_of_measurement?" "+t.attributes.unit_of_measurement:""}`}const o=z(t);if("input_datetime"===o){if(void 0===n){let e;return t.attributes.has_date&&t.attributes.has_time?(e=new Date(t.attributes.year,t.attributes.month-1,t.attributes.day,t.attributes.hour,t.attributes.minute),_(e,i)):t.attributes.has_date?(e=new Date(t.attributes.year,t.attributes.month-1,t.attributes.day),r(e,i)):t.attributes.has_time?(e=new Date,e.setHours(t.attributes.hour,t.attributes.minute),D(e,i)):t.state}try{const e=n.split(" ");if(2===e.length)return _(new Date(e.join("T")),i);if(1===e.length){if(n.includes("-"))return r(new Date(`${n}T00:00`),i);if(n.includes(":")){const e=new Date;return D(new Date(`${e.toISOString().split("T")[0]}T${n}`),i)}}return n}catch(e){return n}}return"humidifier"===o&&"on"===a&&t.attributes.humidity?`${t.attributes.humidity} %`:"counter"===o||"number"===o||"input_number"===o?B(a,i):t.attributes.device_class&&e(`component.${o}.state.${t.attributes.device_class}.${a}`)||e(`component.${o}.state._.${a}`)||a},W="mdi:bookmark",G="lovelace",J=["climate","cover","configurator","input_select","input_number","input_text","lock","media_player","scene","script","timer","vacuum","water_heater","weblink"],K=["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"],Q=["input_number","input_select","input_text","scene","weblink"],X=["camera","configurator","history_graph","scene"],Y=["closed","locked","off"],Z=new Set(["fan","input_boolean","light","switch","group","automation"]),ee="°C",te="°F",ie="group.default_view",re=(e,t,i,r)=>{r=r||{},i=null==i?{}:i;const n=new Event(t,{bubbles:void 0===r.bubbles||r.bubbles,cancelable:Boolean(r.cancelable),composed:void 0===r.composed||r.composed});return n.detail=i,e.dispatchEvent(n),n},ne=new Set(["call-service","divider","section","weblink","cast","select"]),ae={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"},oe=(e,t=!1)=>{const i=(e,t)=>r("hui-error-card",{type:"error",error:e,config:t}),r=(e,t)=>{const r=window.document.createElement(e);try{if(!r.setConfig)return;r.setConfig(t)}catch(r){return console.error(e,r),i(r.message,t)}return r};if(!e||"object"!=typeof e||!t&&!e.type)return i("No type defined",e);let n=e.type;if(n&&n.startsWith("custom:"))n=n.substr("custom:".length);else if(t)if(ne.has(n))n=`hui-${n}-row`;else{if(!e.entity)return i("Invalid config given.",e);const t=e.entity.split(".",1)[0];n=`hui-${ae[t]||"text"}-entity-row`}else n=`hui-${n}-card`;if(customElements.get(n))return r(n,e);const a=i(`Custom element doesn't exist: ${e.type}.`,e);a.style.display="None";const o=setTimeout(()=>{a.style.display=""},2e3);return customElements.whenDefined(e.type).then(()=>{clearTimeout(o),re(a,"ll-rebuild",{},a)}),a},ce=(e,t,i=!1)=>{let r;return function(...n){const a=this,o=i&&!r;clearTimeout(r),r=setTimeout(()=>{r=null,i||e.apply(a,n)},t),o&&e.apply(a,n)}},se={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 ue(e,t){if(e in se)return se[e];switch(e){case"alarm_control_panel":switch(t){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 t&&"off"===t?"mdi:radiobox-blank":"mdi:checkbox-marked-circle";case"cover":return"closed"===t?"mdi:window-closed":"mdi:window-open";case"lock":return t&&"unlocked"===t?"mdi:lock-open":"mdi:lock";case"media_player":return t&&"off"!==t&&"idle"!==t?"mdi:cast-connected":"mdi:cast";case"zwave":switch(t){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 "+e+" ("+t+")"),"mdi:bookmark"}}const me=(e,t)=>{const i=t.value||t,r=t.attribute?e.attributes[t.attribute]:e.state;switch(t.operator||"=="){case"==":return r===i;case"<=":return r<=i;case"<":return r<i;case">=":return r>=i;case">":return r>i;case"!=":return r!==i;case"regex":return r.match(i);default:return!1}},le=e=>{re(window,"haptic",e)},de=(e,t,i=!1)=>{i?history.replaceState(null,"",t):history.pushState(null,"",t),re(window,"location-changed",{replace:i})},ge=(e,t,i=!0)=>{const r=E(t),n="group"===r?"homeassistant":r;let a;switch(r){case"lock":a=i?"unlock":"lock";break;case"cover":a=i?"open_cover":"close_cover";break;default:a=i?"turn_on":"turn_off"}return e.callService(n,a,{entity_id:t})},pe=(e,t)=>{const i=Y.includes(e.states[t].state);return ge(e,t,i)},fe=(e,t,i,r)=>{if(r||(r={action:"more-info"}),!r.confirmation||r.confirmation.exemptions&&r.confirmation.exemptions.some(e=>e.user===t.user.id)||(le("warning"),confirm(r.confirmation.text||`Are you sure you want to ${r.action}?`)))switch(r.action){case"more-info":(i.entity||i.camera_image)&&re(e,"hass-more-info",{entityId:i.entity?i.entity:i.camera_image});break;case"navigate":r.navigation_path&&de(0,r.navigation_path);break;case"url":r.url_path&&window.open(r.url_path);break;case"toggle":i.entity&&(pe(t,i.entity),le("success"));break;case"call-service":{if(!r.service)return void le("failure");const[e,i]=r.service.split(".",2);t.callService(e,i,r.service_data,r.target),le("success");break}case"fire-dom-event":re(e,"ll-custom",r)}},he=(e,t,i,r)=>{let n;"double_tap"===r&&i.double_tap_action?n=i.double_tap_action:"hold"===r&&i.hold_action?n=i.hold_action:"tap"===r&&i.tap_action&&(n=i.tap_action),fe(e,t,i,n)},be=(e,t,i,r,n)=>{let a;if(n&&i.double_tap_action?a=i.double_tap_action:r&&i.hold_action?a=i.hold_action:!r&&i.tap_action&&(a=i.tap_action),a||(a={action:"more-info"}),!a.confirmation||a.confirmation.exemptions&&a.confirmation.exemptions.some(e=>e.user===t.user.id)||confirm(a.confirmation.text||`Are you sure you want to ${a.action}?`))switch(a.action){case"more-info":(a.entity||i.entity||i.camera_image)&&(re(e,"hass-more-info",{entityId:a.entity?a.entity:i.entity?i.entity:i.camera_image}),a.haptic&&le(a.haptic));break;case"navigate":a.navigation_path&&(de(0,a.navigation_path),a.haptic&&le(a.haptic));break;case"url":a.url_path&&window.open(a.url_path),a.haptic&&le(a.haptic);break;case"toggle":i.entity&&(pe(t,i.entity),a.haptic&&le(a.haptic));break;case"call-service":{if(!a.service)return;const[e,r]=a.service.split(".",2),n=O({},a.service_data);"entity"===n.entity_id&&(n.entity_id=i.entity),t.callService(e,r,n,a.target),a.haptic&&le(a.haptic);break}case"fire-dom-event":re(e,"ll-custom",a),a.haptic&&le(a.haptic)}};function _e(e){return void 0!==e&&"none"!==e.action}function ye(e,t,i){if(t.has("config")||i)return!0;if(e.config.entity){const i=t.get("hass");return!i||i.states[e.config.entity]!==e.hass.states[e.config.entity]}return!1}function we(e){return void 0!==e&&"none"!==e.action}const ve=(e,t,i=!0)=>{const r={};t.forEach(t=>{if(Y.includes(e.states[t].state)===i){const e=E(t),i=["cover","lock"].includes(e)?e:"homeassistant";i in r||(r[i]=[]),r[i].push(t)}}),Object.keys(r).forEach(t=>{let n;switch(t){case"lock":n=i?"unlock":"lock";break;case"cover":n=i?"open_cover":"close_cover";break;default:n=i?"turn_on":"turn_off"}e.callService(t,n,{entity_id:r[t]})})},ke=()=>{let e=document.querySelector("home-assistant");if(e=e&&e.shadowRoot,e=e&&e.querySelector("home-assistant-main"),e=e&&e.shadowRoot,e=e&&e.querySelector("app-drawer-layout partial-panel-resolver"),e=e&&e.shadowRoot||e,e=e&&e.querySelector("ha-panel-lovelace"),e=e&&e.shadowRoot,e=e&&e.querySelector("hui-root"),e){const t=e.lovelace;return t.current_view=e.___curView,t}return null},xe={humidity:"mdi:water-percent",illuminance:"mdi:brightness-5",temperature:"mdi:thermometer",pressure:"mdi:gauge",power:"mdi:flash",signal_strength:"mdi:wifi"},De={binary_sensor:(e,t)=>{const i="off"===e;switch(null==t?void 0:t.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":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":return i?"mdi:home-outline":"mdi:home";case"opening":return i?"mdi:square":"mdi:square-outline";case"plug":return i?"mdi:power-plug-off":"mdi:power-plug";case"presence":return i?"mdi:home-outline":"mdi:home";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:e=>{const t="closed"!==e.state;switch(e.attributes.device_class){case"garage":return t?"mdi:garage-open":"mdi:garage";case"door":return t?"mdi:door-open":"mdi:door-closed";case"shutter":return t?"mdi:window-shutter-open":"mdi:window-shutter";case"blind":return t?"mdi:blinds-open":"mdi:blinds";case"window":return t?"mdi:window-open":"mdi:window-closed";default:return ue("cover",e.state)}},sensor:e=>{const t=e.attributes.device_class;if(t&&t in xe)return xe[t];if("battery"===t){const t=Number(e.state);if(isNaN(t))return"mdi:battery-unknown";const i=10*Math.round(t/10);return i>=100?"mdi:battery":i<=0?"mdi:battery-alert":`hass:battery-${i}`}const i=e.attributes.unit_of_measurement;return"°C"===i||"°F"===i?"mdi:thermometer":ue("sensor")},input_datetime:e=>e.attributes.has_date?e.attributes.has_time?ue("input_datetime"):"mdi:calendar":"mdi:clock"},Se=e=>{if(!e)return"mdi:bookmark";if(e.attributes.icon)return e.attributes.icon;const t=E(e.entity_id);return t in De?De[t](e):ue(t,e.state)};export{W as DEFAULT_DOMAIN_ICON,G as DEFAULT_PANEL,ie as DEFAULT_VIEW_ENTITY_ID,Q as DOMAINS_HIDE_MORE_INFO,X as DOMAINS_MORE_INFO_NO_HISTORY,Z as DOMAINS_TOGGLE,J as DOMAINS_WITH_CARD,K as DOMAINS_WITH_MORE_INFO,f as NumberFormat,Y as STATES_OFF,h as TimeFormat,ee as UNIT_C,te as UNIT_F,q as applyThemesOnElement,A as computeCardSize,E as computeDomain,M as computeEntity,j as computeRTL,R as computeRTLDirection,V as computeStateDisplay,z as computeStateDomain,oe as createThing,ce as debounce,ue as domainIcon,me as evaluateFilter,re as fireEvent,se as fixedIcons,r as formatDate,l as formatDateMonth,u as formatDateMonthYear,a as formatDateNumeric,c as formatDateShort,_ as formatDateTime,k as formatDateTimeNumeric,w as formatDateTimeWithSeconds,t as formatDateWeekday,g as formatDateYear,B as formatNumber,D as formatTime,I as formatTimeWeekday,F as formatTimeWithSeconds,le as forwardHaptic,ke as getLovelace,he as handleAction,fe as handleActionConfig,be as handleClick,_e as hasAction,ye as hasConfigOrEntityChanged,we as hasDoubleClick,L as isNumericState,de as navigate,P as numberFormatToLocale,N as relativeTime,U as round,Se as stateIcon,C as timerTimeRemaining,pe as toggleEntity,ve as turnOnOffEntities,ge as turnOnOffEntity};
//# sourceMappingURL=index.modern.js.map