Newer
Older
smart-home-server / webclient / dist / js / main.js
(()=>{var Oe=Object.defineProperty,ke=Object.defineProperties;var Ie=Object.getOwnPropertyDescriptors;var ae=Object.getOwnPropertySymbols;var Ne=Object.prototype.hasOwnProperty,xe=Object.prototype.propertyIsEnumerable;var ne=(n,e,t)=>e in n?Oe(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,v=(n,e)=>{for(var t in e||(e={}))Ne.call(e,t)&&ne(n,t,e[t]);if(ae)for(var t of ae(e))xe.call(e,t)&&ne(n,t,e[t]);return n},se=(n,e)=>ke(n,Ie(e));var ie=(n,e,t)=>new Promise((a,s)=>{var i=c=>{try{r(t.next(c))}catch(l){s(l)}},o=c=>{try{r(t.throw(c))}catch(l){s(l)}},r=c=>c.done?a(c.value):Promise.resolve(c.value).then(i,o);r((t=t.apply(n,e)).next())});var h,T,D;function Re(){h.dataset.navState="displayed",h.classList.remove("state-off"),h.classList.add("state-on"),T.classList.add("a-show")}function F(){h.dataset.navState="hidden",h.classList.remove("state-on"),h.classList.add("state-off"),T.classList.add("a-hide"),T.classList.remove("a-show"),setTimeout(()=>{T.classList.remove("a-hide")},300)}function re(){console.log("HUD init"),h=document.querySelector(".hud .nav-toggle"),T=document.querySelector(".hud .navigation"),D=document.querySelector(".hud .reload-screen"),h==null||h.addEventListener("click",n=>{n.currentTarget.dataset.navState!="displayed"?Re():F()}),D==null||D.addEventListener("click",n=>{Screens.reload()})}var M=class{constructor(e,t,a){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[],errorScreen:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(a),console.log("Screens Init")}add(e,t){if(typeof t!="object")return console.error("Screens: screens must be object");if(typeof(t==null?void 0:t.alias)=="undefined")return console.error("Screens: undefined alias");if(typeof(t==null?void 0:t.renderer)!="function")return console.error("Screens: renderer must be function");this.screens[t.alias]=v({route:e},t),this.routesMap[e]=t.alias}switch(e){var a;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(a=this.currentScreen)==null||a.DOMObject.remove(),typeof this.screens[e]=="undefined"){console.error(`Screens: "${e}" not found`);return}this.currentScreen=this.screens[e];let t=document.createElement("div");t.classList.add("screen"),t.id=e,t.dataset.alias=e,t.innerHTML=this.currentScreen.renderer(),this.currentScreen.DOMObject=t,this.screensContainer.append(this.currentScreen.DOMObject),this.currentScreen.initer(this)}reload(){this.currentScreen&&(this.runReloadHandlers(this.currentScreen.alias),this.switch(this.currentScreen.alias))}reinit(){this.currentScreen&&(this.currentScreen.initer(this),this.runReinitHandlers())}routing(){setInterval(()=>{let e=document.location.hash.split("#!")[1];if(typeof e=="undefined"||e=="")return;let t=typeof this.routesMap[e]=="undefined"?"not-found-screen":this.routesMap[e];(!this.currentScreen||this.currentScreen.alias!=t)&&this.switch(t)},50)}ready(){this.currentScreen!=null&&(this.currentScreen.DOMObject||(this.currentScreen.DOMObject=document.getElementsById(this.currentScreen.alias)),this.hideLoader(),this.currentScreen.DOMObject.classList.add("a-show"))}error(e,t){var a;(a=this.currentScreen)==null||a.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen(),this.runErrorScreenHandlers()}hideLoader(){this.loader.classList.remove("a-show")}showLoader(){this.loader.classList.add("a-show")}showErrorScreen(){this.errorScreen.classList.add("a-show")}hideErrorScreen(){this.errorScreen.classList.remove("a-show")}getScreens(){return this.screens}getRoutesMap(){return this.routesMap}onSwitch(e){this.eventsHandlers.switch.push(e)}onReaload(e){this.eventsHandlers.reload.push(e)}onReinit(e){this.eventsHandlers.reinit.push(e)}onErrorScreen(e){this.eventsHandlers.errorScreen.push(e)}runSwitchHandlers(e){let t=Object.keys(this.routesMap).filter(a=>this.routesMap[a]==e);for(let a of this.eventsHandlers.switch)a(this,e,t.length?t[0]:void 0)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}runErrorScreenHandlers(){for(let e of this.eventsHandlers.errorScreen)e(this)}};var q=class{constructor(){this.data={}}set(e,t){this.data[e]=t}get(e){return this.data[e]}setRaw(e,t){this.set("raw."+e,t)}getRaw(e){return this.get("raw."+e)}};function je(n,e,t,a){return`
		<div class="toast toast-${n}" role="alert">
	    <div class="toast-content">
	      <h4 class="toast-title">${e} ${t}</h4>
	      <p class="toast-text">${a}</p>
	    </div>
	    <button class="btn-icon toast-close" type="button" aria-label="Close">\u2715</button>
	  </div>
	`}function Pe(n,e){if(e!=null&&e.alone&&document.querySelectorAll(".toast").forEach(t=>t.close()),n.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},n.querySelector(".toast-close").addEventListener("click",t=>{n.close()}),n.show=function(){document.querySelector("body").append(n),setTimeout(()=>{n.classList.add("a-show")},10)},typeof Screens!="undefined"&&Screens.onSwitch((t,a)=>{setTimeout(()=>{n==null||n.close()},1e4)}),n.addEventListener("mouseover",t=>n.ishovered=!0),n.addEventListener("mouseout",t=>n.ishovered=!1),e!=null&&e.lifetime){console.log(e);let t=setInterval(()=>{n.ishovered||(n.close(),clearInterval(t))},e==null?void 0:e.lifetime)}return n}function H(n,e,t,a,s){let i=document.createElement("div");return i.innerHTML=je(n,e,t,a),Pe(i.childNodes[1],s)}function Fe(n,e,t){return typeof t=="undefined"&&(t={}),typeof t.lifetime=="undefined"&&(t.lifetime=4e3),typeof t.alone=="undefined"&&(t.alone=!0),H("success",'<i class="ph ph-check-circle"></i>',n,e,t)}function Ue(n,e,t){return H("info",'<i class="ph ph-info"></i>',n,e,t)}function Be(n,e,t){return H("warning",'<i class="ph ph-warning"></i>',n,e,t)}function oe(n,e,t){return H("danger",'<i class="ph ph-warning-octagon"></i>',n,e,t)}var ce={create:H,createInfo:Ue,createSuccess:Fe,createWarning:Be,createError:oe,createDanger:oe};function ze(n){let e="";for(let t of n){let a="",s="";t.route&&(a=`<a class="list-action" href="${t.route}">`,s="</a>"),e+=`
			<li class="list-item ${t.is_active?"list-item-active":""}">
				${a}${t.content}${s}
			</li>
		`}return`
		<div class="sidebar block">
			<ul class="list list-nav">
				${e} 
			</ul>
		</div>
	`}function Ve(n,e,t,a){let s='<tr class="table-row">',i=0;for(let u in e)s+=`<th scope="col">${e[u]}</th>`,i++;s+="</tr>";let o="";for(let u of t){o+='<tr class="table-row">';for(let p in e)o+=`<td>${u[p]}</td>`;o+="</tr>"}let r="";typeof a!="undefined"&&(r=`
			<tfoot class="table-foot">
				<tr class="table-row">
					<td colspan="${i}">
						${a}
					</td>
				</tr>
			</tfoot>
		`);let c=n?`<caption class="table-caption">${n}</caption>`:"",l=t.length?`<thead class="table-head">${s}</thead>`:"";return o=t.length?o:'<tr><td class="is-empty">Empty</td></tr>',`
		<div class="table-wrapper">
			<table class="table devices-lists ${t.length?"":"table-empty"}">
				${c}
				${l}
				<tbody class="table-body">${o}</tbody>
				${r}
			</table>
		</div>
	`}function le(n,e,t){let a=document.createElement(n);for(let[s,i]of Object.entries(e))s==="class"?a.className=i:s==="dataset"?Object.assign(a.dataset,i):a.setAttribute(s,i);return a.innerHTML=typeof t!="undefined"?t:"",a}function Je(n,e){return["primary","success","secondary","info","warning","error","danger"].indexOf(n)<0?console.error("createAlert()","Error of type: "+n):le("div",{class:`alert alert-${n}`},e)}function We(n){let e={device_name:"name",device_hard_id:"device_id",device_ip:"ip",device_type:"type",ip_address:"ip",mac_address:"mac",device_mac:"mac",core_version:"firmware_core_version"},t={};for(let a in n){if(typeof e[a]!="undefined"){t[e[a]]=n[a];continue}t[a]=n[a]}return t}function Ye(n,e){if((n==null?void 0:n.isLoading)==e)return!1;if(e)n.isLoading=!0,n.originalContent=n.innerHTML,n.classList.contains("with-icon")?n.originalWithIcon=!0:n.classList.add("with-icon"),n.classList.add("loading-state"),n.setAttribute("disabled","disabled"),n.innerHTML='<i class="ph-bold ph-spinner"></i> Loading';else{if(n.isLoading=!1,!n.originalContent)return!1;n.removeAttribute("disabled"),n.classList.remove("loading-state"),n.originalWithIcon||n.classList.remove("with-icon"),n.innerHTML=n.originalContent}return n}function Ge(n,e){if((n==null?void 0:n.isLoading)==e)return!1;let t=n.querySelector(".device-icon");if(e)n.isLoading=!0,n.originalContent=t.innerHTML,n.classList.add("loading-state"),n.setAttribute("disabled","disabled"),t.innerHTML='<i class="ph-bold ph-spinner"></i>';else{if(n.isLoading=!1,!n.originalContent)return!1;n.removeAttribute("disabled"),n.classList.remove("loading-state"),t.innerHTML=n.originalContent}return n}function Ke(n,e){return e=e!=null?e:"",`
		<div class="container">
			<div class="row adaptive g-6">
				<div class="col sidebar-container">
					${n}
				</div>
				<div class="col main-container w-100">
					${e}
				</div>
			</div>
		</div>
	`}function Qe(n){return n=="active"?'<span class="badge badge-success">Online</span>':'<span class="badge badge-warning">Offline</span>'}function Xe(n){return n=="enabled"?'<span class="badge badge-success">Enabled</span>':'<span class="badge badge-primary">Disabled</span>'}function Ze(n){let e=new Date(n.replace(" ","T")),a=Math.floor((new Date-e)/1e3);if(a<60)return"less than a minute ago";let s=Math.floor(a/60),i=Math.floor(s/60),o=Math.floor(i/24);if(s<60)return`${s} minute${s!==1?"s":""} ago`;if(i<24){let r=s%60;return`${i} hour${i!==1?"s":""} ${r} minute${r!==1?"s":""} ago`}return`${o} day${o!==1?"s":""} ago`}function et(n){let e=new Date(n.replace(" ","T")),t=new Date,a=new Date(t.getFullYear(),t.getMonth(),t.getDate()),s=new Date(e.getFullYear(),e.getMonth(),e.getDate()),i=Math.floor((a-s)/864e5),o=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0");if(i===0)return`Today at ${o}:${r}`;if(i===1)return`Yesterday at ${o}:${r}`;let c=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return`${e.getDate()} ${c[e.getMonth()]} ${e.getFullYear()} at ${o}:${r}`}function tt(){return`
		<div class="circle-loader">
			<i class="ph-bold ph-spinner normalize"></i>
			Loading
		</div>
	`}function at(){return`
		<div class="empty-here">
			<div class="icon"><i class="ph ph-placeholder normalize"></i></div>
			<p class="text-msg">It's empty here yet</p>
		</div>
	`}var de={template:{sidebarNav:ze,table:Ve,createElement:le,createAlert:Je,mainTemplate:Ke,connectionStatusBadge:Qe,toogleStateBadge:Xe,circleLoaderHTML:tt,emptyHereHTML:at},unification:{deviceFieldsUnification:We,timeAgo:Ze,formatDate:et},states:{btnLoadingState:Ye,cardScriptActionLoadingState:Ge}};var C=class{constructor(e){this.core=e}actions_list(e){return this.core.api_get("/api/v1/scripts/actions/list",(t,a,s)=>{var i;if(a&&a.status&&a.data&&a.data.scripts)for(let o of a.data.scripts){let r=(i=o==null?void 0:o.id)!=null?i:o.alias;DataProvider.setRaw(`actions_scripts.${r}`,o)}return e(t,a,s)})}scopes_list(e){return this.core.api_get("/api/v1/scripts/scopes/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.scopes)for(let i of a.data.scopes)DataProvider.setRaw(`scopes.${i.name}`,i);return e(t,a,s)})}regular_list(e){return this.core.api_get("/api/v1/scripts/regular/list",(t,a,s)=>{var i;if(a&&a.status&&a.data&&a.data.scripts)for(let o of a.data.scripts){let r=(i=o==null?void 0:o.id)!=null?i:o.alias;DataProvider.setRaw(`regular_scripts.${r}`,o)}return e(t,a,s)})}scope_get_by_filename(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}`,t,{})}scope_create(e,t){return this.core.api_post("/api/v1/scripts/scopes/new",e,t)}scope_update(e,t){return this.core.api_post("/api/v1/scripts/scopes/update",e,t)}action_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${a}/enable`,t)}action_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${a}/disable`,t)}regular_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${a}/enable`,t)}regular_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${a}/disable`,t)}scope_enable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/enable`,t)}scope_disable(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/disable`,t)}scope_remove(e,t){let a=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${a}/remove`,t)}run(e,t){return this.core.api_post("/api/v1/scripts/actions/run",e,t)}place_in_area(e,t){return this.core.api_post("/api/v1/scripts/place-in-area",e,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/scripts/id/${a}/unassign-from-area`,t)}};var O=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/devices/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i of a.data.devices)DataProvider.setRaw(`devices.${i.id}`,i);return e(t,a,s)})}scanning_setup(e){return this.core.api_get("/api/v1/devices/scanning/setup",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i in a.data.devices)DataProvider.setRaw(`scanning.setup.devices.${i}`,a.data.devices[i]);return e(t,a,s)})}scanning_all(e){return this.core.api_get("/api/v1/devices/scanning/all",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.devices)for(let i in a.data.devices)DataProvider.setRaw(`scanning.devices.${i}`,a.data.devices[i]);return e(t,a,s)})}setup_new_device(e,t){return this.core.api_post("/api/v1/devices/setup/new-device",e,t)}info(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/info`,t)}get(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}`,t)}status(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/status`,t)}action(e,t){return this.core.api_post("/api/v1/devices/action",e,t)}remove(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/remove`,t)}reboot(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/reboot`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/devices/place-in-area",e,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${a}/unassign-from-area`,t)}update_name(e,t){return this.core.api_post("/api/v1/devices/update-name",e,t)}update_description(e,t){return this.core.api_post("/api/v1/devices/update-description",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/devices/update-alias",e,t)}resetup(e,t){return this.core.api_post("/api/v1/devices/resetup",e,t)}reset(e,t){return this.core.api_post("/api/v1/devices/reset",e,t)}};var k=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/areas/list",(t,a,s)=>{if(a&&a.status&&a.data&&a.data.areas)for(let i of a.data.areas)DataProvider.setRaw(`areas.${i.id}`,i);return e(t,a,s)})}inner_list(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/list`,t)}new_area(e,t){return this.core.api_post("/api/v1/areas/new-area",e,t)}remove(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/remove`,t)}place_in_area(e,t){return this.core.api_post("/api/v1/areas/place-in-area",e,t)}update_display_name(e,t){return this.core.api_post("/api/v1/areas/update-display-name",e,t)}update_alias(e,t){return this.core.api_post("/api/v1/areas/update-alias",e,t)}devices(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/devices`,t)}scripts(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/scripts`,t)}unassign_from_area(e,t){let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/unassign-from-area`,t)}types_list(e){return this.core.api_get("/api/v1/areas/types/list",e)}reboot_devices(e,t){if(e==null)return this.core.api_get("/api/v1/areas/reboot_devices",t);let a=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${a}/reboot_devices`,t)}};function ue(n){if(!n||typeof n!="object")return"";let e=new URLSearchParams;Object.entries(n).forEach(([a,s])=>{s!=null&&e.append(a,String(s))});let t=e.toString();return t?`?${t}`:""}function nt(n,e){let t=String(n||"").replace(/\/+$/,""),a=String(e||"").replace(/^\/+/,"");return`${t}/${a}`}function st(n){try{return{ok:!0,data:JSON.parse(n)}}catch(e){return{ok:!1,error:e}}}var I=class{constructor(e){this.base_url=(e==null?void 0:e.base_url)||"",this.token=(e==null?void 0:e.token)||"",this.timeout_ms=Number.isFinite(e==null?void 0:e.timeout_ms)?e.timeout_ms:15e3,this.default_headers=(e==null?void 0:e.default_headers)||{},this.on_unauthorized=typeof(e==null?void 0:e.on_unauthorized)=="function"?e.on_unauthorized:null,this.proxy_path=(e==null?void 0:e.proxy_path)||"",this.scripts=new C(this),this.devices=new O(this),this.areas=new k(this)}set_base_url(e){this.base_url=e||""}set_token(e){this.token=e||""}set_proxy_path(e){this.proxy_path=e||""}_wrap_path(e,t){if(!this.proxy_path)return t?`${e}${ue(t)}`:e;let a=v({path:e},t||{});return`${this.proxy_path}${ue(a)}`}request(e,t,a,s,i){let o=typeof s=="function"?s:()=>{},r=nt(this.base_url,t),c=new AbortController,l=Number.isFinite(i==null?void 0:i.timeout_ms)?i.timeout_ms:this.timeout_ms,d=setTimeout(()=>c.abort(),l),u=v(v({},this.default_headers),(i==null?void 0:i.headers)||{});this.token&&(u.Authorization=`Bearer ${this.token}`);let p;a!=null&&(u["Content-Type"]="application/json",p=JSON.stringify(a)),fetch(r,{method:e,headers:u,body:p,signal:c.signal}).then(m=>ie(this,null,function*(){clearTimeout(d);let g={url:r,method:e,status_code:m.status,headers:m.headers},b=yield m.text(),P=st(b),S=P.ok?P.data:b;if(!m.ok){let E={type:"http_error",message:`HTTP ${m.status}`,status_code:m.status,raw:S};if((m.status===401||m.status===403)&&this.on_unauthorized)try{this.on_unauthorized({error:E,meta:g})}catch(te){}return o(E,null,g)}if(P.ok&&S&&typeof S=="object"){let E=S.status;if(E===!1||E==="error"){let te={type:"api_error",message:S.message||"API error",status_code:m.status,raw:S,field:S.field};return o(te,null,g)}}return o(null,S,g)})).catch(m=>{clearTimeout(d);let b=m&&(m.name==="AbortError"||String(m).includes("AbortError"))?{type:"timeout",message:`Timeout after ${l}ms`}:{type:"network_error",message:(m==null?void 0:m.message)||"Network error",details:m};return o(b,null,{url:r,method:e,status_code:0,headers:null})})}get(e,t,a){return this.request("GET",e,null,t,a)}post(e,t,a,s){return this.request("POST",e,t,a,s)}api_get(e,t,a,s){return this.get(this._wrap_path(e,a),t,s)}api_post(e,t,a,s,i){return this.post(this._wrap_path(e,s),t,a,i)}};function N(n){return Helper.template.sidebarNav([{content:'<span class="list-label"><i class="ph ph-cpu"></i> Devices</span>',route:"/#!/devices",is_active:n=="devices"},{content:'<span class="list-label"><i class="ph ph-magnifying-glass"></i> Scanning</span>',route:"/#!/devices/scanning",is_active:n=="scanning"}])}function w(n,e,t){Helper.states.btnLoadingState(e,!0);let a=e.dataset.deviceId,s=e.dataset.deviceName,i=e.dataset.deviceAlias;n.devices.reboot(a,(o,r,c)=>{Helper.states.btnLoadingState(e,!1),console.log("Reboot done",o,r,c),t==null||t.close(),r?(setTimeout(()=>Screens.reinit(),8e3),Toasts.createSuccess("Reboot successful",`Device: ${s}<br>
					Alias: <b>${i}</b>`).show()):Toasts.createError("Reboot failed",`Device: ${s}<br>
					Alias: <b>${i}</b>`).show()})}var f,U,pe,_,x,A,B={area:"areas",device:"devices",action:"scripts"};function z(){let n=f.querySelector(".current-area");for(let e of pe)if(e.id==_)return n.innerHTML=`${e.display_name}`;n.innerHTML=`Area ID ${_}`,ct()}function it(n){x[B[A]].unassign_from_area(n,(e,t,a)=>{if(console.log(`sh_api[${B[A]}].unassign_from_area`,e,t,a),!t||t.data.status)return Toasts.createError("Error of unassigning",t?t.data.error_alias:"Error of request").show();_=0,z(),V(),Toasts.createSuccess("Successfully unassigning","Successfully unassigning").show(),Screens.reinit()})}function rt(n,e){n[B[A]].place_in_area(e,(t,a,s)=>{if(console.log("sh_api.areas.place_in_area",t,a,s),!a||!a.status)return console.error("Component placeInArea",t,a,s);let i=f.querySelector(".current-area");Toasts.createSuccess("Successfully applied","Successfully applied").show(),_=e.place_in_area_id,z(),V(),Screens.reinit(),console.log("Success",a)})}function ot(n,e){x.areas.list((t,a,s)=>{if(console.log("sh_api.areas.list",t,a,s),!a)return console.error("sh_api.areas.list",t);pe=a.data.areas,z();let i={};for(let r of a.data.areas)A=="area"&&r.id==n||(i[r.id]=r.display_name);let o=advancedSelect(f.querySelector(".select-area"),i,"Nothing found");f.querySelector(".advanced-select-container").append(o),o.advancedSelect.addEventListener("changed",r=>{e(r,a.data.areas)}),U.innerHTML="",U.append(f)})}function V(){let n=f.querySelector(".form-container");n.classList.remove("a-show"),n.classList.add("a-hide"),setTimeout(()=>n.classList.remove("a-hide"),300)}function ct(){let n=f.querySelector(".remove-parent-id");_==0?n.classList.add("d-none"):n.classList.remove("d-none")}function L(n,e,t,a,s){x=n,U=e,_=s,A=t,f=document.createElement("div"),f.classList.add("component"),f.classList.add("place-in-area-component"),f.innerHTML=`
		<span class="current-area"></span>
		<button class="btn-icon without-hover remove-parent-id"><i class="ph ph-backspace"></i></button>
		<button class="btn btn-primary with-icon show-place-in-area">
			<i class="ph ph-map-pin-line"></i>
			Place In Area
		</button>
		<div class="block form-group form-container">
			<button class="btn-icon hide-place-in-area">
				<i class="ph ph-x"></i>
			</button>
			<label class="label">
				Select Area
				<i class="ph ph-magnifying-glass"></i>
				<input type="text" class="input select-area" placeholder="Search">
			</label>
			<div class="advanced-select-container"></div>
		</div>
	`,ot(a,(o,r)=>{let c=o.advancedSelect.value();if(!c.isOption)return;let l=Object.keys(c.option)[0];rt(x,{target_id:a,place_in_area_id:l})});let i=f.querySelector(".form-container");f.querySelector("button.show-place-in-area").addEventListener("click",o=>{i.classList.contains("a-show")?(i.classList.remove("a-show"),i.classList.add("a-hide"),setTimeout(()=>i.classList.remove("a-hide"),300)):i.classList.add("a-show")}),f.querySelector("button.hide-place-in-area").addEventListener("click",o=>{V()}),f.querySelector("button.remove-parent-id").addEventListener("click",o=>{it(a)})}var me={relay:(n,e)=>{let t="";for(let a of e.channels){let s=a.state=="off"?"OFF":"ON",i=a.state=="on"?"badge-success":"",o=e.channels.length>1?`${a.id}:`:"";t+=`
				<span class="badge ${i}">${o}<b>${s}</b></span>
			`}return`<div class="channels f-grid g-2">${t}</div>`},button:(n,e)=>{let t={enabled:"badge-success",disabled:"",mute:"badge-primary-outline",waiting:"badge-warning",error:"badge-error"},a="";for(let s of e.channels)a+=`
				<span class="badge ${t[s.indicator]}">${s.id}:<b>${s.indicator}</b></span>
			`;return`<div class="channels f-grid g-2">${a}</div>`},sensor:(n,e)=>{let t=d=>{switch(d){case"increasing":return'<i class="ph ph-caret-up"></i>';case"decreasing":return'<i class="ph ph-caret-down"></i>'}return""},a=e.sensors.radar.presence?`<i class="ph ph-user-square"></i>${e.sensors.radar.activity_score}${t(e.sensors.radar.activity_score_dynamics)}`:'<i class="ph ph-square"></i>',s=e.sensors.temperature.current+"\xB0C"+t(e.sensors.temperature.dynamics),i=e.sensors.humidity.current+"%"+t(e.sensors.humidity.dynamics),o=e.sensors.pressure.current+"hpa"+t(e.sensors.pressure.dynamics),r=e.sensors.light.percent+"%",c=e.sensors.microphone.current_noise+"dBi"+t(e.sensors.microphone.noise_dynamics);return`<div class="channels f-grid g-2">${`
			<span class="badge badge-primary">${a}</span>
			<span class="badge badge-primary"><i class="ph ph-thermometer"></i>${s}</span>
			<span class="badge badge-primary"><i class="ph ph-drop-half-bottom"></i>${i}</span>
			<span class="badge badge-primary">${o}</span>
			<span class="badge badge-primary"><i class="ph ph-lightbulb"></i>${r}</span>
			<span class="badge badge-primary"><i class="ph ph-ear"></i>${c}</span>
		`}</div>`},hatch:(n,e)=>`<div class="channels f-grid g-2">${e.hatch.state.indexOf("open")!=-1?`<span class="badge badge-warning">${e.hatch.state} - ${e.hatch.position_pct}%</span>`:`<span class="badge badge-primary">${e.hatch.state}</span>`}</div>`};function lt(n){n.addEventListener("click",e=>{e.currentTarget.deviceStateComponent.create()})}function dt(n,e,t){return typeof me[n]!="undefined"?me[n](e,t):"Unknown device type<br>"+JSON.stringify(t)}function y(n,e,t){let a=Helper.template.createElement("div",{class:"component device-state-component"},"");return a.deviceStateComponent={create:()=>{a.innerHTML=Helper.template.circleLoaderHTML(),n.devices.status(e,(s,i,o)=>{if(console.log("sh_api.devices.status",s,i),!i)return a.innerHTML=`
						<span class="badge badge-error"><i class="ph ph-warning-octagon fs-lg normalize"></i> Loading Error</span>
					`,console.error("deviceStateComponent",`DeviceID ${e}`);a.innerHTML=dt(t,i.data.device.alias,i.data.device.device_response),lt(a)})}},a.deviceStateComponent.create(),a}function ut(n,e,t){let a=[{payloadFieldName:"name",selector:".display-name",methName:"update_name",originalValue:e.name,isMultiString:!1},{payloadFieldName:"description",selector:".description",methName:"update_description",originalValue:e.description,isMultiString:!0},{payloadFieldName:"new_alias",selector:".alias",methName:"update_alias",originalValue:e.alias,isMultiString:!1}];for(let s of a){let i=editableString(t.querySelector(s.selector));i.editableString.onChange(o=>{let r={device_id:e.id};r[s.payloadFieldName]=o.value,n.devices[s.methName](r,(c,l,d)=>{var u,p,m;if(c||!l||!l.status)return console.error(`sh_api.devices.${s.methName}`,c),i.editableString.setValue(s.originalValue),Toasts.createError((u=c==null?void 0:c.message)!=null?u:"Error updating",(m=(p=c.raw)==null?void 0:p.msg)!=null?m:`Error of ${s.payloadFieldName} updating`).show();l.status==!0&&Screens.reinit()})})}}function R(n,e){return console.log(n),Modals.create("device-popup",{title:`Device ${n.name}`,body:t=>{var o;let a={area_id:"place-in-area-component-container",ip:"device-ip",state:"state-container",name:"display-name",description:"description",alias:"alias-view-container"},s=(r,c)=>{let l={ip:"<code>{{value}}</code>",status:d=>`<span class="badge ${{active:"badge-success",removed:"badge-error",freezed:"badge-warning"}[d]}">${d}</span>`,connection_status:d=>`<span class="badge ${d=="active"?"badge-success":"badge-warning"}">${d}</span>`,mac:"<code>{{value}}</code>",alias:'<i class="ph ph-link-simple-break"></i> <span class="alias">{{value}}</span>',device_id:"<code>{{value}}</code>",last_contact:d=>Helper.unification.timeAgo(d),create_at:d=>Helper.unification.formatDate(d),update_at:d=>Helper.unification.formatDate(d)};return l[r]?typeof l[r]=="function"?l[r](c):l[r].replaceAll("{{value}}",c):c},i="";for(let r in n){let c=(o=a[r])!=null?o:"";i+=`
					<tr class="table-row">
						<th>${r}: </th>
						<td class="${c}">${s(r,n[r])}</td>
					</tr>
				`}return`
				<div class="block">
					<table class="table" style="border: 0">
						<tbody class="table-body">
							${i}
						</tbody>
					</table>
				</div>
			`},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-warning with-icon"},'<i class="ph ph-arrow-clockwise"></i> Reboot'),i=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},'<i class="ph ph-trash"></i> Remove'),o=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},'<i class="ph ph-gear"></i> ReSetup'),r=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},'<i class="ph ph-x"></i> Reset');return a.addEventListener("click",c=>{t.close()}),s.dataset.deviceId=n.id,s.dataset.deviceName=n.name,s.dataset.deviceAlias=n.alias,s.addEventListener("click",c=>{s.getAttribute("disabled")||w(e,c.currentTarget,t)}),i.addEventListener("click",c=>{i.getAttribute("disabled")||(Helper.states.btnLoadingState(i,!0),confirmPopup("Are you sure you want to remove this device?",()=>{e.devices.remove(n.id,(l,d,u)=>{Helper.states.btnLoadingState(i,!1),console.log("Was removed"),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",`
										Device: ${n.name}<br>
										Alias: <b>${n.alias}</b><br>
										IP: <b>${n.ip}</b>
										`).show()},300)})},()=>{Helper.states.btnLoadingState(i,!1),console.log("CANCELED")}))}),o.dataset.deviceId=n.id,o.addEventListener("click",c=>{let l=o.dataset.deviceId;Helper.states.btnLoadingState(o,!0),confirmPopup("Are you sure you want to repeat setup device?",()=>{e.devices.resetup({device_id:l},(d,u,p)=>{Helper.states.btnLoadingState(o,!1),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Success",`
									Device Id: ${n.name}<br>
									Alias: <b>${n.alias}</b>
									`).show()},300)})},()=>{Helper.states.btnLoadingState(o,!1),console.log("CANCELED")})}),r.dataset.deviceId=n.id,r.addEventListener("click",c=>{let l=r.dataset.deviceId;Helper.states.btnLoadingState(r,!0),confirmPopup("Are you sure you want to RESET device?",()=>{e.devices.reset({device_id:l},(d,u,p)=>{Helper.states.btnLoadingState(r,!1),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Success",`Device Id: ${n.name}<br>
									Alias: <b>${n.alias}</b>`).show()},300)})},()=>{Helper.states.btnLoadingState(r,!1)})}),[a,o,s,r,i]},onready:t=>{L(e,t.querySelector(".place-in-area-component-container"),"device",n.id,n.area_id),t.querySelector(".state-container").append(y(e,n.id,n.type)),ut(e,n,t)}})}function pt(n){let e=[];for(let t of n.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceName:t.name,alias:t.alias,connectionStatus:Helper.template.connectionStatusBadge(t.connection_status),state:`<div 
				class="device-state-container" 
				data-device-id="${t.id}"
				data-device-type="${t.type}"
			></div>`,ip:`<code class="code">${t.ip}</code>`,actions:`
				<div class="f-grid g-2">
					<button 
						class="btn btn-secondary btn-small details-btn" 
						data-device='${JSON.stringify(t)}'
						type="button"
					>Details</button>

					<button 
						class="btn btn-warning btn-small reboot-btn" 
						data-device-id="${t.id}" 
						data-device-name="${t.name}" 
						data-device-alias="${t.alias}" 
						type="button"
					>Reboot</button>
				</div>
			`});return e}function mt(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",connectionStatus:"Connect",state:"State",ip:"IP",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> devices</span>`)}function ft(n,e){n.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",a=>{a.currentTarget.getAttribute("disabled")||w(e,a.currentTarget)})}),n.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",a=>{let s=v({state:""},JSON.parse(a.currentTarget.dataset.device));R(s,e).show()})})}function fe(n){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(N("devices")),initer:e=>{try{n.devices.list((t,a,s)=>{if(t||!a||s.status_code!=200)throw"Err";mt(e,pt(a.data),a.data.total),ft(e,n),e.currentScreen.DOMObject.querySelectorAll(".device-state-container").forEach(i=>{i.append(y(n,i.dataset.deviceId,i.dataset.deviceType))}),e.ready()})}catch(t){return console.error("sh_api.devices.list",t),e.error("Server API ERROR","")}}}}function be(n,e){return n=Helper.unification.deviceFieldsUnification(n),Modals.create("device-setup",{title:`Setup new device ${n.ip}`,body:t=>{let a="";for(let i in n)i[0]!="_"&&(a+=`
					<tr class="table-row">
						<th>${i}: </th>
						<td>${n[i]}</td>
					</tr>
				`);return`
				<div class="row g-6">
					<div class="col device-info">
						${`
				<div class="block">
					<table class="table" style="border: 0">
						<tbody class="table-body">
							${a}
						</tbody>
					</table>
				</div>
			`}
					</div>

					<div class="col setup-form w-100">
						<div class="block form-group">
							<label class="label">
								Device alias
								<i class="ph ph-asterisk"></i>
								<input type="text" name="alias" class="input" placeholder="Input alias">
							</label>
						</div>

						<div class="block form-group">
							<label class="label">
								Device name
								<i class="ph ph-asterisk"></i>
								<input type="text" name="name" class="input" placeholder="Input name">
							</label>
						</div>

						<div class="block form-group">
							<label class="label">
								About device
								<i class="ph ph-note-pencil"></i>
								<textarea class="input" name="description" placeholder="Input description"></textarea>
							</label>
						</div>

						<div class="alert-container"></div>
					</div>
				</div>
			`},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Cancel");a.addEventListener("click",i=>{t.close()});let s=Helper.template.createElement("button",{class:"btn btn-success with-icon"},'<i class="ph ph-gear"></i> Setup');return s.addEventListener("click",i=>{if(i.currentTarget.getAttribute("disabled"))return!1;let o={device_ip:n.ip},r=document.querySelector("#device-setup .setup-form");if(r.querySelectorAll("input[type='text']").forEach(d=>{d.dispatchEvent(new Event("input",{bubbles:!0}))}),r.querySelectorAll(".label.error").length)return!1;let c=r.querySelectorAll("input"),l=r.querySelector("textarea");for(let d of c)o[d.getAttribute("name")]=d.value;o[l.getAttribute("name")]=l.value,Helper.states.btnLoadingState(s,!0),e.devices.setup_new_device(o,(d,u,p)=>{var m,g;if(Helper.states.btnLoadingState(s,!1),(d==null?void 0:d.type)=="api_error"){if(console.error("ERR! sh_api.devices.setup_new_device",d.raw),(m=d.raw)!=null&&m.failed_fields)for(let b of d.raw.failed_fields)t.querySelector(`[name="${b}"]`).parentNode.classList.add("error");if((g=d.raw)!=null&&g.msg){let b=t.querySelector(".setup-form .alert-container");b.innerHTML="",b==null||b.append(Helper.template.createAlert("error",d.raw.msg))}return!1}if(!u)return!1;c.forEach(b=>b.value=""),l.value="",t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Setup successful",`Added new device <b>ID ${n.device_id}</b>`).show()},300)})}),[a,s]},onready:t=>{t.querySelector(".setup-form").querySelectorAll("input").forEach(s=>{s.addEventListener("input",i=>{var o;i.currentTarget.value.length?(i.currentTarget.parentNode.classList.remove("error"),(o=i.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||o.remove()):(i.currentTarget.parentNode.classList.add("error"),i.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||i.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},'<i class="ph ph-warning-circle"></i> Field cannot be empty')))})})}})}function bt(n){let e=[];for(let t of n.devices)t=Helper.unification.deviceFieldsUnification(t),e.push({deviceId:t.device_id,deviceName:t.name,deviceType:t.type,status:`<span class="badge badge-primary">${t.status}</span>`,ip:`<code class="code">${t.ip}</code>`,mac:`<code class="code">${t.mac}</code>`,wifiSignal:t.wifi_signal,actions:t.status=="setup"?`
				<button 
					class="btn btn-secondary btn-small setup-btn" 
					data-device='${JSON.stringify(t)}'
					type="button"
				>Setup</button>
			`:""});return e}function vt(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Found devices",{deviceId:"Device ID",deviceName:"Device name",deviceType:"Type",status:"Status",ip:"IP",mac:"Mac",wifiSignal:"Signal",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> devices</span>`)}function ht(n,e){n.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",a=>{let s=JSON.parse(a.currentTarget.dataset.device);be(s,e).show()})})}function ve(n){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(N("scanning")),initer:e=>{n.devices.scanning_all((t,a,s)=>{if(console.log("sh_api.devices.scanning_all",t,a),s.status_code!=200)return e.error("Server API ERROR","");vt(e,bt(a.data),a.data.devices.length),ht(e,n),e.ready()})}}}var J={list:fe,scanning:ve};function $(n){return Helper.template.sidebarNav([{content:'<span class="list-label"><i class="ph ph-cpu"></i> Scopes</span>',route:"/#!/scripts/scopes",is_active:n=="scopes"},{content:'<span class="list-label"><i class="ph ph-play"></i> Actions</span>',route:"/#!/scripts/actions",is_active:n=="actions"},{content:'<span class="list-label"><i class="ph ph-magnifying-glass"></i> Regular</span>',route:"/#!/scripts/regular",is_active:n=="regular"}])}function W(n,e,t){n.scripts.run({alias:e,params:{}},(a,s,i)=>{s?(t(!0),setTimeout(()=>Screens.reinit(),1e3),setTimeout(()=>Toasts.createSuccess(`${e} running`,`<b>${e}</b> running success`).show(),300)):(t(!1),setTimeout(()=>Toasts.createError(`${e} failed`,`<b>${e}</b> running failed`).show(),300))})}function Y(n){return`
		<div 
			class="card device-action card-${n.state=="enabled"?"primary":"warning"} script-action" 
			data-alias="${n.alias}"
		>
			<span class="card-title">${n.name} 
				<button 
					class="btn-icon without-hover action-details-btn" 
					data-alias='${n.alias}'
				>
					<i class="ph ph-dots-three-vertical"></i>
				</button>
			</span>

			<div class="card-content">
				<div class="device-icon-container">
					<div class="device-icon">
						${n.icon}
					</div>
				</div>

				<div class="device-name mb-2">${n.description}</div>
			</div>
		</div>
	`}function G(n,e){e.querySelector(".card-content").addEventListener("click",t=>{if(e.getAttribute("disabled"))return;Helper.states.cardScriptActionLoadingState(e,!0);let a=e.dataset.alias;W(n,a,s=>{Helper.states.cardScriptActionLoadingState(e,!1),s&&(e.classList.add("card-success"),setTimeout(()=>e.classList.remove("card-success"),1e3))})})}function he(n,e){let t=document.createElement("div");t.innerHTML=Y(e);let a=t.querySelector(".card");return G(n,a),a}function gt(n){let e=[];for(let t of n.scopes){let a=t.state=="disabled"?`<button 
					class="btn btn-success btn-small change-state-btn" 
					data-scope='${JSON.stringify(t)}'
					type="button"
					data-value="enable"
				>Enable</button>`:`<button 
					class="btn btn-warning btn-small change-state-btn" 
					data-scope='${JSON.stringify(t)}'
					type="button"
					data-value="disable"
				>Disable</button>`;e.push({name:t.name,filename:`${t.filename}<br><code><small>${t.path}</small></code>`,state:Helper.template.toogleStateBadge(t.state),actions:`
				${a}
			`})}return e}function St(n,e,t){n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Scopes list",{name:"Scope name",filename:"Filename",state:"State",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> scopes</span>`)}function yt(n,e){n.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",a=>{let s=a.currentTarget;if(s.getAttribute("disabled"))return;let i=s.dataset.value=="enable"?"scope_enable":"scope_disable",o=JSON.parse(s.dataset.scope);Helper.states.btnLoadingState(s,!0),e.scripts[i](o.name,(r,c,l)=>{Helper.states.btnLoadingState(s,!1),c?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of <b>${o.name}</b> was changed`).show()):Toasts.createError("Request failed","Scope state not changed").show()})})})}function ge(n){return{title:"Scripts Scopes",alias:"scripts-scopes",renderer:()=>Helper.template.mainTemplate($("scopes")),initer:e=>{n.scripts.scopes_list((t,a,s)=>{if(console.log("sh_api.scripts.scopes_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");St(e,gt(a.data),a.data.total),yt(e,n),e.ready()})}}}function wt(n){let e=[];for(let t of n.scripts){let a=t.state=="disabled"?`<button 
					class="btn btn-success btn-small change-state-btn" 
					data-alias='${t.alias}'
					type="button"
					data-value="enable"
				>Enable</button>`:`<button 
					class="btn btn-warning btn-small change-state-btn" 
					data-alias='${t.alias}'
					type="button"
					data-value="disable"
				>Disable</button>`;e.push({alias:`${t.alias}<br><small class="text-muted">by ${t.created_by}</small>`,name:`${t.name}<div class="mt-1"><small>${t.description}</small></div>`,filename:`${t.filename}<br><code><small>${t.path}</small></code>`,state:Helper.template.toogleStateBadge(t.state),actions:`
				${a}
			`})}return e}function _t(n,e,t){let a={};for(let s in e)a[e[s].alias]=e[s],e[s].code="";n.currentScreen.DOMObject.provideSciptsData=a,n.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"State",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> scripts</span>`)}function Lt(n,e){n.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",a=>{var r;let s=a.currentTarget;if(s.getAttribute("disabled"))return;let i=s.dataset.value=="enable"?"regular_enable":"regular_disable",o=(r=n.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?r:{alias:s.dataset.alias};Helper.states.btnLoadingState(s,!0),e.scripts[i](o.alias,(c,l,d)=>{Helper.states.btnLoadingState(s,!1),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of <b>${o.alias}</b> was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function Se(n){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate($("regular")),initer:e=>{n.scripts.regular_list((t,a,s)=>{if(console.log("sh_api.scripts.regular_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");_t(e,wt(a.data),a.data.total),Lt(e,n),e.ready()})}}}function ye(n,e){return console.log("actionDetailsPopup",n),Modals.create("action-script-popup",{title:`${n.name}`,body:t=>{let a=n.area_id!=-1?'<div class="mt-8 mb-8 place-in-area-component-container"></div>':"";return`
				<div class="block">
					<div class="row g-4">
						<div class="col script-info w-100">
							<h4 class="alias"><i class="ph ph-link-simple-break normalize"></i> <code>${n.alias}</code></h4>
							<div class="description mt-3">${n.description}</div>
							<div class="state mt-10">${Helper.template.toogleStateBadge(n.state)}</div>
							${a}
							<div class="filename mt-4"><i class="ph ph-file-code normalize"></i> ${n.filename}</div>
							<div class="author mt-4 text-muted"><i class="ph ph-user normalize"></i> By ${n.author}</div>
						</div>
						<div class="col script-code w-200">
							<div class="script-code-view">
								<pre><code class="language-php code-viewer fs-xs">${n.code}</code></pre>
							</div>
						</div>
					</div>
				</div>
			`},actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:n.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":n.state=="enabled"?"disable":"enable"},n.state=="enabled"?"Disable":"Enable"),i=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},'<i class="ph ph-play"></i> Run');return a.addEventListener("click",o=>{t.close()}),s.addEventListener("click",o=>{let r=o.currentTarget;if(r.getAttribute("disabled"))return;let c=r.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(r,!0),e.scripts[c](n.alias,(l,d,u)=>{Helper.states.btnLoadingState(r,!1),t.close(),d?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of <b>${n.alias}</b> was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),i.addEventListener("click",o=>{let r=o.currentTarget;Helper.states.btnLoadingState(r,!0),W(e,n.alias,c=>{Helper.states.btnLoadingState(r,!1),c&&t.close()})}),[a,s,i]},onready:t=>{L(e,t.querySelector(".place-in-area-component-container"),"action",n.id,n.area_id),hljs.highlightElement(t.querySelector(".code-viewer"))}})}function K(n){var t,a,s;let e=[];for(let i of n.scripts)e.push({alias:i.alias,author:i.created_by,name:i.name,icon:(t=i.icon)!=null?t:'<i class="ph ph-play"></i>',description:i.description,filename:`${i.filename}<br><code><small>${i.path}</small></code>`,state:i.state,code:i.code,id:(a=i.id)!=null?a:0,area_id:(s=i.area_id)!=null?s:-1});return e}function $t(n,e,t){let a='<div class="f-grid g-5 w-100">',s={};for(let o of e)s[o.alias]=o,a+=Y(o);a+="</div>";let i=n.currentScreen.DOMObject.querySelector(".main-container");i.innerHTML=a,n.currentScreen.DOMObject.provideSciptsData=s}function Et(n,e){n.currentScreen.DOMObject.querySelectorAll(".script-action").forEach(t=>{G(e,t)}),n.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",a=>{var o;let s=a.currentTarget,i=(o=n.currentScreen.DOMObject.provideSciptsData[s.dataset.alias])!=null?o:{};console.log("SCRIPT",i),ye(i,e).show()})})}function we(n){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate($("actions")),initer:e=>{n.scripts.actions_list((t,a,s)=>{if(console.log("sh_api.scripts.actions_list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");$t(e,K(a.data),a.data.total),Et(e,n),e.ready()})}}}var j={scopes:ge,regular:Se,actions:we};function _e(n){return Helper.template.sidebarNav([{content:'<span class="list-label"><i class="ph ph-tree-structure"></i> Areas Tree</span>',route:"/#!/areas/tree",is_active:n=="areas-tree"}])}function Le(n,e){return console.log("areaDevicesModal",n),Modals.create("area-devices-modal",{title:`<i class="ph ph-map-trifold normalize"></i> ${n.display_name}`,body:t=>`
				<div class="loader"></div>
				<div class="devices-container h-100"></div>
			`,actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),s=Helper.template.createElement("button",{class:"btn btn-warning with-icon btn-reboot-all"},'<i class="ph ph-arrow-clockwise"></i> Reboot All');return a.addEventListener("click",i=>{t.close()}),s.addEventListener("click",i=>{s.getAttribute("disabled")||(Helper.states.btnLoadingState(s,!0),confirmPopup(`Are you sure you want to reboot all devices from <b>${n.display_name}</b>?`,()=>{e.areas.reboot_devices(n.id,(o,r,c)=>{Helper.states.btnLoadingState(s,!1),r?(console.log("Was rebooted all devices"),Toasts.createSuccess("Rebooted all devices",`Area: <b>${n.display_name}</b>`).show()):Toasts.createDanger("Rebooted fail",`Area: <b>${n.display_name}</b>`).show()})},()=>{Helper.states.btnLoadingState(s,!1),console.log("CANCELED")}))}),[a,s]},onready:t=>{let a=t.querySelector(".devices-container"),s=t.querySelector(".loader");e.areas.devices(n.id,(i,o,r)=>{console.log("sh_api.areas.devices",o);function c(d){if(!d)return[];let u=[];for(let p of d.devices)p=Helper.unification.deviceFieldsUnification(p),u.push({deviceNaming:`
								<div class="device-name">${p.name}</div>
								<div class="device-alias mt-2 text-muted"><i class="ph ph-link-simple-break normalize"></i> ${p.alias}</div>
							`,status:Helper.template.connectionStatusBadge(p.connection_status),state:`<div 
									class="device-state-container"
									data-device-id="${p.id}"
									data-device-type="${p.type}"
								></div>
							`,actions:`
							<div class="f-grid g-2">
								<button 
									class="btn btn-secondary btn-small details-btn" 
									data-device='${JSON.stringify(p)}'
									type="button"
								>Details</button>

								<button 
									class="btn btn-warning btn-small reboot-btn" 
									data-device-id="${p.id}" 
									data-device-name="${p.name}" 
									data-device-alias="${p.alias}" 
									type="button"
								>Reboot</button>
							</div>
							`});return u}let l=c(o==null?void 0:o.data);l.length?a.innerHTML=Helper.template.table("",{deviceNaming:"Device",status:"Status",state:"State",actions:"Actions"},l,`<span class="table-meta">Total: <span class="total">${l.length}</span> devices</span>`):(a.innerHTML=Helper.template.emptyHereHTML(),t.querySelector(".btn-reboot-all").remove()),a.querySelectorAll(".reboot-btn").forEach(d=>{d.addEventListener("click",u=>{d.getAttribute("disabled")||w(e,u.currentTarget,t)})}),a.querySelectorAll(".device-state-container").forEach(d=>{d.append(y(e,d.dataset.deviceId,d.dataset.deviceType))}),a.querySelectorAll(".details-btn").forEach(d=>{d.addEventListener("click",u=>{let p=v({status:""},JSON.parse(u.currentTarget.dataset.device));R(p,e).show()})}),s.remove(),console.log("devices",l)})}})}function $e(n,e){return console.log("areaActionsModal",n),Modals.create("area-actions-modal",{title:`<i class="ph ph-map-trifold normalize"></i> ${n.display_name}`,body:t=>`
				<div class="loader"></div>
				<div class="actions-container f-grid g-4 h-100">
				</div>
			`,actions:t=>{let a=Helper.template.createElement("button",{class:"btn btn-primary"},"Close");return a.addEventListener("click",s=>{t.close()}),[a]},onready:t=>{let a=t.querySelector(".actions-container"),s=t.querySelector(".loader");e.areas.scripts(n.id,(i,o,r)=>{if(console.log("sh_api.areas.scripts",i,o,r),!o)return Toasts.createDanger("Loading failed",`Area: <b>${n.display_name}</b>`).show();let c=K(o.data);console.log("ACTIONS",c),a.innerHTML="",c.length||(a.innerHTML=Helper.template.emptyHereHTML()),s.remove();for(let l of c)a.append(he(e,l))})}})}function Ee(n){return console.log("createNewAreaModal"),Modals.create("create-area-modal",{title:'<i class="ph ph-plus normalize"></i> Create new Area',body:e=>`
				<div class="create-area-form">
					<div class="block form-group">
						<label class="label">
							Type
							<input type="text" class="input" name="type" placeholder="Input Area Type">
						</label>
						<div class="advanced-select-container"></div>
					</div>

					<div class="block form-group">
						<label class="label">
							Alias
							<i class="ph ph-link-simple-break"></i>
							<input type="text" class="input" name="alias" placeholder="Input Area Alias">
						</label>
					</div>

					<div class="block form-group">
						<label class="label">
							Display Name
							<i class="ph ph-tag"></i>
							<input type="text" class="input" name="display_name" placeholder="Input Display Name">
						</label>
					</div>

					<div class="alert-container"></div>
				</div>
			`,actions:e=>{let t=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),a=Helper.template.createElement("button",{class:"btn btn-success with-icon"},'<i class="ph ph-plus"></i> Create');return t.addEventListener("click",s=>{e.close()}),a.addEventListener("click",s=>{let i=e.querySelector(".create-area-form");if(i.querySelectorAll("input[type='text']").forEach(c=>{c.dispatchEvent(new Event("input",{bubbles:!0}))}),i.querySelectorAll(".label.error").length)return!1;let o=i.querySelectorAll("input"),r={};for(let c of o)r[c.getAttribute("name")]=c.value;Helper.states.btnLoadingState(a,!0),n.areas.new_area(r,(c,l,d)=>{var u,p;if(Helper.states.btnLoadingState(a,!1),(c==null?void 0:c.type)=="api_error"){if(console.error("ERR! sh_api.areas.new_area",c.raw),(u=c.raw)!=null&&u.failed_fields)for(let m of c.raw.failed_fields)e.querySelector(`[name="${m}"]`).parentNode.classList.add("error");if((p=c.raw)!=null&&p.msg){let m=e.querySelector(".alert-container");m.innerHTML="",m==null||m.append(Helper.template.createAlert("error",c.raw.msg))}return!1}if(!l)return!1;o.forEach(m=>m.value=""),e.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Creating successful",`Added new area <b>ID ${r.alias}</b>`).show()},300)})}),[t,a]},onready:e=>{let t=e.querySelector(".create-area-form");t.querySelectorAll(".input").forEach(a=>{a.addEventListener("input",s=>{var i;s.currentTarget.value.length?(s.currentTarget.parentNode.classList.remove("error"),(i=s.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||i.remove()):(s.currentTarget.parentNode.classList.add("error"),s.currentTarget.parentNode.parentNode.querySelector(".input-info.error")||s.currentTarget.parentNode.parentNode.append(Helper.template.createElement("div",{class:"input-info error"},'<i class="ph ph-warning-circle"></i> Field cannot be empty')))})}),n.areas.types_list((a,s,i)=>{console.log("sh_api.areas.types_list",a,s,i),s||console.error("Request Error. sh_api.areas.types_list()");let o={};for(let r of s.data.types)o[r]=r;t.querySelector(".advanced-select-container").append(advancedSelect(t.querySelector('[name="type"]'),o,"Will be created"))})}})}function Tt(n,e,t){let a=[{payloadFieldName:"display_name",selector:".display-name",methName:"update_display_name",originalValue:e.display_name,isMultiString:!1},{payloadFieldName:"new_alias",selector:".alias",methName:"update_alias",originalValue:e.alias,isMultiString:!1}];for(let s of a){let i=editableString(t.querySelector(s.selector));i.editableString.onChange(o=>{let r={area_id:e.id};r[s.payloadFieldName]=o.value,n.areas[s.methName](r,(c,l,d)=>{var u,p,m;if(c||!l||!l.status)return console.error(`sh_api.areas.${s.methName}`,c),i.editableString.setValue(s.originalValue),Toasts.createError((u=c==null?void 0:c.message)!=null?u:"Error updating",(m=(p=c.raw)==null?void 0:p.msg)!=null?m:`Error of ${s.payloadFieldName} updating`).show();l.status==!0&&Screens.reinit()})})}}function Te(n,e){var t;return n=(t=Screens.currentScreen.DOMObject.provideData[n.id])!=null?t:n,console.log("areaDetailsModal",n),Modals.create("area-details-modal",{title:`<i class="ph ph-map-trifold normalize"></i> ${n.display_name}`,body:a=>{var c;let s=n,i={parent_id:"place-in-area-container",display_name:"display-name",alias:"alias-view-container"},o=(l,d)=>{let u={alias:'<i class="ph ph-link-simple-break"></i> <span class="alias">{{value}}</span>',create_at:p=>Helper.unification.formatDate(p),update_at:p=>Helper.unification.formatDate(p),schema:"<span class='text-mute'>Nothing yet</span>"};return u[l]?typeof u[l]=="function"?u[l](d):u[l].replaceAll("{{value}}",d):d},r="";for(let l in s){let d=(c=i[l])!=null?c:"";r+=`
					<tr class="table-row">
						<th>${l}: </th>
						<td class="${d}">${o(l,s[l])}</td>
					</tr>
				`}return`
				<table class="table" style="border: 0">
					<tbody class="table-body">
						${r}
					</tbody>
				</table>
			`},actions:a=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),i=Helper.template.createElement("button",{class:"btn btn-danger with-icon"},'<i class="ph ph-trash"></i> Remove');return s.addEventListener("click",o=>{a.close()}),i.addEventListener("click",o=>{Helper.states.btnLoadingState(i,!0),confirmPopup(`Are you sure you want to remove this area? <b>${n.display_name}</b>`,()=>{e.areas.remove(n.id,(r,c,l)=>{Helper.states.btnLoadingState(i,!1),console.log("Was removed"),a.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",`Area: ${n.display_name}`).show()},300)})},()=>{Helper.states.btnLoadingState(i,!1),console.log("CANCELED")})}),[s,i]},onready:a=>{L(e,a.querySelector(".place-in-area-container"),"area",n.id,n.parent_id),Tt(e,n,a)}})}function Ht(n){let e=n.areas,t={},a=[];for(let s of e)t[s.id]=se(v({},s),{children:[]});for(let s of e){let i=t[s.id];s.parent_id&&t[s.parent_id]?t[s.parent_id].children.push(i):a.push(i)}return a}function At(n){return Ht(n)}function He(n,e){var s,i;e=e!=null?e:0;let t=(s=n.children)!=null&&s.length?"":"is-single",a=`
		<div class="branch lvl-${e} ${t}" data-lvl="${e}">
			<button class="btn-icon without-hover show-childs">
				<i class="ph ph-caret-right"></i>
			</button>
			<div class="branch-container">
				<div class="branch-info">
					<span class="title"><i class="ph ph-map-trifold normalize"></i> ${n.display_name}</span>
					[
					<span class="text-muted area-type">${n.type}</span>
					<span><i class="ph ph-link-simple-break normalize"></i> ${n.alias}</span>
					]
				</div>

				<div class="row g-4">
					<button 
						class="btn btn-accent btn-small with-icon actions"
						data-area-id="${n.id}"
						data-area-name="${n.display_name}"
					><i class="ph ph-brackets-curly"></i> Actions</button>
					<button 
						class="btn btn-accent btn-small with-icon devices" 
						data-area-id="${n.id}"
						data-area-name="${n.display_name}"
					><i class="ph ph-cpu"></i> Devices</button>
					<button 
						class="btn btn-small btn-primary details"
						data-area-id="${n.id}"
						data-area-name="${n.display_name}"
						data-parent-id="${n.parent_id}"
					>Details</button>
				</div>
			</div>
		</div>
	`;if((i=n.children)!=null&&i.length)for(let o of n.children)a+=He(o,e+1);return a}function Dt(n,e){console.log("TREE",e);let t='<div class="tree">';for(let a of e)t+=He(a);t+="</div>",n.currentScreen.DOMObject.querySelector(".main-container .tree-container").innerHTML=t}function Mt(n,e){n.currentScreen.DOMObject.querySelectorAll(".btn.devices").forEach(t=>{t.addEventListener("click",a=>{Le({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName},e).show()})}),n.currentScreen.DOMObject.querySelectorAll(".btn.actions").forEach(t=>{t.addEventListener("click",a=>{$e({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName},e).show()})}),n.currentScreen.DOMObject.querySelectorAll(".btn.details").forEach(t=>{t.addEventListener("click",a=>{Te({id:a.currentTarget.dataset.areaId,display_name:a.currentTarget.dataset.areaName,parent_id:a.currentTarget.dataset.parentId},e).show()})}),n.currentScreen.DOMObject.querySelectorAll("button.show-childs").forEach(t=>{t.addEventListener("click",a=>{let s=a.currentTarget,i=s.parentNode,o=parseInt(i.dataset.lvl);if(s.classList.contains("opened")){s.classList.remove("opened");let r=i.nextElementSibling;for(;r;){let c=parseInt(r.dataset.lvl);if(c==o||c<o)break;c==o+1&&r.classList.remove("a-show"),r=r.nextElementSibling}}else{s.classList.add("opened");let r=i.nextElementSibling;for(;r;){let c=parseInt(r.dataset.lvl);if(c==o||c<o)break;c==o+1&&r.classList.add("a-show"),r=r.nextElementSibling}}})}),n.ready()}function Ae(n){return{title:"Areas Tree",alias:"areas-tree",renderer:()=>Helper.template.mainTemplate(_e("areas-tree"),`<div class="top-bar">
					<div class="row g-4">
						<div class="col">
							<h3 class="title">Areas Tree</h3>
						</div>
						<div class="col">
							<button class="btn btn-primary with-icon create-new-area-modal">
								<i class="ph ph-plus"></i>
								Create
							</button>
						</div>
					</div>
				</div>
				<div class="mt-6 tree-container"></div>
				`),initer:e=>{n.areas.list((t,a,s)=>{if(console.log("sh_api.areas.list",t,a,s),s.status_code!=200)return e.error("Server API ERROR","");if(e.currentScreen.DOMObject.provideData={},typeof a.data!="undefined"&&typeof a.data.areas!="undefined")for(let o of a.data.areas)e.currentScreen.DOMObject.provideData[o.id]=o;Dt(e,At(a.data)),Mt(e,n);let i=e.currentScreen.DOMObject.querySelector(".create-new-area-modal");i.classList.contains("inited")||(i.classList.add("inited"),i==null||i.addEventListener("click",o=>{Ee(n).show()})),e.ready()})}}}var De={areasTree:Ae};function Me(n,e){n.add("/",{alias:"home",renderer:()=>"",initer:t=>{document.location="/#!/areas/tree"}}),n.add("-",{alias:"not-found-screen",renderer:()=>'<div class="container"><h2 class="mt-4">404 NOT FOUND</h2></div>',initer:t=>{t.ready()}}),n.add("/devices",J.list(e)),n.add("/devices/scanning",J.scanning(e)),n.add("/scripts/scopes",j.scopes(e)),n.add("/scripts/regular",j.regular(e)),n.add("/scripts/actions",j.actions(e)),n.add("/areas/tree",De.areasTree(e))}function qt(n,e,t){return`
		<div class="modal" aria-hidden="true" id="${n}">
      <div class="modal-backdrop"></div>

      <div class="modal-panel" role="dialog" aria-modal="true" aria-labelledby="modal-title-basic">
        <header class="modal-header">
          <h4 class="modal-title" id="modal-title-basic">${e}</h4>
          <button class="btn-icon modal-close" type="button" aria-label="Close">\u2715</button>
        </header>

        <div class="modal-body"></div>
        <footer class="modal-footer">${t}</footer>
      </div>
    </div>
	`}function Ct(n,e){return n.show=function(){document.querySelector("body").append(n),setTimeout(()=>{n.classList.add("a-show")},10)},n.close=function(){n.classList.add("a-hide"),setTimeout(()=>{n.remove()},300)},n.querySelector(".modal-close").addEventListener("click",t=>{n.close()}),typeof e=="function"&&e(n),n}function Ot(n,e){let t=e.title||"",a=e.footer||"",s=document.createElement("div");s.innerHTML=qt(n,t,a);let i=s.childNodes[1],o=i.querySelector(".modal-body"),r=i.querySelector(".modal-footer");if(typeof e.actions=="function"){let c=e.actions(i);if(typeof c[0]=="object"){let l=document.createElement("div");l.classList.add("actions");for(let d of c)l.append(d);r.append(l)}}if(typeof e.body=="function"){let c=e.body(i);typeof c=="object"?o.append(c):typeof c=="string"&&(o.innerHTML=c)}return Ct(i,e==null?void 0:e.onready)}var qe={create:Ot};function Q(n,e,t){Modals.create("confirm-popup",{title:"Requires confirmation",body:a=>`
				<p>${n}</p>
			`,actions:a=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"NO"),i=Helper.template.createElement("button",{class:"btn btn-warning"},"YES");return s.addEventListener("click",o=>{a.close(),t()}),i.addEventListener("click",o=>{a.close(),e()}),[s,i]}}).show()}function Ce(n){let e=n.querySelector(".focus");if(!e)return;let t=n.getBoundingClientRect(),a=e.getBoundingClientRect();a.top<t.top?n.scrollTop-=t.top-a.top:a.bottom>t.bottom&&(n.scrollTop+=a.bottom-t.bottom)}function X(n){n.advancedSelect.optionsElements.length-n.querySelectorAll(".option.hide").length==0?n.advancedSelect.showState("not-found"):n.advancedSelect.showState("options")}function Z(n,e,t){let a=document.createElement("div");a.classList.add("advanced-select");let s="";for(let r in e)s+=`<div class="option" data-value="${r}" data-display-value="${e[r]}">${e[r]}</div>`;let i=`
		<div class="popup-options-container">
			<div class="not-found">${t}</div>
			<div class="options">${s}</div>
		</div>
	`;a.innerHTML=i;let o=(r,c)=>{for(let l in c)if(c[l]==r){let d={};return d[l]=c[l],d}return!1};return a.advancedSelect={isOpened:!1,options:e,eventsHandlers:{openList:[],closeList:[],selected:[],changed:[]},openList:()=>{a.advancedSelect.isOpened=!0,a.classList.add("a-show"),X(a),a.advancedSelect.dispatchEvent("openList")},closeList:()=>{a.advancedSelect.isOpened=!1,a.classList.remove("a-show"),X(a),a.advancedSelect.dispatchEvent("closeList")},showState:r=>{r=="options"?(a.querySelector(".options").classList.add("show"),a.querySelector(".not-found").classList.remove("show")):r=="not-found"&&(a.querySelector(".options").classList.remove("show"),a.querySelector(".not-found").classList.add("show"))},optionsElements:a.querySelectorAll(".option"),value:()=>{let r=o(n.value,e);return{inputValue:n.value,isOption:!!r,option:r}},addEventListener:(r,c)=>{if(typeof a.advancedSelect.eventsHandlers[r]!="undefined")return a.advancedSelect.eventsHandlers[r].push(c);console.error("Advanced Select component.","addEventListener()","Invalid event name")},dispatchEvent:r=>{if(typeof a.advancedSelect.eventsHandlers[r]=="undefined")return console.error("Advanced Select component.","dispatchEvent()","Invalid event name");for(let c of a.advancedSelect.eventsHandlers[r])c(a)}},n.setAttribute("autocomplete","nope"),n.advancedSelect={value:()=>a.advancedSelect.value()},n.addEventListener("focus",r=>{a.advancedSelect.openList()}),n.addEventListener("blur",r=>{setTimeout(()=>a.advancedSelect.closeList(),20)}),n.addEventListener("keydown",r=>{if(r.keyCode==38){let c=a.querySelector(".option.focus");if(c){c.classList.remove("focus");let l=c.previousElementSibling;for(;l&&l.classList.contains("hide");)l=l.previousElementSibling;l||(l=a.querySelector(".option:not(.hide)")),l.classList.add("focus")}else a.querySelector(".option:not(.hide):last-child").classList.add("focus");Ce(a)}else if(r.keyCode==40){let c=a.querySelector(".option.focus");if(c){c.classList.remove("focus");let l=c.nextElementSibling;for(;l&&l.classList.contains("hide");)l=l.nextElementSibling;l||(l=a.querySelector(".option:not(.hide)")),l.classList.add("focus")}else a.querySelector(".option:not(.hide)").classList.add("focus");Ce(a)}else if(r.keyCode==13){let c=a.querySelector(".option.focus");if(!c)return;n.value=c.dataset.displayValue,n.blur(),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0})),a.advancedSelect.dispatchEvent("selected")}}),n.addEventListener("input",r=>{var l;let c=r.currentTarget.value.toLowerCase();c==""?a.advancedSelect.optionsElements.forEach(d=>d.classList.remove("hide")):([...a.advancedSelect.optionsElements].filter(d=>d.dataset.displayValue.toLowerCase().indexOf(c)!=-1).forEach(d=>d.classList.remove("hide")),[...a.advancedSelect.optionsElements].filter(d=>d.dataset.displayValue.toLowerCase().indexOf(c)==-1).forEach(d=>d.classList.add("hide")),X(a),(l=a.querySelector(".option.focus"))==null||l.classList.remove("focus"))}),n.addEventListener("change",r=>{a.advancedSelect.dispatchEvent("changed")}),[...a.advancedSelect.optionsElements].forEach(r=>{r.addEventListener("click",c=>{n.value=c.currentTarget.dataset.displayValue,n.blur(),n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0})),a.advancedSelect.dispatchEvent("selected")})}),a}function kt(n,e){let t="Write something",a=e?`<textarea class="input" placeholder="${t}"></textarea>`:`<input type="text" class="input" placeholder="${t}">`;return`
		<div class="editable-string-content">
			<span class="editable-string">${n}</span>
			<button class="btn-icon without-hover edit-text-btn"><i class="ph ph-pencil-simple"></i></button>
		</div>
		<div class="editable-string-form d-none">
			<div class="form-group">
				<label class="label">
					${a}
				</label>
			</div>
			<button class="btn-icon without-hover apply-changes-btn"><i class="ph ph-check"></i></button>
			<button class="btn-icon without-hover cancel-changes-btn"><i class="ph ph-x"></i></button>
		</div>
	`}function ee(n,e){e=e!=null?e:!1;let t=n.innerHTML,a=Helper.template.createElement("div",{class:"component editable-string-component"},kt(t,e));n.innerHTML="",n.append(a);let s=a.querySelector(".edit-text-btn"),i=a.querySelector(".apply-changes-btn"),o=a.querySelector(".cancel-changes-btn"),r=a.querySelector(".editable-string-content"),c=a.querySelector(".editable-string"),l=a.querySelector(".editable-string-form"),d=a.querySelector(".input");return a.editableString={formIsDisplaying:!1,value:t,input:d,eventsHandlers:{onChange:[],onSwitch:[]},switch:()=>{a.formIsDisplaying?(l.classList.add("d-none"),r.classList.remove("d-none"),c.innerText=a.editableString.value):(l.classList.remove("d-none"),r.classList.add("d-none"),d.value=a.editableString.value),a.formIsDisplaying=!a.formIsDisplaying,a.editableString.runEventHandler("onSwitch")},setValue:u=>{a.editableString.value=u,d.value=u,c.innerText=u},apply:()=>{a.editableString.value=d.value,a.editableString.switch(),d.value!=t&&a.editableString.runEventHandler("onChange")},onChange:u=>{a.editableString.eventsHandlers.onChange.push(u)},onSwitch:u=>{a.editableString.eventsHandlers.onSwitch.push(u)},runEventHandler:u=>{a.editableString.eventsHandlers[u].forEach(p=>p(a.editableString))}},s.addEventListener("click",u=>{a.editableString.switch()}),o.addEventListener("click",u=>{a.editableString.switch()}),i.addEventListener("click",u=>{a.editableString.apply()}),d.addEventListener("keydown",u=>{u.keyCode==13&&(d.blur(),a.editableString.apply())}),a}document.addEventListener("DOMContentLoaded",n=>{console.log("App init"),document.location.hash.indexOf("#!/")==-1&&(document.location.hash="#!/"),window.DataProvider=new q,window.Toasts=ce,window.Helper=de,window.Modals=qe,window.confirmPopup=Q,window.advancedSelect=Z,window.editableString=ee,re();let e=new I({base_url:API_BASEURL,token:"YOUR_TOKEN",timeout_ms:1e4,on_unauthorized:({error:a})=>console.log("auth problem:",a),proxy_path:"/proxy.php"}),t=new M(".screens",".load-screen",".error-screen");Me(t,e),console.log(t.getScreens()),t.onSwitch((a,s)=>{F()}),t.onSwitch((a,s,i)=>{var o;document.querySelectorAll(".app .hud .navigation .nav-link[data-route].active").forEach(r=>r.classList.remove("active")),(o=document.querySelector(`.app .hud .navigation .nav-link[data-route="${i}"]`))==null||o.classList.add("active")}),t.routing(),window.Screens=t});})();
//# sourceMappingURL=main.js.map