diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index 52bb5d9c1b52e9f0bd0db0f5cb484250fd91bdf8..211b1cecc8b13f67381a83b8c421335d8aa8643a 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -7,7 +7,7 @@ FINGERPRINTS = { "mdi.html": "e91f61a039ed0a9936e7ee5360da3870", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", "panels/ha-panel-automation.html": "6c3a3345b63f3a36d32f43cff3e10c53", - "panels/ha-panel-config.html": "59ca4cda820260616e9de5324edf6d05", + "panels/ha-panel-config.html": "3d7ef351e5154bbc909662a20ce812e2", "panels/ha-panel-dev-event.html": "d409e7ab537d9fe629126d122345279c", "panels/ha-panel-dev-info.html": "b0e55eb657fd75f21aba2426ac0cedc0", "panels/ha-panel-dev-mqtt.html": "94b222b013a98583842de3e72d5888c6", diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index 572f92fd1ecbc31d3d9c3d349f268b6b15158141..95b73203b0649bdd824d269204b422714e9aa778 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit 572f92fd1ecbc31d3d9c3d349f268b6b15158141 +Subproject commit 95b73203b0649bdd824d269204b422714e9aa778 diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html index edb382e5b1dcecc87185306fce45094783478d28..65b79bebba5bb75ab69ea01111bf5693049ab4a2 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html @@ -1 +1 @@ -<html><head></head><body><div hidden="" by-polymer-bundler=""><dom-module id="ha-config-section-core" assetpath="core/"><template><style include="iron-flex ha-style">.validate-container{@apply (--layout-vertical);@apply (--layout-center-center);height:140px;}.validate-result{color:var(--google-green-500);font-weight:500;margin-bottom:1em;}.config-invalid{margin:1em 0;}.config-invalid .text{color:var(--google-red-500);font-weight:500;}.config-invalid paper-button{float:right;}.validate-log{white-space:pre-wrap;}</style><ha-config-section is-wide="[[isWide]]"><span slot="header">Server Management</span> <span slot="introduction">Changing your configuration can be a tiresome process. We know. This section will try to make your life a little bit easier.</span><paper-card heading="Configuration Validation"><div class="card-content">Validate your configuration if you recently made some changes to your configuration and want to make sure that it is all valid.<template is="dom-if" if="[[!validateLog]]"><div class="validate-container"><template is="dom-if" if="[[!validating]]"><div class="validate-result" id="result">[[validateResult]]</div><paper-button raised="" on-tap="validateConfig">check config</paper-button></template><template is="dom-if" if="[[validating]]"><paper-spinner active=""></paper-spinner></template></div></template><template is="dom-if" if="[[validateLog]]"><div class="config-invalid"><span class="text">Configuration invalid.</span><paper-button raised="" on-tap="validateConfig">check config</paper-button></div><div id="configLog" class="validate-log">[[validateLog]]</div></template></div></paper-card><paper-card heading="Configuration Reloading"><div class="card-content">Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current configuration and load the new one.</div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="homeassistant" service="reload_core_config">Reload Core</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="group" service="reload" hidden$="[[!groupLoaded(hass)]]">Reload Groups</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="automation" service="reload" hidden$="[[!automationLoaded(hass)]]">Reload Automation</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="script" service="reload" hidden$="[[!scriptLoaded(hass)]]">Reload Scripts</ha-call-service-button></div></paper-card><paper-card heading="Server Management"><div class="card-content">Control your Home Assistant server… from Home Assistant.</div><div class="card-actions warning"><ha-call-service-button class="warning" hass="[[hass]]" domain="homeassistant" service="restart">Restart</ha-call-service-button><ha-call-service-button class="warning" hass="[[hass]]" domain="homeassistant" service="stop">Stop</ha-call-service-button></div></paper-card></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-core",properties:{hass:{type:Object},isWide:{type:Boolean,value:!1},validating:{type:Boolean,value:!1},validateResult:{type:String,value:""},validateLog:{type:String,value:""}},groupLoaded:function(i){return window.hassUtil.isComponentLoaded(i,"group")},automationLoaded:function(i){return window.hassUtil.isComponentLoaded(i,"automation")},scriptLoaded:function(i){return window.hassUtil.isComponentLoaded(i,"script")},validateConfig:function(){this.validating=!0,this.validateLog="",this.validateResult="";var i=this;this.hass.callApi("POST","config/core/check_config").then(function(t){i.validating=!1,(i.configValid="valid"===t.result)?i.validateResult="Valid!":i.validateLog=t.errors})}});</script><dom-module id="ha-entity-config"><template><style include="iron-flex ha-style">paper-card{display:block;}.device-picker{@apply (--layout-horizontal);padding-bottom:24px;}.form-placeholder{@apply (--layout-vertical);@apply (--layout-center-center);height:96px;}[hidden]:{display:none;};.card-actions{@apply (--layout-horizontal);@apply (--layout-justified);}</style><paper-card><div class="card-content"><div class="device-picker"><paper-dropdown-menu label="[[label]]" class="flex" disabled="[[!entities.length]]"><paper-listbox slot="dropdown-content" selected="{{selectedEntity}}"><template is="dom-repeat" items="[[entities]]" as="state"><paper-item>[[computeSelectCaption(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><div class="form-container"><template is="dom-if" if="[[computeShowPlaceholder(formState)]]"><div class="form-placeholder"><template is="dom-if" if="[[computeShowNoDevices(formState)]]">No entities found! :-(</template><template is="dom-if" if="[[computeShowSpinner(formState)]]"><paper-spinner active="" alt="[[formState]]"></paper-spinner>[[formState]]</template></div></template><div hidden$="[[!computeShowForm(formState)]]" id="form"></div></div></div><div class="card-actions"><paper-button on-tap="saveEntity" disabled="[[computeShowPlaceholder(formState)]]">SAVE</paper-button><template is="dom-if" if="[[allowDelete]]"><paper-button class="warning" on-tap="deleteEntity" disabled="[[computeShowPlaceholder(formState)]]">DELETE</paper-button></template></div></paper-card></template></dom-module><script>Polymer({is:"ha-entity-config",properties:{hass:{type:Object,observer:"hassChanged"},label:{type:String,value:"Device"},entities:{type:Array,observer:"entitiesChanged"},allowDelete:{type:Boolean,value:!1},selectedEntity:{type:Number,value:-1,observer:"entityChanged"},formState:{type:String,value:"no-devices"},config:{type:Object}},attached:function(){this.formEl=document.createElement(this.config.component),this.formEl.hass=this.hass,this.$.form.appendChild(this.formEl),this.entityChanged(this.selectedEntity)},computeSelectCaption:function(t){return this.config.computeSelectCaption?this.config.computeSelectCaption(t):window.hassUtil.computeStateName(t)},computeShowNoDevices:function(t){return"no-devices"===t},computeShowSpinner:function(t){return"loading"===t||"saving"===t},computeShowPlaceholder:function(t){return"editing"!==t},computeShowForm:function(t){return"editing"===t},hassChanged:function(t){this.formEl&&(this.formEl.hass=t)},entitiesChanged:function(t,e){if(0!==t.length)if(e){var i=e[this.selectedEntity].entity_id,n=t.findIndex(function(t){return t.entity_id===i});-1===n?this.selectedEntity=0:n!==this.selectedEntity&&(this.selectedEntity=n)}else this.selectedEntity=0;else this.formState="no-devices"},entityChanged:function(t){if(this.entities&&this.formEl){var e=this.entities[t];this.formState="loading";var i=this;this.formEl.loadEntity(e).then(function(){i.formState="editing"})}},saveEntity:function(){this.formState="saving";var t=this;this.formEl.saveEntity().then(function(){t.formState="editing"})}});</script><dom-module id="paper-radio-button" assetpath="../../bower_components/paper-radio-button/"><template strip-whitespace=""><style>:host{display:inline-block;line-height:0;white-space:nowrap;cursor:pointer;@apply --paper-font-common-base;--calculated-paper-radio-button-size:var(--paper-radio-button-size, 16px);--calculated-paper-radio-button-ink-size:var(--paper-radio-button-ink-size, -1px);}:host(:focus){outline:none;}#radioContainer{@apply --layout-inline;@apply --layout-center-center;position:relative;width:var(--calculated-paper-radio-button-size);height:var(--calculated-paper-radio-button-size);vertical-align:middle;@apply --paper-radio-button-radio-container;}#ink{position:absolute;top:50%;left:50%;right:auto;width:var(--calculated-paper-radio-button-ink-size);height:var(--calculated-paper-radio-button-ink-size);color:var(--paper-radio-button-unchecked-ink-color, var(--primary-text-color));opacity:0.6;pointer-events:none;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);}#ink[checked]{color:var(--paper-radio-button-checked-ink-color, var(--primary-color));}#offRadio, #onRadio{position:absolute;box-sizing:border-box;top:0;left:0;width:100%;height:100%;border-radius:50%;}#offRadio{border:2px solid var(--paper-radio-button-unchecked-color, var(--primary-text-color));background-color:var(--paper-radio-button-unchecked-background-color, transparent);transition:border-color 0.28s;}#onRadio{background-color:var(--paper-radio-button-checked-color, var(--primary-color));-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform ease 0.28s;transition:transform ease 0.28s;will-change:transform;}:host([checked]) #offRadio{border-color:var(--paper-radio-button-checked-color, var(--primary-color));}:host([checked]) #onRadio{-webkit-transform:scale(0.5);transform:scale(0.5);}#radioLabel{line-height:normal;position:relative;display:inline-block;vertical-align:middle;margin-left:var(--paper-radio-button-label-spacing, 10px);white-space:normal;color:var(--paper-radio-button-label-color, var(--primary-text-color));@apply --paper-radio-button-label;}:host([checked]) #radioLabel{@apply --paper-radio-button-label-checked;}:host-context([dir="rtl"]) #radioLabel{margin-left:0;margin-right:var(--paper-radio-button-label-spacing, 10px);}#radioLabel[hidden]{display:none;}:host([disabled]) #offRadio{border-color:var(--paper-radio-button-unchecked-color, var(--primary-text-color));opacity:0.5;}:host([disabled][checked]) #onRadio{background-color:var(--paper-radio-button-unchecked-color, var(--primary-text-color));opacity:0.5;}:host([disabled]) #radioLabel{opacity:0.65;}</style><div id="radioContainer"><div id="offRadio"></div><div id="onRadio"></div></div><div id="radioLabel"><slot></slot></div></template><script>Polymer({is:"paper-radio-button",behaviors:[Polymer.PaperCheckedElementBehavior],hostAttributes:{role:"radio","aria-checked":!1,tabindex:0},properties:{ariaActiveAttribute:{type:String,value:"aria-checked"}},ready:function(){this._rippleContainer=this.$.radioContainer},attached:function(){Polymer.RenderStatus.afterNextRender(this,function(){if("-1px"===this.getComputedStyleValue("--calculated-paper-radio-button-ink-size").trim()){var e=parseFloat(this.getComputedStyleValue("--calculated-paper-radio-button-size").trim()),t=Math.floor(3*e);t%2!=e%2&&t++,this.updateStyles({"--paper-radio-button-ink-size":t+"px"})}})}});</script></dom-module><dom-module id="paper-radio-group" assetpath="../../bower_components/paper-radio-group/"><template><style>:host{display:inline-block;}:host ::slotted(*){padding:var(--paper-radio-group-item-padding, 12px);}</style><slot></slot></template></dom-module><script>Polymer({is:"paper-radio-group",behaviors:[Polymer.IronMenubarBehavior],hostAttributes:{role:"radiogroup",tabindex:0},properties:{attrForSelected:{type:String,value:"name"},selectedAttribute:{type:String,value:"checked"},selectable:{type:String,value:"paper-radio-button"},allowEmptySelection:{type:Boolean,value:!1}},select:function(e){var t=this._valueToItem(e);if(!t||!t.hasAttribute("disabled")){if(this.selected){var i=this._valueToItem(this.selected);if(this.selected==e){if(!this.allowEmptySelection)return void(i&&(i.checked=!0));e=""}i&&(i.checked=!1)}Polymer.IronSelectableBehavior.select.apply(this,[e]),this.fire("paper-radio-group-changed")}},_activateFocusedItem:function(){this._itemActivate(this._valueForItem(this.focusedItem),this.focusedItem)},_onUpKey:function(e){this._focusPrevious(),e.preventDefault(),this._activateFocusedItem()},_onDownKey:function(e){this._focusNext(),e.preventDefault(),this._activateFocusedItem()},_onLeftKey:function(e){Polymer.IronMenubarBehaviorImpl._onLeftKey.apply(this,arguments),this._activateFocusedItem()},_onRightKey:function(e){Polymer.IronMenubarBehaviorImpl._onRightKey.apply(this,arguments),this._activateFocusedItem()}});</script><script>var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(t){"use strict";"function"==typeof define&&define.amd?define(t):"undefined"!=typeof module&&void 0!==module.exports?module.exports=t():window.Sortable=t()}(function(){"use strict";function t(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be HTMLElement, and not "+{}.toString.call(t);this.el=t,this.options=e=_({},e),t[V]=this;var n={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(t.nodeName)?"li":">*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0}};for(var o in n)!(o in e)&&(e[o]=n[o]);at(e);for(var i in this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&K,r(t,"mousedown",this._onTapStart),r(t,"touchstart",this._onTapStart),r(t,"pointerdown",this._onTapStart),this.nativeDraggable&&(r(t,"dragover",this),r(t,"dragenter",this)),it.push(this._onDragOver),e.store&&this.sort(e.store.get(this))}function e(t,e){"clone"!==t.lastPullMode&&(e=!0),C&&C.state!==e&&(l(C,"display",e?"none":""),e||C.state&&(t.options.group.revertClone?(E.insertBefore(C,x),t._animate(w,C)):E.insertBefore(C,w)),C.state=e)}function n(t,e,n){if(t){n=n||z;do{if(">*"===e&&t.parentNode===n||m(t,e))return t}while(t=o(t))}return null}function o(t){var e=t.host;return e&&e.nodeType?e:t.parentNode}function i(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move"),t.preventDefault()}function r(t,e,n){t.addEventListener(e,n,J)}function a(t,e,n){t.removeEventListener(e,n,J)}function s(t,e,n){if(t)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(H," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(H," ")}}function l(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return z.defaultView&&z.defaultView.getComputedStyle?n=z.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function c(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i<r;i++)n(o[i],i);return o}return[]}function d(t,e,n,o,i,r,a){t=t||e[V];var s=z.createEvent("Event"),l=t.options,c="on"+n.charAt(0).toUpperCase()+n.substr(1);s.initEvent(n,!0,!0),s.to=e,s.from=i||e,s.item=o||e,s.clone=C,s.oldIndex=r,s.newIndex=a,e.dispatchEvent(s),l[c]&&l[c].call(t,s)}function h(t,e,n,o,i,r,a,s){var l,c,d=t[V],h=d.options.onMove;return(l=z.createEvent("Event")).initEvent("move",!0,!0),l.to=e,l.from=t,l.dragged=n,l.draggedRect=o,l.related=i||e,l.relatedRect=r||e.getBoundingClientRect(),l.willInsertAfter=s,t.dispatchEvent(l),h&&(c=h.call(d,l,a)),c}function u(t){t.draggable=!1}function f(){tt=!1}function p(t,e){var n=t.lastElementChild.getBoundingClientRect();return e.clientY-(n.top+n.height)>5||e.clientX-(n.left+n.width)>5}function g(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function v(t,e){var n=0;if(!t||!t.parentNode)return-1;for(;t&&(t=t.previousElementSibling);)"TEMPLATE"===t.nodeName.toUpperCase()||">*"!==e&&!m(t,e)||n++;return n}function m(t,e){if(t){var n=(e=e.split(".")).shift().toUpperCase(),o=new RegExp("\\s("+e.join("|")+")(?=\\s)","g");return!(""!==n&&t.nodeName.toUpperCase()!=n||e.length&&((" "+t.className+" ").match(o)||[]).length!=e.length)}return!1}function b(t,e){var n,o;return function(){void 0===n&&(n=arguments,o=this,setTimeout(function(){1===n.length?t.call(o,n[0]):t.apply(o,n),n=void 0},e))}}function _(t,e){if(t&&e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function y(t){return Q?Q(t).clone(!0)[0]:Z&&Z.dom?Z.dom(t).cloneNode(!0):t.cloneNode(!0)}function D(t){for(var e=t.getElementsByTagName("input"),n=e.length;n--;){var o=e[n];o.checked&&ot.push(o)}}if("undefined"==typeof window||!window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var w,T,S,C,E,x,N,k,B,Y,O,X,A,M,P,R,I,L,F,U,j={},H=/\s+/g,W=/left|right|inline/,V="Sortable"+(new Date).getTime(),q=window,z=q.document,G=q.parseInt,Q=q.jQuery||q.Zepto,Z=q.Polymer,J=!1,K=!!("draggable"in z.createElement("div")),$=function(t){return!navigator.userAgent.match(/Trident.*rv[ :]?11\./)&&(t=z.createElement("x"),t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents)}(),tt=!1,et=Math.abs,nt=Math.min,ot=[],it=[],rt=b(function(t,e,n){if(n&&e.scroll){var o,i,r,a,s,l,c=n[V],d=e.scrollSensitivity,h=e.scrollSpeed,u=t.clientX,f=t.clientY,p=window.innerWidth,g=window.innerHeight;if(B!==n&&(k=e.scroll,B=n,Y=e.scrollFn,!0===k)){k=n;do{if(k.offsetWidth<k.scrollWidth||k.offsetHeight<k.scrollHeight)break}while(k=k.parentNode)}k&&(o=k,i=k.getBoundingClientRect(),r=(et(i.right-u)<=d)-(et(i.left-u)<=d),a=(et(i.bottom-f)<=d)-(et(i.top-f)<=d)),r||a||(a=(g-f<=d)-(f<=d),((r=(p-u<=d)-(u<=d))||a)&&(o=q)),j.vx===r&&j.vy===a&&j.el===o||(j.el=o,j.vx=r,j.vy=a,clearInterval(j.pid),o&&(j.pid=setInterval(function(){if(l=a?a*h:0,s=r?r*h:0,"function"==typeof Y)return Y.call(c,s,l,t);o===q?q.scrollTo(q.pageXOffset+s,q.pageYOffset+l):(o.scrollTop+=l,o.scrollLeft+=s)},24)))}},30),at=function(t){function e(t,e){return void 0!==t&&!0!==t||(t=n.name),"function"==typeof t?t:function(n,o){var i=o.options.group.name;return e?t:t&&(t.join?t.indexOf(i)>-1:i==t)}}var n={},o=t.group;o&&"object"==(void 0===o?"undefined":_typeof(o))||(o={name:o}),n.name=o.name,n.checkPull=e(o.pull,!0),n.checkPut=e(o.put),n.revertClone=o.revertClone,t.group=n};t.prototype={constructor:t,_onTapStart:function(t){var e,o=this,i=this.el,r=this.options,a=r.preventOnFilter,s=t.type,l=t.touches&&t.touches[0],c=(l||t).target,h=t.target.shadowRoot&&t.path[0]||c,u=r.filter;if(D(i),!w&&!("mousedown"===s&&0!==t.button||r.disabled)&&(c=n(c,r.draggable,i))&&N!==c){if(e=v(c,r.draggable),"function"==typeof u){if(u.call(this,t,c,this))return d(o,h,"filter",c,i,e),void(a&&t.preventDefault())}else if(u&&(u=u.split(",").some(function(t){if(t=n(h,t.trim(),i))return d(o,t,"filter",c,i,e),!0})))return void(a&&t.preventDefault());r.handle&&!n(h,r.handle,i)||this._prepareDragStart(t,l,c,e)}},_prepareDragStart:function(t,e,n,o){var i,a=this,l=a.el,h=a.options,f=l.ownerDocument;n&&!w&&n.parentNode===l&&(L=t,E=l,T=(w=n).parentNode,x=w.nextSibling,N=n,R=h.group,M=o,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,w.style["will-change"]="transform",i=function(){a._disableDelayedDrag(),w.draggable=a.nativeDraggable,s(w,h.chosenClass,!0),a._triggerDragStart(t,e),d(a,E,"choose",w,E,M)},h.ignore.split(",").forEach(function(t){c(w,t.trim(),u)}),r(f,"mouseup",a._onDrop),r(f,"touchend",a._onDrop),r(f,"touchcancel",a._onDrop),r(f,"pointercancel",a._onDrop),r(f,"selectstart",a),h.delay?(r(f,"mouseup",a._disableDelayedDrag),r(f,"touchend",a._disableDelayedDrag),r(f,"touchcancel",a._disableDelayedDrag),r(f,"mousemove",a._disableDelayedDrag),r(f,"touchmove",a._disableDelayedDrag),r(f,"pointermove",a._disableDelayedDrag),a._dragStartTimer=setTimeout(i,h.delay)):i())},_disableDelayedDrag:function(){var t=this.el.ownerDocument;clearTimeout(this._dragStartTimer),a(t,"mouseup",this._disableDelayedDrag),a(t,"touchend",this._disableDelayedDrag),a(t,"touchcancel",this._disableDelayedDrag),a(t,"mousemove",this._disableDelayedDrag),a(t,"touchmove",this._disableDelayedDrag),a(t,"pointermove",this._disableDelayedDrag)},_triggerDragStart:function(t,e){(e=e||("touch"==t.pointerType?t:null))?(L={target:w,clientX:e.clientX,clientY:e.clientY},this._onDragStart(L,"touch")):this.nativeDraggable?(r(w,"dragend",this),r(E,"dragstart",this._onDragStart)):this._onDragStart(L,!0);try{z.selection?setTimeout(function(){z.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(){if(E&&w){var e=this.options;s(w,e.ghostClass,!0),s(w,e.dragClass,!1),t.active=this,d(this,E,"start",w,E,M)}else this._nulling()},_emulateDragOver:function(){if(F){if(this._lastX===F.clientX&&this._lastY===F.clientY)return;this._lastX=F.clientX,this._lastY=F.clientY,$||l(S,"display","none");var t=z.elementFromPoint(F.clientX,F.clientY),e=t,n=it.length;if(e)do{if(e[V]){for(;n--;)it[n]({clientX:F.clientX,clientY:F.clientY,target:t,rootEl:e});break}t=e}while(e=e.parentNode);$||l(S,"display","")}},_onTouchMove:function(e){if(L){var n=this.options,o=n.fallbackTolerance,i=n.fallbackOffset,r=e.touches?e.touches[0]:e,a=r.clientX-L.clientX+i.x,s=r.clientY-L.clientY+i.y,c=e.touches?"translate3d("+a+"px,"+s+"px,0)":"translate("+a+"px,"+s+"px)";if(!t.active){if(o&&nt(et(r.clientX-this._lastX),et(r.clientY-this._lastY))<o)return;this._dragStarted()}this._appendGhost(),U=!0,F=r,l(S,"webkitTransform",c),l(S,"mozTransform",c),l(S,"msTransform",c),l(S,"transform",c),e.preventDefault()}},_appendGhost:function(){if(!S){var t,e=w.getBoundingClientRect(),n=l(w),o=this.options;s(S=w.cloneNode(!0),o.ghostClass,!1),s(S,o.fallbackClass,!0),s(S,o.dragClass,!0),l(S,"top",e.top-G(n.marginTop,10)),l(S,"left",e.left-G(n.marginLeft,10)),l(S,"width",e.width),l(S,"height",e.height),l(S,"opacity","0.8"),l(S,"position","fixed"),l(S,"zIndex","100000"),l(S,"pointerEvents","none"),o.fallbackOnBody&&z.body.appendChild(S)||E.appendChild(S),t=S.getBoundingClientRect(),l(S,"width",2*e.width-t.width),l(S,"height",2*e.height-t.height)}},_onDragStart:function(t,e){var n=t.dataTransfer,o=this.options;this._offUpEvents(),R.checkPull(this,this,w,t)&&((C=y(w)).draggable=!1,C.style["will-change"]="",l(C,"display","none"),s(C,this.options.chosenClass,!1),E.insertBefore(C,w),d(this,E,"clone",w)),s(w,o.dragClass,!0),e?("touch"===e?(r(z,"touchmove",this._onTouchMove),r(z,"touchend",this._onDrop),r(z,"touchcancel",this._onDrop),r(z,"pointermove",this._onTouchMove),r(z,"pointerup",this._onDrop)):(r(z,"mousemove",this._onTouchMove),r(z,"mouseup",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(n&&(n.effectAllowed="move",o.setData&&o.setData.call(this,n,w)),r(z,"drop",this),setTimeout(this._dragStarted,0))},_onDragOver:function(o){var i,r,a,s,c=this.el,d=this.options,u=d.group,g=t.active,v=R===u,m=!1,b=d.sort;if(void 0!==o.preventDefault&&(o.preventDefault(),!d.dragoverBubble&&o.stopPropagation()),!w.animated&&(U=!0,g&&!d.disabled&&(v?b||(s=!E.contains(w)):I===this||(g.lastPullMode=R.checkPull(this,g,w,o))&&u.checkPut(this,g,w,o))&&(void 0===o.rootEl||o.rootEl===this.el))){if(rt(o,d,this.el),tt)return;if(i=n(o.target,d.draggable,c),r=w.getBoundingClientRect(),I!==this&&(I=this,m=!0),s)return e(g,!0),T=E,void(C||x?E.insertBefore(w,C||x):b||E.appendChild(w));if(0===c.children.length||c.children[0]===S||c===o.target&&p(c,o)){if(0!==c.children.length&&c.children[0]!==S&&c===o.target&&(i=c.lastElementChild),i){if(i.animated)return;a=i.getBoundingClientRect()}e(g,v),!1!==h(E,c,w,r,i,a,o)&&(w.contains(c)||(c.appendChild(w),T=c),this._animate(r,w),i&&this._animate(a,i))}else if(i&&!i.animated&&i!==w&&void 0!==i.parentNode[V]){O!==i&&(O=i,X=l(i),A=l(i.parentNode));var _=(a=i.getBoundingClientRect()).right-a.left,y=a.bottom-a.top,D=W.test(X.cssFloat+X.display)||"flex"==A.display&&0===A["flex-direction"].indexOf("row"),N=i.offsetWidth>w.offsetWidth,k=i.offsetHeight>w.offsetHeight,B=(D?(o.clientX-a.left)/_:(o.clientY-a.top)/y)>.5,Y=i.nextElementSibling,M=!1;if(D){var P=w.offsetTop,L=i.offsetTop;M=P===L?i.previousElementSibling===w&&!N||B&&N:i.previousElementSibling===w||w.previousElementSibling===i?(o.clientY-a.top)/y>.5:L>P}else m||(M=Y!==w&&!k||B&&k);var F=h(E,c,w,r,i,a,o,M);!1!==F&&(1!==F&&-1!==F||(M=1===F),tt=!0,setTimeout(f,30),e(g,v),w.contains(c)||(M&&!Y?c.appendChild(w):i.parentNode.insertBefore(w,M?Y:i)),T=w.parentNode,this._animate(r,w),this._animate(a,i))}}},_animate:function(t,e){var n=this.options.animation;if(n){var o=e.getBoundingClientRect();1===t.nodeType&&(t=t.getBoundingClientRect()),l(e,"transition","none"),l(e,"transform","translate3d("+(t.left-o.left)+"px,"+(t.top-o.top)+"px,0)"),e.offsetWidth,l(e,"transition","all "+n+"ms"),l(e,"transform","translate3d(0,0,0)"),clearTimeout(e.animated),e.animated=setTimeout(function(){l(e,"transition",""),l(e,"transform",""),e.animated=!1},n)}},_offUpEvents:function(){var t=this.el.ownerDocument;a(z,"touchmove",this._onTouchMove),a(z,"pointermove",this._onTouchMove),a(t,"mouseup",this._onDrop),a(t,"touchend",this._onDrop),a(t,"pointerup",this._onDrop),a(t,"touchcancel",this._onDrop),a(t,"pointercancel",this._onDrop),a(t,"selectstart",this)},_onDrop:function(e){var n=this.el,o=this.options;clearInterval(this._loopId),clearInterval(j.pid),clearTimeout(this._dragStartTimer),a(z,"mousemove",this._onTouchMove),this.nativeDraggable&&(a(z,"drop",this),a(n,"dragstart",this._onDragStart)),this._offUpEvents(),e&&(U&&(e.preventDefault(),!o.dropBubble&&e.stopPropagation()),S&&S.parentNode&&S.parentNode.removeChild(S),E!==T&&"clone"===t.active.lastPullMode||C&&C.parentNode&&C.parentNode.removeChild(C),w&&(this.nativeDraggable&&a(w,"dragend",this),u(w),w.style["will-change"]="",s(w,this.options.ghostClass,!1),s(w,this.options.chosenClass,!1),d(this,E,"unchoose",w,E,M),E!==T?(P=v(w,o.draggable))>=0&&(d(null,T,"add",w,E,M,P),d(this,E,"remove",w,E,M,P),d(null,T,"sort",w,E,M,P),d(this,E,"sort",w,E,M,P)):w.nextSibling!==x&&(P=v(w,o.draggable))>=0&&(d(this,E,"update",w,E,M,P),d(this,E,"sort",w,E,M,P)),t.active&&(null!=P&&-1!==P||(P=M),d(this,E,"end",w,E,M,P),this.save()))),this._nulling()},_nulling:function(){E=w=T=S=x=C=N=k=B=L=F=U=P=O=X=I=R=t.active=null,ot.forEach(function(t){t.checked=!0}),ot.length=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragover":case"dragenter":w&&(this._onDragOver(t),i(t));break;case"selectstart":t.preventDefault()}},toArray:function(){for(var t,e=[],o=this.el.children,i=0,r=o.length,a=this.options;i<r;i++)n(t=o[i],a.draggable,this.el)&&e.push(t.getAttribute(a.dataIdAttr)||g(t));return e},sort:function(t){var e={},o=this.el;this.toArray().forEach(function(t,i){var r=o.children[i];n(r,this.options.draggable,o)&&(e[t]=r)},this),t.forEach(function(t){e[t]&&(o.removeChild(e[t]),o.appendChild(e[t]))})},save:function(){var t=this.options.store;t&&t.set(this)},closest:function(t,e){return n(t,e||this.options.draggable,this.el)},option:function(t,e){var n=this.options;if(void 0===e)return n[t];n[t]=e,"group"===t&&at(n)},destroy:function(){var t=this.el;t[V]=null,a(t,"mousedown",this._onTapStart),a(t,"touchstart",this._onTapStart),a(t,"pointerdown",this._onTapStart),this.nativeDraggable&&(a(t,"dragover",this),a(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),function(t){t.removeAttribute("draggable")}),it.splice(it.indexOf(this._onDragOver),1),this._onDrop(),this.el=t=null}},r(z,"touchmove",function(e){t.active&&e.preventDefault()});try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){J={capture:!1,passive:!1}}}))}catch(t){}return t.utils={on:r,off:a,css:l,find:c,is:function(t,e){return!!n(t,e,t)},extend:_,throttle:b,closest:n,toggleClass:s,clone:y,index:v},t.create=function(e,n){return new t(e,n)},t.version="1.6.0",t});</script><dom-module id="sortable-js" assetpath="../../bower_components/polymer-sortablejs/"><template><content></content></template></dom-module><script>"use strict";Polymer({is:"sortable-js",properties:{group:{type:String,value:function(){return Math.random()},observer:"groupChanged"},sort:{type:Boolean,value:!0,observer:"sortChanged"},disabled:{type:Boolean,value:!1,observer:"disabledChanged"},store:{type:Object,value:null,observer:"storeChanged"},handle:{type:String,value:null,observer:"handleChanged"},scrollSensitivity:{type:Number,value:30,observer:"scrollSensitivityChanged"},scrollSpeed:{type:Number,value:10,observer:"scrollSpeedChanged"},ghostClass:{type:String,value:"sortable-ghost",observer:"ghostClassChanged"},chosenClass:{type:String,value:"sortable-chosen",observer:"chosenClassChanged"},ignore:{type:String,value:"a, img",observer:"ignoreChanged"},filter:{type:Object,value:null,observer:"filterChanged"},animation:{type:Number,value:0,observer:"animationChanged"},dropBubble:{type:Boolean,value:!1,observer:"dropBubbleChanged"},dragoverBubble:{type:Boolean,value:!1,observer:"dragoverBubbleChanged"},dataIdAttr:{type:String,value:"data-id",observer:"dataIdAttrChanged"},delay:{type:Number,value:0,observer:"delayChanged"},forceFallback:{type:Boolean,value:!1,observer:"forceFallbackChanged"},fallbackClass:{type:String,value:"sortable-fallback",observer:"fallbackClassChanged"},fallbackOnBody:{type:Boolean,value:!1,observer:"fallbackOnBodyChanged"},draggable:{},scroll:{}},created:function(){Object.defineProperties(this,{draggable:{get:function(){return this._draggable||this.getAttribute("draggable")||">*"},set:function(e){this._draggable=e,this.draggableChanged(e)}},scroll:{get:function(){return this._scroll||JSON.parse(this.getAttribute("scroll")||"true")},set:function(e){this._scroll=e,this.scrollChanged(e)}}})},attached:function(){this.initialize()},detached:function(){this.destroy()},initialize:function(){var e=this.querySelectorAll("template[is='dom-repeat']"),t=e[e.length-1],o={};Object.keys(this.properties).forEach(function(e){o[e]=this[e]}.bind(this));var a=this,s={onUpdate:function(e){t&&t.splice("items",e.newIndex,0,t.splice("items",e.oldIndex,1)[0]),a.fire("update",e)},onAdd:function(e){if(t){var o=e.from.querySelectorAll("template[is='dom-repeat']"),s=o[o.length-1].items[e.oldIndex];t.splice("items",e.newIndex,0,s)}a.fire("add",e)},onRemove:function(e){t&&t.splice("items",e.oldIndex,1)[0],a.fire("remove",e)},onChoose:function(e){a.fire("choose",e)},onStart:function(e){a.fire("start",e)},onEnd:function(e){a.fire("end",e)},onSort:function(e){a.fire("sort",e)},onFilter:function(e){a.fire("filter",e)},onMove:function(e){a.fire("move",e)},onClone:function(e){a.fire("clone",e)}};Object.keys(s).forEach(function(e){o[e]=s[e]}),this.sortable=Sortable.create(this,o)},destroy:function(){this.sortable&&this.sortable.destroy()},groupChanged:function(e){this.sortable&&this.sortable.option("group",e)},sortChanged:function(e){this.sortable&&this.sortable.option("sort",e)},disabledChanged:function(e){this.sortable&&this.sortable.option("disabled",e)},storeChanged:function(e){this.sortable&&this.sortable.option("store",e)},handleChanged:function(e){this.sortable&&this.sortable.option("handle",e)},scrollChanged:function(e){this.sortable&&this.sortable.option("scroll",e)},scrollSensitivityChanged:function(e){this.sortable&&this.sortable.option("scrollSensitivity",e)},scrollSpeedChanged:function(e){this.sortable&&this.sortable.option("scrollSpeed",e)},draggableChanged:function(e){this.sortable&&this.sortable.option("draggable",e)},ghostClassChanged:function(e){this.sortable&&this.sortable.option("ghostClass",e)},chosenClassChanged:function(e){this.sortable&&this.sortable.option("chosenClass",e)},ignoreChanged:function(e){this.sortable&&this.sortable.option("ignore",e)},filterChanged:function(e){this.sortable&&this.sortable.option("filter",e)},animationChanged:function(e){this.sortable&&this.sortable.option("animation",e)},dropBubbleChanged:function(e){this.sortable&&this.sortable.option("dropBubble",e)},dragoverBubbleChanged:function(e){this.sortable&&this.sortable.option("dragoverBubble",e)},dataIdAttrChanged:function(e){this.sortable&&this.sortable.option("dataIdAttr",e)},delayChanged:function(e){this.sortable&&this.sortable.option("delay",e)},forceFallbackChanged:function(e){this.sortable&&this.sortable.option("forceFallback",e)},fallbackClassChanged:function(e){this.sortable&&this.sortable.option("fallbackClass",e)},fallbackOnBodyChanged:function(e){this.sortable&&this.sortable.option("fallbackOnBody",e)}});</script><dom-module id="ha-form-style"><template><style>.form-group{@apply (--layout-horizontal);@apply (--layout-center);padding:8px 16px;}.form-group label{@apply (--layout-flex-2);}.form-group .form-control{@apply (--layout-flex-1);}.form-group.vertical{@apply (--layout-vertical);@apply (--layout-start);}paper-dropdown-menu.form-control{margin:-9px 0;}</style></template></dom-module><dom-module id="ha-form-group" assetpath="group/"><template><style include="iron-flex ha-style ha-form-style">.entities-header{@apply (--layout-horizontal);@apply (--layout-justified);@apply (--layout-center);width:100%;}.drag-handle{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab;}.sortable-chosen .drag-handle, .sortable-ghost{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing;}sortable-js{width:100%;}.entity-row{@apply (--layout-horizontal);@apply (--layout-center);padding:4px 0;border-top:1px solid rgba(0, 0, 0, .12);}.entity-row:first-child{border-top:1px solid rgba(0, 0, 0, 0);}.entity-row.sortable-chosen{background-color:var(--paper-grey-200);border-top:1px solid rgba(0, 0, 0, 0);}.entity-row .unknown{padding-left:56px;}.entity-row paper-icon-button{visibility:hidden;}.entity-row:not(.sortable-chosen):hover paper-icon-button{visibility:visible;}</style><div class="form-group"><paper-input class="form-control flex" label="Name" value="{{entityName}}"></paper-input></div><div class="form-group"><label>Type</label><paper-radio-group selected="{{entityType}}" class="form-control"><paper-radio-button name="group">Group</paper-radio-button><paper-radio-button name="view">View</paper-radio-button></paper-radio-group></div><div class="form-group vertical entities"><div class="entities-header"><label>Entities (drag to reorder):</label></div><sortable-js class="form-control" on-choose="handleRowChosen" handle=".drag-handle"><template is="dom-repeat" items="{{entityChildren}}"><div class="entity-row"><iron-icon icon="mdi:drag-vertical" class="drag-handle"></iron-icon><template is="dom-if" if="[[!item.state]]"><div class="unknown flex">Unknown entity [[item.entity_id]]</div></template><template is="dom-if" if="[[item.state]]" restamp=""><state-info state-obj="[[item]]" class="flex"></state-info></template></div></template></sortable-js></div></template></dom-module><script>Polymer({is:"ha-form-group",properties:{hass:{type:Object},entity:{type:Object},entityName:{type:String,value:""},entityType:{type:String},entityChildren:{type:Object}},handleRowChosen:function(t){t.detail&&window.navigator.vibrate&&window.navigator.vibrate(50)},loadEntity:function(t){var i=this.hass.states;return this.entity=t,this.entityName=t.attributes.friendly_name||"",this.entityType=t.attributes.view?"view":"group",this.entityChildren=t.attributes.entity_id.map(function(t){return i[t]||{state:!1,entity_id:t,attributes:{}}}),Promise.resolve()},saveEntity:function(){var t={name:this.entityName,view:"view"===this.entityType,entities:this.entityChildren.map(function(t){return t.entity_id})},i=this.entity.entity_id.split(".")[1];return this.hass.callApi("POST","config/group/config/"+i,t)}});</script><dom-module id="ha-config-section-group" assetpath="group/"><template><ha-config-section is-wide="[[isWide]]"><span slot="header">Groups & Views</span> <span slot="introduction">Use groups to organize your entities and make Home Assistant really your own.<br><br>Got more groups than you can handle? Create views to manage your groups.</span><ha-entity-config hass="[[hass]]" label="Group" entities="[[entities]]" config="[[entityConfig]]"></ha-entity-config></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-group",properties:{hass:{type:Object},isWide:{type:Boolean,value:!1},entities:{type:Array,computed:"computeEntities(hass)"},entityConfig:{type:Object,value:{component:"ha-form-group",computeSelectCaption:function(t){return window.hassUtil.computeStateName(t)+(t.attributes.view?" (view)":"")}}}},computeEntities:function(t){return Object.keys(t.states).map(function(e){return t.states[e]}).filter(function(t){return"group"===window.hassUtil.computeDomain(t)&&!t.attributes.auto}).sort(window.hassUtil.sortByName)}});</script><dom-module id="ha-config-section-hassbian" assetpath="hassbian/"><template><style include="iron-flex ha-style">.header{font-size:16px;margin-bottom:1em;}.header .status{font-size:14px;float:right;}.card-actions paper-button{color:var(--default-primary-color);font-weight:500;}</style><ha-config-section is-wide="[[isWide]]"><span slot="header">Bring Hassbian to the next level</span> <span slot="introduction">Discover exciting add-ons to enhance your Home Assistant installation. Add an MQTT server or control a connected TV via HDMI-CEC.</span><template is="dom-if" if="[[suiteStatus]]"><template is="dom-repeat" items="[[computeSuiteKeys(suiteStatus)]]" as="suiteKey"><paper-card><div class="card-content"><div class="header">[[computeTitle(suiteKey)]] <span class="status">[[computeSuiteStatus(suiteStatus, suiteKey)]]</span></div>[[computeSuiteDescription(suiteStatus, suiteKey)]]</div><div class="card-actions"><paper-button on-tap="suiteMoreInfoTapped">LEARN MORE</paper-button><template is="dom-if" if="[[computeShowInstall(suiteStatus, suiteKey)]]"><paper-button on-tap="suiteActionTapped">INSTALL</paper-button></template></div></paper-card></template></template></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-hassbian",properties:{hass:{type:Object},isWide:{type:Boolean},suiteStatus:{type:Object,value:null}},updateStatus:function(){this.hass.callApi("GET","config/hassbian/suites").then(function(t){this.suiteStatus=t;for(var e=!1,s=Object.keys(t),i=0;i<s.length;i++)if("installing"===t[s[i]].state){e=!0;break}e&&this.async(this.updateStatus,5e3)}.bind(this))},attached:function(){this.updateStatus=this.updateStatus.bind(this),this.updateStatus()},computeSuiteKeys:function(t){return Object.keys(t).sort(function(e,s){var i="installing"===t[e].state,n="installing"===t[s].state;if(i&&n);else{if(i)return-1;if(n)return 1}return e<s?-1:e>s?1:0})},computeSuiteDescription:function(t,e){return t[e].description},computeTitle:function(t){return t.substr(0,1).toUpperCase()+t.substr(1)},computeSuiteStatus:function(t,e){var s=t[e].state.replace(/_/," ");return s.substr(0,1).toUpperCase()+s.substr(1)},computeShowStatus:function(t,e){var s=t[e].state;return"installing"!==s&&"not_installed"!==s},computeShowInstall:function(t,e){return"not_installed"===t[e].state},suiteMoreInfoTapped:function(){},suiteActionTapped:function(){this.hass.callApi("POST","config/hassbian/suites/openzwave/install").then(this.updateStatus)}});</script><dom-module id="ha-form-zwave-device" assetpath="z-wave/"><template><style include="iron-flex ha-style ha-form-style"></style><div class="form-group"><paper-checkbox checked="{{entityIgnored}}" class="form-control">Exclude from Home Assistant</paper-checkbox></div><div class="form-group"><paper-dropdown-menu class="form-control flex" label="Polling intensity" disabled="[[entityIgnored]]"><paper-listbox slot="dropdown-content" selected="{{entityPollingIntensity}}"><paper-item>Do not poll (0)</paper-item><paper-item>Poll every time (1)</paper-item><paper-item>Poll every other time (2)</paper-item></paper-listbox></paper-dropdown-menu></div></template></dom-module><script>Polymer({is:"ha-form-zwave-device",properties:{hass:{type:Object},entity:{type:Object},entityIgnored:{type:Boolean},entityPollingIntensity:{type:Number}},loadEntity:function(t){this.entity=t;var i=this;return this.hass.callApi("GET","config/zwave/device_config/"+t.entity_id).then(function(t){i.entityIgnored=t.ignored||!1,i.entityPollingIntensity=t.polling_intensity||0})},saveEntity:function(){var t={ignored:this.entityIgnored,polling_intensity:this.entityPollingIntensity};return this.hass.callApi("POST","config/zwave/device_config/"+this.entity.entity_id,t)}});</script><dom-module id="ha-config-section-zwave" assetpath="z-wave/"><template><ha-config-section is-wide="[[isWide]]"><span slot="header">Z-Wave</span> <span slot="introduction">Z-Wave devices contain a lot of options. These controls will allow you to get into the nitty gritty details.</span><ha-entity-config hass="[[hass]]" entities="[[entities]]" config="[[entityConfig]]"></ha-entity-config></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-zwave",properties:{hass:{type:Object},isWide:{type:Boolean,value:!1},entities:{type:Array,computed:"computeEntities(hass)"},entityConfig:{type:Object,value:{component:"ha-form-zwave-device",computeSelectCaption:function(t){return window.hassUtil.computeStateName(t)+" ("+window.hassUtil.computeDomain(t)+")"}}}},computeEntities:function(t){return Object.keys(t.states).map(function(e){return t.states[e]}).filter(function(t){return!t.attributes.hidden&&"node_id"in t.attributes}).sort(window.hassUtil.sortByName)}});</script></div><dom-module id="ha-panel-config"><template><style include="iron-flex ha-style">.content{padding-bottom:32px;}.border{margin:32px auto 0;border-bottom:1px solid rgba(0, 0, 0, 0.12);max-width:1040px;}.narrow .border{max-width:640px;}</style><iron-media-query query="(min-width: 1040px)" query-matches="{{wide}}"></iron-media-query><iron-media-query query="(min-width: 1296px)" query-matches="{{wideSidebar}}"></iron-media-query><app-header-layout has-scrolling-region=""><app-header slot="header" fixed=""><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">Configuration</div></app-toolbar></app-header><div class$="[[computeClasses(isWide)]]"><ha-config-section-group is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-group><ha-config-section-core is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-core><template is="dom-if" if="[[computeIsHassbianLoaded(hass)]]"><div class="border"></div><ha-config-section-hassbian is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-hassbian></template><template is="dom-if" if="[[computeIsZwaveLoaded(hass)]]"><div class="border"></div><ha-config-section-zwave is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-zwave></template></div></app-header-layout></template></dom-module><script>Polymer({is:"ha-panel-config",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},wide:{type:Boolean},wideSidebar:{type:Boolean},isWide:{type:Boolean,computed:"computeIsWide(showMenu, wideSidebar, wide)"}},computeIsWide:function(e,o,n){return e?o:n},computeClasses:function(e){return e?"content":"content narrow"},computeIsHassbianLoaded:function(e){return window.hassUtil.isComponentLoaded(e,"config.hassbian")},computeIsZwaveLoaded:function(e){return window.hassUtil.isComponentLoaded(e,"config.zwave")}});</script></body></html> \ No newline at end of file +<html><head></head><body><div hidden="" by-polymer-bundler=""><dom-module id="ha-config-section-core" assetpath="core/"><template><style include="iron-flex ha-style">.validate-container{@apply (--layout-vertical);@apply (--layout-center-center);height:140px;}.validate-result{color:var(--google-green-500);font-weight:500;margin-bottom:1em;}.config-invalid{margin:1em 0;}.config-invalid .text{color:var(--google-red-500);font-weight:500;}.config-invalid paper-button{float:right;}.validate-log{white-space:pre-wrap;}</style><ha-config-section is-wide="[[isWide]]"><span slot="header">Server Management</span> <span slot="introduction">Changing your configuration can be a tiresome process. We know. This section will try to make your life a little bit easier.</span><paper-card heading="Configuration Validation"><div class="card-content">Validate your configuration if you recently made some changes to your configuration and want to make sure that it is all valid.<template is="dom-if" if="[[!validateLog]]"><div class="validate-container"><template is="dom-if" if="[[!validating]]"><div class="validate-result" id="result">[[validateResult]]</div><paper-button raised="" on-tap="validateConfig">check config</paper-button></template><template is="dom-if" if="[[validating]]"><paper-spinner active=""></paper-spinner></template></div></template><template is="dom-if" if="[[validateLog]]"><div class="config-invalid"><span class="text">Configuration invalid.</span><paper-button raised="" on-tap="validateConfig">check config</paper-button></div><div id="configLog" class="validate-log">[[validateLog]]</div></template></div></paper-card><paper-card heading="Configuration Reloading"><div class="card-content">Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current configuration and load the new one.</div><div class="card-actions"><ha-call-service-button hass="[[hass]]" domain="homeassistant" service="reload_core_config">Reload Core</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="group" service="reload" hidden$="[[!groupLoaded(hass)]]">Reload Groups</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="automation" service="reload" hidden$="[[!automationLoaded(hass)]]">Reload Automation</ha-call-service-button><ha-call-service-button hass="[[hass]]" domain="script" service="reload" hidden$="[[!scriptLoaded(hass)]]">Reload Scripts</ha-call-service-button></div></paper-card><paper-card heading="Server Management"><div class="card-content">Control your Home Assistant server… from Home Assistant.</div><div class="card-actions warning"><ha-call-service-button class="warning" hass="[[hass]]" domain="homeassistant" service="restart">Restart</ha-call-service-button><ha-call-service-button class="warning" hass="[[hass]]" domain="homeassistant" service="stop">Stop</ha-call-service-button></div></paper-card></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-core",properties:{hass:{type:Object},isWide:{type:Boolean,value:!1},validating:{type:Boolean,value:!1},validateResult:{type:String,value:""},validateLog:{type:String,value:""}},groupLoaded:function(i){return window.hassUtil.isComponentLoaded(i,"group")},automationLoaded:function(i){return window.hassUtil.isComponentLoaded(i,"automation")},scriptLoaded:function(i){return window.hassUtil.isComponentLoaded(i,"script")},validateConfig:function(){this.validating=!0,this.validateLog="",this.validateResult="";var i=this;this.hass.callApi("POST","config/core/check_config").then(function(t){i.validating=!1,(i.configValid="valid"===t.result)?i.validateResult="Valid!":i.validateLog=t.errors})}});</script><dom-module id="ha-config-section-hassbian" assetpath="hassbian/"><template><style include="iron-flex ha-style">.header{font-size:16px;margin-bottom:1em;}.header .status{font-size:14px;float:right;}.card-actions paper-button{color:var(--default-primary-color);font-weight:500;}</style><ha-config-section is-wide="[[isWide]]"><span slot="header">Bring Hassbian to the next level</span> <span slot="introduction">Discover exciting add-ons to enhance your Home Assistant installation. Add an MQTT server or control a connected TV via HDMI-CEC.</span><template is="dom-if" if="[[suiteStatus]]"><template is="dom-repeat" items="[[computeSuiteKeys(suiteStatus)]]" as="suiteKey"><paper-card><div class="card-content"><div class="header">[[computeTitle(suiteKey)]] <span class="status">[[computeSuiteStatus(suiteStatus, suiteKey)]]</span></div>[[computeSuiteDescription(suiteStatus, suiteKey)]]</div><div class="card-actions"><paper-button on-tap="suiteMoreInfoTapped">LEARN MORE</paper-button><template is="dom-if" if="[[computeShowInstall(suiteStatus, suiteKey)]]"><paper-button on-tap="suiteActionTapped">INSTALL</paper-button></template></div></paper-card></template></template></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-hassbian",properties:{hass:{type:Object},isWide:{type:Boolean},suiteStatus:{type:Object,value:null}},updateStatus:function(){this.hass.callApi("GET","config/hassbian/suites").then(function(t){this.suiteStatus=t;for(var e=!1,s=Object.keys(t),i=0;i<s.length;i++)if("installing"===t[s[i]].state){e=!0;break}e&&this.async(this.updateStatus,5e3)}.bind(this))},attached:function(){this.updateStatus=this.updateStatus.bind(this),this.updateStatus()},computeSuiteKeys:function(t){return Object.keys(t).sort(function(e,s){var i="installing"===t[e].state,n="installing"===t[s].state;if(i&&n);else{if(i)return-1;if(n)return 1}return e<s?-1:e>s?1:0})},computeSuiteDescription:function(t,e){return t[e].description},computeTitle:function(t){return t.substr(0,1).toUpperCase()+t.substr(1)},computeSuiteStatus:function(t,e){var s=t[e].state.replace(/_/," ");return s.substr(0,1).toUpperCase()+s.substr(1)},computeShowStatus:function(t,e){var s=t[e].state;return"installing"!==s&&"not_installed"!==s},computeShowInstall:function(t,e){return"not_installed"===t[e].state},suiteMoreInfoTapped:function(){},suiteActionTapped:function(){this.hass.callApi("POST","config/hassbian/suites/openzwave/install").then(this.updateStatus)}});</script><dom-module id="ha-entity-config"><template><style include="iron-flex ha-style">paper-card{display:block;}.device-picker{@apply (--layout-horizontal);padding-bottom:24px;}.form-placeholder{@apply (--layout-vertical);@apply (--layout-center-center);height:96px;}[hidden]:{display:none;};.card-actions{@apply (--layout-horizontal);@apply (--layout-justified);}</style><paper-card><div class="card-content"><div class="device-picker"><paper-dropdown-menu label="[[label]]" class="flex" disabled="[[!entities.length]]"><paper-listbox slot="dropdown-content" selected="{{selectedEntity}}"><template is="dom-repeat" items="[[entities]]" as="state"><paper-item>[[computeSelectCaption(state)]]</paper-item></template></paper-listbox></paper-dropdown-menu></div><div class="form-container"><template is="dom-if" if="[[computeShowPlaceholder(formState)]]"><div class="form-placeholder"><template is="dom-if" if="[[computeShowNoDevices(formState)]]">No entities found! :-(</template><template is="dom-if" if="[[computeShowSpinner(formState)]]"><paper-spinner active="" alt="[[formState]]"></paper-spinner>[[formState]]</template></div></template><div hidden$="[[!computeShowForm(formState)]]" id="form"></div></div></div><div class="card-actions"><paper-button on-tap="saveEntity" disabled="[[computeShowPlaceholder(formState)]]">SAVE</paper-button><template is="dom-if" if="[[allowDelete]]"><paper-button class="warning" on-tap="deleteEntity" disabled="[[computeShowPlaceholder(formState)]]">DELETE</paper-button></template></div></paper-card></template></dom-module><script>Polymer({is:"ha-entity-config",properties:{hass:{type:Object,observer:"hassChanged"},label:{type:String,value:"Device"},entities:{type:Array,observer:"entitiesChanged"},allowDelete:{type:Boolean,value:!1},selectedEntity:{type:Number,value:-1,observer:"entityChanged"},formState:{type:String,value:"no-devices"},config:{type:Object}},attached:function(){this.formEl=document.createElement(this.config.component),this.formEl.hass=this.hass,this.$.form.appendChild(this.formEl),this.entityChanged(this.selectedEntity)},computeSelectCaption:function(t){return this.config.computeSelectCaption?this.config.computeSelectCaption(t):window.hassUtil.computeStateName(t)},computeShowNoDevices:function(t){return"no-devices"===t},computeShowSpinner:function(t){return"loading"===t||"saving"===t},computeShowPlaceholder:function(t){return"editing"!==t},computeShowForm:function(t){return"editing"===t},hassChanged:function(t){this.formEl&&(this.formEl.hass=t)},entitiesChanged:function(t,e){if(0!==t.length)if(e){var i=e[this.selectedEntity].entity_id,n=t.findIndex(function(t){return t.entity_id===i});-1===n?this.selectedEntity=0:n!==this.selectedEntity&&(this.selectedEntity=n)}else this.selectedEntity=0;else this.formState="no-devices"},entityChanged:function(t){if(this.entities&&this.formEl){var e=this.entities[t];this.formState="loading";var i=this;this.formEl.loadEntity(e).then(function(){i.formState="editing"})}},saveEntity:function(){this.formState="saving";var t=this;this.formEl.saveEntity().then(function(){t.formState="editing"})}});</script><dom-module id="ha-form-style"><template><style>.form-group{@apply (--layout-horizontal);@apply (--layout-center);padding:8px 16px;}.form-group label{@apply (--layout-flex-2);}.form-group .form-control{@apply (--layout-flex-1);}.form-group.vertical{@apply (--layout-vertical);@apply (--layout-start);}paper-dropdown-menu.form-control{margin:-9px 0;}</style></template></dom-module><dom-module id="ha-form-zwave-device" assetpath="z-wave/"><template><style include="iron-flex ha-style ha-form-style"></style><div class="form-group"><paper-checkbox checked="{{entityIgnored}}" class="form-control">Exclude from Home Assistant</paper-checkbox></div><div class="form-group"><paper-dropdown-menu class="form-control flex" label="Polling intensity" disabled="[[entityIgnored]]"><paper-listbox slot="dropdown-content" selected="{{entityPollingIntensity}}"><paper-item>Do not poll (0)</paper-item><paper-item>Poll every time (1)</paper-item><paper-item>Poll every other time (2)</paper-item></paper-listbox></paper-dropdown-menu></div></template></dom-module><script>Polymer({is:"ha-form-zwave-device",properties:{hass:{type:Object},entity:{type:Object},entityIgnored:{type:Boolean},entityPollingIntensity:{type:Number}},loadEntity:function(t){this.entity=t;var i=this;return this.hass.callApi("GET","config/zwave/device_config/"+t.entity_id).then(function(t){i.entityIgnored=t.ignored||!1,i.entityPollingIntensity=t.polling_intensity||0})},saveEntity:function(){var t={ignored:this.entityIgnored,polling_intensity:this.entityPollingIntensity};return this.hass.callApi("POST","config/zwave/device_config/"+this.entity.entity_id,t)}});</script><dom-module id="ha-config-section-zwave" assetpath="z-wave/"><template><ha-config-section is-wide="[[isWide]]"><span slot="header">Z-Wave</span> <span slot="introduction">Z-Wave devices contain a lot of options. These controls will allow you to get into the nitty gritty details.</span><ha-entity-config hass="[[hass]]" entities="[[entities]]" config="[[entityConfig]]"></ha-entity-config></ha-config-section></template></dom-module><script>Polymer({is:"ha-config-section-zwave",properties:{hass:{type:Object},isWide:{type:Boolean,value:!1},entities:{type:Array,computed:"computeEntities(hass)"},entityConfig:{type:Object,value:{component:"ha-form-zwave-device",computeSelectCaption:function(t){return window.hassUtil.computeStateName(t)+" ("+window.hassUtil.computeDomain(t)+")"}}}},computeEntities:function(t){return Object.keys(t.states).map(function(e){return t.states[e]}).filter(function(t){return!t.attributes.hidden&&"node_id"in t.attributes}).sort(window.hassUtil.sortByName)}});</script></div><dom-module id="ha-panel-config"><template><style include="iron-flex ha-style">.content{padding-bottom:32px;}.border{margin:32px auto 0;border-bottom:1px solid rgba(0, 0, 0, 0.12);max-width:1040px;}.narrow .border{max-width:640px;}</style><iron-media-query query="(min-width: 1040px)" query-matches="{{wide}}"></iron-media-query><iron-media-query query="(min-width: 1296px)" query-matches="{{wideSidebar}}"></iron-media-query><app-header-layout has-scrolling-region=""><app-header slot="header" fixed=""><app-toolbar><ha-menu-button narrow="[[narrow]]" show-menu="[[showMenu]]"></ha-menu-button><div main-title="">Configuration</div></app-toolbar></app-header><div class$="[[computeClasses(isWide)]]"><ha-config-section-core is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-core><template is="dom-if" if="[[computeIsHassbianLoaded(hass)]]"><div class="border"></div><ha-config-section-hassbian is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-hassbian></template><template is="dom-if" if="[[computeIsZwaveLoaded(hass)]]"><div class="border"></div><ha-config-section-zwave is-wide="[[isWide]]" hass="[[hass]]"></ha-config-section-zwave></template></div></app-header-layout></template></dom-module><script>Polymer({is:"ha-panel-config",properties:{hass:{type:Object},narrow:{type:Boolean},showMenu:{type:Boolean,value:!1},wide:{type:Boolean},wideSidebar:{type:Boolean},isWide:{type:Boolean,computed:"computeIsWide(showMenu, wideSidebar, wide)"}},computeIsWide:function(e,o,n){return e?o:n},computeClasses:function(e){return e?"content":"content narrow"},computeIsHassbianLoaded:function(e){return window.hassUtil.isComponentLoaded(e,"config.hassbian")},computeIsZwaveLoaded:function(e){return window.hassUtil.isComponentLoaded(e,"config.zwave")}});</script></body></html> \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html.gz index 7325c68ccac6295aec5f673a61d70cb18d753626..c0775a559c9ce95012b6f3f68aba3dc323b30a19 100644 Binary files a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html.gz and b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html.gz differ diff --git a/homeassistant/components/frontend/www_static/service_worker.js b/homeassistant/components/frontend/www_static/service_worker.js index e033471390ebd7415eb8f2a15e5a37db694c938d..8e3e57b15c56f04213461ec19abb7ca4ca8469ec 100644 --- a/homeassistant/components/frontend/www_static/service_worker.js +++ b/homeassistant/components/frontend/www_static/service_worker.js @@ -37,7 +37,7 @@ /* eslint-disable indent, no-unused-vars, no-multiple-empty-lines, max-nested-callbacks, space-before-function-paren, quotes, comma-spacing */ 'use strict'; -var precacheConfig = [["/","91486fe0099ad4d5d5a9b11cfdf70b7b"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["/Users/paulus/dev/python/home-assistant/homeassistant/components/frontend/www_static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["/frontend/panels/dev-event-d409e7ab537d9fe629126d122345279c.html","936814991f2a5e23d61d29f0d40f81b8"],["/frontend/panels/dev-info-b0e55eb657fd75f21aba2426ac0cedc0.html","1fa953b0224470f70d4e87bbe4dff191"],["/frontend/panels/dev-mqtt-94b222b013a98583842de3e72d5888c6.html","dc3ddfac58397feda97317358f0aecbb"],["/frontend/panels/dev-service-61b164e0c0964782a539cba7008bb716.html","86e4a07af018a9e020e3ab822c924a44"],["/frontend/panels/dev-state-7948d3dba058f31517d880df8ed0e857.html","ff8156bb1a52490fcc07466556fce0e1"],["/frontend/panels/dev-template-f47b6910d8e4880e22cc508ca452f9b6.html","9aa0675e01373c6bc2737438bb84a9ec"],["/frontend/panels/map-c2544fff3eedb487d44105cf94b335ec.html","113c5bf9a68a74c62e50cd354034e78b"],["/static/compatibility-1686167ff210e001f063f5c606b2e74b.js","6ee7b5e2dd82b510c3bd92f7e215988e"],["/static/core-2a7d01e45187c7d4635da05065b5e54e.js","90a0a8a6a6dd0ca41b16f40e7d23924d"],["/static/frontend-da3a65fd69361319864767a3ce0b4b9d.html","18b3bebc403a3b2a686c3d6f3482b1f6"],["/static/mdi-e91f61a039ed0a9936e7ee5360da3870.html","5e587bc82719b740a4f0798722a83aee"]]; +var precacheConfig = [["/","91486fe0099ad4d5d5a9b11cfdf70b7b"],["/frontend/panels/dev-event-d409e7ab537d9fe629126d122345279c.html","936814991f2a5e23d61d29f0d40f81b8"],["/frontend/panels/dev-info-b0e55eb657fd75f21aba2426ac0cedc0.html","1fa953b0224470f70d4e87bbe4dff191"],["/frontend/panels/dev-mqtt-94b222b013a98583842de3e72d5888c6.html","dc3ddfac58397feda97317358f0aecbb"],["/frontend/panels/dev-service-61b164e0c0964782a539cba7008bb716.html","86e4a07af018a9e020e3ab822c924a44"],["/frontend/panels/dev-state-7948d3dba058f31517d880df8ed0e857.html","ff8156bb1a52490fcc07466556fce0e1"],["/frontend/panels/dev-template-f47b6910d8e4880e22cc508ca452f9b6.html","9aa0675e01373c6bc2737438bb84a9ec"],["/frontend/panels/map-c2544fff3eedb487d44105cf94b335ec.html","113c5bf9a68a74c62e50cd354034e78b"],["/static/compatibility-1686167ff210e001f063f5c606b2e74b.js","6ee7b5e2dd82b510c3bd92f7e215988e"],["/static/core-2a7d01e45187c7d4635da05065b5e54e.js","90a0a8a6a6dd0ca41b16f40e7d23924d"],["/static/frontend-da3a65fd69361319864767a3ce0b4b9d.html","18b3bebc403a3b2a686c3d6f3482b1f6"],["/static/mdi-e91f61a039ed0a9936e7ee5360da3870.html","5e587bc82719b740a4f0798722a83aee"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"]]; var cacheName = 'sw-precache-v3--' + (self.registration ? self.registration.scope : ''); diff --git a/homeassistant/components/frontend/www_static/service_worker.js.gz b/homeassistant/components/frontend/www_static/service_worker.js.gz index 27397d1f46c07143c8f9e4f1f9c67066b1cc9780..ad9cd6b4422bc7867e326957e389e9885d6cefc0 100644 Binary files a/homeassistant/components/frontend/www_static/service_worker.js.gz and b/homeassistant/components/frontend/www_static/service_worker.js.gz differ