(()=>{var se=Object.defineProperty;var N=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,ie=Object.prototype.propertyIsEnumerable;var x=(a,e,t)=>e in a?se(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,v=(a,e)=>{for(var t in e||(e={}))ne.call(e,t)&&x(a,t,e[t]);if(N)for(var t of N(e))ie.call(e,t)&&x(a,t,e[t]);return a};var j=(a,e,t)=>new Promise((s,n)=>{var i=c=>{try{o(t.next(c))}catch(l){n(l)}},r=c=>{try{o(t.throw(c))}catch(l){n(l)}},o=c=>c.done?s(c.value):Promise.resolve(c.value).then(i,r);o((t=t.apply(a,e)).next())});var b,y,P;function re(){b.dataset.navState="displayed",b.classList.remove("state-off"),b.classList.add("state-on"),y.classList.add("a-show")}function I(){b.dataset.navState="hidden",b.classList.remove("state-on"),b.classList.add("state-off"),y.classList.add("a-hide"),y.classList.remove("a-show"),setTimeout(()=>{y.classList.remove("a-hide")},300)}function U(){console.log("HUD init"),b=document.querySelector(".hud .nav-toggle"),y=document.querySelector(".hud .navigation"),P=document.querySelector(".hud .reload-screen"),b.addEventListener("click",a=>{a.currentTarget.dataset.navState!="displayed"?re():I()}),P.addEventListener("click",a=>{Screens.reload()})}var w=class{constructor(e,t,s){this.screens={},this.routesMap={},this.currentScreen=null,this.eventsHandlers={switch:[],reload:[],reinit:[]},this.screensContainer=document.querySelector(e),this.loader=document.querySelector(t),this.errorScreen=document.querySelector(s),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 s;if(this.runSwitchHandlers(e),this.hideErrorScreen(),this.showLoader(),(s=this.currentScreen)==null||s.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 s;(s=this.currentScreen)==null||s.DOMObject.remove(),this.errorScreen.querySelector(".error-title").innerHTML=e,this.errorScreen.querySelector(".error-text").innerHTML=t,this.showErrorScreen()}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)}runSwitchHandlers(e){for(let t of this.eventsHandlers.switch)t(this,e)}runReloadHandlers(e){for(let t of this.eventsHandlers.reload)t(this,e)}runReinitHandlers(){for(let e of this.eventsHandlers.reinit)e(this)}};function oe(a,e,t,s){return`
<div class="toast toast-${a}" role="alert">
<div class="toast-content">
<h4 class="toast-title">${e} ${t}</h4>
<p class="toast-text">${s}</p>
</div>
<button class="btn-icon toast-close" type="button" aria-label="Close">\u2715</button>
</div>
`}function ce(a,e){if(e!=null&&e.alone&&document.querySelectorAll(".toast").forEach(t=>t.close()),a.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},a.querySelector(".toast-close").addEventListener("click",t=>{a.close()}),a.show=function(){document.querySelector("body").append(a),setTimeout(()=>{a.classList.add("a-show")},10)},Screens.onSwitch((t,s)=>{setTimeout(()=>{a==null||a.close()},1e4)}),a.addEventListener("mouseover",t=>a.ishovered=!0),a.addEventListener("mouseout",t=>a.ishovered=!1),e!=null&&e.lifetime){console.log(e);let t=setInterval(()=>{a.ishovered||(a.close(),clearInterval(t))},e==null?void 0:e.lifetime)}return a}function _(a,e,t,s,n){let i=document.createElement("div");return i.innerHTML=oe(a,e,t,s),ce(i.childNodes[1],n)}function le(a,e,t){return typeof t=="undefined"&&(t={}),typeof t.lifetime=="undefined"&&(t.lifetime=4e3),typeof t.alone=="undefined"&&(t.alone=!0),_("success",'<i class="ph ph-check-circle"></i>',a,e,t)}function de(a,e,t){return _("info",'<i class="ph ph-info"></i>',a,e,t)}function ue(a,e,t){return _("warning",'<i class="ph ph-warning"></i>',a,e,t)}function F(a,e,t){return _("danger",'<i class="ph ph-warning-octagon"></i>',a,e,t)}var z={create:_,createInfo:de,createSuccess:le,createWarning:ue,createError:F,createDanger:F};function pe(a){let e="";for(let t of a){let s="",n="";t.route&&(s=`<a class="list-action" href="${t.route}">`,n="</a>"),e+=`
<li class="list-item ${t.is_active?"list-item-active":""}">
${s}${t.content}${n}
</li>
`}return`
<div class="sidebar block">
<ul class="list list-nav">
${e}
</ul>
</div>
`}function me(a,e,t,s){let n='<tr class="table-row">',i=0;for(let c in e)n+=`<th scope="col">${e[c]}</th>`,i++;n+="</tr>";let r="";for(let c of t){r+='<tr class="table-row">';for(let l in e)r+=`<td>${c[l]}</td>`;r+="</tr>"}let o="";return typeof s!="undefined"&&(o=`
<tfoot class="table-foot">
<tr class="table-row">
<td colspan="${i}">
${s}
</td>
</tr>
</tfoot>
`),`
<table class="table devices-lists">
<caption class="table-caption">${a}</caption>
<thead class="table-head">${n}</thead>
<tbody class="table-body">${r}</tbody>
${o}
</table>
`}function J(a,e,t){let s=document.createElement(a);for(let[n,i]of Object.entries(e))n==="class"?s.className=i:n==="dataset"?Object.assign(s.dataset,i):s.setAttribute(n,i);return s.innerHTML=typeof t!="undefined"?t:"",s}function fe(a,e){return["primary","success","secondary","info","warning","error","danger"].indexOf(a)<0?console.error("createAlert()","Error of type: "+a):J("div",{class:`alert alert-${a}`},e)}function be(a){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 s in a){if(typeof e[s]!="undefined"){t[e[s]]=a[s];continue}t[s]=a[s]}return t}function he(a,e){if((a==null?void 0:a.isLoading)==e)return!1;if(e)a.isLoading=!0,a.originalContent=a.innerHTML,a.classList.contains("with-icon")?a.originalWithIcon=!0:a.classList.add("with-icon"),a.classList.add("loading-state"),a.setAttribute("disabled","disabled"),a.innerHTML='<i class="ph-bold ph-spinner"></i> Loading';else{if(a.isLoading=!1,!a.originalContent)return!1;a.removeAttribute("disabled"),a.classList.remove("loading-state"),a.originalWithIcon||a.classList.remove("with-icon"),a.innerHTML=a.originalContent}return a}function ve(a,e){if((a==null?void 0:a.isLoading)==e)return!1;let t=a.querySelector(".device-icon");if(e)a.isLoading=!0,a.originalContent=t.innerHTML,a.classList.add("loading-state"),a.setAttribute("disabled","disabled"),t.innerHTML='<i class="ph-bold ph-spinner"></i>';else{if(a.isLoading=!1,!a.originalContent)return!1;a.removeAttribute("disabled"),a.classList.remove("loading-state"),t.innerHTML=a.originalContent}return a}function ge(a,e){return e=e!=null?e:"",`
<div class="container">
<div class="row g-6">
<div class="col sidebar-container">
${a}
</div>
<div class="col main-container w-100">
${e}
</div>
</div>
</div>
`}var B={template:{sidebarNav:pe,table:me,createElement:J,createAlert:fe,mainTemplate:ge},unification:{deviceFieldsUnification:be},states:{btnLoadingState:he,cardScriptActionLoadingState:ve}};var $=class{constructor(e){this.core=e}actions_list(e){return this.core.api_get("/api/v1/scripts/actions/list",e)}scopes_list(e){return this.core.api_get("/api/v1/scripts/scopes/list",e)}regular_list(e){return this.core.api_get("/api/v1/scripts/regular/list",e)}scope_get_by_filename(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}`,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 s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${s}/enable`,t)}action_disable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/actions/alias/${s}/disable`,t)}regular_enable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${s}/enable`,t)}regular_disable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/regular/alias/${s}/disable`,t)}scope_enable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}/enable`,t)}scope_disable(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}/disable`,t)}scope_remove(e,t){let s=encodeURIComponent(String(e||""));return this.core.api_get(`/api/v1/scripts/scopes/name/${s}/remove`,t)}run(e,t){return this.core.api_post("/api/v1/scripts/actions/run",e,t)}};var T=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/devices/list",e)}scanning_setup(e){return this.core.api_get("/api/v1/devices/scanning/setup",e)}scanning_all(e){return this.core.api_get("/api/v1/devices/scanning/all",e)}setup_new_device(e,t){return this.core.api_post("/api/v1/devices/setup/new-device",e,t)}info(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/info`,t)}get(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}`,t)}status(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/status`,t)}action(e,t){return this.core.api_post("/api/v1/devices/action",e,t)}remove(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/remove`,t)}reboot(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/devices/id/${s}/reboot`,t)}};var L=class{constructor(e){this.core=e}list(e){return this.core.api_get("/api/v1/areas/list",e)}inner_list(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/list`,t)}new_area(e,t){return this.core.api_post("/api/v1/areas/new-area",e,t)}remove(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/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 s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/devices`,t)}unassign_from_area(e,t){let s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/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 s=encodeURIComponent(String(e));return this.core.api_get(`/api/v1/areas/id/${s}/reboot_devices`,t)}};function W(a){if(!a||typeof a!="object")return"";let e=new URLSearchParams;Object.entries(a).forEach(([s,n])=>{n!=null&&e.append(s,String(n))});let t=e.toString();return t?`?${t}`:""}function Se(a,e){let t=String(a||"").replace(/\/+$/,""),s=String(e||"").replace(/^\/+/,"");return`${t}/${s}`}function ye(a){try{return{ok:!0,data:JSON.parse(a)}}catch(e){return{ok:!1,error:e}}}var E=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 $(this),this.devices=new T(this),this.areas=new L(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}${W(t)}`:e;let s=v({path:e},t||{});return`${this.proxy_path}${W(s)}`}request(e,t,s,n,i){let r=typeof n=="function"?n:()=>{},o=Se(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),h=v(v({},this.default_headers),(i==null?void 0:i.headers)||{});this.token&&(h.Authorization=`Bearer ${this.token}`);let M;s!=null&&(h["Content-Type"]="application/json",M=JSON.stringify(s)),fetch(o,{method:e,headers:h,body:M,signal:c.signal}).then(u=>j(this,null,function*(){clearTimeout(d);let m={url:o,method:e,status_code:u.status,headers:u.headers},p=yield u.text(),A=ye(p),f=A.ok?A.data:p;if(!u.ok){let S={type:"http_error",message:`HTTP ${u.status}`,status_code:u.status,raw:f};if((u.status===401||u.status===403)&&this.on_unauthorized)try{this.on_unauthorized({error:S,meta:m})}catch(C){}return r(S,null,m)}if(A.ok&&f&&typeof f=="object"){let S=f.status;if(S===!1||S==="error"){let C={type:"api_error",message:f.message||"API error",status_code:u.status,raw:f,field:f.field};return r(C,null,m)}}return r(null,f,m)})).catch(u=>{clearTimeout(d);let p=u&&(u.name==="AbortError"||String(u).includes("AbortError"))?{type:"timeout",message:`Timeout after ${l}ms`}:{type:"network_error",message:(u==null?void 0:u.message)||"Network error",details:u};return r(p,null,{url:o,method:e,status_code:0,headers:null})})}get(e,t,s){return this.request("GET",e,null,t,s)}post(e,t,s,n){return this.request("POST",e,t,s,n)}api_get(e,t,s,n){return this.get(this._wrap_path(e,s),t,n)}api_post(e,t,s,n,i){return this.post(this._wrap_path(e,n),t,s,i)}};function H(a){return Helper.template.sidebarNav([{content:'<span class="list-label"><i class="ph ph-cpu"></i> Devices</span>',route:"/#!/devices",is_active:a=="devices"},{content:'<span class="list-label"><i class="ph ph-magnifying-glass"></i> Scanning</span>',route:"/#!/devices/scanning",is_active:a=="scanning"},{content:'<span class="list-label"><i class="ph ph-play"></i> Actions</span>',route:"/#!/devices/actions",is_active:a=="actions"}])}function O(a,e,t){Helper.states.btnLoadingState(e,!0);let s=e.dataset.deviceId,n=e.dataset.deviceName,i=e.dataset.deviceAlias;a.devices.reboot(s,(r,o,c)=>{Helper.states.btnLoadingState(e,!1),console.log("Reboot done",r,o,c),t==null||t.close(),o?(setTimeout(()=>Screens.reinit(),8e3),Toasts.createSuccess("Reboot successful",`Device: ${n}<br>
Alias: <b>${i}</b>`).show()):Toasts.createError("Reboot failed",`Device: ${n}<br>
Alias: <b>${i}</b>`).show()})}function Y(a,e){return console.log(a),Modals.create("device-popup",{title:`Device ${a.name}`,body:t=>{let s="";for(let n in a)s+=`
<tr class="table-row">
<th>${n}: </th>
<td>${a[n]}</td>
</tr>
`;return`
<div class="block">
<table class="table" style="border: 0">
<tbody class="table-body">
${s}
</tbody>
</table>
</div>
`},actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),n=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');return s.addEventListener("click",r=>{t.close()}),n.dataset.deviceId=a.id,n.dataset.deviceName=a.name,n.dataset.deviceAlias=a.alias,n.addEventListener("click",r=>{n.getAttribute("disabled")||O(e,r.currentTarget,t)}),i.addEventListener("click",r=>{i.getAttribute("disabled")||(Helper.states.btnLoadingState(i,!0),confirmPopup("Are you sure you want to remove this device?",()=>{e.devices.remove(a.id,(o,c,l)=>{Helper.states.btnLoadingState(i,!1),console.log("Was removed"),t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Removed",`
Device: ${a.name}<br>
Alias: <b>${a.alias}</b><br>
IP: <b>${a.ip}</b>
`).show()},300)})},()=>{Helper.states.btnLoadingState(i,!1),console.log("CANCELED")}))}),[s,n,i]}})}function _e(a){let e=[];for(let t of a.devices){t=Helper.unification.deviceFieldsUnification(t);let s=t.connection_state=="active"?'<span class="badge badge-success">Online</span>':'<span class="badge badge-warning">Offline</span>';e.push({deviceName:t.name,alias:t.alias,status:s,ip:`<code class="code">${t.ip}</code>`,actions:`
<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>
`})}return e}function we(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Devices list",{deviceName:"Device name",alias:"Device alias",status:"Status",ip:"IP",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> devices</span>`)}function $e(a,e){a.currentScreen.DOMObject.querySelectorAll(".reboot-btn").forEach(t=>{t.addEventListener("click",s=>{s.currentTarget.getAttribute("disabled")||O(e,s.currentTarget)})}),a.currentScreen.DOMObject.querySelectorAll(".details-btn").forEach(t=>{t.addEventListener("click",s=>{let n=JSON.parse(s.currentTarget.dataset.device);Y(n,e).show()})})}function G(a){return{alias:"devices",renderer:()=>Helper.template.mainTemplate(H("devices")),initer:e=>{a.devices.list((t,s,n)=>{if(console.log("sh_api.devices.list",t,s,n),n.status_code!=200)return e.error("Server API ERROR","");we(e,_e(s.data),s.data.total),$e(e,a),e.ready()})}}}function K(a,e){return a=Helper.unification.deviceFieldsUnification(a),Modals.create("device-setup",{title:`Setup new device ${a.ip}`,body:t=>{let s="";for(let i in a)i[0]!="_"&&(s+=`
<tr class="table-row">
<th>${i}: </th>
<td>${a[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">
${s}
</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 s=Helper.template.createElement("button",{class:"btn btn-primary"},"Cancel");s.addEventListener("click",i=>{t.close()});let n=Helper.template.createElement("button",{class:"btn btn-success with-icon"},'<i class="ph ph-gear"></i> Setup');return n.addEventListener("click",i=>{if(i.currentTarget.getAttribute("disabled"))return!1;let r={device_ip:a.ip},o=document.querySelector("#device-setup .setup-form");if(o.querySelectorAll("input[type='text']").forEach(d=>{d.dispatchEvent(new Event("input",{bubbles:!0}))}),o.querySelectorAll(".label.error").length)return!1;let c=o.querySelectorAll("input"),l=o.querySelector("textarea");for(let d of c)r[d.getAttribute("name")]=d.value;r[l.getAttribute("name")]=l.value,Helper.states.btnLoadingState(n,!0),e.devices.setup_new_device(r,(d,h,M)=>{var u,m;if(Helper.states.btnLoadingState(n,!1),(d==null?void 0:d.type)=="api_error"){if(console.error("ERR! sh_api.devices.setup_new_device",d.raw),(u=d.raw)!=null&&u.failed_fields)for(let p of d.raw.failed_fields)t.querySelector(`[name="${p}"]`).parentNode.classList.add("error");if((m=d.raw)!=null&&m.msg){let p=t.querySelector(".setup-form .alert-container");p.innerHTML="",p==null||p.append(Helper.template.createAlert("error",d.raw.msg))}return!1}if(!h)return!1;c.forEach(p=>p.value=""),l.value="",t.close(),Screens.reinit(),setTimeout(()=>{Toasts.createSuccess("Setup successful",`Added new device <b>ID ${a.device_id}</b>`).show()},300)})}),[s,n]},onready:t=>{t.querySelector(".setup-form").querySelectorAll("input").forEach(n=>{n.addEventListener("input",i=>{var r;i.currentTarget.value.length?(i.currentTarget.parentNode.classList.remove("error"),(r=i.currentTarget.parentNode.parentNode.querySelector(".input-info.error"))==null||r.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 Te(a){let e=[];for(let t of a.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 Le(a,e,t){a.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 Ee(a,e){a.currentScreen.DOMObject.querySelectorAll(".setup-btn").forEach(t=>{t.addEventListener("click",s=>{let n=JSON.parse(s.currentTarget.dataset.device);K(n,e).show()})})}function Q(a){return{alias:"devices-scanning",renderer:()=>Helper.template.mainTemplate(H("scanning")),initer:e=>{a.devices.scanning_all((t,s,n)=>{if(console.log("sh_api.devices.scanning_all",t,s),n.status_code!=200)return e.error("Server API ERROR","");Le(e,Te(s.data),s.data.devices.length),Ee(e,a),e.ready()})}}}var k={list:G,scanning:Q};function g(a){return Helper.template.sidebarNav([{content:'<span class="list-label"><i class="ph ph-cpu"></i> Scopes</span>',route:"/#!/scripts/scopes",is_active:a=="scopes"},{content:'<span class="list-label"><i class="ph ph-play"></i> Actions</span>',route:"/#!/scripts/actions",is_active:a=="actions"},{content:'<span class="list-label"><i class="ph ph-magnifying-glass"></i> Regular</span>',route:"/#!/scripts/regular",is_active:a=="regular"}])}function D(a,e,t){a.scripts.run({alias:e,params:{}},(s,n,i)=>{n?(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 He(a){let e=[];for(let t of a.scopes){let s=t.state=="enabled"?'<span class="badge badge-success">Enabled</span>':'<span class="badge badge-primary">Disabled</span>',n=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:s,actions:`
${n}
`})}return e}function Oe(a,e,t){a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Scopes list",{name:"Scope name",filename:"Filename",state:"Status",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> scopes</span>`)}function De(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",s=>{let n=s.currentTarget;if(n.getAttribute("disabled"))return;let i=n.dataset.value=="enable"?"scope_enable":"scope_disable",r=JSON.parse(n.dataset.scope);Helper.states.btnLoadingState(n,!0),e.scripts[i](r.name,(o,c,l)=>{Helper.states.btnLoadingState(n,!1),c?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of <b>${r.name}</b> was changed`).show()):Toasts.createError("Request failed","Scope state not changed").show()})})})}function V(a){return{title:"Scripts Scopes",alias:"scripts-scopes",renderer:()=>Helper.template.mainTemplate(g("scopes")),initer:e=>{a.scripts.scopes_list((t,s,n)=>{if(console.log("sh_api.scripts.scopes_list",t,s,n),n.status_code!=200)return e.error("Server API ERROR","");Oe(e,He(s.data),s.data.total),De(e,a),e.ready()})}}}function Re(a){let e=[];for(let t of a.scripts){let s=t.state=="enabled"?'<span class="badge badge-success">Enabled</span>':'<span class="badge badge-primary">Disabled</span>',n=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:s,actions:`
${n}
`})}return e}function Me(a,e,t){let s={};for(let n in e)s[e[n].alias]=e[n],e[n].code="";a.currentScreen.DOMObject.provideSciptsData=s,a.currentScreen.DOMObject.querySelector(".main-container").innerHTML=Helper.template.table("Regular scripts list",{alias:"Alias",name:"Script name",filename:"Filename",state:"Status",actions:"Actions"},e,`<span class="table-meta">Total: <span class="total">${t}</span> scripts</span>`)}function Ae(a,e){a.currentScreen.DOMObject.querySelectorAll(".change-state-btn").forEach(t=>{t.addEventListener("click",s=>{var o;let n=s.currentTarget;if(n.getAttribute("disabled"))return;let i=n.dataset.value=="enable"?"regular_enable":"regular_disable",r=(o=a.currentScreen.DOMObject.provideSciptsData[n.dataset.alias])!=null?o:{};Helper.states.btnLoadingState(n,!0),e.scripts[i](r.alias,(c,l,d)=>{Helper.states.btnLoadingState(n,!1),l?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of <b>${r.alias}</b> was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})})})}function X(a){return{title:"Scripts Regular",alias:"scripts-regular",renderer:()=>Helper.template.mainTemplate(g("regular")),initer:e=>{a.scripts.regular_list((t,s,n)=>{if(console.log("sh_api.scripts.regular_list",t,s,n),n.status_code!=200)return e.error("Server API ERROR","");Me(e,Re(s.data),s.data.total),Ae(e,a),e.ready()})}}}function Z(a,e){return console.log("actionDetailsPopup",a),Modals.create("action-script-popup",{title:`${a.name}`,body:t=>{let s=a.state=="enabled"?"<span class='badge badge-success'>Enabled</span>":"<span class='badge badge-warning'>Disabled</span>";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>${a.alias}</code></h4>
<div class="description mt-3">${a.description}</div>
<div class="state mt-10">${s}</div>
<div class="filename mt-4"><i class="ph ph-file-code normalize"></i> ${a.filename}</div>
<div class="author mt-4 text-muted"><i class="ph ph-user normalize"></i> By ${a.author}</div>
</div>
<div class="col script-code w-200">
<div class="script-code-view">
<pre><code class="language-php code-viewer fs-xs">${a.code}</code></pre>
</div>
</div>
</div>
</div>
`},actions:t=>{let s=Helper.template.createElement("button",{class:"btn btn-primary"},"Close"),n=Helper.template.createElement("button",{class:a.state=="enabled"?"btn btn-warning":"btn btn-success","data-value":a.state=="enabled"?"disable":"enable"},a.state=="enabled"?"Disable":"Enable"),i=Helper.template.createElement("button",{class:"btn btn-secondary with-icon"},'<i class="ph ph-play"></i> Run');return s.addEventListener("click",r=>{t.close()}),n.addEventListener("click",r=>{let o=r.currentTarget;if(o.getAttribute("disabled"))return;let c=o.dataset.value=="enable"?"action_enable":"action_disable";Helper.states.btnLoadingState(o,!0),e.scripts[c](a.alias,(l,d,h)=>{Helper.states.btnLoadingState(o,!1),t.close(),d?(setTimeout(()=>Screens.reinit(),250),Toasts.createSuccess("Request Success",`State of <b>${a.alias}</b> was changed`).show()):Toasts.createError("Request failed","Regular script state not changed").show()})}),i.addEventListener("click",r=>{let o=r.currentTarget;Helper.states.btnLoadingState(o,!0),D(e,a.alias,c=>{Helper.states.btnLoadingState(o,!1),c&&t.close()})}),[s,n,i]},onready:t=>{hljs.highlightElement(t.querySelector(".code-viewer"))}})}function Ie(a){var t;let e=[];for(let s of a.scripts)e.push({alias:s.alias,author:s.created_by,name:s.name,icon:(t=s.icon)!=null?t:'<i class="ph ph-play"></i>',description:s.description,filename:`${s.filename}<br><code><small>${s.path}</small></code>`,state:s.state,code:s.code});return e}function ke(a,e,t){let s='<div class="f-grid g-5 w-100">',n={};for(let r of e){n[r.alias]=r;let o=r.state=="enabled"?"primary":"warning";s+=`
<div
class="card device-action card-${o} script-action"
data-alias="${r.alias}"
>
<span class="card-title">${r.name}
<button
class="btn-icon without-hover action-details-btn"
data-alias='${r.alias}'
>
<i class="ph ph-dots-three-vertical"></i>
</button>
</span>
<div class="card-content">
<div class="device-icon-container">
<div class="device-icon">
${r.icon}
</div>
</div>
<div class="device-name mb-2">${r.description}</div>
</div>
</div>
`}s+="</div>";let i=a.currentScreen.DOMObject.querySelector(".main-container");i.innerHTML=s,a.currentScreen.DOMObject.provideSciptsData=n}function qe(a,e){a.currentScreen.DOMObject.querySelectorAll(".script-action .card-content").forEach(t=>{t.addEventListener("click",s=>{let n=s.currentTarget.parentNode;if(n.getAttribute("disabled"))return;Helper.states.cardScriptActionLoadingState(n,!0);let i=n.dataset.alias;D(e,i,r=>{Helper.states.cardScriptActionLoadingState(n,!1),r&&(n.classList.add("card-success"),setTimeout(()=>n.classList.remove("card-success"),1e3))})})}),a.currentScreen.DOMObject.querySelectorAll(".action-details-btn").forEach(t=>{t.addEventListener("click",s=>{var r;let n=s.currentTarget,i=(r=a.currentScreen.DOMObject.provideSciptsData[n.dataset.alias])!=null?r:{};console.log("SCRIPT",i),Z(i,e).show()})})}function ee(a){return{title:"Scripts Actions",alias:"scripts-actions",renderer:()=>Helper.template.mainTemplate(g("actions")),initer:e=>{a.scripts.actions_list((t,s,n)=>{if(console.log("sh_api.scripts.regular_list",t,s,n),n.status_code!=200)return e.error("Server API ERROR","");ke(e,Ie(s.data),s.data.total),qe(e,a),e.ready()})}}}var R={scopes:V,regular:X,actions:ee};function te(a,e){a.add("/",{alias:"home",renderer:()=>'<h2 class="mt-4">Hello world</h2>',initer:t=>{setTimeout(()=>t.ready(),1e3),setTimeout(()=>t.error("Error","Just testing"),2e3)}}),a.add("-",{alias:"not-found-screen",renderer:()=>'<h2 class="mt-4">404 NOT FOUND</h2>',initer:t=>{t.ready()}}),a.add("/devices",k.list(e)),a.add("/devices/scanning",k.scanning(e)),a.add("/scripts/scopes",R.scopes(e)),a.add("/scripts/regular",R.regular(e)),a.add("/scripts/actions",R.actions(e))}function Ce(a,e,t){return`
<div class="modal" aria-hidden="true" id="${a}">
<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 Ne(a,e){return a.show=function(){document.querySelector("body").append(a),setTimeout(()=>{this.classList.add("a-show")},10)},a.close=function(){this.classList.add("a-hide"),setTimeout(()=>{this.remove()},300)},a.querySelector(".modal-close").addEventListener("click",t=>{a.close()}),typeof e=="function"&&e(a),a}function xe(a,e){let t=e.title||"",s=e.footer||"",n=document.createElement("div");n.innerHTML=Ce(a,t,s);let i=n.childNodes[1],r=i.querySelector(".modal-body"),o=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);o.append(l)}}if(typeof e.body=="function"){let c=e.body(i);typeof c=="object"?r.append(c):typeof c=="string"&&(r.innerHTML=c)}return Ne(i,e==null?void 0:e.onready)}var ae={create:xe};function q(a,e,t){Modals.create("confirm-popup",{title:"Requires confirmation",body:s=>`
<p>${a}</p>
`,actions:s=>{let n=Helper.template.createElement("button",{class:"btn btn-primary"},"NO"),i=Helper.template.createElement("button",{class:"btn btn-warning"},"YES");return n.addEventListener("click",r=>{s.close(),t()}),i.addEventListener("click",r=>{s.close(),e()}),[n,i]}}).show()}document.addEventListener("DOMContentLoaded",a=>{console.log("App init"),window.Toasts=z,window.Helper=B,window.Modals=ae,window.confirmPopup=q,U();let e=new E({base_url:"http://shswebclient.local",token:"YOUR_TOKEN",timeout_ms:3e3,on_unauthorized:({error:s})=>console.log("auth problem:",s),proxy_path:"/proxy.php"}),t=new w(".screens",".load-screen",".error-screen");te(t,e),console.log(t.getScreens()),t.onSwitch((s,n)=>{I()}),t.routing(),window.Screens=t});})();
//# sourceMappingURL=main.js.map