homebridge-config-ui-x
Version:
A web based management, configuration and control platform for Homebridge.
10 lines • 214 kB
JavaScript
import{b as Ri}from"./chunk-H3RDASOR.js";import{a as pt,b as He}from"./chunk-M2QUBULD.js";import{a as Pe,c as he,d as zn,g as Ut}from"./chunk-XQFJNVZN.js";import{a as Mi,b as Ti,c as Pi}from"./chunk-KZE2OTCD.js";import{a as Ii}from"./chunk-SGXHM7IT.js";import{a as Ei}from"./chunk-LKHNMMNU.js";import{a as Vi,b as $i}from"./chunk-COWEDMDX.js";import{a as xt,b as vt,c as yt}from"./chunk-YEMALHZS.js";import{a as Ze}from"./chunk-M5NPMQ5Y.js";import{a as ki}from"./chunk-XTCYYJPD.js";import{a as Bt}from"./chunk-AYSHSJRC.js";import{A as Ct,a as wi,c as Te,d as mt,e as gt,f as Ye,g as ut,h as _t,i as ft,j as xe,l as ht,m as Ue,n as bt}from"./chunk-SMGTZ45N.js";import{a as jn}from"./chunk-ANE4AW4B.js";import{a as Fn}from"./chunk-EOZQDUTB.js";import{a as Un}from"./chunk-T5DKW6NZ.js";import{a as Hn}from"./chunk-MUUSCRZD.js";import{a as Rn}from"./chunk-JOJEYCYX.js";import{a as qn}from"./chunk-UKY4BVMC.js";import{a as Se}from"./chunk-GAHGBZ7U.js";import{a as _i,e as ct,h as fi,i as hi,q as bi,r as Ci,s as Oe,t as je,u as Fe,v as xi,w as vi,x as yi,y as Bi,z as Si}from"./chunk-NAG4LCT2.js";import{a as In}from"./chunk-UNLSKRL2.js";import{a as Vn}from"./chunk-BSM4XIDD.js";import{a as $n}from"./chunk-O5RZ7ZOO.js";import{a as Dn}from"./chunk-AZGHSTIR.js";import{a as An}from"./chunk-NYZK4HSS.js";import{a as Nn}from"./chunk-D4J5AL5X.js";import{a as Ln}from"./chunk-H35CNDP7.js";import{a as On}from"./chunk-ME4WRCWH.js";import{a as Bn}from"./chunk-EA5VT3RQ.js";import{a as Sn}from"./chunk-NMMSSMCW.js";import{a as wn}from"./chunk-JP467WDP.js";import{a as kn}from"./chunk-CVXWKOFU.js";import{a as En}from"./chunk-FWJREO6L.js";import{a as Mn}from"./chunk-SD2RBU34.js";import{a as Tn}from"./chunk-HLDUJBLE.js";import{a as Pn}from"./chunk-MVRVLT3V.js";import{a as Ft,b as St,c as Ni,d as Li,e as Oi,f as ji,g as Fi,h as Ui,i as Hi,l as wt,m as kt,n as Et,o as Mt,p as Tt,q as Pt}from"./chunk-6RX3XE55.js";import{c as jt,l as Di,p as Ai}from"./chunk-YT56PAEY.js";import{a as qi}from"./chunk-D4MZIYO2.js";import{a as we}from"./chunk-I45OAEDK.js";import{a as Re}from"./chunk-T7RKA523.js";import{s as G,t as de}from"./chunk-2QHNXSQY.js";import{a as De}from"./chunk-VYTJCKZA.js";import{a as Me}from"./chunk-IL6HHVES.js";import{d as li}from"./chunk-LKBXKG4K.js";import{C as fe,D as ui,b as st,c as dt,e as ue,j as si,l as _e,n as di,o as ci,q as pi,t as Ae,u as Ne,w as Le,x as mi,y as gi}from"./chunk-BQZ376DP.js";import{b as W}from"./chunk-RFCSHRPV.js";import{f as ge}from"./chunk-3APJQTJL.js";import{$b as ce,$c as R,Aa as $e,Da as Xt,Ea as a,G as Ie,Gb as it,Hb as nt,Ib as ot,Kb as D,Lb as ti,Lc as oi,Mb as c,Nb as S,O as Lt,Ob as y,Pb as ve,Qa as K,Qb as at,Qc as ai,Ra as j,Ta as Qt,Tb as te,Ua as Yt,Ub as ie,Vb as ne,X as Ve,Xa as Ot,Yc as U,Zc as H,_b as se,aa as C,ab as I,ac as ii,bc as Xe,cb as _,cc as ni,cd as Be,d as Ce,da as me,db as f,dc as d,dd as q,ec as m,fa as w,fb as oe,fc as J,ga as k,gb as Y,hb as Z,ib as B,jb as r,kb as l,la as tt,lb as x,lc as ye,mb as $,nb as N,o as Je,ob as X,oc as rt,pb as Zt,pc as Qe,qa as v,qb as ei,qc as lt,ra as Kt,va as Jt,vb as T,wb as re,xb as M,yb as ae,za as le,zb as g}from"./chunk-LTGI3NYM.js";import{a as hn}from"./chunk-2PUJPDBO.js";import{a as bn}from"./chunk-FJZSMPXC.js";import{a as Cn}from"./chunk-BWI3GJO4.js";import{a as xn}from"./chunk-XW7PBNQZ.js";import{a as ri}from"./chunk-H5WYCQ4G.js";import{a as vn}from"./chunk-J4DRBL7E.js";import{a as yn}from"./chunk-ATJB7DUI.js";import{a as V,b as A,c as Gt,g as pe,h as E}from"./chunk-B4AJQJMI.js";var zi="plugins-list",qe=(()=>{class n{$api=C(q);$auth=C(li);$cache=C(Ei);get(){let e=this.$auth.user.admin?"/plugins?include=config":"/plugins";return this.$cache.get(zi,()=>this.$api.get(e))}invalidate(){this.$cache.invalidate(zi)}static \u0275fac=function(i){return new(i||n)};static \u0275prov=Ve({token:n,factory:n.\u0275fac,providedIn:"root"})}return n})();var We=pe(pt(),1);var Wi=(()=>{class n{host=C(Jt);jsonSchemaForm=C(St,{host:!0,self:!0,optional:!0});observer;patchingInProgress=!1;jsfPatch=Qe(!1);constructor(){let e=this.jsonSchemaForm;if(!e)return;let i=e.jsf.buildLayout.bind(e.jsf);e.jsf.buildLayout=t=>(i(t),e.jsf.formValues&&this.jsfPatch()?this.fixNestedArrayLayout(e.jsf.layout,e.jsf.formValues):e.jsf.layout)}ngAfterViewInit(){this.patchAccessibility();let e=!1;this.observer=new MutationObserver(i=>{if(!this.patchingInProgress){for(let t of i){let o=t.target;if(o?.closest&&(o.closest(".dropdown-menu")||o.closest("ngb-typeahead-window")||o.closest(".cdk-overlay-container")||o.closest('[role="listbox"]')))return}e||(e=!0,requestAnimationFrame(()=>{e=!1,this.patchAccessibility()}))}}),this.observer.observe(this.host.nativeElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class","aria-expanded"]})}ngOnDestroy(){this.observer?.disconnect(),this.observer=void 0}patchAccessibility(){if(this.patchingInProgress)return;this.patchingInProgress=!0;let e=this.host.nativeElement;this.patchExpandableFieldsetLegends(e),this.patchExpandableSectionLegends(e),this.patchDeleteButtons(e),this.patchCheckboxRadioDuplicateText(e),this.patchBasicControlNames(e),this.patchingInProgress=!1}patchExpandableFieldsetLegends(e){e.querySelectorAll("fieldset").forEach(t=>{let o=t,s=o.querySelector("legend");if(!s)return;let u=this.cleanSectionTitle((s.textContent||"").trim());if(!u)return;let b=s.querySelector("button")||s.querySelector("a")||s.querySelector('[data-bs-toggle="collapse"]')||s.querySelector("[aria-expanded]")||s,h=this.findCollapseBody(o,b),P=o.querySelector(":scope > button.jsf-fieldset-proxy");P||(P=document.createElement("button"),P.type="button",P.className="jsf-fieldset-proxy visually-hidden-focusable",o.insertBefore(P,o.firstChild),P.addEventListener("click",L=>{L.preventDefault(),b.click(),window.setTimeout(()=>{this.syncProxyExpanded(o,P,b,h)},0)}),P.addEventListener("keydown",L=>{(L.key==="Enter"||L.key===" ")&&(L.preventDefault(),P.click())})),P.textContent=u,P.setAttribute("role","button"),P.setAttribute("tabindex","0"),P.setAttribute("aria-label",u),P.removeAttribute("aria-describedby"),h?(h.id||(h.id=`jsf_collapse_${Math.random().toString(36).slice(2)}`),P.setAttribute("aria-controls",h.id)):P.removeAttribute("aria-controls"),o.setAttribute("role","presentation"),s.setAttribute("aria-hidden","true"),s.querySelectorAll("button, a, [tabindex]").forEach(L=>{L.setAttribute("tabindex","-1")}),this.syncProxyExpanded(o,P,b,h)})}syncProxyExpanded(e,i,t,o){let u=this.getExpandedState(e,o,t)?"true":"false";i.getAttribute("aria-expanded")!==u&&i.setAttribute("aria-expanded",u)}patchExpandableSectionLegends(e){e.querySelectorAll("section-widget").forEach(t=>{let o=t.querySelector(":scope > div");if(!o||!o.classList.contains("expandable")&&!o.classList.contains("expanded"))return;let s=o.querySelector(":scope > label.legend");if(!s)return;let u=this.cleanSectionTitle((s.textContent||"").trim());if(!u)return;let b=o.querySelector(":scope > root-widget"),h=o.querySelector(":scope > button.jsf-section-proxy");h||(h=document.createElement("button"),h.type="button",h.className="jsf-section-proxy visually-hidden-focusable",o.insertBefore(h,o.firstChild),h.addEventListener("click",P=>{P.preventDefault(),s.click(),window.setTimeout(()=>{this.syncSectionProxyExpanded(o,h,b)},0)}),h.addEventListener("keydown",P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),h.click())})),h.textContent=u,h.setAttribute("role","button"),h.setAttribute("tabindex","0"),h.setAttribute("aria-label",u),h.removeAttribute("aria-describedby"),b?(b.id||(b.id=`jsf_section_${Math.random().toString(36).slice(2)}`),h.setAttribute("aria-controls",b.id)):h.removeAttribute("aria-controls"),o.setAttribute("role","presentation"),s.setAttribute("aria-hidden","true"),s.querySelectorAll("button, a, [tabindex]").forEach(P=>{P.setAttribute("tabindex","-1")}),this.syncSectionProxyExpanded(o,h,b)})}syncSectionProxyExpanded(e,i,t){let s=this.getSectionExpandedState(e,t)?"true":"false";i.getAttribute("aria-expanded")!==s&&i.setAttribute("aria-expanded",s)}getSectionExpandedState(e,i){return e.classList.contains("expanded")?!0:e.classList.contains("expandable")&&!e.classList.contains("expanded")?!1:i?window.getComputedStyle(i).display!=="none":!0}findCollapseBody(e,i){if(i){let t=i.getAttribute("aria-controls");if(t){let s=document.getElementById(t);if(s)return s}let o=i.getAttribute("data-bs-target")||i.getAttribute("data-target");if(o&&o.startsWith("#")){let s=document.getElementById(o.slice(1));if(s)return s}}return e.querySelector(":scope .collapse")}getExpandedState(e,i,t){let o=t?.getAttribute("aria-expanded");return o==="true"?!0:o==="false"||t?.classList.contains("collapsed")?!1:i?i.classList.contains("show"):this.isFieldsetExpanded(e)}isFieldsetExpanded(e){let i=e.querySelectorAll("input, select, textarea, button, a");for(let t of i){let o=t;if(this.isVisiblyRendered(o)){if(o.tagName.toLowerCase()==="legend"||o.classList.contains("jsf-fieldset-proxy"))continue;return!0}}return!1}isVisiblyRendered(e){let i=window.getComputedStyle(e);return i.display==="none"||i.visibility==="hidden"||e.getAttribute("aria-hidden")==="true"?!1:e.getClientRects().length>0}patchDeleteButtons(e){e.querySelectorAll("button.btn-close").forEach(t=>{let o=t;if(o.hasAttribute("data-jsf-a11y-delete"))return;let s=this.findNearestItemName(o,e);o.setAttribute("aria-label",s?`Delete ${s}`:"Delete"),o.removeAttribute("title"),o.setAttribute("data-jsf-a11y-delete","true")})}findNearestItemName(e,i){let o=e.closest(".list-group-item")||e.closest(".card")||e.closest("li")||e.closest("fieldset")||e.parentElement||i,s=o.querySelector("legend");if(s){let b=this.cleanSectionTitle((s.textContent||"").trim());if(b)return b}let u=o.querySelector("h1, h2, h3, h4, h5, h6");if(u){let b=this.cleanSectionTitle((u.textContent||"").trim());if(b)return b}return""}cleanSectionTitle(e){let i=(e||"").replace(Bi,"").trim();return i=i.replace(Si,"").trim(),i.length>80&&(i=i.slice(0,80).trim()),i}patchCheckboxRadioDuplicateText(e){e.querySelectorAll("input").forEach(t=>{let o=t,s=(o.getAttribute("type")||"").toLowerCase();if(s!=="checkbox"&&s!=="radio"||o.hasAttribute("data-jsf-a11y-processed"))return;let u=o.id?e.querySelector(`label[for="${o.id}"]`):null,b=o.closest("label"),h=u||b,P=this.getLabelText(h);if(!P)return;this.hasExplicitA11yName(o)||o.setAttribute("aria-label",P),o.setAttribute("data-jsf-a11y-processed","true"),b&&b.contains(o)&&b.querySelectorAll("*").forEach(O=>{if(O===o||O.contains(o)||O.hasAttribute("data-jsf-a11y-hidden"))return;(O.classList.contains("hb-uix-slider")||O.classList.contains("hb-uix-round"))&&(O.setAttribute("aria-hidden","true"),O.setAttribute("data-jsf-a11y-hidden","true"))});let L=o.parentElement;if(L)for(let O=0;O<L.children.length;O+=1){let z=L.children[O];if(!(z instanceof HTMLElement)||z===o||h&&z===h||z.hasAttribute("data-jsf-a11y-hidden")||this.isInteractiveElement(z))continue;let et=(z.textContent||"").trim();et&&et===P&&(z.setAttribute("aria-hidden","true"),z.setAttribute("data-jsf-a11y-hidden","true"))}})}getLabelText(e){return e?(e.textContent||"").replace(hi," ").trim():""}hasExplicitA11yName(e){let i=e.getAttribute("aria-label");if(i&&i.trim())return!0;let t=e.getAttribute("aria-labelledby");if(t&&t.trim())return!0;let o=e.getAttribute("title");return!!(o&&o.trim())}isInteractiveElement(e){let i=e.tagName.toLowerCase();if(["a","button","input","select","textarea"].includes(i))return!0;let t=e.getAttribute("tabindex");if(t!==null&&Number.parseInt(t,10)>=0)return!0;let o=e.getAttribute("role");return o!=null&&["button","link","menuitem","tab","option"].includes(o)}patchBasicControlNames(e){e.querySelectorAll("input, select, textarea").forEach(t=>{let o=t;if(o instanceof HTMLInputElement){let u=(o.getAttribute("type")||"").toLowerCase();if(u==="checkbox"||u==="radio")return}if(o.hasAttribute("data-jsf-a11y-labeled"))return;if(this.hasExplicitA11yName(o)){o.setAttribute("data-jsf-a11y-labeled","true");return}let s="";if(o.id&&(s=(e.querySelector(`label[for="${o.id}"]`)?.textContent||"").trim()),!s){let u=o.closest("label");s=this.getLabelText(u)}s&&(o.setAttribute("aria-label",s),o.setAttribute("data-jsf-a11y-labeled","true"))})}fixNestedArrayLayout(e,i){return this.fixArray(e,i,""),e}fixArray(e,i,t){if(Array.isArray(e)){let o=e.filter(b=>b.name!=="_bridge"),s=o.filter(b=>b.items&&Array.isArray(b.items)).flatMap(b=>b.items).filter(b=>b.dataType==="array"||b.arrayItem);[...o,...s].filter(b=>b.dataType==="array"||b.arrayItem).forEach(b=>{this.fixNestedArray(b,i,t)})}else this.fixNestedArray(e,i,t)}fixNestedArray(e,i,t){if(e.items&&Array.isArray(e.items)){let o=e.items.find(s=>s.type==="$ref");if(o){let s=e.items.filter(h=>h.type==="section"||h.type==="div"),u=s.length>0?s.reduce((h,P)=>h.id>P.id?h:P):this.getItemTemplateFromRef(o),b=this.getDataFromPointer(i,o.dataPointer.replace(t,""));if(b===null)return;if(Array.isArray(b)){for(;e.items.length-1<b.length;){let h=jt(u);h._id=Ai("new_"),e.items.unshift(h)}b.forEach((h,P)=>{this.fixArray(e.items[P],h,o.dataPointer)})}else this.fixArray(e.items,i,o.dataPointer)}else this.fixArray(e.items,i,t);e.items.filter(s=>s.items&&Array.isArray(s.items)).forEach(s=>{this.fixArray(s.items,i,t)})}}getDataFromPointer(e,i){let t=e;return i.substring(1).split(fi).filter(o=>o!=="-").forEach(o=>{try{t=t[o]}catch(s){t=null}}),t}getItemTemplateFromRef(e){let i={type:"section",items:[]},t=jt(e);return Di(t,i),t}static \u0275fac=function(i){return new(i||n)};static \u0275dir=Qt({type:n,selectors:[["","jsfPatch",""]],inputs:{jsfPatch:[1,"jsfPatch"]}})}return n})();function Wn(n,p){if(n&1){let e=T();r(0,"json-schema-form",1),M("onChanges",function(t){w(e);let o=g();return k(o.onChanges(t))})("isValid",function(t){w(e);let o=g();return k(o.validChange(t))}),l()}if(n&2){let e=g();B("jsfPatch",e.configSchema().fixArrays)("options",e.jsonFormOptions)("schema",e.configSchema().schema)("UISchema",e.configSchema().uiSchema)("layout",e.configSchema().layout)("form",e.configSchema().form)("data",e.currentData())("language",e.language())}}var It=(()=>{class n{$settings=C(W);availableLanguages=["de","en","es","fr","it","pt","zh"];configSchema=Qe.required();data=Qe.required();dataChange=rt();dataChanged=rt();isValid=rt();currentData=v(null);language=v("en");jsonFormOptions={addSubmit:!1,loadExternalAssets:!1,returnEmptyFields:!1,setSchemaDefaults:!0,autocomplete:!1};lastValidState=void 0;validationTimeout=null;lastDataReference=null;processingInternalChange=!1;constructor(){Kt(()=>{let e=this.data();if(this.processingInternalChange){this.lastDataReference=e;return}this.lastDataReference!==e&&(this.lastDataReference=e,this.currentData.set(e))})}ngOnInit(){let e=this.$settings.env.lang?.split("-")[0];e&&this.availableLanguages.includes(e)&&this.language.set(e)}ngOnDestroy(){this.validationTimeout&&clearTimeout(this.validationTimeout)}onChanges(e){this.processingInternalChange=!0;let i=this.data();if(i&&typeof i=="object"&&typeof e=="object"){let t=i._bridge;for(let o of Object.keys(i))o in e||delete i[o];Object.assign(i,e),t===void 0?delete i._bridge:i._bridge=t,this.dataChange.emit(i),this.dataChanged.emit(i)}else this.dataChange.emit(e),this.dataChanged.emit(e);queueMicrotask(()=>{this.processingInternalChange=!1})}validChange(e){this.validationTimeout&&clearTimeout(this.validationTimeout),this.validationTimeout=setTimeout(()=>{this.lastValidState!==e&&(this.lastValidState=e,this.isValid.emit(e))},50)}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=j({type:n,selectors:[["app-schema-form"]],inputs:{configSchema:[1,"configSchema"],data:[1,"data"]},outputs:{dataChange:"dataChange",dataChanged:"dataChanged",isValid:"isValid"},decls:2,vars:1,consts:[["framework","bootstrap-5",1,"ng-bs5-validate",3,"jsfPatch","options","schema","UISchema","layout","form","data","language"],["framework","bootstrap-5",1,"ng-bs5-validate",3,"onChanges","isValid","jsfPatch","options","schema","UISchema","layout","form","data","language"]],template:function(i,t){i&1&&(Zt(0),_(1,Wn,1,8,"json-schema-form",0),ei()),i&2&&(a(),f(t.configSchema().schema?1:-1))},dependencies:[Ni,St,Wi],encapsulation:2,changeDetection:0})}return n})();var Gn=Gt({"../../../../i18n/bg.json":()=>hn(),"../../../../i18n/ca.json":()=>bn(),"../../../../i18n/cs.json":()=>Cn(),"../../../../i18n/de.json":()=>xn(),"../../../../i18n/en.json":()=>ri(),"../../../../i18n/es.json":()=>vn(),"../../../../i18n/fi.json":()=>yn(),"../../../../i18n/fr.json":()=>Bn(),"../../../../i18n/he.json":()=>Sn(),"../../../../i18n/hu.json":()=>wn(),"../../../../i18n/id.json":()=>kn(),"../../../../i18n/it.json":()=>En(),"../../../../i18n/ja.json":()=>Mn(),"../../../../i18n/ko.json":()=>Tn(),"../../../../i18n/mk.json":()=>Pn(),"../../../../i18n/nl.json":()=>In(),"../../../../i18n/no.json":()=>Vn(),"../../../../i18n/pl.json":()=>$n(),"../../../../i18n/pt-BR.json":()=>Dn(),"../../../../i18n/pt.json":()=>An(),"../../../../i18n/ru.json":()=>Nn(),"../../../../i18n/sl.json":()=>Ln(),"../../../../i18n/sv.json":()=>On(),"../../../../i18n/th.json":()=>jn(),"../../../../i18n/tr.json":()=>Fn(),"../../../../i18n/uk.json":()=>Un(),"../../../../i18n/vi.json":()=>Hn(),"../../../../i18n/zh-CN.json":()=>Rn(),"../../../../i18n/zh-TW.json":()=>qn()});var Kn=["custompluginui"];function Jn(n,p){n&1&&(r(0,"div",6),x(1,"i",18),l())}function Xn(n,p){if(n&1){let e=T();r(0,"div",8)(1,"app-schema-form",19),ne("dataChange",function(t){w(e);let o=g();return ie(o.pluginConfig[0],t)||(o.pluginConfig[0]=t),k(t)}),M("dataChanged",function(t){w(e);let o=g();return k(o.schemaFormUpdatedSubject.next(t))})("isValid",function(t){w(e);let o=g();return k(o.onIsValid(t))}),l()()}if(n&2){let e=g();a(),B("configSchema",e.schema),te("data",e.pluginConfig[0])}}function Qn(n,p){if(n&1){let e=T();r(0,"button",23),M("click",function(){w(e);let t=g(2);return k(t.formActionSubject.next("cancel"))}),c(1),l()}if(n&2){let e=g(2);a(),y(" ",e.formCancelButtonLabel()," ")}}function Yn(n,p){if(n&1){let e=T();r(0,"button",24),M("click",function(){w(e);let t=g(2);return k(t.formActionSubject.next("submit"))}),c(1),l()}if(n&2){let e=g(2);B("disabled",!e.formValid()),a(),y(" ",e.formSubmitButtonLabel()," ")}}function Zn(n,p){if(n&1){let e=T();r(0,"div",8)(1,"app-schema-form",19),M("dataChange",function(t){w(e);let o=g();return k(o.formData.set(t))})("dataChanged",function(t){w(e);let o=g();return k(o.formUpdatedSubject.next(t))})("isValid",function(t){w(e);let o=g();return k(o.formValidEvent(t))}),l(),r(2,"div",20),_(3,Qn,2,1,"button",21),_(4,Yn,2,2,"button",22),l()()}if(n&2){let e=g();a(),B("configSchema",e.formSchema())("data",e.formData()),a(2),f(e.formCancelButtonLabel()?3:-1),a(),f(e.formSubmitButtonLabel()?4:-1)}}function eo(n,p){n&1&&(r(0,"div",9),x(1,"i",18),l())}function to(n,p){if(n&1&&(x(0,"i",25),d(1,"translate")),n&2){let e=g();D("fa-circle-check",e.formIsValid())("green-text",e.formIsValid())("fa-circle-exclamation",!e.formIsValid())("red-text",e.strictValidation()&&!e.formIsValid())("orange-text",!e.strictValidation()&&!e.formIsValid()),B("ngbTooltip",m(1,12,e.formIsValid()?"form.label_valid":e.strictValidation()?"form.label_invalid_strict":"form.label_invalid"))("openDelay",150)}}function io(n,p){n&1&&(c(0),d(1,"translate")),n&2&&y(" ",m(1,1,"form.button_save")," ")}function no(n,p){n&1&&x(0,"i",17)}var Gi=(()=>{class n{$activeModal=C(G);$accessoryCache=C(Mi);$api=C(q);$cb=C(he);$plugin=C(ke);$settings=C(W);$toastr=C(R);$translate=C(U);$ws=C(Se);modalData=C(Ye);customPluginUiElementTarget=lt("custompluginui");plugin=this.modalData.plugin;schema=this.modalData.schema;pluginConfig=this.modalData.pluginConfig??[];pluginAlias=v("");pluginType=v("platform");loading=v(!0);saveInProgress=v(!1);pluginSpinner=v(!1);saveButtonDisabled=v(!1);uiLoaded=v(!1);showSchemaForm=v(!1);formId=v(void 0);formSchema=v(void 0);formData=v(void 0);formSubmitButtonLabel=v(void 0);formCancelButtonLabel=v(void 0);formValid=v(!0);isFirstSave=v(!1);formIsValid=v(!0);strictValidation=v(!1);io;basePath="";iframe;schemaFormRecentlyRefreshed=!1;destroyRef=C(tt);schemaFormUpdatedSubject=new Ce;schemaFormRefreshSubject=new Ce;formUpdatedSubject=new Ce;formActionSubject=new Ce;ngOnInit(){let e=this.schema,i=this.plugin;if(!e||!i){console.error("CustomPluginsComponent: schema or plugin not provided"),this.$activeModal.dismiss("Missing required data");return}this.pluginAlias.set(e.pluginAlias),this.pluginType.set(e.pluginType),this.strictValidation.set(e.strictValidation),this.pluginConfig.length===0&&this.isFirstSave.set(!0),this.io=this.$ws.connectToNamespace("plugins/settings-ui"),this.basePath=`/plugins/settings-ui/${encodeURIComponent(i.name)}`,this.initialize(),this.schemaFormRefreshSubject.pipe(Ie(250),Me(this.destroyRef)).subscribe(this.schemaFormRefresh.bind(this)),this.schemaFormUpdatedSubject.pipe(Ie(250),Lt(1),Me(this.destroyRef)).subscribe(()=>{this.schemaFormUpdated()}),this.formUpdatedSubject.pipe(Ie(100),Lt(1),Me(this.destroyRef)).subscribe(this.formUpdated.bind(this)),this.formActionSubject.pipe(Me(this.destroyRef)).subscribe(this.formActionEvent.bind(this)),window.addEventListener("message",this.handleMessage,!1)}ngOnDestroy(){window.removeEventListener("message",this.handleMessage),this.io&&this.io.end?.(),this.schemaFormRefreshSubject.complete(),this.schemaFormUpdatedSubject.complete(),this.formUpdatedSubject.complete(),this.formActionSubject.complete()}onIsValid(e){this.formIsValid.set(e)}formValidEvent(e){this.formValid.set(e)}savePluginConfig(e=!1){return E(this,null,function*(){let i=this.plugin;if(i){this.saveInProgress.set(!0);try{let t=yield this.$api.post(`/config-editor/plugin/${encodeURIComponent(i.name)}?include=restart-info`,this.pluginConfig),o=t.config;if(this.saveInProgress.set(!1),e){if(this.isFirstSave()&&this.$settings.env.recommendChildBridges&&o[0]?.platform){this.$activeModal.close(),this.$plugin.bridgeSettings(i,!0);return}this.$activeModal.close(),this.$cb.openCorrectRestartModalWithBridges(t.affectedBridges)}}catch(t){console.error(t),this.$toastr.error(this.$translate.instant("config.failed_to_save_config"),this.$translate.instant("toast.title_error")),this.saveInProgress.set(!1)}}})}dismissModal(){this.$activeModal.dismiss("Dismiss")}initialize(){return E(this,null,function*(){let e=this.plugin;e&&(this.io.socket.emit("start",e.name),this.io.socket.on("response",i=>{i.action="response",this.iframe.contentWindow.postMessage(i,Be.api.origin)}),this.io.socket.on("stream",i=>{i.action="stream",this.iframe.contentWindow.postMessage(i,Be.api.origin)}),this.io.socket.on("ready",()=>{this.loading.set(!1),this.loadUi()}))})}loadUi(){let e=this.plugin;e&&(this.iframe=this.customPluginUiElementTarget()?.nativeElement,this.iframe&&(this.iframe.src=`${Be.api.base+this.basePath}/index.html?origin=${encodeURIComponent(location.origin)}&v=${encodeURIComponent(e.installedVersion)}`))}handleMessage=e=>{if(e.origin===Be.api.origin||e.origin===window.origin)switch(e.data.action){case"loaded":this.injectDefaultStyles(e),this.confirmReady(e);break;case"request":{this.handleRequest(e);break}case"scrollHeight":this.setiFrameHeight(e),this.uiLoaded.set(!0);break;case"config.get":{this.requestResponse(e,this.getConfigBlocks());break}case"config.save":{this.requestResponse(e,this.savePluginConfig());break}case"config.update":{this.handleUpdateConfig(e,e.data.pluginConfig);break}case"config.schema":{this.requestResponse(e,this.schema);break}case"cachedAccessories.get":{this.handleGetCachedAccessories(e);break}case"cachedMatterAccessories.get":{this.handleGetCachedMatterAccessories(e);break}case"schema.show":{this.formEnd(),this.showSchemaForm.set(!0);break}case"schema.hide":{this.showSchemaForm.set(!1);break}case"form.create":{this.showSchemaForm.set(!1),this.formCreate(e.data.formId,e.data.schema,e.data.data,e.data.submitButton,e.data.cancelButton);break}case"form.end":{this.formEnd();break}case"user.lightingMode":{this.requestResponse(e,this.$settings.actualLightingMode);break}case"i18n.lang":{this.requestResponse(e,this.$translate.getCurrentLang());break}case"i18n.translations":{let i;try{i=Gn(`../../../../i18n/${this.$translate.getCurrentLang()}.json`)}catch(t){i=ri()}this.requestResponse(e,i);break}case"close":{this.$activeModal.close();break}case"toast.success":this.$toastr.success(e.data.message,e.data.title);break;case"toast.error":this.$toastr.error(e.data.message,e.data.title);break;case"toast.warning":this.$toastr.warning(e.data.message,e.data.title);break;case"toast.info":this.$toastr.info(e.data.message,e.data.title);break;case"spinner.show":this.pluginSpinner.set(!0);break;case"spinner.hide":this.pluginSpinner.set(!1);break;case"button.save.disabled":this.saveButtonDisabled.set(!0);break;case"button.save.enabled":this.saveButtonDisabled.set(!1);break}};confirmReady(e){e.source.postMessage({action:"ready"},e.origin)}setiFrameHeight(e){this.iframe.style.height=`${e.data.scrollHeight+10}px`}handleRequest(e){this.io.socket.emit("request",e.data)}handleUpdateConfig(e,i){if(!Array.isArray(i))return this.$toastr.error(this.$translate.instant("plugins.config.must_be_array"),this.$translate.instant("toast.title_error")),this.requestResponse(e,{message:this.$translate.instant("plugins.config.must_be_array")},!1);for(let t of i)if(typeof t!="object"||Array.isArray(t))return this.$toastr.error(this.$translate.instant("plugins.config.must_be_array_objects"),this.$translate.instant("toast.title_error")),this.requestResponse(e,{message:this.$translate.instant("plugins.config.must_be_array_objects")},!1);return this.updateConfigBlocks(i),this.pluginConfig[0]&&this.showSchemaForm()&&(this.pluginConfig[0]=V({},this.pluginConfig[0]),this.schemaFormRefreshSubject.next(void 0)),this.requestResponse(e,this.getConfigBlocks())}requestResponse(e,i,t=!0){e.source.postMessage({action:"response",requestId:e.data.requestId,success:t,data:i},e.origin)}injectDefaultStyles(e){return E(this,null,function*(){let i=[...window.document.body.classList].find(h=>h.startsWith("config-ui-x-")),t=window.document.body.classList.contains("dark-mode"),o=e.source;o.postMessage({action:"body-class",class:i},e.origin),o.postMessage({action:"body-class",class:"modal-content"},e.origin),t&&o.postMessage({action:"body-class",class:"dark-mode"},e.origin);let s=[...document.querySelectorAll("link")];for(let h of s)if(h.getAttribute("rel")==="stylesheet"){let P=h.getAttribute("href"),L=document.baseURI+(P.startsWith("/")?P.substring(1):P);o.postMessage({action:"link-element",href:L,rel:"stylesheet"},e.origin)}let u=[...document.querySelectorAll("style")];for(let h of u)o.postMessage({action:"inline-style",style:h.innerHTML},e.origin);let b=`
body {
height: unset !important;
background-color: ${t?"#242424":"#FFFFFF"} !important;
color: ${t?"#FFFFFF":"#000000"} !important;
}
`;o.postMessage({action:"inline-style",style:b},e.origin)})}getConfigBlocks(){return this.pluginConfig}updateConfigBlocks(e){for(let i=0;i<e.length;i++){let t=e[i];t[this.pluginType()]=this.pluginAlias(),this.pluginConfig[i]?Object.assign(this.pluginConfig[i],t):this.pluginConfig[i]=t}this.pluginConfig.length>e.length&&(this.pluginConfig.length=e.length)}schemaFormUpdated(){if(!(!this.iframe||!this.iframe.contentWindow)){if(this.schemaFormRecentlyRefreshed){this.schemaFormRecentlyRefreshed=!1;return}this.iframe.contentWindow.postMessage({action:"stream",event:"configChanged",data:this.pluginConfig},Be.api.origin)}}schemaFormRefresh(){this.schemaFormRecentlyRefreshed=!0,this.showSchemaForm()&&(this.showSchemaForm.set(!1),queueMicrotask(()=>{this.showSchemaForm.set(!0)}))}formCreate(e,i,t,o,s){return E(this,null,function*(){yield this.formEnd(),this.formId.set(e),this.formSchema.set(i),this.formData.set(t),this.formSubmitButtonLabel.set(o),this.formCancelButtonLabel.set(s)})}formEnd(){return E(this,null,function*(){this.formId()&&(this.formId.set(void 0),this.formSchema.set(void 0),this.formData.set(void 0),this.formSubmitButtonLabel.set(void 0),this.formCancelButtonLabel.set(void 0),yield new Promise(e=>setTimeout(e)))})}formUpdated(e){this.iframe.contentWindow.postMessage({action:"stream",event:this.formId(),data:{formEvent:"change",formData:e}},Be.api.origin)}formActionEvent(e){this.iframe.contentWindow.postMessage({action:"stream",event:this.formId(),data:{formEvent:e,formData:this.formData()}},Be.api.origin)}handleGetCachedAccessories(e){return E(this,null,function*(){let i=this.plugin;if(i)try{let t=yield this.$accessoryCache.getHap();return this.requestResponse(e,t.filter(o=>o.plugin===i.name))}catch(t){console.error("Failed to get cached accessories:",t),this.$toastr.error(this.$translate.instant("toast.title_error"))}})}handleGetCachedMatterAccessories(e){return E(this,null,function*(){let i=this.plugin;if(i)try{let t=yield this.$accessoryCache.getMatter();return this.requestResponse(e,t.filter(o=>o.plugin===i.name))}catch(t){console.error("Failed to get cached Matter accessories:",t),this.$toastr.error(this.$translate.instant("toast.title_error"))}})}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=j({type:n,selectors:[["app-custom-plugins"]],viewQuery:function(i,t){i&1&&it(t.customPluginUiElementTarget,Kn,5),i&2&&nt()},decls:26,vars:22,consts:[["custompluginui",""],[1,"modal-content"],[1,"modal-header"],[1,"modal-title"],["type","button","data-bs-dismiss","modal",1,"btn-close",3,"click","disabled"],[1,"modal-body","pb-0","modal-body-min-height"],[1,"text-center","primary-text","my-5","w-100"],["width","100%","height","1px;","sandbox","allow-same-origin allow-scripts allow-popups allow-popups-to-escape-sandbox allow-downloads allow-forms",1,"plugin-iframe"],[1,"card","card-body"],[1,"loading-overlay","text-center","primary-text","d-flex","align-items-center","justify-content-center"],[1,"modal-footer","justify-content-between"],[1,"text-start"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"click","disabled"],[1,"text-center"],[1,"text-end","d-flex","align-items-center","justify-content-end"],["container","modal","placement","top","triggers","hover",1,"fas","fa-xl","me-2",3,"fa-circle-check","green-text","fa-circle-exclamation","red-text","orange-text","ngbTooltip","openDelay"],["type","button","data-bs-dismiss","modal",1,"btn","btn-primary",3,"click","disabled"],[1,"fas","fa-circle-notch","fa-spin"],[1,"fas","fa-circle-notch","fa-spin","icon-xl"],[3,"dataChange","dataChanged","isValid","configSchema","data"],[1,"text-end","custom-form-action-buttons"],["type","button",1,"btn","btn-elegant"],["type","button",1,"btn","btn-primary",3,"disabled"],["type","button",1,"btn","btn-elegant",3,"click"],["type","button",1,"btn","btn-primary",3,"click","disabled"],["container","modal","placement","top","triggers","hover",1,"fas","fa-xl","me-2",3,"ngbTooltip","openDelay"]],template:function(i,t){i&1&&(r(0,"div",1)(1,"div",2)(2,"h5",3),c(3),l(),r(4,"button",4),d(5,"translate"),M("click",function(){return t.dismissModal()}),l()(),r(6,"div",5),_(7,Jn,2,0,"div",6),x(8,"iframe",7,0),d(10,"translate"),d(11,"translate"),_(12,Xn,2,2,"div",8),_(13,Zn,5,4,"div",8),_(14,eo,2,0,"div",9),l(),r(15,"div",10)(16,"div",11)(17,"button",12),M("click",function(){return t.dismissModal()}),c(18),d(19,"translate"),l()(),x(20,"div",13),r(21,"div",14),_(22,to,2,14,"i",15),r(23,"button",16),M("click",function(){return t.savePluginConfig(!0)}),_(24,io,2,3)(25,no,1,0,"i",17),l()()()()),i&2&&(a(3),S(t.plugin.displayName||t.plugin.name),a(),B("disabled",t.saveInProgress()),I("aria-label",m(5,14,"form.button_close")),a(3),f(t.loading()?7:-1),a(),I("title",m(10,16,"plugins.button_settings"))("aria-label",m(11,18,"plugins.button_settings")),a(4),f(t.uiLoaded()&&t.pluginConfig.length&&t.schema.singular&&t.showSchemaForm()?12:-1),a(),f(t.formId()?13:-1),a(),f(t.pluginSpinner()?14:-1),a(3),B("disabled",t.saveInProgress()),a(),y(" ",m(19,20,"form.button_close")," "),a(4),f(t.saveButtonDisabled()?-1:22),a(),B("disabled",t.saveInProgress()||t.saveButtonDisabled()),a(),f(t.saveInProgress()?25:24))},dependencies:[It,Li,we,H],styles:[".manage-plugin-config-external-icons[_ngcontent-%COMP%]{font-size:1.5rem;font-weight:700;line-height:1;color:#000;opacity:.5;background-color:transparent;border:0}.modal-body-min-height[_ngcontent-%COMP%]{min-height:110px}.plugin-iframe[_ngcontent-%COMP%]{border:0}.loading-overlay[_ngcontent-%COMP%]{position:absolute;inset:16px;background-color:#ffffffb3}.custom-form-action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:last-child{margin-right:2px}"],changeDetection:0})}return n})();var Ki=(()=>{class n{injector=C(me);$api=C(q);$modal=C(de);plugins={};openSettings(e,i,t){return E(this,null,function*(){let o=t?.config??(yield this.loadPluginConfig(e.name)),s=K([{provide:Ye,useValue:{plugin:e,schema:i,pluginConfig:o,editorContext:t}}],this.injector);return this.$modal.open(this.plugins[e.name],{size:"lg",backdrop:"static",injector:s}).result.catch(()=>{})})}openCustomSettingsUi(e,i,t){return E(this,null,function*(){let o=t?.config??(yield this.loadPluginConfig(e.name)),s=K([{provide:Ye,useValue:{plugin:e,schema:i,pluginConfig:o,editorContext:t}}],this.injector);return this.$modal.open(Gi,{size:"lg",backdrop:"static",injector:s}).result.catch(()=>{})})}loadPluginConfig(e){return E(this,null,function*(){return this.$api.get(`/config-editor/plugin/${encodeURIComponent(e)}`)})}static \u0275fac=function(i){return new(i||n)};static \u0275prov=Ve({token:n,factory:n.\u0275fac,providedIn:"root"})}return n})();var tn=pe(Ze(),1);var Ji=pe(pt(),1);function oo(n,p){n&1&&(r(0,"div",5),x(1,"i",12),l())}function ao(n,p){if(n&1&&(x(0,"i",20),r(1,"h6",21),c(2),d(3,"translate"),l(),r(4,"p",21),c(5),d(6,"translate"),r(7,"span",22),c(8),l()()),n&2){let e=g(2);a(2),S(m(3,3,"plugins.manage.select_version")),a(3),y(" ",m(6,5,"plugins.status_installed"),": "),a(3),y("v",e.plugin==null?null:e.plugin.installedVersion)}}function ro(n,p){n&1&&(x(0,"i",23),r(1,"h6",21),c(2),d(3,"translate"),l()),n&2&&(a(2),S(m(3,1,"plugins.manage.select_version")))}function lo(n,p){n&1&&x(0,"i",26)}function so(n,p){n&1&&x(0,"i",27)}function co(n,p){if(n&1){let e=T();r(0,"li",14)(1,"span",8),c(2),x(3,"br"),r(4,"small",24),c(5),l()(),r(6,"button",25),d(7,"translate"),d(8,"translate"),M("click",function(){let t=w(e).$implicit,o=g(2);return k(o.doInstall(t.version))}),_(9,lo,1,0,"i",26)(10,so,1,0,"i",27),l()()}if(n&2){let e=p.$implicit,i=g(2);a(2),y(" ",e.tag," "),a(3),y("v",e.version),a(),I("aria-label",`${(i.plugin==null?null:i.plugin.installedVersion)===e.version?m(7,4,"plugins.manage.reinstall"):m(8,6,"plugins.manage.install")} v${e.version}`),a(3),f((i.plugin==null?null:i.plugin.installedVersion)===e.version?9:10)}}function po(n,p){n&1&&c(0," \u2713 ")}function mo(n,p){if(n&1&&(r(0,"option",17),c(1),_(2,po,1,0),l()),n&2){let e=p.$implicit,i=g(2);B("value",e.version)("selected",i.versionSelect===e.version),a(),y(" v",e.version," "),a(),f(e.version===(i.plugin==null?null:i.plugin.installedVersion)?2:-1)}}function go(n,p){n&1&&x(0,"i",26)}function uo(n,p){n&1&&x(0,"i",27)}function _o(n,p){if(n&1){let e=T();r(0,"button",25),d(1,"translate"),d(2,"translate"),M("click",function(){w(e);let t=g(2);return k(t.doInstall(t.versionSelect))}),_(3,go,1,0,"i",26)(4,uo,1,0,"i",27),l()}if(n&2){let e=g(2);I("aria-label",`${(e.plugin==null?null:e.plugin.installedVersion)===e.versionSelect?m(1,2,"plugins.manage.reinstall"):m(2,4,"plugins.manage.install")} v${e.versionSelect}`),a(3),f((e.plugin==null?null:e.plugin.installedVersion)===e.versionSelect?3:4)}}function fo(n,p){n&1&&(r(0,"div",36),x(1,"i",41),l())}function ho(n,p){n&1&&(r(0,"div",36),x(1,"i",41),l())}function bo(n,p){n&1&&(r(0,"div",36),x(1,"i",41),l())}function Co(n,p){if(n&1&&(r(0,"li",28)(1,"label",29),x(2,"input",42),d(3,"translate"),r(4,"div",31),x(5,"i",43),l(),r(6,"div",33)(7,"div",34),c(8),d(9,"translate"),l(),r(10,"small",35),c(11),d(12,"translate"),l()(),_(13,bo,2,0,"div",36),l()()),n&2){let e=g(3);a(2),B("formControl",e.updatePreferenceControl),I("aria-label",m(3,9,"plugins.manage.notifications_major")),a(3),D("primary-text",e.updatePreferenceControl.value==="major")("grey-text",e.updatePreferenceControl.value!=="major"),a(3),S(m(9,11,"plugins.manage.notifications_major")),a(3),S(m(12,13,"plugins.manage.notifications_major_desc")),a(2),f(e.updatePreferenceControl.value==="major"?13:-1)}}function xo(n,p){n&1&&(r(0,"div",36),x(1,"i",41),l())}function vo(n,p){if(n&1&&(r(0,"ul",19),d(1,"translate"),r(2,"li",28)(3,"label",29),x(4,"input",30),d(5,"translate"),r(6,"div",31),x(7,"i",32),l(),r(8,"div",33)(9,"div",34),c(10),d(11,"translate"),l(),r(12,"small",35),c(13),d(14,"translate"),l()(),_(15,fo,2,0,"div",36),l()(),r(16,"li",28)(17,"label",29),x(18,"input",37),d(19,"translate"),r(20,"div",31),x(21,"i",38),l(),r(22,"div",33)(23,"div",34),c(24),d(25,"translate"),l(),r(26,"small",35),c(27),d(28,"translate"),l()(),_(29,ho,2,0,"div",36),l()(),_(30,Co,14,15,"li",28),r(31,"li",28)(32,"label",29),x(33,"input",39),d(34,"translate"),r(35,"div",31),x(36,"i",40),l(),r(37,"div",33)(38,"div",34),c(39),d(40,"translate"),l(),r(41,"small",35),c(42),d(43,"translate"),l()(),_(44,xo,2,0,"div",36),l()()()),n&2){let e=g(2);I("aria-label",m(1,29,"plugins.manage.notifications")),a(4),B("formControl",e.updatePreferenceControl),I("aria-label",m(5,31,"plugins.manage.notifications_all")),a(3),D("primary-text",e.updatePreferenceControl.value==="all")("grey-text",e.updatePreferenceControl.value!=="all"),a(3),S(m(11,33,"plugins.manage.notifications_all")),a(3),S(m(14,35,"plugins.manage.notifications_all_desc")),a(2),f(e.updatePreferenceControl.value==="all"?15:-1),a(3),B("formControl",e.updatePreferenceControl),I("aria-label",m(19,37,"plugins.manage.notifications_beta")),a(3),D("primary-text",e.updatePreferenceControl.value==="beta")("grey-text",e.updatePreferenceControl.value!=="beta"),a(3),S(m(25,39,"plugins.manage.notifications_beta")),a(3),S(m(28,41,"plugins.manage.notifications_beta_desc")),a(2),f(e.updatePreferenceControl.value==="beta"?29:-1),a(),f(e.plugin.name==="homebridge"||e.plugin.name==="homebridge-config-ui-x"?30:-1),a(3),B("formControl",e.updatePreferenceControl),I("aria-label",m(34,43,"plugins.manage.notifications_none")),a(3),D("primary-text",e.updatePreferenceControl.value==="none")("grey-text",e.updatePreferenceControl.value!=="none"),a(3),S(m(40,45,"plugins.manage.notifications_none")),a(3),S(m(43,47,"plugins.manage.notifications_none_desc")),a(2),f(e.updatePreferenceControl.value==="none"?44:-1)}}function yo(n,p){if(n&1){let e=T();r(0,"div",6),_(1,ao,9,7)(2,ro,4,3),r(3,"ul",13),Y(4,co,11,8,"li",14,oe),r(6,"li",14)(7,"div",15),c(8),d(9,"translate"),x(10,"br"),r(11,"select",16),d(12,"translate"),ne("ngModelChange",function(t){w(e);let o=g();return ie(o.versionSelect,t)||(o.versionSelect=t),k(t)}),Y(13,mo,3,4,"option",17,oe),l()(),_(15,_o,5,6,"button",18),l()(),_(16,vo,45,49,"ul",19),l()}if(n&2){let e=g();a(),f(e.plugin!=null&&e.plugin.installedVersion?1:2),a(3),Z(e.versionsWithTags()),a(4),y(" ",m(9,6,"plugins.manage.all_versions")," "),a(3),te("ngModel",e.versionSelect),I("aria-label",m(12,8,"plugins.manage.all_versions")),a(2),Z(e.versions()),a(2),f(e.versionSelect?15:-1),a(),f(e.plugin!=null&&e.plugin.installedVersion?16:-1)}}var $t=(()=>{class n{$activeModal=C(G);$api=C(q);$pluginsCache=C(qe);$settings=C(W);$toastr=C(R);$translate=C(U);modalData=C(Ue);destroyRef=C(tt);plugin=this.modalData.plugin;onRefreshPluginList=this.modalData.onRefreshPluginList;onSettingsChange=this.modalData.onSettingsChange;_versionSelect=v("");loading=v(!0);versions=v([]);versionsWithTags=v([]);get versionSelect(){return this._versionSelect()}set versionSelect(e){this._versionSelect.set(e)}updatePreferenceControl=new si("all");ngOnInit(){let e=this.plugin;if(!e)return;this.versionSelect=e.installedVersion||e.latestVersion,this.lookupVersions();let i=this.getCurrentUpdatePreference();this.updatePreferenceControl.setValue(i),this.updatePreferenceControl.valueChanges.pipe(Ie(500),Me(this.destroyRef)).subscribe(t=>{t!==null&&this.updatePreference(t)})}doInstall(e){let i=this.plugin;if(!i)return;let t=this.versions().find(o=>o.version===e);this.$activeModal.close({name:i.name,version:e,engines:t?.engines,action:i.installedVersion?"alternate":"install"})}getCurrentUpdatePreference(){let e=this.plugin;return e?e.name==="homebridge"?this.$settings.env.homebridgeUpdatePolicy||"all":e.name==="homebridge-config-ui-x"?this.$settings.env.homebridgeUiUpdatePolicy||"all":this.$settings.env.plugins?.hideUpdatesFor?.includes(e.name)?"none":this.$settings.env.plugins?.showBetasFor?.includes(e.name)?"beta":"all":"all"}updatePreference(e){return E(this,null,function*(){let i=this.plugin;if(i)try{if(i.name==="homebridge")yield this.$api.patch("/config-editor/ui",{homebridgeUpdatePolicy:e}),this.$settings.env.homebridgeUpdatePolicy=e,yield this.$api.post("/plugins/clear-cache",{});else if(i.name==="homebridge-config-ui-x")yield this.$api.patch("/config-editor/ui",{homebridgeUiUpdatePolicy:e}),this.$settings.env.homebridgeUiUpdatePolicy=e,yield this.$api.post("/plugins/clear-cache",{});else{let s=e==="none",u=e==="beta",b=this.$settings.env.plugins?.hideUpdatesFor||[];s&&!b.includes(i.name)?b=[...b,i.name].sort((P,L)=>P.localeCompare(L)):s||(b=b.filter(P=>P!==i.name));let h=this.$settings.env.plugins?.showBetasFor||[];u&&!h.includes(i.name)?h=[...h,i.name].sort((P,L)=>P.localeCompare(L)):u||(h=h.filter(P=>P!==i.name)),yield this.$api.put("/config-editor/ui/plugins/hide-updates-for",{body:b}),yield this.$api.patch("/config-editor/ui",{"plugins.showBetasFor":h}),this.$settings.setEnvItem("plugins.hideUpdatesFor",b),this.$settings.setEnvItem("plugins.showBetasFor",h),yield this.$api.post("/plugins/clear-cache",{})}this.$pluginsCache.invalidate();let t=this.onRefreshPluginList;t&&t();let o=this.onSettingsChange;o&&o(),this.$toastr.success(this.$translate.instant("config.config_saved"),this.$translate.instant("toast.title_success"))}catch(t){console.error(t);let o=t instanceof Error?t.message:this.$translate.instant("toast.title_error");this.$toastr.error(o,this.$translate.instant("toast.title_error")),this.updatePreferenceControl.setValue(this.getCurrentUpdatePreference(),{emitEvent:!1})}})}dismissModal(){this.$activeModal.dismiss("Dismiss")}lookupVersions(){return E(this,null,function*(){let e=this.plugin;if(e)try{let i=yield this.$api.get(`/plugins/lookup/${encodeURIComponent(e.name)}/versions`),t=[],o=[];for(let[u,b]of Object.entries(i.versions))t.push({version:u,engines:b.engines||null}),Object.keys(i.tags).filter(h=>i.tags[h]===u).forEach(h=>{o.push({version:u,tag:h})});let s=this.plugin;s?.installedVersion&&!t.some(u=>u.version===s.installedVersion)&&t.push({version:s.installedVersion,engines:s.engines||null}),t.sort((u,b)=>(0,Ji.rcompare)(u.version,b.version)),o.sort((u,b)=>{let h=["latest","next","beta","alpha"],P=h.includes(u.tag)?h.indexOf(u.tag):999,L=h.includes(b.tag)?h.indexOf(b.tag):999;return P-L}),this.versions.set(t),this.versionsWithTags.set(o),!t.some(u=>u.version===this.versionSelect)&&i.tags.latest&&(this.versionSelect=i.tags.latest),this.loading.set(!1)}catch(i){console.error(i);let t=i instanceof Error?i.error?.message||i.message:this.$translate.instant("toast.title_error");this.$toastr.error(t,this.$translate.instant("toast.title_error")),this.$activeModal.dismiss()}})}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=j({type:n,selectors:[["app-manage-version"]],decls:16,vars:8,consts:[[1,"modal-content"],[1,"modal-header"],[1,"modal-title"],["type","button","data-bs-dismiss","modal",1,"btn-close",3,"click"],[1,"modal-body","d-flex","flex-row","flex-grow-1","w-100"],[1,"w-100","text-center","primary-text","my-5","w-100"],[1,"w-100","text-center"],[1,"modal-footer","justify-content-between"],[1,"text-start"],[1,"text-center"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"click"],[1,"text-end"],[1,"fas","fa-circle-notch","fa-spin","icon-xl"],[1,"list-group","list-group-box","mb-0"],[1,"list-group-item","d-flex","justify-content-between","align-items-center"],[1,"text-start","min-w-50"],[1,"custom-select","w-100","font-monospace","version-select",3,"ngModelChange","ngModel"],[3,"value","selected"],["type","button",1,"btn","btn-primary","m-0","ms-3","py-1"],["role","radiogroup",1,"list-group","list-group-box","mt-3","mb-0"],[1,"fas","fa-code-compare","primary-text","mb-3","icon-xl"],[1,"mb-3"],[1,"font-monospace"],[1,"far","fa-arrow-alt-circle-down","primary-text","mb-3","icon-xl"],[1,"grey-text","font-monospace"],["type","button",1,"btn","btn-primary","m-0","ms-3","py-1",3,"click"],[1,"fas","fa-rotate-right"],[1,"fas","fa-arrow-alt-circle-down"],[1,"list-group-item","text-start"],[1,"d-flex","align-items-center","w-100","mb-0","cursor-pointer"],["type","radio","name","updatePreference","value","all",1,"visually-hidden",3,"formControl"],[1,"me-3"],["aria-hidden","true",1,"fas","fa-bell","fa-2x"],[1,"flex-grow-1"],["aria-hidden","true"],[1,"grey-text"],[1,"ms-3"],["type","radio","name","updatePreference","value","beta",1,"visually-hidden",3,"formControl"],["aria-hidden","true",1,"fas","fa-vial","fa-2x"],["type","radio","name","updatePreference","value","none",1,"visually-hidden",3,"formControl"],["aria-hidden","true",1,"fas","fa-bell-slash","fa-2x"],["aria-hidden","true",1,"fas","fa-xl","fa-check-circle","primary-text"],["type","radio","name","updatePreference","value","major",1,"visually-hidden",3,"formControl"],["aria-hidden","true",1,"far","fa-bell","fa-2x"]],template:function(i,t){i&1&&(r(0,"div",0)(1,"div",1)(2,"h5",2),c(3),l(),r(4,"button",3),d(5,"translate"),M("click",function(){return t.dismissModal()}),l()(),r(6,"div",4),_(7,oo,2,0,"div",5)(8,yo,17,10,"div",6),l(),r(9,"div",7),x(10,"div",8),r(11,"div",9)(12,"button",10),M("click",function(){return t.dismissModal()}),c(13),d(14,"translate"),l()(),x(15,"div",11),l()()),i&2&&(a(3),S((t.plugin==null?null:t.plugin.displayName)||(t.plugin==null?null:t.plugin.name)),a(),I("aria-label",m(5,4,"form.button_close")),a(3),f(t.loading()?7:8),a(6),y(" ",m(14,6,"form.button_close")," "))},dependencies:[fe,Ne,Le,dt,Ae,ci,ue,_e,ui,pi,H],styles:[".version-select[_ngcontent-%COMP%]{font-size:.875rem}"],changeDetection:0})}return n})();var Qi=pe(Ze(),1);var Bo=["pluginlogoutput"];function So(n,p){if(n&1){let e=T();r(0,"button",15),d(1,"translate"),d(2,"translate"),M("click",function(){w(e);let t=g();return k(t.restartChildBridges())}),x(3,"i",16),l()}if(n&2){let e=g();B("ngbTooltip",m(1,4,e.childBridges.length>1?"child_bridge.restart_plural":"child_bridge.restart"))("openDelay",150)("disabled",e.midAction()),I("aria-label",m(2,6,e.childBridges.length>1?"child_bridge.restart_plural":"child_bridge.restart"))}}var Xi=/\x1B\[(\d{1,3}(;\d{1,2})?)?[mGK]/g,wo=/36m\[.*?\]/,Yi=(()=>{class n{$activeModal=C(G);$api=C(q);$log=C($i);$modal=C(de);$toastr=C(R);$translate=C(U);$settings=C(W);injector=C(me);modalData=C(ut);termTarget=lt("pluginlogoutput");plugin=this.modalData.plugin;childBridges=this.modalData.childBridges??[];editorContext=this.modalData.editorContext;midAction=v(!1);resizeEvent=new Ce;pluginAlias;get isLightTerminalTheme(){return this.$settings.getEffectiveTerminalLightingMode()==="light"}ngOnInit(){this.getPluginLog()}ngOnDestroy(){this.$log.destroyTerminal()}onWindowResize(){this.resizeEvent.next(void 0)}patchXtermLiveRegion(){let e=this.termTarget()?.nativeElement;if(!e)return;let i=e.querySelector("[aria-live]");i&&(i.setAttribute("role","status"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"))}restartChildBridges(){return E(this,null,function*(){this.midAction.set(!0);try{for(let e of this.childBridges)yield this.$api.put(`/server/restart/${e.username}`,{});this.$toastr.success(this.$translate.instant("plugins.manage.child_bridge_restart"),this.$translate.instant("toast.title_success")),this.midAction.set(!1)}catch(e){console.error(e),this.$toastr.error(this.$translate.instant("plugins.manage.child_bridge_restart_failed"),this.$translate.instant("toast.title_error")),this.midAction.set(!1)}})}downloadLogFile(){return E(this,null,function*(){this.midAction.set(!0);let e=K([{provide:wi,useValue:{title:this.$translate.instant("logs.title_download_log_file"),message:this.$translate.instant("logs.download_warning"),confirmButtonLabel:this.$translate.instant("form.button_download"),faIconClass:"fas fa-user-secret primary-text"}}],this.injector),i=this.$modal.open(ki,{size:"lg",backdrop:"static",injector:e});try{yield i.result;try{let t=yield this.$api.get("/platform-tools/hb-service/log/download?colour=yes",{observe:"response",responseType:"text"});if(!t.body)return;let o=t.body.split(`
`),s="",u=!1;o.forEach(b=>{if(b){if(u)if(wo.test(b))u=!1;else{s+=`${b.replace(Xi,"")}\r
`;return}b.includes(`36m[${this.pluginAlias}]`)&&(s+=`${b.replace(Xi,"")}\r
`,u=!0)}}),this.plugin&&(0,Qi.saveAs)(new Blob([s],{type:"text/plain;charset=utf-8"}),`${this.plugin.name}.log.txt`),this.midAction.set(!1)}catch(t){let o;try{t instanceof ai&&t.error?.text&&(o=JSON.parse(yield t.error.text()).message)}catch(s){console.error(s)}this.$toastr.error(o||this.$translate.instant("logs.download.error"),this.$translate.instant("toast.title_error")),this.midAction.set(!1)}}catch(t){this.midAction.set(!1)}})}dismissModal(){this.$activeModal.dismiss("Dismiss")}getPluginLog(){return E(this,null,function*(){if(this.plugin)try{let e=this.editorContext?.config??(yield this.$api.get(`/config-editor/plugin/${encodeURIComponent(this.plugin.name)}`));if(!this.plugin)return;this.pluginAlias=this.plugin.name==="homebridge-config-ui-x"?"Homebridge UI":e[0]?.name||this.plugin.name,this.$log.startTerminal(this.termTarget(),this.$settings.getTerminalOptions({disableStdin:!0}),this.resizeEvent,this.pluginAlias),requestAnimationFrame(()=>this.patchXtermLiveRegion())}catch(e){console.error(e);let i=e instanceof Error?e.error?.message||e.message:this.$translate.instant("toast.title_error");this.$toastr.error(i,this.$translate.instant("toast.title_error")),this.$activeModal.dismiss()}})}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=j({ty