@mxtommy/kip 4.8.1 → 4.8.2

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 +12 -3
  2. package/package.json +1 -1
  3. package/public/{chunk-CNMFlw_H.js → chunk-7lulvsGI.js} +1 -1
  4. package/public/{chunk-CIlfzV9R.js → chunk-8hkXyEzG.js} +1 -1
  5. package/public/{chunk-DWLISAZi.js → chunk-B15lj2T8.js} +1 -1
  6. package/public/{chunk-BQr-tSkv.js → chunk-B6AwCAvV.js} +1 -1
  7. package/public/{chunk-CwSa_BNV.js → chunk-B6XxnPxk.js} +1 -1
  8. package/public/{chunk-DE4ylhpq.js → chunk-B8gfh4xf.js} +1 -1
  9. package/public/{chunk-C2VQxCXa.js → chunk-B8zRhoG8.js} +1 -1
  10. package/public/{chunk-Bp0MQwPM.js → chunk-BIYHVfJl.js} +1 -1
  11. package/public/{chunk-DzTTqoF_.js → chunk-BW4m3O2L.js} +1 -1
  12. package/public/{chunk-Ii9n-oiL.js → chunk-B_PiPxb4.js} +1 -1
  13. package/public/chunk-Bb1mO304.js +1 -0
  14. package/public/{chunk-MjWuPUhu.js → chunk-BdBWqZzL.js} +1 -1
  15. package/public/{chunk-hd2_AKwt.js → chunk-BgyxBAyq.js} +1 -1
  16. package/public/{chunk-JbEkcxJm.js → chunk-Bhah8DNM.js} +1 -1
  17. package/public/{chunk-DDqeRiB0.js → chunk-Bq-eHuZV.js} +1 -1
  18. package/public/{chunk-CpuB_ZZz.js → chunk-BxV0O2fU.js} +1 -1
  19. package/public/{chunk-PheXEqie.js → chunk-Bz9bswDl.js} +1 -1
  20. package/public/{chunk-BOAD0N2a.js → chunk-C3CwUYvD.js} +1 -1
  21. package/public/{chunk-CkXTl3su.js → chunk-C4FGoLDg.js} +1 -1
  22. package/public/{chunk-sNakMDHi.js → chunk-CCiqU2uY.js} +1 -1
  23. package/public/{chunk-00hwknVI.js → chunk-CHKQxw6E.js} +1 -1
  24. package/public/{chunk-B82ADJSs.js → chunk-CJIxuzvd.js} +1 -1
  25. package/public/{chunk-DumLX5k_.js → chunk-COMZv7NY.js} +1 -1
  26. package/public/{chunk-dgaOX1wC.js → chunk-CSpA60X7.js} +1 -1
  27. package/public/{chunk-C6UXF7BI.js → chunk-CU8RPnsi.js} +1 -1
  28. package/public/{chunk-CNNTuNlM.js → chunk-CcvYOops.js} +1 -1
  29. package/public/{chunk-CA6RRaxd.js → chunk-CdSWuWKr.js} +1 -1
  30. package/public/{chunk-DQnoPLyC.js → chunk-CjsnWLUr.js} +1 -1
  31. package/public/{chunk-BX6skw5k.js → chunk-CkfPr-c5.js} +1 -1
  32. package/public/{chunk-nu4vZg-z.js → chunk-CoEM_FqS.js} +1 -1
  33. package/public/{chunk-DNS-qsFC.js → chunk-Cr34s2uQ.js} +1 -1
  34. package/public/{chunk-BJz7Ij9E.js → chunk-Cu9FE8cB.js} +1 -1
  35. package/public/{chunk-B6bEhzNR.js → chunk-CyURmwWh.js} +1 -1
  36. package/public/{chunk-CrBxxZCe.js → chunk-D-xDPCf7.js} +1 -1
  37. package/public/{chunk-5U8d2Ygo.js → chunk-D0MyVrEL.js} +1 -1
  38. package/public/{chunk-DjZgzSiH.js → chunk-DBA0eRqb.js} +1 -1
  39. package/public/{chunk-BKj60jdq.js → chunk-DGOvRnAo.js} +1 -1
  40. package/public/{chunk-CXvG8mMq.js → chunk-DMhuBqKs.js} +1 -1
  41. package/public/{chunk-DchvLV_Y.js → chunk-DMoEBcor.js} +1 -1
  42. package/public/chunk-DSvdWjO4.js +1 -0
  43. package/public/{chunk-D4xZ2tGB.js → chunk-DVB9tiW3.js} +1 -1
  44. package/public/{chunk-Dxlia2NE.js → chunk-D_wrJJxl.js} +1 -1
  45. package/public/{chunk-BwOIef42.js → chunk-DfGLo6Tb.js} +1 -1
  46. package/public/{chunk-BdokyhBM.js → chunk-Di5pPpU7.js} +1 -1
  47. package/public/{chunk-BoNDCNGE.js → chunk-DjavLLpP.js} +1 -1
  48. package/public/{chunk-CL2xiH57.js → chunk-Dv77RFHm.js} +1 -1
  49. package/public/{chunk-AANk-NXH.js → chunk-NnB8OYZt.js} +3 -3
  50. package/public/{chunk-By8ZVvDx.js → chunk-h2q_pbbF.js} +1 -1
  51. package/public/{chunk-tAiV3ARh.js → chunk-o977r5_s.js} +1 -1
  52. package/public/{chunk-DXkKj21H.js → chunk-oPq9Nexl.js} +1 -1
  53. package/public/{chunk-VgxMqRPk.js → chunk-oZiyAw_P.js} +1 -1
  54. package/public/chunk-zg7II0hz.js +1 -0
  55. package/public/index.html +1 -1
  56. package/public/{main-BAV5VDOD.js → main-BNR44HGB.js} +20 -20
  57. package/public/chunk-Blokg6Ds.js +0 -1
  58. package/public/chunk-CpMCBDvH.js +0 -1
  59. package/public/chunk-y1imvaA-.js +0 -1
@@ -1,4 +1,4 @@
1
- import {O}from'./chunk-tAiV3ARh.js';import {m as me}from'./chunk-Bp0MQwPM.js';import {J as JD,aO as Sn$1,aP as Nt,c as $h,P as Pi,u as ul,B as Bh,w,aQ as ee,G as Gi$1,N,aR as lt,aS as De,aT as T,aU as I,aV as We,aW as w$1,aX as He$1,aY as xe,a7 as Gj,aZ as F,$ as $j,D as Dt$1,a_ as Gp,a$ as Zr,b0 as Wl,b1 as U,b2 as Ln$1,b3 as Gn$1,b4 as Xe,b5 as Pn$1,b6 as kn$1,b7 as ft$1,b8 as Ht,b9 as rn,ba as Qt,bb as rt,bc as ae,bd as an$1,be as It$1,bf as Kt,bg as mt,bh as xp,h as Fw,k as Qh,T as TT,bi as Eg,l as ud,bj as ST,m as dd,bk as cD,bl as Jw,e as EE,bm as Ig,bn as FT,bo as lD,bp as gl,bq as yg,br as vg,f as eg,K as Kw,i as ir,W as Wp,E as Em,bs as dp,bt as u,_ as _w,M as Mw,bu as ut$1,bv as Tn$1,bw as Bn$1,bx as Wn,by as gn$1,bz as hn$1,bA as Ft,bB as F$1,bC as Qa,X as xw,bD as HT,Y as Aw,bE as $T,bF as w$2,v as vt$1,bG as Bj,r as f,O as Op,bH as ln,bI as Lt,bJ as va,bK as an$2,bL as ft$2,t as pT,bM as Ge,bN as Hn$1,bO as ve,F as Fa,bP as si,a6 as Lr,bQ as Dn$1,aa as N$1,bR as ot,ad as Qe,aD as Ce$1,bS as oa$1,bT as Lg,ac as Mr,U as Kh,bU as jt,ay as lv,al as Zj,bV as Gw,bW as zw,s as sg,an as Hh,am as LT,bX as L,bY as m,bZ as Po,az as Yj,b_ as Gh,b$ as Jh,c0 as Zw,c1 as Yw,c2 as bh,c3 as Qs,c4 as Fn$1,c5 as Ut,c6 as Ii,af as Tu,c7 as Ir,c8 as Sv,ak as nw,c9 as Sh,ca as Kh$1,ap as Ki$1,aB as gr,ao as ue,aG as tD,ab as te,cb as E,cc as fn$1,av as _t$1,cd as N$2,ce as Ri,cf as xh,aH as j,cg as Ct,aj as zm,ch as Wo,ci as dl,cj as fl,d as ig,g as qw,aA as gg,S as ca,a9 as ru,ck as Nr,cl as G,cm as Kj,cn as wd,co as Mr$1,cp as Uh,cq as ie,cr as mg,cs as Sw,ct as Lh}from'./main-BAV5VDOD.js';import'./chunk-By8ZVvDx.js';var tn=()=>[],nn=(n,u)=>u.key,an=(n,u)=>u.measure;function on(n,u){if(n&1&&(Pi(0,"mat-option",6),TT(1),ul()),n&2){let e=u.$implicit;Bh("value",e.measure),EE(),gg(e.description);}}function sn(n,u){if(n&1&&(Pi(0,"mat-form-field")(1,"mat-label"),TT(2),ul(),Pi(3,"mat-select",5),xw(4,on,2,2,"mat-option",6,an),ul(),cD(),ul()),n&2){let e=u.$implicit,t=qw();EE(2),gg(e.key),EE(),Bh("placeholder",e.key)("formControlName",e.key),lD(),EE(),Aw(t.groupUnits[e.key]??FT(3,tn));}}var Oi=(()=>{class n{units=w(ut$1);settings=w(Gi$1);toast=w(lt);unitsFormGroup=new Tn$1({});groupUnits={};ngOnInit(){let e=this.settings.getDefaultUnits(),t=this.units.getConversions();for(let i of t){if(i.group==="Position")continue;let s=[];for(let d of i.units)s.push(d);this.groupUnits[i.group]=s,this.unitsFormGroup.addControl(i.group,new Bn$1(e[i.group]));}this.unitsFormGroup.updateValueAndValidity();}submitConfig(){this.settings.setDefaultUnits(this.unitsFormGroup.value),this.toast.show("Configuration saved",1e3,true,"message");}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-units"]],decls:11,vars:4,consts:[[2,"height","100%",3,"ngSubmit","formGroup"],[1,"unit-grid"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit",1,"formActionButton",3,"disabled"],["required","",3,"placeholder","formControlName"],[3,"value"]],template:function(t,i){t&1&&(Pi(0,"form",0),Qh("ngSubmit",function(){return i.submitConfig()}),Pi(1,"p"),TT(2,"Configure your preferred default unit types. These defaults can be overridden within individual widget settings."),ul(),Pi(3,"div",1),xw(4,sn,6,4,"mat-form-field",null,nn),HT(6,"keyvalue"),ul(),Pi(7,"div",2),$h(8,"mat-divider",3),Pi(9,"button",4),TT(10,"Save"),ul()()()),t&2&&(Bh("formGroup",i.unitsFormGroup),EE(4),Aw($T(6,2,i.unitsFormGroup.controls)),EE(5),Bh("disabled",!i.unitsFormGroup.valid));},dependencies:[Ln$1,Gn$1,Pn$1,kn$1,ft$1,Wn,gn$1,hn$1,rt,ae,Ft,F$1,u,xp,Qa],styles:[".unit-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,auto));gap:10px}"]})}return n})();var Tt=new N$1("CdkAccordion"),Fi=(()=>{class n{_stateChanges=new te;_openCloseAllActions=new te;id=w(Mr).getId("cdk-accordion-");multi=false;openAll(){this.multi&&this._openCloseAllActions.next(true);}closeAll(){this._openCloseAllActions.next(false);}ngOnChanges(e){this._stateChanges.next(e);}ngOnDestroy(){this._stateChanges.complete(),this._openCloseAllActions.complete();}static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["cdk-accordion"],["","cdkAccordion",""]],inputs:{multi:[2,"multi","multi",Zj]},exportAs:["cdkAccordion"],features:[LT([{provide:Tt,useExisting:n}]),lv]})}return n})(),Li=(()=>{class n{accordion=w(Tt,{optional:true,skipSelf:true});_changeDetectorRef=w(Gj);_expansionDispatcher=w(E);_openCloseAllSubscription=j.EMPTY;closed=new Qe;opened=new Qe;destroyed=new Qe;expandedChange=new Qe;id=w(Mr).getId("cdk-accordion-child-");get expanded(){return this._expanded}set expanded(e){if(this._expanded!==e){if(this._expanded=e,this.expandedChange.emit(e),e){this.opened.emit();let t=this.accordion?this.accordion.id:this.id;this._expansionDispatcher.notify(this.id,t);}else this.closed.emit();this._changeDetectorRef.markForCheck();}}_expanded=false;get disabled(){return this._disabled()}set disabled(e){this._disabled.set(e);}_disabled=vt$1(false);_removeUniqueSelectionListener=()=>{};ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((e,t)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===t&&this.id!==e&&(this.expanded=false);}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions());}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe();}toggle(){this.disabled||(this.expanded=!this.expanded);}close(){this.disabled||(this.expanded=false);}open(){this.disabled||(this.expanded=true);}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(e=>{this.disabled||(this.expanded=e);})}static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:[2,"expanded","expanded",Zj],disabled:[2,"disabled","disabled",Zj]},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[LT([{provide:Tt,useValue:void 0}])]})}return n})(),Ui=(()=>{class n{static \u0275fac=function(t){return new(t||n)};static \u0275mod=bh({type:n});static \u0275inj=Qs({})}return n})();var dn=["body"],cn=["bodyWrapper"],mn=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],hn=["mat-expansion-panel-header","*","mat-action-row"];function pn(n,u){}var gn=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],un=["mat-panel-title","mat-panel-description","*"];function _n(n,u){n&1&&(dl(0,"span",1),wd(),dl(1,"svg",2),Uh(2,"path",3),fl()());}var Et=new N$1("MAT_ACCORDION"),Bi=new N$1("MAT_EXPANSION_PANEL"),fn=(()=>{class n{_template=w(Mr$1);_expansionPanel=w(Bi,{optional:true});static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["ng-template","matExpansionPanelContent",""]]})}return n})(),Wi=new N$1("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS"),He=(()=>{class n extends Li{_viewContainerRef=w(Ki$1);_animationsDisabled=ot();_document=w(gr);_ngZone=w(ue);_elementRef=w(Lr);_renderer=w(tD);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(e){this._hideToggle=e;}_hideToggle=false;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(e){this._togglePosition=e;}_togglePosition;afterExpand=new Qe;afterCollapse=new Qe;_inputChanges=new te;accordion=w(Et,{optional:true,skipSelf:true});_lazyContent;_body;_bodyWrapper;_portal;_headerId=w(Mr).getId("mat-expansion-panel-header-");constructor(){super();let e=w(Wi,{optional:true});this._expansionDispatcher=w(E),e&&(this.hideToggle=e.hideToggle);}_hasSpacing(){return this.accordion?this.expanded&&this.accordion.displayMode==="default":false}_getExpandedState(){return this.expanded?"expanded":"collapsed"}toggle(){this.expanded=!this.expanded;}close(){this.expanded=false;}open(){this.expanded=true;}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe(Tu(null),fn$1(()=>this.expanded&&!this._portal),_t$1(1)).subscribe(()=>{this._portal=new N$2(this._lazyContent._template,this._viewContainerRef);}),this._setupAnimationEvents();}ngOnChanges(e){this._inputChanges.next(e);}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete();}_containsFocus(){if(this._body){let e=this._document.activeElement,t=this._body.nativeElement;return e===t||t.contains(e)}return false}_transitionEndListener=({target:e,propertyName:t})=>{e===this._bodyWrapper?.nativeElement&&t==="grid-template-rows"&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit();});};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{let e=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this._transitionEndListener),e.classList.add("mat-expansion-panel-animations-enabled");},200);});}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["mat-expansion-panel"]],contentQueries:function(t,i,s){if(t&1&&Kh$1(s,fn,5),t&2){let d;Zw(d=Yw())&&(i._lazyContent=d.first);}},viewQuery:function(t,i){if(t&1&&Jh(dn,5)(cn,5),t&2){let s;Zw(s=Yw())&&(i._body=s.first),Zw(s=Yw())&&(i._bodyWrapper=s.first);}},hostAttrs:[1,"mat-expansion-panel"],hostVars:4,hostBindings:function(t,i){t&2&&sg("mat-expanded",i.expanded)("mat-expansion-panel-spacing",i._hasSpacing());},inputs:{hideToggle:[2,"hideToggle","hideToggle",Zj],togglePosition:"togglePosition"},outputs:{afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[LT([{provide:Et,useValue:void 0},{provide:Bi,useExisting:n}]),Sh,lv],ngContentSelectors:hn,decls:9,vars:4,consts:[["bodyWrapper",""],["body",""],[1,"mat-expansion-panel-content-wrapper"],["role","region",1,"mat-expansion-panel-content",3,"id"],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(t,i){t&1&&(Gw(mn),zw(0),Pi(1,"div",2,0)(3,"div",3,1)(5,"div",4),zw(6,1),xh(7,pn,0,0,"ng-template",5),ul(),zw(8,2),ul()()),t&2&&(EE(),Hh("inert",i.expanded?null:""),EE(2),Bh("id",i.id),Hh("aria-labelledby",i._headerId),EE(4),Bh("cdkPortalOutlet",i._portal));},dependencies:[Ri],styles:[`.mat-expansion-panel {
1
+ import {O}from'./chunk-o977r5_s.js';import {m as me}from'./chunk-BIYHVfJl.js';import {J as JD,aO as Sn$1,aP as Nt,c as $h,P as Pi,u as ul,B as Bh,w,aQ as ee,G as Gi$1,N,aR as lt,aS as De,aT as T,aU as I,aV as We,aW as w$1,aX as He$1,aY as xe,a7 as Gj,aZ as R,$ as $j,D as Dt$1,a_ as Gp,a$ as Zr,b0 as Wl,b1 as U,b2 as Ln$1,b3 as Gn$1,b4 as Xe,b5 as Pn$1,b6 as kn$1,b7 as ft$1,b8 as Ht,b9 as rn,ba as Qt,bb as rt,bc as ae,bd as an$1,be as It$1,bf as Kt,bg as mt,bh as xp,h as Fw,k as Qh,T as TT,bi as Eg,l as ud,bj as ST,m as dd,bk as cD,bl as Jw,e as EE,bm as Ig,bn as FT,bo as lD,bp as gl,bq as yg,br as vg,f as eg,K as Kw,i as ir,W as Wp,E as Em,bs as dp,bt as u,_ as _w,M as Mw,bu as ut$1,bv as Tn$1,bw as Bn$1,bx as Wn,by as gn$1,bz as hn$1,bA as Ft,bB as F,bC as Qa,X as xw,bD as HT,Y as Aw,bE as $T,bF as w$2,v as vt$1,bG as Bj,r as f,O as Op,bH as ln,bI as Lt,bJ as va,bK as an$2,bL as ft$2,t as pT,bM as Ge,bN as Hn$1,bO as ve,F as Fa,bP as si,a6 as Lr,bQ as Dn$1,aa as N$1,bR as ot,ad as Qe,aD as Ce$1,bS as oa$1,bT as Lg,ac as Mr,U as Kh,bU as jt,ay as lv,al as Zj,bV as Gw,bW as zw,s as sg,an as Hh,am as LT,bX as L,bY as m,bZ as Po,az as Yj,b_ as Gh,b$ as Jh,c0 as Zw,c1 as Yw,c2 as bh,c3 as Qs,c4 as Fn$1,c5 as Ut,c6 as Ii,af as Tu,c7 as Ir,c8 as Sv,ak as nw,c9 as Sh,ca as Kh$1,ap as Ki$1,aB as gr,ao as ue,aG as tD,ab as te,cb as E,cc as fn$1,av as _t$1,cd as N$2,ce as Ri,cf as xh,aH as j,cg as Ct,aj as zm,ch as Wo,ci as dl,cj as fl,d as ig,g as qw,aA as gg,S as ca,a9 as ru,ck as Nr,cl as G,cm as Kj,cn as wd,co as Mr$1,cp as Uh,cq as ie,cr as mg,cs as Sw,ct as Lh}from'./main-BNR44HGB.js';import'./chunk-h2q_pbbF.js';var tn=()=>[],nn=(n,u)=>u.key,an=(n,u)=>u.measure;function on(n,u){if(n&1&&(Pi(0,"mat-option",6),TT(1),ul()),n&2){let e=u.$implicit;Bh("value",e.measure),EE(),gg(e.description);}}function sn(n,u){if(n&1&&(Pi(0,"mat-form-field")(1,"mat-label"),TT(2),ul(),Pi(3,"mat-select",5),xw(4,on,2,2,"mat-option",6,an),ul(),cD(),ul()),n&2){let e=u.$implicit,t=qw();EE(2),gg(e.key),EE(),Bh("placeholder",e.key)("formControlName",e.key),lD(),EE(),Aw(t.groupUnits[e.key]??FT(3,tn));}}var Oi=(()=>{class n{units=w(ut$1);settings=w(Gi$1);toast=w(lt);unitsFormGroup=new Tn$1({});groupUnits={};ngOnInit(){let e=this.settings.getDefaultUnits(),t=this.units.getConversions();for(let i of t){if(i.group==="Position")continue;let s=[];for(let d of i.units)s.push(d);this.groupUnits[i.group]=s,this.unitsFormGroup.addControl(i.group,new Bn$1(e[i.group]));}this.unitsFormGroup.updateValueAndValidity();}submitConfig(){this.settings.setDefaultUnits(this.unitsFormGroup.value),this.toast.show("Configuration saved",1e3,true,"message");}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-units"]],decls:11,vars:4,consts:[[2,"height","100%",3,"ngSubmit","formGroup"],[1,"unit-grid"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit",1,"formActionButton",3,"disabled"],["required","",3,"placeholder","formControlName"],[3,"value"]],template:function(t,i){t&1&&(Pi(0,"form",0),Qh("ngSubmit",function(){return i.submitConfig()}),Pi(1,"p"),TT(2,"Configure your preferred default unit types. These defaults can be overridden within individual widget settings."),ul(),Pi(3,"div",1),xw(4,sn,6,4,"mat-form-field",null,nn),HT(6,"keyvalue"),ul(),Pi(7,"div",2),$h(8,"mat-divider",3),Pi(9,"button",4),TT(10,"Save"),ul()()()),t&2&&(Bh("formGroup",i.unitsFormGroup),EE(4),Aw($T(6,2,i.unitsFormGroup.controls)),EE(5),Bh("disabled",!i.unitsFormGroup.valid));},dependencies:[Ln$1,Gn$1,Pn$1,kn$1,ft$1,Wn,gn$1,hn$1,rt,ae,Ft,F,u,xp,Qa],styles:[".unit-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,auto));gap:10px}"]})}return n})();var Tt=new N$1("CdkAccordion"),Fi=(()=>{class n{_stateChanges=new te;_openCloseAllActions=new te;id=w(Mr).getId("cdk-accordion-");multi=false;openAll(){this.multi&&this._openCloseAllActions.next(true);}closeAll(){this._openCloseAllActions.next(false);}ngOnChanges(e){this._stateChanges.next(e);}ngOnDestroy(){this._stateChanges.complete(),this._openCloseAllActions.complete();}static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["cdk-accordion"],["","cdkAccordion",""]],inputs:{multi:[2,"multi","multi",Zj]},exportAs:["cdkAccordion"],features:[LT([{provide:Tt,useExisting:n}]),lv]})}return n})(),Li=(()=>{class n{accordion=w(Tt,{optional:true,skipSelf:true});_changeDetectorRef=w(Gj);_expansionDispatcher=w(E);_openCloseAllSubscription=j.EMPTY;closed=new Qe;opened=new Qe;destroyed=new Qe;expandedChange=new Qe;id=w(Mr).getId("cdk-accordion-child-");get expanded(){return this._expanded}set expanded(e){if(this._expanded!==e){if(this._expanded=e,this.expandedChange.emit(e),e){this.opened.emit();let t=this.accordion?this.accordion.id:this.id;this._expansionDispatcher.notify(this.id,t);}else this.closed.emit();this._changeDetectorRef.markForCheck();}}_expanded=false;get disabled(){return this._disabled()}set disabled(e){this._disabled.set(e);}_disabled=vt$1(false);_removeUniqueSelectionListener=()=>{};ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((e,t)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===t&&this.id!==e&&(this.expanded=false);}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions());}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe();}toggle(){this.disabled||(this.expanded=!this.expanded);}close(){this.disabled||(this.expanded=false);}open(){this.disabled||(this.expanded=true);}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(e=>{this.disabled||(this.expanded=e);})}static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:[2,"expanded","expanded",Zj],disabled:[2,"disabled","disabled",Zj]},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[LT([{provide:Tt,useValue:void 0}])]})}return n})(),Ui=(()=>{class n{static \u0275fac=function(t){return new(t||n)};static \u0275mod=bh({type:n});static \u0275inj=Qs({})}return n})();var dn=["body"],cn=["bodyWrapper"],mn=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],hn=["mat-expansion-panel-header","*","mat-action-row"];function pn(n,u){}var gn=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],un=["mat-panel-title","mat-panel-description","*"];function _n(n,u){n&1&&(dl(0,"span",1),wd(),dl(1,"svg",2),Uh(2,"path",3),fl()());}var Et=new N$1("MAT_ACCORDION"),Bi=new N$1("MAT_EXPANSION_PANEL"),fn=(()=>{class n{_template=w(Mr$1);_expansionPanel=w(Bi,{optional:true});static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["ng-template","matExpansionPanelContent",""]]})}return n})(),Wi=new N$1("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS"),He=(()=>{class n extends Li{_viewContainerRef=w(Ki$1);_animationsDisabled=ot();_document=w(gr);_ngZone=w(ue);_elementRef=w(Lr);_renderer=w(tD);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(e){this._hideToggle=e;}_hideToggle=false;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(e){this._togglePosition=e;}_togglePosition;afterExpand=new Qe;afterCollapse=new Qe;_inputChanges=new te;accordion=w(Et,{optional:true,skipSelf:true});_lazyContent;_body;_bodyWrapper;_portal;_headerId=w(Mr).getId("mat-expansion-panel-header-");constructor(){super();let e=w(Wi,{optional:true});this._expansionDispatcher=w(E),e&&(this.hideToggle=e.hideToggle);}_hasSpacing(){return this.accordion?this.expanded&&this.accordion.displayMode==="default":false}_getExpandedState(){return this.expanded?"expanded":"collapsed"}toggle(){this.expanded=!this.expanded;}close(){this.expanded=false;}open(){this.expanded=true;}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe(Tu(null),fn$1(()=>this.expanded&&!this._portal),_t$1(1)).subscribe(()=>{this._portal=new N$2(this._lazyContent._template,this._viewContainerRef);}),this._setupAnimationEvents();}ngOnChanges(e){this._inputChanges.next(e);}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete();}_containsFocus(){if(this._body){let e=this._document.activeElement,t=this._body.nativeElement;return e===t||t.contains(e)}return false}_transitionEndListener=({target:e,propertyName:t})=>{e===this._bodyWrapper?.nativeElement&&t==="grid-template-rows"&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit();});};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{let e=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this._transitionEndListener),e.classList.add("mat-expansion-panel-animations-enabled");},200);});}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["mat-expansion-panel"]],contentQueries:function(t,i,s){if(t&1&&Kh$1(s,fn,5),t&2){let d;Zw(d=Yw())&&(i._lazyContent=d.first);}},viewQuery:function(t,i){if(t&1&&Jh(dn,5)(cn,5),t&2){let s;Zw(s=Yw())&&(i._body=s.first),Zw(s=Yw())&&(i._bodyWrapper=s.first);}},hostAttrs:[1,"mat-expansion-panel"],hostVars:4,hostBindings:function(t,i){t&2&&sg("mat-expanded",i.expanded)("mat-expansion-panel-spacing",i._hasSpacing());},inputs:{hideToggle:[2,"hideToggle","hideToggle",Zj],togglePosition:"togglePosition"},outputs:{afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[LT([{provide:Et,useValue:void 0},{provide:Bi,useExisting:n}]),Sh,lv],ngContentSelectors:hn,decls:9,vars:4,consts:[["bodyWrapper",""],["body",""],[1,"mat-expansion-panel-content-wrapper"],["role","region",1,"mat-expansion-panel-content",3,"id"],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(t,i){t&1&&(Gw(mn),zw(0),Pi(1,"div",2,0)(3,"div",3,1)(5,"div",4),zw(6,1),xh(7,pn,0,0,"ng-template",5),ul(),zw(8,2),ul()()),t&2&&(EE(),Hh("inert",i.expanded?null:""),EE(2),Bh("id",i.id),Hh("aria-labelledby",i._headerId),EE(4),Bh("cdkPortalOutlet",i._portal));},dependencies:[Ri],styles:[`.mat-expansion-panel {
2
2
  box-sizing: content-box;
3
3
  display: block;
4
4
  margin: 0;
@@ -683,7 +683,7 @@ import {O}from'./chunk-tAiV3ARh.js';import {m as me}from'./chunk-Bp0MQwPM.js';im
683
683
  right: 50%;
684
684
  transform: translate(50%, -50%);
685
685
  }
686
- `],encapsulation:2})}return n})(),yt=(()=>{class n{static \u0275fac=function(t){return new(t||n)};static \u0275mod=bh({type:n});static \u0275inj=Qs({imports:[Ce,Fn$1]})}return n})();var wn=["notificationsForm"],Sn=["statePanel"],xn=["soundPanel"];function Mn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Filter Notifications sidenav items "),ul());}function kn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Override server defined methods "),ul());}var Ki=(()=>{class n{toast=w(lt);settings=w(Gi$1);_responsive=w(ir);isPhonePortrait;notificationsForm=$j("notificationsForm");statePanel=$j("statePanel");soundPanel=$j("soundPanel");notificationConfig;notificationDisabledExpandPanel=false;constructor(){this.isPhonePortrait=Wp(this._responsive.observe(Em.HandsetPortrait),{initialValue:{matches:false,breakpoints:{}}}),this.notificationConfig=dp(this.settings.getNotificationConfig());}saveAllSettings(){this.settings.setNotificationConfig(dp(this.notificationConfig)),this.notificationsForm()?.form?.markAsPristine(),this.toast.show("Configuration saved",1e3,true,"message");}togglePanel(e){e.checked&&(this.notificationDisabledExpandPanel=false,this.statePanel()?.close(),this.soundPanel()?.close());}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-notifications"]],viewQuery:function(t,i){t&1&&eg(i.notificationsForm,wn,5)(i.statePanel,Sn,5)(i.soundPanel,xn,5),t&2&&Kw(3);},decls:64,vars:17,consts:[["notificationsForm","ngForm"],["statePanel",""],["soundPanel",""],["id","notificationSetting",3,"ngSubmit"],["name","disableNotifications",3,"ngModelChange","ngModel"],["name","disableNotifications",3,"ngModelChange","change","ngModel"],[1,"notification-accordion"],[3,"disabled"],["name","showNormalState",3,"ngModelChange","ngModel"],["name","showNominalState",3,"ngModelChange","ngModel"],["name","muteAlert",3,"ngModelChange","ngModel","disabled"],["name","muteWarn",3,"ngModelChange","ngModel","disabled"],["name","muteAlarm",3,"ngModelChange","ngModel","disabled"],["name","muteEmergency",3,"ngModelChange","ngModel","disabled"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit",1,"formActionButton",3,"disabled"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"form",3,0),Qh("ngSubmit",function(){return i.saveAllSettings()}),Pi(2,"p"),TT(3,"Configure audio and visual notification settings and stay informed of critical events."),ul(),Pi(4,"mat-slide-toggle",4),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.disableSound,r)||(i.notificationConfig.sound.disableSound=r),dd(r)}),TT(5," Disable audio "),ul(),cD(),$h(6,"br")(7,"br"),Pi(8,"mat-slide-toggle",5),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.disableNotifications,r)||(i.notificationConfig.disableNotifications=r),dd(r)}),Qh("change",function(r){return i.togglePanel(r)}),TT(9," Disable Notifications "),ul(),cD(),$h(10,"br")(11,"br"),Pi(12,"div",6)(13,"mat-accordion")(14,"mat-expansion-panel",7,1)(16,"mat-expansion-panel-header")(17,"mat-panel-title"),TT(18," States "),ul(),_w(19,Mn,2,0,"mat-panel-description"),ul(),Pi(20,"mat-checkbox",8),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.devices.showNormalState,r)||(i.notificationConfig.devices.showNormalState=r),dd(r)}),TT(21," Show "),Pi(22,"b"),TT(23,"Normal"),ul(),TT(24," state "),ul(),cD(),$h(25,"br"),Pi(26,"mat-checkbox",9),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.devices.showNominalState,r)||(i.notificationConfig.devices.showNominalState=r),dd(r)}),TT(27," Show "),Pi(28,"b"),TT(29,"Nominal"),ul(),TT(30," state "),ul(),cD(),ul(),Pi(31,"mat-expansion-panel",7,2)(33,"mat-expansion-panel-header")(34,"mat-panel-title"),TT(35," Audio "),ul(),_w(36,kn,2,0,"mat-panel-description"),ul(),Pi(37,"mat-checkbox",10),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteAlert,r)||(i.notificationConfig.sound.muteAlert=r),dd(r)}),TT(38," Mute "),Pi(39,"b"),TT(40,"all Alert"),ul(),TT(41," state "),ul(),cD(),$h(42,"br"),Pi(43,"mat-checkbox",11),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteWarn,r)||(i.notificationConfig.sound.muteWarn=r),dd(r)}),TT(44," Mute "),Pi(45,"b"),TT(46,"all Warn"),ul(),TT(47," state "),ul(),cD(),$h(48,"br"),Pi(49,"mat-checkbox",12),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteAlarm,r)||(i.notificationConfig.sound.muteAlarm=r),dd(r)}),TT(50," Mute "),Pi(51,"b"),TT(52,"all Alarm"),ul(),TT(53," state "),ul(),cD(),$h(54,"br"),Pi(55,"mat-checkbox",13),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteEmergency,r)||(i.notificationConfig.sound.muteEmergency=r),dd(r)}),TT(56," Mute "),Pi(57,"b"),TT(58,"all Emergency"),ul(),TT(59," state "),ul(),cD(),ul()()(),Pi(60,"div",14),$h(61,"mat-divider",15),Pi(62,"button",16),TT(63,"Save"),ul()()();}if(t&2){let s=Jw(1);EE(4),Ig("ngModel",i.notificationConfig.sound.disableSound),lD(),EE(4),Ig("ngModel",i.notificationConfig.disableNotifications),lD(),EE(6),Bh("disabled",i.notificationConfig.disableNotifications),EE(5),Mw(i.isPhonePortrait().matches?-1:19),EE(),Ig("ngModel",i.notificationConfig.devices.showNormalState),lD(),EE(6),Ig("ngModel",i.notificationConfig.devices.showNominalState),lD(),EE(5),Bh("disabled",i.notificationConfig.disableNotifications),EE(5),Mw(i.isPhonePortrait().matches?-1:36),EE(),Ig("ngModel",i.notificationConfig.sound.muteAlert),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(6),Ig("ngModel",i.notificationConfig.sound.muteWarn),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(6),Ig("ngModel",i.notificationConfig.sound.muteAlarm),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(6),Ig("ngModel",i.notificationConfig.sound.muteEmergency),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(7),Bh("disabled",!s.form.dirty);}},dependencies:[Ln$1,Gn$1,Pn$1,kn$1,rn,Qt,Kt,yt,Ce,bt,ft,He,ze,_t,ut,u,xp],styles:[".notification-accordion[_ngcontent-%COMP%]{margin-left:25px}"]})}return n})();Wl.register(...Lh);var qi=Wl;var Tn=["activityGraph"],It=()=>({standalone:false}),En=()=>({standalone:true}),Xi=(()=>{class n{dialog=w(ee);settings=w(Gi$1);app=w(N);toast=w(lt);DataService=w(De);signalKConnectionService=w(T);deltaService=w(I);connectionStateMachine=w(We);internetReachability=w(w$1);auth=w(He$1);destroyRef=w(xe);cdr=w(Gj);canvasService=w(F);activityGraph=$j("activityGraph");connectionConfig=this.settings.getConnectionConfig();isConnecting=false;authToken=null;endpointServiceStatus=this.signalKConnectionService.serverServiceEndpoint$.getValue();streamStatus=this.deltaService.streamEndpoint$.getValue();internetAvailabilityLabel=Dt$1(()=>this.internetReachability.isChecking()?"Checking...":this.internetReachability.internetAvailable()?"Available":this.internetReachability.isReachable()===false?"Unavailable":"Unknown");_chart=null;textColor="";ngOnInit(){this.connectionConfig=this.settings.getConnectionConfig(),this.auth.authToken$.pipe(Gp(this.destroyRef)).subscribe(e=>{e?this.authToken=e:this.authToken=null,this.cdr.markForCheck();}),this.signalKConnectionService.getServiceEndpointStatusAsO().pipe(Gp(this.destroyRef)).subscribe(e=>{this.endpointServiceStatus=e,this.cdr.markForCheck();}),this.deltaService.getDataStreamStatusAsO().pipe(Gp(this.destroyRef)).subscribe(e=>{this.streamStatus=e,this.cdr.markForCheck();});}ngAfterViewInit(){let e=this.activityGraph();e&&(this.textColor=window.getComputedStyle(e.nativeElement).color,this._chart?.destroy(),this.startChart(),this.DataService.getSignalkDeltaUpdateStatistics().pipe(Gp(this.destroyRef)).subscribe(t=>{this._chart&&(this._chart.data.datasets[0].data.push({x:t.timestamp,y:t.value}),this._chart.data.datasets[0].data.length>10&&this._chart.data.datasets[0].data.shift(),this._chart?.update("none"));}));}openUserCredentialModal(e){this.dialog.open(me,{data:{user:this.connectionConfig.loginName,password:this.connectionConfig.loginPassword,error:e}}).afterClosed().pipe(Gp(this.destroyRef)).subscribe(i=>{i&&(this.connectionConfig.loginName=i.user,this.connectionConfig.loginPassword=i.password,this.cdr.markForCheck(),this.connectToServer());});}connectToServer(){return Zr(this,null,function*(){if(this.connectionConfig.useSharedConfig&&(!this.connectionConfig.loginName||!this.connectionConfig.loginPassword)){this.openUserCredentialModal("Credentials required");return}this.isConnecting=true;try{console.log("[Settings-SignalK] Validating Signal K server before connecting..."),yield this.signalKConnectionService.validateSignalKUrl(this.connectionConfig.signalKUrl),console.log("[Settings-SignalK] Validation successful - proceeding with connection"),this.settings.setConnectionConfig(this.connectionConfig),this.connectionStateMachine.shutdown("Configuration changed - restarting app"),this.authToken&&!this.connectionConfig.useSharedConfig&&!this.authToken.isDeviceAccessToken&&this.auth.deleteToken(),window.__KIP_TEST__||location.reload();}catch(e){this.isConnecting=false;let t=e?.message||"Unknown validation error";console.error("[Settings-SignalK] Server validation failed:",t),this.toast.show(`${t}`,0,false,"error");}})}startChart(){let t=this.activityGraph()?.nativeElement.getContext("2d");t&&(this._chart=new qi(t,{type:"line",data:{datasets:[{data:[],fill:true,borderColor:this.textColor}]},options:{maintainAspectRatio:false,animation:false,parsing:false,scales:{x:{type:"time",display:true,time:{unit:"minute",minUnit:"second",round:"second",displayFormats:{hour:"k:mm''",minute:"mm''",second:'mm ss"',millisecond:"SSS"}},position:"bottom",ticks:{display:false},grid:{display:true}},y:{beginAtZero:true,type:"linear",position:"right",title:{text:"Delta / Sec",display:true}}},plugins:{legend:{display:false,labels:{color:this.textColor}}}}}));}useSharedConfigToggleClick(e){if(e.checked){let t=this.signalKConnectionService.serverVersion$.getValue();if(!t||!U(t,"1.46.2",">=")){this.toast.show("Configuration sharing requires Signal K version 1.46.2 or better",0,false,"warn"),this.connectionConfig.useSharedConfig=false;return}this.openUserCredentialModal();}}ngOnDestroy(){this._chart?.destroy();let e=this.activityGraph?.()?.nativeElement;this.canvasService.releaseCanvas(e,{clear:true,removeFromDom:true});}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-signalk"]],viewQuery:function(t,i){t&1&&eg(i.activityGraph,Tn,5),t&2&&Kw();},decls:40,vars:23,consts:[["connectionForm","ngForm"],["useSharedConfigToggle",""],["activityGraph",""],["name","connectionForm",3,"ngSubmit"],[1,"connect-table"],[1,"url-cell"],[1,"connectUrlInput"],["type","url","matInput","","placeholder","Ex. http://192.168.0.1:3000","name","signalKURL","required","","pattern","https?://.+",3,"ngModelChange","ngModel","ngModelOptions"],[1,"connect-cell"],["mat-flat-button","","type","submit",1,"connect-btn",3,"disabled"],["colspan","2"],["name","useSharedConfigToggle","matTooltip","Activating authentication enables Signal K's user storage feature to save KIP configuration on the server. When authentication is not activated, KIP stores it's configuration locally in the Browser.",3,"ngModelChange","change","ngModel","ngModelOptions","disabled"],["mat-flat-button","","type","button","matTooltip","Configure Signal K user authentication credentials. The user must be a valid pre existing Signal K server user. It is strongly recommended not to use the default Signal K Admin user.",1,"credentials-btn",3,"click","disabled"],["name","signalKSubscribeAll",3,"ngModelChange","ngModel","ngModelOptions"],["name","isProxyEnabled",3,"ngModelChange","ngModel","ngModelOptions"],[1,"activity-container"],[1,"activity-graph-container"],[1,"activity-graph"],[1,"info-container"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"form",3,0),Qh("ngSubmit",function(){return i.connectToServer()}),$h(2,"br"),Pi(3,"table",4)(4,"tr",4)(5,"td",5)(6,"mat-form-field",6)(7,"mat-label"),TT(8,"Signal K URL"),ul(),Pi(9,"input",7),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.signalKUrl,r)||(i.connectionConfig.signalKUrl=r),dd(r)}),ul(),cD(),Pi(10,"mat-error"),TT(11,' Valid URL is required. Ex. "https://demo.signalK.org" or "http://my.server.com:3000" '),ul()()(),Pi(12,"td",8)(13,"button",9),TT(14),ul()()(),Pi(15,"tr",4)(16,"td",10)(17,"mat-slide-toggle",11,1),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.useSharedConfig,r)||(i.connectionConfig.useSharedConfig=r),dd(r)}),Qh("change",function(r){return i.useSharedConfigToggleClick(r)}),TT(19," Login to server "),ul(),cD(),Pi(20,"button",12),Qh("click",function(){return i.openUserCredentialModal(null)}),TT(21," Set Credential "),ul(),$h(22,"br"),Pi(23,"mat-checkbox",13),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.signalKSubscribeAll,r)||(i.connectionConfig.signalKSubscribeAll=r),dd(r)}),TT(24,"Subscribe to remote sources messages such as AIS and DSC targets. "),Pi(25,"i"),TT(26,"Warning: this maybe generate heavy traffic."),ul()(),cD(),ul()(),Pi(27,"tr",4)(28,"td",10)(29,"mat-checkbox",14),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.proxyEnabled,r)||(i.connectionConfig.proxyEnabled=r),dd(r)}),TT(30,"Signal K server is behind a Proxy"),ul(),cD(),ul()()()(),Pi(31,"div",15)(32,"div",16),$h(33,"canvas",17,2),ul(),Pi(35,"div",18)(36,"pre"),TT(37),$h(38,"br"),TT(39),ul()()();}if(t&2){let s=Jw(1);EE(9),Ig("ngModel",i.connectionConfig.signalKUrl),Bh("ngModelOptions",FT(19,It)),lD(),EE(4),Bh("disabled",!s.form.valid||i.isConnecting),EE(),gl(" ",i.isConnecting?"Validating...":"Connect"," "),EE(3),Ig("ngModel",i.connectionConfig.useSharedConfig),Bh("ngModelOptions",FT(20,En))("disabled",!i.connectionConfig.signalKUrl),lD(),EE(3),Bh("disabled",!i.connectionConfig.useSharedConfig),EE(3),Ig("ngModel",i.connectionConfig.signalKSubscribeAll),Bh("ngModelOptions",FT(21,It)),lD(),EE(6),Ig("ngModel",i.connectionConfig.proxyEnabled),Bh("ngModelOptions",FT(22,It)),lD(),EE(8),yg("KIP: ",i.app.appVersion(),`
686
+ `],encapsulation:2})}return n})(),yt=(()=>{class n{static \u0275fac=function(t){return new(t||n)};static \u0275mod=bh({type:n});static \u0275inj=Qs({imports:[Ce,Fn$1]})}return n})();var wn=["notificationsForm"],Sn=["statePanel"],xn=["soundPanel"];function Mn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Filter Notifications sidenav items "),ul());}function kn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Override server defined methods "),ul());}var Ki=(()=>{class n{toast=w(lt);settings=w(Gi$1);_responsive=w(ir);isPhonePortrait;notificationsForm=$j("notificationsForm");statePanel=$j("statePanel");soundPanel=$j("soundPanel");notificationConfig;notificationDisabledExpandPanel=false;constructor(){this.isPhonePortrait=Wp(this._responsive.observe(Em.HandsetPortrait),{initialValue:{matches:false,breakpoints:{}}}),this.notificationConfig=dp(this.settings.getNotificationConfig());}saveAllSettings(){this.settings.setNotificationConfig(dp(this.notificationConfig)),this.notificationsForm()?.form?.markAsPristine(),this.toast.show("Configuration saved",1e3,true,"message");}togglePanel(e){e.checked&&(this.notificationDisabledExpandPanel=false,this.statePanel()?.close(),this.soundPanel()?.close());}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-notifications"]],viewQuery:function(t,i){t&1&&eg(i.notificationsForm,wn,5)(i.statePanel,Sn,5)(i.soundPanel,xn,5),t&2&&Kw(3);},decls:64,vars:17,consts:[["notificationsForm","ngForm"],["statePanel",""],["soundPanel",""],["id","notificationSetting",3,"ngSubmit"],["name","disableNotifications",3,"ngModelChange","ngModel"],["name","disableNotifications",3,"ngModelChange","change","ngModel"],[1,"notification-accordion"],[3,"disabled"],["name","showNormalState",3,"ngModelChange","ngModel"],["name","showNominalState",3,"ngModelChange","ngModel"],["name","muteAlert",3,"ngModelChange","ngModel","disabled"],["name","muteWarn",3,"ngModelChange","ngModel","disabled"],["name","muteAlarm",3,"ngModelChange","ngModel","disabled"],["name","muteEmergency",3,"ngModelChange","ngModel","disabled"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit",1,"formActionButton",3,"disabled"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"form",3,0),Qh("ngSubmit",function(){return i.saveAllSettings()}),Pi(2,"p"),TT(3,"Configure audio and visual notification settings and stay informed of critical events."),ul(),Pi(4,"mat-slide-toggle",4),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.disableSound,r)||(i.notificationConfig.sound.disableSound=r),dd(r)}),TT(5," Disable audio "),ul(),cD(),$h(6,"br")(7,"br"),Pi(8,"mat-slide-toggle",5),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.disableNotifications,r)||(i.notificationConfig.disableNotifications=r),dd(r)}),Qh("change",function(r){return i.togglePanel(r)}),TT(9," Disable Notifications "),ul(),cD(),$h(10,"br")(11,"br"),Pi(12,"div",6)(13,"mat-accordion")(14,"mat-expansion-panel",7,1)(16,"mat-expansion-panel-header")(17,"mat-panel-title"),TT(18," States "),ul(),_w(19,Mn,2,0,"mat-panel-description"),ul(),Pi(20,"mat-checkbox",8),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.devices.showNormalState,r)||(i.notificationConfig.devices.showNormalState=r),dd(r)}),TT(21," Show "),Pi(22,"b"),TT(23,"Normal"),ul(),TT(24," state "),ul(),cD(),$h(25,"br"),Pi(26,"mat-checkbox",9),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.devices.showNominalState,r)||(i.notificationConfig.devices.showNominalState=r),dd(r)}),TT(27," Show "),Pi(28,"b"),TT(29,"Nominal"),ul(),TT(30," state "),ul(),cD(),ul(),Pi(31,"mat-expansion-panel",7,2)(33,"mat-expansion-panel-header")(34,"mat-panel-title"),TT(35," Audio "),ul(),_w(36,kn,2,0,"mat-panel-description"),ul(),Pi(37,"mat-checkbox",10),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteAlert,r)||(i.notificationConfig.sound.muteAlert=r),dd(r)}),TT(38," Mute "),Pi(39,"b"),TT(40,"all Alert"),ul(),TT(41," state "),ul(),cD(),$h(42,"br"),Pi(43,"mat-checkbox",11),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteWarn,r)||(i.notificationConfig.sound.muteWarn=r),dd(r)}),TT(44," Mute "),Pi(45,"b"),TT(46,"all Warn"),ul(),TT(47," state "),ul(),cD(),$h(48,"br"),Pi(49,"mat-checkbox",12),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteAlarm,r)||(i.notificationConfig.sound.muteAlarm=r),dd(r)}),TT(50," Mute "),Pi(51,"b"),TT(52,"all Alarm"),ul(),TT(53," state "),ul(),cD(),$h(54,"br"),Pi(55,"mat-checkbox",13),Eg("ngModelChange",function(r){return ud(s),ST(i.notificationConfig.sound.muteEmergency,r)||(i.notificationConfig.sound.muteEmergency=r),dd(r)}),TT(56," Mute "),Pi(57,"b"),TT(58,"all Emergency"),ul(),TT(59," state "),ul(),cD(),ul()()(),Pi(60,"div",14),$h(61,"mat-divider",15),Pi(62,"button",16),TT(63,"Save"),ul()()();}if(t&2){let s=Jw(1);EE(4),Ig("ngModel",i.notificationConfig.sound.disableSound),lD(),EE(4),Ig("ngModel",i.notificationConfig.disableNotifications),lD(),EE(6),Bh("disabled",i.notificationConfig.disableNotifications),EE(5),Mw(i.isPhonePortrait().matches?-1:19),EE(),Ig("ngModel",i.notificationConfig.devices.showNormalState),lD(),EE(6),Ig("ngModel",i.notificationConfig.devices.showNominalState),lD(),EE(5),Bh("disabled",i.notificationConfig.disableNotifications),EE(5),Mw(i.isPhonePortrait().matches?-1:36),EE(),Ig("ngModel",i.notificationConfig.sound.muteAlert),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(6),Ig("ngModel",i.notificationConfig.sound.muteWarn),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(6),Ig("ngModel",i.notificationConfig.sound.muteAlarm),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(6),Ig("ngModel",i.notificationConfig.sound.muteEmergency),Bh("disabled",i.notificationConfig.sound.disableSound),lD(),EE(7),Bh("disabled",!s.form.dirty);}},dependencies:[Ln$1,Gn$1,Pn$1,kn$1,rn,Qt,Kt,yt,Ce,bt,ft,He,ze,_t,ut,u,xp],styles:[".notification-accordion[_ngcontent-%COMP%]{margin-left:25px}"]})}return n})();Wl.register(...Lh);var qi=Wl;var Tn=["activityGraph"],It=()=>({standalone:false}),En=()=>({standalone:true}),Xi=(()=>{class n{dialog=w(ee);settings=w(Gi$1);app=w(N);toast=w(lt);DataService=w(De);signalKConnectionService=w(T);deltaService=w(I);connectionStateMachine=w(We);internetReachability=w(w$1);auth=w(He$1);destroyRef=w(xe);cdr=w(Gj);canvasService=w(R);activityGraph=$j("activityGraph");connectionConfig=this.settings.getConnectionConfig();isConnecting=false;authToken=null;endpointServiceStatus=this.signalKConnectionService.serverServiceEndpoint$.getValue();streamStatus=this.deltaService.streamEndpoint$.getValue();internetAvailabilityLabel=Dt$1(()=>this.internetReachability.isChecking()?"Checking...":this.internetReachability.internetAvailable()?"Available":this.internetReachability.isReachable()===false?"Unavailable":"Unknown");_chart=null;textColor="";ngOnInit(){this.connectionConfig=this.settings.getConnectionConfig(),this.auth.authToken$.pipe(Gp(this.destroyRef)).subscribe(e=>{e?this.authToken=e:this.authToken=null,this.cdr.markForCheck();}),this.signalKConnectionService.getServiceEndpointStatusAsO().pipe(Gp(this.destroyRef)).subscribe(e=>{this.endpointServiceStatus=e,this.cdr.markForCheck();}),this.deltaService.getDataStreamStatusAsO().pipe(Gp(this.destroyRef)).subscribe(e=>{this.streamStatus=e,this.cdr.markForCheck();});}ngAfterViewInit(){let e=this.activityGraph();e&&(this.textColor=window.getComputedStyle(e.nativeElement).color,this._chart?.destroy(),this.startChart(),this.DataService.getSignalkDeltaUpdateStatistics().pipe(Gp(this.destroyRef)).subscribe(t=>{this._chart&&(this._chart.data.datasets[0].data.push({x:t.timestamp,y:t.value}),this._chart.data.datasets[0].data.length>10&&this._chart.data.datasets[0].data.shift(),this._chart?.update("none"));}));}openUserCredentialModal(e){this.dialog.open(me,{data:{user:this.connectionConfig.loginName,password:this.connectionConfig.loginPassword,error:e}}).afterClosed().pipe(Gp(this.destroyRef)).subscribe(i=>{i&&(this.connectionConfig.loginName=i.user,this.connectionConfig.loginPassword=i.password,this.cdr.markForCheck(),this.connectToServer());});}connectToServer(){return Zr(this,null,function*(){if(this.connectionConfig.useSharedConfig&&(!this.connectionConfig.loginName||!this.connectionConfig.loginPassword)){this.openUserCredentialModal("Credentials required");return}this.isConnecting=true;try{console.log("[Settings-SignalK] Validating Signal K server before connecting..."),yield this.signalKConnectionService.validateSignalKUrl(this.connectionConfig.signalKUrl),console.log("[Settings-SignalK] Validation successful - proceeding with connection"),this.settings.setConnectionConfig(this.connectionConfig),this.connectionStateMachine.shutdown("Configuration changed - restarting app"),this.authToken&&!this.connectionConfig.useSharedConfig&&!this.authToken.isDeviceAccessToken&&this.auth.deleteToken(),window.__KIP_TEST__||location.reload();}catch(e){this.isConnecting=false;let t=e?.message||"Unknown validation error";console.error("[Settings-SignalK] Server validation failed:",t),this.toast.show(`${t}`,0,false,"error");}})}startChart(){let t=this.activityGraph()?.nativeElement.getContext("2d");t&&(this._chart=new qi(t,{type:"line",data:{datasets:[{data:[],fill:true,borderColor:this.textColor}]},options:{maintainAspectRatio:false,animation:false,parsing:false,scales:{x:{type:"time",display:true,time:{unit:"minute",minUnit:"second",round:"second",displayFormats:{hour:"k:mm''",minute:"mm''",second:'mm ss"',millisecond:"SSS"}},position:"bottom",ticks:{display:false},grid:{display:true}},y:{beginAtZero:true,type:"linear",position:"right",title:{text:"Delta / Sec",display:true}}},plugins:{legend:{display:false,labels:{color:this.textColor}}}}}));}useSharedConfigToggleClick(e){if(e.checked){let t=this.signalKConnectionService.serverVersion$.getValue();if(!t||!U(t,"1.46.2",">=")){this.toast.show("Configuration sharing requires Signal K version 1.46.2 or better",0,false,"warn"),this.connectionConfig.useSharedConfig=false;return}this.openUserCredentialModal();}}ngOnDestroy(){this._chart?.destroy();let e=this.activityGraph?.()?.nativeElement;this.canvasService.releaseCanvas(e,{clear:true,removeFromDom:true});}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-signalk"]],viewQuery:function(t,i){t&1&&eg(i.activityGraph,Tn,5),t&2&&Kw();},decls:40,vars:23,consts:[["connectionForm","ngForm"],["useSharedConfigToggle",""],["activityGraph",""],["name","connectionForm",3,"ngSubmit"],[1,"connect-table"],[1,"url-cell"],[1,"connectUrlInput"],["type","url","matInput","","placeholder","Ex. http://192.168.0.1:3000","name","signalKURL","required","","pattern","https?://.+",3,"ngModelChange","ngModel","ngModelOptions"],[1,"connect-cell"],["mat-flat-button","","type","submit",1,"connect-btn",3,"disabled"],["colspan","2"],["name","useSharedConfigToggle","matTooltip","Activating authentication enables Signal K's user storage feature to save KIP configuration on the server. When authentication is not activated, KIP stores it's configuration locally in the Browser.",3,"ngModelChange","change","ngModel","ngModelOptions","disabled"],["mat-flat-button","","type","button","matTooltip","Configure Signal K user authentication credentials. The user must be a valid pre existing Signal K server user. It is strongly recommended not to use the default Signal K Admin user.",1,"credentials-btn",3,"click","disabled"],["name","signalKSubscribeAll",3,"ngModelChange","ngModel","ngModelOptions"],["name","isProxyEnabled",3,"ngModelChange","ngModel","ngModelOptions"],[1,"activity-container"],[1,"activity-graph-container"],[1,"activity-graph"],[1,"info-container"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"form",3,0),Qh("ngSubmit",function(){return i.connectToServer()}),$h(2,"br"),Pi(3,"table",4)(4,"tr",4)(5,"td",5)(6,"mat-form-field",6)(7,"mat-label"),TT(8,"Signal K URL"),ul(),Pi(9,"input",7),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.signalKUrl,r)||(i.connectionConfig.signalKUrl=r),dd(r)}),ul(),cD(),Pi(10,"mat-error"),TT(11,' Valid URL is required. Ex. "https://demo.signalK.org" or "http://my.server.com:3000" '),ul()()(),Pi(12,"td",8)(13,"button",9),TT(14),ul()()(),Pi(15,"tr",4)(16,"td",10)(17,"mat-slide-toggle",11,1),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.useSharedConfig,r)||(i.connectionConfig.useSharedConfig=r),dd(r)}),Qh("change",function(r){return i.useSharedConfigToggleClick(r)}),TT(19," Login to server "),ul(),cD(),Pi(20,"button",12),Qh("click",function(){return i.openUserCredentialModal(null)}),TT(21," Set Credential "),ul(),$h(22,"br"),Pi(23,"mat-checkbox",13),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.signalKSubscribeAll,r)||(i.connectionConfig.signalKSubscribeAll=r),dd(r)}),TT(24,"Subscribe to remote sources messages such as AIS and DSC targets. "),Pi(25,"i"),TT(26,"Warning: this maybe generate heavy traffic."),ul()(),cD(),ul()(),Pi(27,"tr",4)(28,"td",10)(29,"mat-checkbox",14),Eg("ngModelChange",function(r){return ud(s),ST(i.connectionConfig.proxyEnabled,r)||(i.connectionConfig.proxyEnabled=r),dd(r)}),TT(30,"Signal K server is behind a Proxy"),ul(),cD(),ul()()()(),Pi(31,"div",15)(32,"div",16),$h(33,"canvas",17,2),ul(),Pi(35,"div",18)(36,"pre"),TT(37),$h(38,"br"),TT(39),ul()()();}if(t&2){let s=Jw(1);EE(9),Ig("ngModel",i.connectionConfig.signalKUrl),Bh("ngModelOptions",FT(19,It)),lD(),EE(4),Bh("disabled",!s.form.valid||i.isConnecting),EE(),gl(" ",i.isConnecting?"Validating...":"Connect"," "),EE(3),Ig("ngModel",i.connectionConfig.useSharedConfig),Bh("ngModelOptions",FT(20,En))("disabled",!i.connectionConfig.signalKUrl),lD(),EE(3),Bh("disabled",!i.connectionConfig.useSharedConfig),EE(3),Ig("ngModel",i.connectionConfig.signalKSubscribeAll),Bh("ngModelOptions",FT(21,It)),lD(),EE(6),Ig("ngModel",i.connectionConfig.proxyEnabled),Bh("ngModelOptions",FT(22,It)),lD(),EE(8),yg("KIP: ",i.app.appVersion(),`
687
687
  `,i.app.browserVersion(),", ",i.app.osVersion()),EE(2),vg(`
688
688
  `,i.endpointServiceStatus.serverDescription,`
689
689
  `,i.streamStatus.message,", ",i.streamStatus.hasToken?"Logged In":"Readonly",`
@@ -1011,5 +1011,5 @@ Internet: `,i.internetAvailabilityLabel());}},dependencies:[Ln$1,Gn$1,Xe,Pn$1,kn
1011
1011
  .mdc-slider__thumb--focused .mat-focus-indicator::before {
1012
1012
  content: "";
1013
1013
  }
1014
- `],encapsulation:2})}return n})();var Bn={provide:L,useExisting:Po(()=>At),multi:true};var At=(()=>{class n{_ngZone=w(ue);_elementRef=w(Lr);_cdr=w(Gj);_slider=w(Dt);_platform=w(G);_listenerCleanups;get value(){return Yj(this._hostElement.value,0)}set value(e){e===null&&(e=this._getDefaultValue()),e=isNaN(e)?0:e;let t=e+"";if(!this._hasSetInitialValue){this._initialValue=t;return}this._isActive||this._setValue(t);}_setValue(e){this._hostElement.value=e,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck();}valueChange=new Qe;dragStart=new Qe;dragEnd=new Qe;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(e){this._translateX=e;}_translateX;thumbPosition=g.END;get min(){return Yj(this._hostElement.min,0)}set min(e){this._hostElement.min=e+"",this._cdr.detectChanges();}get max(){return Yj(this._hostElement.max,0)}set max(e){this._hostElement.max=e+"",this._cdr.detectChanges();}get step(){return Yj(this._hostElement.step,0)}set step(e){this._hostElement.step=e+"",this._cdr.detectChanges();}get disabled(){return Zj(this._hostElement.disabled)}set disabled(e){this._hostElement.disabled=e,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled);}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl()?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl()?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=vt$1("");_knobRadius=8;_tickMarkOffset=3;_isActive=false;_isFocused=false;_setIsFocused(e){this._isFocused=e;}_hasSetInitialValue=false;_initialValue;_formControl;_destroyed=new te;_skipUIUpdate=false;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=false;constructor(){let e=w(tD);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[e.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),e.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),e.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))];});}ngOnDestroy(){this._listenerCleanups.forEach(e=>e()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete();}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=true),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue();}initUI(){this._updateThumbUIByValue();}_initValue(){this._hasSetInitialValue=true,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges());}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(false),this._onTouchedFn();}_onFocus(){this._slider._setTransition(false),this._slider._updateTrackUI(this),this._setIsFocused(true);}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:true});}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:true}),this._slider._onValueChange(this);}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled;}_onPointerDown(e){if(!(this.disabled||e.button!==0)){if(this._platform.IOS){let t=this._slider._isCursorOnSliderThumb(e,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=t,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=true,this._setIsFocused(true),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(e,{withAnimation:true}),this.disabled||(this._handleValueCorrection(e),this.dragStart.emit({source:this,parent:this._slider,value:this.value}));}}_handleValueCorrection(e){this._skipUIUpdate=true,setTimeout(()=>{this._skipUIUpdate=false,this._fixValue(e);},0);}_fixValue(e){let t=e.clientX-this._slider._cachedLeft,i=this._slider._cachedWidth,s=this._slider.step===0?1:this._slider.step,d=Math.floor((this._slider.max-this._slider.min)/s),r=this._slider._isRtl()?1-t/i:t/i,$=Math.round(r*d)/d*(this._slider.max-this._slider.min)+this._slider.min,ae=Math.round($/s)*s,Ke=this.value;if(ae===Ke){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(e,{withAnimation:this._slider._hasAnimation});return}this.value=ae,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(e,{withAnimation:this._slider._hasAnimation});}_onPointerMove(e){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(e);}_onPointerUp(){this._isActive&&(this._isActive=false,this._platform.SAFARI&&this._setIsFocused(false),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0));}_clamp(e){let t=this._tickMarkOffset,i=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(e,i),t)}_calcTranslateXByValue(){return this._slider._isRtl()?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(e){return e.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`;}_updateThumbUIByValue(e){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(e);}_updateThumbUIByPointerEvent(e,t){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(e)),this._updateThumbUI(t);}_updateThumbUI(e){this._slider._setTransition(!!e?.withAnimation),this._slider._onTranslateXChange(this);}writeValue(e){(this._isControlInitialized||e!==null)&&(this.value=e);}registerOnChange(e){this._onChangeFn=e,this._isControlInitialized=true;}registerOnTouched(e){this._onTouchedFn=e;}setDisabledState(e){this.disabled=e;}focus(){this._hostElement.focus();}blur(){this._hostElement.blur();}static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(t,i){t&1&&Qh("change",function(){return i._onChange()})("input",function(){return i._onInput()})("blur",function(){return i._onBlur()})("focus",function(){return i._onFocus()}),t&2&&Hh("aria-valuetext",i._valuetext());},inputs:{value:[2,"value","value",Yj]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[LT([Bn,{provide:ji,useExisting:n}])]})}return n})();var Zi=(()=>{class n{static \u0275fac=function(t){return new(t||n)};static \u0275mod=bh({type:n});static \u0275inj=Qs({imports:[ca,Fn$1]})}return n})();var Hn=["displayForm"];function zn(n,u){if(n&1&&(Pi(0,"mat-panel-description",8),TT(1," Adjust night mode settings to enhance visibility in low-light environments. "),ul()),n&2){let e=qw();Bh("hidden",e.isPhonePortrait().matches);}}function Kn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Choose your preferred high-contrast theme. "),ul());}function qn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Configure persistent dual\u2011panel chart & dashboards layout. "),ul());}function Xn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Configure remote dashboard operations between KIP instances. "),ul());}function jn(n,u){n&1&&(Pi(0,"mat-error"),TT(1,"This field is required."),ul());}function Gn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Set historical charting and data logging for widgets. This enables retrospective views and access to historical data. "),ul());}function Qn(n,u){n&1&&(Pi(0,"div",28)(1,"p")(2,"strong"),TT(3,"KIP history capture requires Node.js version 22.5.0 or newer (with node:sqlite support)."),ul(),$h(4,"br"),TT(5," Before upgrading Node.js, always verify compatibility with your Signal K server version. "),ul(),Pi(6,"p"),TT(7," For details and the latest requirements, see the "),Pi(8,"a",33),TT(9,"Signal K installation documentation"),ul(),TT(10,". "),ul()());}function Zn(n,u){if(n&1){let e=Fw();_w(0,Qn,11,0,"div",28),Pi(1,"span"),TT(2,"Select history provider and data logging mode:"),ul(),Pi(3,"mat-radio-group",29),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.providerMode,i)||(s.providerMode=i),dd(i)}),Pi(4,"mat-radio-button",30),TT(5," KIP: Automatic history series and data logging "),ul(),Pi(6,"mat-radio-button",31),TT(7," Other: Use a different History API provider and configure data logging manually "),ul()(),cD(),Pi(8,"mat-slide-toggle",32),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.widgetHistoryDisabled,i)||(s.widgetHistoryDisabled=i),dd(i)}),TT(9," Disable widget historical charts (two-finger tap or right-click to view history feature). "),ul(),cD();}if(n&2){let e=qw();Mw(e.isKipHistoryProviderSelectable()?-1:0),EE(3),Ig("ngModel",e.providerMode),Bh("value",e.providerMode()),lD(),EE(),Bh("disabled",!e.isKipHistoryProviderSelectable()),EE(4),Ig("ngModel",e.widgetHistoryDisabled),lD();}}function Jn(n,u){n&1&&(Pi(0,"p"),TT(1,"Historical data features requires both Signal K server version 2.22.1 or later."),ul());}function Yn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Specialized options for development, troubleshooting, and test scenarios. Most users should leave these settings off. "),ul());}var Ji=(()=>{class n{DERIVED_DATA_PLUGIN_ID="derived-data";KIP_DATA_PLUGIN_ID="kip";LIGHT_THEME_NAME="light-theme";displayForm=$j("displayForm");app=w(N);toast=w(lt);settings=w(Gi$1);responsive=w(ir);pluginConfig=w(w$2);server=w(T);isPhonePortrait;nightBrightness=vt$1(.27);isHistoryApiSupported=Dt$1(()=>{let e=this.server.serverVersion$.getValue();return e?U(e,"2.22.1",">="):false});autoNightMode=Bj(false);isRedNightMode=Bj(false);isLightTheme=Bj(false);isRemoteControl=Bj(false);instanceName=Bj("");splitShellEnabled=Bj(false);splitShellSide=Bj("left");splitShellSwipeDisabled=Bj(false);providerMode=Bj("other");widgetHistoryDisabled=Bj(false);isKipHistoryProviderSelectable=vt$1(false);isPathValidationDisabled=Bj(this.settings.getDisablePathValidation());_pluginCheckSeq=0;constructor(){this.isPhonePortrait=Wp(this.responsive.observe(Em.HandsetPortrait),{initialValue:{matches:false,breakpoints:{}}});}ngOnInit(){this.nightBrightness.set(this.settings.getNightModeBrightness()),this.autoNightMode.set(this.settings.getAutoNightMode()),this.isLightTheme.set(this.settings.getThemeName()===this.LIGHT_THEME_NAME),this.isRedNightMode.set(this.settings.getRedNightMode()),this.isRemoteControl.set(this.settings.getIsRemoteControl()),this.instanceName.set(this.settings.getInstanceName()),this.splitShellEnabled.set(this.settings.getSplitShellEnabled()),this.splitShellSide.set(this.settings.getSplitShellSide()),this.splitShellSwipeDisabled.set(this.settings.getSplitShellSwipeDisabled()),this.widgetHistoryDisabled.set(this.settings.getWidgetHistoryDisabled()),this.getKipPluginConfig();}saveAllSettings(){let e=this.displayForm();if(!e||e.invalid){e?.form.markAllAsTouched(),this.toast.show("Please fill out required fields before saving.",3e3,true);return}if(this.autoNightMode()){let t=++this._pluginCheckSeq;this.validateAndSaveSettings(t);return}this.applyAndSaveSettings();}applyAndSaveSettings(){return Zr(this,null,function*(){this.settings.setAutoNightMode(this.autoNightMode()),this.settings.setRedNightMode(this.isRedNightMode()),this.settings.setNightModeBrightness(this.nightBrightness()),this.settings.setIsRemoteControl(this.isRemoteControl()),this.isRemoteControl()?this.settings.setInstanceName(this.instanceName()):this.settings.setInstanceName(""),this.app.isNightMode()||this.app.setBrightness(1),this.isLightTheme()?this.settings.setThemeName(this.LIGHT_THEME_NAME):this.settings.setThemeName(""),this.settings.setSplitShellEnabled(this.splitShellEnabled()),this.settings.setSplitShellSide(this.splitShellSide()),this.settings.setSplitShellSwipeDisabled(this.splitShellSwipeDisabled()),this.settings.setWidgetHistoryDisabled(this.widgetHistoryDisabled()),this.settings.setDisablePathValidation(this.isPathValidationDisabled());let e=yield this.setKipPluginConfig();if(this.displayForm()?.form.markAsPristine(),!e){this.toast.show("Failed to save KIP plugin configuration on server.",0,false,"error");return}this.toast.show("Configuration saved",1e3,true,"message");})}validateAndSaveSettings(e){return Zr(this,null,function*(){let t=yield this.validateAndHandleAutoNightRequirement(e);e===this._pluginCheckSeq&&(t?yield this.applyAndSaveSettings():this.autoNightMode.set(false));})}getKipPluginConfig(){return Zr(this,null,function*(){let e=yield this.pluginConfig.getPlugin(this.KIP_DATA_PLUGIN_ID);if(!e.ok){this.toast.show(`Failed to load KIP plugin configuration: ${e.error.message}`,0,false,"error");return}let t=e.data.state.configuration,i=t.historySeriesServiceEnabled===true;this.isKipHistoryProviderSelectable.set(t.nodeSqliteAvailable??false),this.providerMode.set(i&&this.isKipHistoryProviderSelectable()?"kip":"other");})}setKipPluginConfig(){return Zr(this,null,function*(){let e=this.isKipHistoryProviderSelectable(),t=this.providerMode()==="kip"&&e,i={configuration:{historySeriesServiceEnabled:t,registerAsHistoryApiProvider:t}};return (yield this.pluginConfig.savePluginConfig(this.KIP_DATA_PLUGIN_ID,i)).ok})}isAutoNightModeSupported(e){this.displayForm()?.form.markAsDirty(),this.autoNightMode.set(e.checked);}validateAndHandleAutoNightRequirement(e){return Zr(this,null,function*(){let t=yield this.pluginConfig.getPlugin(this.DERIVED_DATA_PLUGIN_ID);if(e!==this._pluginCheckSeq)return false;if(!t.ok){let ae=t;return ae.error.reason==="not-found"?(this.toast.show("Automatic Night Mode requires the Signal K Derived Data plugin. This requirement is missing and must be installed manually by the user.",0,false,"error"),false):(this.toast.show(`Failed to validate Automatic Night Mode requirements: ${ae.error.message}`,0,false,"error"),false)}let i=t.data,s=this.resolveEnvironmentSunFlagPath(i.state.configuration),d=this.readBooleanByPath(i.state.configuration,s)===true;if(i.state.enabled&&d)return true;let r=!i.state.enabled,R=!d,$;return r&&R?$="To enable Automatic Night Mode, the Derived Data plugin must be enabled and the environment.sun path must be set to true. Do you wish to enable & and activate the path?":r?$="To enable Automatic Night Mode, the Derived Data plugin must be enabled. Do you wish to enable the plugin?":$="To enable Automatic Night Mode, the environment.sun path in the Derived Data plugin must be activated. Do you wish to activate the path?",new Promise(ae=>{let Ke=this.toast.show($,0,false,"warn","Ok");Ke.onAction().subscribe(()=>{this.enableAndConfigureAutoNight(i,s,e,ae);}),Ke.afterDismissed().subscribe(en=>{en.dismissedByAction||ae(false);});})})}enableAndConfigureAutoNight(e,t,i,s){return Zr(this,null,function*(){let d=this.cloneConfig(e.state.configuration);this.writeBooleanByPath(d,t,true);let r=yield this.pluginConfig.savePluginConfig(e.id,{configuration:d,enabled:true});if(i!==this._pluginCheckSeq){s(false);return}if(!r.ok){let R=r;this.toast.show(`Failed to enable and configure Derived Data plugin: ${R.error.message}`,0,false,"error"),s(false);return}this.toast.show("Automatic Night Mode dependency enabled and configured.",3e3,true,"success"),s(true);})}resolveEnvironmentSunFlagPath(e){return this.findBooleanSunPath(e)??["sun"]}findBooleanSunPath(e,t=[]){let i=Object.entries(e).find(([s,d])=>s.toLowerCase()==="sun"&&typeof d=="boolean");if(i)return [...t,i[0]];for(let[s,d]of Object.entries(e)){if(typeof d=="boolean"&&s.toLowerCase().includes("sun"))return [...t,s];if(d&&typeof d=="object"&&!Array.isArray(d)){let r=this.findBooleanSunPath(d,[...t,s]);if(r)return r}}return null}readBooleanByPath(e,t){let i=e;for(let s of t){if(!i||typeof i!="object"||Array.isArray(i))return null;i=i[s];}return typeof i=="boolean"?i:null}writeBooleanByPath(e,t,i){if(t.length===0)return;let s=e;for(let d=0;d<t.length-1;d++){let r=t[d],R=s[r];(!R||typeof R!="object"||Array.isArray(R))&&(s[r]={}),s=s[r];}s[t[t.length-1]]=i;}cloneConfig(e){return JSON.parse(JSON.stringify(e||{}))}setBrightness(e){this.displayForm()?.form.markAsDirty(),this.nightBrightness.set(e),this.app.setBrightness(e,this.app.isNightMode());}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-display"]],viewQuery:function(t,i){t&1&&eg(i.displayForm,Hn,5),t&2&&Kw();},inputs:{autoNightMode:[1,"autoNightMode"],isRedNightMode:[1,"isRedNightMode"],isLightTheme:[1,"isLightTheme"],isRemoteControl:[1,"isRemoteControl"],instanceName:[1,"instanceName"],splitShellEnabled:[1,"splitShellEnabled"],splitShellSide:[1,"splitShellSide"],splitShellSwipeDisabled:[1,"splitShellSwipeDisabled"],providerMode:[1,"providerMode"],widgetHistoryDisabled:[1,"widgetHistoryDisabled"],isPathValidationDisabled:[1,"isPathValidationDisabled"]},outputs:{autoNightMode:"autoNightModeChange",isRedNightMode:"isRedNightModeChange",isLightTheme:"isLightThemeChange",isRemoteControl:"isRemoteControlChange",instanceName:"instanceNameChange",splitShellEnabled:"splitShellEnabledChange",splitShellSide:"splitShellSideChange",splitShellSwipeDisabled:"splitShellSwipeDisabledChange",providerMode:"providerModeChange",widgetHistoryDisabled:"widgetHistoryDisabledChange",isPathValidationDisabled:"isPathValidationDisabledChange"},decls:85,vars:27,consts:[["displayForm","ngForm"],["redNightModeToggle",""],["inputBrightness",""],["isFskShellEnabled",""],["isFskShellSwipeEnabled",""],["isRemoteControlCb",""],["instanceNameModel","ngModel"],["id","displaySetting",3,"ngSubmit"],[3,"hidden"],["name","autoNightMode",1,"full-width","sliders",3,"change","ngModelChange","ngModel"],["name","redNightMode",1,"full-width","sliders",3,"ngModelChange","ngModel"],[2,"padding-left","10px"],["min","0","max","1","step","0.01","discrete","",3,"disabled"],["matSliderThumb","",3,"input","value","disabled"],["name","isLightTheme",1,"full-width",3,"ngModelChange","ngModel"],["name","freeboardShellEnabled",1,"full-width",3,"ngModelChange","ngModel"],[1,"optional-field"],["name","splitShellSide",3,"ngModelChange","ngModel","disabled"],["value","left"],["value","right"],["name","freeboardShellSwipeEnabled",1,"optional-field","full-width",3,"ngModelChange","ngModel","disabled"],["name","isRemoteControl",1,"full-width",3,"ngModelChange","ngModel"],["matInput","","name","instanceName","placeholder","Ex. Mast",3,"ngModelChange","ngModel","disabled","required"],["name","isPathValidationDisabled","aria-describedby","path-validation-helper",1,"full-width",3,"ngModelChange","ngModel"],["id","path-validation-helper","role","note",1,"dev-option-helper","mat-body-small"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit",1,"formActionButton",3,"disabled"],[1,"warning"],["name","providerMode","required","",1,"radio-group",3,"ngModelChange","ngModel","value"],["value","kip",1,"radio-button",3,"disabled"],["value","other",1,"radio-button"],["name","widgetHistoryDisabled",1,"full-width",3,"ngModelChange","ngModel"],["href","https://demo.signalk.org/documentation/Installation.html","target","_blank"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"form",7,0),Qh("ngSubmit",function(){return i.saveAllSettings()}),Pi(2,"p"),TT(3,"Customize your display settings to enable various integrations, improve visibility and adapt to various lighting conditions."),ul(),Pi(4,"mat-accordion")(5,"mat-expansion-panel")(6,"mat-expansion-panel-header")(7,"mat-panel-title"),TT(8," Night Mode "),ul(),_w(9,zn,2,1,"mat-panel-description",8),ul(),Pi(10,"mat-slide-toggle",9),Qh("change",function(r){return i.isAutoNightModeSupported(r)}),Eg("ngModelChange",function(r){return ud(s),ST(i.autoNightMode,r)||(i.autoNightMode=r),dd(r)}),TT(11," Automatically activate day and night modes based on sun phases. "),ul(),cD(),Pi(12,"mat-slide-toggle",10,1),Eg("ngModelChange",function(r){return ud(s),ST(i.isRedNightMode,r)||(i.isRedNightMode=r),dd(r)}),TT(14," Enable red-only night mode. "),ul(),cD(),Pi(15,"div",11),$h(16,"br"),Pi(17,"span"),TT(18,"Adjust Night Mode Brightness"),ul(),$h(19,"br"),Pi(20,"mat-slider",12)(21,"input",13,2),Qh("input",function(){ud(s);let r=Jw(22);return dd(i.setBrightness(+r.value))}),ul()()()(),Pi(23,"mat-expansion-panel")(24,"mat-expansion-panel-header")(25,"mat-panel-title"),TT(26," Theme "),ul(),_w(27,Kn,2,0,"mat-panel-description"),ul(),Pi(28,"mat-slide-toggle",14),Eg("ngModelChange",function(r){return ud(s),ST(i.isLightTheme,r)||(i.isLightTheme=r),dd(r)}),TT(29," Enable light theme for brighter display settings. "),ul(),cD(),ul(),Pi(30,"mat-expansion-panel")(31,"mat-expansion-panel-header")(32,"mat-panel-title"),TT(33," Chartplotter Mode "),ul(),_w(34,qn,2,0,"mat-panel-description"),ul(),Pi(35,"mat-slide-toggle",15,3),Eg("ngModelChange",function(r){return ud(s),ST(i.splitShellEnabled,r)||(i.splitShellEnabled=r),dd(r)}),TT(37," Enable Freeboard\u2011SK dual\u2011panel Chartplotter mode. "),ul(),cD(),Pi(38,"mat-form-field",16)(39,"mat-label"),TT(40,"Freeboard-SK panel side"),ul(),Pi(41,"mat-select",17),Eg("ngModelChange",function(r){return ud(s),ST(i.splitShellSide,r)||(i.splitShellSide=r),dd(r)}),Pi(42,"mat-option",18),TT(43,"Left side"),ul(),Pi(44,"mat-option",19),TT(45,"Right side"),ul()(),cD(),ul(),Pi(46,"mat-slide-toggle",20,4),Eg("ngModelChange",function(r){return ud(s),ST(i.splitShellSwipeDisabled,r)||(i.splitShellSwipeDisabled=r),dd(r)}),TT(48," Disable swipe gestures over chart panel. "),ul(),cD(),ul(),Pi(49,"mat-expansion-panel")(50,"mat-expansion-panel-header")(51,"mat-panel-title"),TT(52," Remote Control "),ul(),_w(53,Xn,2,0,"mat-panel-description"),ul(),Pi(54,"mat-slide-toggle",21,5),Eg("ngModelChange",function(r){return ud(s),ST(i.isRemoteControl,r)||(i.isRemoteControl=r),dd(r)}),TT(56," Allow remote KIP instances to view and control this dashboard. "),ul(),cD(),Pi(57,"mat-form-field",16)(58,"mat-label"),TT(59,"Name of this instance"),ul(),Pi(60,"input",22,6),Qh("ngModelChange",function(){ud(s);let r=Jw(1);return dd(r.form.markAsDirty())}),Eg("ngModelChange",function(r){return ud(s),ST(i.instanceName,r)||(i.instanceName=r),dd(r)}),ul(),cD(),_w(62,jn,2,0,"mat-error"),ul()(),Pi(63,"mat-expansion-panel")(64,"mat-expansion-panel-header")(65,"mat-panel-title"),TT(66," Widget Historical Data "),ul(),_w(67,Gn,2,0,"mat-panel-description"),ul(),_w(68,Zn,10,5)(69,Jn,2,0,"p"),ul()(),$h(70,"br"),Pi(71,"mat-accordion")(72,"mat-expansion-panel")(73,"mat-expansion-panel-header")(74,"mat-panel-title"),TT(75," Advanced and Testing "),ul(),_w(76,Yn,2,0,"mat-panel-description"),ul(),Pi(77,"mat-slide-toggle",23),Eg("ngModelChange",function(r){return ud(s),ST(i.isPathValidationDisabled,r)||(i.isPathValidationDisabled=r),dd(r)}),TT(78," Allow saving widgets with invalid paths (testing only) "),ul(),cD(),Pi(79,"p",24),TT(80," Use only for development and troubleshooting. This temporary setting is reset when the app restarts. "),ul()()(),Pi(81,"div",25),$h(82,"mat-divider",26),Pi(83,"button",27),TT(84,"Save"),ul()()();}if(t&2){let s=Jw(1),d=Jw(13),r=Jw(36),R=Jw(55),$=Jw(61);EE(9),Mw(i.isPhonePortrait().matches?-1:9),EE(),Ig("ngModel",i.autoNightMode),lD(),EE(2),Ig("ngModel",i.isRedNightMode),lD(),EE(5),pT(d.checked?"mat-body-medium disable-color":"mat-body-medium"),EE(3),Bh("disabled",d.checked),EE(),Bh("value",i.nightBrightness())("disabled",d.checked),EE(6),Mw(i.isPhonePortrait().matches?-1:27),EE(),Ig("ngModel",i.isLightTheme),lD(),EE(6),Mw(i.isPhonePortrait().matches?-1:34),EE(),Ig("ngModel",i.splitShellEnabled),lD(),EE(6),Ig("ngModel",i.splitShellSide),Bh("disabled",!r.checked),lD(),EE(5),Ig("ngModel",i.splitShellSwipeDisabled),Bh("disabled",!r.checked),lD(),EE(7),Mw(i.isPhonePortrait().matches?-1:53),EE(),Ig("ngModel",i.isRemoteControl),lD(),EE(6),Ig("ngModel",i.instanceName),Bh("disabled",!R.checked)("required",R.checked),lD(),EE(2),Mw(R.checked&&$.invalid&&($.touched||s.submitted)?62:-1),EE(5),Mw(i.isPhonePortrait().matches?-1:67),EE(),Mw(i.isHistoryApiSupported()?68:69),EE(8),Mw(i.isPhonePortrait().matches?-1:76),EE(),Ig("ngModel",i.isPathValidationDisabled),lD(),EE(6),Bh("disabled",!s.form.dirty||s.form.invalid);}},dependencies:[Ln$1,Gn$1,Xe,Pn$1,kn$1,ft$1,rn,Qt,f,u,Op,xp,Zi,Qi,At,bt,ft,He,ze,_t,ut,ln,an$1,rt,ae,It$1,yt,Ce,Lt,Ft,F$1,va,an$2,ft$2],styles:[".optional-field[_ngcontent-%COMP%]{margin-left:55px;margin-top:10px}.sliders[_ngcontent-%COMP%]{margin:5px 0}.disable-color[_ngcontent-%COMP%]{color:var(--mat-sys-outline)}.radio-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin:5px 0 15px;align-items:flex-start}.radio-button[_ngcontent-%COMP%]{margin:5px}.warning[_ngcontent-%COMP%]{background-color:var(--mat-sys-on-error-container);color:var(--mat-sys-error-container);padding:1px 14px;border-radius:var(--mat-sys-corner-small)}.warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font:var(--mat-sys-body-medium);letter-spacing:var(--mat-sys-body-medium-tracking)}.dev-option-helper[_ngcontent-%COMP%]{margin:4px 0 0 55px;font:var(--mat-sys-body-small);letter-spacing:var(--mat-sys-body-small-tracking);color:var(--mat-sys-on-surface-variant)}"]})}return n})();var $n=()=>({standalone:false}),Yi=(n,u)=>u.key;function ea(n,u){n&1&&(Pi(0,"div"),TT(1,' Writing to the server requires "Login to Server" authentication or a Device token '),ul());}function ta(n,u){if(n&1){let e=Fw();Pi(0,"div")(1,"mat-form-field",30)(2,"mat-label"),TT(3,"Scope"),ul(),Pi(4,"mat-select",31),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.saveConfigScope,i)||(s.saveConfigScope=i),dd(i)}),Pi(5,"mat-option",32),TT(6," Global "),ul(),Pi(7,"mat-option",33),TT(8," User "),ul()(),cD(),ul(),Pi(9,"mat-form-field",34)(10,"mat-label"),TT(11,"Configuration Name"),ul(),Pi(12,"input",35),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.saveConfigName,i)||(s.saveConfigName=i),dd(i)}),ul(),cD(),ul(),_w(13,ea,2,0,"div"),ul();}if(n&2){let e=qw();EE(4),Ig("ngModel",e.saveConfigScope),lD(),EE(8),Ig("ngModel",e.saveConfigName),Bh("ngModelOptions",FT(4,$n)),lD(),EE(),Mw(e.hasToken?-1:13);}}function ia(n,u){n&1&&(Pi(0,"div",9)(1,"p"),TT(2,"Server authentication or Device Token required"),ul()());}function na(n,u){if(n&1&&(Pi(0,"mat-option",38),TT(1),ul()),n&2){let e=u.$implicit;Bh("value",e.key),EE(),mg(" ",e.scope," / ",e.name," ");}}function aa(n,u){if(n&1){let e=Fw();Pi(0,"div")(1,"mat-form-field",36)(2,"mat-label"),TT(3,"Configuration"),ul(),Pi(4,"mat-select",37),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.deleteConfigKey,i)||(s.deleteConfigKey=i),dd(i)}),xw(5,na,2,3,"mat-option",38,Yi),ul(),cD(),ul()();}if(n&2){let e=qw();EE(4),Ig("ngModel",e.deleteConfigKey),lD(),EE(),Aw(e.serverConfigOptions());}}function oa(n,u){n&1&&(Pi(0,"div",9)(1,"p"),TT(2,"Authentication or Device Token required"),ul()());}function sa(n,u){if(n&1&&(Pi(0,"mat-option",38),TT(1),ul()),n&2){let e=u.$implicit;Bh("value",e.key),EE(),mg(" ",e.scope," / ",e.name," ");}}function ra(n,u){if(n&1&&(Pi(0,"div")(1,"mat-form-field",36)(2,"mat-label"),TT(3,"Configuration"),ul(),Pi(4,"mat-select",39),xw(5,sa,2,3,"mat-option",38,Yi),ul(),cD(),ul()()),n&2){let e=qw();EE(4),lD(),EE(),Aw(e.serverConfigOptions());}}function la(n,u){n&1&&(Pi(0,"div",9)(1,"p"),TT(2,"Authentication or Device Token required"),ul()());}var $i=(()=>{class n{settings=w(Gi$1);storageSvc=w(Ge);toast=w(lt);auth=w(He$1);fb=w(Hn$1);authToken=Wp(this.auth.authToken$,{initialValue:null});serverConfigListSignal=vt$1([]);hasTokenSignal=Dt$1(()=>!!this.authToken()?.token);isTokenTypeDeviceSignal=Dt$1(()=>!!this.authToken()?.isDeviceAccessToken);pageTitle="Configurations";get hasToken(){return this.hasTokenSignal()}get isTokenTypeDevice(){return this.isTokenTypeDeviceSignal()}supportApplicationData=this.storageSvc.isAppDataSupported;serverConfigOptions=Dt$1(()=>this.serverConfigListSignal().map(e=>({scope:e.scope,name:e.name,key:`${e.scope}::${e.name}`})));serverUpgradableConfigList=[];copyConfigForm=this.fb.group({sourceTarget:[{value:"",disabled:false},ve.required]});storageLocation=null;locations=["Local Storage","Server Storage"];saveConfigName=null;saveConfigScope=null;deleteConfigKey=null;jsonData=null;authStateEffect=Fa(()=>{if(this.supportApplicationData){if(this.hasTokenSignal()){this.saveConfigScope=this.isTokenTypeDeviceSignal()?"global":"user",this.getServerConfigList();return}this.deleteConfigKey=null;}});getServerConfigList(e){this.supportApplicationData&&this.storageSvc.listConfigs(e).then(t=>{let i=t.filter(s=>!(s.scope==="user"&&s.name==="default"));e?this.serverUpgradableConfigList=i:this.serverConfigListSignal.set(i);}).catch(t=>{t.status===401?this.toast.show("Storage Service: "+t.statusText+". Signal K configuration must meet the following requirements; 1) Security enabled. 2) Application Data Storage Interface: On. 3) Either Allow Readonly Access enabled, or connecting with a user.",0,false,"error"):this.toast.show("Cannot list configurations: "+t,0,false,"error");});}saveConfig(e,t,i,s,d){return Zr(this,null,function*(){if(!this.supportApplicationData)return false;if(t==="user"&&i==="default"&&!d)return this.toast.show("Saving configuration with scope 'user' and name 'default' is not allowed.",0,false,"error"),false;try{yield this.storageSvc.setConfig(t,i,e);}catch(r){return this.toast.show("Configuration not saved to server",0,false,"error"),false}return this.toast.show(`Configuration [${i}] saved to [${t}] storage scope`,1e3,true,"success"),s||this.getServerConfigList(),true})}saveToLocalstorage(e){e.app&&this.settings.replaceConfig("appConfig",e.app,false),this.settings.replaceConfig("dashboardsConfig",e.dashboards,false),e.theme&&this.settings.replaceConfig("themeConfig",e.theme,false);}copyConfig(){return Zr(this,null,function*(){let e=this.parseConfigKey(this.copyConfigForm.value.sourceTarget);if(!e){this.toast.show("Please select a valid configuration to restore.",0,false,"error");return}let t=null;try{yield this.storageSvc.getConfig(e.scope,e.name).then(s=>{t=s;});}catch(s){let d=typeof s=="object"&&s&&"statusText"in s?String(s.statusText??"Unknown error"):"Unknown error";this.toast.show("Cannot retrieve server configuration: "+d,0,false,"error");return}if(!t){this.toast.show("Cannot retrieve server configuration.",0,false,"error");return}(yield this.saveConfig(t,"user","default",false,true))&&this.settings.reloadApp();})}deleteConfigByKey(e){let t=this.parseConfigKey(e);if(!t){this.toast.show("Please select a valid configuration to delete.",0,false,"error");return}this.deleteConfig(t.scope,t.name);}deleteConfig(e,t,i,s){return Zr(this,null,function*(){try{yield this.storageSvc.removeItem(e,t,i);}catch(d){this.toast.show(`Configuration [${t}] could not be deleted from [${e}] storage scope`,0,false,"error");return}this.toast.show(`Configuration [${t}] deleted from [${e}] storage scope`,1e3,false,"success"),s||this.getServerConfigList();})}parseConfigKey(e){if(!e)return null;let[t,...i]=e.split("::"),s=i.join("::");return !t||!s?null:{scope:t,name:s}}resetConfigToDefault(){this.settings.resetSettings();}resetConnectionToDefault(){this.settings.resetConnection();}loadDemoConfig(){this.settings.loadDemoConfig();}getActiveConfig(){let e;return this.settings.useSharedConfig?e=this.getLocalConfigFromMemory():e=this.getLocalConfigFromLocalStorage(),e}getLocalConfigFromMemory(){return {app:this.settings.getAppConfig(),dashboards:this.settings.getDashboardConfig(),theme:this.settings.getThemeConfig()}}getLocalConfigFromLocalStorage(){return {app:this.settings.loadConfigFromLocalStorage("appConfig"),dashboards:this.settings.loadConfigFromLocalStorage("dashboardsConfig"),theme:this.settings.loadConfigFromLocalStorage("themeConfig")}}downloadJsonConfig(){let e=this.getActiveConfig(),t=JSON.stringify(e,null,2),i=new Blob([t],{type:"application/json"}),s=window.URL.createObjectURL(i),d=document.createElement("a");d.href=s,d.download="KipConfig.json",document.body.appendChild(d),d.click(),document.body.removeChild(d),window.URL.revokeObjectURL(s);}uploadJsonConfig(e){let i=e.target.files?.[0];if(i&&i.type==="application/json"){let s=new FileReader;s.onload=d=>Zr(this,null,function*(){try{this.jsonData=JSON.parse(d.target?.result);}catch(r){this.toast.show("File does not contain valid JSON.",0,false,"error"),console.error("Invalid JSON file format:",r);return}if(this.hasToken){if(!this.jsonData){this.toast.show("Configuration not saved",0,false,"error");return}if(!(yield this.saveConfig(this.jsonData,"user","default",false,true)))return}else {if(!this.jsonData){this.toast.show("Configuration not saved",0,false,"error");return}try{this.saveToLocalstorage(this.jsonData);}catch(r){this.toast.show("Configuration not saved",0,false,"error"),console.error("Failed to save configuration to local storage:",r);return}}this.settings.reloadApp();}),s.readAsText(i);}else this.toast.show("Please select a valid JSON file",0,false,"error");}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-config"]],decls:88,vars:7,consts:[["saveConfigForm","ngForm"],["deleteConfigForm","ngForm"],["fileInput",""],[1,"page-content"],["routerLink","/help/configuration"],[1,"flex-container"],[1,"flex-item-rounded-card","rounded-card-color"],["name","saveConfigForm",3,"ngSubmit"],[2,"margin-bottom","16px"],[1,"no-token-notice"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit","color","accent",3,"disabled"],["name","deleteConfigForm",3,"ngSubmit"],[3,"ngSubmit","formGroup"],[1,"flex-item-reset","rounded-card-color"],[1,"config-operation-container",2,"margin-top","20px"],[1,"download-txt"],[1,"download-btn","btn-div"],["mat-flat-button","","type","button",1,"adv-btn",3,"click"],[1,"upload-txt"],[1,"upload-btn","btn-div"],["type","file","accept",".json","hidden","",3,"change"],["mat-flat-button","",1,"adv-btn",3,"click"],[1,"demo-txt"],[1,"demo-btn","btn-div"],[1,"reset-txt"],[1,"reset-btn","btn-div"],[1,"config-txt"],[1,"config-btn","btn-div"],[2,"width","25%"],["name","serverConfiScope","required","",3,"ngModelChange","ngModel"],["value","global"],["value","user"],[2,"width","70%","padding-left","3%"],["matInput","","name","serverConfigName","placeholder","Enter a name for the configuration","required","",3,"ngModelChange","ngModel","ngModelOptions"],[2,"width","100%"],["name","selectedDeleteItem","required","",3,"ngModelChange","ngModel"],[3,"value"],["formControlName","sourceTarget"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"div",3)(1,"p"),TT(2," Recommended Reading: To understand configuration management and storage options, consult the "),Pi(3,"a",4),TT(4,"Login and Configuration"),ul(),TT(5," help section. "),ul(),Pi(6,"div",5)(7,"div",6)(8,"form",7,0),Qh("ngSubmit",function(){return i.saveConfig(i.getActiveConfig(),i.saveConfigScope??"",i.saveConfigName??"No Name")}),Pi(10,"h3"),TT(11,"Backup"),ul(),Pi(12,"p",8),TT(13," Create a backup of the current active configuration on the server. "),ul(),_w(14,ta,14,5,"div")(15,ia,3,0,"div",9),Pi(16,"div",10),$h(17,"mat-divider",11),Pi(18,"button",12),TT(19," Create "),ul()()()(),Pi(20,"div",6)(21,"form",13,1),Qh("ngSubmit",function(){return i.deleteConfigByKey(i.deleteConfigKey??"")}),Pi(23,"h3"),TT(24,"Delete"),ul(),Pi(25,"p",8),TT(26," Select a backup configuration to permanently delete from the server. "),ul(),_w(27,aa,7,1,"div")(28,oa,3,0,"div",9),Pi(29,"div",10),$h(30,"mat-divider",11),Pi(31,"button",12),TT(32," Delete "),ul()()()(),Pi(33,"div",6)(34,"form",14),Qh("ngSubmit",function(){return i.copyConfig()}),Pi(35,"h3"),TT(36,"Restore"),ul(),Pi(37,"p",8),TT(38," Replace the current configuration with a backup from the server. "),ul(),_w(39,ra,7,0,"div")(40,la,3,0,"div",9),Pi(41,"div",10),$h(42,"mat-divider",11),Pi(43,"button",12),TT(44," Restore "),ul()()()(),Pi(45,"div",15)(46,"h3"),TT(47,"Advanced"),ul(),Pi(48,"div",16)(49,"div",17),TT(50," To reuse your configuration on different devices, simply login using the same credential from any device (See "),Pi(51,"a",4),TT(52,"Login and Configuration"),ul(),TT(53," for more information). If you need to move your configuration between different Signal K servers, you can use Download to obtain a copy of the active configuration to a file. "),ul(),Pi(54,"div",18)(55,"button",19),Qh("click",function(){return i.downloadJsonConfig()}),TT(56," Download "),ul()(),Pi(57,"div",20),TT(58," Select a configuration file to upload. The file must be a valid KIP configuration file of JSON format. "),$h(59,"br"),Pi(60,"strong"),TT(61,"WARNING: This will permanently overwrite active configuration."),ul()(),Pi(62,"div",21)(63,"input",22,2),Qh("change",function(r){return i.uploadJsonConfig(r)}),ul(),Pi(65,"button",23),Qh("click",function(){ud(s);let r=Jw(64);return dd(r.click())}),TT(66," Upload "),ul()(),Pi(67,"div",24),TT(68," Load the demonstration configuration and connection to Signal K demo server. "),$h(69,"br"),Pi(70,"strong"),TT(71,"WARNING: This will permanently reset your active configuration."),ul()(),Pi(72,"div",25)(73,"button",19),Qh("click",function(){return i.loadDemoConfig()}),TT(74," Demo "),ul()(),Pi(75,"div",26),TT(76," Reset all your settings to default. The default configuration has a single Getting Started instruction widget. Your Signal K server connection settings will remain. "),$h(77,"br"),Pi(78,"strong"),TT(79,"WARNING: This will permanently reset your active configuration."),ul()(),Pi(80,"div",27)(81,"button",19),Qh("click",function(){return i.resetConfigToDefault()}),TT(82," Default "),ul()(),Pi(83,"div",28),TT(84," Clear the current connection configuration. This only affects Connectivity settings tab. "),ul(),Pi(85,"div",29)(86,"button",19),Qh("click",function(){return i.resetConnectionToDefault()}),TT(87," Connection "),ul()()()()()();}if(t&2){let s=Jw(9),d=Jw(22);EE(14),Mw(i.hasToken?14:15),EE(4),Bh("disabled",!i.hasToken||!s.valid),EE(9),Mw(i.hasToken?27:28),EE(4),Bh("disabled",!i.hasToken||!d.valid),EE(3),Bh("formGroup",i.copyConfigForm),EE(5),Mw(i.hasToken?39:40),EE(4),Bh("disabled",!i.copyConfigForm.valid);}},dependencies:[si,Ln$1,Gn$1,Xe,Pn$1,kn$1,ft$1,rn,Qt,u,xp,rt,ae,Ft,F$1,an$1,Wn,gn$1,hn$1,ln],styles:['[_nghost-%COMP%]{display:block;height:100%;width:100%}.page-content[_ngcontent-%COMP%]{width:100%;overflow-y:auto;scroll-behavior:smooth;padding:0 0 10px}.flex-item-copy[_ngcontent-%COMP%]{flex:2 1 41%;padding:10px 20px;border-radius:15px}.flex-item-reset[_ngcontent-%COMP%]{flex:1 1 100%;padding:10px 20px;border-radius:15px}h3[_ngcontent-%COMP%]{margin-top:5px}a[_ngcontent-%COMP%]{font-size:14px}a[_ngcontent-%COMP%]:hover{text-decoration:underline;cursor:pointer}a[_ngcontent-%COMP%]:link, a[_ngcontent-%COMP%]:visited{color:#8ab4f8;text-decoration:none}.warningText[_ngcontent-%COMP%]{padding-left:15px}.no-token-notice[_ngcontent-%COMP%]{height:58px;contain:content;text-align:center;font-style:italic}.mat-mdc-radio-button[_ngcontent-%COMP%] ~ .mat-radio-button[_ngcontent-%COMP%]{margin-right:16px;margin-left:16px}.config-column[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex-basis:100%;flex:1;margin:0 10px}.sources-radio-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin:15px 0}.sources-radio-button[_ngcontent-%COMP%]{margin:5px;margin-left:0!important}.select-config[_ngcontent-%COMP%]{margin-left:0}.config-row[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.btn-div[_ngcontent-%COMP%]{align-self:center}.adv-btn[_ngcontent-%COMP%]{width:100%}.config-operation-container[_ngcontent-%COMP%]{display:grid;grid-template-columns:[col-start] auto [col1-end] min-content [col2-end];grid-template-rows:[row-start] max-content [row1-end] max-content [row2-end];grid-template-areas:"download-txt download-btn" "upload-txt upload-btn" "demo-txt demo-btn" "reset-txt reset-btn" "config-txt config-btn";row-gap:20px;column-gap:10px}.upload-txt[_ngcontent-%COMP%]{grid-area:upload-txt}.upload-btn[_ngcontent-%COMP%]{grid-area:upload-btn}.download-txt[_ngcontent-%COMP%]{grid-area:download-txt}.download-btn[_ngcontent-%COMP%]{grid-area:download-btn}.demo-txt[_ngcontent-%COMP%]{grid-area:demo-txt}.demo-btn[_ngcontent-%COMP%]{grid-area:demo-btn}.reset-txt[_ngcontent-%COMP%]{grid-area:reset-txt}.reset-btn[_ngcontent-%COMP%]{grid-area:reset-btn}.config-txt[_ngcontent-%COMP%]{grid-area:config-txt}.config-btn[_ngcontent-%COMP%]{grid-area:config-btn}']})}return n})();var Cr=(()=>{class n{pageTitle="Settings";constructor(){}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["tabs"]],decls:12,vars:1,consts:[["svgIconId","settings",3,"pageTitle"],[1,"content-area"],["label","Connectivity"],[1,"tab-content"],["label","Display"],["label","Notifications & Audio"],["label","Units"],["label","Configurations"]],template:function(t,i){t&1&&($h(0,"page-header",0),Pi(1,"mat-tab-group",1)(2,"mat-tab",2),$h(3,"settings-signalk",3),ul(),Pi(4,"mat-tab",4),$h(5,"settings-display",3),ul(),Pi(6,"mat-tab",5),$h(7,"settings-notifications",3),ul(),Pi(8,"mat-tab",6),$h(9,"settings-units",3),ul(),Pi(10,"mat-tab",7),$h(11,"settings-config",3),ul()()),t&2&&Bh("pageTitle",i.pageTitle);},dependencies:[Sn$1,Nt,Xi,Ki,Oi,Ji,$i,O],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%}.content-area[_ngcontent-%COMP%]{height:calc(100% - 63px);overflow:hidden;width:100%;padding:0 24px}.tab-content[_ngcontent-%COMP%]{overflow-y:auto;width:100%;scroll-behavior:smooth;display:block}"]})}return n})();
1014
+ `],encapsulation:2})}return n})();var Bn={provide:L,useExisting:Po(()=>At),multi:true};var At=(()=>{class n{_ngZone=w(ue);_elementRef=w(Lr);_cdr=w(Gj);_slider=w(Dt);_platform=w(G);_listenerCleanups;get value(){return Yj(this._hostElement.value,0)}set value(e){e===null&&(e=this._getDefaultValue()),e=isNaN(e)?0:e;let t=e+"";if(!this._hasSetInitialValue){this._initialValue=t;return}this._isActive||this._setValue(t);}_setValue(e){this._hostElement.value=e,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck();}valueChange=new Qe;dragStart=new Qe;dragEnd=new Qe;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(e){this._translateX=e;}_translateX;thumbPosition=g.END;get min(){return Yj(this._hostElement.min,0)}set min(e){this._hostElement.min=e+"",this._cdr.detectChanges();}get max(){return Yj(this._hostElement.max,0)}set max(e){this._hostElement.max=e+"",this._cdr.detectChanges();}get step(){return Yj(this._hostElement.step,0)}set step(e){this._hostElement.step=e+"",this._cdr.detectChanges();}get disabled(){return Zj(this._hostElement.disabled)}set disabled(e){this._hostElement.disabled=e,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled);}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl()?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl()?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=vt$1("");_knobRadius=8;_tickMarkOffset=3;_isActive=false;_isFocused=false;_setIsFocused(e){this._isFocused=e;}_hasSetInitialValue=false;_initialValue;_formControl;_destroyed=new te;_skipUIUpdate=false;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=false;constructor(){let e=w(tD);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[e.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),e.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),e.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))];});}ngOnDestroy(){this._listenerCleanups.forEach(e=>e()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete();}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=true),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue();}initUI(){this._updateThumbUIByValue();}_initValue(){this._hasSetInitialValue=true,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges());}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(false),this._onTouchedFn();}_onFocus(){this._slider._setTransition(false),this._slider._updateTrackUI(this),this._setIsFocused(true);}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:true});}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:true}),this._slider._onValueChange(this);}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled;}_onPointerDown(e){if(!(this.disabled||e.button!==0)){if(this._platform.IOS){let t=this._slider._isCursorOnSliderThumb(e,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=t,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=true,this._setIsFocused(true),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(e,{withAnimation:true}),this.disabled||(this._handleValueCorrection(e),this.dragStart.emit({source:this,parent:this._slider,value:this.value}));}}_handleValueCorrection(e){this._skipUIUpdate=true,setTimeout(()=>{this._skipUIUpdate=false,this._fixValue(e);},0);}_fixValue(e){let t=e.clientX-this._slider._cachedLeft,i=this._slider._cachedWidth,s=this._slider.step===0?1:this._slider.step,d=Math.floor((this._slider.max-this._slider.min)/s),r=this._slider._isRtl()?1-t/i:t/i,$=Math.round(r*d)/d*(this._slider.max-this._slider.min)+this._slider.min,ae=Math.round($/s)*s,Ke=this.value;if(ae===Ke){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(e,{withAnimation:this._slider._hasAnimation});return}this.value=ae,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(e,{withAnimation:this._slider._hasAnimation});}_onPointerMove(e){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(e);}_onPointerUp(){this._isActive&&(this._isActive=false,this._platform.SAFARI&&this._setIsFocused(false),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0));}_clamp(e){let t=this._tickMarkOffset,i=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(e,i),t)}_calcTranslateXByValue(){return this._slider._isRtl()?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(e){return e.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`;}_updateThumbUIByValue(e){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(e);}_updateThumbUIByPointerEvent(e,t){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(e)),this._updateThumbUI(t);}_updateThumbUI(e){this._slider._setTransition(!!e?.withAnimation),this._slider._onTranslateXChange(this);}writeValue(e){(this._isControlInitialized||e!==null)&&(this.value=e);}registerOnChange(e){this._onChangeFn=e,this._isControlInitialized=true;}registerOnTouched(e){this._onTouchedFn=e;}setDisabledState(e){this.disabled=e;}focus(){this._hostElement.focus();}blur(){this._hostElement.blur();}static \u0275fac=function(t){return new(t||n)};static \u0275dir=nw({type:n,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(t,i){t&1&&Qh("change",function(){return i._onChange()})("input",function(){return i._onInput()})("blur",function(){return i._onBlur()})("focus",function(){return i._onFocus()}),t&2&&Hh("aria-valuetext",i._valuetext());},inputs:{value:[2,"value","value",Yj]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[LT([Bn,{provide:ji,useExisting:n}])]})}return n})();var Zi=(()=>{class n{static \u0275fac=function(t){return new(t||n)};static \u0275mod=bh({type:n});static \u0275inj=Qs({imports:[ca,Fn$1]})}return n})();var Hn=["displayForm"];function zn(n,u){if(n&1&&(Pi(0,"mat-panel-description",8),TT(1," Adjust night mode settings to enhance visibility in low-light environments. "),ul()),n&2){let e=qw();Bh("hidden",e.isPhonePortrait().matches);}}function Kn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Choose your preferred high-contrast theme. "),ul());}function qn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Configure persistent dual\u2011panel chart & dashboards layout. "),ul());}function Xn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Configure remote dashboard operations between KIP instances. "),ul());}function jn(n,u){n&1&&(Pi(0,"mat-error"),TT(1,"This field is required."),ul());}function Gn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Set historical charting and data logging for widgets. This enables retrospective views and access to historical data. "),ul());}function Qn(n,u){n&1&&(Pi(0,"div",28)(1,"p")(2,"strong"),TT(3,"KIP history capture requires Node.js version 22.5.0 or newer (with node:sqlite support)."),ul(),$h(4,"br"),TT(5," Before upgrading Node.js, always verify compatibility with your Signal K server version. "),ul(),Pi(6,"p"),TT(7," For details and the latest requirements, see the "),Pi(8,"a",33),TT(9,"Signal K installation documentation"),ul(),TT(10,". "),ul()());}function Zn(n,u){if(n&1){let e=Fw();_w(0,Qn,11,0,"div",28),Pi(1,"span"),TT(2,"Select history provider and data logging mode:"),ul(),Pi(3,"mat-radio-group",29),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.providerMode,i)||(s.providerMode=i),dd(i)}),Pi(4,"mat-radio-button",30),TT(5," KIP: Automatic history series and data logging "),ul(),Pi(6,"mat-radio-button",31),TT(7," Other: Use a different History API provider and configure data logging manually "),ul()(),cD(),Pi(8,"mat-slide-toggle",32),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.widgetHistoryDisabled,i)||(s.widgetHistoryDisabled=i),dd(i)}),TT(9," Disable widget historical charts (two-finger tap or right-click to view history feature). "),ul(),cD();}if(n&2){let e=qw();Mw(e.isKipHistoryProviderSelectable()?-1:0),EE(3),Ig("ngModel",e.providerMode),Bh("value",e.providerMode()),lD(),EE(),Bh("disabled",!e.isKipHistoryProviderSelectable()),EE(4),Ig("ngModel",e.widgetHistoryDisabled),lD();}}function Jn(n,u){n&1&&(Pi(0,"p"),TT(1,"Historical data features requires both Signal K server version 2.22.1 or later."),ul());}function Yn(n,u){n&1&&(Pi(0,"mat-panel-description"),TT(1," Specialized options for development, troubleshooting, and test scenarios. Most users should leave these settings off. "),ul());}var Ji=(()=>{class n{DERIVED_DATA_PLUGIN_ID="derived-data";KIP_DATA_PLUGIN_ID="kip";LIGHT_THEME_NAME="light-theme";displayForm=$j("displayForm");app=w(N);toast=w(lt);settings=w(Gi$1);responsive=w(ir);pluginConfig=w(w$2);server=w(T);isPhonePortrait;nightBrightness=vt$1(.27);isHistoryApiSupported=Dt$1(()=>{let e=this.server.serverVersion$.getValue();return e?U(e,"2.22.1",">="):false});autoNightMode=Bj(false);isRedNightMode=Bj(false);isLightTheme=Bj(false);isRemoteControl=Bj(false);instanceName=Bj("");splitShellEnabled=Bj(false);splitShellSide=Bj("left");splitShellSwipeDisabled=Bj(false);providerMode=Bj("other");widgetHistoryDisabled=Bj(false);isKipHistoryProviderSelectable=vt$1(false);isPathValidationDisabled=Bj(this.settings.getDisablePathValidation());_pluginCheckSeq=0;constructor(){this.isPhonePortrait=Wp(this.responsive.observe(Em.HandsetPortrait),{initialValue:{matches:false,breakpoints:{}}});}ngOnInit(){this.nightBrightness.set(this.settings.getNightModeBrightness()),this.autoNightMode.set(this.settings.getAutoNightMode()),this.isLightTheme.set(this.settings.getThemeName()===this.LIGHT_THEME_NAME),this.isRedNightMode.set(this.settings.getRedNightMode()),this.isRemoteControl.set(this.settings.getIsRemoteControl()),this.instanceName.set(this.settings.getInstanceName()),this.splitShellEnabled.set(this.settings.getSplitShellEnabled()),this.splitShellSide.set(this.settings.getSplitShellSide()),this.splitShellSwipeDisabled.set(this.settings.getSplitShellSwipeDisabled()),this.widgetHistoryDisabled.set(this.settings.getWidgetHistoryDisabled()),this.getKipPluginConfig();}saveAllSettings(){let e=this.displayForm();if(!e||e.invalid){e?.form.markAllAsTouched(),this.toast.show("Please fill out required fields before saving.",3e3,true);return}if(this.autoNightMode()){let t=++this._pluginCheckSeq;this.validateAndSaveSettings(t);return}this.applyAndSaveSettings();}applyAndSaveSettings(){return Zr(this,null,function*(){this.settings.setAutoNightMode(this.autoNightMode()),this.settings.setRedNightMode(this.isRedNightMode()),this.settings.setNightModeBrightness(this.nightBrightness()),this.settings.setIsRemoteControl(this.isRemoteControl()),this.isRemoteControl()?this.settings.setInstanceName(this.instanceName()):this.settings.setInstanceName(""),this.app.isNightMode()||this.app.setBrightness(1),this.isLightTheme()?this.settings.setThemeName(this.LIGHT_THEME_NAME):this.settings.setThemeName(""),this.settings.setSplitShellEnabled(this.splitShellEnabled()),this.settings.setSplitShellSide(this.splitShellSide()),this.settings.setSplitShellSwipeDisabled(this.splitShellSwipeDisabled()),this.settings.setWidgetHistoryDisabled(this.widgetHistoryDisabled()),this.settings.setDisablePathValidation(this.isPathValidationDisabled());let e=yield this.setKipPluginConfig();if(this.displayForm()?.form.markAsPristine(),!e){this.toast.show("Failed to save KIP plugin configuration on server.",0,false,"error");return}this.toast.show("Configuration saved",1e3,true,"message");})}validateAndSaveSettings(e){return Zr(this,null,function*(){let t=yield this.validateAndHandleAutoNightRequirement(e);e===this._pluginCheckSeq&&(t?yield this.applyAndSaveSettings():this.autoNightMode.set(false));})}getKipPluginConfig(){return Zr(this,null,function*(){let e=yield this.pluginConfig.getPlugin(this.KIP_DATA_PLUGIN_ID);if(!e.ok){this.toast.show(`Failed to load KIP plugin configuration: ${e.error.message}`,0,false,"error");return}let t=e.data.state.configuration,i=t.historySeriesServiceEnabled===true;this.isKipHistoryProviderSelectable.set(t.nodeSqliteAvailable??false),this.providerMode.set(i&&this.isKipHistoryProviderSelectable()?"kip":"other");})}setKipPluginConfig(){return Zr(this,null,function*(){let e=this.isKipHistoryProviderSelectable(),t=this.providerMode()==="kip"&&e,i={configuration:{historySeriesServiceEnabled:t,registerAsHistoryApiProvider:t}};return (yield this.pluginConfig.savePluginConfig(this.KIP_DATA_PLUGIN_ID,i)).ok})}isAutoNightModeSupported(e){this.displayForm()?.form.markAsDirty(),this.autoNightMode.set(e.checked);}validateAndHandleAutoNightRequirement(e){return Zr(this,null,function*(){let t=yield this.pluginConfig.getPlugin(this.DERIVED_DATA_PLUGIN_ID);if(e!==this._pluginCheckSeq)return false;if(!t.ok){let ae=t;return ae.error.reason==="not-found"?(this.toast.show("Automatic Night Mode requires the Signal K Derived Data plugin. This requirement is missing and must be installed manually by the user.",0,false,"error"),false):(this.toast.show(`Failed to validate Automatic Night Mode requirements: ${ae.error.message}`,0,false,"error"),false)}let i=t.data,s=this.resolveEnvironmentSunFlagPath(i.state.configuration),d=this.readBooleanByPath(i.state.configuration,s)===true;if(i.state.enabled&&d)return true;let r=!i.state.enabled,R=!d,$;return r&&R?$="To enable Automatic Night Mode, the Derived Data plugin must be enabled and the environment.sun path must be set to true. Do you wish to enable & and activate the path?":r?$="To enable Automatic Night Mode, the Derived Data plugin must be enabled. Do you wish to enable the plugin?":$="To enable Automatic Night Mode, the environment.sun path in the Derived Data plugin must be activated. Do you wish to activate the path?",new Promise(ae=>{let Ke=this.toast.show($,0,false,"warn","Ok");Ke.onAction().subscribe(()=>{this.enableAndConfigureAutoNight(i,s,e,ae);}),Ke.afterDismissed().subscribe(en=>{en.dismissedByAction||ae(false);});})})}enableAndConfigureAutoNight(e,t,i,s){return Zr(this,null,function*(){let d=this.cloneConfig(e.state.configuration);this.writeBooleanByPath(d,t,true);let r=yield this.pluginConfig.savePluginConfig(e.id,{configuration:d,enabled:true});if(i!==this._pluginCheckSeq){s(false);return}if(!r.ok){let R=r;this.toast.show(`Failed to enable and configure Derived Data plugin: ${R.error.message}`,0,false,"error"),s(false);return}this.toast.show("Automatic Night Mode dependency enabled and configured.",3e3,true,"success"),s(true);})}resolveEnvironmentSunFlagPath(e){return this.findBooleanSunPath(e)??["sun"]}findBooleanSunPath(e,t=[]){let i=Object.entries(e).find(([s,d])=>s.toLowerCase()==="sun"&&typeof d=="boolean");if(i)return [...t,i[0]];for(let[s,d]of Object.entries(e)){if(typeof d=="boolean"&&s.toLowerCase().includes("sun"))return [...t,s];if(d&&typeof d=="object"&&!Array.isArray(d)){let r=this.findBooleanSunPath(d,[...t,s]);if(r)return r}}return null}readBooleanByPath(e,t){let i=e;for(let s of t){if(!i||typeof i!="object"||Array.isArray(i))return null;i=i[s];}return typeof i=="boolean"?i:null}writeBooleanByPath(e,t,i){if(t.length===0)return;let s=e;for(let d=0;d<t.length-1;d++){let r=t[d],R=s[r];(!R||typeof R!="object"||Array.isArray(R))&&(s[r]={}),s=s[r];}s[t[t.length-1]]=i;}cloneConfig(e){return JSON.parse(JSON.stringify(e||{}))}setBrightness(e){this.displayForm()?.form.markAsDirty(),this.nightBrightness.set(e),this.app.setBrightness(e,this.app.isNightMode());}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-display"]],viewQuery:function(t,i){t&1&&eg(i.displayForm,Hn,5),t&2&&Kw();},inputs:{autoNightMode:[1,"autoNightMode"],isRedNightMode:[1,"isRedNightMode"],isLightTheme:[1,"isLightTheme"],isRemoteControl:[1,"isRemoteControl"],instanceName:[1,"instanceName"],splitShellEnabled:[1,"splitShellEnabled"],splitShellSide:[1,"splitShellSide"],splitShellSwipeDisabled:[1,"splitShellSwipeDisabled"],providerMode:[1,"providerMode"],widgetHistoryDisabled:[1,"widgetHistoryDisabled"],isPathValidationDisabled:[1,"isPathValidationDisabled"]},outputs:{autoNightMode:"autoNightModeChange",isRedNightMode:"isRedNightModeChange",isLightTheme:"isLightThemeChange",isRemoteControl:"isRemoteControlChange",instanceName:"instanceNameChange",splitShellEnabled:"splitShellEnabledChange",splitShellSide:"splitShellSideChange",splitShellSwipeDisabled:"splitShellSwipeDisabledChange",providerMode:"providerModeChange",widgetHistoryDisabled:"widgetHistoryDisabledChange",isPathValidationDisabled:"isPathValidationDisabledChange"},decls:85,vars:27,consts:[["displayForm","ngForm"],["redNightModeToggle",""],["inputBrightness",""],["isFskShellEnabled",""],["isFskShellSwipeEnabled",""],["isRemoteControlCb",""],["instanceNameModel","ngModel"],["id","displaySetting",3,"ngSubmit"],[3,"hidden"],["name","autoNightMode",1,"full-width","sliders",3,"change","ngModelChange","ngModel"],["name","redNightMode",1,"full-width","sliders",3,"ngModelChange","ngModel"],[2,"padding-left","10px"],["min","0","max","1","step","0.01","discrete","",3,"disabled"],["matSliderThumb","",3,"input","value","disabled"],["name","isLightTheme",1,"full-width",3,"ngModelChange","ngModel"],["name","freeboardShellEnabled",1,"full-width",3,"ngModelChange","ngModel"],[1,"optional-field"],["name","splitShellSide",3,"ngModelChange","ngModel","disabled"],["value","left"],["value","right"],["name","freeboardShellSwipeEnabled",1,"optional-field","full-width",3,"ngModelChange","ngModel","disabled"],["name","isRemoteControl",1,"full-width",3,"ngModelChange","ngModel"],["matInput","","name","instanceName","placeholder","Ex. Mast",3,"ngModelChange","ngModel","disabled","required"],["name","isPathValidationDisabled","aria-describedby","path-validation-helper",1,"full-width",3,"ngModelChange","ngModel"],["id","path-validation-helper","role","note",1,"dev-option-helper","mat-body-small"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit",1,"formActionButton",3,"disabled"],[1,"warning"],["name","providerMode","required","",1,"radio-group",3,"ngModelChange","ngModel","value"],["value","kip",1,"radio-button",3,"disabled"],["value","other",1,"radio-button"],["name","widgetHistoryDisabled",1,"full-width",3,"ngModelChange","ngModel"],["href","https://demo.signalk.org/documentation/Installation.html","target","_blank"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"form",7,0),Qh("ngSubmit",function(){return i.saveAllSettings()}),Pi(2,"p"),TT(3,"Customize your display settings to enable various integrations, improve visibility and adapt to various lighting conditions."),ul(),Pi(4,"mat-accordion")(5,"mat-expansion-panel")(6,"mat-expansion-panel-header")(7,"mat-panel-title"),TT(8," Night Mode "),ul(),_w(9,zn,2,1,"mat-panel-description",8),ul(),Pi(10,"mat-slide-toggle",9),Qh("change",function(r){return i.isAutoNightModeSupported(r)}),Eg("ngModelChange",function(r){return ud(s),ST(i.autoNightMode,r)||(i.autoNightMode=r),dd(r)}),TT(11," Automatically activate day and night modes based on sun phases. "),ul(),cD(),Pi(12,"mat-slide-toggle",10,1),Eg("ngModelChange",function(r){return ud(s),ST(i.isRedNightMode,r)||(i.isRedNightMode=r),dd(r)}),TT(14," Enable red-only night mode. "),ul(),cD(),Pi(15,"div",11),$h(16,"br"),Pi(17,"span"),TT(18,"Adjust Night Mode Brightness"),ul(),$h(19,"br"),Pi(20,"mat-slider",12)(21,"input",13,2),Qh("input",function(){ud(s);let r=Jw(22);return dd(i.setBrightness(+r.value))}),ul()()()(),Pi(23,"mat-expansion-panel")(24,"mat-expansion-panel-header")(25,"mat-panel-title"),TT(26," Theme "),ul(),_w(27,Kn,2,0,"mat-panel-description"),ul(),Pi(28,"mat-slide-toggle",14),Eg("ngModelChange",function(r){return ud(s),ST(i.isLightTheme,r)||(i.isLightTheme=r),dd(r)}),TT(29," Enable light theme for brighter display settings. "),ul(),cD(),ul(),Pi(30,"mat-expansion-panel")(31,"mat-expansion-panel-header")(32,"mat-panel-title"),TT(33," Chartplotter Mode "),ul(),_w(34,qn,2,0,"mat-panel-description"),ul(),Pi(35,"mat-slide-toggle",15,3),Eg("ngModelChange",function(r){return ud(s),ST(i.splitShellEnabled,r)||(i.splitShellEnabled=r),dd(r)}),TT(37," Enable Freeboard\u2011SK dual\u2011panel Chartplotter mode. "),ul(),cD(),Pi(38,"mat-form-field",16)(39,"mat-label"),TT(40,"Freeboard-SK panel side"),ul(),Pi(41,"mat-select",17),Eg("ngModelChange",function(r){return ud(s),ST(i.splitShellSide,r)||(i.splitShellSide=r),dd(r)}),Pi(42,"mat-option",18),TT(43,"Left side"),ul(),Pi(44,"mat-option",19),TT(45,"Right side"),ul()(),cD(),ul(),Pi(46,"mat-slide-toggle",20,4),Eg("ngModelChange",function(r){return ud(s),ST(i.splitShellSwipeDisabled,r)||(i.splitShellSwipeDisabled=r),dd(r)}),TT(48," Disable swipe gestures over chart panel. "),ul(),cD(),ul(),Pi(49,"mat-expansion-panel")(50,"mat-expansion-panel-header")(51,"mat-panel-title"),TT(52," Remote Control "),ul(),_w(53,Xn,2,0,"mat-panel-description"),ul(),Pi(54,"mat-slide-toggle",21,5),Eg("ngModelChange",function(r){return ud(s),ST(i.isRemoteControl,r)||(i.isRemoteControl=r),dd(r)}),TT(56," Allow remote KIP instances to view and control this dashboard. "),ul(),cD(),Pi(57,"mat-form-field",16)(58,"mat-label"),TT(59,"Name of this instance"),ul(),Pi(60,"input",22,6),Qh("ngModelChange",function(){ud(s);let r=Jw(1);return dd(r.form.markAsDirty())}),Eg("ngModelChange",function(r){return ud(s),ST(i.instanceName,r)||(i.instanceName=r),dd(r)}),ul(),cD(),_w(62,jn,2,0,"mat-error"),ul()(),Pi(63,"mat-expansion-panel")(64,"mat-expansion-panel-header")(65,"mat-panel-title"),TT(66," Widget Historical Data "),ul(),_w(67,Gn,2,0,"mat-panel-description"),ul(),_w(68,Zn,10,5)(69,Jn,2,0,"p"),ul()(),$h(70,"br"),Pi(71,"mat-accordion")(72,"mat-expansion-panel")(73,"mat-expansion-panel-header")(74,"mat-panel-title"),TT(75," Advanced and Testing "),ul(),_w(76,Yn,2,0,"mat-panel-description"),ul(),Pi(77,"mat-slide-toggle",23),Eg("ngModelChange",function(r){return ud(s),ST(i.isPathValidationDisabled,r)||(i.isPathValidationDisabled=r),dd(r)}),TT(78," Allow saving widgets with invalid paths (testing only) "),ul(),cD(),Pi(79,"p",24),TT(80," Use only for development and troubleshooting. This temporary setting is reset when the app restarts. "),ul()()(),Pi(81,"div",25),$h(82,"mat-divider",26),Pi(83,"button",27),TT(84,"Save"),ul()()();}if(t&2){let s=Jw(1),d=Jw(13),r=Jw(36),R=Jw(55),$=Jw(61);EE(9),Mw(i.isPhonePortrait().matches?-1:9),EE(),Ig("ngModel",i.autoNightMode),lD(),EE(2),Ig("ngModel",i.isRedNightMode),lD(),EE(5),pT(d.checked?"mat-body-medium disable-color":"mat-body-medium"),EE(3),Bh("disabled",d.checked),EE(),Bh("value",i.nightBrightness())("disabled",d.checked),EE(6),Mw(i.isPhonePortrait().matches?-1:27),EE(),Ig("ngModel",i.isLightTheme),lD(),EE(6),Mw(i.isPhonePortrait().matches?-1:34),EE(),Ig("ngModel",i.splitShellEnabled),lD(),EE(6),Ig("ngModel",i.splitShellSide),Bh("disabled",!r.checked),lD(),EE(5),Ig("ngModel",i.splitShellSwipeDisabled),Bh("disabled",!r.checked),lD(),EE(7),Mw(i.isPhonePortrait().matches?-1:53),EE(),Ig("ngModel",i.isRemoteControl),lD(),EE(6),Ig("ngModel",i.instanceName),Bh("disabled",!R.checked)("required",R.checked),lD(),EE(2),Mw(R.checked&&$.invalid&&($.touched||s.submitted)?62:-1),EE(5),Mw(i.isPhonePortrait().matches?-1:67),EE(),Mw(i.isHistoryApiSupported()?68:69),EE(8),Mw(i.isPhonePortrait().matches?-1:76),EE(),Ig("ngModel",i.isPathValidationDisabled),lD(),EE(6),Bh("disabled",!s.form.dirty||s.form.invalid);}},dependencies:[Ln$1,Gn$1,Xe,Pn$1,kn$1,ft$1,rn,Qt,f,u,Op,xp,Zi,Qi,At,bt,ft,He,ze,_t,ut,ln,an$1,rt,ae,It$1,yt,Ce,Lt,Ft,F,va,an$2,ft$2],styles:[".optional-field[_ngcontent-%COMP%]{margin-left:55px;margin-top:10px}.sliders[_ngcontent-%COMP%]{margin:5px 0}.disable-color[_ngcontent-%COMP%]{color:var(--mat-sys-outline)}.radio-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin:5px 0 15px;align-items:flex-start}.radio-button[_ngcontent-%COMP%]{margin:5px}.warning[_ngcontent-%COMP%]{background-color:var(--mat-sys-on-error-container);color:var(--mat-sys-error-container);padding:1px 14px;border-radius:var(--mat-sys-corner-small)}.warning[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{font:var(--mat-sys-body-medium);letter-spacing:var(--mat-sys-body-medium-tracking)}.dev-option-helper[_ngcontent-%COMP%]{margin:4px 0 0 55px;font:var(--mat-sys-body-small);letter-spacing:var(--mat-sys-body-small-tracking);color:var(--mat-sys-on-surface-variant)}"]})}return n})();var $n=()=>({standalone:false}),Yi=(n,u)=>u.key;function ea(n,u){n&1&&(Pi(0,"div"),TT(1,' Writing to the server requires "Login to Server" authentication or a Device token '),ul());}function ta(n,u){if(n&1){let e=Fw();Pi(0,"div")(1,"mat-form-field",30)(2,"mat-label"),TT(3,"Scope"),ul(),Pi(4,"mat-select",31),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.saveConfigScope,i)||(s.saveConfigScope=i),dd(i)}),Pi(5,"mat-option",32),TT(6," Global "),ul(),Pi(7,"mat-option",33),TT(8," User "),ul()(),cD(),ul(),Pi(9,"mat-form-field",34)(10,"mat-label"),TT(11,"Configuration Name"),ul(),Pi(12,"input",35),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.saveConfigName,i)||(s.saveConfigName=i),dd(i)}),ul(),cD(),ul(),_w(13,ea,2,0,"div"),ul();}if(n&2){let e=qw();EE(4),Ig("ngModel",e.saveConfigScope),lD(),EE(8),Ig("ngModel",e.saveConfigName),Bh("ngModelOptions",FT(4,$n)),lD(),EE(),Mw(e.hasToken?-1:13);}}function ia(n,u){n&1&&(Pi(0,"div",9)(1,"p"),TT(2,"Server authentication or Device Token required"),ul()());}function na(n,u){if(n&1&&(Pi(0,"mat-option",38),TT(1),ul()),n&2){let e=u.$implicit;Bh("value",e.key),EE(),mg(" ",e.scope," / ",e.name," ");}}function aa(n,u){if(n&1){let e=Fw();Pi(0,"div")(1,"mat-form-field",36)(2,"mat-label"),TT(3,"Configuration"),ul(),Pi(4,"mat-select",37),Eg("ngModelChange",function(i){ud(e);let s=qw();return ST(s.deleteConfigKey,i)||(s.deleteConfigKey=i),dd(i)}),xw(5,na,2,3,"mat-option",38,Yi),ul(),cD(),ul()();}if(n&2){let e=qw();EE(4),Ig("ngModel",e.deleteConfigKey),lD(),EE(),Aw(e.serverConfigOptions());}}function oa(n,u){n&1&&(Pi(0,"div",9)(1,"p"),TT(2,"Authentication or Device Token required"),ul()());}function sa(n,u){if(n&1&&(Pi(0,"mat-option",38),TT(1),ul()),n&2){let e=u.$implicit;Bh("value",e.key),EE(),mg(" ",e.scope," / ",e.name," ");}}function ra(n,u){if(n&1&&(Pi(0,"div")(1,"mat-form-field",36)(2,"mat-label"),TT(3,"Configuration"),ul(),Pi(4,"mat-select",39),xw(5,sa,2,3,"mat-option",38,Yi),ul(),cD(),ul()()),n&2){let e=qw();EE(4),lD(),EE(),Aw(e.serverConfigOptions());}}function la(n,u){n&1&&(Pi(0,"div",9)(1,"p"),TT(2,"Authentication or Device Token required"),ul()());}var $i=(()=>{class n{settings=w(Gi$1);storageSvc=w(Ge);toast=w(lt);auth=w(He$1);fb=w(Hn$1);authToken=Wp(this.auth.authToken$,{initialValue:null});serverConfigListSignal=vt$1([]);hasTokenSignal=Dt$1(()=>!!this.authToken()?.token);isTokenTypeDeviceSignal=Dt$1(()=>!!this.authToken()?.isDeviceAccessToken);pageTitle="Configurations";get hasToken(){return this.hasTokenSignal()}get isTokenTypeDevice(){return this.isTokenTypeDeviceSignal()}supportApplicationData=this.storageSvc.isAppDataSupported;serverConfigOptions=Dt$1(()=>this.serverConfigListSignal().map(e=>({scope:e.scope,name:e.name,key:`${e.scope}::${e.name}`})));serverUpgradableConfigList=[];copyConfigForm=this.fb.group({sourceTarget:[{value:"",disabled:false},ve.required]});storageLocation=null;locations=["Local Storage","Server Storage"];saveConfigName=null;saveConfigScope=null;deleteConfigKey=null;jsonData=null;authStateEffect=Fa(()=>{if(this.supportApplicationData){if(this.hasTokenSignal()){this.saveConfigScope=this.isTokenTypeDeviceSignal()?"global":"user",this.getServerConfigList();return}this.deleteConfigKey=null;}});getServerConfigList(e){this.supportApplicationData&&this.storageSvc.listConfigs(e).then(t=>{let i=t.filter(s=>!(s.scope==="user"&&s.name==="default"));e?this.serverUpgradableConfigList=i:this.serverConfigListSignal.set(i);}).catch(t=>{t.status===401?this.toast.show("Storage Service: "+t.statusText+". Signal K configuration must meet the following requirements; 1) Security enabled. 2) Application Data Storage Interface: On. 3) Either Allow Readonly Access enabled, or connecting with a user.",0,false,"error"):this.toast.show("Cannot list configurations: "+t,0,false,"error");});}saveConfig(e,t,i,s,d){return Zr(this,null,function*(){if(!this.supportApplicationData)return false;if(t==="user"&&i==="default"&&!d)return this.toast.show("Saving configuration with scope 'user' and name 'default' is not allowed.",0,false,"error"),false;try{yield this.storageSvc.setConfig(t,i,e);}catch(r){return this.toast.show("Configuration not saved to server",0,false,"error"),false}return this.toast.show(`Configuration [${i}] saved to [${t}] storage scope`,1e3,true,"success"),s||this.getServerConfigList(),true})}saveToLocalstorage(e){e.app&&this.settings.replaceConfig("appConfig",e.app,false),this.settings.replaceConfig("dashboardsConfig",e.dashboards,false),e.theme&&this.settings.replaceConfig("themeConfig",e.theme,false);}copyConfig(){return Zr(this,null,function*(){let e=this.parseConfigKey(this.copyConfigForm.value.sourceTarget);if(!e){this.toast.show("Please select a valid configuration to restore.",0,false,"error");return}let t=null;try{yield this.storageSvc.getConfig(e.scope,e.name).then(s=>{t=s;});}catch(s){let d=typeof s=="object"&&s&&"statusText"in s?String(s.statusText??"Unknown error"):"Unknown error";this.toast.show("Cannot retrieve server configuration: "+d,0,false,"error");return}if(!t){this.toast.show("Cannot retrieve server configuration.",0,false,"error");return}(yield this.saveConfig(t,"user","default",false,true))&&this.settings.reloadApp();})}deleteConfigByKey(e){let t=this.parseConfigKey(e);if(!t){this.toast.show("Please select a valid configuration to delete.",0,false,"error");return}this.deleteConfig(t.scope,t.name);}deleteConfig(e,t,i,s){return Zr(this,null,function*(){try{yield this.storageSvc.removeItem(e,t,i);}catch(d){this.toast.show(`Configuration [${t}] could not be deleted from [${e}] storage scope`,0,false,"error");return}this.toast.show(`Configuration [${t}] deleted from [${e}] storage scope`,1e3,false,"success"),s||this.getServerConfigList();})}parseConfigKey(e){if(!e)return null;let[t,...i]=e.split("::"),s=i.join("::");return !t||!s?null:{scope:t,name:s}}resetConfigToDefault(){this.settings.resetSettings();}resetConnectionToDefault(){this.settings.resetConnection();}loadDemoConfig(){this.settings.loadDemoConfig();}getActiveConfig(){let e;return this.settings.useSharedConfig?e=this.getLocalConfigFromMemory():e=this.getLocalConfigFromLocalStorage(),e}getLocalConfigFromMemory(){return {app:this.settings.getAppConfig(),dashboards:this.settings.getDashboardConfig(),theme:this.settings.getThemeConfig()}}getLocalConfigFromLocalStorage(){return {app:this.settings.loadConfigFromLocalStorage("appConfig"),dashboards:this.settings.loadConfigFromLocalStorage("dashboardsConfig"),theme:this.settings.loadConfigFromLocalStorage("themeConfig")}}downloadJsonConfig(){let e=this.getActiveConfig(),t=JSON.stringify(e,null,2),i=new Blob([t],{type:"application/json"}),s=window.URL.createObjectURL(i),d=document.createElement("a");d.href=s,d.download="KipConfig.json",document.body.appendChild(d),d.click(),document.body.removeChild(d),window.URL.revokeObjectURL(s);}uploadJsonConfig(e){let i=e.target.files?.[0];if(i&&i.type==="application/json"){let s=new FileReader;s.onload=d=>Zr(this,null,function*(){try{this.jsonData=JSON.parse(d.target?.result);}catch(r){this.toast.show("File does not contain valid JSON.",0,false,"error"),console.error("Invalid JSON file format:",r);return}if(this.hasToken){if(!this.jsonData){this.toast.show("Configuration not saved",0,false,"error");return}if(!(yield this.saveConfig(this.jsonData,"user","default",false,true)))return}else {if(!this.jsonData){this.toast.show("Configuration not saved",0,false,"error");return}try{this.saveToLocalstorage(this.jsonData);}catch(r){this.toast.show("Configuration not saved",0,false,"error"),console.error("Failed to save configuration to local storage:",r);return}}this.settings.reloadApp();}),s.readAsText(i);}else this.toast.show("Please select a valid JSON file",0,false,"error");}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["settings-config"]],decls:88,vars:7,consts:[["saveConfigForm","ngForm"],["deleteConfigForm","ngForm"],["fileInput",""],[1,"page-content"],["routerLink","/help/configuration"],[1,"flex-container"],[1,"flex-item-rounded-card","rounded-card-color"],["name","saveConfigForm",3,"ngSubmit"],[2,"margin-bottom","16px"],[1,"no-token-notice"],[1,"formActionFooter"],[1,"formActionDivider"],["mat-flat-button","","type","submit","color","accent",3,"disabled"],["name","deleteConfigForm",3,"ngSubmit"],[3,"ngSubmit","formGroup"],[1,"flex-item-reset","rounded-card-color"],[1,"config-operation-container",2,"margin-top","20px"],[1,"download-txt"],[1,"download-btn","btn-div"],["mat-flat-button","","type","button",1,"adv-btn",3,"click"],[1,"upload-txt"],[1,"upload-btn","btn-div"],["type","file","accept",".json","hidden","",3,"change"],["mat-flat-button","",1,"adv-btn",3,"click"],[1,"demo-txt"],[1,"demo-btn","btn-div"],[1,"reset-txt"],[1,"reset-btn","btn-div"],[1,"config-txt"],[1,"config-btn","btn-div"],[2,"width","25%"],["name","serverConfiScope","required","",3,"ngModelChange","ngModel"],["value","global"],["value","user"],[2,"width","70%","padding-left","3%"],["matInput","","name","serverConfigName","placeholder","Enter a name for the configuration","required","",3,"ngModelChange","ngModel","ngModelOptions"],[2,"width","100%"],["name","selectedDeleteItem","required","",3,"ngModelChange","ngModel"],[3,"value"],["formControlName","sourceTarget"]],template:function(t,i){if(t&1){let s=Fw();Pi(0,"div",3)(1,"p"),TT(2," Recommended Reading: To understand configuration management and storage options, consult the "),Pi(3,"a",4),TT(4,"Login and Configuration"),ul(),TT(5," help section. "),ul(),Pi(6,"div",5)(7,"div",6)(8,"form",7,0),Qh("ngSubmit",function(){return i.saveConfig(i.getActiveConfig(),i.saveConfigScope??"",i.saveConfigName??"No Name")}),Pi(10,"h3"),TT(11,"Backup"),ul(),Pi(12,"p",8),TT(13," Create a backup of the current active configuration on the server. "),ul(),_w(14,ta,14,5,"div")(15,ia,3,0,"div",9),Pi(16,"div",10),$h(17,"mat-divider",11),Pi(18,"button",12),TT(19," Create "),ul()()()(),Pi(20,"div",6)(21,"form",13,1),Qh("ngSubmit",function(){return i.deleteConfigByKey(i.deleteConfigKey??"")}),Pi(23,"h3"),TT(24,"Delete"),ul(),Pi(25,"p",8),TT(26," Select a backup configuration to permanently delete from the server. "),ul(),_w(27,aa,7,1,"div")(28,oa,3,0,"div",9),Pi(29,"div",10),$h(30,"mat-divider",11),Pi(31,"button",12),TT(32," Delete "),ul()()()(),Pi(33,"div",6)(34,"form",14),Qh("ngSubmit",function(){return i.copyConfig()}),Pi(35,"h3"),TT(36,"Restore"),ul(),Pi(37,"p",8),TT(38," Replace the current configuration with a backup from the server. "),ul(),_w(39,ra,7,0,"div")(40,la,3,0,"div",9),Pi(41,"div",10),$h(42,"mat-divider",11),Pi(43,"button",12),TT(44," Restore "),ul()()()(),Pi(45,"div",15)(46,"h3"),TT(47,"Advanced"),ul(),Pi(48,"div",16)(49,"div",17),TT(50," To reuse your configuration on different devices, simply login using the same credential from any device (See "),Pi(51,"a",4),TT(52,"Login and Configuration"),ul(),TT(53," for more information). If you need to move your configuration between different Signal K servers, you can use Download to obtain a copy of the active configuration to a file. "),ul(),Pi(54,"div",18)(55,"button",19),Qh("click",function(){return i.downloadJsonConfig()}),TT(56," Download "),ul()(),Pi(57,"div",20),TT(58," Select a configuration file to upload. The file must be a valid KIP configuration file of JSON format. "),$h(59,"br"),Pi(60,"strong"),TT(61,"WARNING: This will permanently overwrite active configuration."),ul()(),Pi(62,"div",21)(63,"input",22,2),Qh("change",function(r){return i.uploadJsonConfig(r)}),ul(),Pi(65,"button",23),Qh("click",function(){ud(s);let r=Jw(64);return dd(r.click())}),TT(66," Upload "),ul()(),Pi(67,"div",24),TT(68," Load the demonstration configuration and connection to Signal K demo server. "),$h(69,"br"),Pi(70,"strong"),TT(71,"WARNING: This will permanently reset your active configuration."),ul()(),Pi(72,"div",25)(73,"button",19),Qh("click",function(){return i.loadDemoConfig()}),TT(74," Demo "),ul()(),Pi(75,"div",26),TT(76," Reset all your settings to default. The default configuration has a single Getting Started instruction widget. Your Signal K server connection settings will remain. "),$h(77,"br"),Pi(78,"strong"),TT(79,"WARNING: This will permanently reset your active configuration."),ul()(),Pi(80,"div",27)(81,"button",19),Qh("click",function(){return i.resetConfigToDefault()}),TT(82," Default "),ul()(),Pi(83,"div",28),TT(84," Clear the current connection configuration. This only affects Connectivity settings tab. "),ul(),Pi(85,"div",29)(86,"button",19),Qh("click",function(){return i.resetConnectionToDefault()}),TT(87," Connection "),ul()()()()()();}if(t&2){let s=Jw(9),d=Jw(22);EE(14),Mw(i.hasToken?14:15),EE(4),Bh("disabled",!i.hasToken||!s.valid),EE(9),Mw(i.hasToken?27:28),EE(4),Bh("disabled",!i.hasToken||!d.valid),EE(3),Bh("formGroup",i.copyConfigForm),EE(5),Mw(i.hasToken?39:40),EE(4),Bh("disabled",!i.copyConfigForm.valid);}},dependencies:[si,Ln$1,Gn$1,Xe,Pn$1,kn$1,ft$1,rn,Qt,u,xp,rt,ae,Ft,F,an$1,Wn,gn$1,hn$1,ln],styles:['[_nghost-%COMP%]{display:block;height:100%;width:100%}.page-content[_ngcontent-%COMP%]{width:100%;overflow-y:auto;scroll-behavior:smooth;padding:0 0 10px}.flex-item-copy[_ngcontent-%COMP%]{flex:2 1 41%;padding:10px 20px;border-radius:15px}.flex-item-reset[_ngcontent-%COMP%]{flex:1 1 100%;padding:10px 20px;border-radius:15px}h3[_ngcontent-%COMP%]{margin-top:5px}a[_ngcontent-%COMP%]{font-size:14px}a[_ngcontent-%COMP%]:hover{text-decoration:underline;cursor:pointer}a[_ngcontent-%COMP%]:link, a[_ngcontent-%COMP%]:visited{color:#8ab4f8;text-decoration:none}.warningText[_ngcontent-%COMP%]{padding-left:15px}.no-token-notice[_ngcontent-%COMP%]{height:58px;contain:content;text-align:center;font-style:italic}.mat-mdc-radio-button[_ngcontent-%COMP%] ~ .mat-radio-button[_ngcontent-%COMP%]{margin-right:16px;margin-left:16px}.config-column[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex-basis:100%;flex:1;margin:0 10px}.sources-radio-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin:15px 0}.sources-radio-button[_ngcontent-%COMP%]{margin:5px;margin-left:0!important}.select-config[_ngcontent-%COMP%]{margin-left:0}.config-row[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.btn-div[_ngcontent-%COMP%]{align-self:center}.adv-btn[_ngcontent-%COMP%]{width:100%}.config-operation-container[_ngcontent-%COMP%]{display:grid;grid-template-columns:[col-start] auto [col1-end] min-content [col2-end];grid-template-rows:[row-start] max-content [row1-end] max-content [row2-end];grid-template-areas:"download-txt download-btn" "upload-txt upload-btn" "demo-txt demo-btn" "reset-txt reset-btn" "config-txt config-btn";row-gap:20px;column-gap:10px}.upload-txt[_ngcontent-%COMP%]{grid-area:upload-txt}.upload-btn[_ngcontent-%COMP%]{grid-area:upload-btn}.download-txt[_ngcontent-%COMP%]{grid-area:download-txt}.download-btn[_ngcontent-%COMP%]{grid-area:download-btn}.demo-txt[_ngcontent-%COMP%]{grid-area:demo-txt}.demo-btn[_ngcontent-%COMP%]{grid-area:demo-btn}.reset-txt[_ngcontent-%COMP%]{grid-area:reset-txt}.reset-btn[_ngcontent-%COMP%]{grid-area:reset-btn}.config-txt[_ngcontent-%COMP%]{grid-area:config-txt}.config-btn[_ngcontent-%COMP%]{grid-area:config-btn}']})}return n})();var Cr=(()=>{class n{pageTitle="Settings";constructor(){}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["tabs"]],decls:12,vars:1,consts:[["svgIconId","settings",3,"pageTitle"],[1,"content-area"],["label","Connectivity"],[1,"tab-content"],["label","Display"],["label","Notifications & Audio"],["label","Units"],["label","Configurations"]],template:function(t,i){t&1&&($h(0,"page-header",0),Pi(1,"mat-tab-group",1)(2,"mat-tab",2),$h(3,"settings-signalk",3),ul(),Pi(4,"mat-tab",4),$h(5,"settings-display",3),ul(),Pi(6,"mat-tab",5),$h(7,"settings-notifications",3),ul(),Pi(8,"mat-tab",6),$h(9,"settings-units",3),ul(),Pi(10,"mat-tab",7),$h(11,"settings-config",3),ul()()),t&2&&Bh("pageTitle",i.pageTitle);},dependencies:[Sn$1,Nt,Xi,Ki,Oi,Ji,$i,O],styles:["[_nghost-%COMP%]{display:block;height:100%;width:100%}.content-area[_ngcontent-%COMP%]{height:calc(100% - 63px);overflow:hidden;width:100%;padding:0 24px}.tab-content[_ngcontent-%COMP%]{overflow-y:auto;width:100%;scroll-behavior:smooth;display:block}"]})}return n})();
1015
1015
  export{Cr as TabsComponent};