homebridge-config-ui-x 5.11.2-beta.4 → 5.11.2-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/package.json +1 -1
  3. package/public/chunk-2YQMYSXT.js +1 -0
  4. package/public/{chunk-XGK5YFH6.js → chunk-3JBXVUFP.js} +2 -2
  5. package/public/{chunk-QBG7SKRK.js → chunk-47LZZIPJ.js} +6 -6
  6. package/public/{chunk-7JNVXXNR.js → chunk-5F6SGJZO.js} +1 -1
  7. package/public/{chunk-GJ42U6LP.js → chunk-5UTHYAO4.js} +1 -1
  8. package/public/chunk-5V5T5YDK.js +1 -0
  9. package/public/{chunk-T472BWYK.js → chunk-72SK6LN3.js} +1 -1
  10. package/public/{chunk-AM5CKSLZ.js → chunk-746K2W65.js} +1 -1
  11. package/public/{chunk-2TQEV57U.js → chunk-B6EPFA4V.js} +1 -1
  12. package/public/{chunk-BVJS76CN.js → chunk-BHYS7LPU.js} +1 -1
  13. package/public/{chunk-GT2YL2TI.js → chunk-BQMRSELR.js} +1 -1
  14. package/public/{chunk-4VLAXCSY.js → chunk-CDVVVWKM.js} +1 -1
  15. package/public/{chunk-MRPQNEON.js → chunk-CYKWMDCC.js} +1 -1
  16. package/public/{chunk-LVBVUIJY.js → chunk-D3MUNCMG.js} +1 -1
  17. package/public/{chunk-E35SHTFY.js → chunk-D3NFARXL.js} +1 -1
  18. package/public/{chunk-PEOTW7KR.js → chunk-G7V2J2JO.js} +1 -1
  19. package/public/{chunk-VBQ2CSUE.js → chunk-GFM46DC6.js} +1 -1
  20. package/public/{chunk-CPECPTSN.js → chunk-H53NQXNF.js} +1 -1
  21. package/public/chunk-HBNZXYWD.js +4 -0
  22. package/public/chunk-HQLIDFFL.js +1 -0
  23. package/public/chunk-IF2VXUU3.js +3 -0
  24. package/public/{chunk-S4BMZ4C4.js → chunk-IMR3XZ37.js} +1 -1
  25. package/public/chunk-J24WFLH3.js +1 -0
  26. package/public/{chunk-CNUIQJSO.js → chunk-J6JCLCR6.js} +1 -1
  27. package/public/chunk-JN6IF7KG.js +1 -0
  28. package/public/{chunk-MS4K4KAK.js → chunk-K3VXCKFJ.js} +1 -1
  29. package/public/{chunk-42Y35W3J.js → chunk-LKRXJ4NQ.js} +1 -1
  30. package/public/{chunk-WX345PMX.js → chunk-LQNKSANI.js} +1 -1
  31. package/public/{chunk-EMF6ZINV.js → chunk-N74OZDD6.js} +1 -1
  32. package/public/{chunk-TRDYZJYI.js → chunk-P2U63MCR.js} +1 -1
  33. package/public/chunk-PK2CVZPI.js +1 -0
  34. package/public/{chunk-TTX3XSDC.js → chunk-QCD43BXL.js} +1 -1
  35. package/public/{chunk-6ZOSTYPR.js → chunk-RMWS37MG.js} +1 -1
  36. package/public/chunk-S6MSUZ3J.js +1 -0
  37. package/public/{chunk-QGLAR7UC.js → chunk-TRA6X3HB.js} +1 -1
  38. package/public/{chunk-WBTFILXV.js → chunk-VQI4BA3M.js} +7 -7
  39. package/public/{chunk-IZHFI46L.js → chunk-W3WJ3GLW.js} +1 -1
  40. package/public/{chunk-5K3S6ZXB.js → chunk-WPJDSHYO.js} +1 -1
  41. package/public/chunk-XF7D4C2H.js +1 -0
  42. package/public/{chunk-UO7KCTHV.js → chunk-YAUW3QQV.js} +1 -1
  43. package/public/chunk-YDOFHXZH.js +1 -0
  44. package/public/chunk-ZDIBPB2V.js +5 -0
  45. package/public/index.html +1 -1
  46. package/public/main-VBBHOBST.js +1 -0
  47. package/public/chunk-3LKYOCGJ.js +0 -1
  48. package/public/chunk-4KXPUEE3.js +0 -4
  49. package/public/chunk-4TAGCB7R.js +0 -1
  50. package/public/chunk-DBMKB5Z2.js +0 -1
  51. package/public/chunk-FQDRGOO5.js +0 -1
  52. package/public/chunk-FYHEIYSO.js +0 -5
  53. package/public/chunk-GYMWB5SQ.js +0 -1
  54. package/public/chunk-N6AN65NK.js +0 -3
  55. package/public/chunk-SE6AXFTZ.js +0 -1
  56. package/public/chunk-SIODBMHU.js +0 -1
  57. package/public/chunk-VAD47NOZ.js +0 -1
  58. package/public/chunk-ZDUAXPNP.js +0 -1
  59. package/public/main-SPPQL5YI.js +0 -1
package/CHANGELOG.md CHANGED
@@ -15,6 +15,7 @@ All notable changes to `homebridge-config-ui-x` will be documented in this file.
15
15
  - add a complete https management to settings (@donavanbecker)
16
16
  - matter integration with homebridge
17
17
  - added log search facility on main logs page
18
+ - convert main spinner animation from `svg` to `css`
18
19
 
19
20
  ### Other Changes
20
21
 
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "homebridge-config-ui-x",
3
3
  "displayName": "Homebridge UI",
4
4
  "type": "module",
5
- "version": "5.11.2-beta.4",
5
+ "version": "5.11.2-beta.5",
6
6
  "description": "A web based management, configuration and control platform for Homebridge.",
7
7
  "author": "oznu <dev@oz.nu>",
8
8
  "license": "MIT",
@@ -0,0 +1 @@
1
+ import{m as oe}from"./chunk-K3VXCKFJ.js";import{e as H}from"./chunk-P2U63MCR.js";import{C as se,e as Z,l as ee,t as te,u as ie,w as ne}from"./chunk-YAUW3QQV.js";import{b as Y}from"./chunk-72SK6LN3.js";import{E as J,F as K,H as Q,K as X}from"./chunk-B6EPFA4V.js";import{Ab as h,Ac as z,Cb as T,Db as R,Eb as F,Ec as u,Fb as A,Fc as _,Gb as a,Hb as r,Ib as $,Oc as G,Rb as M,Xb as y,Za as s,Zb as m,aa as b,ga as C,ha as I,jc as E,kc as p,lc as f,mc as B,nb as P,nc as j,rc as q,sa as S,sc as O,tc as W,yb as D,zb as v,zc as V}from"./chunk-MKV5RAJQ.js";import{a as U,b as L,h as k}from"./chunk-B4AJQJMI.js";var ce=(t,l)=>({"fa-matter":t,"fa-hap":l}),le=(t,l)=>({"btn-danger":t,"btn-elegant":l}),de=(t,l,e)=>({"fa-trash":t,"fa-undo":l,"fa-spinner fa-pulse":e});function pe(t,l){t&1&&(a(0,"div",12),$(1,"i",13),r(),a(2,"p",14),p(3),u(4,"translate"),r()),t&2&&(s(3),f(_(4,1,"reset.no_accessories")))}function me(t,l){if(t&1&&(a(0,"option",24),p(1),r()),t&2){let e=l.$implicit;A("value",e._id),s(),j("",e.name," (",e._username,")")}}function ue(t,l){if(t&1){let e=M();a(0,"li",20),p(1),u(2,"translate"),r(),a(3,"li",18)(4,"label",21),p(5),u(6,"translate"),r(),a(7,"div",22)(8,"select",23),W("ngModelChange",function(i){C(e);let o=m(2);return O(o.selectedBridge,i)||(o.selectedBridge=i),I(i)}),y("change",function(i){C(e);let o=m(2);return I(o.onBridgeChange(i.target.value))}),R(9,me,2,3,"option",24,T),r()()()}if(t&2){let e=m(2);s(),f(_(2,3,"form.label.changes_kept")),s(4),f(_(6,5,"reset.accessory_ind.bridge")),s(3),q("ngModel",e.selectedBridge),s(),F(e.pairings)}}function _e(t,l){if(t&1&&(a(0,"li",18)(1,"label",25),p(2),u(3,"translate"),r(),a(4,"div",26),p(5),r()()),t&2){let e=m(2);s(2),f(_(3,2,"reset.accessory_ind.bridge")),s(3),B(" ",e.getCurrentlySelectedBridge()," ")}}function ge(t,l){if(t&1){let e=M();a(0,"li",19)(1,"span",27),$(2,"i",28),r(),a(3,"span",29),p(4),$(5,"br"),a(6,"small")(7,"span",30),p(8),r()()(),a(9,"button",31),u(10,"translate"),y("click",function(){let i=C(e).$implicit,o=m(2);return I(o.toggleList(i.UUID||i.uuid,i.$cacheFile,i.$protocol,i.$deviceId))}),$(11,"i",32),r()()}if(t&2){let e=l.$implicit,n=m(2);s(2),E(V(12,ce,e.$protocol==="matter",e.$protocol!=="matter")),s(2),B(" ",e.displayName," "),s(4),f(e.UUID||e.uuid),s(),E(V(15,le,!n.isInList(e.UUID||e.uuid,e.$cacheFile,e.$protocol),n.isInList(e.UUID||e.uuid,e.$cacheFile,e.$protocol))),A("disabled",n.clicked),D("aria-label",_(10,10,"form.button_delete")),s(2),E(z(18,de,!n.isInList(e.UUID||e.uuid,e.$cacheFile,e.$protocol),n.isInList(e.UUID||e.uuid,e.$cacheFile,e.$protocol)&&!n.clicked,n.isInList(e.UUID||e.uuid,e.$cacheFile,e.$protocol)&&n.clicked))}}function ve(t,l){if(t&1&&(a(0,"div",12),$(1,"i",15),r(),a(2,"ul",16)(3,"li"),p(4),u(5,"translate"),r(),a(6,"li"),p(7),u(8,"translate"),r(),a(9,"li"),p(10),u(11,"translate"),r()(),a(12,"ul",17),v(13,ue,11,7),v(14,_e,6,4,"li",18),R(15,ge,12,22,"li",19,T),r()),t&2){let e=m();s(4),f(_(5,5,"reset.accessory_ind.list_1")),s(3),f(_(8,7,"reset.accessory_ind.list_2")),s(3),f(_(11,9,"reset.accessory_ind.list_3")),s(3),h(e.pairings.length>1?13:-1),s(),h(e.pairings.length===1?14:-1),s(),F(e.selectedBridgeAccessories)}}function he(t,l){if(t&1){let e=M();a(0,"button",33),y("click",function(){C(e);let i=m();return I(i.dismissModal())}),p(1),u(2,"translate"),r()}if(t&2){let e=m();A("disabled",e.clicked),s(),B(" ",_(2,2,"form.button_close")," ")}}function fe(t,l){if(t&1){let e=M();a(0,"button",34),y("click",function(){C(e);let i=m();return I(i.dismissModal())}),p(1),u(2,"translate"),r()}t&2&&(s(),B(" ",_(2,1,"form.button_close")," "))}function xe(t,l){if(t&1&&p(0),t&2){let e=m(3);B(" (",e.toDelete.length,") ")}}function be(t,l){if(t&1&&(p(0),u(1,"translate"),v(2,xe,1,1)),t&2){let e=m(2);B(" ",_(1,2,"form.button_remove")," "),s(2),h(e.toDelete.length>0?2:-1)}}function Ce(t,l){t&1&&$(0,"i",36)}function Ie(t,l){if(t&1){let e=M();a(0,"button",35),y("click",function(){C(e);let i=m();return I(i.removeAccessories())}),v(1,be,3,4),v(2,Ce,1,0,"i",36),r()}if(t&2){let e=m();A("disabled",!e.toDelete.length||e.clicked),s(),h(e.clicked?-1:1),s(),h(e.clicked?2:-1)}}var Re=(()=>{class t{$activeModal=b(oe);$api=b(X);$router=b(H);$settings=b(Y);$toastr=b(Q);$translate=b(J);selectedBridge=G.required({});pairings=S([],{});clicked=S(!1,{});currentSelectedBridge=S("",{});selectedBridgeAccessories=S([],{});accessoriesExist=S(!1,{});toDelete=S([],{});isMatterSupported=this.$settings.isFeatureEnabled("matterSupport");ngOnInit(){this.currentSelectedBridge.set(this.selectedBridge()),this.loadCachedAccessories()}onBridgeChange(e){this.currentSelectedBridge.set(e),this.selectedBridgeAccessories.set(this.pairings().find(n=>n._id===this.currentSelectedBridge())?.accessories||[])}getCurrentlySelectedBridge(){let e=this.pairings().find(n=>n._id===this.currentSelectedBridge());return`${e.name} - ${e._username}`}toggleList(e,n,i,o){this.toDelete().some(g=>g.uuid===e&&g.cacheFile===n&&g.protocol===i)?this.toDelete.set(this.toDelete().filter(g=>g.uuid!==e||g.cacheFile!==n||g.protocol!==i)):this.toDelete.update(g=>[...g,{cacheFile:n,uuid:e,protocol:i,deviceId:o}])}isInList(e,n,i){return this.toDelete().some(o=>o.uuid===e&&o.cacheFile===n&&o.protocol===i)}removeAccessories(){return k(this,null,function*(){this.clicked.set(!0);let e=this.toDelete().filter(o=>o.protocol==="hap").map(o=>({uuid:o.uuid,cacheFile:o.cacheFile})),n=this.toDelete().filter(o=>o.protocol==="matter").map(o=>({uuid:o.uuid,deviceId:o.deviceId})),i=[];if(e.length>0&&i.push(this.$api.delete("/server/cached-accessories",{body:e})),this.isMatterSupported&&n.length>0&&i.push(this.$api.delete("/server/matter-accessories",{body:n})),i.length===0){this.clicked.set(!1);return}try{yield Promise.all(i),this.$toastr.success(this.$translate.instant("reset.accessory_ind.done"),this.$translate.instant("toast.title_success")),this.$activeModal.close(),this.$router.navigate(["/restart"],{queryParams:{restarting:!0}})}catch(o){this.clicked.set(!1),console.error(o),this.$toastr.error(this.$translate.instant("reset.accessory_ind.fail"),this.$translate.instant("toast.title_error"))}})}dismissModal(){this.$activeModal.dismiss("Dismiss")}loadCachedAccessories(){return k(this,null,function*(){try{let e=this.isMatterSupported?[this.$api.get("/server/cached-accessories"),this.$api.get("/server/matter-accessories"),this.$api.get("/server/pairings")]:[this.$api.get("/server/cached-accessories"),this.$api.get("/server/pairings")],n=yield Promise.all(e),i=n[0],o=this.isMatterSupported?n[1]:[],g=this.isMatterSupported?n[2]:n[1],x=new Map(g.map(c=>[c._id,L(U({},c),{accessories:[]})]));i.sort((c,d)=>c.displayName.localeCompare(d.displayName)).forEach(c=>{let d=g.find(re=>re._main),w=c.$cacheFile?.split(".")?.[1]||d._id;(!this.selectedBridge||this.selectedBridge===w)&&(x.has(w)||x.set(w,{_id:w,_username:w.match(/.{1,2}/g).join(":"),name:this.$translate.instant("reset.accessory_ind.unknown"),accessories:[]}),c.$protocol="hap",x.get(w).accessories.push(c))}),this.isMatterSupported&&o.sort((c,d)=>c.displayName.localeCompare(d.displayName)).forEach(c=>{let d=c.$deviceId;(!this.selectedBridge||this.selectedBridge===d)&&(x.has(d)||x.set(d,{_id:d,_username:d.match(/.{1,2}/g).join(":"),name:this.$translate.instant("reset.accessory_ind.unknown"),accessories:[]}),c.$protocol="matter",c.$cacheFile=d,x.get(d).accessories.push(c))});let ae=Array.from(x.values()).filter(c=>c.accessories.length>0).sort((c,d)=>c._main&&!d._main?-1:!c._main&&d._main?1:c.name.localeCompare(d.name));this.pairings.set(ae);let N=this.selectedBridge()||this.pairings()[0]?._id;N&&(this.currentSelectedBridge.set(N),this.accessoriesExist.set(!0),this.selectedBridgeAccessories.set(this.pairings()[0].accessories))}catch(e){console.error(e),this.$toastr.error(this.$translate.instant("reset.error_message"),this.$translate.instant("toast.title_error")),this.$activeModal.close()}})}static \u0275fac=function(n){return new(n||t)};static \u0275cmp=P({type:t,selectors:[["ng-component"]],inputs:{selectedBridge:[1,"selectedBridge"]},decls:17,vars:12,consts:[[1,"modal-content"],[1,"modal-header"],[1,"modal-title"],["type","button","data-bs-dismiss","modal",1,"btn-close",3,"click","disabled"],[1,"modal-body"],[1,"modal-footer","justify-content-between"],[1,"text-start"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"disabled"],[1,"text-center"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant"],[1,"text-end"],["type","button","data-bs-dismiss","modal",1,"btn","btn-danger",3,"disabled"],[1,"text-center","mb-3"],[1,"fas","fa-circle-check","primary-text",2,"font-size","75px"],[1,"mb-0","text-center"],[1,"fas","fa-network-wired","primary-text",2,"font-size","75px"],[1,"mb-3"],[1,"list-group","list-group-box","mb-0"],[1,"list-group-item","d-flex","flex-column","flex-md-row","align-items-center"],[1,"list-group-item","d-flex","justify-content-between","align-items-center"],[1,"list-group-item","text-center","grey-text","small"],["for","bridgeSelect",1,"mb-2","mb-md-0","w-100","w-md-50"],[1,"text-start","text-md-end","w-100","w-md-50"],["id","bridgeSelect",1,"custom-select",3,"ngModelChange","change","ngModel"],[3,"value"],[1,"mb-2","mb-md-0","w-100","w-md-50"],[1,"text-start","text-md-end","w-100","w-md-50","grey-text","font-monospace"],[1,"me-3"],[1,"fas","fa-lg"],[1,"flex-grow-1"],[1,"font-monospace","grey-text"],[1,"btn","btn-danger","m-0","ms-3",3,"click","disabled"],[1,"fas"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"click","disabled"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"click"],["type","button","data-bs-dismiss","modal",1,"btn","btn-danger",3,"click","disabled"],[1,"fas","fa-spinner","fa-pulse"]],template:function(n,i){n&1&&(a(0,"div",0)(1,"div",1)(2,"h5",2),p(3),u(4,"translate"),r(),a(5,"button",3),u(6,"translate"),y("click",function(){return i.dismissModal()}),r()(),a(7,"div",4),v(8,pe,5,3),v(9,ve,17,11),r(),a(10,"div",5)(11,"div",6),v(12,he,3,4,"button",7),r(),a(13,"div",8),v(14,fe,3,3,"button",9),r(),a(15,"div",10),v(16,Ie,3,3,"button",11),r()()()),n&2&&(s(3),f(_(4,8,"reset.accessory_ind.title")),s(2),A("disabled",i.clicked),D("aria-label",_(6,10,"form.button_close")),s(3),h(i.accessoriesExist?-1:8),s(),h(i.accessoriesExist?9:-1),s(3),h(i.accessoriesExist?12:-1),s(2),h(i.accessoriesExist?-1:14),s(2),h(i.accessoriesExist?16:-1))},dependencies:[se,ie,ne,te,Z,ee,K],encapsulation:2})}return t})();export{Re as a};
@@ -1,4 +1,4 @@
1
- import{a as bt,b as _t,c as jt,d as Ct}from"./chunk-GJ42U6LP.js";import{a as ut}from"./chunk-H2D3SCVU.js";import{a as At}from"./chunk-H7F7H5MW.js";import{a as vt}from"./chunk-TVEZZ2CK.js";import{b as B}from"./chunk-ZCGZM7LU.js";import{a as yt,b as wt}from"./chunk-IZHFI46L.js";import{m as ft,n as ht,t as U}from"./chunk-MS4K4KAK.js";import{c as at,e as I}from"./chunk-TRDYZJYI.js";import"./chunk-BGCYR25X.js";import{C as gt,D as mt,c as dt,e as ct,l as pt}from"./chunk-UO7KCTHV.js";import{b as lt}from"./chunk-T472BWYK.js";import{E as H,F as O,H as N,K as F,j as rt}from"./chunk-2TQEV57U.js";import{Ab as x,Cb as it,Db as nt,Eb as st,Ec as r,Fb as u,Fc as l,Gb as a,Gc as Y,Hb as d,Ib as g,Rb as E,Xb as b,Za as o,Zb as p,aa as m,ga as f,ha as h,hb as et,ic as ot,jc as K,kc as y,lc as M,mc as V,nb as R,sa as v,yb as $,zb as S,zc as G}from"./chunk-MKV5RAJQ.js";import{a as j,b as W,d as Z,g as tt,h as C}from"./chunk-B4AJQJMI.js";var xt=tt(jt(),1);var $t=tt(At(),1);var kt=(s,w)=>({"fa-trash":s,"fa-cog fa-spin":w});function Vt(s,w){s&1&&(a(0,"div",13),g(1,"i",20),d())}function It(s,w){if(s&1){let t=E();a(0,"li",9)(1,"span"),y(2),r(3,"date"),g(4,"br"),a(5,"span",21),y(6),r(7,"date"),d()(),a(8,"span",22)(9,"button",25),r(10,"translate"),r(11,"translate"),b("click",function(){let i=f(t).$implicit,n=p(2);return h(n.restore(i.id))}),g(12,"i",26),d(),a(13,"button",27),r(14,"translate"),r(15,"translate"),b("click",function(){let i=f(t).$implicit,n=p(2);return h(n.download(i.id))}),g(16,"i",28),d(),a(17,"button",23),r(18,"translate"),r(19,"translate"),b("click",function(){let i=f(t).$implicit,n=p(2);return h(n.delete(i.id))}),g(20,"i",24),d()()()}if(s&2){let t=w.$implicit,e=p(2);o(2),V(" ",Y(3,16,t.timestamp,"mediumDate")),o(4),M(Y(7,19,t.timestamp,"shortTime")),o(3),u("disabled",e.clicked()||e.deleting())("ngbTooltip",l(10,22,"config.restore.copy_to_editor"))("openDelay",150),$("aria-label",l(11,24,"config.restore.copy_to_editor")),o(4),u("disabled",e.clicked()||e.deleting())("ngbTooltip",l(14,26,"form.button_download"))("openDelay",150),$("aria-label",l(15,28,"form.button_download")),o(4),u("disabled",e.clicked()||e.deleting())("ngbTooltip",l(18,30,"form.button_delete"))("openDelay",150),$("aria-label",l(19,32,"form.button_delete")),o(3),K(G(34,kt,t.id!==e.deleting(),t.id===e.deleting()))}}function Ht(s,w){if(s&1){let t=E();a(0,"ul",14),nt(1,It,21,37,"li",9,it),a(3,"li",9)(4,"span"),y(5),r(6,"translate"),g(7,"br"),a(8,"span",21),y(9),r(10,"translate"),d()(),a(11,"span",22)(12,"button",23),r(13,"translate"),r(14,"translate"),b("click",function(){f(t);let i=p();return h(i.deleteAllBackups())}),g(15,"i",24),d()()()()}if(s&2){let t=p();o(),st(t.backupList()),o(4),V(" ",l(6,8,"form.button_delete_all")),o(4),M(l(10,10,"common.labels.no_confirmation")),o(3),u("disabled",t.clicked()||t.deleting())("ngbTooltip",l(13,12,"form.button_delete_all"))("openDelay",150),$("aria-label",l(14,14,"form.button_delete")),o(3),K(G(16,kt,t.deleting()!=="all",t.deleting()==="all"))}}var St=(()=>{class s{$activeModal=m(ft);$api=m(F);$router=m(I);$toastr=m(N);$translate=m(H);_currentConfig=v("",{});_fromSettings=v(!1,{});set currentConfig(t){this._currentConfig.set(t)}get currentConfig(){return this._currentConfig()}set fromSettings(t){this._fromSettings.set(t)}get fromSettings(){return this._fromSettings()}currentConfigSignal=this._currentConfig.asReadonly();fromSettingsSignal=this._fromSettings.asReadonly();loading=v(!0,{});backupList=v([],{});clicked=v(!1,{});deleting=v(null,{});ngOnInit(){this.getConfigBackups()}getConfigBackups(){return C(this,null,function*(){try{let t=yield this.$api.get("/config-editor/backups");this.loading.set(!1),this.backupList.set(t)}catch(t){this.loading.set(!1),console.error(t),this.$toastr.error(t.error?.message||t.message,this.$translate.instant("toast.title_error")),this.dismissModal()}})}restore(t){return this.$activeModal.close(t)}download(t){return C(this,null,function*(){this.clicked.set(!0);try{let e=yield this.$api.get(`/config-editor/backups/${t}`),i=JSON.stringify(e,null,4),n=new Blob([i],{type:"application/json"}),k=`config-backup-${t}.json`;(0,$t.saveAs)(n,k),this.clicked.set(!1)}catch(e){this.clicked.set(!1),this.$toastr.error(e.error?.message||e.message,this.$translate.instant("toast.title_error")),console.error(e)}})}downloadCurrentConfig(){let t=`data:text/json;charset=utf-8,${encodeURIComponent(this._currentConfig())}`,e=document.createElement("a");e.setAttribute("href",t),e.setAttribute("download","config.json"),document.body.appendChild(e),e.click(),e.remove()}delete(t){return C(this,null,function*(){this.deleting.set(t);try{yield this.$api.delete(`/config-editor/backups/${t}`),yield this.getConfigBackups(),this.deleting.set(null)}catch(e){this.deleting.set(null),this.$toastr.error(e.error?.message||e.message,this.$translate.instant("toast.title_error")),console.error(e)}})}deleteAllBackups(){return C(this,null,function*(){this.deleting.set("all");try{yield this.$api.delete("/config-editor/backups"),this.$toastr.success(this.$translate.instant("config.restore.toast_backups_deleted"),this.$translate.instant("toast.title_success")),this.backupList.set([]),this.deleting.set(null)}catch(t){this.$toastr.error(t.error?.message||t.message,this.$translate.instant("toast.title_error")),console.error(t),this.deleting.set(null)}})}dismissModal(){this._fromSettings()&&this.$router.navigate(["/settings"]),this.$activeModal.dismiss("Dismiss")}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=R({type:s,selectors:[["ng-component"]],decls:40,vars:31,consts:[[1,"modal-content"],[1,"modal-header"],[1,"modal-title"],["type","button","data-bs-dismiss","modal",1,"btn-close",3,"click","disabled"],[1,"modal-body"],[1,"text-center","mb-3"],[1,"fas","fa-history","primary-text",2,"font-size","75px"],[1,"mb-3"],[1,"list-group","list-group-box","mb-0"],[1,"list-group-item","d-flex","justify-content-between","align-items-center"],[1,"grey-text"],[1,"btn","btn-primary","m-0","ms-3","py-1",3,"click","disabled"],[1,"fas","fa-arrow-right"],[1,"text-center","primary-text"],[1,"list-group","list-group-box","mt-3"],[1,"modal-footer","justify-content-between"],[1,"text-start"],[1,"text-center"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"click","disabled"],[1,"text-end"],[1,"fa","fa-cog","fa-spin","mt-3",2,"font-size","75px"],[1,"grey-text","small"],[2,"display","flex","flex-wrap","nowrap"],["placement","bottom","container","modal","triggers","hover",1,"btn","btn-danger","m-0","ms-2",3,"click","disabled","ngbTooltip","openDelay"],[1,"fas"],["placement","bottom","container","modal","triggers","hover",1,"btn","btn-primary","m-0","ms-3","py-1",3,"click","disabled","ngbTooltip","openDelay"],[1,"fas","fa-history"],["placement","bottom","container","modal","triggers","hover",1,"btn","btn-primary","m-0","ms-2",3,"click","disabled","ngbTooltip","openDelay"],[1,"fas","fa-download"]],template:function(e,i){e&1&&(a(0,"div",0)(1,"div",1)(2,"h5",2),y(3),r(4,"translate"),d(),a(5,"button",3),r(6,"translate"),b("click",function(){return i.dismissModal()}),d()(),a(7,"div",4)(8,"div",5),g(9,"i",6),d(),a(10,"ul",7)(11,"li"),y(12),r(13,"translate"),d(),a(14,"li"),y(15),r(16,"translate"),d()(),a(17,"ul",8)(18,"li",9)(19,"div")(20,"span"),y(21),r(22,"translate"),d(),g(23,"br"),a(24,"small",10),y(25),r(26,"translate"),d()(),a(27,"button",11),r(28,"translate"),b("click",function(){return i.downloadCurrentConfig()}),g(29,"i",12),d()()(),S(30,Vt,2,0,"div",13)(31,Ht,16,19,"ul",14),d(),a(32,"div",15),g(33,"div",16),a(34,"div",17)(35,"button",18),r(36,"translate"),b("click",function(){return i.dismissModal()}),y(37),r(38,"translate"),d()(),g(39,"div",19),d()()),e&2&&(o(3),M(l(4,13,"config.restore.title")),o(2),u("disabled",i.clicked()||i.deleting()),$("aria-label",l(6,15,"form.button_close")),o(7),M(l(13,17,"config.restore.help_1")),o(3),M(l(16,19,"config.restore.help_2")),o(6),M(l(22,21,"form.button_download")),o(4),M(l(26,23,"config.restore.download")),o(2),u("disabled",i.clicked()||i.deleting()),$("aria-label",l(28,25,"backup.backup_now")),o(3),x(i.loading()?30:i.backupList().length?31:-1),o(5),u("disabled",i.clicked()||i.deleting()),$("aria-label",l(36,27,"form.button_close")),o(2),V(" ",l(38,29,"form.button_close")," "))},dependencies:[U,mt,rt,O],encapsulation:2})}return s})();function Ot(s,w){if(s&1){let t=E();a(0,"button",13),r(1,"translate"),r(2,"translate"),b("click",function(){f(t);let i=p();return h(i.onCancelRestore())}),g(3,"i",14),d()}if(s&2){let t=p();u("disabled",t.saveInProgress())("openDelay",150)("ngbTooltip",l(1,4,"form.button_cancel")),$("aria-label",l(2,6,"form.button_cancel"))}}function Nt(s,w){if(s&1){let t=E();a(0,"button",15),r(1,"translate"),r(2,"translate"),b("click",function(){f(t);let i=p();return h(i.onRestore())}),g(3,"i",16),d()}s&2&&(u("openDelay",150)("ngbTooltip",l(1,3,"form.button_restore")),$("aria-label",l(2,5,"form.button_restore")))}function Ft(s,w){if(s&1){let t=E();a(0,"button",15),r(1,"translate"),r(2,"translate"),b("click",function(){f(t);let i=p();return h(i.toggleSideBySide())}),g(3,"i",17),d()}if(s&2){let t=p();u("openDelay",150)("ngbTooltip",l(1,7,t.renderSideBySide()?"config.restore.view_inline":"config.restore.view_side_by_side")),$("aria-label",l(2,9,t.renderSideBySide()?"config.restore.view_inline":"config.restore.view_side_by_side")),o(3),ot("fa-columns",!t.renderSideBySide())("fa-bars",t.renderSideBySide())}}function Ut(s,w){s&1&&g(0,"i",8)}function qt(s,w){s&1&&g(0,"i",9)}function zt(s,w){if(s&1){let t=E();a(0,"ngx-monaco-editor",18),b("onInit",function(i){f(t);let n=p();return h(n.onEditorInit(i))})("keydown.control.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())})("keydown.meta.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())}),d()}if(s&2){let t=p();u("options",t.editorOptions)("model",t.monacoEditorModel)}}function Jt(s,w){if(s&1){let t=E();a(0,"ngx-monaco-diff-editor",19),b("onInit",function(i){f(t);let n=p();return h(n.onInitDiffEditor(i))})("keydown.control.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())})("keydown.meta.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())}),d()}if(s&2){let t=p();u("options",t.editorOptions)("originalModel",t.diffOriginalModel)("modifiedModel",t.diffModifiedModel)}}function Lt(s,w){if(s&1){let t=E();a(0,"textarea",20),b("ngModelChange",function(i){f(t);let n=p();return h(n.homebridgeConfig.set(i))}),y(1," "),d()}if(s&2){let t=p();u("ngModel",t.homebridgeConfig())}}var $e=(()=>{class s{$api=m(F);$md=m(ut);$modal=m(ht);$monacoEditor=m(vt);$renderer=m(et);$route=m(at);$router=m(I);$settings=m(lt);$toastr=m(N);$translate=m(H);editorDecorations=[];lastHeight;visualViewPortEventCallback;latestSavedConfig;childBridgesToRestart=[];hbPendingRestart=!1;isDebugModeEnabled=this.$settings.isFeatureEnabled("childBridgeDebugMode");isMatterSupported=this.$settings.isFeatureEnabled("matterSupport");homebridgeConfig=v("",{});originalConfig=v("",{});saveInProgress=v(!1,{});isMobile=v(!1,{});monacoEditor;editorOptions;monacoEditorModel;diffOriginalModel;diffModifiedModel;renderSideBySide=v(!1,{});constructor(){this.isMobile.set(this.$md.detect.mobile())}ngOnInit(){let t=this.$translate.instant("menu.config_json_editor");this.$settings.setPageTitle(t),this.editorOptions={language:"json",theme:this.$settings.actualLightingMode==="dark"?"vs-dark":"vs-light",renderSideBySide:this.renderSideBySide(),renderIndicators:!0,ignoreTrimWhitespace:!1,glyphMargin:!0};let e=document.querySelector(".content");this.$renderer.setStyle(e,"height","100%"),this.visualViewPortEventCallback=()=>this.visualViewPortChanged(),this.lastHeight=window.innerHeight,window.visualViewport&&!this.isMobile()&&(window.visualViewport.addEventListener("resize",this.visualViewPortEventCallback,!0),this.$md.disableTouchMove()),this.visualViewPortEventCallback=()=>this.visualViewPortChanged(),this.lastHeight=window.innerHeight,window.visualViewport&&!this.isMobile()&&(window.visualViewport.addEventListener("resize",this.visualViewPortEventCallback,!0),this.$md.disableTouchMove()),this.$route.data.subscribe(n=>{this.homebridgeConfig.set(n.config),this.latestSavedConfig=JSON.parse(n.config),this.diffModifiedModel&&this.updateDiffModels()}),this.monacoEditorModel={value:"{}",language:"json",uri:window.monaco?window.monaco.Uri.parse("a://homebridge/config.json"):void 0},this.diffOriginalModel={code:"",language:"json"},this.diffModifiedModel={code:this.homebridgeConfig()||"{}",language:"json"},window.monaco?this.setMonacoEditorModel():this.$monacoEditor.readyEvent.toPromise().then(()=>this.setMonacoEditorModel()).catch(n=>{console.error("Failed to wait for monaco ready event:",n)});let{action:i}=this.$router.parseUrl(this.$router.url).queryParams;if(i){switch(i){case"restore":{this.onRestore(!0);break}}this.$router.navigate([],{queryParams:{},replaceUrl:!0,queryParamsHandling:""})}}onEditorInit(t){window.editor=t,this.monacoEditor=t,this.monacoEditor.getModel().setValue(this.homebridgeConfig())}onInitDiffEditor(t){this.monacoEditor=t.getModifiedEditor(),this.updateDiffModels(),window.editor=t}updateDiffModels(){if(this.diffOriginalModel&&(this.diffOriginalModel.code=this.originalConfig()||""),this.diffModifiedModel&&(this.diffModifiedModel.code=this.homebridgeConfig()||"{}"),window.editor&&window.editor.getOriginalEditor){let t=window.editor.getOriginalEditor(),e=window.editor.getModifiedEditor();if(t&&e){let i=t.getModel(),n=e.getModel();i&&i.setValue(this.originalConfig()||""),n&&n.setValue(this.homebridgeConfig()||"{}")}}}onSave(){return C(this,null,function*(){if(!this.saveInProgress()){this.monacoEditor&&(this.editorDecorations=this.monacoEditor.deltaDecorations(this.editorDecorations,[])),this.saveInProgress.set(!0);try{if(!this.isMobile()){yield this.monacoEditor.getAction("editor.action.formatDocument").run();let e=window.monaco.editor.getModelMarkers({owner:"json"});for(let i of e)if(i.message==="Duplicate object key"){this.saveInProgress.set(!1),this.$toastr.error(this.$translate.instant("config.config_invalid_json"),this.$translate.instant("toast.title_error"));return}this.homebridgeConfig.set(this.monacoEditor.getModel().getValue())}let t=this.parseConfigFromEditor();this.homebridgeConfig.set(JSON.stringify(t,null,4)),typeof t.bridge!="object"?this.$toastr.error(this.$translate.instant("config.config_bridge_missing"),this.$translate.instant("toast.title_error")):/^(?:[0-9A-F]{2}:){5}[0-9A-F]{2}$/i.test(t.bridge.username)?t.accessories&&!Array.isArray(t.accessories)?this.$toastr.error(this.$translate.instant("config.config_accessory_must_be_array"),this.$translate.instant("toast.title_error")):t.platforms&&!Array.isArray(t.platforms)?this.$toastr.error(this.$translate.instant("config.config_platform_must_be_array"),this.$translate.instant("toast.title_error")):t.platforms&&Array.isArray(t.platforms)&&!this.validateSection(t.platforms,"platform")||t.accessories&&Array.isArray(t.accessories)&&!this.validateSection(t.accessories,"accessory")||t.plugins&&Array.isArray(t.plugins)&&!this.validatePlugins(t.plugins,"plugins")||t.disabledPlugins&&Array.isArray(t.disabledPlugins)&&!this.validatePlugins(t.disabledPlugins,"disabledPlugins")||(yield this.saveConfig(t),this.originalConfig.set("")):this.$toastr.error(this.$translate.instant("config.config_username_error"),this.$translate.instant("toast.title_error"))}catch(t){console.error(t),this.$toastr.error(this.$translate.instant("config.config_invalid_json"),this.$translate.instant("toast.title_error"))}this.saveInProgress.set(!1)}})}onRestore(t=!1){let e=this.$modal.open(St,{size:"lg",backdrop:"static"});e.componentInstance.currentConfig=this.homebridgeConfig(),e.componentInstance.fromSettings=t,e.result.then(i=>C(this,null,function*(){try{this.originalConfig()||(this.originalConfig.set(this.homebridgeConfig()),this.updateDiffModels());let n=yield this.$api.get(`/config-editor/backups/${i}`);this.$toastr.info(this.$translate.instant("config.restore.confirm"),this.$translate.instant("config.title_backup_loaded")),this.homebridgeConfig.set(JSON.stringify(n,null,4)),this.updateDiffModels(),this.monacoEditor&&window.editor.modifiedEditor&&(this.editorDecorations=this.monacoEditor.deltaDecorations(this.editorDecorations,[]),this.monacoEditor.executeEdits("beautifier",[{identifier:"delete",range:new monaco.Range(1,1,this.monacoEditor.getModel().getLineCount()+10,1),text:"",forceMoveMarkers:!0}]),this.monacoEditor.executeEdits("beautifier",[{identifier:"insert",range:new monaco.Range(1,1,1,1),text:this.homebridgeConfig,forceMoveMarkers:!0}]))}catch(n){console.error(n),this.$toastr.error(n.error?.message||this.$translate.instant("backup.load_error"),this.$translate.instant("toast.title_error"))}})).catch(()=>{})}onCancelRestore(){if(window.editor&&window.editor.dispose)try{window.editor.dispose(),window.editor=void 0}catch{}this.homebridgeConfig.set(this.originalConfig()),this.originalConfig.set(""),this.renderSideBySide()&&this.toggleSideBySide(),this.updateDiffModels(),this.onRestore()}toggleSideBySide(){this.renderSideBySide.set(!this.renderSideBySide()),this.editorOptions=W(j({},this.editorOptions),{renderSideBySide:this.renderSideBySide()})}ngOnDestroy(){let t=document.querySelector(".content");this.$renderer.removeStyle(t,"height"),window.visualViewport&&(window.visualViewport.removeEventListener("resize",this.visualViewPortEventCallback,!0),this.$md.enableTouchMove());try{if(window.editor&&window.editor.dispose&&(window.editor.dispose(),window.editor=void 0),window.monaco){let e=window.monaco.Uri.parse("file:///original.json"),i=window.monaco.Uri.parse("file:///modified.json"),n=window.monaco.editor.getModel(e);n&&n.dispose();let k=window.monaco.editor.getModel(i);k&&k.dispose();let T=(window.monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas||[]).filter(P=>P.uri!=="http://homebridge/config.json");window.monaco.languages.json.jsonDefaults.setDiagnosticsOptions({validate:!0,allowComments:!1,schemas:T})}this.monacoEditor&&this.monacoEditor.dispose()}catch{}}validateSection(t,e){for(let i of t){if(typeof i!="object"||Array.isArray(i))return this.$toastr.error(this.$translate.instant("config.error_blocks_objects",{type:e}),this.$translate.instant("toast.title_error")),this.highlightOffendingArrayItem(i),!1;if(!i[e])return this.$toastr.error(this.$translate.instant("config.error_blocks_type",{type:e}),this.$translate.instant("toast.title_error")),this.highlightOffendingArrayItem(i),!1;if(typeof i[e]!="string")return this.$toastr.error(this.$translate.instant("config.error_string_type",{type:e}),this.$translate.instant("toast.title_error")),this.highlightOffendingArrayItem(i),!1}return!0}validatePlugins(t,e){for(let i of t)if(typeof i!="string")return this.$toastr.error(this.$translate.instant("config.error_string_array",{key:e}),this.$translate.instant("toast.title_error")),!1;return!0}highlightOffendingArrayItem(t){this.monacoEditor&&(t=JSON.stringify(t,null,4).split(`
1
+ import{a as bt,b as _t,c as jt,d as Ct}from"./chunk-5UTHYAO4.js";import{a as ut}from"./chunk-H2D3SCVU.js";import{a as At}from"./chunk-H7F7H5MW.js";import{a as vt}from"./chunk-TVEZZ2CK.js";import{b as B}from"./chunk-ZCGZM7LU.js";import{a as yt,b as wt}from"./chunk-W3WJ3GLW.js";import{m as ft,n as ht,t as U}from"./chunk-K3VXCKFJ.js";import{c as at,e as I}from"./chunk-P2U63MCR.js";import"./chunk-BGCYR25X.js";import{C as gt,D as mt,c as dt,e as ct,l as pt}from"./chunk-YAUW3QQV.js";import{b as lt}from"./chunk-72SK6LN3.js";import{E as H,F as O,H as N,K as F,j as rt}from"./chunk-B6EPFA4V.js";import{Ab as x,Cb as it,Db as nt,Eb as st,Ec as r,Fb as u,Fc as l,Gb as a,Gc as Y,Hb as d,Ib as g,Rb as E,Xb as b,Za as o,Zb as p,aa as m,ga as f,ha as h,hb as et,ic as ot,jc as K,kc as w,lc as M,mc as V,nb as R,sa as v,yb as $,zb as S,zc as G}from"./chunk-MKV5RAJQ.js";import{a as j,b as W,d as Z,g as tt,h as y}from"./chunk-B4AJQJMI.js";var xt=tt(jt(),1);var $t=tt(At(),1);var kt=(s,C)=>({"fa-trash":s,"fa-cog fa-spin":C});function Vt(s,C){s&1&&(a(0,"div",13),g(1,"i",20),d())}function It(s,C){if(s&1){let t=E();a(0,"li",9)(1,"span"),w(2),r(3,"date"),g(4,"br"),a(5,"span",21),w(6),r(7,"date"),d()(),a(8,"span",22)(9,"button",25),r(10,"translate"),r(11,"translate"),b("click",function(){let i=f(t).$implicit,n=p(2);return h(n.restore(i.id))}),g(12,"i",26),d(),a(13,"button",27),r(14,"translate"),r(15,"translate"),b("click",function(){let i=f(t).$implicit,n=p(2);return h(n.download(i.id))}),g(16,"i",28),d(),a(17,"button",23),r(18,"translate"),r(19,"translate"),b("click",function(){let i=f(t).$implicit,n=p(2);return h(n.delete(i.id))}),g(20,"i",24),d()()()}if(s&2){let t=C.$implicit,e=p(2);o(2),V(" ",Y(3,16,t.timestamp,"mediumDate")),o(4),M(Y(7,19,t.timestamp,"shortTime")),o(3),u("disabled",e.clicked()||e.deleting())("ngbTooltip",l(10,22,"config.restore.copy_to_editor"))("openDelay",150),$("aria-label",l(11,24,"config.restore.copy_to_editor")),o(4),u("disabled",e.clicked()||e.deleting())("ngbTooltip",l(14,26,"form.button_download"))("openDelay",150),$("aria-label",l(15,28,"form.button_download")),o(4),u("disabled",e.clicked()||e.deleting())("ngbTooltip",l(18,30,"form.button_delete"))("openDelay",150),$("aria-label",l(19,32,"form.button_delete")),o(3),K(G(34,kt,t.id!==e.deleting(),t.id===e.deleting()))}}function Ht(s,C){if(s&1){let t=E();a(0,"ul",14),nt(1,It,21,37,"li",9,it),a(3,"li",9)(4,"span"),w(5),r(6,"translate"),g(7,"br"),a(8,"span",21),w(9),r(10,"translate"),d()(),a(11,"span",22)(12,"button",23),r(13,"translate"),r(14,"translate"),b("click",function(){f(t);let i=p();return h(i.deleteAllBackups())}),g(15,"i",24),d()()()()}if(s&2){let t=p();o(),st(t.backupList()),o(4),V(" ",l(6,8,"form.button_delete_all")),o(4),M(l(10,10,"common.labels.no_confirmation")),o(3),u("disabled",t.clicked()||t.deleting())("ngbTooltip",l(13,12,"form.button_delete_all"))("openDelay",150),$("aria-label",l(14,14,"form.button_delete")),o(3),K(G(16,kt,t.deleting()!=="all",t.deleting()==="all"))}}var St=(()=>{class s{$activeModal=m(ft);$api=m(F);$router=m(I);$toastr=m(N);$translate=m(H);_currentConfig=v("",{});_fromSettings=v(!1,{});set currentConfig(t){this._currentConfig.set(t)}get currentConfig(){return this._currentConfig()}set fromSettings(t){this._fromSettings.set(t)}get fromSettings(){return this._fromSettings()}currentConfigSignal=this._currentConfig.asReadonly();fromSettingsSignal=this._fromSettings.asReadonly();loading=v(!0,{});backupList=v([],{});clicked=v(!1,{});deleting=v(null,{});ngOnInit(){this.getConfigBackups()}getConfigBackups(){return y(this,null,function*(){try{let t=yield this.$api.get("/config-editor/backups");this.loading.set(!1),this.backupList.set(t)}catch(t){this.loading.set(!1),console.error(t),this.$toastr.error(t.error?.message||t.message,this.$translate.instant("toast.title_error")),this.dismissModal()}})}restore(t){return this.$activeModal.close(t)}download(t){return y(this,null,function*(){this.clicked.set(!0);try{let e=yield this.$api.get(`/config-editor/backups/${t}`),i=JSON.stringify(e,null,4),n=new Blob([i],{type:"application/json"}),k=`config-backup-${t}.json`;(0,$t.saveAs)(n,k),this.clicked.set(!1)}catch(e){this.clicked.set(!1),this.$toastr.error(e.error?.message||e.message,this.$translate.instant("toast.title_error")),console.error(e)}})}downloadCurrentConfig(){let t=`data:text/json;charset=utf-8,${encodeURIComponent(this._currentConfig())}`,e=document.createElement("a");e.setAttribute("href",t),e.setAttribute("download","config.json"),document.body.appendChild(e),e.click(),e.remove()}delete(t){return y(this,null,function*(){this.deleting.set(t);try{yield this.$api.delete(`/config-editor/backups/${t}`),yield this.getConfigBackups(),this.deleting.set(null)}catch(e){this.deleting.set(null),this.$toastr.error(e.error?.message||e.message,this.$translate.instant("toast.title_error")),console.error(e)}})}deleteAllBackups(){return y(this,null,function*(){this.deleting.set("all");try{yield this.$api.delete("/config-editor/backups"),this.$toastr.success(this.$translate.instant("config.restore.toast_backups_deleted"),this.$translate.instant("toast.title_success")),this.backupList.set([]),this.deleting.set(null)}catch(t){this.$toastr.error(t.error?.message||t.message,this.$translate.instant("toast.title_error")),console.error(t),this.deleting.set(null)}})}dismissModal(){this._fromSettings()&&this.$router.navigate(["/settings"]),this.$activeModal.dismiss("Dismiss")}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=R({type:s,selectors:[["ng-component"]],decls:40,vars:31,consts:[[1,"modal-content"],[1,"modal-header"],[1,"modal-title"],["type","button","data-bs-dismiss","modal",1,"btn-close",3,"click","disabled"],[1,"modal-body"],[1,"text-center","mb-3"],[1,"fas","fa-history","primary-text",2,"font-size","75px"],[1,"mb-3"],[1,"list-group","list-group-box","mb-0"],[1,"list-group-item","d-flex","justify-content-between","align-items-center"],[1,"grey-text"],[1,"btn","btn-primary","m-0","ms-3","py-1",3,"click","disabled"],[1,"fas","fa-arrow-right"],[1,"text-center","primary-text"],[1,"list-group","list-group-box","mt-3"],[1,"modal-footer","justify-content-between"],[1,"text-start"],[1,"text-center"],["type","button","data-bs-dismiss","modal",1,"btn","btn-elegant",3,"click","disabled"],[1,"text-end"],[1,"fa","fa-cog","fa-spin","mt-3",2,"font-size","75px"],[1,"grey-text","small"],[2,"display","flex","flex-wrap","nowrap"],["placement","bottom","container","modal","triggers","hover",1,"btn","btn-danger","m-0","ms-2",3,"click","disabled","ngbTooltip","openDelay"],[1,"fas"],["placement","bottom","container","modal","triggers","hover",1,"btn","btn-primary","m-0","ms-3","py-1",3,"click","disabled","ngbTooltip","openDelay"],[1,"fas","fa-history"],["placement","bottom","container","modal","triggers","hover",1,"btn","btn-primary","m-0","ms-2",3,"click","disabled","ngbTooltip","openDelay"],[1,"fas","fa-download"]],template:function(e,i){e&1&&(a(0,"div",0)(1,"div",1)(2,"h5",2),w(3),r(4,"translate"),d(),a(5,"button",3),r(6,"translate"),b("click",function(){return i.dismissModal()}),d()(),a(7,"div",4)(8,"div",5),g(9,"i",6),d(),a(10,"ul",7)(11,"li"),w(12),r(13,"translate"),d(),a(14,"li"),w(15),r(16,"translate"),d()(),a(17,"ul",8)(18,"li",9)(19,"div")(20,"span"),w(21),r(22,"translate"),d(),g(23,"br"),a(24,"small",10),w(25),r(26,"translate"),d()(),a(27,"button",11),r(28,"translate"),b("click",function(){return i.downloadCurrentConfig()}),g(29,"i",12),d()()(),S(30,Vt,2,0,"div",13)(31,Ht,16,19,"ul",14),d(),a(32,"div",15),g(33,"div",16),a(34,"div",17)(35,"button",18),r(36,"translate"),b("click",function(){return i.dismissModal()}),w(37),r(38,"translate"),d()(),g(39,"div",19),d()()),e&2&&(o(3),M(l(4,13,"config.restore.title")),o(2),u("disabled",i.clicked()||i.deleting()),$("aria-label",l(6,15,"form.button_close")),o(7),M(l(13,17,"config.restore.help_1")),o(3),M(l(16,19,"config.restore.help_2")),o(6),M(l(22,21,"form.button_download")),o(4),M(l(26,23,"config.restore.download")),o(2),u("disabled",i.clicked()||i.deleting()),$("aria-label",l(28,25,"backup.backup_now")),o(3),x(i.loading()?30:i.backupList().length?31:-1),o(5),u("disabled",i.clicked()||i.deleting()),$("aria-label",l(36,27,"form.button_close")),o(2),V(" ",l(38,29,"form.button_close")," "))},dependencies:[U,mt,rt,O],encapsulation:2})}return s})();function Ot(s,C){if(s&1){let t=E();a(0,"button",13),r(1,"translate"),r(2,"translate"),b("click",function(){f(t);let i=p();return h(i.onCancelRestore())}),g(3,"i",14),d()}if(s&2){let t=p();u("disabled",t.saveInProgress())("openDelay",150)("ngbTooltip",l(1,4,"form.button_cancel")),$("aria-label",l(2,6,"form.button_cancel"))}}function Nt(s,C){if(s&1){let t=E();a(0,"button",15),r(1,"translate"),r(2,"translate"),b("click",function(){f(t);let i=p();return h(i.onRestore())}),g(3,"i",16),d()}s&2&&(u("openDelay",150)("ngbTooltip",l(1,3,"form.button_restore")),$("aria-label",l(2,5,"form.button_restore")))}function Ft(s,C){if(s&1){let t=E();a(0,"button",15),r(1,"translate"),r(2,"translate"),b("click",function(){f(t);let i=p();return h(i.toggleSideBySide())}),g(3,"i",17),d()}if(s&2){let t=p();u("openDelay",150)("ngbTooltip",l(1,7,t.renderSideBySide()?"config.restore.view_inline":"config.restore.view_side_by_side")),$("aria-label",l(2,9,t.renderSideBySide()?"config.restore.view_inline":"config.restore.view_side_by_side")),o(3),ot("fa-columns",!t.renderSideBySide())("fa-bars",t.renderSideBySide())}}function Ut(s,C){s&1&&g(0,"i",8)}function qt(s,C){s&1&&g(0,"i",9)}function zt(s,C){if(s&1){let t=E();a(0,"ngx-monaco-editor",18),b("onInit",function(i){f(t);let n=p();return h(n.onEditorInit(i))})("keydown.control.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())})("keydown.meta.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())}),d()}if(s&2){let t=p();u("options",t.editorOptions)("model",t.monacoEditorModel)}}function Jt(s,C){if(s&1){let t=E();a(0,"ngx-monaco-diff-editor",19),b("onInit",function(i){f(t);let n=p();return h(n.onInitDiffEditor(i))})("keydown.control.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())})("keydown.meta.s",function(i){f(t);let n=p();return i.preventDefault(),h(n.onSave())}),d()}if(s&2){let t=p();u("options",t.editorOptions)("originalModel",t.diffOriginalModel)("modifiedModel",t.diffModifiedModel)}}function Lt(s,C){if(s&1){let t=E();a(0,"textarea",20),b("ngModelChange",function(i){f(t);let n=p();return h(n.homebridgeConfig.set(i))}),w(1," "),d()}if(s&2){let t=p();u("ngModel",t.homebridgeConfig())}}var $e=(()=>{class s{$api=m(F);$md=m(ut);$modal=m(ht);$monacoEditor=m(vt);$renderer=m(et);$route=m(at);$router=m(I);$settings=m(lt);$toastr=m(N);$translate=m(H);editorDecorations=[];lastHeight;visualViewPortEventCallback;latestSavedConfig;childBridgesToRestart=[];hbPendingRestart=!1;isDebugModeEnabled=this.$settings.isFeatureEnabled("childBridgeDebugMode");isMatterSupported=this.$settings.isFeatureEnabled("matterSupport");homebridgeConfig=v("",{});originalConfig=v("",{});saveInProgress=v(!1,{});isMobile=v(!1,{});monacoEditor;editorOptions;monacoEditorModel;diffOriginalModel;diffModifiedModel;renderSideBySide=v(!1,{});constructor(){this.isMobile.set(this.$md.detect.mobile())}ngOnInit(){let t=this.$translate.instant("menu.config_json_editor");this.$settings.setPageTitle(t),this.editorOptions={language:"json",theme:this.$settings.actualLightingMode==="dark"?"vs-dark":"vs-light",renderSideBySide:this.renderSideBySide(),renderIndicators:!0,ignoreTrimWhitespace:!1,glyphMargin:!0};let e=document.querySelector(".content");this.$renderer.setStyle(e,"height","100%"),this.visualViewPortEventCallback=()=>this.visualViewPortChanged(),this.lastHeight=window.innerHeight,window.visualViewport&&!this.isMobile()&&(window.visualViewport.addEventListener("resize",this.visualViewPortEventCallback,!0),this.$md.disableTouchMove()),this.visualViewPortEventCallback=()=>this.visualViewPortChanged(),this.lastHeight=window.innerHeight,window.visualViewport&&!this.isMobile()&&(window.visualViewport.addEventListener("resize",this.visualViewPortEventCallback,!0),this.$md.disableTouchMove()),this.$route.data.subscribe(n=>{this.homebridgeConfig.set(n.config),this.latestSavedConfig=JSON.parse(n.config),this.diffModifiedModel&&this.updateDiffModels()}),this.monacoEditorModel={value:"{}",language:"json",uri:window.monaco?window.monaco.Uri.parse("a://homebridge/config.json"):void 0},this.diffOriginalModel={code:"",language:"json"},this.diffModifiedModel={code:this.homebridgeConfig()||"{}",language:"json"},window.monaco?this.setMonacoEditorModel():this.waitForMonaco();let{action:i}=this.$router.parseUrl(this.$router.url).queryParams;if(i){switch(i){case"restore":{this.onRestore(!0);break}}this.$router.navigate([],{queryParams:{},replaceUrl:!0,queryParamsHandling:""})}}waitForMonaco(){return y(this,null,function*(){try{yield this.$monacoEditor.readyEvent.toPromise(),this.setMonacoEditorModel()}catch(t){console.error("Failed to wait for monaco ready event:",t)}})}onEditorInit(t){window.editor=t,this.monacoEditor=t,this.monacoEditor.getModel().setValue(this.homebridgeConfig())}onInitDiffEditor(t){this.monacoEditor=t.getModifiedEditor(),this.updateDiffModels(),window.editor=t}updateDiffModels(){if(this.diffOriginalModel&&(this.diffOriginalModel.code=this.originalConfig()||""),this.diffModifiedModel&&(this.diffModifiedModel.code=this.homebridgeConfig()||"{}"),window.editor&&window.editor.getOriginalEditor){let t=window.editor.getOriginalEditor(),e=window.editor.getModifiedEditor();if(t&&e){let i=t.getModel(),n=e.getModel();i&&i.setValue(this.originalConfig()||""),n&&n.setValue(this.homebridgeConfig()||"{}")}}}onSave(){return y(this,null,function*(){if(!this.saveInProgress()){this.monacoEditor&&(this.editorDecorations=this.monacoEditor.deltaDecorations(this.editorDecorations,[])),this.saveInProgress.set(!0);try{if(!this.isMobile()){yield this.monacoEditor.getAction("editor.action.formatDocument").run();let e=window.monaco.editor.getModelMarkers({owner:"json"});for(let i of e)if(i.message==="Duplicate object key"){this.saveInProgress.set(!1),this.$toastr.error(this.$translate.instant("config.config_invalid_json"),this.$translate.instant("toast.title_error"));return}this.homebridgeConfig.set(this.monacoEditor.getModel().getValue())}let t=this.parseConfigFromEditor();this.homebridgeConfig.set(JSON.stringify(t,null,4)),typeof t.bridge!="object"?this.$toastr.error(this.$translate.instant("config.config_bridge_missing"),this.$translate.instant("toast.title_error")):/^(?:[0-9A-F]{2}:){5}[0-9A-F]{2}$/i.test(t.bridge.username)?t.accessories&&!Array.isArray(t.accessories)?this.$toastr.error(this.$translate.instant("config.config_accessory_must_be_array"),this.$translate.instant("toast.title_error")):t.platforms&&!Array.isArray(t.platforms)?this.$toastr.error(this.$translate.instant("config.config_platform_must_be_array"),this.$translate.instant("toast.title_error")):t.platforms&&Array.isArray(t.platforms)&&!this.validateSection(t.platforms,"platform")||t.accessories&&Array.isArray(t.accessories)&&!this.validateSection(t.accessories,"accessory")||t.plugins&&Array.isArray(t.plugins)&&!this.validatePlugins(t.plugins,"plugins")||t.disabledPlugins&&Array.isArray(t.disabledPlugins)&&!this.validatePlugins(t.disabledPlugins,"disabledPlugins")||(yield this.saveConfig(t),this.originalConfig.set("")):this.$toastr.error(this.$translate.instant("config.config_username_error"),this.$translate.instant("toast.title_error"))}catch(t){console.error(t),this.$toastr.error(this.$translate.instant("config.config_invalid_json"),this.$translate.instant("toast.title_error"))}this.saveInProgress.set(!1)}})}onRestore(t=!1){return y(this,null,function*(){let e=this.$modal.open(St,{size:"lg",backdrop:"static"});e.componentInstance.currentConfig=this.homebridgeConfig(),e.componentInstance.fromSettings=t;try{let i=yield e.result;try{this.originalConfig()||(this.originalConfig.set(this.homebridgeConfig()),this.updateDiffModels());let n=yield this.$api.get(`/config-editor/backups/${i}`);this.$toastr.info(this.$translate.instant("config.restore.confirm"),this.$translate.instant("config.title_backup_loaded")),this.homebridgeConfig.set(JSON.stringify(n,null,4)),this.updateDiffModels(),this.monacoEditor&&window.editor.modifiedEditor&&(this.editorDecorations=this.monacoEditor.deltaDecorations(this.editorDecorations,[]),this.monacoEditor.executeEdits("beautifier",[{identifier:"delete",range:new monaco.Range(1,1,this.monacoEditor.getModel().getLineCount()+10,1),text:"",forceMoveMarkers:!0}]),this.monacoEditor.executeEdits("beautifier",[{identifier:"insert",range:new monaco.Range(1,1,1,1),text:this.homebridgeConfig,forceMoveMarkers:!0}]))}catch(n){console.error(n),this.$toastr.error(n.error?.message||this.$translate.instant("backup.load_error"),this.$translate.instant("toast.title_error"))}}catch{}})}onCancelRestore(){if(window.editor&&window.editor.dispose)try{window.editor.dispose(),window.editor=void 0}catch{}this.homebridgeConfig.set(this.originalConfig()),this.originalConfig.set(""),this.renderSideBySide()&&this.toggleSideBySide(),this.updateDiffModels(),this.onRestore()}toggleSideBySide(){this.renderSideBySide.set(!this.renderSideBySide()),this.editorOptions=W(j({},this.editorOptions),{renderSideBySide:this.renderSideBySide()})}ngOnDestroy(){let t=document.querySelector(".content");this.$renderer.removeStyle(t,"height"),window.visualViewport&&(window.visualViewport.removeEventListener("resize",this.visualViewPortEventCallback,!0),this.$md.enableTouchMove());try{if(window.editor&&window.editor.dispose&&(window.editor.dispose(),window.editor=void 0),window.monaco){let e=window.monaco.Uri.parse("file:///original.json"),i=window.monaco.Uri.parse("file:///modified.json"),n=window.monaco.editor.getModel(e);n&&n.dispose();let k=window.monaco.editor.getModel(i);k&&k.dispose();let T=(window.monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas||[]).filter(P=>P.uri!=="http://homebridge/config.json");window.monaco.languages.json.jsonDefaults.setDiagnosticsOptions({validate:!0,allowComments:!1,schemas:T})}this.monacoEditor&&this.monacoEditor.dispose()}catch{}}validateSection(t,e){for(let i of t){if(typeof i!="object"||Array.isArray(i))return this.$toastr.error(this.$translate.instant("config.error_blocks_objects",{type:e}),this.$translate.instant("toast.title_error")),this.highlightOffendingArrayItem(i),!1;if(!i[e])return this.$toastr.error(this.$translate.instant("config.error_blocks_type",{type:e}),this.$translate.instant("toast.title_error")),this.highlightOffendingArrayItem(i),!1;if(typeof i[e]!="string")return this.$toastr.error(this.$translate.instant("config.error_string_type",{type:e}),this.$translate.instant("toast.title_error")),this.highlightOffendingArrayItem(i),!1}return!0}validatePlugins(t,e){for(let i of t)if(typeof i!="string")return this.$toastr.error(this.$translate.instant("config.error_string_array",{key:e}),this.$translate.instant("toast.title_error")),!1;return!0}highlightOffendingArrayItem(t){this.monacoEditor&&(t=JSON.stringify(t,null,4).split(`
2
2
  `).map(e=>` ${e}`).join(`
3
3
  `),requestAnimationFrame(()=>{let e=this.monacoEditor.getModel().findMatches(t);if(e.length){let i=e[0].range,n=new monaco.Range(i.startLineNumber,i.startColumn,i.endLineNumber,i.endColumn);this.editorDecorations=this.monacoEditor.deltaDecorations(this.editorDecorations,[{range:n,options:{isWholeLine:!0,linesDecorationsClassName:"hb-monaco-editor-line-error"}}])}}))}setMonacoEditorModel(){if(window.monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas.some(i=>i.uri==="http://homebridge/config.json"))return;let t=monaco.Uri.parse("a://homebridge/config.json"),e=Ct(this.$translate,{isDebugModeEnabled:this.isDebugModeEnabled,isMatterSupported:this.isMatterSupported});window.monaco.languages.json.jsonDefaults.setDiagnosticsOptions({allowComments:!1,validate:!0,schemas:[{uri:"http://homebridge/config.json",fileMatch:[t.toString()],schema:{type:"object",additionalProperties:!1,required:["bridge"],properties:{bridge:{type:"object",additionalProperties:!1,required:["name","username","port","pin"],properties:j({name:{type:"string",title:this.$translate.instant("settings.name"),description:`The Homebridge instance name.
4
4
  This should be unique if you are running multiple instances of Homebridge.`,default:"Homebridge"},username:{type:"string",title:this.$translate.instant("users.label_username"),description:`Homebridge username must be 6 pairs of colon-separated hexadecimal characters (A-F 0-9).
@@ -16,4 +16,4 @@ Separate each plugin config block using a comma.`,items:{type:"object",required:
16
16
  Remove this array to enable all plugins.`,items:{type:"string",title:this.$translate.instant("accessories.plugin"),description:`The full plugin npm package name.
17
17
  Example: homebridge-dummy.`},default:["homebridge-config-ui-x"]},disabledPlugins:{type:"array",description:`An array of plugins that should be disabled.
18
18
  Requires Homebridge v1.3 or later.`,items:{type:"string",title:this.$translate.instant("accessories.plugin"),description:`The full plugin npm package name.
19
- Example: homebridge-dummy.`},default:[]}}}}]}),this.monacoEditorModel.uri=monaco.Uri.parse("a://homebridge/config.json")}visualViewPortChanged(){this.lastHeight<window.visualViewport.height&&document.activeElement.blur(),window.visualViewport.height<window.innerHeight?(this.$md.enableTouchMove(),this.lastHeight=window.visualViewport.height):window.visualViewport.height===window.innerHeight&&(this.$md.disableTouchMove(),this.lastHeight=window.visualViewport.height)}saveConfig(t){return C(this,null,function*(){try{let e=yield this.$api.post("/config-editor",t);this.homebridgeConfig.set(JSON.stringify(e,null,4)),yield this.detectSavesChangesForRestart()}catch(e){console.error(e),this.$toastr.error(this.$translate.instant("config.failed_to_save_config"),this.$translate.instant("toast.title_error"))}})}validateArraysEqual(t,e){if(t.length!==e.length)return!1;let i=[...t].sort(),n=[...e].sort();return i.every((k,_)=>k===n[_])}removePlatformsAndAccessories(t){let k=t,{accessories:e,platforms:i}=k;return Z(k,["accessories","platforms"])}removeEmptyBridges(t){return t.filter(e=>e._bridge&&Object.keys(e._bridge).length>0).map(e=>e._bridge)}validateBridgesEqual(t,e){return t.length!==e.length?!1:t.every(i=>e.some(n=>B(i,n)))}detectConfigPlatformChanges(){try{let t=this.latestSavedConfig,e=JSON.parse(this.homebridgeConfig()),i=(t.platforms||[]).find(T=>T.platform==="config"),n=(e.platforms||[]).find(T=>T.platform==="config"),k=i?.webroot||"",_=n?.webroot||"";return k!==_&&(_=_?`/${_}`.replace(/\/+/g,"/").replace(/\/$/,""):"",_==="/"&&(_=""),this.$settings.setItem("webroot",_),n&&(_&&this.$settings.originalWebroot!==globalThis.webroot.errorCode?n.webroot=_:delete n.webroot,this.homebridgeConfig.set(JSON.stringify(e,null,4)),this.monacoEditor&&this.monacoEditor.getModel().setValue(this.homebridgeConfig()))),!i&&n||i&&!n?!0:!i&&!n?!1:!B(i,n)}catch(t){return console.error("Error detecting config platform changes:",t),!1}}detectSavesChangesForRestart(){return C(this,null,function*(){let t=yield this.determineRestartType();if(t==="full"){let e=this.detectConfigPlatformChanges();yield this.performFullRestart(e)}else t==="child"&&(yield this.performChildBridgeRestart());this.latestSavedConfig=JSON.parse(this.homebridgeConfig())})}determineRestartType(){return C(this,null,function*(){if(this.hbPendingRestart)return"full";let t=this.latestSavedConfig,e=JSON.stringify(t,null,4),i=JSON.parse(this.homebridgeConfig()),n=this.homebridgeConfig();if(e===n&&!this.childBridgesToRestart.length)return this.$toastr.info(this.$translate.instant("config.no_restart"),this.$translate.instant("config.config_saved")),"none";if(!this.validateArraysEqual(Object.keys(t),Object.keys(i))||[...i.platforms||[],...i.accessories||[]].every(c=>!c._bridge||!Object.keys(c._bridge).length))return"full";let _=this.removePlatformsAndAccessories(t),T=this.removePlatformsAndAccessories(i);if(!B(_,T))return"full";let P=t.platforms||[],q=i.platforms||[],Et=P.map(c=>c.platform),Mt=q.map(c=>c.platform);if(!this.validateArraysEqual(Et,Mt))return"full";let z=t.accessories||[],J=i.accessories||[],Tt=z.map(c=>c.accessory),Bt=J.map(c=>c.accessory);if(!this.validateArraysEqual(Tt,Bt)||!this.validateBridgesEqual(this.removeEmptyBridges(P),this.removeEmptyBridges(q))||!this.validateBridgesEqual(this.removeEmptyBridges(z),this.removeEmptyBridges(J)))return"full";let Q=P.filter(c=>!B(c,q.find(D=>D.platform===c.platform))),Pt=z.filter(c=>!B(c,J.find(D=>D.accessory===c.accessory))),X=[...Q,...Pt];if(Q.some(c=>c.platform==="config")||X.some(c=>c.platform==="config"?!1:!c._bridge||Object.keys(c._bridge).length===0))return"full";try{let c=yield this.$api.get("/status/homebridge/child-bridges");return X.forEach(D=>{let Dt=D._bridge.username.toUpperCase(),A=c.find(({username:L})=>L===Dt);if(A)this.childBridgesToRestart.some(L=>L.username===A.username)||this.childBridgesToRestart.push({name:A.name,username:A.username,matterSerialNumber:A.matterSerialNumber});else return"full"}),"child"}catch(c){return console.error("Error fetching child bridges:",c),"full"}})}performChildBridgeRestart(){return C(this,null,function*(){if(!this.childBridgesToRestart.length){yield this.performFullRestart(!1);return}let t=this.$modal.open(_t,{size:"lg",backdrop:"static"});t.componentInstance.bridges=this.childBridgesToRestart;try{yield t.result,this.childBridgesToRestart=[]}catch{}})}performFullRestart(t){return C(this,null,function*(){t&&(yield this.$api.put("/platform-tools/hb-service/set-full-service-restart-flag",{}));let e=this.$modal.open(bt,{size:"lg",backdrop:"static"});try{yield e.result,this.hbPendingRestart=!1,this.childBridgesToRestart=[]}catch{this.hbPendingRestart=!0}})}parseConfigFromEditor(){try{return JSON.parse(this.homebridgeConfig())}catch{let e=xt.default.parse(this.homebridgeConfig());return this.homebridgeConfig.set(JSON.stringify(e,null,4)),this.monacoEditor&&this.monacoEditor.getModel().setValue(this.homebridgeConfig()),e}}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=R({type:s,selectors:[["ng-component"]],decls:18,vars:19,consts:[[1,"flex-column","d-flex","align-items-stretch","h-100"],[1,"row"],[1,"col-6"],[1,"primary-text","m-0"],[1,"col-6","text-end"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-danger","waves-effect","my-0","me-2",3,"disabled","openDelay","ngbTooltip"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-elegant","waves-effect","my-0","me-2",3,"openDelay","ngbTooltip"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-elegant","waves-effect","my-0","me-0",3,"click","disabled","openDelay","ngbTooltip"],[1,"fas","fa-floppy-disk"],[1,"fas","fa-spinner","fa-pulse"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"options","model"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"options","originalModel","modifiedModel"],["wrap","off","autocomplete","off","autocorrect","off","autocapitalize","off","spellcheck","false",1,"hb-plain-text-editor","align-self-end","h-100","w-100","my-3",3,"ngModel"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-danger","waves-effect","my-0","me-2",3,"click","disabled","openDelay","ngbTooltip"],[1,"fas","fa-times"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-elegant","waves-effect","my-0","me-2",3,"click","openDelay","ngbTooltip"],[1,"fas","fa-history"],[1,"fas"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"onInit","keydown.control.s","keydown.meta.s","options","model"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"onInit","keydown.control.s","keydown.meta.s","options","originalModel","modifiedModel"],["wrap","off","autocomplete","off","autocorrect","off","autocapitalize","off","spellcheck","false",1,"hb-plain-text-editor","align-self-end","h-100","w-100","my-3",3,"ngModelChange","ngModel"]],template:function(e,i){e&1&&(a(0,"div",0)(1,"div",1)(2,"div",2)(3,"h3",3),y(4),r(5,"translate"),d()(),a(6,"div",4),S(7,Ot,4,8,"button",5),S(8,Nt,4,7,"button",6),S(9,Ft,4,11,"button",6),a(10,"button",7),r(11,"translate"),r(12,"translate"),b("click",function(){return i.onSave()}),S(13,Ut,1,0,"i",8),S(14,qt,1,0,"i",9),d()()(),S(15,zt,1,2,"ngx-monaco-editor",10),S(16,Jt,1,3,"ngx-monaco-diff-editor",11),S(17,Lt,2,1,"textarea",12),d()),e&2&&(o(4),M(l(5,13,"menu.config_json_editor")),o(3),x(i.originalConfig()?7:-1),o(),x(i.originalConfig()?-1:8),o(),x(!i.isMobile()&&i.originalConfig()?9:-1),o(),u("disabled",i.saveInProgress())("openDelay",150)("ngbTooltip",l(11,15,"form.button_save")),$("aria-label",l(12,17,"form.button_save")),o(3),x(i.saveInProgress()?-1:13),o(),x(i.saveInProgress()?14:-1),o(),x(!i.isMobile()&&!i.originalConfig()?15:-1),o(),x(!i.isMobile()&&i.originalConfig()?16:-1),o(),x(i.isMobile()?17:-1))},dependencies:[U,yt,wt,gt,dt,ct,pt,O],encapsulation:2})}return s})();export{$e as ConfigEditorComponent};
19
+ Example: homebridge-dummy.`},default:[]}}}}]}),this.monacoEditorModel.uri=monaco.Uri.parse("a://homebridge/config.json")}visualViewPortChanged(){this.lastHeight<window.visualViewport.height&&document.activeElement.blur(),window.visualViewport.height<window.innerHeight?(this.$md.enableTouchMove(),this.lastHeight=window.visualViewport.height):window.visualViewport.height===window.innerHeight&&(this.$md.disableTouchMove(),this.lastHeight=window.visualViewport.height)}saveConfig(t){return y(this,null,function*(){try{let e=yield this.$api.post("/config-editor",t);this.homebridgeConfig.set(JSON.stringify(e,null,4)),yield this.detectSavesChangesForRestart()}catch(e){console.error(e),this.$toastr.error(this.$translate.instant("config.failed_to_save_config"),this.$translate.instant("toast.title_error"))}})}validateArraysEqual(t,e){if(t.length!==e.length)return!1;let i=[...t].sort(),n=[...e].sort();return i.every((k,_)=>k===n[_])}removePlatformsAndAccessories(t){let k=t,{accessories:e,platforms:i}=k;return Z(k,["accessories","platforms"])}removeEmptyBridges(t){return t.filter(e=>e._bridge&&Object.keys(e._bridge).length>0).map(e=>e._bridge)}validateBridgesEqual(t,e){return t.length!==e.length?!1:t.every(i=>e.some(n=>B(i,n)))}detectConfigPlatformChanges(){try{let t=this.latestSavedConfig,e=JSON.parse(this.homebridgeConfig()),i=(t.platforms||[]).find(T=>T.platform==="config"),n=(e.platforms||[]).find(T=>T.platform==="config"),k=i?.webroot||"",_=n?.webroot||"";return k!==_&&(_=_?`/${_}`.replace(/\/+/g,"/").replace(/\/$/,""):"",_==="/"&&(_=""),this.$settings.setItem("webroot",_),n&&(_&&this.$settings.originalWebroot!==globalThis.webroot.errorCode?n.webroot=_:delete n.webroot,this.homebridgeConfig.set(JSON.stringify(e,null,4)),this.monacoEditor&&this.monacoEditor.getModel().setValue(this.homebridgeConfig()))),!i&&n||i&&!n?!0:!i&&!n?!1:!B(i,n)}catch(t){return console.error("Error detecting config platform changes:",t),!1}}detectSavesChangesForRestart(){return y(this,null,function*(){let t=yield this.determineRestartType();if(t==="full"){let e=this.detectConfigPlatformChanges();yield this.performFullRestart(e)}else t==="child"&&(yield this.performChildBridgeRestart());this.latestSavedConfig=JSON.parse(this.homebridgeConfig())})}determineRestartType(){return y(this,null,function*(){if(this.hbPendingRestart)return"full";let t=this.latestSavedConfig,e=JSON.stringify(t,null,4),i=JSON.parse(this.homebridgeConfig()),n=this.homebridgeConfig();if(e===n&&!this.childBridgesToRestart.length)return this.$toastr.info(this.$translate.instant("config.no_restart"),this.$translate.instant("config.config_saved")),"none";if(!this.validateArraysEqual(Object.keys(t),Object.keys(i))||[...i.platforms||[],...i.accessories||[]].every(c=>!c._bridge||!Object.keys(c._bridge).length))return"full";let _=this.removePlatformsAndAccessories(t),T=this.removePlatformsAndAccessories(i);if(!B(_,T))return"full";let P=t.platforms||[],q=i.platforms||[],Et=P.map(c=>c.platform),Mt=q.map(c=>c.platform);if(!this.validateArraysEqual(Et,Mt))return"full";let z=t.accessories||[],J=i.accessories||[],Tt=z.map(c=>c.accessory),Bt=J.map(c=>c.accessory);if(!this.validateArraysEqual(Tt,Bt)||!this.validateBridgesEqual(this.removeEmptyBridges(P),this.removeEmptyBridges(q))||!this.validateBridgesEqual(this.removeEmptyBridges(z),this.removeEmptyBridges(J)))return"full";let Q=P.filter(c=>!B(c,q.find(D=>D.platform===c.platform))),Pt=z.filter(c=>!B(c,J.find(D=>D.accessory===c.accessory))),X=[...Q,...Pt];if(Q.some(c=>c.platform==="config")||X.some(c=>c.platform==="config"?!1:!c._bridge||Object.keys(c._bridge).length===0))return"full";try{let c=yield this.$api.get("/status/homebridge/child-bridges");return X.forEach(D=>{let Dt=D._bridge.username.toUpperCase(),A=c.find(({username:L})=>L===Dt);if(A)this.childBridgesToRestart.some(L=>L.username===A.username)||this.childBridgesToRestart.push({name:A.name,username:A.username,matterSerialNumber:A.matterSerialNumber});else return"full"}),"child"}catch(c){return console.error("Error fetching child bridges:",c),"full"}})}performChildBridgeRestart(){return y(this,null,function*(){if(!this.childBridgesToRestart.length){yield this.performFullRestart(!1);return}let t=this.$modal.open(_t,{size:"lg",backdrop:"static"});t.componentInstance.bridges=this.childBridgesToRestart;try{yield t.result,this.childBridgesToRestart=[]}catch{}})}performFullRestart(t){return y(this,null,function*(){t&&(yield this.$api.put("/platform-tools/hb-service/set-full-service-restart-flag",{}));let e=this.$modal.open(bt,{size:"lg",backdrop:"static"});try{yield e.result,this.hbPendingRestart=!1,this.childBridgesToRestart=[]}catch{this.hbPendingRestart=!0}})}parseConfigFromEditor(){try{return JSON.parse(this.homebridgeConfig())}catch{let e=xt.default.parse(this.homebridgeConfig());return this.homebridgeConfig.set(JSON.stringify(e,null,4)),this.monacoEditor&&this.monacoEditor.getModel().setValue(this.homebridgeConfig()),e}}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=R({type:s,selectors:[["ng-component"]],decls:18,vars:19,consts:[[1,"flex-column","d-flex","align-items-stretch","h-100"],[1,"row"],[1,"col-6"],[1,"primary-text","m-0"],[1,"col-6","text-end"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-danger","waves-effect","my-0","me-2",3,"disabled","openDelay","ngbTooltip"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-elegant","waves-effect","my-0","me-2",3,"openDelay","ngbTooltip"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-elegant","waves-effect","my-0","me-0",3,"click","disabled","openDelay","ngbTooltip"],[1,"fas","fa-floppy-disk"],[1,"fas","fa-spinner","fa-pulse"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"options","model"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"options","originalModel","modifiedModel"],["wrap","off","autocomplete","off","autocorrect","off","autocapitalize","off","spellcheck","false",1,"hb-plain-text-editor","align-self-end","h-100","w-100","my-3",3,"ngModel"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-danger","waves-effect","my-0","me-2",3,"click","disabled","openDelay","ngbTooltip"],[1,"fas","fa-times"],["container","body","placement","bottom","triggers","hover",1,"btn","btn-elegant","waves-effect","my-0","me-2",3,"click","openDelay","ngbTooltip"],[1,"fas","fa-history"],[1,"fas"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"onInit","keydown.control.s","keydown.meta.s","options","model"],[1,"flex-grow-1","h-100","w-100","mt-3","mb-0",3,"onInit","keydown.control.s","keydown.meta.s","options","originalModel","modifiedModel"],["wrap","off","autocomplete","off","autocorrect","off","autocapitalize","off","spellcheck","false",1,"hb-plain-text-editor","align-self-end","h-100","w-100","my-3",3,"ngModelChange","ngModel"]],template:function(e,i){e&1&&(a(0,"div",0)(1,"div",1)(2,"div",2)(3,"h3",3),w(4),r(5,"translate"),d()(),a(6,"div",4),S(7,Ot,4,8,"button",5),S(8,Nt,4,7,"button",6),S(9,Ft,4,11,"button",6),a(10,"button",7),r(11,"translate"),r(12,"translate"),b("click",function(){return i.onSave()}),S(13,Ut,1,0,"i",8),S(14,qt,1,0,"i",9),d()()(),S(15,zt,1,2,"ngx-monaco-editor",10),S(16,Jt,1,3,"ngx-monaco-diff-editor",11),S(17,Lt,2,1,"textarea",12),d()),e&2&&(o(4),M(l(5,13,"menu.config_json_editor")),o(3),x(i.originalConfig()?7:-1),o(),x(i.originalConfig()?-1:8),o(),x(!i.isMobile()&&i.originalConfig()?9:-1),o(),u("disabled",i.saveInProgress())("openDelay",150)("ngbTooltip",l(11,15,"form.button_save")),$("aria-label",l(12,17,"form.button_save")),o(3),x(i.saveInProgress()?-1:13),o(),x(i.saveInProgress()?14:-1),o(),x(!i.isMobile()&&!i.originalConfig()?15:-1),o(),x(!i.isMobile()&&i.originalConfig()?16:-1),o(),x(i.isMobile()?17:-1))},dependencies:[U,yt,wt,gt,dt,ct,pt,O],encapsulation:2})}return s})();export{$e as ConfigEditorComponent};