@mxtommy/kip 4.8.4 → 4.9.0-beta.1

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 (68) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/package.json +2 -2
  3. package/plugin/history-series.service.js +637 -0
  4. package/plugin/index.js +1322 -0
  5. package/plugin/kip-series-contract.js +31 -0
  6. package/plugin/openApi.json +855 -0
  7. package/plugin/sqlite-history-storage.service.js +1124 -0
  8. package/public/3rdpartylicenses.txt +78 -78
  9. package/public/assets/help-docs/ais-radar.md +261 -0
  10. package/public/assets/help-docs/dashboards.md +1 -1
  11. package/public/assets/help-docs/kiosk.md +4 -2
  12. package/public/assets/help-docs/menu.json +17 -2
  13. package/public/{chunk-CIGP2YJm.js → chunk-5jtM3b20.js} +1 -1
  14. package/public/{chunk-_zRMMvCu.js → chunk-B1H8b4W3.js} +1 -1
  15. package/public/{chunk-BJ-wyixK.js → chunk-BJObkbow.js} +1 -1
  16. package/public/{chunk-C6b8CVno.js → chunk-BLEfD_P7.js} +1 -1
  17. package/public/{chunk-BLEZOsfR.js → chunk-BO34LrGA.js} +1 -1
  18. package/public/{chunk-BeM64etA.js → chunk-BSNfaGK3.js} +1 -1
  19. package/public/{chunk-07zHjmg-.js → chunk-BbE36LU3.js} +1 -1
  20. package/public/{chunk-JhFkJS7i.js → chunk-BoY2UDvb.js} +1 -1
  21. package/public/{chunk-x7L6DXVK.js → chunk-BrjwTjz7.js} +1 -1
  22. package/public/{chunk-BFpzxIIT.js → chunk-BufDbUf3.js} +1 -1
  23. package/public/{chunk-C_OZJltF.js → chunk-C11zYqw7.js} +1 -1
  24. package/public/{chunk-CLs_NL1y.js → chunk-C8uxDv1M.js} +1 -1
  25. package/public/{chunk-DIl1k00y.js → chunk-CDG3g9Eq.js} +1 -1
  26. package/public/{chunk-q9NoPvcx.js → chunk-CEtt0kr-.js} +1 -1
  27. package/public/{chunk-BpcNrtxJ.js → chunk-CKnQ07BR.js} +1 -1
  28. package/public/{chunk-0z3nIRXw.js → chunk-COM48ir-.js} +1 -1
  29. package/public/{chunk-eQ1pa34Q.js → chunk-CSCVkGWE.js} +1 -1
  30. package/public/{chunk-BuvyF0y5.js → chunk-C_mCGLT_.js} +1 -1
  31. package/public/{chunk-BUguZ7cK.js → chunk-CnVELVOx.js} +1 -1
  32. package/public/{chunk-CLTHuhlN.js → chunk-Csxy6yVz.js} +1 -1
  33. package/public/{chunk-BZx964-p.js → chunk-CvG4thmf.js} +1 -1
  34. package/public/{chunk-CCfhzpE8.js → chunk-CxOyBrqL.js} +1 -1
  35. package/public/{chunk-otzyItXL.js → chunk-CzY2nk08.js} +1 -1
  36. package/public/{chunk-D-_-GUVr.js → chunk-CzquTNBp.js} +1 -1
  37. package/public/{chunk-ibauGmSP.js → chunk-D59G2Xua.js} +1 -1
  38. package/public/chunk-D8CQ-x45.js +1 -0
  39. package/public/{chunk-BTOTKeBo.js → chunk-DA2JBQHi.js} +1 -1
  40. package/public/chunk-DCdZRAXa.js +1 -0
  41. package/public/{chunk-BN7A4g6c.js → chunk-DES7U9G6.js} +1 -1
  42. package/public/{chunk-BIb-xYiS.js → chunk-DHj2hm9r.js} +1 -1
  43. package/public/{chunk-DPnbM-aB.js → chunk-DJVnrrxC.js} +1 -1
  44. package/public/{chunk-CxPx4NZv.js → chunk-DN6HP97P.js} +1 -1
  45. package/public/{chunk-COI6IBXH.js → chunk-DTznNQod.js} +1 -1
  46. package/public/{chunk-szQs8fiq.js → chunk-DZQzZeIV.js} +1 -1
  47. package/public/{chunk-DTN-sa1K.js → chunk-DakdT7bi.js} +1 -1
  48. package/public/{chunk-CHAFm_nM.js → chunk-DizMY7FW.js} +1 -1
  49. package/public/{chunk-OeQDZKFO.js → chunk-DjPkdMGz.js} +1 -1
  50. package/public/{chunk-BfiyH3nV.js → chunk-DlLiKS0n.js} +1 -1
  51. package/public/{chunk-CYYBxjrc.js → chunk-Dt2HCrSr.js} +1 -1
  52. package/public/{chunk-CyVRpGoJ.js → chunk-Duhmjpm9.js} +1 -1
  53. package/public/{chunk-B9nVBlGj.js → chunk-DulH4zwM.js} +1 -1
  54. package/public/{chunk-B09jfNia.js → chunk-DwAXe6Wn.js} +1 -1
  55. package/public/{chunk-CoCQ3DW2.js → chunk-DxD20B-E.js} +1 -1
  56. package/public/{chunk-DmkAKXR1.js → chunk-DzQ_fUpO.js} +1 -1
  57. package/public/{chunk-B0eE4udE.js → chunk-GyA81uXZ.js} +1 -1
  58. package/public/{chunk-Co2wVrD6.js → chunk-GzqVKhHm.js} +1 -1
  59. package/public/{chunk-BjINKQ03.js → chunk-MPbL1AwE.js} +1 -1
  60. package/public/{chunk-CQMVIDcp.js → chunk-Qlya07CF.js} +1 -1
  61. package/public/{chunk-CXvWM_vF.js → chunk-VshNFG3q.js} +1 -1
  62. package/public/{chunk-DUEKoZhd.js → chunk-YBp9CH_2.js} +1 -1
  63. package/public/{chunk-D1HYfaL_.js → chunk-_S08GvV8.js} +1 -1
  64. package/public/{chunk-B0D54iJs.js → chunk-dvm9QV-B.js} +1 -1
  65. package/public/{chunk-D2953Rfp.js → chunk-ipFM9wbJ.js} +1 -1
  66. package/public/index.html +1 -1
  67. package/public/{main-YKDNK5VZ.js → main-IINF7HD6.js} +473 -473
  68. package/public/chunk-Do8wqING.js +0 -1
@@ -1 +1 @@
1
- import {O}from'./chunk-x7L6DXVK.js';import {w,G as Gi,aS as De$1,cu as T,aY as xe,v as vt,D as Dt,a_ as Gp,F as Fa,cv as G,cw as z,J as JD,cx as ut,cy as He,cz as ht,cA as Te,a2 as Jt,a3 as Xt,a4 as Zt,O as Op,cB as Mt,cC as Dt$1,p as R,y as yt,b as wt,c as $h,P as Pi,X as xw,cs as Sw,u as ul,_ as _w,B as Bh,e as EE,Y as Aw,M as Mw,T as TT,h as Fw,k as Qh,l as ud,g as qw,m as dd,s as sg,aA as gg}from'./main-YKDNK5VZ.js';var te=(n,a)=>a.id;function ie(n,a){if(n&1){let e=Fw();Pi(0,"button",9),Qh("click",function(){let t=ud(e).$implicit,o=qw();return dd(o.displayDashboards(t.displayId))}),TT(1),ul();}if(n&2){let e=a.$implicit,i=qw();sg("selected",i.selectedDisplayButtonId()===e.displayId),EE(),gg(e.displayName);}}function ne(n,a){n&1&&(Pi(0,"button",5)(1,"i"),TT(2,'"No Remote"'),ul()());}function se(n,a){n&1&&(Pi(0,"div",7),$h(1,"mat-progress-spinner",10),ul());}function oe(n,a){if(n&1){let e=Fw();Pi(0,"tile-large-icon",12,0),Qh("click",function(){let t=ud(e).$index,o=qw(2);return dd(o.setActiveScreen(t))}),ul();}if(n&2){let e=a.$implicit,i=a.$index,t=qw(2);Bh("active",t.activeScreenIdx()===i)("svgIcon",e.icon)("iconSize",72)("label",e.name);}}function ae(n,a){if(n&1&&xw(0,oe,2,4,"tile-large-icon",11,te),n&2){let e=qw();Aw(e.screens());}}function re(n,a){n&1&&(Pi(0,"div",8)(1,"mat-icon",13),TT(2,"cast"),ul(),Pi(3,"div",14)(4,"p"),TT(5,"Select an available remote KIP in the menu."),ul(),Pi(6,"p"),TT(7,"To allow remote control of a dashboard, on that KIP device open Options \u2192 Display \u2192 Remote Control and enable it."),ul()()());}var De=(()=>{class n{COMMAND_REQUEST_ACTIVE_SCREEN_PATH="self.kip.remote.requestActiveScreen";_settings=w(Gi);_data=w(De$1);_requests=w(T);_destroyRef=w(xe);pageTitle="Remote Control";appID=this._settings.KipUUID;displayId=vt(null);selectedDisplayButtonId=vt(null);screensLoading=vt(false);displaysMap=vt({});selectedDisplaySub=null;selectedScreenIndexSub=null;displays=Dt(()=>Object.values(this.displaysMap()).filter(i=>i.displayId!==this.appID).sort((i,t)=>{let o=(i.displayName??"").toLowerCase(),s=(t.displayName??"").toLowerCase();return o&&s?o.localeCompare(s):o?-1:s?1:i.displayId.localeCompare(t.displayId)}));screens=vt([]);activeScreenIdx=vt(null);constructor(){this._data.subscribePathTree("self.displays.*").pipe(Gp(this._destroyRef)).subscribe(({path:e,update:i})=>{this.updateDisplayCatalog(e,i.data.value);}),Fa(()=>{let e=this.displays(),i=this.selectedDisplayButtonId();if(!e.length){this.displayDashboards(null);return}(!i||!e.some(t=>t.displayId===i))&&this.displayDashboards(e[0].displayId);}),Fa(()=>{this.rebindSelectedDisplaySubscriptions(this.displayId());});}updateDisplayCatalog(e,i){let t=this.extractDisplayId(e);if(!t||t===this.appID)return;let o=`self.displays.${t}`;this.displaysMap.update(s=>{let r=G({},s);if(e===o&&(i===null||typeof i>"u"))return delete r[t],r;let _=(r[t]??{displayName:null}).displayName;if(e===o&&i&&typeof i=="object"){let x=i;typeof x.displayName=="string"?_=x.displayName:x.displayName===null&&(_=null);}return r[t]={displayId:t,displayName:_},r});}rebindSelectedDisplaySubscriptions(e){if(this.selectedDisplaySub?.unsubscribe(),this.selectedDisplaySub=null,this.selectedScreenIndexSub?.unsubscribe(),this.selectedScreenIndexSub=null,!e){this.screensLoading.set(false),this.screens.set([]),this.activeScreenIdx.set(null);return}this.screensLoading.set(true),this.selectedDisplaySub=this._data.subscribePath(`self.displays.${e}`,"default").pipe(Gp(this._destroyRef)).subscribe(i=>{this.screensLoading.set(false);let t=i.data.value,o=Array.isArray(t?.screens)?t.screens.filter(s=>!!s&&typeof s=="object"&&typeof s.id=="string"&&typeof s.name=="string"&&typeof s.icon=="string"):[];this.screens.set(o),t&&Object.prototype.hasOwnProperty.call(t,"displayName")&&this.displaysMap.update(s=>{let r=s[e];if(!r)return s;let h=typeof t.displayName=="string"?t.displayName:t.displayName===null?null:r.displayName;return h===r.displayName?s:z(G({},s),{[e]:z(G({},r),{displayName:h})})});}),this.selectedScreenIndexSub=this._data.subscribePath(`self.displays.${e}.screenIndex`,"default").pipe(Gp(this._destroyRef)).subscribe(i=>{let t=i.data.value;this.activeScreenIdx.set(typeof t=="number"?t:null);});}extractDisplayId(e){return e.match(/^self\.displays\.([^.]+)(?:\.|$)/)?.[1]??null}displayDashboards(e){this.displayId.set(e),this.selectedDisplayButtonId.set(e);}setActiveScreen(e){let i=this.activeScreenIdx(),t=this.displayId();if(!t)return;this.activeScreenIdx.set(e),this._requests.putRequest(this.COMMAND_REQUEST_ACTIVE_SCREEN_PATH,{displayId:t,screenIdx:e},this.appID)||(console.error("Failed to set active screen: request was not accepted"),this.activeScreenIdx.set(i));}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=JD({type:n,selectors:[["remote-control"]],decls:11,vars:3,consts:[["tile",""],["svgIconId","remote-control",3,"pageTitle"],[1,"sidenav-remote-control-container"],["mode","side","opened",""],["mat-list-item","","tabindex","0",3,"selected"],["mat-list-item","","tabindex","0","disabled","true",2,"text-align","center"],[1,"sidenav-remote-control-content"],["aria-label","Loading screens",1,"loading-container"],["role","status","aria-live","polite",1,"empty-state-msg"],["mat-list-item","","tabindex","0",3,"click"],["mode","indeterminate","diameter","64","strokeWidth","5"],[3,"active","svgIcon","iconSize","label"],[3,"click","active","svgIcon","iconSize","label"],["aria-hidden","true","color","primary",1,"empty-state-icon"],[1,"copy"]],template:function(i,t){i&1&&($h(0,"page-header",1),Pi(1,"mat-sidenav-container",2)(2,"mat-sidenav",3)(3,"mat-action-list"),xw(4,ie,2,3,"button",4,Sw,false,ne,3,0,"button",5),ul()(),Pi(7,"mat-sidenav-content",6),_w(8,se,2,0,"div",7)(9,ae,2,0)(10,re,8,0,"div",8),ul()()),i&2&&(Bh("pageTitle",t.pageTitle),EE(4),Aw(t.displays()),EE(4),Mw(t.screensLoading()?8:t.screens().length?9:10));},dependencies:[O,ut,He,ht,Te,Jt,Xt,Zt,Op,Mt,Dt$1,R,yt,wt],styles:[".sidenav-remote-control-container[_ngcontent-%COMP%]{height:calc(100% - 87px);width:calc(100% - 48px);margin:0 24px 24px;border:1px solid var(--mat-sys-outline-variant)}mat-sidenav[_ngcontent-%COMP%]{width:150px;--mat-sidenav-container-shape: square}.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-inverse-on-surface)}.loading-container[_ngcontent-%COMP%]{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px}.sidenav-remote-control-content[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;height:100%;width:100%;padding:5px;gap:5px;overflow-y:auto;scrollbar-width:none;overflow-x:hidden;scroll-behavior:smooth;flex:1 1 auto;min-height:0}tile-large-icon[_ngcontent-%COMP%]{width:190px}.empty-state-msg[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center;justify-content:center;height:100%;width:calc(100% - 150px);min-height:70vh;padding:2rem;text-align:center;color:var(--mat-sys-outline-variant);font-style:italic}.empty-state-icon[_ngcontent-%COMP%]{font-size:4rem;width:4rem;height:4rem;color:var(--mat-sys-outline-variant);margin-bottom:1rem}"]})}return n})();export{De as RemoteControlComponent};
1
+ import {O}from'./chunk-BrjwTjz7.js';import {w,G as Gi,aS as De$1,cu as T,aY as xe,v as vt,D as Dt,a_ as Gp,F as Fa,cv as G,cw as z,J as JD,cx as ut,cy as He,cz as ht,cA as Te,a2 as Jt,a3 as Xt,a4 as Zt,O as Op,cB as Mt,cC as Dt$1,p as R,y as yt,b as wt,c as $h,P as Pi,X as xw,cs as Sw,u as ul,_ as _w,B as Bh,e as EE,Y as Aw,M as Mw,T as TT,h as Fw,k as Qh,l as ud,g as qw,m as dd,s as sg,aA as gg}from'./main-IINF7HD6.js';var te=(n,a)=>a.id;function ie(n,a){if(n&1){let e=Fw();Pi(0,"button",9),Qh("click",function(){let t=ud(e).$implicit,o=qw();return dd(o.displayDashboards(t.displayId))}),TT(1),ul();}if(n&2){let e=a.$implicit,i=qw();sg("selected",i.selectedDisplayButtonId()===e.displayId),EE(),gg(e.displayName);}}function ne(n,a){n&1&&(Pi(0,"button",5)(1,"i"),TT(2,'"No Remote"'),ul()());}function se(n,a){n&1&&(Pi(0,"div",7),$h(1,"mat-progress-spinner",10),ul());}function oe(n,a){if(n&1){let e=Fw();Pi(0,"tile-large-icon",12,0),Qh("click",function(){let t=ud(e).$index,o=qw(2);return dd(o.setActiveScreen(t))}),ul();}if(n&2){let e=a.$implicit,i=a.$index,t=qw(2);Bh("active",t.activeScreenIdx()===i)("svgIcon",e.icon)("iconSize",72)("label",e.name);}}function ae(n,a){if(n&1&&xw(0,oe,2,4,"tile-large-icon",11,te),n&2){let e=qw();Aw(e.screens());}}function re(n,a){n&1&&(Pi(0,"div",8)(1,"mat-icon",13),TT(2,"cast"),ul(),Pi(3,"div",14)(4,"p"),TT(5,"Select an available remote KIP in the menu."),ul(),Pi(6,"p"),TT(7,"To allow remote control of a dashboard, on that KIP device open Options \u2192 Display \u2192 Remote Control and enable it."),ul()()());}var De=(()=>{class n{COMMAND_REQUEST_ACTIVE_SCREEN_PATH="self.kip.remote.requestActiveScreen";_settings=w(Gi);_data=w(De$1);_requests=w(T);_destroyRef=w(xe);pageTitle="Remote Control";appID=this._settings.KipUUID;displayId=vt(null);selectedDisplayButtonId=vt(null);screensLoading=vt(false);displaysMap=vt({});selectedDisplaySub=null;selectedScreenIndexSub=null;displays=Dt(()=>Object.values(this.displaysMap()).filter(i=>i.displayId!==this.appID).sort((i,t)=>{let o=(i.displayName??"").toLowerCase(),s=(t.displayName??"").toLowerCase();return o&&s?o.localeCompare(s):o?-1:s?1:i.displayId.localeCompare(t.displayId)}));screens=vt([]);activeScreenIdx=vt(null);constructor(){this._data.subscribePathTree("self.displays.*").pipe(Gp(this._destroyRef)).subscribe(({path:e,update:i})=>{this.updateDisplayCatalog(e,i.data.value);}),Fa(()=>{let e=this.displays(),i=this.selectedDisplayButtonId();if(!e.length){this.displayDashboards(null);return}(!i||!e.some(t=>t.displayId===i))&&this.displayDashboards(e[0].displayId);}),Fa(()=>{this.rebindSelectedDisplaySubscriptions(this.displayId());});}updateDisplayCatalog(e,i){let t=this.extractDisplayId(e);if(!t||t===this.appID)return;let o=`self.displays.${t}`;this.displaysMap.update(s=>{let r=G({},s);if(e===o&&(i===null||typeof i>"u"))return delete r[t],r;let _=(r[t]??{displayName:null}).displayName;if(e===o&&i&&typeof i=="object"){let x=i;typeof x.displayName=="string"?_=x.displayName:x.displayName===null&&(_=null);}return r[t]={displayId:t,displayName:_},r});}rebindSelectedDisplaySubscriptions(e){if(this.selectedDisplaySub?.unsubscribe(),this.selectedDisplaySub=null,this.selectedScreenIndexSub?.unsubscribe(),this.selectedScreenIndexSub=null,!e){this.screensLoading.set(false),this.screens.set([]),this.activeScreenIdx.set(null);return}this.screensLoading.set(true),this.selectedDisplaySub=this._data.subscribePath(`self.displays.${e}`,"default").pipe(Gp(this._destroyRef)).subscribe(i=>{this.screensLoading.set(false);let t=i.data.value,o=Array.isArray(t?.screens)?t.screens.filter(s=>!!s&&typeof s=="object"&&typeof s.id=="string"&&typeof s.name=="string"&&typeof s.icon=="string"):[];this.screens.set(o),t&&Object.prototype.hasOwnProperty.call(t,"displayName")&&this.displaysMap.update(s=>{let r=s[e];if(!r)return s;let h=typeof t.displayName=="string"?t.displayName:t.displayName===null?null:r.displayName;return h===r.displayName?s:z(G({},s),{[e]:z(G({},r),{displayName:h})})});}),this.selectedScreenIndexSub=this._data.subscribePath(`self.displays.${e}.screenIndex`,"default").pipe(Gp(this._destroyRef)).subscribe(i=>{let t=i.data.value;this.activeScreenIdx.set(typeof t=="number"?t:null);});}extractDisplayId(e){return e.match(/^self\.displays\.([^.]+)(?:\.|$)/)?.[1]??null}displayDashboards(e){this.displayId.set(e),this.selectedDisplayButtonId.set(e);}setActiveScreen(e){let i=this.activeScreenIdx(),t=this.displayId();if(!t)return;this.activeScreenIdx.set(e),this._requests.putRequest(this.COMMAND_REQUEST_ACTIVE_SCREEN_PATH,{displayId:t,screenIdx:e},this.appID)||(console.error("Failed to set active screen: request was not accepted"),this.activeScreenIdx.set(i));}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=JD({type:n,selectors:[["remote-control"]],decls:11,vars:3,consts:[["tile",""],["svgIconId","remote-control",3,"pageTitle"],[1,"sidenav-remote-control-container"],["mode","side","opened",""],["mat-list-item","","tabindex","0",3,"selected"],["mat-list-item","","tabindex","0","disabled","true",2,"text-align","center"],[1,"sidenav-remote-control-content"],["aria-label","Loading screens",1,"loading-container"],["role","status","aria-live","polite",1,"empty-state-msg"],["mat-list-item","","tabindex","0",3,"click"],["mode","indeterminate","diameter","64","strokeWidth","5"],[3,"active","svgIcon","iconSize","label"],[3,"click","active","svgIcon","iconSize","label"],["aria-hidden","true","color","primary",1,"empty-state-icon"],[1,"copy"]],template:function(i,t){i&1&&($h(0,"page-header",1),Pi(1,"mat-sidenav-container",2)(2,"mat-sidenav",3)(3,"mat-action-list"),xw(4,ie,2,3,"button",4,Sw,false,ne,3,0,"button",5),ul()(),Pi(7,"mat-sidenav-content",6),_w(8,se,2,0,"div",7)(9,ae,2,0)(10,re,8,0,"div",8),ul()()),i&2&&(Bh("pageTitle",t.pageTitle),EE(4),Aw(t.displays()),EE(4),Mw(t.screensLoading()?8:t.screens().length?9:10));},dependencies:[O,ut,He,ht,Te,Jt,Xt,Zt,Op,Mt,Dt$1,R,yt,wt],styles:[".sidenav-remote-control-container[_ngcontent-%COMP%]{height:calc(100% - 87px);width:calc(100% - 48px);margin:0 24px 24px;border:1px solid var(--mat-sys-outline-variant)}mat-sidenav[_ngcontent-%COMP%]{width:150px;--mat-sidenav-container-shape: square}.selected[_ngcontent-%COMP%]{background-color:var(--mat-sys-inverse-on-surface)}.loading-container[_ngcontent-%COMP%]{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px}.sidenav-remote-control-content[_ngcontent-%COMP%]{display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;height:100%;width:100%;padding:5px;gap:5px;overflow-y:auto;scrollbar-width:none;overflow-x:hidden;scroll-behavior:smooth;flex:1 1 auto;min-height:0}tile-large-icon[_ngcontent-%COMP%]{width:190px}.empty-state-msg[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center;justify-content:center;height:100%;width:calc(100% - 150px);min-height:70vh;padding:2rem;text-align:center;color:var(--mat-sys-outline-variant);font-style:italic}.empty-state-icon[_ngcontent-%COMP%]{font-size:4rem;width:4rem;height:4rem;color:var(--mat-sys-outline-variant);margin-bottom:1rem}"]})}return n})();export{De as RemoteControlComponent};
@@ -1 +1 @@
1
- import {d1 as Hj,w,du as p,dv as rt,aZ as R,$ as $j,v as vt,D as Dt,F as Fa,dn as ge,J as JD,cp as Uh,f as eg,K as Kw}from'./main-YKDNK5VZ.js';import {c}from'./chunk-BIb-xYiS.js';var P=["canvasMainRef"],B=(()=>{class s{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);streams=w(rt);canvas=w(R);canvasRef=$j.required("canvasMainRef");canvasElement=null;ctx=null;cssWidth=0;cssHeight=0;titleBitmap=null;titleBitmapText=null;titleBitmapColor=null;maxTextWidth=0;maxTextHeight=0;middle=0;center=0;fontSizeOffset=0;latPos="";longPos="";labelColor=vt("");valueColor="";normalizedConfig=Dt(()=>this.runtime.options()??s.DEFAULT_CONFIG);positionPaths=Dt(()=>this.normalizedConfig().paths??{});static DEFAULT_CONFIG={supportAutomaticHistoricalSeries:false,displayName:"Position",filterSelfPaths:true,paths:{longPath:{description:"Longitude",path:"self.navigation.position.longitude",source:"default",pathType:"number",isPathConfigurable:true,convertUnitTo:"longitudeMin",showPathSkUnitsFilter:true,pathSkUnitsFilter:null,sampleTime:500},latPath:{description:"Latitude",path:"self.navigation.position.latitude",source:"default",pathType:"number",isPathConfigurable:true,convertUnitTo:"latitudeMin",showPathSkUnitsFilter:true,pathSkUnitsFilter:null,sampleTime:500}},color:"contrast",enableTimeout:false,dataTimeout:5};constructor(){Fa(()=>{let e=this.normalizedConfig(),t=this.theme();t&&ge(()=>{let i=c(e.color??"contrast",t);this.labelColor.set(i.dim),this.valueColor=i.color,this.draw();});}),Fa(()=>{let e=this.positionPaths().longPath;e?.path&&ge(()=>this.streams.observe("longPath",t=>{let i=t?.data?.value;i==null?this.longPos="":e.convertUnitTo==="pdeg"?this.longPos=i.toFixed(6)+"\xB0":this.longPos=String(i),this.calculateFontSizeAndPositions(),this.draw();}));}),Fa(()=>{let e=this.positionPaths().latPath;e?.path&&ge(()=>this.streams.observe("latPath",t=>{let i=t?.data?.value;i==null?this.latPos="":e.convertUnitTo==="pdeg"?this.latPos=i.toFixed(7)+"\xB0":this.latPos=String(i),this.calculateFontSizeAndPositions(),this.draw();}));});}ngAfterViewInit(){this.canvasElement=this.canvasRef().nativeElement,this.ctx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(e,t)=>{this.cssWidth=e,this.cssHeight=t,this.calculateFontSizeAndPositions(),this.draw();}}),this.cssHeight=Math.round(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.round(this.canvasElement.getBoundingClientRect().width),this.calculateFontSizeAndPositions(),this.draw();}calculateFontSizeAndPositions(){if(!this.cssWidth||!this.cssHeight)return;this.maxTextHeight=Math.floor(this.cssHeight*.6/2),this.maxTextWidth=Math.floor(this.cssWidth*.85),this.center=this.cssWidth/2,this.middle=this.cssHeight*.57;let e=this.latPos.length>this.longPos.length?this.latPos:this.longPos;if(this.ctx){let t=this.canvas.calculateOptimalFontSize(this.ctx,e,this.maxTextWidth,this.maxTextHeight,"bold");this.fontSizeOffset=Math.floor(t*5e-4);}}draw(){if(!this.ctx||!this.canvasElement)return;let t=this.normalizedConfig().displayName||"Position",i=this.labelColor();(!this.titleBitmap||this.titleBitmap.width!==this.canvasElement.width||this.titleBitmap.height!==this.canvasElement.height||this.titleBitmapText!==t||this.titleBitmapColor!==i)&&(this.titleBitmap=this.canvas.createTitleBitmap(t,i,"normal",this.cssWidth,this.cssHeight),this.titleBitmapText=t,this.titleBitmapColor=i),this.canvas.clearCanvas(this.ctx,this.cssWidth,this.cssHeight),this.titleBitmap&&this.titleBitmap.width>0&&this.titleBitmap.height>0&&this.ctx.drawImage(this.titleBitmap,0,0,this.cssWidth,this.cssHeight),this.canvas.drawText(this.ctx,this.latPos,this.center,this.middle-this.fontSizeOffset,this.maxTextWidth,this.maxTextHeight,"bold",this.valueColor,"center","bottom"),this.canvas.drawText(this.ctx,this.longPos,this.center,this.middle+this.fontSizeOffset,this.maxTextWidth,this.maxTextHeight,"bold",this.valueColor,"center","top");}ngOnDestroy(){try{this.canvasElement&&this.canvas.unregisterCanvas(this.canvasElement);}catch(e){}}static \u0275fac=function(t){return new(t||s)};static \u0275cmp=JD({type:s,selectors:[["widget-position"]],viewQuery:function(t,i){t&1&&eg(i.canvasRef,P,5),t&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:0,consts:[["canvasMainRef",""],[1,"position-canvas"]],template:function(t,i){t&1&&Uh(0,"canvas",1,0);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow:hidden}.position-canvas[_ngcontent-%COMP%]{display:block;width:100%!important;height:100%!important;min-height:1px}"]})}return s})();export{B as WidgetPositionComponent};
1
+ import {d1 as Hj,w,du as p,dv as rt,aZ as R,$ as $j,v as vt,D as Dt,F as Fa,dn as ge,J as JD,cp as Uh,f as eg,K as Kw}from'./main-IINF7HD6.js';import {c}from'./chunk-DHj2hm9r.js';var P=["canvasMainRef"],B=(()=>{class s{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);streams=w(rt);canvas=w(R);canvasRef=$j.required("canvasMainRef");canvasElement=null;ctx=null;cssWidth=0;cssHeight=0;titleBitmap=null;titleBitmapText=null;titleBitmapColor=null;maxTextWidth=0;maxTextHeight=0;middle=0;center=0;fontSizeOffset=0;latPos="";longPos="";labelColor=vt("");valueColor="";normalizedConfig=Dt(()=>this.runtime.options()??s.DEFAULT_CONFIG);positionPaths=Dt(()=>this.normalizedConfig().paths??{});static DEFAULT_CONFIG={supportAutomaticHistoricalSeries:false,displayName:"Position",filterSelfPaths:true,paths:{longPath:{description:"Longitude",path:"self.navigation.position.longitude",source:"default",pathType:"number",isPathConfigurable:true,convertUnitTo:"longitudeMin",showPathSkUnitsFilter:true,pathSkUnitsFilter:null,sampleTime:500},latPath:{description:"Latitude",path:"self.navigation.position.latitude",source:"default",pathType:"number",isPathConfigurable:true,convertUnitTo:"latitudeMin",showPathSkUnitsFilter:true,pathSkUnitsFilter:null,sampleTime:500}},color:"contrast",enableTimeout:false,dataTimeout:5};constructor(){Fa(()=>{let e=this.normalizedConfig(),t=this.theme();t&&ge(()=>{let i=c(e.color??"contrast",t);this.labelColor.set(i.dim),this.valueColor=i.color,this.draw();});}),Fa(()=>{let e=this.positionPaths().longPath;e?.path&&ge(()=>this.streams.observe("longPath",t=>{let i=t?.data?.value;i==null?this.longPos="":e.convertUnitTo==="pdeg"?this.longPos=i.toFixed(6)+"\xB0":this.longPos=String(i),this.calculateFontSizeAndPositions(),this.draw();}));}),Fa(()=>{let e=this.positionPaths().latPath;e?.path&&ge(()=>this.streams.observe("latPath",t=>{let i=t?.data?.value;i==null?this.latPos="":e.convertUnitTo==="pdeg"?this.latPos=i.toFixed(7)+"\xB0":this.latPos=String(i),this.calculateFontSizeAndPositions(),this.draw();}));});}ngAfterViewInit(){this.canvasElement=this.canvasRef().nativeElement,this.ctx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(e,t)=>{this.cssWidth=e,this.cssHeight=t,this.calculateFontSizeAndPositions(),this.draw();}}),this.cssHeight=Math.round(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.round(this.canvasElement.getBoundingClientRect().width),this.calculateFontSizeAndPositions(),this.draw();}calculateFontSizeAndPositions(){if(!this.cssWidth||!this.cssHeight)return;this.maxTextHeight=Math.floor(this.cssHeight*.6/2),this.maxTextWidth=Math.floor(this.cssWidth*.85),this.center=this.cssWidth/2,this.middle=this.cssHeight*.57;let e=this.latPos.length>this.longPos.length?this.latPos:this.longPos;if(this.ctx){let t=this.canvas.calculateOptimalFontSize(this.ctx,e,this.maxTextWidth,this.maxTextHeight,"bold");this.fontSizeOffset=Math.floor(t*5e-4);}}draw(){if(!this.ctx||!this.canvasElement)return;let t=this.normalizedConfig().displayName||"Position",i=this.labelColor();(!this.titleBitmap||this.titleBitmap.width!==this.canvasElement.width||this.titleBitmap.height!==this.canvasElement.height||this.titleBitmapText!==t||this.titleBitmapColor!==i)&&(this.titleBitmap=this.canvas.createTitleBitmap(t,i,"normal",this.cssWidth,this.cssHeight),this.titleBitmapText=t,this.titleBitmapColor=i),this.canvas.clearCanvas(this.ctx,this.cssWidth,this.cssHeight),this.titleBitmap&&this.titleBitmap.width>0&&this.titleBitmap.height>0&&this.ctx.drawImage(this.titleBitmap,0,0,this.cssWidth,this.cssHeight),this.canvas.drawText(this.ctx,this.latPos,this.center,this.middle-this.fontSizeOffset,this.maxTextWidth,this.maxTextHeight,"bold",this.valueColor,"center","bottom"),this.canvas.drawText(this.ctx,this.longPos,this.center,this.middle+this.fontSizeOffset,this.maxTextWidth,this.maxTextHeight,"bold",this.valueColor,"center","top");}ngOnDestroy(){try{this.canvasElement&&this.canvas.unregisterCanvas(this.canvasElement);}catch(e){}}static \u0275fac=function(t){return new(t||s)};static \u0275cmp=JD({type:s,selectors:[["widget-position"]],viewQuery:function(t,i){t&1&&eg(i.canvasRef,P,5),t&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:0,consts:[["canvasMainRef",""],[1,"position-canvas"]],template:function(t,i){t&1&&Uh(0,"canvas",1,0);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow:hidden}.position-canvas[_ngcontent-%COMP%]{display:block;width:100%!important;height:100%!important;min-height:1px}"]})}return s})();export{B as WidgetPositionComponent};
@@ -1 +1 @@
1
- import'./chunk-BTOTKeBo.js';import {d1 as Hj,w,du as p,dy as K,ao as ue,aZ as R,bu as ut,dw as S,$ as $j,a6 as Lr,D as Dt,F as Fa,dn as ge,b0 as Wl,J as JD,_ as _w,M as Mw,f as eg,K as Kw,cp as Uh,ci as dl,T as TT,cj as fl}from'./main-YKDNK5VZ.js';var _=["widgetDataChart"];function E(m,t){m&1&&Uh(0,"canvas",1,0);}function I(m,t){m&1&&(dl(0,"div",2)(1,"p"),TT(2,"Ready to configure"),fl(),dl(3,"p",3),TT(4,"Double-tap to begin"),fl()());}var U=class m{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);dsService=w(K);ngZone=w(ue);canvasService=w(R);unitsService=w(ut);datasetLifecycle=w(S);widgetDataChart=$j("widgetDataChart",{read:Lr});static DEFAULT_CONFIG={displayName:"Chart Label",color:"contrast",filterSelfPaths:true,datachartPath:null,datachartSource:null,convertUnitTo:null,timeScale:"minute",period:10,numDecimal:1,inverseYAxis:false,datasetAverageArray:"sma",showDataPoints:false,showAverageData:true,trackAgainstAverage:false,showDatasetMinimumValueLine:false,showDatasetMaximumValueLine:false,showDatasetAverageValueLine:true,showDatasetAngleAverageValueLine:false,showLabel:true,showTimeScale:false,startScaleAtZero:false,verticalChart:false,showYScale:false,yScaleSuggestedMin:void 0,yScaleSuggestedMax:void 0,enableMinMaxScaleLimit:false,yScaleMin:void 0,yScaleMax:void 0};lineChartData={datasets:[]};lineChartOptions={parsing:false,datasets:{line:{pointRadius:0,pointHoverRadius:0,tension:.4}},animations:{tension:{easing:"easeInOutCubic"}}};lineChartType="line";chart=null;dsServiceSub=null;datasetConfig=null;dataSourceInfo=null;lastVerticalChart=null;lastAverageValue=null;lastMinimumValue=null;lastMaximumValue=null;hasPath=Dt(()=>!!this.runtime.options()?.datachartPath);pathSignature=Dt(()=>{let t=this.runtime.options();if(t?.datachartPath)return [t.datachartPath,t.convertUnitTo,t.datachartSource,t.timeScale,t.period].join("|")});previousPathSignature=void 0;constructor(){Fa(()=>{let t=this.pathSignature();ge(()=>{t!==this.previousPathSignature&&ge(()=>{this.previousPathSignature=t;let e=this.runtime.options();e&&this.rebuildForDataset(e);});});}),Fa(()=>{let t=this.runtime.options(),e=this.theme();!t||!e||ge(()=>{this.lastVerticalChart!==null&&this.lastVerticalChart!==t.verticalChart?(this.lastVerticalChart=t.verticalChart??false,this.rebuildForDataset(t)):this.chart&&(this.ensureAverageDatasetPresence(),this.updateAnnotationVisibility(),this.applyDynamicTrackAverageStyling(),this.setChartOptions(t),this.setDatasetsColors(),this.ngZone.runOutsideAngular(()=>this.chart?.update("none")));});}),Fa(()=>{let t=this.runtime.options(),e=this.widgetDataChart(),a=this.hasPath();!t||!a||!e||this.chart||ge(()=>this.rebuildForDataset(t));});}rebuildForDataset(t){if(!t.datachartPath||!this.widgetDataChart()||(this.dsServiceSub?.unsubscribe(),this.lineChartData.datasets=[],this.datasetLifecycle.syncDataChartDataset(this.id(),t,this.pathSignature()),this.datasetConfig=this.dsService.getDatasetConfig(this.id())??null,this.dataSourceInfo=this.dsService.getDataSourceInfo(this.id())??null,!this.datasetConfig))return;this.createDatasets(t),this.setChartOptions(t),this.chart?.destroy();let a=this.widgetDataChart()?.nativeElement?.getContext("2d");a&&(this.chart=new Wl(a,{type:this.lineChartType,data:this.lineChartData,options:this.lineChartOptions}),this.startStreaming(),this.ngZone.runOutsideAngular(()=>this.chart?.update()));}setChartOptions(t){let e=this.datasetConfig;e&&(this.lineChartOptions.maintainAspectRatio=false,this.lineChartOptions.animation=false,this.lineChartOptions.indexAxis=t.verticalChart?"y":"x",t.verticalChart?this.lineChartOptions.scales={y:{type:"realtime",display:t.showTimeScale,position:t.verticalChart?"right":"left",suggestedMin:void 0,suggestedMax:void 0,title:{display:true,text:`Last ${e.period} ${e.timeScaleFormat}`,align:"center",color:this.getThemeColors().averageChartLine},time:{unit:e.timeScaleFormat,minUnit:"second",round:"second",displayFormats:{hour:"k:mm''",minute:"mm''",second:'ss"',millisecond:"SSS"}},ticks:{autoSkip:true,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}},x:{type:"linear",display:t.showYScale,position:t.verticalChart?"top":"bottom",suggestedMin:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMin,suggestedMax:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMax,min:t.enableMinMaxScaleLimit?t.yScaleMin:void 0,max:t.enableMinMaxScaleLimit?t.yScaleMax:void 0,beginAtZero:t.startScaleAtZero,reverse:t.inverseYAxis,title:{display:false,text:"Value Axis",align:"center",color:this.getThemeColors().averageChartLine},ticks:{maxTicksLimit:8,precision:t.numDecimal,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}}}:this.lineChartOptions.scales={x:{type:"realtime",display:t.showTimeScale,title:{display:true,text:`Last ${e.period} ${e.timeScaleFormat}`,align:"center",color:this.getThemeColors().averageChartLine},time:{unit:e.timeScaleFormat,minUnit:"second",round:"second",displayFormats:{hour:"k:mm''",minute:"mm''",second:'ss"',millisecond:"SSS"}},ticks:{autoSkip:true,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}},y:{display:t.showYScale,position:"right",suggestedMin:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMin,suggestedMax:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMax,min:t.enableMinMaxScaleLimit?t.yScaleMin:void 0,max:t.enableMinMaxScaleLimit?t.yScaleMax:void 0,beginAtZero:t.startScaleAtZero,reverse:t.inverseYAxis,title:{display:false,text:"Value Axis",align:"center",color:this.getThemeColors().averageChartLine},ticks:{maxTicksLimit:8,precision:t.numDecimal,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}}},this.lineChartOptions.plugins={title:{display:true,align:"end",padding:{top:3,bottom:0},text:"",font:{size:32},color:this.getThemeColors().chartValue},subtitle:{display:t.showLabel,align:"start",padding:{top:-35,bottom:20},text:` ${t.displayName}`,font:{size:22},color:this.getThemeColors().chartLabel},annotation:{annotations:{minimumLine:{type:"line",scaleID:t.verticalChart?"x":"y",display:t.showDatasetMinimumValueLine&&this.lastMinimumValue!==null,value:this.lastMinimumValue??0,drawTime:"afterDatasetsDraw",label:{display:t.showDatasetMinimumValueLine&&this.lastMinimumValue!==null,content:this.lastMinimumValue!==null?`${this.lastMinimumValue.toFixed(t.numDecimal??1)}`:"",position:"start",yAdjust:12,padding:4,color:this.getThemeColors().averageChartLine,backgroundColor:"rgba(63,63,63,0.0)"}},maximumLine:{type:"line",scaleID:t.verticalChart?"x":"y",display:t.showDatasetMaximumValueLine&&this.lastMaximumValue!==null,value:this.lastMaximumValue??0,drawTime:"afterDatasetsDraw",label:{display:t.showDatasetMaximumValueLine&&this.lastMaximumValue!==null,content:this.lastMaximumValue!==null?`${this.lastMaximumValue.toFixed(t.numDecimal??1)}`:"",position:"start",yAdjust:-12,padding:4,color:this.getThemeColors().averageChartLine,backgroundColor:"rgba(63,63,63,0.0)"}},averageLine:{type:"line",scaleID:t.verticalChart?"x":"y",display:t.showDatasetAverageValueLine&&this.lastAverageValue!==null,value:this.lastAverageValue??0,borderDash:[6,6],borderColor:this.getThemeColors().averageChartLine,drawTime:"afterDatasetsDraw",label:{display:t.showDatasetAverageValueLine&&this.lastAverageValue!==null,content:this.lastAverageValue!==null?`${this.lastAverageValue.toFixed(t.numDecimal??1)}`:"",position:"start",padding:4,color:this.getThemeColors().chartValue,backgroundColor:"rgba(63,63,63,0.7)"}}}},legend:{display:false},streaming:{duration:(this.dataSourceInfo?.maxDataPoints??0)*(this.dataSourceInfo?.sampleTime??0),delay:this.dataSourceInfo?.sampleTime??0,frameRate:e.timeScaleFormat==="day"?5:e.timeScaleFormat==="hour"?8:e.timeScaleFormat==="minute"?15:30}});}createDatasets(t){let e,a;t.inverseYAxis&&t.trackAgainstAverage?(e="start",a=false):t.inverseYAxis&&!t.trackAgainstAverage?(e=false,a="start"):!t.inverseYAxis&&t.trackAgainstAverage?(e=true,a=false):(e=false,a=true),this.lineChartData.datasets=[],this.lineChartData.datasets.push({label:"Value",data:[],order:t.trackAgainstAverage?1:0,parsing:false,tension:0,pointRadius:t.showDataPoints?t.trackAgainstAverage?0:1.5:0,pointHoverRadius:0,pointHitRadius:0,borderWidth:t.trackAgainstAverage||t.showDataPoints?0:3,fill:e}),t.showAverageData&&this.lineChartData.datasets.push({label:"Average",data:[],order:t.trackAgainstAverage?0:1,parsing:false,tension:.4,pointRadius:t.showDataPoints&&t.trackAgainstAverage?1.5:0,pointHoverRadius:0,pointHitRadius:0,borderWidth:t.trackAgainstAverage?t.showDataPoints?0:3:0,fill:a}),this.setDatasetsColors();}setDatasetsColors(){this.lineChartData.datasets.forEach(t=>{t.label==="Value"?(t.borderColor=this.getThemeColors().valueLine,t.backgroundColor=this.getThemeColors().valueFill):t.label==="Average"&&(t.borderColor=this.getThemeColors().averageLine,t.backgroundColor=this.getThemeColors().averageFill);});}ensureAverageDatasetPresence(){let t=this.runtime.options();if(!t||!this.chart)return;let e=this.lineChartData.datasets.some(a=>a.label==="Average");if(t.showAverageData&&!e){if(this.lineChartData.datasets.findIndex(n=>n.label==="Value")>=0){let n=t.inverseYAxis?t.trackAgainstAverage?false:"start":!t.trackAgainstAverage;this.lineChartData.datasets.push({label:"Average",data:[],order:t.trackAgainstAverage?0:1,parsing:false,tension:.4,pointRadius:0,pointHoverRadius:0,pointHitRadius:0,borderWidth:t.trackAgainstAverage?3:0,fill:n});}}else !t.showAverageData&&e&&(this.lineChartData.datasets=this.lineChartData.datasets.filter(a=>a.label!=="Average"));}applyDynamicTrackAverageStyling(){let t=this.runtime.options();if(!t)return;let e=this.lineChartData.datasets.find(l=>l.label==="Value"),a=this.lineChartData.datasets.find(l=>l.label==="Average"),n,r;t.inverseYAxis&&t.trackAgainstAverage?(n="start",r=false):t.inverseYAxis&&!t.trackAgainstAverage?(n=false,r="start"):!t.inverseYAxis&&t.trackAgainstAverage?(n=true,r=false):(n=false,r=true),e&&(e.order=t.trackAgainstAverage?1:0,e.borderWidth=t.trackAgainstAverage?0:3,e.fill=n),a&&(a.order=t.trackAgainstAverage?0:1,a.borderWidth=t.trackAgainstAverage?3:0,a.fill=r);}updateAnnotationVisibility(){let t=this.runtime.options();if(!t||!this.chart)return;let e=this.chart.options.plugins.annotation?.annotations;if(e){if(e.minimumLine){let a=t.showDatasetMinimumValueLine&&this.lastMinimumValue!==null;e.minimumLine.display=a,e.minimumLine.label&&(e.minimumLine.label.display=a);}if(e.maximumLine){let a=t.showDatasetMaximumValueLine&&this.lastMaximumValue!==null;e.maximumLine.display=a,e.maximumLine.label&&(e.maximumLine.label.display=a);}if(e.averageLine){let a=t.showDatasetAverageValueLine&&this.lastAverageValue!==null;e.averageLine.display=a,e.averageLine.label&&(e.averageLine.label.display=a);}}}getThemeColors(){let t=this.runtime.options()?.color,e={valueLine:"",valueFill:"",averageLine:"",averageFill:"",averageChartLine:"",chartLabel:"",chartValue:""};switch(t){case "contrast":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().contrastDimmer,e.valueFill=this.theme().contrastDimmer,e.averageLine=this.theme().contrast,e.averageFill=this.theme().contrast,e.chartValue=e.averageLine):(e.valueLine=this.theme().contrast,e.valueFill=this.theme().contrast,e.averageLine=this.theme().contrastDimmer,e.averageFill=this.theme().contrastDimmer,e.chartValue=this.theme().contrast),e.averageChartLine=this.theme().contrastDim,e.chartLabel=this.theme().contrastDim;break;case "blue":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().blueDimmer,e.valueFill=this.theme().blueDimmer,e.averageLine=this.theme().blue,e.averageFill=this.theme().blue,e.chartValue=e.averageLine):(e.valueLine=this.theme().blue,e.valueFill=this.theme().blue,e.averageLine=this.theme().blueDimmer,e.averageFill=this.theme().blueDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().blueDim,e.chartLabel=this.theme().contrastDim;break;case "green":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().greenDimmer,e.valueFill=this.theme().greenDimmer,e.averageLine=this.theme().green,e.averageFill=this.theme().green,e.chartValue=e.averageLine):(e.valueLine=this.theme().green,e.valueFill=this.theme().green,e.averageLine=this.theme().greenDimmer,e.averageFill=this.theme().greenDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().greenDim,e.chartLabel=this.theme().contrastDim;break;case "pink":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().pinkDimmer,e.valueFill=this.theme().pinkDimmer,e.averageLine=this.theme().pink,e.averageFill=this.theme().pink,e.chartValue=e.averageLine):(e.valueLine=this.theme().pink,e.valueFill=this.theme().pink,e.averageLine=this.theme().pinkDimmer,e.averageFill=this.theme().pinkDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().pinkDim,e.chartLabel=this.theme().contrastDim;break;case "orange":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().orangeDimmer,e.valueFill=this.theme().orangeDimmer,e.averageLine=this.theme().orange,e.averageFill=this.theme().orange,e.chartValue=e.averageLine):(e.valueLine=this.theme().orange,e.valueFill=this.theme().orange,e.averageLine=this.theme().orangeDimmer,e.averageFill=this.theme().orangeDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().orangeDim,e.chartLabel=this.theme().contrastDim;break;case "purple":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().purpleDimmer,e.valueFill=this.theme().purpleDimmer,e.averageLine=this.theme().purple,e.averageFill=this.theme().purple,e.chartValue=e.averageLine):(e.valueLine=this.theme().purple,e.valueFill=this.theme().purple,e.averageLine=this.theme().purpleDimmer,e.averageFill=this.theme().purpleDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().purpleDim,e.chartLabel=this.theme().contrastDim;break;case "grey":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().greyDimmer,e.valueFill=this.theme().greyDimmer,e.averageLine=this.theme().grey,e.averageFill=this.theme().grey,e.chartValue=e.averageLine):(e.valueLine=this.theme().grey,e.valueFill=this.theme().grey,e.averageLine=this.theme().greyDimmer,e.averageFill=this.theme().greyDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().greyDim,e.chartLabel=this.theme().contrastDim;break;case "yellow":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().yellowDimmer,e.valueFill=this.theme().yellowDimmer,e.averageLine=this.theme().yellow,e.averageFill=this.theme().yellow,e.chartValue=e.averageLine):(e.valueLine=this.theme().yellow,e.valueFill=this.theme().yellow,e.averageLine=this.theme().yellowDimmer,e.averageFill=this.theme().yellowDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().yellowDim,e.chartLabel=this.theme().contrastDim;break}return e}getUnitsLabel(){let t="",e=this.runtime.options()?.convertUnitTo??"";switch(e){case "percent":case "percentraw":t="%";break;case "latitudeMin":t="latitude in minutes";break;case "latitudeSec":t="latitude in secondes";break;case "longitudeMin":t="longitude in minutes";break;case "longitudeSec":t="longitude in secondes";break;default:t=e;break}return t}startStreaming(){let t=this.runtime.options();if(!t?.datachartPath)return;this.dsServiceSub?.unsubscribe();let e=this.dsService.getDatasetBatchThenLiveObservable(this.id());e&&(this.dsServiceSub=e.subscribe(a=>{if(this.chart){if(Array.isArray(a)){let n=this.transformDatasetRows(a,0);if(this.chart.data.datasets[0].data.push(...n),t.showAverageData&&this.lineChartData.datasets[1]){let l=t.datasetAverageArray??"sma",s=this.transformDatasetRows(a,l);this.chart.data.datasets[1].data.push(...s);}let r=a[a.length-1];r&&this.applyTitleAndAnnotationValues(r,t);}else {let n=this.transformDatasetRows([a],0)[0];if(this.chart.data.datasets[0].data.push(n),t.showAverageData&&this.lineChartData.datasets[1]){let r=t.datasetAverageArray??"sma",l=this.transformDatasetRows([a],r)[0];this.chart.data.datasets[1].data.push(l);}this.applyTitleAndAnnotationValues(a,t);}this.ngZone.runOutsideAngular(()=>this.chart?.update("none"));}}));}applyTitleAndAnnotationValues(t,e){if(!this.chart)return;let a=e.convertUnitTo??"",n=e.numDecimal??1,r=e.trackAgainstAverage?t.data.sma??t.data.value:t.data.value,l=this.unitsService.convertToUnit(a,r);if(l!=null&&Number.isFinite(l)){let y=this.chart.options.plugins;y?.title&&(y.title.text=`${l.toFixed(n)} ${this.getUnitsLabel()} `);}let s=t.data.lastAverage!=null?this.unitsService.convertToUnit(a,t.data.lastAverage)??void 0:void 0,h=t.data.lastMinimum!=null?this.unitsService.convertToUnit(a,t.data.lastMinimum)??void 0:void 0,g=t.data.lastMaximum!=null?this.unitsService.convertToUnit(a,t.data.lastMaximum)??void 0:void 0,i=this.chart.options.plugins.annotation?.annotations;i&&(this.lastAverageValue=s!=null&&Number.isFinite(s)?s:null,this.lastMinimumValue=h!=null&&Number.isFinite(h)?h:null,this.lastMaximumValue=g!=null&&Number.isFinite(g)?g:null,i.averageLine&&(this.lastAverageValue!==null?(i.averageLine.value=this.lastAverageValue,i.averageLine.display=e.showDatasetAverageValueLine,i.averageLine.label&&(i.averageLine.label.display=e.showDatasetAverageValueLine,i.averageLine.label.content=`${this.lastAverageValue.toFixed(n)}`)):(i.averageLine.display=false,i.averageLine.label&&(i.averageLine.label.display=false,i.averageLine.label.content=""))),i.minimumLine&&(this.lastMinimumValue!==null?(i.minimumLine.value=this.lastMinimumValue,i.minimumLine.display=e.showDatasetMinimumValueLine,i.minimumLine.label&&(i.minimumLine.label.display=e.showDatasetMinimumValueLine,i.minimumLine.label.content=`${this.lastMinimumValue.toFixed(n)}`)):(i.minimumLine.display=false,i.minimumLine.label&&(i.minimumLine.label.display=false,i.minimumLine.label.content=""))),i.maximumLine&&(this.lastMaximumValue!==null?(i.maximumLine.value=this.lastMaximumValue,i.maximumLine.display=e.showDatasetMaximumValueLine,i.maximumLine.label&&(i.maximumLine.label.display=e.showDatasetMaximumValueLine,i.maximumLine.label.content=`${this.lastMaximumValue.toFixed(n)}`)):(i.maximumLine.display=false,i.maximumLine.label&&(i.maximumLine.label.display=false,i.maximumLine.label.content=""))));}transformDatasetRows(t,e){let a=this.runtime.options();if(!a)return [];let n=s=>this.unitsService.convertToUnit(a.convertUnitTo??"",s)??s,r=a.verticalChart===true,l=a.datasetAverageArray;return t.map(s=>{if(r){if(e===0)return {x:n(s.data.value),y:s.timestamp};{let h={sma:s.data.sma,ema:s.data.ema,dema:s.data.doubleEma,avg:s.data.lastAverage};return {x:n(h[l]??s.data.value),y:s.timestamp}}}else {if(e===0)return {x:s.timestamp,y:n(s.data.value)};{let h={sma:s.data.sma,ema:s.data.ema,dema:s.data.doubleEma,avg:s.data.lastAverage};return {x:s.timestamp,y:n(h[l]??s.data.value)}}}})}ngOnDestroy(){this.dsServiceSub?.unsubscribe(),this.chart?.destroy();let t=this.widgetDataChart?.()?.nativeElement;this.canvasService.releaseCanvas(t,{clear:true,removeFromDom:true});}static \u0275fac=function(e){return new(e||m)};static \u0275cmp=JD({type:m,selectors:[["widget-data-chart"]],viewQuery:function(e,a){e&1&&eg(a.widgetDataChart,_,5,Lr),e&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:1,consts:[["widgetDataChart",""],[2,"z-index","inherit"],[1,"empty-state"],[1,"hint"]],template:function(e,a){e&1&&_w(0,E,2,0,"canvas",1)(1,I,5,0,"div",2),e&2&&Mw(a.hasPath()?0:1);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%}.empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;text-align:center;color:var(--mat-sys-on-surface-variant)}.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0;padding:0 16px}.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{font-size:.85em;opacity:.7}"]})};export{U as WidgetDataChartComponent};
1
+ import'./chunk-DA2JBQHi.js';import {d1 as Hj,w,du as p,dy as K,ao as ue,aZ as R,bu as ut,dw as S,$ as $j,a6 as Lr,D as Dt,F as Fa,dn as ge,b0 as Wl,J as JD,_ as _w,M as Mw,f as eg,K as Kw,cp as Uh,ci as dl,T as TT,cj as fl}from'./main-IINF7HD6.js';var _=["widgetDataChart"];function E(m,t){m&1&&Uh(0,"canvas",1,0);}function I(m,t){m&1&&(dl(0,"div",2)(1,"p"),TT(2,"Ready to configure"),fl(),dl(3,"p",3),TT(4,"Double-tap to begin"),fl()());}var U=class m{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);dsService=w(K);ngZone=w(ue);canvasService=w(R);unitsService=w(ut);datasetLifecycle=w(S);widgetDataChart=$j("widgetDataChart",{read:Lr});static DEFAULT_CONFIG={displayName:"Chart Label",color:"contrast",filterSelfPaths:true,datachartPath:null,datachartSource:null,convertUnitTo:null,timeScale:"minute",period:10,numDecimal:1,inverseYAxis:false,datasetAverageArray:"sma",showDataPoints:false,showAverageData:true,trackAgainstAverage:false,showDatasetMinimumValueLine:false,showDatasetMaximumValueLine:false,showDatasetAverageValueLine:true,showDatasetAngleAverageValueLine:false,showLabel:true,showTimeScale:false,startScaleAtZero:false,verticalChart:false,showYScale:false,yScaleSuggestedMin:void 0,yScaleSuggestedMax:void 0,enableMinMaxScaleLimit:false,yScaleMin:void 0,yScaleMax:void 0};lineChartData={datasets:[]};lineChartOptions={parsing:false,datasets:{line:{pointRadius:0,pointHoverRadius:0,tension:.4}},animations:{tension:{easing:"easeInOutCubic"}}};lineChartType="line";chart=null;dsServiceSub=null;datasetConfig=null;dataSourceInfo=null;lastVerticalChart=null;lastAverageValue=null;lastMinimumValue=null;lastMaximumValue=null;hasPath=Dt(()=>!!this.runtime.options()?.datachartPath);pathSignature=Dt(()=>{let t=this.runtime.options();if(t?.datachartPath)return [t.datachartPath,t.convertUnitTo,t.datachartSource,t.timeScale,t.period].join("|")});previousPathSignature=void 0;constructor(){Fa(()=>{let t=this.pathSignature();ge(()=>{t!==this.previousPathSignature&&ge(()=>{this.previousPathSignature=t;let e=this.runtime.options();e&&this.rebuildForDataset(e);});});}),Fa(()=>{let t=this.runtime.options(),e=this.theme();!t||!e||ge(()=>{this.lastVerticalChart!==null&&this.lastVerticalChart!==t.verticalChart?(this.lastVerticalChart=t.verticalChart??false,this.rebuildForDataset(t)):this.chart&&(this.ensureAverageDatasetPresence(),this.updateAnnotationVisibility(),this.applyDynamicTrackAverageStyling(),this.setChartOptions(t),this.setDatasetsColors(),this.ngZone.runOutsideAngular(()=>this.chart?.update("none")));});}),Fa(()=>{let t=this.runtime.options(),e=this.widgetDataChart(),a=this.hasPath();!t||!a||!e||this.chart||ge(()=>this.rebuildForDataset(t));});}rebuildForDataset(t){if(!t.datachartPath||!this.widgetDataChart()||(this.dsServiceSub?.unsubscribe(),this.lineChartData.datasets=[],this.datasetLifecycle.syncDataChartDataset(this.id(),t,this.pathSignature()),this.datasetConfig=this.dsService.getDatasetConfig(this.id())??null,this.dataSourceInfo=this.dsService.getDataSourceInfo(this.id())??null,!this.datasetConfig))return;this.createDatasets(t),this.setChartOptions(t),this.chart?.destroy();let a=this.widgetDataChart()?.nativeElement?.getContext("2d");a&&(this.chart=new Wl(a,{type:this.lineChartType,data:this.lineChartData,options:this.lineChartOptions}),this.startStreaming(),this.ngZone.runOutsideAngular(()=>this.chart?.update()));}setChartOptions(t){let e=this.datasetConfig;e&&(this.lineChartOptions.maintainAspectRatio=false,this.lineChartOptions.animation=false,this.lineChartOptions.indexAxis=t.verticalChart?"y":"x",t.verticalChart?this.lineChartOptions.scales={y:{type:"realtime",display:t.showTimeScale,position:t.verticalChart?"right":"left",suggestedMin:void 0,suggestedMax:void 0,title:{display:true,text:`Last ${e.period} ${e.timeScaleFormat}`,align:"center",color:this.getThemeColors().averageChartLine},time:{unit:e.timeScaleFormat,minUnit:"second",round:"second",displayFormats:{hour:"k:mm''",minute:"mm''",second:'ss"',millisecond:"SSS"}},ticks:{autoSkip:true,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}},x:{type:"linear",display:t.showYScale,position:t.verticalChart?"top":"bottom",suggestedMin:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMin,suggestedMax:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMax,min:t.enableMinMaxScaleLimit?t.yScaleMin:void 0,max:t.enableMinMaxScaleLimit?t.yScaleMax:void 0,beginAtZero:t.startScaleAtZero,reverse:t.inverseYAxis,title:{display:false,text:"Value Axis",align:"center",color:this.getThemeColors().averageChartLine},ticks:{maxTicksLimit:8,precision:t.numDecimal,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}}}:this.lineChartOptions.scales={x:{type:"realtime",display:t.showTimeScale,title:{display:true,text:`Last ${e.period} ${e.timeScaleFormat}`,align:"center",color:this.getThemeColors().averageChartLine},time:{unit:e.timeScaleFormat,minUnit:"second",round:"second",displayFormats:{hour:"k:mm''",minute:"mm''",second:'ss"',millisecond:"SSS"}},ticks:{autoSkip:true,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}},y:{display:t.showYScale,position:"right",suggestedMin:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMin,suggestedMax:t.enableMinMaxScaleLimit?void 0:t.yScaleSuggestedMax,min:t.enableMinMaxScaleLimit?t.yScaleMin:void 0,max:t.enableMinMaxScaleLimit?t.yScaleMax:void 0,beginAtZero:t.startScaleAtZero,reverse:t.inverseYAxis,title:{display:false,text:"Value Axis",align:"center",color:this.getThemeColors().averageChartLine},ticks:{maxTicksLimit:8,precision:t.numDecimal,color:this.getThemeColors().averageChartLine,major:{enabled:true}},grid:{display:true,color:this.theme().contrastDimmer}}},this.lineChartOptions.plugins={title:{display:true,align:"end",padding:{top:3,bottom:0},text:"",font:{size:32},color:this.getThemeColors().chartValue},subtitle:{display:t.showLabel,align:"start",padding:{top:-35,bottom:20},text:` ${t.displayName}`,font:{size:22},color:this.getThemeColors().chartLabel},annotation:{annotations:{minimumLine:{type:"line",scaleID:t.verticalChart?"x":"y",display:t.showDatasetMinimumValueLine&&this.lastMinimumValue!==null,value:this.lastMinimumValue??0,drawTime:"afterDatasetsDraw",label:{display:t.showDatasetMinimumValueLine&&this.lastMinimumValue!==null,content:this.lastMinimumValue!==null?`${this.lastMinimumValue.toFixed(t.numDecimal??1)}`:"",position:"start",yAdjust:12,padding:4,color:this.getThemeColors().averageChartLine,backgroundColor:"rgba(63,63,63,0.0)"}},maximumLine:{type:"line",scaleID:t.verticalChart?"x":"y",display:t.showDatasetMaximumValueLine&&this.lastMaximumValue!==null,value:this.lastMaximumValue??0,drawTime:"afterDatasetsDraw",label:{display:t.showDatasetMaximumValueLine&&this.lastMaximumValue!==null,content:this.lastMaximumValue!==null?`${this.lastMaximumValue.toFixed(t.numDecimal??1)}`:"",position:"start",yAdjust:-12,padding:4,color:this.getThemeColors().averageChartLine,backgroundColor:"rgba(63,63,63,0.0)"}},averageLine:{type:"line",scaleID:t.verticalChart?"x":"y",display:t.showDatasetAverageValueLine&&this.lastAverageValue!==null,value:this.lastAverageValue??0,borderDash:[6,6],borderColor:this.getThemeColors().averageChartLine,drawTime:"afterDatasetsDraw",label:{display:t.showDatasetAverageValueLine&&this.lastAverageValue!==null,content:this.lastAverageValue!==null?`${this.lastAverageValue.toFixed(t.numDecimal??1)}`:"",position:"start",padding:4,color:this.getThemeColors().chartValue,backgroundColor:"rgba(63,63,63,0.7)"}}}},legend:{display:false},streaming:{duration:(this.dataSourceInfo?.maxDataPoints??0)*(this.dataSourceInfo?.sampleTime??0),delay:this.dataSourceInfo?.sampleTime??0,frameRate:e.timeScaleFormat==="day"?5:e.timeScaleFormat==="hour"?8:e.timeScaleFormat==="minute"?15:30}});}createDatasets(t){let e,a;t.inverseYAxis&&t.trackAgainstAverage?(e="start",a=false):t.inverseYAxis&&!t.trackAgainstAverage?(e=false,a="start"):!t.inverseYAxis&&t.trackAgainstAverage?(e=true,a=false):(e=false,a=true),this.lineChartData.datasets=[],this.lineChartData.datasets.push({label:"Value",data:[],order:t.trackAgainstAverage?1:0,parsing:false,tension:0,pointRadius:t.showDataPoints?t.trackAgainstAverage?0:1.5:0,pointHoverRadius:0,pointHitRadius:0,borderWidth:t.trackAgainstAverage||t.showDataPoints?0:3,fill:e}),t.showAverageData&&this.lineChartData.datasets.push({label:"Average",data:[],order:t.trackAgainstAverage?0:1,parsing:false,tension:.4,pointRadius:t.showDataPoints&&t.trackAgainstAverage?1.5:0,pointHoverRadius:0,pointHitRadius:0,borderWidth:t.trackAgainstAverage?t.showDataPoints?0:3:0,fill:a}),this.setDatasetsColors();}setDatasetsColors(){this.lineChartData.datasets.forEach(t=>{t.label==="Value"?(t.borderColor=this.getThemeColors().valueLine,t.backgroundColor=this.getThemeColors().valueFill):t.label==="Average"&&(t.borderColor=this.getThemeColors().averageLine,t.backgroundColor=this.getThemeColors().averageFill);});}ensureAverageDatasetPresence(){let t=this.runtime.options();if(!t||!this.chart)return;let e=this.lineChartData.datasets.some(a=>a.label==="Average");if(t.showAverageData&&!e){if(this.lineChartData.datasets.findIndex(n=>n.label==="Value")>=0){let n=t.inverseYAxis?t.trackAgainstAverage?false:"start":!t.trackAgainstAverage;this.lineChartData.datasets.push({label:"Average",data:[],order:t.trackAgainstAverage?0:1,parsing:false,tension:.4,pointRadius:0,pointHoverRadius:0,pointHitRadius:0,borderWidth:t.trackAgainstAverage?3:0,fill:n});}}else !t.showAverageData&&e&&(this.lineChartData.datasets=this.lineChartData.datasets.filter(a=>a.label!=="Average"));}applyDynamicTrackAverageStyling(){let t=this.runtime.options();if(!t)return;let e=this.lineChartData.datasets.find(l=>l.label==="Value"),a=this.lineChartData.datasets.find(l=>l.label==="Average"),n,r;t.inverseYAxis&&t.trackAgainstAverage?(n="start",r=false):t.inverseYAxis&&!t.trackAgainstAverage?(n=false,r="start"):!t.inverseYAxis&&t.trackAgainstAverage?(n=true,r=false):(n=false,r=true),e&&(e.order=t.trackAgainstAverage?1:0,e.borderWidth=t.trackAgainstAverage?0:3,e.fill=n),a&&(a.order=t.trackAgainstAverage?0:1,a.borderWidth=t.trackAgainstAverage?3:0,a.fill=r);}updateAnnotationVisibility(){let t=this.runtime.options();if(!t||!this.chart)return;let e=this.chart.options.plugins.annotation?.annotations;if(e){if(e.minimumLine){let a=t.showDatasetMinimumValueLine&&this.lastMinimumValue!==null;e.minimumLine.display=a,e.minimumLine.label&&(e.minimumLine.label.display=a);}if(e.maximumLine){let a=t.showDatasetMaximumValueLine&&this.lastMaximumValue!==null;e.maximumLine.display=a,e.maximumLine.label&&(e.maximumLine.label.display=a);}if(e.averageLine){let a=t.showDatasetAverageValueLine&&this.lastAverageValue!==null;e.averageLine.display=a,e.averageLine.label&&(e.averageLine.label.display=a);}}}getThemeColors(){let t=this.runtime.options()?.color,e={valueLine:"",valueFill:"",averageLine:"",averageFill:"",averageChartLine:"",chartLabel:"",chartValue:""};switch(t){case "contrast":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().contrastDimmer,e.valueFill=this.theme().contrastDimmer,e.averageLine=this.theme().contrast,e.averageFill=this.theme().contrast,e.chartValue=e.averageLine):(e.valueLine=this.theme().contrast,e.valueFill=this.theme().contrast,e.averageLine=this.theme().contrastDimmer,e.averageFill=this.theme().contrastDimmer,e.chartValue=this.theme().contrast),e.averageChartLine=this.theme().contrastDim,e.chartLabel=this.theme().contrastDim;break;case "blue":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().blueDimmer,e.valueFill=this.theme().blueDimmer,e.averageLine=this.theme().blue,e.averageFill=this.theme().blue,e.chartValue=e.averageLine):(e.valueLine=this.theme().blue,e.valueFill=this.theme().blue,e.averageLine=this.theme().blueDimmer,e.averageFill=this.theme().blueDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().blueDim,e.chartLabel=this.theme().contrastDim;break;case "green":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().greenDimmer,e.valueFill=this.theme().greenDimmer,e.averageLine=this.theme().green,e.averageFill=this.theme().green,e.chartValue=e.averageLine):(e.valueLine=this.theme().green,e.valueFill=this.theme().green,e.averageLine=this.theme().greenDimmer,e.averageFill=this.theme().greenDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().greenDim,e.chartLabel=this.theme().contrastDim;break;case "pink":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().pinkDimmer,e.valueFill=this.theme().pinkDimmer,e.averageLine=this.theme().pink,e.averageFill=this.theme().pink,e.chartValue=e.averageLine):(e.valueLine=this.theme().pink,e.valueFill=this.theme().pink,e.averageLine=this.theme().pinkDimmer,e.averageFill=this.theme().pinkDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().pinkDim,e.chartLabel=this.theme().contrastDim;break;case "orange":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().orangeDimmer,e.valueFill=this.theme().orangeDimmer,e.averageLine=this.theme().orange,e.averageFill=this.theme().orange,e.chartValue=e.averageLine):(e.valueLine=this.theme().orange,e.valueFill=this.theme().orange,e.averageLine=this.theme().orangeDimmer,e.averageFill=this.theme().orangeDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().orangeDim,e.chartLabel=this.theme().contrastDim;break;case "purple":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().purpleDimmer,e.valueFill=this.theme().purpleDimmer,e.averageLine=this.theme().purple,e.averageFill=this.theme().purple,e.chartValue=e.averageLine):(e.valueLine=this.theme().purple,e.valueFill=this.theme().purple,e.averageLine=this.theme().purpleDimmer,e.averageFill=this.theme().purpleDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().purpleDim,e.chartLabel=this.theme().contrastDim;break;case "grey":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().greyDimmer,e.valueFill=this.theme().greyDimmer,e.averageLine=this.theme().grey,e.averageFill=this.theme().grey,e.chartValue=e.averageLine):(e.valueLine=this.theme().grey,e.valueFill=this.theme().grey,e.averageLine=this.theme().greyDimmer,e.averageFill=this.theme().greyDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().greyDim,e.chartLabel=this.theme().contrastDim;break;case "yellow":this.runtime.options()?.trackAgainstAverage?(e.valueLine=this.theme().yellowDimmer,e.valueFill=this.theme().yellowDimmer,e.averageLine=this.theme().yellow,e.averageFill=this.theme().yellow,e.chartValue=e.averageLine):(e.valueLine=this.theme().yellow,e.valueFill=this.theme().yellow,e.averageLine=this.theme().yellowDimmer,e.averageFill=this.theme().yellowDimmer,e.chartValue=e.valueFill),e.averageChartLine=this.theme().yellowDim,e.chartLabel=this.theme().contrastDim;break}return e}getUnitsLabel(){let t="",e=this.runtime.options()?.convertUnitTo??"";switch(e){case "percent":case "percentraw":t="%";break;case "latitudeMin":t="latitude in minutes";break;case "latitudeSec":t="latitude in secondes";break;case "longitudeMin":t="longitude in minutes";break;case "longitudeSec":t="longitude in secondes";break;default:t=e;break}return t}startStreaming(){let t=this.runtime.options();if(!t?.datachartPath)return;this.dsServiceSub?.unsubscribe();let e=this.dsService.getDatasetBatchThenLiveObservable(this.id());e&&(this.dsServiceSub=e.subscribe(a=>{if(this.chart){if(Array.isArray(a)){let n=this.transformDatasetRows(a,0);if(this.chart.data.datasets[0].data.push(...n),t.showAverageData&&this.lineChartData.datasets[1]){let l=t.datasetAverageArray??"sma",s=this.transformDatasetRows(a,l);this.chart.data.datasets[1].data.push(...s);}let r=a[a.length-1];r&&this.applyTitleAndAnnotationValues(r,t);}else {let n=this.transformDatasetRows([a],0)[0];if(this.chart.data.datasets[0].data.push(n),t.showAverageData&&this.lineChartData.datasets[1]){let r=t.datasetAverageArray??"sma",l=this.transformDatasetRows([a],r)[0];this.chart.data.datasets[1].data.push(l);}this.applyTitleAndAnnotationValues(a,t);}this.ngZone.runOutsideAngular(()=>this.chart?.update("none"));}}));}applyTitleAndAnnotationValues(t,e){if(!this.chart)return;let a=e.convertUnitTo??"",n=e.numDecimal??1,r=e.trackAgainstAverage?t.data.sma??t.data.value:t.data.value,l=this.unitsService.convertToUnit(a,r);if(l!=null&&Number.isFinite(l)){let y=this.chart.options.plugins;y?.title&&(y.title.text=`${l.toFixed(n)} ${this.getUnitsLabel()} `);}let s=t.data.lastAverage!=null?this.unitsService.convertToUnit(a,t.data.lastAverage)??void 0:void 0,h=t.data.lastMinimum!=null?this.unitsService.convertToUnit(a,t.data.lastMinimum)??void 0:void 0,g=t.data.lastMaximum!=null?this.unitsService.convertToUnit(a,t.data.lastMaximum)??void 0:void 0,i=this.chart.options.plugins.annotation?.annotations;i&&(this.lastAverageValue=s!=null&&Number.isFinite(s)?s:null,this.lastMinimumValue=h!=null&&Number.isFinite(h)?h:null,this.lastMaximumValue=g!=null&&Number.isFinite(g)?g:null,i.averageLine&&(this.lastAverageValue!==null?(i.averageLine.value=this.lastAverageValue,i.averageLine.display=e.showDatasetAverageValueLine,i.averageLine.label&&(i.averageLine.label.display=e.showDatasetAverageValueLine,i.averageLine.label.content=`${this.lastAverageValue.toFixed(n)}`)):(i.averageLine.display=false,i.averageLine.label&&(i.averageLine.label.display=false,i.averageLine.label.content=""))),i.minimumLine&&(this.lastMinimumValue!==null?(i.minimumLine.value=this.lastMinimumValue,i.minimumLine.display=e.showDatasetMinimumValueLine,i.minimumLine.label&&(i.minimumLine.label.display=e.showDatasetMinimumValueLine,i.minimumLine.label.content=`${this.lastMinimumValue.toFixed(n)}`)):(i.minimumLine.display=false,i.minimumLine.label&&(i.minimumLine.label.display=false,i.minimumLine.label.content=""))),i.maximumLine&&(this.lastMaximumValue!==null?(i.maximumLine.value=this.lastMaximumValue,i.maximumLine.display=e.showDatasetMaximumValueLine,i.maximumLine.label&&(i.maximumLine.label.display=e.showDatasetMaximumValueLine,i.maximumLine.label.content=`${this.lastMaximumValue.toFixed(n)}`)):(i.maximumLine.display=false,i.maximumLine.label&&(i.maximumLine.label.display=false,i.maximumLine.label.content=""))));}transformDatasetRows(t,e){let a=this.runtime.options();if(!a)return [];let n=s=>this.unitsService.convertToUnit(a.convertUnitTo??"",s)??s,r=a.verticalChart===true,l=a.datasetAverageArray;return t.map(s=>{if(r){if(e===0)return {x:n(s.data.value),y:s.timestamp};{let h={sma:s.data.sma,ema:s.data.ema,dema:s.data.doubleEma,avg:s.data.lastAverage};return {x:n(h[l]??s.data.value),y:s.timestamp}}}else {if(e===0)return {x:s.timestamp,y:n(s.data.value)};{let h={sma:s.data.sma,ema:s.data.ema,dema:s.data.doubleEma,avg:s.data.lastAverage};return {x:s.timestamp,y:n(h[l]??s.data.value)}}}})}ngOnDestroy(){this.dsServiceSub?.unsubscribe(),this.chart?.destroy();let t=this.widgetDataChart?.()?.nativeElement;this.canvasService.releaseCanvas(t,{clear:true,removeFromDom:true});}static \u0275fac=function(e){return new(e||m)};static \u0275cmp=JD({type:m,selectors:[["widget-data-chart"]],viewQuery:function(e,a){e&1&&eg(a.widgetDataChart,_,5,Lr),e&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:1,consts:[["widgetDataChart",""],[2,"z-index","inherit"],[1,"empty-state"],[1,"hint"]],template:function(e,a){e&1&&_w(0,E,2,0,"canvas",1)(1,I,5,0,"div",2),e&2&&Mw(a.hasPath()?0:1);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%}.empty-state[_ngcontent-%COMP%]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;text-align:center;color:var(--mat-sys-on-surface-variant)}.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0;padding:0 16px}.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{font-size:.85em;opacity:.7}"]})};export{U as WidgetDataChartComponent};
@@ -1 +1 @@
1
- import {g as ge$1}from'./chunk-TakPRI3t.js';import {d1 as Hj,w,du as p,C as Ff,ao as ue,bu as ut$1,G as Gi,aR as lt$1,a as G,$ as $j,v as vt$1,D as Dt,dG as rn,F as Fa,dn as ge,dH as ac,cw as z,cv as G$1,dI as cn,dJ as nc,dK as qn,dL as zn,dM as pa,J as JD,O as Op,R as Rp,y as yt$1,b as wt,cG as Ht,cH as R,cI as ee,cJ as Nt,cK as Lt,cR as zt,bg as mt$1,P as Pi,k as Qh,_ as _w,u as ul,T as TT,cn as wd,c as $h,cV as Td,cf as xh,bl as Jw,e as EE,B as Bh,an as Hh,M as Mw,s as sg,f as eg,K as Kw,aS as De,aY as xe,ab as te,aj as zm,a_ as Gp,cO as eu,aI as ms,dN as Q,h as Fw,g as qw,X as xw,Y as Aw,bp as gl,dj as Nw,d as ig,aA as gg,l as ud,m as dd,dO as fp}from'./main-YKDNK5VZ.js';import {u}from'./chunk-CCfhzpE8.js';import {c}from'./chunk-BIb-xYiS.js';var K=false,Je=250,it=600*1e3,st=500,nt=15e3,rt=["atons.urn:mrn:imo:mmsi:*","shore.basestations.urn:mrn:imo:mmsi:*","vessels.urn:mrn:imo:mmsi:*","sar.urn:mrn:imo:mmsi:*"],ot=[{prefix:"atons.urn:mrn:imo:mmsi:",type:"aton"},{prefix:"shore.basestations.urn:mrn:imo:mmsi:",type:"basestation"},{prefix:"vessels.urn:mrn:imo:mmsi:",type:"vessel"},{prefix:"sar.urn:mrn:imo:mmsi:",type:"sar"}],at="self.navigation.*",et=(()=>{class l{data=w(De);destroyRef=w(xe);tracks=new Map;contextIndex=new Map;mmsiIndex=new Map;maxTargets=st;targetTtlMs=it;targetsDirty$=new te;ownShipDirty$=new te;pendingOwnShip={};_targets=vt$1([]);_ownShip=vt$1({});_hasCollisionRiskData=vt$1(false);targets=this._targets.asReadonly();ownShip=this._ownShip.asReadonly();hasCollisionRiskData=this._hasCollisionRiskData.asReadonly();getBearingTrue(e,t){if(typeof e.latitude!="number"||typeof e.longitude!="number"||typeof t.latitude!="number"||typeof t.longitude!="number")return null;let i=e.latitude*Math.PI/180,s=t.latitude*Math.PI/180,r=(t.longitude-e.longitude)*Math.PI/180,o=Math.sin(r)*Math.cos(s),n=Math.cos(i)*Math.sin(s)-Math.sin(i)*Math.cos(s)*Math.cos(r),d=Math.atan2(o,n)*180/Math.PI;return this.wrapDegrees(d)}constructor(){zm(...rt.map(t=>this.data.subscribePathTree(t))).pipe(Gp(this.destroyRef)).subscribe(t=>this.handleAisTreeUpdate(t)),this.data.subscribePathTree(at).pipe(Gp(this.destroyRef)).subscribe(t=>this.handleOwnShipTreeUpdate(t)),this.targetsDirty$.pipe(eu(Je,void 0,{leading:true,trailing:true}),Gp(this.destroyRef)).subscribe(()=>this.flushTargetsSignal()),ms(nt).pipe(Gp(this.destroyRef)).subscribe(()=>this.evictStaleTracks(Date.now())),this.ownShipDirty$.pipe(eu(Je,void 0,{leading:true,trailing:true}),Gp(this.destroyRef)).subscribe(()=>this.flushOwnShip());}handleAisTreeUpdate(e){let t=this.matchAisContext(e.path);t&&(this.applyAisUpdate({context:t.context,type:t.type,path:t.path,value:e.update.data.value,timestampMs:this.toTimestampMs(e.update.data.timestamp)}));}handleOwnShipTreeUpdate(e){if(!e.path.startsWith("self."))return;let t=e.path.slice(5);this.applyOwnShipUpdate(t,e.update.data.value);}matchAisContext(e){for(let t of ot){if(!e.startsWith(t.prefix))continue;let i=e.indexOf(".",t.prefix.length);return i===-1?null:{context:e.slice(0,i),path:e.slice(i+1),type:t.type}}return null}applyOwnShipUpdate(e,t){let i=G$1({},this.pendingOwnShip),s=this.readPositionValue(t);switch(e){case "navigation.position":s&&(i.position=s);break;case "navigation.position.latitude":{let r=this.toNumberOrUndefined(t);if(r===void 0)return;i.position=z(G$1({},i.position??{}),{latitude:r});}break;case "navigation.position.longitude":{let r=this.toNumberOrUndefined(t);if(r===void 0)return;i.position=z(G$1({},i.position??{}),{longitude:r});}break;case "navigation.headingTrue":i.headingTrue=this.toNumberOrUndefined(t);break;case "navigation.courseOverGroundTrue":i.courseOverGroundTrue=this.toNumberOrUndefined(t);break;case "navigation.speedOverGround":i.speedOverGround=this.toNumberOrUndefined(t);break;default:return}this.pendingOwnShip=i,this.ownShipDirty$.next();}flushOwnShip(){this.ownShipChanged(this._ownShip(),this.pendingOwnShip)&&this._ownShip.set(this.pendingOwnShip);}ownShipChanged(e,t){return e.headingTrue!==t.headingTrue||e.courseOverGroundTrue!==t.courseOverGroundTrue||e.speedOverGround!==t.speedOverGround||e.position?.latitude!==t.position?.latitude||e.position?.longitude!==t.position?.longitude}applyAisUpdate(e){let t=this.resolveTrack(e);if(t){switch(t.lastUpdateAt=e.timestampMs,e.path.startsWith("navigation.closestApproach.")&&this.isVesselLike(t)&&!t.closestApproach&&(t.closestApproach={}),e.path){case "mmsi":this.applyMmsi(t,e.value);break;case "name":t.name=this.toStringOrUndefined(e.value);break;case "communication.callsignVhf":this.isVesselLike(t)&&(t.callsign=this.toStringOrUndefined(e.value));break;case "navigation.destination":case "navigation.destination.commonName":this.isVesselLike(t)&&(t.destination=this.toStringOrUndefined(e.value));break;case "navigation.destination.eta":this.isVesselLike(t)&&(t.eta=this.toStringOrUndefined(e.value));break;case "design.beam":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{beam:this.toNumberOrUndefined(e.value)}));break;case "design.length.overall":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{length:z(G$1({},t.design?.length??{}),{overall:this.toNumberOrUndefined(e.value)})}));break;case "design.length.hull":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{length:z(G$1({},t.design?.length??{}),{hull:this.toNumberOrUndefined(e.value)})}));break;case "design.length.waterline":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{length:z(G$1({},t.design?.length??{}),{waterline:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.maximum":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{maximum:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.minimum":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{minimum:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.current":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{current:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.canoe":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{canoe:this.toNumberOrUndefined(e.value)})}));break;case "registrations.imo":this.isVesselLike(t)&&(t.imo=this.toStringOrUndefined(e.value));break;case "navigation.courseOverGroundTrue":this.isVesselLike(t)&&(t.courseOverGroundTrue=this.toNumberOrUndefined(e.value));break;case "navigation.headingTrue":this.isVesselLike(t)&&(t.headingTrue=this.toNumberOrUndefined(e.value));break;case "navigation.rateOfTurn":this.isVesselLike(t)&&(t.rateOfTurn=this.toNumberOrUndefined(e.value));break;case "navigation.specialManeuver":this.isVesselLike(t)&&(t.specialManeuver=this.toStringOrUndefined(e.value));break;case "navigation.speedOverGround":this.isVesselLike(t)&&(t.speedOverGround=this.toNumberOrUndefined(e.value));break;case "navigation.state":this.isVesselLike(t)&&(t.navState=this.toStringOrUndefined(e.value));break;case "sensors.ais.class":t.ais.class=this.normalizeAisClass(e.value);break;case "sensors.ais.status":{let i=this.normalizeAisStatus(e.value);if(!i)break;if(i==="remove"){this.removeTrack(t);return}t.ais.status=i;}break;case "sensors.ais.fromBow":this.isVesselLike(t)&&(t.fromBow=this.toNumberOrUndefined(e.value));break;case "sensors.ais.fromCenter":this.isVesselLike(t)&&(t.fromCenter=this.toNumberOrUndefined(e.value));break;case "navigation.position.latitude":{let i=this.toNumberOrUndefined(e.value);if(i===void 0)break;t.position=z(G$1({},t.position??{}),{latitude:i}),t.lastPositionAt=e.timestampMs;}break;case "navigation.position.longitude":{let i=this.toNumberOrUndefined(e.value);if(i===void 0)break;t.position=z(G$1({},t.position??{}),{longitude:i}),t.lastPositionAt=e.timestampMs;}break;case "navigation.position.altitude":{let i=this.toNumberOrUndefined(e.value);t.position&&(t.position=z(G$1({},t.position),{altitude:i}));}break;case "navigation.position":{let i=this.readPositionValue(e.value);i&&(t.position=i,t.lastPositionAt=e.timestampMs);}break;case "atonType.id":this.isAton(t)&&(t.typeId=this.toNumberOrUndefined(e.value));break;case "atonType.name":this.isAton(t)&&(t.typeName=this.toStringOrUndefined(e.value));break;case "virtual":this.isAton(t)&&(t.virtual=!!e.value);break;case "offPosition":this.isAton(t)&&(t.offPosition=!!e.value);break;case "design.aisShipType.id":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{aisShipType:z(G$1({},t.design?.aisShipType??{}),{id:this.toNumberOrUndefined(e.value)})}));break;case "design.aisShipType.name":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{aisShipType:z(G$1({},t.design?.aisShipType??{}),{name:this.toStringOrUndefined(e.value)})}));break;case "navigation.closestApproach.distance":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.distance=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.timeTo":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.timeTo=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.range":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.range=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.bearing":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.bearing=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.collisionRiskRating":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.collisionRiskRating=this.toNumberOrUndefined(e.value));break}this.updateTargetsSignal();}}resolveTrack(e){let t=this.contextIndex.get(e.context),i=e.timestampMs,s=t?this.tracks.get(t):null;if(s)return s;let r=this.createTrack(e.context,e.type,i,void 0);return this.contextIndex.set(e.context,r.id),r}createTrack(e,t,i,s){let r=this.buildTrackId(s??e),o=this.buildBaseTarget(e,t,i,s,r),n;switch(t){case "vessel":n=z(G$1({},o),{type:"vessel",closestApproach:{}});break;case "sar":n=z(G$1({},o),{type:"sar",closestApproach:{}});break;case "aton":n=z(G$1({},o),{type:"aton"});break;default:n=z(G$1({},o),{type:"basestation"});break}return this.tracks.set(n.id,n),s&&this.addMmsiIndex(s,n.id),this.enforceTargetCap(),this.updateTargetsSignal(),n}buildTrackId(e){if(!this.tracks.has(e))return e;let t=1;for(;this.tracks.has(`${e}-${t}`);)t+=1;return `${e}-${t}`}applyMmsi(e,t){let i=this.toStringOrUndefined(t);if(!i)return;let s=this.getTracksByMmsi(i).filter(r=>r.id!==e.id);s.length&&(this.markConflict(i),K),e.mmsi&&e.mmsi!==i&&this.removeMmsiIndex(e.mmsi,e.id),e.mmsi=i,this.addMmsiIndex(i,e.id);}removeTrack(e){this.tracks.delete(e.id),e.mmsi&&this.removeMmsiIndex(e.mmsi,e.id);for(let[t,i]of this.contextIndex.entries())i===e.id&&this.contextIndex.delete(t);this.updateTargetsSignal();}updateTargetsSignal(){this.targetsDirty$.next();}enforceTargetCap(){for(;this.tracks.size>this.maxTargets;){let e=null;for(let t of this.tracks.values())(!e||t.lastUpdateAt<e.lastUpdateAt)&&(e=t);if(!e)break;this.removeTrack(e);}}evictStaleTracks(e){let t=e-this.targetTtlMs,i=[];for(let s of this.tracks.values())s.lastUpdateAt<t&&i.push(s);for(let s of i)this.removeTrack(s);this.enforceTargetCap();}flushTargetsSignal(){let e=Array.from(this.tracks.values()).filter(i=>!!i.mmsi||!!i.position),t=e.some(i=>{if(!this.isVesselLike(i))return false;let s=i.closestApproach??{};return Object.prototype.hasOwnProperty.call(s,"collisionRiskRating")});this._targets.set(e),this._hasCollisionRiskData.set(t);}getTracksByMmsi(e){let t=this.mmsiIndex.get(e);return t?Array.from(t).map(i=>this.tracks.get(i)).filter(i=>!!i):[]}addMmsiIndex(e,t){this.mmsiIndex.has(e)||this.mmsiIndex.set(e,new Set),this.mmsiIndex.get(e).add(t);}removeMmsiIndex(e,t){let i=this.mmsiIndex.get(e);i&&(i.delete(t),i.size||this.mmsiIndex.delete(e));}markConflict(e){let t=this.getTracksByMmsi(e);for(let i of t)i.conflicted=true;}normalizeAisClass(e){let t=typeof e=="string"?e.toUpperCase():"";if(t==="A")return "A";if(t==="B")return "B"}normalizeAisStatus(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="unconfirmed"||t==="confirmed"||t==="lost"||t==="remove")return t}toTimestampMs(e){if(!e)return Date.now();let t=e instanceof Date?e.getTime():Date.parse(e);return Number.isFinite(t)?t:Date.now()}toNumberOrUndefined(e){let t=Number(e);return Number.isFinite(t)?t:void 0}toStringOrUndefined(e){if(e==null)return;let t=String(e).trim();return t.length?t:void 0}wrapDegrees(e){let t=e%360;return t<0?t+360:t}buildBaseTarget(e,t,i,s,r){return {id:r,context:e,type:t,ais:{class:void 0,status:"unconfirmed"},conflicted:false,mmsi:s,position:void 0,lastUpdateAt:i,lastPositionAt:void 0}}isVesselLike(e){return e.type==="vessel"||e.type==="sar"}isAton(e){return e.type==="aton"}readPositionValue(e){if(!e||typeof e!="object")return;let t=this.toNumberOrUndefined(e.latitude),i=this.toNumberOrUndefined(e.longitude);if(t===void 0||i===void 0)return;let s=this.toNumberOrUndefined(e.altitude);return {latitude:t,longitude:i,altitude:s}}static \u0275fac=function(t){return new(t||l)};static \u0275prov=Q({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();var lt=["radarSvg"],ct=["menuAnchor"],dt=["menuTrigger"],ht=(l,I)=>I.id;function ut(l,I){l&1&&(wd(),Pi(0,"svg",7),$h(1,"path",17),Pi(2,"text",18),TT(3,"N"),ul()());}function mt(l,I){l&1&&(wd(),Pi(0,"svg",7),$h(1,"path",19),ul());}function gt(l,I){if(l&1){let e=Fw();Pi(0,"button",20),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("noCollisionRisk"))}),Pi(1,"mat-icon"),TT(2,"security"),ul()();}if(l&2){let e=qw();sg("is-active",e.isFilterEnabled("noCollisionRisk"));}}function pt(l,I){if(l&1){let e=Fw();Pi(0,"button",22),Qh("click",function(){let i=ud(e).$implicit,s=qw(2);return dd(s.onMenuItemSelect(i))}),$h(1,"img",23),Pi(2,"span",24),TT(3),ul()();}if(l&2){let e=I.$implicit;EE(),ig("visibility",e.iconHref?"visible":"hidden"),Hh("src",e.iconHref??null,fp),EE(2),gg(e.label);}}function ft(l,I){if(l&1&&xw(0,pt,4,4,"button",21,ht),l&2){let e=qw();Aw(e.menuItems());}}function St(l,I){if(l&1){let e=Fw();Pi(0,"button",25),TT(1,"Filter Targets"),ul(),Pi(2,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("anchoredMoored"))}),Pi(3,"mat-icon",27),TT(4),ul(),Pi(5,"span"),TT(6,"Anchored/Moored"),ul()(),Pi(7,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("allAton"))}),Pi(8,"mat-icon",27),TT(9),ul(),Pi(10,"span"),TT(11,"All AtoN"),ul()(),Pi(12,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("allButSar"))}),Pi(13,"mat-icon",27),TT(14),ul(),Pi(15,"span"),TT(16,"All but SAR"),ul()(),Pi(17,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("allVessels"))}),Pi(18,"mat-icon",27),TT(19),ul(),Pi(20,"span"),TT(21,"All Vessels"),ul()(),Pi(22,"button",28)(23,"span"),TT(24,"Vessel Type"),ul(),Pi(25,"mat-icon"),TT(26,"chevron_right"),ul()();}if(l&2){let e=qw(),t=Jw(26);EE(4),gl(" ",e.isFilterEnabled("anchoredMoored")?"check_box":"check_box_outline_blank"," "),EE(5),gl(" ",e.isFilterEnabled("allAton")?"check_box":"check_box_outline_blank"," "),EE(5),gl(" ",e.isFilterEnabled("allButSar")?"check_box":"check_box_outline_blank"," "),EE(5),gl(" ",e.isFilterEnabled("allVessels")?"check_box":"check_box_outline_blank"," "),EE(3),Bh("matMenuTriggerFor",t);}}function vt(l,I){if(l&1){let e=Fw();Pi(0,"button",26),Qh("click",function(){let i=ud(e).$implicit,s=qw(2);return dd(s.toggleVesselTypeFilter(i))}),Pi(1,"mat-icon",27),TT(2),ul(),Pi(3,"span"),TT(4),ul()();}if(l&2){let e=I.$implicit,t=qw(2);EE(2),gl(" ",t.isVesselTypeFilterEnabled(e)?"check_box":"check_box_outline_blank"," "),EE(2),gg(t.formatVesselTypeLabel(e));}}function bt(l,I){if(l&1&&xw(0,vt,5,2,"button",29,Nw),l&2){let e=qw();Aw(e.vesselTypeFilters);}}function yt(l,I){l&1&&$h(0,"div",16);}var Qt=(()=>{class l{static TARGET_ICON_SIZE_PX=16;static OWN_SHIP_ICON_SIZE_PX=84;static HIT_RADIUS_PX=28;static ICON_RENDER_DEBOUNCE_MS=50;static ROTATION_SETTLE_DEADBAND_DEG=1;static ROTATION_ONLY_FRAME_MS=33;id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);ais=w(et);dialog=w(Ff);ngZone=w(ue);units=w(ut$1);settings=w(Gi);toast=w(lt$1);dashboard=w(G);static DEFAULT_CONFIG={filterSelfPaths:false,enableTimeout:false,dataTimeout:5,ais:{filters:{anchoredMoored:false,noCollisionRisk:false,allAton:false,allButSar:false,allVessels:false,vesselTypes:[]},viewMode:"course-up",rangeRings:[1,3,6,12,24,48],rangeIndex:"3",showCogVectors:true,cogVectorsMinutes:10,showLostTargets:true,showUnconfirmedTargets:true,showSelf:true},color:"grey"};svgRef=$j.required("radarSvg");menuAnchorRef=$j.required("menuAnchor");menuTrigger=$j.required("menuTrigger");hostSize=vt$1(null);renderState=null;selectedId=vt$1(null);localViewMode=vt$1(null);localRangeIndex=vt$1(null);effectiveViewMode=Dt(()=>this.localViewMode()??this.runtime.options()?.ais?.viewMode??"course-up");effectiveRangeIndex=Dt(()=>{let e=this.resolveRangeIndex(this.runtime.options()?.ais),t=this.runtime.options()?.ais?.rangeRings??[3,6,12,24,48],i=Math.max(0,t.length-1),s=this.localRangeIndex()??e;return Math.min(Math.max(s,0),i)});svg;root;ringsLayer;rotationGroup;vectorsLayer;targetsLayer;selectedLayer;ownShipLayer;viewRotationSmoothed=null;lastRotationAt=null;lastViewRotation=0;hasRenderedOnce=false;renderFrame=null;rotationFrameTimer=null;iconRenderTimer=null;iconCache=new Map;targetCache=new Map;lastOriginKey=null;ringCache=null;ownShipIconHref=null;menuItems=vt$1([]);menuPoint=null;lastRenderTargets=[];lastRenderScale=1;lastRenderSize=null;hitRadiusPx=l.HIT_RADIUS_PX;lastFiltersSignature=null;lastRenderSignature=null;ownShipVectorCache=null;filterState=vt$1({anchoredMoored:false,noCollisionRisk:false,allAton:false,allButSar:false,allVessels:false,vesselTypes:new Set});vesselTypeFilters=rn.filter(e=>e!=="vessel/self"&&e!=="vessel/unknown"&&e!=="vessel/spare");hasActiveFilters=Dt(()=>{let e=this.filterState();return e.anchoredMoored||e.allAton||e.allButSar||e.allVessels||e.vesselTypes.size>0});hasCollisionRiskData=this.ais.hasCollisionRiskData;constructor(){this.warnIfRemoteDataDisabled(),this.loadOwnShipIcon(),Fa(()=>{let e=this.hostSize(),t=this.runtime.options(),i=this.theme(),s=this.ais.targets(),r=this.ais.ownShip();!e||!t||!i||(ge(()=>{this.renderState={size:e,cfg:t,theme:i,targets:s,ownShip:r},this.syncFiltersFromConfig(t);}),this.scheduleRender());}),Fa(()=>{this.localViewMode(),this.localRangeIndex(),this.selectedId(),this.filterState(),ge(()=>{this.scheduleRender();});});}warnIfRemoteDataDisabled(){this.settings.signalKSubscribeAll||this.toast.show('AIS data is disabled in your connection. To see radar targets, go to Settings -> Options -> Connectivity, enable "Subscribe to remote sources messages", then reconnect.',0,false,"warn");}loadOwnShipIcon(){this.ngZone.runOutsideAngular(()=>{ac().then(e=>{this.ownShipIconHref=e,this.scheduleRenderDebounced();});});}ngAfterViewInit(){this.initSvg(),this.scheduleRender();}onResized(e){this.hostSize.set({width:e.width,height:e.height});}initSvg(){this.svg=ge$1(this.svgRef().nativeElement),this.svg.attr("class","ais-radar"),this.root=this.svg.append("g").attr("class","radar-root"),this.ringsLayer=this.root.append("g").attr("class","radar-rings"),this.rotationGroup=this.root.append("g").attr("class","radar-rotation"),this.vectorsLayer=this.rotationGroup.append("g").attr("class","radar-vectors"),this.targetsLayer=this.rotationGroup.append("g").attr("class","radar-targets"),this.selectedLayer=this.rotationGroup.append("g").attr("class","radar-selected"),this.ownShipLayer=this.root.append("g").attr("class","radar-ownship-layer"),this.svg.on("click",()=>{this.selectedId.set(null),this.closeTargetMenu();});}scheduleRender(){this.renderFrame===null&&this.ngZone.runOutsideAngular(()=>{this.renderFrame=requestAnimationFrame(()=>{this.renderFrame=null,this.render();});});}scheduleRenderDebounced(){this.iconRenderTimer===null&&this.ngZone.runOutsideAngular(()=>{this.iconRenderTimer=window.setTimeout(()=>{this.iconRenderTimer=null,this.scheduleRender();},l.ICON_RENDER_DEBOUNCE_MS);});}scheduleRotationOnlyRender(){this.rotationFrameTimer!==null||this.renderFrame!==null||this.ngZone.runOutsideAngular(()=>{this.rotationFrameTimer=window.setTimeout(()=>{this.rotationFrameTimer=null,this.scheduleRender();},l.ROTATION_ONLY_FRAME_MS);});}render(){if(!this.renderState||!this.svg||!this.root||!this.rotationGroup)return;let{size:e,cfg:t,theme:i,targets:s,ownShip:r}=this.renderState,o=Math.max(1,e.width),n=Math.max(1,e.height),d=Math.min(o,n)/2,u=(Math.min(o,n)-35)/Math.min(o,n),b=Math.hypot(o,n)/2/u,c$1=t.ais??{},T=c$1.rangeRings?.length?c$1.rangeRings:[3,6,12,24,48],x=this.effectiveRangeIndex(),a=T[x]??T[0],M=this.resolveRingCountForRange(a),S=this.localViewMode()??c$1.viewMode??"course-up",_=this.toDegreesIfRadians(r.courseOverGroundTrue),C=this.toDegreesIfRadians(r.headingTrue),V=_!==null||C!==null,m=S==="course-up"?_??C??0:0,B=this.viewRotationSmoothed!==null&&Math.abs(this.shortestAngleDelta(this.viewRotationSmoothed,m))<=l.ROTATION_SETTLE_DEADBAND_DEG,$=this.buildFilterStateSignature(this.filterState()),U=r.position?`${r.position.latitude},${r.position.longitude}`:"none",F={sizeKey:`${o}x${n}`,viewMode:S,rangeIndex:x,rangesKey:T.join(","),showSelf:c$1.showSelf??true,showCogVectors:c$1.showCogVectors??true,showLostTargets:c$1.showLostTargets??true,showUnconfirmedTargets:c$1.showUnconfirmedTargets??true,filtersKey:$,selectedId:this.selectedId(),targetsRef:s,ownPosKey:U,themeRef:i,color:t.color},L=!this.lastRenderSignature||!this.signaturesEqual(this.lastRenderSignature,F);if(!L&&B&&this.hasRenderedOnce)return;this.lastRenderSignature=F;let v=S==="course-up"&&V?this.smoothRotation(m):0,te=S==="course-up"?Math.abs(this.shortestAngleDelta(v,m)):0;this.lastViewRotation=v,this.svg.attr("viewBox",`${-o/2} ${-n/2} ${o} ${n}`),this.root.attr("transform",`scale(${u})`),this.rotationGroup.attr("transform",`rotate(${this.wrapDegrees(-v)})`);let me=this.wrapDegrees((_??C??0)-v);if(L){let ie=c(t.color??"contrast",i).dim;this.renderRings(M,a,d,b,v,u,c$1.showSelf??true,me,ie);}if(this.ownShipLayer?.select("g.radar-ownship").attr("transform",`rotate(${me})`),r.position&&this.hasValidPosition(r.position)&&(this.renderOwnShipVector(r,a,d,v,c$1),L)){let ie=b/d*a,W=this.buildTargets(s,r.position,a,ie,d,0,c$1);this.lastRenderTargets=W,this.lastRenderScale=u,this.lastRenderSize=e,this.renderTargetVectors(W,a,d,0,c$1),this.renderTargets(W,u),this.renderSelected(W,u);}this.raiseOwnshipAndVector(),this.hasRenderedOnce=true,te>l.ROTATION_SETTLE_DEADBAND_DEG&&(L?this.scheduleRender():this.scheduleRotationOnlyRender());}signaturesEqual(e,t){return e.sizeKey===t.sizeKey&&e.viewMode===t.viewMode&&e.rangeIndex===t.rangeIndex&&e.rangesKey===t.rangesKey&&e.showSelf===t.showSelf&&e.showCogVectors===t.showCogVectors&&e.showLostTargets===t.showLostTargets&&e.showUnconfirmedTargets===t.showUnconfirmedTargets&&e.filtersKey===t.filtersKey&&e.selectedId===t.selectedId&&e.targetsRef===t.targetsRef&&e.ownPosKey===t.ownPosKey&&e.themeRef===t.themeRef&&e.color===t.color}renderRings(e,t,i,s,r,o,n,d,u){if(!this.ringsLayer)return;let b=`${t.toFixed(3)}|${i.toFixed(3)}|${s.toFixed(3)}|${e}`;if(!this.ringCache||this.ringCache.key!==b){let m=t/Math.max(1,e),B=s/i*t,$=[];for(let v=m;v<=B+1e-6;v+=m)$.push(v);let U=$.map(v=>({value:v,radius:v/t*i})).filter(v=>v.radius<=s+1e-6),F=20,L=U.flatMap(v=>[{key:`${v.value}-top`,value:v.value,x:0,y:-v.radius+F},{key:`${v.value}-bottom`,value:v.value,x:0,y:v.radius-F}]);this.ringCache={key:b,rings:U,labels:L};}let c=this.ringCache;if(!c)return;let T=c.rings,x=this.ringsLayer.selectAll("circle.ring").data(T,m=>m.value.toString());x.enter().append("circle").attr("class","ring").merge(x).attr("r",m=>m.radius).attr("stroke",u),x.exit().remove();let a=c.labels,M=this.ringsLayer.selectAll("text.ring-label").data(a,m=>m.key);M.enter().append("text").attr("class","ring-label").merge(M).attr("x",m=>m.x).attr("y",m=>m.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(m=>`${m.value}`),M.exit().remove();let S=this.ringsLayer.selectAll("circle.radar-center").data(n?[]:[{r:Math.max(3,i*.01)}]);S.enter().append("circle").attr("class","radar-center").merge(S).attr("cx",0).attr("cy",0).attr("r",m=>m.r).attr("fill",u),S.exit().remove();let _=this.ownShipLayer.selectAll("g.radar-ownship").data(n?[{size:this.resolveOwnShipBaseSize(o)}]:[]),C=_.enter().append("g").attr("class","radar-ownship");C.append("image").attr("class","ownship-icon").attr("href",this.ownShipIconHref??null).attr("xlink:href",this.ownShipIconHref??null);let V=C.merge(_);V.attr("transform",`rotate(${d})`),V.select("image.ownship-icon").attr("href",this.ownShipIconHref??null).attr("xlink:href",this.ownShipIconHref??null).attr("display",this.ownShipIconHref?null:"none").attr("width",m=>m.size).attr("height",m=>m.size).attr("x",m=>-m.size/2).attr("y",m=>-m.size/2),_.exit().remove();}toggleViewMode(){let e=this.localViewMode()??this.runtime.options()?.ais?.viewMode??"course-up";this.localViewMode.set(e==="course-up"?"north-up":"course-up");}incrementRange(){this.localRangeIndex.set(Math.max(this.effectiveRangeIndex()-1,0));}decrementRange(){let e=this.runtime.options()?.ais?.rangeRings??[3,6,12,24,48],t=Math.max(0,e.length-1);this.localRangeIndex.set(Math.min(this.effectiveRangeIndex()+1,t));}toggleFilter(e){this.filterState.update(t=>z(G$1({},t),{[e]:!t[e]}));}toggleVesselTypeFilter(e){this.filterState.update(t=>{let i=new Set(t.vesselTypes);return i.has(e)?i.delete(e):i.add(e),z(G$1({},t),{vesselTypes:i})});}isFilterEnabled(e){return this.filterState()[e]}isVesselTypeFilterEnabled(e){return this.filterState().vesselTypes.has(e)}formatVesselTypeLabel(e){let t=e.replace("vessel/","");switch(t){case "pleasurecraft":return "Pleasure Craft";case "highspeed":return "High Speed";case "sar":return "SAR";case "law":return "Law Enforcement";default:return `${t.charAt(0).toUpperCase()}${t.slice(1)}`}}syncFiltersFromConfig(e){let t=e.ais?.filters;if(!t)return;let i=this.buildFilterSignature(t);i!==this.lastFiltersSignature&&(this.lastFiltersSignature=i,this.filterState.set({anchoredMoored:t.anchoredMoored??false,noCollisionRisk:t.noCollisionRisk??false,allAton:t.allAton??false,allButSar:t.allButSar??false,allVessels:t.allVessels??false,vesselTypes:new Set(t.vesselTypes??[])}));}buildFilterSignature(e){let t=[...e?.vesselTypes??[]].sort();return JSON.stringify({anchoredMoored:e?.anchoredMoored??false,noCollisionRisk:e?.noCollisionRisk??false,allAton:e?.allAton??false,allButSar:e?.allButSar??false,allVessels:e?.allVessels??false,vesselTypes:t})}buildFilterStateSignature(e){let t=[...e.vesselTypes].sort();return JSON.stringify({anchoredMoored:e.anchoredMoored,noCollisionRisk:e.noCollisionRisk,allAton:e.allAton,allButSar:e.allButSar,allVessels:e.allVessels,vesselTypes:t})}resolveRingCountForRange(e){return [3].find(i=>this.isNiceStep(e/i))??4}isNiceStep(e){return [.5,1,2,2.5,3,4,5,6,8,10,12,15,20,25].some(i=>Math.abs(e-i)<1e-6)}resolveRangeIndex(e){return e?Number(e.rangeIndex):0}buildTargets(e,t,i,s,r,o,n){let d=n.showLostTargets??true,u=n.showUnconfirmedTargets??true,b=`${t.latitude?.toFixed(6)}|${t.longitude?.toFixed(6)}`;this.lastOriginKey!==b&&(this.targetCache.clear(),this.lastOriginKey=b);let c=new Set;for(let a of e)c.add(a.id);for(let a of this.targetCache.keys())c.has(a)||this.targetCache.delete(a);for(let a of this.iconCache.keys())c.has(a)||this.iconCache.delete(a);let T=[];for(let a of e)a.ais.status==="remove"&&(this.targetCache.delete(a.id),this.iconCache.delete(a.id),this.selectedId()===a.id&&this.selectedId.set(null));let x=e.filter(a=>a.ais.status==="remove"||a.ais.status==="lost"&&!d||a.ais.status==="unconfirmed"&&!u||!a.position||!this.hasValidPosition(a.position)?false:!this.shouldFilterTarget(a));for(let a of x){let M=this.buildTrackSignature(a),S=this.targetCache.get(a.id);if(!S||S.signature!==M){let F=this.distanceNm(t,a.position),L=this.ais.getBearingTrue(t,a.position)??0,v=this.toDegreesIfRadians(this.isVesselLike(a)?a.headingTrue:null),te=this.toDegreesIfRadians(this.isVesselLike(a)?a.courseOverGroundTrue:null);S={signature:M,distanceNm:F,bearing:L,trackHeading:v,trackCog:te},this.targetCache.set(a.id,S);}if(S.distanceNm>s)continue;let{href:_,scale:C}=this.resolveIconCached(a),V=this.wrapDegrees(S.bearing-o),{x:m,y:B}=this.polarToCartesian(V,S.distanceNm,i,r),$=a.type==="aton"||a.type==="basestation"?0:this.wrapDegrees((S.trackHeading??S.trackCog??0)-o),U=this.buildClassName({id:a.id,status:a.ais.status,aisClass:a.ais.class,type:a.type,navState:this.isVesselLike(a)?a.navState:void 0});T.push({id:a.id,raw:a,x:m,y:B,heading:$,status:a.ais.status,aisClass:a.ais.class,type:a.type,iconHref:_,iconScale:C,navState:this.isVesselLike(a)?a.navState:void 0,sog:this.isVesselLike(a)?a.speedOverGround:void 0,cog:S.trackCog??null,className:U});}return T}renderTargetVectors(e,t,i,s,r){if(!this.vectorsLayer)return;let o=r.showCogVectors??true,n=Math.max(6,i*.04),d=(r.cogVectorsMinutes??5)*60,u=n*.8,b=[];for(let c of e)if(this.isVesselLike(c.raw)&&!this.isStationaryNavState(c.raw.navState)&&o&&typeof c.sog=="number"&&typeof c.cog=="number"){let T=this.wrapDegrees(c.cog-s),x=this.offsetPoint(c.x,c.y,T,u),a=c.sog*d/1852,M=Math.max(0,a/t*i-u);if(M<=0)continue;let S=this.offsetPoint(x.x,x.y,T,M),_=this.resolveTargetVectorStroke(c.raw);b.push({id:c.id,x1:x.x,y1:x.y,x2:S.x,y2:S.y,className:c.className,stroke:_});}this.renderVectorLines(this.vectorsLayer,"motion-vector",b);}renderOwnShipVector(e,t,i,s,r){if(!this.ownShipLayer)return;let o=Math.max(6,i*.04),n=(r.cogVectorsMinutes??5)*60,d=o*.8,u=[];if(!(r.showSelf??true)){this.ownShipVectorCache=null,this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);return}let c=this.toDegreesIfRadians(e.courseOverGroundTrue),T=e.speedOverGround;if(c===null||typeof T!="number"){this.ownShipVectorCache=null,this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);return}let x=T*n/1852,a=Math.max(0,x/t*i-d);if(a<=0){this.ownShipVectorCache=null,this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);return}let M=[c.toFixed(6),T.toFixed(6),t.toFixed(6),i.toFixed(6),n,d.toFixed(6)].join("|");if(!this.ownShipVectorCache||this.ownShipVectorCache.key!==M){let C=this.wrapDegrees(c),V=this.offsetPoint(0,0,C,d),m=this.offsetPoint(V.x,V.y,C,a);this.ownShipVectorCache={key:M,tipX:V.x,tipY:V.y,endX:m.x,endY:m.y};}let S=this.rotatePoint(this.ownShipVectorCache.tipX,this.ownShipVectorCache.tipY,-s),_=this.rotatePoint(this.ownShipVectorCache.endX,this.ownShipVectorCache.endY,-s);u.push({id:"ownship",x1:S.x,y1:S.y,x2:_.x,y2:_.y,className:"ownship-vector",stroke:"var(--kip-orange-color)"}),this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);}rotatePoint(e,t,i){let s=i*Math.PI/180,r=Math.cos(s),o=Math.sin(s);return {x:e*r-t*o,y:e*o+t*r}}renderVectorLines(e,t,i){let s=e.selectAll(`line.${t}`).data(i,o=>o.id);s.enter().append("line").attr("class",o=>`${t} ${o.className}`).merge(s).attr("x1",o=>o.x1).attr("y1",o=>o.y1).attr("x2",o=>o.x2).attr("y2",o=>o.y2).style("stroke",o=>o.stroke??"#50505f").style("stroke-width",2).style("opacity",1).style("stroke-dasharray","15, 7"),s.exit().remove();let r=e.selectAll(`circle.${t}-tip`).data(i,o=>o.id);r.enter().append("circle").attr("class",o=>`${t}-tip ${o.className}`).merge(r).attr("cx",o=>o.x2).attr("cy",o=>o.y2).attr("r",2.5).style("fill",o=>o.stroke??"#50505f").style("stroke",o=>o.stroke??"#50505f").style("stroke-width",2).style("opacity",1).style("stroke-dasharray","15, 7"),r.exit().remove();}renderTargets(e,t){if(!this.targetsLayer)return;let i=this.resolveTargetBaseSize(t),s=this.targetsLayer.selectAll("g.target").data(e,n=>n.id),r=s.enter().append("g").on("click",(n,d)=>{n.stopPropagation(),this.handleTargetClick(n,d);});r.append("image").attr("class","target-icon"),r.append("title");let o=r.merge(s);o.attr("transform",n=>`translate(${n.x}, ${n.y}) rotate(${n.heading})`).attr("class",n=>`target ${n.className}`),o.select("image.target-icon").attr("href",n=>n.iconHref??null).attr("xlink:href",n=>n.iconHref??null).attr("display",n=>n.iconHref?null:"none").attr("width",n=>i*n.iconScale).attr("height",n=>i*n.iconScale).attr("x",n=>-(i*n.iconScale)/2).attr("y",n=>-(i*n.iconScale)/2),o.select("title").text(n=>`${n.raw.name??n.raw.mmsi??"AIS Target"}`),s.exit().remove();}renderSelected(e,t){if(!this.selectedLayer)return;let i=e.filter(u=>u.id===this.selectedId()),s=this.resolveTargetBaseSize(t),r=s*1.4,o=Math.min(r,Math.max(4,s*.6)),n=this.buildCornerBoxPath(r,o),d=this.selectedLayer.selectAll("path.selected-ring").data(i,u=>u.id);d.enter().append("path").attr("class","selected-ring").merge(d).attr("transform",u=>`translate(${u.x}, ${u.y})`).attr("d",n),d.exit().remove();}resolveTargetBaseSize(e){let t=Math.max(.2,e);return l.TARGET_ICON_SIZE_PX/t}resolveOwnShipBaseSize(e){let t=Math.max(.2,e);return l.OWN_SHIP_ICON_SIZE_PX/t}raiseOwnshipAndVector(){this.ownShipLayer?.raise();}onMenuItemSelect(e){this.openTargetDialog(e.target,e.iconHref),this.selectedId.set(null),this.closeTargetMenu();}handleTargetClick(e,t){let i=this.resolveMenuItems(e,t);if(i.length<=1){this.openTargetDialog(t.raw,t.iconHref);return}this.menuItems.set(i),this.menuPoint=this.resolveMenuPoint(e),this.positionMenuAnchor(),this.menuTrigger().openMenu();}openTargetDialog(e,t){this.selectedId.set(e.id);let i=this.snapshotAisTrack(e);this.dialog.openAisDetailDialog({title:this.buildTargetTitle(i),iconHref:t??void 0,component:"ais-target",componentType:cn,payload:{target:i}}).subscribe();}snapshotAisTrack(e){return structuredClone(e)}resolveMenuItems(e,t){return this.findTargetsNearEvent(e,t).map(s=>({id:s.id,label:this.buildTargetMenuLabel(s.raw),iconHref:s.iconHref,target:s.raw}))}findTargetsNearEvent(e,t){let i=this.lastRenderTargets.length?this.lastRenderTargets:[t],s=this.eventToRadarPoint(e);if(!s)return [t];let r=this.hitRadiusPx/this.lastRenderScale,o=i.map((n,d)=>{let u=n.x-s.x,b=n.y-s.y,c=Math.hypot(u,b);return {candidate:n,distance:c,index:d}}).filter(n=>n.distance<=r).sort((n,d)=>n.distance-d.distance||n.index-d.index).map(n=>n.candidate);return o.length?o:[t]}eventToRadarPoint(e){if(!this.lastRenderSize)return null;let s=this.svgRef().nativeElement.getBoundingClientRect(),r=e.clientX-s.left,o=e.clientY-s.top,n=(r-s.width/2)/this.lastRenderScale,d=(o-s.height/2)/this.lastRenderScale,u=this.lastViewRotation*Math.PI/180,b=Math.cos(u),c=Math.sin(u);return {x:n*b-d*c,y:n*c+d*b}}resolveMenuPoint(e){let t=this.svgRef().nativeElement.closest(".ais-radar-container");if(!t)return null;let i=t.getBoundingClientRect();return {x:e.clientX-i.left,y:e.clientY-i.top}}positionMenuAnchor(){let e=this.menuAnchorRef().nativeElement;this.menuPoint&&(e.style.left=`${this.menuPoint.x}px`,e.style.top=`${this.menuPoint.y}px`);}closeTargetMenu(){this.resetTargetMenuState(),this.menuTrigger().menuOpen&&this.menuTrigger().closeMenu();}resetTargetMenuState(){this.menuItems.set([]),this.menuPoint=null;}buildTargetMenuLabel(e){return this.isAton(e)&&e.typeName?e.typeName:e.name??e.mmsi??"AIS Target"}buildTargetTitle(e){let t=this.isAton(e)&&e.typeName?e.typeName:e.name??e.type??"AIS Target",i=e.ais.status;return i==="unconfirmed"||i==="lost"||i==="remove"?`${t} - ${i}`:t}resolveIconCached(e){let t=this.buildIconSignature(e),i=this.iconCache.get(e.id);if(i&&i.signature===t)return i.icon;let s=this.resolveIconScale(e.type),r={href:i?.icon.href??null,scale:s};this.iconCache.set(e.id,{signature:t,icon:r});let o=e.ais.status==="remove"?void 0:e.ais.status;return this.ngZone.runOutsideAngular(()=>{nc({mmsi:e.mmsi??"",type:e.type,navState:this.isVesselLike(e)?e.navState:void 0,aisShipTypeId:this.isVesselLike(e)?e.design?.aisShipType?.id:void 0,atonVirtual:this.isAton(e)?e.virtual:void 0,atonTypeId:this.isAton(e)?e.typeId:void 0,status:o,collisionRiskRating:this.isVesselLike(e)?e.closestApproach?.collisionRiskRating:void 0}).then(n=>{let d=this.iconCache.get(e.id);!d||d.signature!==t||(d.icon={href:n,scale:s},this.scheduleRenderDebounced());});}),r}resolveIconScale(e){switch(e){case "aton":return 3.5;case "basestation":return 3;case "sar":return 2.4;case "vessel":return 3;default:return 2.4}}buildIconSignature(e){let t=e.ais.status==="lost"?"unconfirmed":e.ais.status;return [e.mmsi,e.type,this.isVesselLike(e)?e.navState:void 0,this.isVesselLike(e)?e.design?.aisShipType?.id:void 0,this.isAton(e)?e.virtual:void 0,this.isAton(e)?e.typeId:void 0,t,this.isVesselLike(e)?e.closestApproach?.collisionRiskRating:void 0].join("|")}buildClassName(e){let t=[`status-${e.status}`,`type-${e.type}`,e.aisClass?`class-${e.aisClass.toLowerCase()}`:"class-unknown"];if(e.navState){let i=e.navState.toLowerCase();i.includes("moored")&&t.push("state-moored"),i.includes("anchored")&&t.push("state-anchored");}return e.id===this.selectedId()&&t.push("is-selected"),t.join(" ")}resolveTargetVectorStroke(e){if(e.ais.status!=="confirmed")return "#50505f";let t=e.closestApproach?.collisionRiskRating,i=typeof t=="number"?t:Number(t);return Number.isFinite(i)?i<qn?"red":i<zn?"yellow":"#50505f":"#50505f"}shouldFilterTarget(e){let t=this.filterState();if(!t.anchoredMoored&&!t.noCollisionRisk&&!t.allAton&&!t.allButSar&&!t.allVessels&&t.vesselTypes.size===0)return false;if(t.anchoredMoored&&this.isVesselLike(e)&&this.isStationaryNavState(e.navState)||t.noCollisionRisk&&this.isVesselLike(e)&&(e.ais.status!=="confirmed"||this.isStationaryNavState(e.navState)||this.isNoCollisionRisk(e))||t.allAton&&e.type==="aton"||t.allButSar&&e.type!=="sar"||t.allVessels&&this.isVesselLike(e))return true;if(t.vesselTypes.size>0&&this.isVesselLike(e)){let i=this.resolveVesselIconKey(e);if(i&&t.vesselTypes.has(i))return true}return false}isNoCollisionRisk(e){let t=e.closestApproach?.collisionRiskRating;if(!Object.prototype.hasOwnProperty.call(e.closestApproach??{},"collisionRiskRating"))return false;if(t==null)return true;let i=typeof t=="number"?t:Number(t);return Number.isFinite(i)?i>=zn:true}resolveVesselIconKey(e){if(!this.isVesselLike(e))return null;let t=pa({mmsi:e.mmsi??e.id??"",type:e.type,aisShipTypeId:e.design?.aisShipType?.id});return t.startsWith("vessel/")?t:null}polarToCartesian(e,t,i,s){let r=e*Math.PI/180,o=t/i*s;return {x:o*Math.sin(r),y:-o*Math.cos(r)}}hasValidPosition(e){return typeof e?.latitude=="number"&&Number.isFinite(e.latitude)&&typeof e?.longitude=="number"&&Number.isFinite(e.longitude)}offsetPoint(e,t,i,s){let r=i*Math.PI/180;return {x:e+s*Math.sin(r),y:t-s*Math.cos(r)}}wrapDegrees(e){let t=e%360;return t<0?t+360:t}isStationaryNavState(e){if(typeof e=="number"&&Number.isFinite(e))return e===1||e===5;if(typeof e!="string")return false;let t=e.trim().toLowerCase().replace(/\s+/g," ");if(!t.length)return false;let i=Number(t);return Number.isFinite(i)?i===1||i===5:t.includes("moored")||t.includes("anchored")||t.includes("at anchor")}shortestAngleDelta(e,t){return (t-e+540)%360-180}buildTrackSignature(e){let t=e.position??{};return [t.latitude,t.longitude,this.isVesselLike(e)?e.headingTrue:void 0,this.isVesselLike(e)?e.courseOverGroundTrue:void 0].join("|")}isVesselLike(e){return e.type==="vessel"||e.type==="sar"}isAton(e){return e.type==="aton"}buildCornerBoxPath(e,t){let i=e,s=Math.min(Math.max(t,0),i);return [`M ${-i} ${-i} h ${s}`,`M ${-i} ${-i} v ${s}`,`M ${i} ${-i} h ${-s}`,`M ${i} ${-i} v ${s}`,`M ${-i} ${i} h ${s}`,`M ${-i} ${i} v ${-s}`,`M ${i} ${i} h ${-s}`,`M ${i} ${i} v ${-s}`].join(" ")}smoothRotation(e){let t=performance.now();if(this.viewRotationSmoothed===null||this.lastRotationAt===null)return this.viewRotationSmoothed=this.wrapDegrees(e),this.lastRotationAt=t,this.viewRotationSmoothed;let i=Math.min(250,Math.max(0,t-this.lastRotationAt)),s=Math.min(1,i/200),r=this.shortestAngleDelta(this.viewRotationSmoothed,e);return this.viewRotationSmoothed=this.wrapDegrees(this.viewRotationSmoothed+r*s),this.lastRotationAt=t,this.viewRotationSmoothed}toDegreesIfRadians(e){return typeof e!="number"||!Number.isFinite(e)?null:this.units.convertToUnit("deg",e)}distanceNm(e,t){let s=e.latitude*Math.PI/180,r=t.latitude*Math.PI/180,o=(t.latitude-e.latitude)*Math.PI/180,n=(t.longitude-e.longitude)*Math.PI/180,d=Math.sin(o/2),u=Math.sin(n/2),b=d*d+Math.cos(s)*Math.cos(r)*u*u;return 6371e3*(2*Math.atan2(Math.sqrt(b),Math.sqrt(1-b)))/1852}ngOnDestroy(){this.renderFrame&&(cancelAnimationFrame(this.renderFrame),this.renderFrame=null),this.rotationFrameTimer!==null&&(window.clearTimeout(this.rotationFrameTimer),this.rotationFrameTimer=null),this.iconRenderTimer!==null&&(window.clearTimeout(this.iconRenderTimer),this.iconRenderTimer=null);}static \u0275fac=function(t){return new(t||l)};static \u0275cmp=JD({type:l,selectors:[["widget-ais-radar"]],viewQuery:function(t,i){t&1&&eg(i.svgRef,lt,5)(i.menuAnchorRef,ct,5)(i.menuTrigger,dt,5),t&2&&Kw(3);},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:29,vars:9,consts:[["radarSvg",""],["menuAnchor","","menuTrigger","matMenuTrigger"],["targetMenu","matMenu"],["filterMenu","matMenu"],["vesselTypeMenu","matMenu"],["kipResizeObserver","",1,"ais-radar-container",3,"kipResize"],["type","button","matMiniFab","",1,"ais-radar-mode-toggle-button",3,"click","matTooltip"],["viewBox","0 0 40 40","aria-hidden","true",1,"ais-mode-icon"],["type","button","matMiniFab","","matTooltip","Increase range","aria-label","Increase range",1,"ais-radar-range-button","ais-radar-range-plus",3,"click"],["type","button","matMiniFab","","matTooltip","Decrease range","aria-label","Decrease range",1,"ais-radar-range-button","ais-radar-range-minus",3,"click"],["type","button","matMiniFab","","matTooltip","Filter targets","aria-label","Filter targets",1,"ais-radar-range-button","ais-radar-filter-button",3,"matMenuTriggerFor"],["type","button","matMiniFab","","matTooltip","Show only collision risk targets","aria-label","No collision risk filter",1,"ais-radar-range-button","ais-radar-collision-button",3,"is-active"],["role","img","aria-label","AIS radar display",1,"ais-radar"],["type","button","aria-hidden","true","tabindex","-1",1,"ais-radar-menu-anchor",3,"matMenuTriggerFor"],[3,"closed"],["matMenuContent",""],[1,"widgetOverlay"],["stroke","currentColor","d","M10 8 L20 2 L30 8",1,"ais-mode-icon-chev"],["fill","currentColor","x","20","y","31",1,"ais-mode-icon-letter"],["fill","currentColor","d","M20 4 L34 36 L20 28 L6 36 Z",1,"ais-mode-icon-vessel"],["type","button","matMiniFab","","matTooltip","Show only collision risk targets","aria-label","No collision risk filter",1,"ais-radar-range-button","ais-radar-collision-button",3,"click"],["mat-menu-item","","type","button",1,"ais-radar-menu-item"],["mat-menu-item","","type","button",1,"ais-radar-menu-item",3,"click"],["alt","","aria-hidden","true",1,"target-menu-icon"],[1,"target-menu-label"],["mat-menu-item","","disabled","",1,"ais-filter-menu-header"],["mat-menu-item","","type","button",3,"click"],["aria-hidden","true",1,"ais-filter-check"],["mat-menu-item","",3,"matMenuTriggerFor"],["mat-menu-item","","type","button"]],template:function(t,i){if(t&1&&(Pi(0,"div",5),Qh("kipResize",function(r){return i.onResized(r)}),Pi(1,"button",6),Qh("click",function(){return i.toggleViewMode()}),_w(2,ut,4,0,":svg:svg",7)(3,mt,2,0,":svg:svg",7),ul(),Pi(4,"button",8),Qh("click",function(){return i.incrementRange()}),Pi(5,"mat-icon"),TT(6,"add"),ul()(),Pi(7,"button",9),Qh("click",function(){return i.decrementRange()}),Pi(8,"mat-icon"),TT(9,"remove"),ul()(),Pi(10,"button",10)(11,"mat-icon"),TT(12,"filter_list"),ul()(),_w(13,gt,3,2,"button",11),wd(),$h(14,"svg",12,0),Td(),$h(16,"button",13,1),ul(),Pi(19,"mat-menu",14,2),Qh("closed",function(){return i.resetTargetMenuState()}),xh(21,ft,2,0,"ng-template",15),ul(),Pi(22,"mat-menu",null,3),xh(24,St,27,5,"ng-template",15),ul(),Pi(25,"mat-menu",null,4),xh(27,bt,2,0,"ng-template",15),ul(),_w(28,yt,1,0,"div",16)),t&2){let s=Jw(20),r=Jw(23);EE(),Bh("matTooltip",i.effectiveViewMode()==="north-up"?"Change to North-Up mode":"Change to Course-Up mode"),Hh("aria-label",i.effectiveViewMode()==="north-up"?"North up mode":"Course up mode"),EE(),Mw(i.effectiveViewMode()==="north-up"?2:3),EE(8),sg("is-active",i.hasActiveFilters()),Bh("matMenuTriggerFor",r),EE(3),Mw(i.hasCollisionRiskData()?13:-1),EE(3),Bh("matMenuTriggerFor",s),EE(12),Mw(i.dashboard.isDashboardStatic()?-1:28);}},dependencies:[u,Op,Rp,yt$1,wt,Ht,R,ee,Nt,Lt,zt,mt$1],encapsulation:2})}return l})();export{Qt as WidgetAisRadarComponent};
1
+ import {g as ge$1}from'./chunk-TakPRI3t.js';import {d1 as Hj,w,du as p,C as Ff,ao as ue,bu as ut$1,G as Gi,aR as lt$1,a as G,$ as $j,v as vt$1,D as Dt,dG as rn,F as Fa,dn as ge,dH as ac,cw as z,cv as G$1,dI as cn,dJ as nc,dK as qn,dL as zn,dM as pa,J as JD,O as Op,R as Rp,y as yt$1,b as wt,cG as Ht,cH as R,cI as ee,cJ as Nt,cK as Lt,cR as zt,bg as mt$1,P as Pi,k as Qh,_ as _w,u as ul,T as TT,cn as wd,c as $h,cV as Td,cf as xh,bl as Jw,e as EE,B as Bh,an as Hh,M as Mw,s as sg,f as eg,K as Kw,aS as De,aY as xe,ab as te,aj as zm,a_ as Gp,cO as eu,aI as ms,dN as Q,h as Fw,g as qw,X as xw,Y as Aw,bp as gl,dj as Nw,d as ig,aA as gg,l as ud,m as dd,dO as fp}from'./main-IINF7HD6.js';import {u}from'./chunk-CxOyBrqL.js';import {c}from'./chunk-DHj2hm9r.js';var K=false,Je=250,it=600*1e3,st=500,nt=15e3,rt=["atons.urn:mrn:imo:mmsi:*","shore.basestations.urn:mrn:imo:mmsi:*","vessels.urn:mrn:imo:mmsi:*","sar.urn:mrn:imo:mmsi:*"],ot=[{prefix:"atons.urn:mrn:imo:mmsi:",type:"aton"},{prefix:"shore.basestations.urn:mrn:imo:mmsi:",type:"basestation"},{prefix:"vessels.urn:mrn:imo:mmsi:",type:"vessel"},{prefix:"sar.urn:mrn:imo:mmsi:",type:"sar"}],at="self.navigation.*",et=(()=>{class l{data=w(De);destroyRef=w(xe);tracks=new Map;contextIndex=new Map;mmsiIndex=new Map;maxTargets=st;targetTtlMs=it;targetsDirty$=new te;ownShipDirty$=new te;pendingOwnShip={};_targets=vt$1([]);_ownShip=vt$1({});_hasCollisionRiskData=vt$1(false);targets=this._targets.asReadonly();ownShip=this._ownShip.asReadonly();hasCollisionRiskData=this._hasCollisionRiskData.asReadonly();getBearingTrue(e,t){if(typeof e.latitude!="number"||typeof e.longitude!="number"||typeof t.latitude!="number"||typeof t.longitude!="number")return null;let i=e.latitude*Math.PI/180,s=t.latitude*Math.PI/180,r=(t.longitude-e.longitude)*Math.PI/180,o=Math.sin(r)*Math.cos(s),n=Math.cos(i)*Math.sin(s)-Math.sin(i)*Math.cos(s)*Math.cos(r),d=Math.atan2(o,n)*180/Math.PI;return this.wrapDegrees(d)}constructor(){zm(...rt.map(t=>this.data.subscribePathTree(t))).pipe(Gp(this.destroyRef)).subscribe(t=>this.handleAisTreeUpdate(t)),this.data.subscribePathTree(at).pipe(Gp(this.destroyRef)).subscribe(t=>this.handleOwnShipTreeUpdate(t)),this.targetsDirty$.pipe(eu(Je,void 0,{leading:true,trailing:true}),Gp(this.destroyRef)).subscribe(()=>this.flushTargetsSignal()),ms(nt).pipe(Gp(this.destroyRef)).subscribe(()=>this.evictStaleTracks(Date.now())),this.ownShipDirty$.pipe(eu(Je,void 0,{leading:true,trailing:true}),Gp(this.destroyRef)).subscribe(()=>this.flushOwnShip());}handleAisTreeUpdate(e){let t=this.matchAisContext(e.path);t&&(this.applyAisUpdate({context:t.context,type:t.type,path:t.path,value:e.update.data.value,timestampMs:this.toTimestampMs(e.update.data.timestamp)}));}handleOwnShipTreeUpdate(e){if(!e.path.startsWith("self."))return;let t=e.path.slice(5);this.applyOwnShipUpdate(t,e.update.data.value);}matchAisContext(e){for(let t of ot){if(!e.startsWith(t.prefix))continue;let i=e.indexOf(".",t.prefix.length);return i===-1?null:{context:e.slice(0,i),path:e.slice(i+1),type:t.type}}return null}applyOwnShipUpdate(e,t){let i=G$1({},this.pendingOwnShip),s=this.readPositionValue(t);switch(e){case "navigation.position":s&&(i.position=s);break;case "navigation.position.latitude":{let r=this.toNumberOrUndefined(t);if(r===void 0)return;i.position=z(G$1({},i.position??{}),{latitude:r});}break;case "navigation.position.longitude":{let r=this.toNumberOrUndefined(t);if(r===void 0)return;i.position=z(G$1({},i.position??{}),{longitude:r});}break;case "navigation.headingTrue":i.headingTrue=this.toNumberOrUndefined(t);break;case "navigation.courseOverGroundTrue":i.courseOverGroundTrue=this.toNumberOrUndefined(t);break;case "navigation.speedOverGround":i.speedOverGround=this.toNumberOrUndefined(t);break;default:return}this.pendingOwnShip=i,this.ownShipDirty$.next();}flushOwnShip(){this.ownShipChanged(this._ownShip(),this.pendingOwnShip)&&this._ownShip.set(this.pendingOwnShip);}ownShipChanged(e,t){return e.headingTrue!==t.headingTrue||e.courseOverGroundTrue!==t.courseOverGroundTrue||e.speedOverGround!==t.speedOverGround||e.position?.latitude!==t.position?.latitude||e.position?.longitude!==t.position?.longitude}applyAisUpdate(e){let t=this.resolveTrack(e);if(t){switch(t.lastUpdateAt=e.timestampMs,e.path.startsWith("navigation.closestApproach.")&&this.isVesselLike(t)&&!t.closestApproach&&(t.closestApproach={}),e.path){case "mmsi":this.applyMmsi(t,e.value);break;case "name":t.name=this.toStringOrUndefined(e.value);break;case "communication.callsignVhf":this.isVesselLike(t)&&(t.callsign=this.toStringOrUndefined(e.value));break;case "navigation.destination":case "navigation.destination.commonName":this.isVesselLike(t)&&(t.destination=this.toStringOrUndefined(e.value));break;case "navigation.destination.eta":this.isVesselLike(t)&&(t.eta=this.toStringOrUndefined(e.value));break;case "design.beam":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{beam:this.toNumberOrUndefined(e.value)}));break;case "design.length.overall":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{length:z(G$1({},t.design?.length??{}),{overall:this.toNumberOrUndefined(e.value)})}));break;case "design.length.hull":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{length:z(G$1({},t.design?.length??{}),{hull:this.toNumberOrUndefined(e.value)})}));break;case "design.length.waterline":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{length:z(G$1({},t.design?.length??{}),{waterline:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.maximum":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{maximum:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.minimum":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{minimum:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.current":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{current:this.toNumberOrUndefined(e.value)})}));break;case "design.draft.canoe":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{draft:z(G$1({},t.design?.draft??{}),{canoe:this.toNumberOrUndefined(e.value)})}));break;case "registrations.imo":this.isVesselLike(t)&&(t.imo=this.toStringOrUndefined(e.value));break;case "navigation.courseOverGroundTrue":this.isVesselLike(t)&&(t.courseOverGroundTrue=this.toNumberOrUndefined(e.value));break;case "navigation.headingTrue":this.isVesselLike(t)&&(t.headingTrue=this.toNumberOrUndefined(e.value));break;case "navigation.rateOfTurn":this.isVesselLike(t)&&(t.rateOfTurn=this.toNumberOrUndefined(e.value));break;case "navigation.specialManeuver":this.isVesselLike(t)&&(t.specialManeuver=this.toStringOrUndefined(e.value));break;case "navigation.speedOverGround":this.isVesselLike(t)&&(t.speedOverGround=this.toNumberOrUndefined(e.value));break;case "navigation.state":this.isVesselLike(t)&&(t.navState=this.toStringOrUndefined(e.value));break;case "sensors.ais.class":t.ais.class=this.normalizeAisClass(e.value);break;case "sensors.ais.status":{let i=this.normalizeAisStatus(e.value);if(!i)break;if(i==="remove"){this.removeTrack(t);return}t.ais.status=i;}break;case "sensors.ais.fromBow":this.isVesselLike(t)&&(t.fromBow=this.toNumberOrUndefined(e.value));break;case "sensors.ais.fromCenter":this.isVesselLike(t)&&(t.fromCenter=this.toNumberOrUndefined(e.value));break;case "navigation.position.latitude":{let i=this.toNumberOrUndefined(e.value);if(i===void 0)break;t.position=z(G$1({},t.position??{}),{latitude:i}),t.lastPositionAt=e.timestampMs;}break;case "navigation.position.longitude":{let i=this.toNumberOrUndefined(e.value);if(i===void 0)break;t.position=z(G$1({},t.position??{}),{longitude:i}),t.lastPositionAt=e.timestampMs;}break;case "navigation.position.altitude":{let i=this.toNumberOrUndefined(e.value);t.position&&(t.position=z(G$1({},t.position),{altitude:i}));}break;case "navigation.position":{let i=this.readPositionValue(e.value);i&&(t.position=i,t.lastPositionAt=e.timestampMs);}break;case "atonType.id":this.isAton(t)&&(t.typeId=this.toNumberOrUndefined(e.value));break;case "atonType.name":this.isAton(t)&&(t.typeName=this.toStringOrUndefined(e.value));break;case "virtual":this.isAton(t)&&(t.virtual=!!e.value);break;case "offPosition":this.isAton(t)&&(t.offPosition=!!e.value);break;case "design.aisShipType.id":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{aisShipType:z(G$1({},t.design?.aisShipType??{}),{id:this.toNumberOrUndefined(e.value)})}));break;case "design.aisShipType.name":this.isVesselLike(t)&&(t.design=z(G$1({},t.design??{}),{aisShipType:z(G$1({},t.design?.aisShipType??{}),{name:this.toStringOrUndefined(e.value)})}));break;case "navigation.closestApproach.distance":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.distance=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.timeTo":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.timeTo=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.range":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.range=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.bearing":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.bearing=this.toNumberOrUndefined(e.value));break;case "navigation.closestApproach.collisionRiskRating":this.isVesselLike(t)&&t.closestApproach&&(t.closestApproach.collisionRiskRating=this.toNumberOrUndefined(e.value));break}this.updateTargetsSignal();}}resolveTrack(e){let t=this.contextIndex.get(e.context),i=e.timestampMs,s=t?this.tracks.get(t):null;if(s)return s;let r=this.createTrack(e.context,e.type,i,void 0);return this.contextIndex.set(e.context,r.id),r}createTrack(e,t,i,s){let r=this.buildTrackId(s??e),o=this.buildBaseTarget(e,t,i,s,r),n;switch(t){case "vessel":n=z(G$1({},o),{type:"vessel",closestApproach:{}});break;case "sar":n=z(G$1({},o),{type:"sar",closestApproach:{}});break;case "aton":n=z(G$1({},o),{type:"aton"});break;default:n=z(G$1({},o),{type:"basestation"});break}return this.tracks.set(n.id,n),s&&this.addMmsiIndex(s,n.id),this.enforceTargetCap(),this.updateTargetsSignal(),n}buildTrackId(e){if(!this.tracks.has(e))return e;let t=1;for(;this.tracks.has(`${e}-${t}`);)t+=1;return `${e}-${t}`}applyMmsi(e,t){let i=this.toStringOrUndefined(t);if(!i)return;let s=this.getTracksByMmsi(i).filter(r=>r.id!==e.id);s.length&&(this.markConflict(i),K),e.mmsi&&e.mmsi!==i&&this.removeMmsiIndex(e.mmsi,e.id),e.mmsi=i,this.addMmsiIndex(i,e.id);}removeTrack(e){this.tracks.delete(e.id),e.mmsi&&this.removeMmsiIndex(e.mmsi,e.id);for(let[t,i]of this.contextIndex.entries())i===e.id&&this.contextIndex.delete(t);this.updateTargetsSignal();}updateTargetsSignal(){this.targetsDirty$.next();}enforceTargetCap(){for(;this.tracks.size>this.maxTargets;){let e=null;for(let t of this.tracks.values())(!e||t.lastUpdateAt<e.lastUpdateAt)&&(e=t);if(!e)break;this.removeTrack(e);}}evictStaleTracks(e){let t=e-this.targetTtlMs,i=[];for(let s of this.tracks.values())s.lastUpdateAt<t&&i.push(s);for(let s of i)this.removeTrack(s);this.enforceTargetCap();}flushTargetsSignal(){let e=Array.from(this.tracks.values()).filter(i=>!!i.mmsi||!!i.position),t=e.some(i=>{if(!this.isVesselLike(i))return false;let s=i.closestApproach??{};return Object.prototype.hasOwnProperty.call(s,"collisionRiskRating")});this._targets.set(e),this._hasCollisionRiskData.set(t);}getTracksByMmsi(e){let t=this.mmsiIndex.get(e);return t?Array.from(t).map(i=>this.tracks.get(i)).filter(i=>!!i):[]}addMmsiIndex(e,t){this.mmsiIndex.has(e)||this.mmsiIndex.set(e,new Set),this.mmsiIndex.get(e).add(t);}removeMmsiIndex(e,t){let i=this.mmsiIndex.get(e);i&&(i.delete(t),i.size||this.mmsiIndex.delete(e));}markConflict(e){let t=this.getTracksByMmsi(e);for(let i of t)i.conflicted=true;}normalizeAisClass(e){let t=typeof e=="string"?e.toUpperCase():"";if(t==="A")return "A";if(t==="B")return "B"}normalizeAisStatus(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="unconfirmed"||t==="confirmed"||t==="lost"||t==="remove")return t}toTimestampMs(e){if(!e)return Date.now();let t=e instanceof Date?e.getTime():Date.parse(e);return Number.isFinite(t)?t:Date.now()}toNumberOrUndefined(e){let t=Number(e);return Number.isFinite(t)?t:void 0}toStringOrUndefined(e){if(e==null)return;let t=String(e).trim();return t.length?t:void 0}wrapDegrees(e){let t=e%360;return t<0?t+360:t}buildBaseTarget(e,t,i,s,r){return {id:r,context:e,type:t,ais:{class:void 0,status:"unconfirmed"},conflicted:false,mmsi:s,position:void 0,lastUpdateAt:i,lastPositionAt:void 0}}isVesselLike(e){return e.type==="vessel"||e.type==="sar"}isAton(e){return e.type==="aton"}readPositionValue(e){if(!e||typeof e!="object")return;let t=this.toNumberOrUndefined(e.latitude),i=this.toNumberOrUndefined(e.longitude);if(t===void 0||i===void 0)return;let s=this.toNumberOrUndefined(e.altitude);return {latitude:t,longitude:i,altitude:s}}static \u0275fac=function(t){return new(t||l)};static \u0275prov=Q({token:l,factory:l.\u0275fac,providedIn:"root"})}return l})();var lt=["radarSvg"],ct=["menuAnchor"],dt=["menuTrigger"],ht=(l,I)=>I.id;function ut(l,I){l&1&&(wd(),Pi(0,"svg",7),$h(1,"path",17),Pi(2,"text",18),TT(3,"N"),ul()());}function mt(l,I){l&1&&(wd(),Pi(0,"svg",7),$h(1,"path",19),ul());}function gt(l,I){if(l&1){let e=Fw();Pi(0,"button",20),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("noCollisionRisk"))}),Pi(1,"mat-icon"),TT(2,"security"),ul()();}if(l&2){let e=qw();sg("is-active",e.isFilterEnabled("noCollisionRisk"));}}function pt(l,I){if(l&1){let e=Fw();Pi(0,"button",22),Qh("click",function(){let i=ud(e).$implicit,s=qw(2);return dd(s.onMenuItemSelect(i))}),$h(1,"img",23),Pi(2,"span",24),TT(3),ul()();}if(l&2){let e=I.$implicit;EE(),ig("visibility",e.iconHref?"visible":"hidden"),Hh("src",e.iconHref??null,fp),EE(2),gg(e.label);}}function ft(l,I){if(l&1&&xw(0,pt,4,4,"button",21,ht),l&2){let e=qw();Aw(e.menuItems());}}function St(l,I){if(l&1){let e=Fw();Pi(0,"button",25),TT(1,"Filter Targets"),ul(),Pi(2,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("anchoredMoored"))}),Pi(3,"mat-icon",27),TT(4),ul(),Pi(5,"span"),TT(6,"Anchored/Moored"),ul()(),Pi(7,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("allAton"))}),Pi(8,"mat-icon",27),TT(9),ul(),Pi(10,"span"),TT(11,"All AtoN"),ul()(),Pi(12,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("allButSar"))}),Pi(13,"mat-icon",27),TT(14),ul(),Pi(15,"span"),TT(16,"All but SAR"),ul()(),Pi(17,"button",26),Qh("click",function(){ud(e);let i=qw();return dd(i.toggleFilter("allVessels"))}),Pi(18,"mat-icon",27),TT(19),ul(),Pi(20,"span"),TT(21,"All Vessels"),ul()(),Pi(22,"button",28)(23,"span"),TT(24,"Vessel Type"),ul(),Pi(25,"mat-icon"),TT(26,"chevron_right"),ul()();}if(l&2){let e=qw(),t=Jw(26);EE(4),gl(" ",e.isFilterEnabled("anchoredMoored")?"check_box":"check_box_outline_blank"," "),EE(5),gl(" ",e.isFilterEnabled("allAton")?"check_box":"check_box_outline_blank"," "),EE(5),gl(" ",e.isFilterEnabled("allButSar")?"check_box":"check_box_outline_blank"," "),EE(5),gl(" ",e.isFilterEnabled("allVessels")?"check_box":"check_box_outline_blank"," "),EE(3),Bh("matMenuTriggerFor",t);}}function vt(l,I){if(l&1){let e=Fw();Pi(0,"button",26),Qh("click",function(){let i=ud(e).$implicit,s=qw(2);return dd(s.toggleVesselTypeFilter(i))}),Pi(1,"mat-icon",27),TT(2),ul(),Pi(3,"span"),TT(4),ul()();}if(l&2){let e=I.$implicit,t=qw(2);EE(2),gl(" ",t.isVesselTypeFilterEnabled(e)?"check_box":"check_box_outline_blank"," "),EE(2),gg(t.formatVesselTypeLabel(e));}}function bt(l,I){if(l&1&&xw(0,vt,5,2,"button",29,Nw),l&2){let e=qw();Aw(e.vesselTypeFilters);}}function yt(l,I){l&1&&$h(0,"div",16);}var Qt=(()=>{class l{static TARGET_ICON_SIZE_PX=16;static OWN_SHIP_ICON_SIZE_PX=84;static HIT_RADIUS_PX=28;static ICON_RENDER_DEBOUNCE_MS=50;static ROTATION_SETTLE_DEADBAND_DEG=1;static ROTATION_ONLY_FRAME_MS=33;id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);ais=w(et);dialog=w(Ff);ngZone=w(ue);units=w(ut$1);settings=w(Gi);toast=w(lt$1);dashboard=w(G);static DEFAULT_CONFIG={filterSelfPaths:false,enableTimeout:false,dataTimeout:5,ais:{filters:{anchoredMoored:false,noCollisionRisk:false,allAton:false,allButSar:false,allVessels:false,vesselTypes:[]},viewMode:"course-up",rangeRings:[1,3,6,12,24,48],rangeIndex:"3",showCogVectors:true,cogVectorsMinutes:10,showLostTargets:true,showUnconfirmedTargets:true,showSelf:true},color:"grey"};svgRef=$j.required("radarSvg");menuAnchorRef=$j.required("menuAnchor");menuTrigger=$j.required("menuTrigger");hostSize=vt$1(null);renderState=null;selectedId=vt$1(null);localViewMode=vt$1(null);localRangeIndex=vt$1(null);effectiveViewMode=Dt(()=>this.localViewMode()??this.runtime.options()?.ais?.viewMode??"course-up");effectiveRangeIndex=Dt(()=>{let e=this.resolveRangeIndex(this.runtime.options()?.ais),t=this.runtime.options()?.ais?.rangeRings??[3,6,12,24,48],i=Math.max(0,t.length-1),s=this.localRangeIndex()??e;return Math.min(Math.max(s,0),i)});svg;root;ringsLayer;rotationGroup;vectorsLayer;targetsLayer;selectedLayer;ownShipLayer;viewRotationSmoothed=null;lastRotationAt=null;lastViewRotation=0;hasRenderedOnce=false;renderFrame=null;rotationFrameTimer=null;iconRenderTimer=null;iconCache=new Map;targetCache=new Map;lastOriginKey=null;ringCache=null;ownShipIconHref=null;menuItems=vt$1([]);menuPoint=null;lastRenderTargets=[];lastRenderScale=1;lastRenderSize=null;hitRadiusPx=l.HIT_RADIUS_PX;lastFiltersSignature=null;lastRenderSignature=null;ownShipVectorCache=null;filterState=vt$1({anchoredMoored:false,noCollisionRisk:false,allAton:false,allButSar:false,allVessels:false,vesselTypes:new Set});vesselTypeFilters=rn.filter(e=>e!=="vessel/self"&&e!=="vessel/unknown"&&e!=="vessel/spare");hasActiveFilters=Dt(()=>{let e=this.filterState();return e.anchoredMoored||e.allAton||e.allButSar||e.allVessels||e.vesselTypes.size>0});hasCollisionRiskData=this.ais.hasCollisionRiskData;constructor(){this.warnIfRemoteDataDisabled(),this.loadOwnShipIcon(),Fa(()=>{let e=this.hostSize(),t=this.runtime.options(),i=this.theme(),s=this.ais.targets(),r=this.ais.ownShip();!e||!t||!i||(ge(()=>{this.renderState={size:e,cfg:t,theme:i,targets:s,ownShip:r},this.syncFiltersFromConfig(t);}),this.scheduleRender());}),Fa(()=>{this.localViewMode(),this.localRangeIndex(),this.selectedId(),this.filterState(),ge(()=>{this.scheduleRender();});});}warnIfRemoteDataDisabled(){this.settings.signalKSubscribeAll||this.toast.show('AIS data is disabled in your connection. To see radar targets, go to Settings -> Options -> Connectivity, enable "Subscribe to remote sources messages", then reconnect.',0,false,"warn");}loadOwnShipIcon(){this.ngZone.runOutsideAngular(()=>{ac().then(e=>{this.ownShipIconHref=e,this.scheduleRenderDebounced();});});}ngAfterViewInit(){this.initSvg(),this.scheduleRender();}onResized(e){this.hostSize.set({width:e.width,height:e.height});}initSvg(){this.svg=ge$1(this.svgRef().nativeElement),this.svg.attr("class","ais-radar"),this.root=this.svg.append("g").attr("class","radar-root"),this.ringsLayer=this.root.append("g").attr("class","radar-rings"),this.rotationGroup=this.root.append("g").attr("class","radar-rotation"),this.vectorsLayer=this.rotationGroup.append("g").attr("class","radar-vectors"),this.targetsLayer=this.rotationGroup.append("g").attr("class","radar-targets"),this.selectedLayer=this.rotationGroup.append("g").attr("class","radar-selected"),this.ownShipLayer=this.root.append("g").attr("class","radar-ownship-layer"),this.svg.on("click",()=>{this.selectedId.set(null),this.closeTargetMenu();});}scheduleRender(){this.renderFrame===null&&this.ngZone.runOutsideAngular(()=>{this.renderFrame=requestAnimationFrame(()=>{this.renderFrame=null,this.render();});});}scheduleRenderDebounced(){this.iconRenderTimer===null&&this.ngZone.runOutsideAngular(()=>{this.iconRenderTimer=window.setTimeout(()=>{this.iconRenderTimer=null,this.scheduleRender();},l.ICON_RENDER_DEBOUNCE_MS);});}scheduleRotationOnlyRender(){this.rotationFrameTimer!==null||this.renderFrame!==null||this.ngZone.runOutsideAngular(()=>{this.rotationFrameTimer=window.setTimeout(()=>{this.rotationFrameTimer=null,this.scheduleRender();},l.ROTATION_ONLY_FRAME_MS);});}render(){if(!this.renderState||!this.svg||!this.root||!this.rotationGroup)return;let{size:e,cfg:t,theme:i,targets:s,ownShip:r}=this.renderState,o=Math.max(1,e.width),n=Math.max(1,e.height),d=Math.min(o,n)/2,u=(Math.min(o,n)-35)/Math.min(o,n),b=Math.hypot(o,n)/2/u,c$1=t.ais??{},T=c$1.rangeRings?.length?c$1.rangeRings:[3,6,12,24,48],x=this.effectiveRangeIndex(),a=T[x]??T[0],M=this.resolveRingCountForRange(a),S=this.localViewMode()??c$1.viewMode??"course-up",_=this.toDegreesIfRadians(r.courseOverGroundTrue),C=this.toDegreesIfRadians(r.headingTrue),V=_!==null||C!==null,m=S==="course-up"?_??C??0:0,B=this.viewRotationSmoothed!==null&&Math.abs(this.shortestAngleDelta(this.viewRotationSmoothed,m))<=l.ROTATION_SETTLE_DEADBAND_DEG,$=this.buildFilterStateSignature(this.filterState()),U=r.position?`${r.position.latitude},${r.position.longitude}`:"none",F={sizeKey:`${o}x${n}`,viewMode:S,rangeIndex:x,rangesKey:T.join(","),showSelf:c$1.showSelf??true,showCogVectors:c$1.showCogVectors??true,showLostTargets:c$1.showLostTargets??true,showUnconfirmedTargets:c$1.showUnconfirmedTargets??true,filtersKey:$,selectedId:this.selectedId(),targetsRef:s,ownPosKey:U,themeRef:i,color:t.color},L=!this.lastRenderSignature||!this.signaturesEqual(this.lastRenderSignature,F);if(!L&&B&&this.hasRenderedOnce)return;this.lastRenderSignature=F;let v=S==="course-up"&&V?this.smoothRotation(m):0,te=S==="course-up"?Math.abs(this.shortestAngleDelta(v,m)):0;this.lastViewRotation=v,this.svg.attr("viewBox",`${-o/2} ${-n/2} ${o} ${n}`),this.root.attr("transform",`scale(${u})`),this.rotationGroup.attr("transform",`rotate(${this.wrapDegrees(-v)})`);let me=this.wrapDegrees((_??C??0)-v);if(L){let ie=c(t.color??"contrast",i).dim;this.renderRings(M,a,d,b,v,u,c$1.showSelf??true,me,ie);}if(this.ownShipLayer?.select("g.radar-ownship").attr("transform",`rotate(${me})`),r.position&&this.hasValidPosition(r.position)&&(this.renderOwnShipVector(r,a,d,v,c$1),L)){let ie=b/d*a,W=this.buildTargets(s,r.position,a,ie,d,0,c$1);this.lastRenderTargets=W,this.lastRenderScale=u,this.lastRenderSize=e,this.renderTargetVectors(W,a,d,0,c$1),this.renderTargets(W,u),this.renderSelected(W,u);}this.raiseOwnshipAndVector(),this.hasRenderedOnce=true,te>l.ROTATION_SETTLE_DEADBAND_DEG&&(L?this.scheduleRender():this.scheduleRotationOnlyRender());}signaturesEqual(e,t){return e.sizeKey===t.sizeKey&&e.viewMode===t.viewMode&&e.rangeIndex===t.rangeIndex&&e.rangesKey===t.rangesKey&&e.showSelf===t.showSelf&&e.showCogVectors===t.showCogVectors&&e.showLostTargets===t.showLostTargets&&e.showUnconfirmedTargets===t.showUnconfirmedTargets&&e.filtersKey===t.filtersKey&&e.selectedId===t.selectedId&&e.targetsRef===t.targetsRef&&e.ownPosKey===t.ownPosKey&&e.themeRef===t.themeRef&&e.color===t.color}renderRings(e,t,i,s,r,o,n,d,u){if(!this.ringsLayer)return;let b=`${t.toFixed(3)}|${i.toFixed(3)}|${s.toFixed(3)}|${e}`;if(!this.ringCache||this.ringCache.key!==b){let m=t/Math.max(1,e),B=s/i*t,$=[];for(let v=m;v<=B+1e-6;v+=m)$.push(v);let U=$.map(v=>({value:v,radius:v/t*i})).filter(v=>v.radius<=s+1e-6),F=20,L=U.flatMap(v=>[{key:`${v.value}-top`,value:v.value,x:0,y:-v.radius+F},{key:`${v.value}-bottom`,value:v.value,x:0,y:v.radius-F}]);this.ringCache={key:b,rings:U,labels:L};}let c=this.ringCache;if(!c)return;let T=c.rings,x=this.ringsLayer.selectAll("circle.ring").data(T,m=>m.value.toString());x.enter().append("circle").attr("class","ring").merge(x).attr("r",m=>m.radius).attr("stroke",u),x.exit().remove();let a=c.labels,M=this.ringsLayer.selectAll("text.ring-label").data(a,m=>m.key);M.enter().append("text").attr("class","ring-label").merge(M).attr("x",m=>m.x).attr("y",m=>m.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(m=>`${m.value}`),M.exit().remove();let S=this.ringsLayer.selectAll("circle.radar-center").data(n?[]:[{r:Math.max(3,i*.01)}]);S.enter().append("circle").attr("class","radar-center").merge(S).attr("cx",0).attr("cy",0).attr("r",m=>m.r).attr("fill",u),S.exit().remove();let _=this.ownShipLayer.selectAll("g.radar-ownship").data(n?[{size:this.resolveOwnShipBaseSize(o)}]:[]),C=_.enter().append("g").attr("class","radar-ownship");C.append("image").attr("class","ownship-icon").attr("href",this.ownShipIconHref??null).attr("xlink:href",this.ownShipIconHref??null);let V=C.merge(_);V.attr("transform",`rotate(${d})`),V.select("image.ownship-icon").attr("href",this.ownShipIconHref??null).attr("xlink:href",this.ownShipIconHref??null).attr("display",this.ownShipIconHref?null:"none").attr("width",m=>m.size).attr("height",m=>m.size).attr("x",m=>-m.size/2).attr("y",m=>-m.size/2),_.exit().remove();}toggleViewMode(){let e=this.localViewMode()??this.runtime.options()?.ais?.viewMode??"course-up";this.localViewMode.set(e==="course-up"?"north-up":"course-up");}incrementRange(){this.localRangeIndex.set(Math.max(this.effectiveRangeIndex()-1,0));}decrementRange(){let e=this.runtime.options()?.ais?.rangeRings??[3,6,12,24,48],t=Math.max(0,e.length-1);this.localRangeIndex.set(Math.min(this.effectiveRangeIndex()+1,t));}toggleFilter(e){this.filterState.update(t=>z(G$1({},t),{[e]:!t[e]}));}toggleVesselTypeFilter(e){this.filterState.update(t=>{let i=new Set(t.vesselTypes);return i.has(e)?i.delete(e):i.add(e),z(G$1({},t),{vesselTypes:i})});}isFilterEnabled(e){return this.filterState()[e]}isVesselTypeFilterEnabled(e){return this.filterState().vesselTypes.has(e)}formatVesselTypeLabel(e){let t=e.replace("vessel/","");switch(t){case "pleasurecraft":return "Pleasure Craft";case "highspeed":return "High Speed";case "sar":return "SAR";case "law":return "Law Enforcement";default:return `${t.charAt(0).toUpperCase()}${t.slice(1)}`}}syncFiltersFromConfig(e){let t=e.ais?.filters;if(!t)return;let i=this.buildFilterSignature(t);i!==this.lastFiltersSignature&&(this.lastFiltersSignature=i,this.filterState.set({anchoredMoored:t.anchoredMoored??false,noCollisionRisk:t.noCollisionRisk??false,allAton:t.allAton??false,allButSar:t.allButSar??false,allVessels:t.allVessels??false,vesselTypes:new Set(t.vesselTypes??[])}));}buildFilterSignature(e){let t=[...e?.vesselTypes??[]].sort();return JSON.stringify({anchoredMoored:e?.anchoredMoored??false,noCollisionRisk:e?.noCollisionRisk??false,allAton:e?.allAton??false,allButSar:e?.allButSar??false,allVessels:e?.allVessels??false,vesselTypes:t})}buildFilterStateSignature(e){let t=[...e.vesselTypes].sort();return JSON.stringify({anchoredMoored:e.anchoredMoored,noCollisionRisk:e.noCollisionRisk,allAton:e.allAton,allButSar:e.allButSar,allVessels:e.allVessels,vesselTypes:t})}resolveRingCountForRange(e){return [3].find(i=>this.isNiceStep(e/i))??4}isNiceStep(e){return [.5,1,2,2.5,3,4,5,6,8,10,12,15,20,25].some(i=>Math.abs(e-i)<1e-6)}resolveRangeIndex(e){return e?Number(e.rangeIndex):0}buildTargets(e,t,i,s,r,o,n){let d=n.showLostTargets??true,u=n.showUnconfirmedTargets??true,b=`${t.latitude?.toFixed(6)}|${t.longitude?.toFixed(6)}`;this.lastOriginKey!==b&&(this.targetCache.clear(),this.lastOriginKey=b);let c=new Set;for(let a of e)c.add(a.id);for(let a of this.targetCache.keys())c.has(a)||this.targetCache.delete(a);for(let a of this.iconCache.keys())c.has(a)||this.iconCache.delete(a);let T=[];for(let a of e)a.ais.status==="remove"&&(this.targetCache.delete(a.id),this.iconCache.delete(a.id),this.selectedId()===a.id&&this.selectedId.set(null));let x=e.filter(a=>a.ais.status==="remove"||a.ais.status==="lost"&&!d||a.ais.status==="unconfirmed"&&!u||!a.position||!this.hasValidPosition(a.position)?false:!this.shouldFilterTarget(a));for(let a of x){let M=this.buildTrackSignature(a),S=this.targetCache.get(a.id);if(!S||S.signature!==M){let F=this.distanceNm(t,a.position),L=this.ais.getBearingTrue(t,a.position)??0,v=this.toDegreesIfRadians(this.isVesselLike(a)?a.headingTrue:null),te=this.toDegreesIfRadians(this.isVesselLike(a)?a.courseOverGroundTrue:null);S={signature:M,distanceNm:F,bearing:L,trackHeading:v,trackCog:te},this.targetCache.set(a.id,S);}if(S.distanceNm>s)continue;let{href:_,scale:C}=this.resolveIconCached(a),V=this.wrapDegrees(S.bearing-o),{x:m,y:B}=this.polarToCartesian(V,S.distanceNm,i,r),$=a.type==="aton"||a.type==="basestation"?0:this.wrapDegrees((S.trackHeading??S.trackCog??0)-o),U=this.buildClassName({id:a.id,status:a.ais.status,aisClass:a.ais.class,type:a.type,navState:this.isVesselLike(a)?a.navState:void 0});T.push({id:a.id,raw:a,x:m,y:B,heading:$,status:a.ais.status,aisClass:a.ais.class,type:a.type,iconHref:_,iconScale:C,navState:this.isVesselLike(a)?a.navState:void 0,sog:this.isVesselLike(a)?a.speedOverGround:void 0,cog:S.trackCog??null,className:U});}return T}renderTargetVectors(e,t,i,s,r){if(!this.vectorsLayer)return;let o=r.showCogVectors??true,n=Math.max(6,i*.04),d=(r.cogVectorsMinutes??5)*60,u=n*.8,b=[];for(let c of e)if(this.isVesselLike(c.raw)&&!this.isStationaryNavState(c.raw.navState)&&o&&typeof c.sog=="number"&&typeof c.cog=="number"){let T=this.wrapDegrees(c.cog-s),x=this.offsetPoint(c.x,c.y,T,u),a=c.sog*d/1852,M=Math.max(0,a/t*i-u);if(M<=0)continue;let S=this.offsetPoint(x.x,x.y,T,M),_=this.resolveTargetVectorStroke(c.raw);b.push({id:c.id,x1:x.x,y1:x.y,x2:S.x,y2:S.y,className:c.className,stroke:_});}this.renderVectorLines(this.vectorsLayer,"motion-vector",b);}renderOwnShipVector(e,t,i,s,r){if(!this.ownShipLayer)return;let o=Math.max(6,i*.04),n=(r.cogVectorsMinutes??5)*60,d=o*.8,u=[];if(!(r.showSelf??true)){this.ownShipVectorCache=null,this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);return}let c=this.toDegreesIfRadians(e.courseOverGroundTrue),T=e.speedOverGround;if(c===null||typeof T!="number"){this.ownShipVectorCache=null,this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);return}let x=T*n/1852,a=Math.max(0,x/t*i-d);if(a<=0){this.ownShipVectorCache=null,this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);return}let M=[c.toFixed(6),T.toFixed(6),t.toFixed(6),i.toFixed(6),n,d.toFixed(6)].join("|");if(!this.ownShipVectorCache||this.ownShipVectorCache.key!==M){let C=this.wrapDegrees(c),V=this.offsetPoint(0,0,C,d),m=this.offsetPoint(V.x,V.y,C,a);this.ownShipVectorCache={key:M,tipX:V.x,tipY:V.y,endX:m.x,endY:m.y};}let S=this.rotatePoint(this.ownShipVectorCache.tipX,this.ownShipVectorCache.tipY,-s),_=this.rotatePoint(this.ownShipVectorCache.endX,this.ownShipVectorCache.endY,-s);u.push({id:"ownship",x1:S.x,y1:S.y,x2:_.x,y2:_.y,className:"ownship-vector",stroke:"var(--kip-orange-color)"}),this.renderVectorLines(this.ownShipLayer,"ownship-vector",u);}rotatePoint(e,t,i){let s=i*Math.PI/180,r=Math.cos(s),o=Math.sin(s);return {x:e*r-t*o,y:e*o+t*r}}renderVectorLines(e,t,i){let s=e.selectAll(`line.${t}`).data(i,o=>o.id);s.enter().append("line").attr("class",o=>`${t} ${o.className}`).merge(s).attr("x1",o=>o.x1).attr("y1",o=>o.y1).attr("x2",o=>o.x2).attr("y2",o=>o.y2).style("stroke",o=>o.stroke??"#50505f").style("stroke-width",2).style("opacity",1).style("stroke-dasharray","15, 7"),s.exit().remove();let r=e.selectAll(`circle.${t}-tip`).data(i,o=>o.id);r.enter().append("circle").attr("class",o=>`${t}-tip ${o.className}`).merge(r).attr("cx",o=>o.x2).attr("cy",o=>o.y2).attr("r",2.5).style("fill",o=>o.stroke??"#50505f").style("stroke",o=>o.stroke??"#50505f").style("stroke-width",2).style("opacity",1).style("stroke-dasharray","15, 7"),r.exit().remove();}renderTargets(e,t){if(!this.targetsLayer)return;let i=this.resolveTargetBaseSize(t),s=this.targetsLayer.selectAll("g.target").data(e,n=>n.id),r=s.enter().append("g").on("click",(n,d)=>{n.stopPropagation(),this.handleTargetClick(n,d);});r.append("image").attr("class","target-icon"),r.append("title");let o=r.merge(s);o.attr("transform",n=>`translate(${n.x}, ${n.y}) rotate(${n.heading})`).attr("class",n=>`target ${n.className}`),o.select("image.target-icon").attr("href",n=>n.iconHref??null).attr("xlink:href",n=>n.iconHref??null).attr("display",n=>n.iconHref?null:"none").attr("width",n=>i*n.iconScale).attr("height",n=>i*n.iconScale).attr("x",n=>-(i*n.iconScale)/2).attr("y",n=>-(i*n.iconScale)/2),o.select("title").text(n=>`${n.raw.name??n.raw.mmsi??"AIS Target"}`),s.exit().remove();}renderSelected(e,t){if(!this.selectedLayer)return;let i=e.filter(u=>u.id===this.selectedId()),s=this.resolveTargetBaseSize(t),r=s*1.4,o=Math.min(r,Math.max(4,s*.6)),n=this.buildCornerBoxPath(r,o),d=this.selectedLayer.selectAll("path.selected-ring").data(i,u=>u.id);d.enter().append("path").attr("class","selected-ring").merge(d).attr("transform",u=>`translate(${u.x}, ${u.y})`).attr("d",n),d.exit().remove();}resolveTargetBaseSize(e){let t=Math.max(.2,e);return l.TARGET_ICON_SIZE_PX/t}resolveOwnShipBaseSize(e){let t=Math.max(.2,e);return l.OWN_SHIP_ICON_SIZE_PX/t}raiseOwnshipAndVector(){this.ownShipLayer?.raise();}onMenuItemSelect(e){this.openTargetDialog(e.target,e.iconHref),this.selectedId.set(null),this.closeTargetMenu();}handleTargetClick(e,t){let i=this.resolveMenuItems(e,t);if(i.length<=1){this.openTargetDialog(t.raw,t.iconHref);return}this.menuItems.set(i),this.menuPoint=this.resolveMenuPoint(e),this.positionMenuAnchor(),this.menuTrigger().openMenu();}openTargetDialog(e,t){this.selectedId.set(e.id);let i=this.snapshotAisTrack(e);this.dialog.openAisDetailDialog({title:this.buildTargetTitle(i),iconHref:t??void 0,component:"ais-target",componentType:cn,payload:{target:i}}).subscribe();}snapshotAisTrack(e){return structuredClone(e)}resolveMenuItems(e,t){return this.findTargetsNearEvent(e,t).map(s=>({id:s.id,label:this.buildTargetMenuLabel(s.raw),iconHref:s.iconHref,target:s.raw}))}findTargetsNearEvent(e,t){let i=this.lastRenderTargets.length?this.lastRenderTargets:[t],s=this.eventToRadarPoint(e);if(!s)return [t];let r=this.hitRadiusPx/this.lastRenderScale,o=i.map((n,d)=>{let u=n.x-s.x,b=n.y-s.y,c=Math.hypot(u,b);return {candidate:n,distance:c,index:d}}).filter(n=>n.distance<=r).sort((n,d)=>n.distance-d.distance||n.index-d.index).map(n=>n.candidate);return o.length?o:[t]}eventToRadarPoint(e){if(!this.lastRenderSize)return null;let s=this.svgRef().nativeElement.getBoundingClientRect(),r=e.clientX-s.left,o=e.clientY-s.top,n=(r-s.width/2)/this.lastRenderScale,d=(o-s.height/2)/this.lastRenderScale,u=this.lastViewRotation*Math.PI/180,b=Math.cos(u),c=Math.sin(u);return {x:n*b-d*c,y:n*c+d*b}}resolveMenuPoint(e){let t=this.svgRef().nativeElement.closest(".ais-radar-container");if(!t)return null;let i=t.getBoundingClientRect();return {x:e.clientX-i.left,y:e.clientY-i.top}}positionMenuAnchor(){let e=this.menuAnchorRef().nativeElement;this.menuPoint&&(e.style.left=`${this.menuPoint.x}px`,e.style.top=`${this.menuPoint.y}px`);}closeTargetMenu(){this.resetTargetMenuState(),this.menuTrigger().menuOpen&&this.menuTrigger().closeMenu();}resetTargetMenuState(){this.menuItems.set([]),this.menuPoint=null;}buildTargetMenuLabel(e){return this.isAton(e)&&e.typeName?e.typeName:e.name??e.mmsi??"AIS Target"}buildTargetTitle(e){let t=this.isAton(e)&&e.typeName?e.typeName:e.name??e.type??"AIS Target",i=e.ais.status;return i==="unconfirmed"||i==="lost"||i==="remove"?`${t} - ${i}`:t}resolveIconCached(e){let t=this.buildIconSignature(e),i=this.iconCache.get(e.id);if(i&&i.signature===t)return i.icon;let s=this.resolveIconScale(e.type),r={href:i?.icon.href??null,scale:s};this.iconCache.set(e.id,{signature:t,icon:r});let o=e.ais.status==="remove"?void 0:e.ais.status;return this.ngZone.runOutsideAngular(()=>{nc({mmsi:e.mmsi??"",type:e.type,navState:this.isVesselLike(e)?e.navState:void 0,aisShipTypeId:this.isVesselLike(e)?e.design?.aisShipType?.id:void 0,atonVirtual:this.isAton(e)?e.virtual:void 0,atonTypeId:this.isAton(e)?e.typeId:void 0,status:o,collisionRiskRating:this.isVesselLike(e)?e.closestApproach?.collisionRiskRating:void 0}).then(n=>{let d=this.iconCache.get(e.id);!d||d.signature!==t||(d.icon={href:n,scale:s},this.scheduleRenderDebounced());});}),r}resolveIconScale(e){switch(e){case "aton":return 3.5;case "basestation":return 3;case "sar":return 2.4;case "vessel":return 3;default:return 2.4}}buildIconSignature(e){let t=e.ais.status==="lost"?"unconfirmed":e.ais.status;return [e.mmsi,e.type,this.isVesselLike(e)?e.navState:void 0,this.isVesselLike(e)?e.design?.aisShipType?.id:void 0,this.isAton(e)?e.virtual:void 0,this.isAton(e)?e.typeId:void 0,t,this.isVesselLike(e)?e.closestApproach?.collisionRiskRating:void 0].join("|")}buildClassName(e){let t=[`status-${e.status}`,`type-${e.type}`,e.aisClass?`class-${e.aisClass.toLowerCase()}`:"class-unknown"];if(e.navState){let i=e.navState.toLowerCase();i.includes("moored")&&t.push("state-moored"),i.includes("anchored")&&t.push("state-anchored");}return e.id===this.selectedId()&&t.push("is-selected"),t.join(" ")}resolveTargetVectorStroke(e){if(e.ais.status!=="confirmed")return "#50505f";let t=e.closestApproach?.collisionRiskRating,i=typeof t=="number"?t:Number(t);return Number.isFinite(i)?i<qn?"red":i<zn?"yellow":"#50505f":"#50505f"}shouldFilterTarget(e){let t=this.filterState();if(!t.anchoredMoored&&!t.noCollisionRisk&&!t.allAton&&!t.allButSar&&!t.allVessels&&t.vesselTypes.size===0)return false;if(t.anchoredMoored&&this.isVesselLike(e)&&this.isStationaryNavState(e.navState)||t.noCollisionRisk&&this.isVesselLike(e)&&(e.ais.status!=="confirmed"||this.isStationaryNavState(e.navState)||this.isNoCollisionRisk(e))||t.allAton&&e.type==="aton"||t.allButSar&&e.type!=="sar"||t.allVessels&&this.isVesselLike(e))return true;if(t.vesselTypes.size>0&&this.isVesselLike(e)){let i=this.resolveVesselIconKey(e);if(i&&t.vesselTypes.has(i))return true}return false}isNoCollisionRisk(e){let t=e.closestApproach?.collisionRiskRating;if(!Object.prototype.hasOwnProperty.call(e.closestApproach??{},"collisionRiskRating"))return false;if(t==null)return true;let i=typeof t=="number"?t:Number(t);return Number.isFinite(i)?i>=zn:true}resolveVesselIconKey(e){if(!this.isVesselLike(e))return null;let t=pa({mmsi:e.mmsi??e.id??"",type:e.type,aisShipTypeId:e.design?.aisShipType?.id});return t.startsWith("vessel/")?t:null}polarToCartesian(e,t,i,s){let r=e*Math.PI/180,o=t/i*s;return {x:o*Math.sin(r),y:-o*Math.cos(r)}}hasValidPosition(e){return typeof e?.latitude=="number"&&Number.isFinite(e.latitude)&&typeof e?.longitude=="number"&&Number.isFinite(e.longitude)}offsetPoint(e,t,i,s){let r=i*Math.PI/180;return {x:e+s*Math.sin(r),y:t-s*Math.cos(r)}}wrapDegrees(e){let t=e%360;return t<0?t+360:t}isStationaryNavState(e){if(typeof e=="number"&&Number.isFinite(e))return e===1||e===5;if(typeof e!="string")return false;let t=e.trim().toLowerCase().replace(/\s+/g," ");if(!t.length)return false;let i=Number(t);return Number.isFinite(i)?i===1||i===5:t.includes("moored")||t.includes("anchored")||t.includes("at anchor")}shortestAngleDelta(e,t){return (t-e+540)%360-180}buildTrackSignature(e){let t=e.position??{};return [t.latitude,t.longitude,this.isVesselLike(e)?e.headingTrue:void 0,this.isVesselLike(e)?e.courseOverGroundTrue:void 0].join("|")}isVesselLike(e){return e.type==="vessel"||e.type==="sar"}isAton(e){return e.type==="aton"}buildCornerBoxPath(e,t){let i=e,s=Math.min(Math.max(t,0),i);return [`M ${-i} ${-i} h ${s}`,`M ${-i} ${-i} v ${s}`,`M ${i} ${-i} h ${-s}`,`M ${i} ${-i} v ${s}`,`M ${-i} ${i} h ${s}`,`M ${-i} ${i} v ${-s}`,`M ${i} ${i} h ${-s}`,`M ${i} ${i} v ${-s}`].join(" ")}smoothRotation(e){let t=performance.now();if(this.viewRotationSmoothed===null||this.lastRotationAt===null)return this.viewRotationSmoothed=this.wrapDegrees(e),this.lastRotationAt=t,this.viewRotationSmoothed;let i=Math.min(250,Math.max(0,t-this.lastRotationAt)),s=Math.min(1,i/200),r=this.shortestAngleDelta(this.viewRotationSmoothed,e);return this.viewRotationSmoothed=this.wrapDegrees(this.viewRotationSmoothed+r*s),this.lastRotationAt=t,this.viewRotationSmoothed}toDegreesIfRadians(e){return typeof e!="number"||!Number.isFinite(e)?null:this.units.convertToUnit("deg",e)}distanceNm(e,t){let s=e.latitude*Math.PI/180,r=t.latitude*Math.PI/180,o=(t.latitude-e.latitude)*Math.PI/180,n=(t.longitude-e.longitude)*Math.PI/180,d=Math.sin(o/2),u=Math.sin(n/2),b=d*d+Math.cos(s)*Math.cos(r)*u*u;return 6371e3*(2*Math.atan2(Math.sqrt(b),Math.sqrt(1-b)))/1852}ngOnDestroy(){this.renderFrame&&(cancelAnimationFrame(this.renderFrame),this.renderFrame=null),this.rotationFrameTimer!==null&&(window.clearTimeout(this.rotationFrameTimer),this.rotationFrameTimer=null),this.iconRenderTimer!==null&&(window.clearTimeout(this.iconRenderTimer),this.iconRenderTimer=null);}static \u0275fac=function(t){return new(t||l)};static \u0275cmp=JD({type:l,selectors:[["widget-ais-radar"]],viewQuery:function(t,i){t&1&&eg(i.svgRef,lt,5)(i.menuAnchorRef,ct,5)(i.menuTrigger,dt,5),t&2&&Kw(3);},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:29,vars:9,consts:[["radarSvg",""],["menuAnchor","","menuTrigger","matMenuTrigger"],["targetMenu","matMenu"],["filterMenu","matMenu"],["vesselTypeMenu","matMenu"],["kipResizeObserver","",1,"ais-radar-container",3,"kipResize"],["type","button","matMiniFab","",1,"ais-radar-mode-toggle-button",3,"click","matTooltip"],["viewBox","0 0 40 40","aria-hidden","true",1,"ais-mode-icon"],["type","button","matMiniFab","","matTooltip","Increase range","aria-label","Increase range",1,"ais-radar-range-button","ais-radar-range-plus",3,"click"],["type","button","matMiniFab","","matTooltip","Decrease range","aria-label","Decrease range",1,"ais-radar-range-button","ais-radar-range-minus",3,"click"],["type","button","matMiniFab","","matTooltip","Filter targets","aria-label","Filter targets",1,"ais-radar-range-button","ais-radar-filter-button",3,"matMenuTriggerFor"],["type","button","matMiniFab","","matTooltip","Show only collision risk targets","aria-label","No collision risk filter",1,"ais-radar-range-button","ais-radar-collision-button",3,"is-active"],["role","img","aria-label","AIS radar display",1,"ais-radar"],["type","button","aria-hidden","true","tabindex","-1",1,"ais-radar-menu-anchor",3,"matMenuTriggerFor"],[3,"closed"],["matMenuContent",""],[1,"widgetOverlay"],["stroke","currentColor","d","M10 8 L20 2 L30 8",1,"ais-mode-icon-chev"],["fill","currentColor","x","20","y","31",1,"ais-mode-icon-letter"],["fill","currentColor","d","M20 4 L34 36 L20 28 L6 36 Z",1,"ais-mode-icon-vessel"],["type","button","matMiniFab","","matTooltip","Show only collision risk targets","aria-label","No collision risk filter",1,"ais-radar-range-button","ais-radar-collision-button",3,"click"],["mat-menu-item","","type","button",1,"ais-radar-menu-item"],["mat-menu-item","","type","button",1,"ais-radar-menu-item",3,"click"],["alt","","aria-hidden","true",1,"target-menu-icon"],[1,"target-menu-label"],["mat-menu-item","","disabled","",1,"ais-filter-menu-header"],["mat-menu-item","","type","button",3,"click"],["aria-hidden","true",1,"ais-filter-check"],["mat-menu-item","",3,"matMenuTriggerFor"],["mat-menu-item","","type","button"]],template:function(t,i){if(t&1&&(Pi(0,"div",5),Qh("kipResize",function(r){return i.onResized(r)}),Pi(1,"button",6),Qh("click",function(){return i.toggleViewMode()}),_w(2,ut,4,0,":svg:svg",7)(3,mt,2,0,":svg:svg",7),ul(),Pi(4,"button",8),Qh("click",function(){return i.incrementRange()}),Pi(5,"mat-icon"),TT(6,"add"),ul()(),Pi(7,"button",9),Qh("click",function(){return i.decrementRange()}),Pi(8,"mat-icon"),TT(9,"remove"),ul()(),Pi(10,"button",10)(11,"mat-icon"),TT(12,"filter_list"),ul()(),_w(13,gt,3,2,"button",11),wd(),$h(14,"svg",12,0),Td(),$h(16,"button",13,1),ul(),Pi(19,"mat-menu",14,2),Qh("closed",function(){return i.resetTargetMenuState()}),xh(21,ft,2,0,"ng-template",15),ul(),Pi(22,"mat-menu",null,3),xh(24,St,27,5,"ng-template",15),ul(),Pi(25,"mat-menu",null,4),xh(27,bt,2,0,"ng-template",15),ul(),_w(28,yt,1,0,"div",16)),t&2){let s=Jw(20),r=Jw(23);EE(),Bh("matTooltip",i.effectiveViewMode()==="north-up"?"Change to North-Up mode":"Change to Course-Up mode"),Hh("aria-label",i.effectiveViewMode()==="north-up"?"North up mode":"Course up mode"),EE(),Mw(i.effectiveViewMode()==="north-up"?2:3),EE(8),sg("is-active",i.hasActiveFilters()),Bh("matMenuTriggerFor",r),EE(3),Mw(i.hasCollisionRiskData()?13:-1),EE(3),Bh("matMenuTriggerFor",s),EE(12),Mw(i.dashboard.isDashboardStatic()?-1:28);}},dependencies:[u,Op,Rp,yt$1,wt,Ht,R,ee,Nt,Lt,zt,mt$1],encapsulation:2})}return l})();export{Qt as WidgetAisRadarComponent};
@@ -1 +1 @@
1
- import {a as a$1}from'./chunk-ibauGmSP.js';import {d1 as Hj,w,du as p,G as Gi,N,aX as He,a as G,$ as $j,W as Wp,F as Fa,dn as ge,J as JD,_ as _w,M as Mw,f as eg,K as Kw,H as Dr,eb as rw,cp as Uh,bD as HT,g as qw,b_ as Gh,bE as $T,ci as dl,cj as fl,e as EE,dP as pp}from'./main-YKDNK5VZ.js';var R=(()=>{class n{sanitizer=w(Dr);transform(e){return this.sanitizer.bypassSecurityTrustResourceUrl(e)}static \u0275fac=function(t){return new(t||n)};static \u0275pipe=rw({name:"safe",type:n,pure:true})}return n})();var $=["freeboardSkIframe"];function z(n,v){if(n&1&&(Uh(0,"iframe",1,0),HT(2,"safe")),n&2){let e=qw();Gh("src",$T(2,1,e.widgetUrlSafe),pp);}}function A(n,v){n&1&&Uh(0,"div",4);}function B(n,v){if(n&1&&(dl(0,"div",2),Uh(1,"iframe",3,0),HT(3,"safe"),_w(4,A,1,0,"div",4),fl()),n&2){let e=qw();EE(),Gh("src",$T(3,2,e.widgetUrlSafe),pp),EE(3),Mw(e.dashboard.isDashboardStatic()?-1:4);}}var ae=(()=>{class n{id=Hj();type=Hj();theme=Hj();disableWidgetShell=Hj(false);swipeDisabled=Hj(false);runtime=w(p,{optional:true});appSettings=w(Gi);app=w(N);auth=w(He);dashboard=w(G);iframe=$j.required("freeboardSkIframe");authToken=Wp(this.auth.authToken$,{initialValue:null});viewReady=false;iframeLoaded=false;widgetUrl=null;widgetUrlSafe="";static DEFAULT_CONFIG={};constructor(){window.addEventListener("message",this.handleIframeGesture),Fa(()=>{let e=this.authToken();ge(()=>{let t=e?.token,i=this.appSettings.signalkUrl?.url;this.widgetUrl=i?t?`${i}/@signalk/freeboard-sk/?token=${t}`:`${i}/@signalk/freeboard-sk/`:null,this.widgetUrlSafe=this.widgetUrl??"";});}),Fa(()=>{let e=this.app.isNightMode();ge(()=>{!this.iframeLoaded||!this.viewReady||this.appSettings.getRedNightMode()&&this.sendMessage({commands:{nightModeEnable:e}});});});}ngAfterViewInit(){this.viewReady=true;try{this.iframe().nativeElement.onload=()=>{this.iframeLoaded=!0,this.sendMessage({settings:{autoNightMode:!1}}),this.injectSwipeScript();};}catch(e){}}sendMessage(e,t="*"){let i=this.iframe()?.nativeElement?.contentWindow;i&&this.iframeLoaded&&i.postMessage(e,t);}injectSwipeScript(){if(this.swipeDisabled())return;let e=this.iframe().nativeElement.contentWindow,t=this.iframe().nativeElement.contentDocument;if(!t||!e){console.error("[FSK Widget] Iframe contentDocument or contentWindow is undefined.");return}try{let i=`kip-gesture-inject-${this.id()}`;if(t.getElementById(i))return;let s=a$1({instanceId:this.id()}),r=t.createElement("script");r.id=i,r.textContent=s,t.body.appendChild(r);}catch(i){console.warn("[FSK Widget] Failed to inject swipe script into iframe:",i);}}handleIframeGesture=e=>{if(!e.data||!this.viewReady)return;let t=null;try{t=this.iframe()?.nativeElement?.contentWindow??null;}catch(r){t=null;}if(!t||e.source!==t)return;let i=this.getExpectedIframeOrigin();if(i&&e.origin!==i)return;let s=this.id();if(e.data.gesture&&e.data.eventData?.instanceId===s)switch(e.data.gesture){case "swipeup":this.dashboard.isDashboardStatic()&&this.dashboard.navigateToPreviousDashboard();break;case "swipedown":this.dashboard.isDashboardStatic()&&this.dashboard.navigateToNextDashboard();break;case "swipeleft":window.document.dispatchEvent(new Event("openLeftSidenav",{bubbles:true,cancelable:true}));break;case "swiperight":window.document.dispatchEvent(new Event("openRightSidenav",{bubbles:true,cancelable:true}));break}if(e.data.type==="keydown"&&e.data.keyEventData?.instanceId===s){let{key:r,ctrlKey:L,shiftKey:O}=e.data.keyEventData,P=new KeyboardEvent("keydown",{key:r,ctrlKey:L,shiftKey:O,bubbles:true,cancelable:true});document.dispatchEvent(P);}};getExpectedIframeOrigin(){let e=this.widgetUrl||this.appSettings.signalkUrl?.url;if(!e)return null;try{return new URL(e).origin}catch(t){return null}}ngOnDestroy(){if(window.removeEventListener("message",this.handleIframeGesture),this.iframe){try{this.iframe().nativeElement.onload=null;}catch(e){}try{let e=this.iframe()?.nativeElement.contentDocument;if(e){let t=`kip-gesture-inject-${this.id()}`,i=e.getElementById(t);i&&i.parentNode&&i.parentNode.removeChild(i);}}catch(e){}}}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["widget-freeboardsk"]],viewQuery:function(t,i){t&1&&eg(i.iframe,$,5),t&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],disableWidgetShell:[1,"disableWidgetShell"],swipeDisabled:[1,"swipeDisabled"]},decls:2,vars:1,consts:[["freeboardSkIframe",""],["width","100%","height","100%","frameborder","0","sandbox","allow-same-origin allow-scripts allow-forms",1,"freeboardsk-iframe","no-shell",3,"src"],[1,"widget-shell",2,"overflow","clip","position","relative","width","100%","height","100%"],["width","100%","height","100%","frameborder","0","sandbox","allow-same-origin allow-scripts allow-forms",1,"freeboardsk-iframe",3,"src"],[1,"widgetOverlay"]],template:function(t,i){t&1&&_w(0,z,3,3,"iframe",1)(1,B,5,4,"div",2),t&2&&Mw(i.disableWidgetShell()?0:1);},dependencies:[R],styles:[".widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent}"]})}return n})();export{ae as WidgetFreeboardskComponent};
1
+ import {a as a$1}from'./chunk-D59G2Xua.js';import {d1 as Hj,w,du as p,G as Gi,N,aX as He,a as G,$ as $j,W as Wp,F as Fa,dn as ge,J as JD,_ as _w,M as Mw,f as eg,K as Kw,H as Dr,eb as rw,cp as Uh,bD as HT,g as qw,b_ as Gh,bE as $T,ci as dl,cj as fl,e as EE,dP as pp}from'./main-IINF7HD6.js';var R=(()=>{class n{sanitizer=w(Dr);transform(e){return this.sanitizer.bypassSecurityTrustResourceUrl(e)}static \u0275fac=function(t){return new(t||n)};static \u0275pipe=rw({name:"safe",type:n,pure:true})}return n})();var $=["freeboardSkIframe"];function z(n,v){if(n&1&&(Uh(0,"iframe",1,0),HT(2,"safe")),n&2){let e=qw();Gh("src",$T(2,1,e.widgetUrlSafe),pp);}}function A(n,v){n&1&&Uh(0,"div",4);}function B(n,v){if(n&1&&(dl(0,"div",2),Uh(1,"iframe",3,0),HT(3,"safe"),_w(4,A,1,0,"div",4),fl()),n&2){let e=qw();EE(),Gh("src",$T(3,2,e.widgetUrlSafe),pp),EE(3),Mw(e.dashboard.isDashboardStatic()?-1:4);}}var ae=(()=>{class n{id=Hj();type=Hj();theme=Hj();disableWidgetShell=Hj(false);swipeDisabled=Hj(false);runtime=w(p,{optional:true});appSettings=w(Gi);app=w(N);auth=w(He);dashboard=w(G);iframe=$j.required("freeboardSkIframe");authToken=Wp(this.auth.authToken$,{initialValue:null});viewReady=false;iframeLoaded=false;widgetUrl=null;widgetUrlSafe="";static DEFAULT_CONFIG={};constructor(){window.addEventListener("message",this.handleIframeGesture),Fa(()=>{let e=this.authToken();ge(()=>{let t=e?.token,i=this.appSettings.signalkUrl?.url;this.widgetUrl=i?t?`${i}/@signalk/freeboard-sk/?token=${t}`:`${i}/@signalk/freeboard-sk/`:null,this.widgetUrlSafe=this.widgetUrl??"";});}),Fa(()=>{let e=this.app.isNightMode();ge(()=>{!this.iframeLoaded||!this.viewReady||this.appSettings.getRedNightMode()&&this.sendMessage({commands:{nightModeEnable:e}});});});}ngAfterViewInit(){this.viewReady=true;try{this.iframe().nativeElement.onload=()=>{this.iframeLoaded=!0,this.sendMessage({settings:{autoNightMode:!1}}),this.injectSwipeScript();};}catch(e){}}sendMessage(e,t="*"){let i=this.iframe()?.nativeElement?.contentWindow;i&&this.iframeLoaded&&i.postMessage(e,t);}injectSwipeScript(){if(this.swipeDisabled())return;let e=this.iframe().nativeElement.contentWindow,t=this.iframe().nativeElement.contentDocument;if(!t||!e){console.error("[FSK Widget] Iframe contentDocument or contentWindow is undefined.");return}try{let i=`kip-gesture-inject-${this.id()}`;if(t.getElementById(i))return;let s=a$1({instanceId:this.id()}),r=t.createElement("script");r.id=i,r.textContent=s,t.body.appendChild(r);}catch(i){console.warn("[FSK Widget] Failed to inject swipe script into iframe:",i);}}handleIframeGesture=e=>{if(!e.data||!this.viewReady)return;let t=null;try{t=this.iframe()?.nativeElement?.contentWindow??null;}catch(r){t=null;}if(!t||e.source!==t)return;let i=this.getExpectedIframeOrigin();if(i&&e.origin!==i)return;let s=this.id();if(e.data.gesture&&e.data.eventData?.instanceId===s)switch(e.data.gesture){case "swipeup":this.dashboard.isDashboardStatic()&&this.dashboard.navigateToPreviousDashboard();break;case "swipedown":this.dashboard.isDashboardStatic()&&this.dashboard.navigateToNextDashboard();break;case "swipeleft":window.document.dispatchEvent(new Event("openLeftSidenav",{bubbles:true,cancelable:true}));break;case "swiperight":window.document.dispatchEvent(new Event("openRightSidenav",{bubbles:true,cancelable:true}));break}if(e.data.type==="keydown"&&e.data.keyEventData?.instanceId===s){let{key:r,ctrlKey:L,shiftKey:O}=e.data.keyEventData,P=new KeyboardEvent("keydown",{key:r,ctrlKey:L,shiftKey:O,bubbles:true,cancelable:true});document.dispatchEvent(P);}};getExpectedIframeOrigin(){let e=this.widgetUrl||this.appSettings.signalkUrl?.url;if(!e)return null;try{return new URL(e).origin}catch(t){return null}}ngOnDestroy(){if(window.removeEventListener("message",this.handleIframeGesture),this.iframe){try{this.iframe().nativeElement.onload=null;}catch(e){}try{let e=this.iframe()?.nativeElement.contentDocument;if(e){let t=`kip-gesture-inject-${this.id()}`,i=e.getElementById(t);i&&i.parentNode&&i.parentNode.removeChild(i);}}catch(e){}}}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=JD({type:n,selectors:[["widget-freeboardsk"]],viewQuery:function(t,i){t&1&&eg(i.iframe,$,5),t&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"],disableWidgetShell:[1,"disableWidgetShell"],swipeDisabled:[1,"swipeDisabled"]},decls:2,vars:1,consts:[["freeboardSkIframe",""],["width","100%","height","100%","frameborder","0","sandbox","allow-same-origin allow-scripts allow-forms",1,"freeboardsk-iframe","no-shell",3,"src"],[1,"widget-shell",2,"overflow","clip","position","relative","width","100%","height","100%"],["width","100%","height","100%","frameborder","0","sandbox","allow-same-origin allow-scripts allow-forms",1,"freeboardsk-iframe",3,"src"],[1,"widgetOverlay"]],template:function(t,i){t&1&&_w(0,z,3,3,"iframe",1)(1,B,5,4,"div",2),t&2&&Mw(i.disableWidgetShell()?0:1);},dependencies:[R],styles:[".widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent}"]})}return n})();export{ae as WidgetFreeboardskComponent};
@@ -1 +1 @@
1
- import {d1 as Hj,w,du as p$1,aZ as R,$ as $j,v as vt,F as Fa,dn as ge,J as JD,cp as Uh,f as eg,K as Kw}from'./main-YKDNK5VZ.js';var p=["canvasMainRef"],M=(()=>{class s{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p$1);canvas=w(R);static DEFAULT_CONFIG={displayName:"Static Label",color:"green",bgColor:"grey",noColor:false,noBgColor:true};canvasRef=$j.required("canvasMainRef");canvasElement=null;ctx=null;cssWidth=0;cssHeight=0;maxTextWidth=0;maxTextHeight=0;disposed=false;fgColor=vt("");bgColor=vt("");constructor(){Fa(()=>{let t=this.runtime.options(),e=this.theme();!t||!e||ge(()=>{this.fgColor.set(this.mapColor(t.color??"contrast",e)),this.bgColor.set(this.mapColor(t.bgColor??"grey",e)),this.draw();});}),Fa(()=>{let t=this.runtime.options()?.displayName;ge(()=>{t!==void 0&&this.draw();});});}mapColor(t,e){switch(t){case "contrast":return e.contrast;case "blue":return e.blue;case "green":return e.green;case "pink":return e.pink;case "orange":return e.orange;case "purple":return e.purple;case "grey":return e.grey;case "yellow":return e.yellow;default:return e.contrast}}ngAfterViewInit(){this.canvasElement=this.canvasRef().nativeElement,this.ctx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(t,e)=>{this.cssWidth=t,this.cssHeight=e,this.draw();}}),this.cssHeight=Math.round(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.round(this.canvasElement.getBoundingClientRect().width),this.draw();}draw(){if(!this.ctx||!this.canvasElement)return;let t=this.runtime.options();if(!t)return;this.canvas.clearCanvas(this.ctx,this.cssWidth,this.cssHeight),t.noBgColor||this.canvas.drawRectangle(this.ctx,0,0,this.canvasElement.width,this.canvasElement.height,this.bgColor());let e=t.displayName||"";this.canvas.drawText(this.ctx,e,Math.floor(this.cssWidth/2),Math.floor(this.cssHeight/2+10),this.cssWidth-40,this.cssHeight-40,"bold",this.fgColor());}ngOnDestroy(){this.disposed=true;try{this.canvasElement&&this.canvas.unregisterCanvas(this.canvasElement);}catch(t){}}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=JD({type:s,selectors:[["widget-label"]],viewQuery:function(e,c){e&1&&eg(c.canvasRef,p,5),e&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:0,consts:[["canvasMainRef",""],[1,"label-canvas"]],template:function(e,c){e&1&&Uh(0,"canvas",1,0);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow:hidden}.label-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;display:block;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}"]})}return s})();export{M as WidgetLabelComponent};
1
+ import {d1 as Hj,w,du as p$1,aZ as R,$ as $j,v as vt,F as Fa,dn as ge,J as JD,cp as Uh,f as eg,K as Kw}from'./main-IINF7HD6.js';var p=["canvasMainRef"],M=(()=>{class s{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p$1);canvas=w(R);static DEFAULT_CONFIG={displayName:"Static Label",color:"green",bgColor:"grey",noColor:false,noBgColor:true};canvasRef=$j.required("canvasMainRef");canvasElement=null;ctx=null;cssWidth=0;cssHeight=0;maxTextWidth=0;maxTextHeight=0;disposed=false;fgColor=vt("");bgColor=vt("");constructor(){Fa(()=>{let t=this.runtime.options(),e=this.theme();!t||!e||ge(()=>{this.fgColor.set(this.mapColor(t.color??"contrast",e)),this.bgColor.set(this.mapColor(t.bgColor??"grey",e)),this.draw();});}),Fa(()=>{let t=this.runtime.options()?.displayName;ge(()=>{t!==void 0&&this.draw();});});}mapColor(t,e){switch(t){case "contrast":return e.contrast;case "blue":return e.blue;case "green":return e.green;case "pink":return e.pink;case "orange":return e.orange;case "purple":return e.purple;case "grey":return e.grey;case "yellow":return e.yellow;default:return e.contrast}}ngAfterViewInit(){this.canvasElement=this.canvasRef().nativeElement,this.ctx=this.canvasElement.getContext("2d"),this.canvas.registerCanvas(this.canvasElement,{autoRelease:true,onResize:(t,e)=>{this.cssWidth=t,this.cssHeight=e,this.draw();}}),this.cssHeight=Math.round(this.canvasElement.getBoundingClientRect().height),this.cssWidth=Math.round(this.canvasElement.getBoundingClientRect().width),this.draw();}draw(){if(!this.ctx||!this.canvasElement)return;let t=this.runtime.options();if(!t)return;this.canvas.clearCanvas(this.ctx,this.cssWidth,this.cssHeight),t.noBgColor||this.canvas.drawRectangle(this.ctx,0,0,this.canvasElement.width,this.canvasElement.height,this.bgColor());let e=t.displayName||"";this.canvas.drawText(this.ctx,e,Math.floor(this.cssWidth/2),Math.floor(this.cssHeight/2+10),this.cssWidth-40,this.cssHeight-40,"bold",this.fgColor());}ngOnDestroy(){this.disposed=true;try{this.canvasElement&&this.canvas.unregisterCanvas(this.canvasElement);}catch(t){}}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=JD({type:s,selectors:[["widget-label"]],viewQuery:function(e,c){e&1&&eg(c.canvasRef,p,5),e&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:2,vars:0,consts:[["canvasMainRef",""],[1,"label-canvas"]],template:function(e,c){e&1&&Uh(0,"canvas",1,0);},styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;overflow:hidden}.label-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;display:block;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}"]})}return s})();export{M as WidgetLabelComponent};
@@ -1 +1 @@
1
- import {a as a$1}from'./chunk-ibauGmSP.js';import {d1 as Hj,w,du as p,a as G,H as Dr,G as Gi,$ as $j,v as vt,F as Fa,dn as ge,J as JD,cp as Uh,b_ as Gh,e as EE,d as ig,f as eg,K as Kw,dP as pp}from'./main-YKDNK5VZ.js';var C=["plainIframe"],j=(()=>{class a{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);_dashboard=w(G);_sanitizer=w(Dr);settings=w(Gi);static DEFAULT_CONFIG={};iframe=$j.required("plainIframe");widgetUrl=null;displayTransparentOverlay=vt("block");constructor(){let e=new URL("/signalk-anchoralarm-plugin/",window.location.origin);this.widgetUrl=this.toSafeResourceUrl(e),Fa(()=>{let i=this.runtime.options(),t=this._dashboard.isDashboardStatic();i&&ge(()=>{t?this.displayTransparentOverlay.set("none"):this.displayTransparentOverlay.set("block");});}),window.addEventListener("message",this.handleIframeGesture);}toSafeResourceUrl(e){return e.origin!==window.location.origin||!e.pathname.startsWith("/signalk-anchoralarm-plugin/")?null:this._sanitizer.bypassSecurityTrustResourceUrl(e.toString())}ngAfterViewInit(){if(this.iframe()){this.iframe().nativeElement.onload=()=>this.injectSwipeScript();try{let e=this.iframe().nativeElement.contentDocument;e&&(e.readyState==="complete"||e.readyState==="interactive")&&this.injectSwipeScript();}catch(e){}}}handleIframeGesture=e=>{if(!e.data)return;let i=e.data?.eventData?.instanceId||e.data?.keyEventData?.instanceId;if(!(!i||i!==this.id())){if(e.data.gesture)switch(e.data.gesture){case "swipeup":this._dashboard.navigateToPreviousDashboard();break;case "swipedown":this._dashboard.navigateToNextDashboard();break;case "swipeleft":{let t=new Event("openLeftSidenav",{bubbles:true,cancelable:true});window.document.dispatchEvent(t);break}case "swiperight":{let t=new Event("openRightSidenav",{bubbles:true,cancelable:true});window.document.dispatchEvent(t);break}}if(e.data.type==="keydown"&&e.data.keyEventData){let{key:t,ctrlKey:s,shiftKey:n}=e.data.keyEventData,I=new KeyboardEvent("keydown",{key:t,ctrlKey:s,shiftKey:n,bubbles:true,cancelable:true});document.dispatchEvent(I);}}};injectSwipeScript(){let e=this.iframe().nativeElement.contentWindow,i=this.iframe().nativeElement.contentDocument;if(!i||!e){console.error("[WidgetIframe] Iframe contentDocument or contentWindow is undefined. Possible cross-origin issue or iframe not fully loaded.");return}try{let t=`kip-gesture-inject-${this.id()}`;if(i.getElementById(t))return;let s=a$1({instanceId:this.id()}),n=i.createElement("script");n.id=t,n.textContent=s,i.body.appendChild(n);}catch(t){console.warn("[WidgetIframe] Failed to inject swipe script into iframe:",t);}}ngOnDestroy(){window.removeEventListener("message",this.handleIframeGesture),this.iframe()&&(this.iframe().nativeElement.onload=null);try{let e=this.iframe()?.nativeElement.contentDocument;if(e){let i=`kip-gesture-inject-${this.id()}`,t=e.getElementById(i);t&&t.parentNode&&t.parentNode.removeChild(t);}}catch(e){}}static \u0275fac=function(i){return new(i||a)};static \u0275cmp=JD({type:a,selectors:[["widget-anchor-alarm"]],viewQuery:function(i,t){i&1&&eg(t.iframe,C,5),i&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:3,vars:3,consts:[["plainIframe",""],["width","100%","height","100%","frameborder","0",1,"widgetIframe",3,"src"],[1,"widgetOverlay"]],template:function(i,t){i&1&&Uh(0,"iframe",1,0)(2,"div",2),i&2&&(Gh("src",t.widgetUrl,pp),EE(2),ig("display",t.displayTransparentOverlay()));},styles:["[_nghost-%COMP%]{overflow:hidden}.widgetIframe[_ngcontent-%COMP%]{background-color:#fff;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent}"]})}return a})();export{j as WidgetAnchorAlarmComponent};
1
+ import {a as a$1}from'./chunk-D59G2Xua.js';import {d1 as Hj,w,du as p,a as G,H as Dr,G as Gi,$ as $j,v as vt,F as Fa,dn as ge,J as JD,cp as Uh,b_ as Gh,e as EE,d as ig,f as eg,K as Kw,dP as pp}from'./main-IINF7HD6.js';var C=["plainIframe"],j=(()=>{class a{id=Hj.required();type=Hj.required();theme=Hj.required();runtime=w(p);_dashboard=w(G);_sanitizer=w(Dr);settings=w(Gi);static DEFAULT_CONFIG={};iframe=$j.required("plainIframe");widgetUrl=null;displayTransparentOverlay=vt("block");constructor(){let e=new URL("/signalk-anchoralarm-plugin/",window.location.origin);this.widgetUrl=this.toSafeResourceUrl(e),Fa(()=>{let i=this.runtime.options(),t=this._dashboard.isDashboardStatic();i&&ge(()=>{t?this.displayTransparentOverlay.set("none"):this.displayTransparentOverlay.set("block");});}),window.addEventListener("message",this.handleIframeGesture);}toSafeResourceUrl(e){return e.origin!==window.location.origin||!e.pathname.startsWith("/signalk-anchoralarm-plugin/")?null:this._sanitizer.bypassSecurityTrustResourceUrl(e.toString())}ngAfterViewInit(){if(this.iframe()){this.iframe().nativeElement.onload=()=>this.injectSwipeScript();try{let e=this.iframe().nativeElement.contentDocument;e&&(e.readyState==="complete"||e.readyState==="interactive")&&this.injectSwipeScript();}catch(e){}}}handleIframeGesture=e=>{if(!e.data)return;let i=e.data?.eventData?.instanceId||e.data?.keyEventData?.instanceId;if(!(!i||i!==this.id())){if(e.data.gesture)switch(e.data.gesture){case "swipeup":this._dashboard.navigateToPreviousDashboard();break;case "swipedown":this._dashboard.navigateToNextDashboard();break;case "swipeleft":{let t=new Event("openLeftSidenav",{bubbles:true,cancelable:true});window.document.dispatchEvent(t);break}case "swiperight":{let t=new Event("openRightSidenav",{bubbles:true,cancelable:true});window.document.dispatchEvent(t);break}}if(e.data.type==="keydown"&&e.data.keyEventData){let{key:t,ctrlKey:s,shiftKey:n}=e.data.keyEventData,I=new KeyboardEvent("keydown",{key:t,ctrlKey:s,shiftKey:n,bubbles:true,cancelable:true});document.dispatchEvent(I);}}};injectSwipeScript(){let e=this.iframe().nativeElement.contentWindow,i=this.iframe().nativeElement.contentDocument;if(!i||!e){console.error("[WidgetIframe] Iframe contentDocument or contentWindow is undefined. Possible cross-origin issue or iframe not fully loaded.");return}try{let t=`kip-gesture-inject-${this.id()}`;if(i.getElementById(t))return;let s=a$1({instanceId:this.id()}),n=i.createElement("script");n.id=t,n.textContent=s,i.body.appendChild(n);}catch(t){console.warn("[WidgetIframe] Failed to inject swipe script into iframe:",t);}}ngOnDestroy(){window.removeEventListener("message",this.handleIframeGesture),this.iframe()&&(this.iframe().nativeElement.onload=null);try{let e=this.iframe()?.nativeElement.contentDocument;if(e){let i=`kip-gesture-inject-${this.id()}`,t=e.getElementById(i);t&&t.parentNode&&t.parentNode.removeChild(t);}}catch(e){}}static \u0275fac=function(i){return new(i||a)};static \u0275cmp=JD({type:a,selectors:[["widget-anchor-alarm"]],viewQuery:function(i,t){i&1&&eg(t.iframe,C,5),i&2&&Kw();},inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:3,vars:3,consts:[["plainIframe",""],["width","100%","height","100%","frameborder","0",1,"widgetIframe",3,"src"],[1,"widgetOverlay"]],template:function(i,t){i&1&&Uh(0,"iframe",1,0)(2,"div",2),i&2&&(Gh("src",t.widgetUrl,pp),EE(2),ig("display",t.displayTransparentOverlay()));},styles:["[_nghost-%COMP%]{overflow:hidden}.widgetIframe[_ngcontent-%COMP%]{background-color:#fff;border-radius:var(--mat-card-elevated-container-shape, var(--mat-sys-corner-medium))}.widgetOverlay[_ngcontent-%COMP%]{position:absolute;width:100%;height:100%;right:0;bottom:0;color:transparent}"]})}return a})();export{j as WidgetAnchorAlarmComponent};
@@ -1 +1 @@
1
- import {k}from'./chunk-B0eE4udE.js';import {d1 as Hj,w,du as p,dv as rt,dD as _$1,bu as ut,v as vt,D as Dt,F as Fa,dn as ge,J as JD,c as $h,B as Bh,$ as $j,cn as wd,ci as dl,cp as Uh,cj as fl,X as xw,cs as Sw,T as TT,e as EE,an as Hh,d as ig,Y as Aw,bp as gl,aA as gg,f as eg,K as Kw,g as qw,dx as n$1}from'./main-YKDNK5VZ.js';import {c}from'./chunk-BIb-xYiS.js';var O=["gaugeBarAnimate"];function Z(n,U){if(n&1&&(wd(),Uh(0,"rect",14)),n&2){let t=U.$implicit,a=qw();Hh("fill",t.color)("x",5+(t.from-a.gaugeMinValue())*a.scaleSliceValue())("width",(t.to-t.from)*a.scaleSliceValue());}}var _=(()=>{class n{gaugeBarAnimate=$j("gaugeBarAnimate");displayName=Hj.required();displayNameColor=Hj.required();dataValue=Hj.required();dataValueLabel=Hj.required();unitLabel=Hj.required();barColor=Hj.required();barColorGradient=Hj.required();barColorBackground=Hj.required();gaugeMinValue=Hj.required();gaugeMaxValue=Hj.required();highlights=Hj.required();scaleSliceValue=Dt(()=>{let t=this.gaugeMaxValue()-this.gaugeMinValue();return t!==0?195/t:0});newGaugeValue=vt(null);oldGaugeValue=vt(null);firstRenderApplied=false;scheduleRafId=null;constructor(){Fa(()=>{let t=this.gaugeMinValue(),a=this.dataValue();a==null&&(a=t);let e=(a-t)*this.scaleSliceValue();ge(()=>{let o=this.newGaugeValue();!this.firstRenderApplied||o===null?(this.oldGaugeValue.set(e),this.newGaugeValue.set(e),this.firstRenderApplied=true):(this.oldGaugeValue.set(o),this.newGaugeValue.set(e)),this.gaugeBarAnimate()?.nativeElement&&(this.scheduleRafId!==null&&cancelAnimationFrame(this.scheduleRafId),this.scheduleRafId=requestAnimationFrame(()=>{let r=this.gaugeBarAnimate();r?.nativeElement&&r.nativeElement.beginElement(),this.scheduleRafId=null;}));});});}ngOnDestroy(){this.scheduleRafId!==null&&(cancelAnimationFrame(this.scheduleRafId),this.scheduleRafId=null);}static \u0275fac=function(a){return new(a||n)};static \u0275cmp=JD({type:n,selectors:[["svg-simple-linear-gauge"]],viewQuery:function(a,e){a&1&&eg(e.gaugeBarAnimate,O,5),a&2&&Kw();},inputs:{displayName:[1,"displayName"],displayNameColor:[1,"displayNameColor"],dataValue:[1,"dataValue"],dataValueLabel:[1,"dataValueLabel"],unitLabel:[1,"unitLabel"],barColor:[1,"barColor"],barColorGradient:[1,"barColorGradient"],barColorBackground:[1,"barColorBackground"],gaugeMinValue:[1,"gaugeMinValue"],gaugeMaxValue:[1,"gaugeMaxValue"],highlights:[1,"highlights"]},decls:26,vars:11,consts:[["gaugeBarAnimate",""],["viewBox","0 0 205 50","preserveAspectRatio","xMidYMid","version","1.1","id","svg8",1,"svg-simple-linear"],["id","defs2"],["id","gaugeBarGradient"],["id","stop849","offset","0",2,"stop-opacity","1"],["id","stop851","offset","0.40",2,"stop-opacity","0"],["id","linearGradient855","gradientTransform","translate(5,-30)","gradientUnits","userSpaceOnUse","y2","34.5","x2","-5","y1","34.5","x1","-6","href","#gaugeBarGradient"],["id","layer1",2,"display","inline"],["id","GaugeBackground","width","195","height","9","x","5","y","30","ry","0",2,"opacity","1","fill-opacity","1","stroke","none","stroke-width","0.265899","stroke-miterlimit","4","stroke-dasharray","none","stroke-opacity","1"],["id","gaugeBar"],["id","gaugeValue","width","1","height","9","x","0","y","0","ry","0",2,"mix-blend-mode","normal","fill-opacity","1","stroke","none"],["id","gaugeValueGradient","transform","scale(-1,1)","width","1","height","9","x","-1","y","0","ry","0",2,"display","inline","opacity","1","mix-blend-mode","multiply","fill","url(#linearGradient855)","stroke","none"],[0,"xlink","href","#gaugeBar","transform","translate(5,30)"],["attributeName","transform","type","scale","begin","indefinite","dur","0.5s","additive","sum","fill","freeze"],["y","39.5","height","0.75","ry","0",2,"opacity","1","fill-opacity","1","stroke","none","stroke-width","0.265899","stroke-miterlimit","4","stroke-dasharray","none","stroke-opacity","1"],["id","layer2",2,"display","inline"],[0,"xml","space","preserve","x","4.1731763","y","25.413595","id","displayNameText",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","12.7px","line-height","1.25","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal","letter-spacing","0px","word-spacing","0px"],["id","tspan1945","x","4.1731763","y","25.413595",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","12.7px","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal"],["text-anchor","end","id","gaugeTexts","y","25.293016","x","200.37138",0,"xml","space","preserve",1,"simpleLinear-text",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","22.5778px","line-height","1.25","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal","letter-spacing","0px","word-spacing","0px"],["y","25.293016","x","200.37138","id","valueText",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","22.5778px","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal"],["dy","-9","id","unitText",2,"text-transform","capitalize","font-size","9.87778px"]],template:function(a,e){a&1&&(wd(),dl(0,"svg",1)(1,"defs",2)(2,"linearGradient",3),Uh(3,"stop",4)(4,"stop",5),fl(),Uh(5,"linearGradient",6),fl(),dl(6,"g",7),Uh(7,"rect",8),dl(8,"defs")(9,"g",9),Uh(10,"rect",10)(11,"rect",11),fl()(),dl(12,"use",12),Uh(13,"animateTransform",13,0),fl(),xw(15,Z,1,3,":svg:rect",14,Sw),fl(),dl(17,"g",15)(18,"text",16)(19,"tspan",17),TT(20),fl()(),dl(21,"text",18)(22,"tspan",19),TT(23),fl(),dl(24,"tspan",20),TT(25),fl()()()()),a&2&&(EE(3),Hh("stop-color",e.barColorGradient()),EE(),Hh("stop-color",e.barColorGradient()),EE(3),Hh("fill",e.barColorBackground()),EE(5),ig("fill",e.barColor()),EE(),Hh("from",e.oldGaugeValue()+" 1")("to",e.newGaugeValue()+" 1"),EE(2),Aw(e.highlights()),EE(4),Hh("fill",e.displayNameColor()),EE(),gl(" ",e.displayName()),EE(3),gg(e.dataValueLabel()),EE(2),gg(e.unitLabel()));},styles:["svg[_ngcontent-%COMP%]{position:absolute;height:100%;width:100%;left:0;top:0}.simpleLinear-text[_ngcontent-%COMP%]{fill:var(--kip-contrast-color)}"]})}return n})();var oe=(()=>{class n{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={supportAutomaticHistoricalSeries:true,displayName:"Gauge Label",filterSelfPaths:true,paths:{gaugePath:{description:"Numeric Data",path:null,source:null,pathType:"number",isPathConfigurable:true,showPathSkUnitsFilter:true,pathSkUnitsFilter:"V",convertUnitTo:"V",sampleTime:500}},displayScale:{lower:0,upper:15,type:"linear"},gauge:{type:"simpleLinear",unitLabelFormat:"full"},numInt:1,numDecimal:2,ignoreZones:false,color:"contrast",enableTimeout:false,dataTimeout:5};runtime=w(p);streams=w(rt);metadata=w(_$1,{optional:true});unitsService=w(ut);unitsLabel=vt("");dataLabelValue=vt("0");dataValue=vt(0);barColor=vt("");barColorGradient=vt("");barColorBackground=vt("");cfg=Dt(()=>this.runtime.options()??n.DEFAULT_CONFIG);displayNameSafe=Dt(()=>this.cfg().displayName??"Gauge Label");gaugeMaxValue=Dt(()=>this.cfg().displayScale?.upper??15);gaugeMinValue=Dt(()=>this.cfg().displayScale?.lower??0);gaugePathConfig=Dt(()=>this.cfg().paths?.gaugePath);highlights=Dt(()=>{let t=this.cfg(),a=this.theme(),e=this.gaugePathConfig();if(!a)return [];if(t.ignoreZones||!this.metadata)return [];let o=this.metadata.zones();if(!o?.length)return [];let r=e?.convertUnitTo??"",y=t.displayScale?.lower??0,u=t.displayScale?.upper??15;return k(o,a,r,this.unitsService,y,u)});lastState=null;constructor(){Fa(()=>{let t=this.cfg(),a=this.gaugePathConfig();a?.path&&ge(()=>{this.streams.observe("gaugePath",o=>{let r=this.theme();if(!r)return;let y=o?.data?.value;if(y==null)this.dataValue.set(t.displayScale?.lower??0),this.dataLabelValue.set("--");else {let u=Math.min(Math.max(y,t.displayScale?.lower??0),t.displayScale?.upper??15);this.dataValue.set(u),this.dataLabelValue.set(u.toFixed(t.numDecimal??2));}if(!t.ignoreZones){let u=o?.state;if(u&&u!==this.lastState)switch(this.lastState=u,u){case n$1.Alarm:this.barColor.set(r.zoneAlarm);break;case n$1.Warn:this.barColor.set(r.zoneWarn);break;case n$1.Alert:this.barColor.set(r.zoneAlert);break;case n$1.Nominal:this.barColor.set(r.zoneNominal);break;default:this.barColor.set(c(t.color??"contrast",r).color);break}}});let e=a.convertUnitTo??"";this.unitsLabel.set(t.gauge?.unitLabelFormat==="abr"?e.substring(0,1):e);});}),Fa(()=>{let t=this.cfg(),a=this.theme();a&&ge(()=>{this.barColorBackground.set(a.background);let e=c(t.color??"contrast",a);if(t.ignoreZones)this.barColor.set(e.color);else if(this.lastState)switch(this.lastState){case n$1.Alarm:this.barColor.set(a.zoneAlarm);break;case n$1.Warn:this.barColor.set(a.zoneWarn);break;case n$1.Alert:this.barColor.set(a.zoneAlert);break;case n$1.Nominal:this.barColor.set(a.zoneNominal);break;default:this.barColor.set(e.color);break}else this.barColor.set(e.color);this.barColorGradient.set(e.dimmer||e.dim||e.color);});}),Fa(()=>{let t=this.cfg(),a=this.metadata;t.ignoreZones||!a||ge(()=>a.observe("gaugePath"));});}static \u0275fac=function(a){return new(a||n)};static \u0275cmp=JD({type:n,selectors:[["widget-simple-linear"]],inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:1,vars:11,consts:[[1,"simpleLinearGaugeContainer",3,"displayName","displayNameColor","unitLabel","dataValue","dataValueLabel","barColor","barColorGradient","barColorBackground","gaugeMaxValue","gaugeMinValue","highlights"]],template:function(a,e){if(a&1&&$h(0,"svg-simple-linear-gauge",0),a&2){let o;Bh("displayName",e.displayNameSafe())("displayNameColor",(o=e.theme())==null?null:o.contrastDim)("unitLabel",e.unitsLabel())("dataValue",e.dataValue())("dataValueLabel",e.dataLabelValue())("barColor",e.barColor())("barColorGradient",e.barColorGradient())("barColorBackground",e.barColorBackground())("gaugeMaxValue",e.gaugeMaxValue())("gaugeMinValue",e.gaugeMinValue())("highlights",e.highlights());}},dependencies:[_],styles:[".simpleLinearGaugeContainer[_ngcontent-%COMP%]{display:block;position:relative;height:100%;width:100%;padding:0}"]})}return n})();export{oe as WidgetSimpleLinearComponent};
1
+ import {k}from'./chunk-GyA81uXZ.js';import {d1 as Hj,w,du as p,dv as rt,dD as _$1,bu as ut,v as vt,D as Dt,F as Fa,dn as ge,J as JD,c as $h,B as Bh,$ as $j,cn as wd,ci as dl,cp as Uh,cj as fl,X as xw,cs as Sw,T as TT,e as EE,an as Hh,d as ig,Y as Aw,bp as gl,aA as gg,f as eg,K as Kw,g as qw,dx as n$1}from'./main-IINF7HD6.js';import {c}from'./chunk-DHj2hm9r.js';var O=["gaugeBarAnimate"];function Z(n,U){if(n&1&&(wd(),Uh(0,"rect",14)),n&2){let t=U.$implicit,a=qw();Hh("fill",t.color)("x",5+(t.from-a.gaugeMinValue())*a.scaleSliceValue())("width",(t.to-t.from)*a.scaleSliceValue());}}var _=(()=>{class n{gaugeBarAnimate=$j("gaugeBarAnimate");displayName=Hj.required();displayNameColor=Hj.required();dataValue=Hj.required();dataValueLabel=Hj.required();unitLabel=Hj.required();barColor=Hj.required();barColorGradient=Hj.required();barColorBackground=Hj.required();gaugeMinValue=Hj.required();gaugeMaxValue=Hj.required();highlights=Hj.required();scaleSliceValue=Dt(()=>{let t=this.gaugeMaxValue()-this.gaugeMinValue();return t!==0?195/t:0});newGaugeValue=vt(null);oldGaugeValue=vt(null);firstRenderApplied=false;scheduleRafId=null;constructor(){Fa(()=>{let t=this.gaugeMinValue(),a=this.dataValue();a==null&&(a=t);let e=(a-t)*this.scaleSliceValue();ge(()=>{let o=this.newGaugeValue();!this.firstRenderApplied||o===null?(this.oldGaugeValue.set(e),this.newGaugeValue.set(e),this.firstRenderApplied=true):(this.oldGaugeValue.set(o),this.newGaugeValue.set(e)),this.gaugeBarAnimate()?.nativeElement&&(this.scheduleRafId!==null&&cancelAnimationFrame(this.scheduleRafId),this.scheduleRafId=requestAnimationFrame(()=>{let r=this.gaugeBarAnimate();r?.nativeElement&&r.nativeElement.beginElement(),this.scheduleRafId=null;}));});});}ngOnDestroy(){this.scheduleRafId!==null&&(cancelAnimationFrame(this.scheduleRafId),this.scheduleRafId=null);}static \u0275fac=function(a){return new(a||n)};static \u0275cmp=JD({type:n,selectors:[["svg-simple-linear-gauge"]],viewQuery:function(a,e){a&1&&eg(e.gaugeBarAnimate,O,5),a&2&&Kw();},inputs:{displayName:[1,"displayName"],displayNameColor:[1,"displayNameColor"],dataValue:[1,"dataValue"],dataValueLabel:[1,"dataValueLabel"],unitLabel:[1,"unitLabel"],barColor:[1,"barColor"],barColorGradient:[1,"barColorGradient"],barColorBackground:[1,"barColorBackground"],gaugeMinValue:[1,"gaugeMinValue"],gaugeMaxValue:[1,"gaugeMaxValue"],highlights:[1,"highlights"]},decls:26,vars:11,consts:[["gaugeBarAnimate",""],["viewBox","0 0 205 50","preserveAspectRatio","xMidYMid","version","1.1","id","svg8",1,"svg-simple-linear"],["id","defs2"],["id","gaugeBarGradient"],["id","stop849","offset","0",2,"stop-opacity","1"],["id","stop851","offset","0.40",2,"stop-opacity","0"],["id","linearGradient855","gradientTransform","translate(5,-30)","gradientUnits","userSpaceOnUse","y2","34.5","x2","-5","y1","34.5","x1","-6","href","#gaugeBarGradient"],["id","layer1",2,"display","inline"],["id","GaugeBackground","width","195","height","9","x","5","y","30","ry","0",2,"opacity","1","fill-opacity","1","stroke","none","stroke-width","0.265899","stroke-miterlimit","4","stroke-dasharray","none","stroke-opacity","1"],["id","gaugeBar"],["id","gaugeValue","width","1","height","9","x","0","y","0","ry","0",2,"mix-blend-mode","normal","fill-opacity","1","stroke","none"],["id","gaugeValueGradient","transform","scale(-1,1)","width","1","height","9","x","-1","y","0","ry","0",2,"display","inline","opacity","1","mix-blend-mode","multiply","fill","url(#linearGradient855)","stroke","none"],[0,"xlink","href","#gaugeBar","transform","translate(5,30)"],["attributeName","transform","type","scale","begin","indefinite","dur","0.5s","additive","sum","fill","freeze"],["y","39.5","height","0.75","ry","0",2,"opacity","1","fill-opacity","1","stroke","none","stroke-width","0.265899","stroke-miterlimit","4","stroke-dasharray","none","stroke-opacity","1"],["id","layer2",2,"display","inline"],[0,"xml","space","preserve","x","4.1731763","y","25.413595","id","displayNameText",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","12.7px","line-height","1.25","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal","letter-spacing","0px","word-spacing","0px"],["id","tspan1945","x","4.1731763","y","25.413595",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","12.7px","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal"],["text-anchor","end","id","gaugeTexts","y","25.293016","x","200.37138",0,"xml","space","preserve",1,"simpleLinear-text",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","22.5778px","line-height","1.25","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal","letter-spacing","0px","word-spacing","0px"],["y","25.293016","x","200.37138","id","valueText",2,"font-style","normal","font-variant","normal","font-weight","bold","font-stretch","normal","font-size","22.5778px","font-family","Roboto","font-variant-ligatures","normal","font-variant-caps","normal","font-variant-numeric","normal","font-variant-east-asian","normal"],["dy","-9","id","unitText",2,"text-transform","capitalize","font-size","9.87778px"]],template:function(a,e){a&1&&(wd(),dl(0,"svg",1)(1,"defs",2)(2,"linearGradient",3),Uh(3,"stop",4)(4,"stop",5),fl(),Uh(5,"linearGradient",6),fl(),dl(6,"g",7),Uh(7,"rect",8),dl(8,"defs")(9,"g",9),Uh(10,"rect",10)(11,"rect",11),fl()(),dl(12,"use",12),Uh(13,"animateTransform",13,0),fl(),xw(15,Z,1,3,":svg:rect",14,Sw),fl(),dl(17,"g",15)(18,"text",16)(19,"tspan",17),TT(20),fl()(),dl(21,"text",18)(22,"tspan",19),TT(23),fl(),dl(24,"tspan",20),TT(25),fl()()()()),a&2&&(EE(3),Hh("stop-color",e.barColorGradient()),EE(),Hh("stop-color",e.barColorGradient()),EE(3),Hh("fill",e.barColorBackground()),EE(5),ig("fill",e.barColor()),EE(),Hh("from",e.oldGaugeValue()+" 1")("to",e.newGaugeValue()+" 1"),EE(2),Aw(e.highlights()),EE(4),Hh("fill",e.displayNameColor()),EE(),gl(" ",e.displayName()),EE(3),gg(e.dataValueLabel()),EE(2),gg(e.unitLabel()));},styles:["svg[_ngcontent-%COMP%]{position:absolute;height:100%;width:100%;left:0;top:0}.simpleLinear-text[_ngcontent-%COMP%]{fill:var(--kip-contrast-color)}"]})}return n})();var oe=(()=>{class n{id=Hj.required();type=Hj.required();theme=Hj.required();static DEFAULT_CONFIG={supportAutomaticHistoricalSeries:true,displayName:"Gauge Label",filterSelfPaths:true,paths:{gaugePath:{description:"Numeric Data",path:null,source:null,pathType:"number",isPathConfigurable:true,showPathSkUnitsFilter:true,pathSkUnitsFilter:"V",convertUnitTo:"V",sampleTime:500}},displayScale:{lower:0,upper:15,type:"linear"},gauge:{type:"simpleLinear",unitLabelFormat:"full"},numInt:1,numDecimal:2,ignoreZones:false,color:"contrast",enableTimeout:false,dataTimeout:5};runtime=w(p);streams=w(rt);metadata=w(_$1,{optional:true});unitsService=w(ut);unitsLabel=vt("");dataLabelValue=vt("0");dataValue=vt(0);barColor=vt("");barColorGradient=vt("");barColorBackground=vt("");cfg=Dt(()=>this.runtime.options()??n.DEFAULT_CONFIG);displayNameSafe=Dt(()=>this.cfg().displayName??"Gauge Label");gaugeMaxValue=Dt(()=>this.cfg().displayScale?.upper??15);gaugeMinValue=Dt(()=>this.cfg().displayScale?.lower??0);gaugePathConfig=Dt(()=>this.cfg().paths?.gaugePath);highlights=Dt(()=>{let t=this.cfg(),a=this.theme(),e=this.gaugePathConfig();if(!a)return [];if(t.ignoreZones||!this.metadata)return [];let o=this.metadata.zones();if(!o?.length)return [];let r=e?.convertUnitTo??"",y=t.displayScale?.lower??0,u=t.displayScale?.upper??15;return k(o,a,r,this.unitsService,y,u)});lastState=null;constructor(){Fa(()=>{let t=this.cfg(),a=this.gaugePathConfig();a?.path&&ge(()=>{this.streams.observe("gaugePath",o=>{let r=this.theme();if(!r)return;let y=o?.data?.value;if(y==null)this.dataValue.set(t.displayScale?.lower??0),this.dataLabelValue.set("--");else {let u=Math.min(Math.max(y,t.displayScale?.lower??0),t.displayScale?.upper??15);this.dataValue.set(u),this.dataLabelValue.set(u.toFixed(t.numDecimal??2));}if(!t.ignoreZones){let u=o?.state;if(u&&u!==this.lastState)switch(this.lastState=u,u){case n$1.Alarm:this.barColor.set(r.zoneAlarm);break;case n$1.Warn:this.barColor.set(r.zoneWarn);break;case n$1.Alert:this.barColor.set(r.zoneAlert);break;case n$1.Nominal:this.barColor.set(r.zoneNominal);break;default:this.barColor.set(c(t.color??"contrast",r).color);break}}});let e=a.convertUnitTo??"";this.unitsLabel.set(t.gauge?.unitLabelFormat==="abr"?e.substring(0,1):e);});}),Fa(()=>{let t=this.cfg(),a=this.theme();a&&ge(()=>{this.barColorBackground.set(a.background);let e=c(t.color??"contrast",a);if(t.ignoreZones)this.barColor.set(e.color);else if(this.lastState)switch(this.lastState){case n$1.Alarm:this.barColor.set(a.zoneAlarm);break;case n$1.Warn:this.barColor.set(a.zoneWarn);break;case n$1.Alert:this.barColor.set(a.zoneAlert);break;case n$1.Nominal:this.barColor.set(a.zoneNominal);break;default:this.barColor.set(e.color);break}else this.barColor.set(e.color);this.barColorGradient.set(e.dimmer||e.dim||e.color);});}),Fa(()=>{let t=this.cfg(),a=this.metadata;t.ignoreZones||!a||ge(()=>a.observe("gaugePath"));});}static \u0275fac=function(a){return new(a||n)};static \u0275cmp=JD({type:n,selectors:[["widget-simple-linear"]],inputs:{id:[1,"id"],type:[1,"type"],theme:[1,"theme"]},decls:1,vars:11,consts:[[1,"simpleLinearGaugeContainer",3,"displayName","displayNameColor","unitLabel","dataValue","dataValueLabel","barColor","barColorGradient","barColorBackground","gaugeMaxValue","gaugeMinValue","highlights"]],template:function(a,e){if(a&1&&$h(0,"svg-simple-linear-gauge",0),a&2){let o;Bh("displayName",e.displayNameSafe())("displayNameColor",(o=e.theme())==null?null:o.contrastDim)("unitLabel",e.unitsLabel())("dataValue",e.dataValue())("dataValueLabel",e.dataLabelValue())("barColor",e.barColor())("barColorGradient",e.barColorGradient())("barColorBackground",e.barColorBackground())("gaugeMaxValue",e.gaugeMaxValue())("gaugeMinValue",e.gaugeMinValue())("highlights",e.highlights());}},dependencies:[_],styles:[".simpleLinearGaugeContainer[_ngcontent-%COMP%]{display:block;position:relative;height:100%;width:100%;padding:0}"]})}return n})();export{oe as WidgetSimpleLinearComponent};