@camstack/addon-admin-ui 1.1.51 → 1.1.53

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 (103) hide show
  1. package/dist/assets/{AddLocationWizard-C5_TbCTT.js → AddLocationWizard-B2-uyYmP.js} +1 -1
  2. package/dist/assets/{AddonCollectionPage-DdcqJdFw.js → AddonCollectionPage-FU3E6QGz.js} +1 -1
  3. package/dist/assets/Addons-DU5z1ZvU.js +1 -0
  4. package/dist/assets/{AdminTabs-rrSAZD3O.js → AdminTabs-CICieyaN.js} +1 -1
  5. package/dist/assets/AiProfiles-BRTUYeoH.js +1 -0
  6. package/dist/assets/{BrokerForm-DL1TXr2B.js → BrokerForm-CuIg_iOf.js} +1 -1
  7. package/dist/assets/{Capabilities-G9KINvPO.js → Capabilities-CEZc9Dcc.js} +1 -1
  8. package/dist/assets/{CapabilityBadges-Q2qm_QNP.js → CapabilityBadges-DDSnGBgk.js} +1 -1
  9. package/dist/assets/Cluster-DjZVaBCZ.js +1 -0
  10. package/dist/assets/{Dashboard-B9Qq3GKN.js → Dashboard-CLWVhKF4.js} +1 -1
  11. package/dist/assets/{Data-F4Z7wulI.js → Data-aqRyEVJp.js} +1 -1
  12. package/dist/assets/DetectionIntelligence-Bvw_e-lH.js +1 -0
  13. package/dist/assets/DeviceDetail-Bt08IJis.js +2 -0
  14. package/dist/assets/{Devices-BbPVwY-D.js → Devices-CZ_Moh5w.js} +1 -1
  15. package/dist/assets/{EmbedPlayerPage-DDKRlZMR.js → EmbedPlayerPage-DAeQe0Bf.js} +1 -1
  16. package/dist/assets/Events-OajEJc_n.js +1 -0
  17. package/dist/assets/{FormBuilder-vCzPEjPM.js → FormBuilder-B69YBaq9.js} +1 -1
  18. package/dist/assets/Identity-DWgcf-tI.js +1 -0
  19. package/dist/assets/IntegrationDetail-BOTeJU5I.js +1 -0
  20. package/dist/assets/{Integrations-AlnqolAL.js → Integrations-CMT2Jroo.js} +1 -1
  21. package/dist/assets/Integrations-nY6HlQUf.js +1 -0
  22. package/dist/assets/{Logs-CBDPfk6Z.js → Logs-BTWVO572.js} +1 -1
  23. package/dist/assets/{MotionZonesSettings-CFYI6s-_.js → MotionZonesSettings-BWhNWsPJ.js} +1 -1
  24. package/dist/assets/{MyAccess-6qmJkzue.js → MyAccess-CJLeYWfN.js} +1 -1
  25. package/dist/assets/Network-DTQVXNuu.js +1 -0
  26. package/dist/assets/{NodeAddonsSettingsPanel-CynxbOEk.js → NodeAddonsSettingsPanel-BQWXa7vq.js} +1 -1
  27. package/dist/assets/NotificationTargets-DqrqQvJN.js +1 -0
  28. package/dist/assets/Pipeline-BZPrco_d.js +1 -0
  29. package/dist/assets/Plates-Cy7kPDK4.js +1 -0
  30. package/dist/assets/{PrivacyMaskSettings-CbVO58Pz.js → PrivacyMaskSettings-DTEI02Vz.js} +1 -1
  31. package/dist/assets/ProviderIcon-Ba4DQXPs.js +1 -0
  32. package/dist/assets/ScanNetworkModal-CbDd4Bl9.js +1 -0
  33. package/dist/assets/{Settings-DdHS4and.js → Settings-BxK0kuED.js} +1 -1
  34. package/dist/assets/{Showroom-BPudQyp1.js → Showroom-BLBcs7XJ.js} +1 -1
  35. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DzuuqQDr.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-jFLPXlhw.js} +1 -1
  36. package/dist/assets/{build-cluster-graph-C8acdV1N.js → build-cluster-graph-CIiqGgZL.js} +2 -2
  37. package/dist/assets/circle-check-big-B-tT2CHM.js +1 -0
  38. package/dist/assets/clock-cwKSxYZs.js +1 -0
  39. package/dist/assets/{copy-jHaoig1Z.js → copy-CTAQpm07.js} +1 -1
  40. package/dist/assets/debounced-invalidate-DZ3oxQDl.js +1 -0
  41. package/dist/assets/{dist-D9oUwgkq.js → dist-BMrXztkM.js} +1 -1
  42. package/dist/assets/dist-tu4iBgMD.js +7 -0
  43. package/dist/assets/{download-B8Uv2BOb.js → download-DjYX33pK.js} +1 -1
  44. package/dist/assets/face-bbox-vlSxiLet.js +1 -0
  45. package/dist/assets/{film-CzfyiWOL.js → film-lIXZ0TIf.js} +1 -1
  46. package/dist/assets/{hostInit-DY1mt8Vv.js → hostInit-BhKkSxQn.js} +1 -1
  47. package/dist/assets/index-Cdp6OaKK.js +4 -0
  48. package/dist/assets/index-Cmln2hC6.css +2 -0
  49. package/dist/assets/{key-round-B1u42XSy.js → key-round-D6koQlXg.js} +1 -1
  50. package/dist/assets/{mf-entry-bootstrap-0-3bf5f308.js → mf-entry-bootstrap-0-1af432ca.js} +2 -2
  51. package/dist/assets/{pencil-BEjUgvtJ.js → pencil-CUVzuL3L.js} +1 -1
  52. package/dist/assets/{player-overlays-DzoWZHnz.js → player-overlays-BrjDKJA9.js} +1 -1
  53. package/dist/assets/plus-CTLCXGgQ.js +1 -0
  54. package/dist/assets/{radio-CvK77vEM.js → radio-_KFBV9h-.js} +1 -1
  55. package/dist/assets/{refresh-cw-BoM3__QD.js → refresh-cw-BM18Lfvw.js} +1 -1
  56. package/dist/assets/remoteEntry-xwnWPwER.js +1 -0
  57. package/dist/assets/{rotate-ccw-CG8Dl-0A.js → rotate-ccw-EdLXWeWN.js} +1 -1
  58. package/dist/assets/rotate-cw-CE0Ns6Fz.js +1 -0
  59. package/dist/assets/search-mDjJzMoX.js +1 -0
  60. package/dist/assets/{send-DdbXLRkn.js → send-C5a5_8YJ.js} +1 -1
  61. package/dist/assets/server-CTi1sPfP.js +1 -0
  62. package/dist/assets/square-CfQwX-85.js +1 -0
  63. package/dist/assets/{square-check-big-BIo_99Ss.js → square-check-big-DqE0lyuf.js} +1 -1
  64. package/dist/assets/src-BIAY4cjr.js +7 -0
  65. package/dist/assets/src-Bx1PCCWV.js +67 -0
  66. package/dist/assets/{upload-DUlWrtL9.js → upload-CBvWlRd4.js} +1 -1
  67. package/dist/assets/useDevice-CRWDjGkB.js +1 -0
  68. package/dist/assets/{useEventInvalidation-Bwynn5Fd.js → useEventInvalidation-BgQYjLEl.js} +1 -1
  69. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CmeeGMkM.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BzCJlGIx.js} +2 -2
  70. package/dist/assets/{wifi-CW0cSDNa.js → wifi-D9LNVG6Y.js} +1 -1
  71. package/dist/assets/{zap-CPf6Bdf3.js → zap-CjGIHi-s.js} +1 -1
  72. package/dist/index.html +6 -6
  73. package/dist/server/addon.js +4741 -4645
  74. package/package.json +1 -1
  75. package/dist/assets/Addons-DENvhGXs.js +0 -1
  76. package/dist/assets/AiProfiles-I6sx_kzO.js +0 -1
  77. package/dist/assets/Cluster-D5fOIpSM.js +0 -1
  78. package/dist/assets/DetectionIntelligence-DysJUSVa.js +0 -1
  79. package/dist/assets/DeviceDetail-DnOzyoSG.js +0 -2
  80. package/dist/assets/Events-CdArV4tl.js +0 -1
  81. package/dist/assets/Identity-Dmu7k7pC.js +0 -1
  82. package/dist/assets/IntegrationDetail-CXnSPpKp.js +0 -1
  83. package/dist/assets/Integrations-BIx0NuFX.js +0 -1
  84. package/dist/assets/Network-CX6T3X7F.js +0 -1
  85. package/dist/assets/NotificationTargets-DFmIRZfI.js +0 -1
  86. package/dist/assets/Pipeline-HtfEITUn.js +0 -1
  87. package/dist/assets/ProviderIcon-Bc8wWWqT.js +0 -1
  88. package/dist/assets/ScanNetworkModal-Bxjqv5aL.js +0 -1
  89. package/dist/assets/ServerManagement-QTJJqUUL.js +0 -1
  90. package/dist/assets/circle-check-big-Ci2qKS9O.js +0 -1
  91. package/dist/assets/clock-DvPVZaz2.js +0 -1
  92. package/dist/assets/debounced-invalidate-BtUOLpbU.js +0 -1
  93. package/dist/assets/dist-BpbjPYkI.js +0 -7
  94. package/dist/assets/index-CRBZZNxE.css +0 -2
  95. package/dist/assets/index-msAq9OfF.js +0 -4
  96. package/dist/assets/plus-CDCmEkS2.js +0 -1
  97. package/dist/assets/remoteEntry-Bm4uDKFt.js +0 -1
  98. package/dist/assets/rotate-cw-BcZwqoT5.js +0 -1
  99. package/dist/assets/search-Dh7U_-43.js +0 -1
  100. package/dist/assets/square-Mc9QW6dp.js +0 -1
  101. package/dist/assets/src-B_-PRq3y.js +0 -67
  102. package/dist/assets/src-DYmw2iAG.js +0 -7
  103. package/dist/assets/useDevice-CDxSSKpG.js +0 -1
@@ -1 +0,0 @@
1
- import{Dn as e,Qt as t,Zt as n,_n as r,hn as i,jn as a,qt as o,sn as s}from"./src-B_-PRq3y.js";import{I as c,K as l,Q as u,S as d,W as f,b as p,q as m,x as h,z as g}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-DTufy7Ue.js";import{t as _}from"./download-B8Uv2BOb.js";import{t as v}from"./refresh-cw-BoM3__QD.js";import{C as y,F as b,L as x,U as S,i as C,k as w,o as T}from"./index-msAq9OfF.js";import{t as E}from"./FormBuilder-vCzPEjPM.js";import{t as D}from"./BrokerForm-DL1TXr2B.js";var O=S(`radar`,[[`path`,{d:`M19.07 4.93A10 10 0 0 0 6.99 3.34`,key:`z3du51`}],[`path`,{d:`M4 6h.01`,key:`oypzma`}],[`path`,{d:`M2.29 9.62A10 10 0 1 0 21.31 8.35`,key:`qzzz0`}],[`path`,{d:`M16.24 7.76A6 6 0 1 0 8.23 16.67`,key:`1yjesh`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}],[`path`,{d:`M17.99 11.66A6 6 0 0 1 15.77 16.67`,key:`1u2y91`}],[`circle`,{cx:`12`,cy:`12`,r:`2`,key:`1c9p78`}],[`path`,{d:`m13.41 10.59 5.66-5.66`,key:`mhq4k0`}]]);u();var k=[`amazon.com`,`amazon.it`,`amazon.de`,`amazon.co.uk`,`amazon.fr`,`amazon.es`,`amazon.ca`,`amazon.com.au`,`amazon.co.jp`,`amazon.in`,`amazon.com.br`,`amazon.com.mx`],A=`/addon/import-alexa`,j=2e3;function M(e){return typeof e==`object`&&!!e&&typeof e.sessionId==`string`&&typeof e.loginUrl==`string`}function N(e){return typeof e==`object`&&!!e&&typeof e.phase==`string`&&typeof e.sessionId==`string`}function P(e){return typeof e==`object`&&!!e&&typeof e.brokerId==`string`}function F(e){return{"Content-Type":`application/json`,Authorization:`Bearer ${localStorage.getItem(`camstack_admin_token`)??``}`,...e}}async function I(e,t,n){let r=await fetch(`${A}${e}`,{method:`POST`,headers:F(),body:JSON.stringify(t)}),i=await r.json();if(!r.ok){let e=typeof i==`object`&&i?i.error??`Unknown error`:`Unknown error`;throw Error(String(e))}if(!n(i))throw Error(`Unexpected response from server`);return i}async function L(e){let t=new URLSearchParams({sessionId:e}),n=localStorage.getItem(`camstack_admin_token`)??``,r=await fetch(`${A}/login/status?${t.toString()}`,{headers:{Authorization:`Bearer ${n}`}}),i=await r.json();if(!r.ok){let e=typeof i==`object`&&i?i.error??`Unknown error`:`Unknown error`;throw Error(String(e))}if(!N(i))throw Error(`Unexpected status response from server`);return i}async function R(e){try{await fetch(`${A}/login/cancel`,{method:`POST`,headers:F(),body:JSON.stringify({sessionId:e})})}catch{}}function z({brokerId:e,onResolved:t,onCancel:n}){let[r,i]=m(`amazon.it`),[a,o]=m(`Alexa account`),[s,u]=m({kind:`idle`}),f=l(!0);g(()=>(f.current=!0,()=>{f.current=!1}),[]);let p=l(null),_=l(null),b=c(()=>{_.current!==null&&(clearInterval(_.current),_.current=null)},[]),x=c(async n=>{b(),f.current&&u({kind:`committing`,sessionId:n});try{let r=await I(`/login/commit`,{sessionId:n,name:a.trim().length>0?a.trim():`Alexa account`,...e===void 0?{}:{brokerId:e}},P);p.current=null,t(r.brokerId)}catch(e){let t=e instanceof Error?e.message:String(e);f.current&&u({kind:`error`,message:t,sessionId:n})}},[e,a,t,b]),S=c((e,t)=>{b();let n=async()=>{try{let n=await L(e);if(n.phase===`captured`){b(),x(e);return}if(n.phase===`error`){b(),f.current&&u({kind:`error`,message:n.error??`Login proxy returned an error`,sessionId:e});return}if(n.phase===`cancelled`){b(),f.current&&u({kind:`idle`});return}f.current&&u({kind:`polling`,sessionId:e,loginUrl:n.loginUrl||t,phase:n.phase})}catch(e){let t=e instanceof Error?e.message:String(e);f.current&&u(e=>e.kind===`polling`?{...e}:{kind:`error`,message:t,sessionId:null})}};_.current=setInterval(()=>{n()},j)},[b,x]);g(()=>()=>{b(),p.current!==null&&R(p.current)},[b]);let C=async()=>{b(),p.current!==null&&(R(p.current),p.current=null),u({kind:`starting`});try{let e=await I(`/login/start`,{amazonDomain:r},M);p.current=e.sessionId,u({kind:`polling`,sessionId:e.sessionId,loginUrl:e.loginUrl,phase:`starting`}),S(e.sessionId,e.loginUrl)}catch(e){u({kind:`error`,message:e instanceof Error?e.message:String(e),sessionId:null})}},E=()=>{b(),p.current!==null&&(R(p.current),p.current=null),u({kind:`idle`})},D=()=>{E()},O=s.kind===`idle`,A=s.kind===`starting`,N=s.kind===`polling`,F=s.kind===`committing`,z=s.kind===`error`,B=A||N||F,V=s.kind===`polling`?s.phase:null,H=s.kind===`polling`?s.loginUrl:null,U=N&&V===`awaiting-login`,W=N&&(V===`starting`||V===null);return d(`div`,{className:`space-y-4`,children:[(O||z)&&d(`div`,{className:`space-y-3`,children:[e===void 0&&d(`div`,{className:`space-y-1`,children:[h(`label`,{htmlFor:`alexa-account-name`,className:`text-[10px] uppercase tracking-wide text-foreground-subtle`,children:`Account name`}),h(`input`,{id:`alexa-account-name`,type:`text`,value:a,onChange:e=>o(e.target.value),placeholder:`Alexa account`,className:`w-full rounded border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary`})]}),d(`div`,{className:`space-y-1`,children:[h(`label`,{htmlFor:`alexa-amazon-region`,className:`text-[10px] uppercase tracking-wide text-foreground-subtle`,children:`Amazon region`}),h(`select`,{id:`alexa-amazon-region`,value:r,onChange:e=>i(e.target.value),className:`w-full rounded border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary`,children:k.map(e=>h(`option`,{value:e,children:e},e))})]})]}),z&&d(`div`,{className:`rounded border border-danger/30 bg-danger/5 text-danger px-3 py-2 text-[11px] flex items-start gap-2`,children:[h(T,{className:`h-3.5 w-3.5 mt-0.5 flex-shrink-0`}),h(`span`,{children:s.message})]}),A&&d(`div`,{className:`flex items-center gap-2 rounded-lg border border-border bg-surface px-3 py-3 text-xs text-foreground-subtle`,children:[h(y,{className:`h-4 w-4 animate-spin flex-shrink-0`}),`Starting login proxy…`]}),W&&d(`div`,{className:`flex items-center gap-2 rounded-lg border border-border bg-surface px-3 py-3 text-xs text-foreground-subtle`,children:[h(y,{className:`h-4 w-4 animate-spin flex-shrink-0`}),`Waiting for proxy to be ready…`]}),F&&d(`div`,{className:`flex items-center gap-2 rounded-lg border border-border bg-surface px-3 py-3 text-xs text-foreground-subtle`,children:[h(y,{className:`h-4 w-4 animate-spin flex-shrink-0`}),`Saving credentials…`]}),U&&H!==null&&d(`div`,{className:`space-y-3`,children:[d(`div`,{className:`rounded-lg border border-border bg-surface p-3 space-y-2`,children:[h(`p`,{className:`text-xs font-semibold text-foreground`,children:`Open the link below to log in to your Amazon account`}),h(`p`,{className:`text-[10px] text-foreground-subtle`,children:`After completing the login and any 2FA steps, this wizard will continue automatically.`}),d(`a`,{href:H,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1.5 rounded bg-primary px-4 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90`,children:[h(w,{className:`h-3.5 w-3.5`}),`Login to Amazon`]})]}),d(`div`,{className:`rounded border border-amber-500/30 bg-amber-500/10 px-3 py-2 text-[10px] text-amber-700 dark:text-amber-300`,children:[h(`strong`,{children:`Note:`}),` The login proxy runs directly on the hub. If the link does not open or the page does not load, make sure the hub's proxy host and port are reachable from your browser. You can configure `,h(`code`,{className:`font-mono`,children:`proxyHost`}),` in the Alexa addon settings and ensure the proxy port is published (Docker port mapping).`]}),d(`div`,{className:`flex items-center gap-2 text-[10px] text-foreground-subtle`,children:[h(y,{className:`h-3 w-3 animate-spin`}),`Waiting for Amazon login to complete…`]})]}),d(`div`,{className:`flex items-center justify-between gap-2 pt-1`,children:[h(`button`,{type:`button`,onClick:B?E:n,className:`rounded px-3 py-1.5 text-xs text-foreground-subtle border border-border hover:text-foreground`,children:B?`Cancel login`:`Back`}),d(`div`,{className:`flex items-center gap-2`,children:[z&&d(`button`,{type:`button`,onClick:D,className:`inline-flex items-center gap-1.5 rounded border border-border px-3 py-1.5 text-xs text-foreground hover:bg-primary/10`,children:[h(v,{className:`h-3.5 w-3.5`}),`Retry`]}),O&&h(`button`,{type:`button`,onClick:()=>{C()},disabled:e===void 0&&a.trim().length===0,className:`inline-flex items-center gap-1.5 rounded bg-primary px-4 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50`,children:`Start login`})]})]})]})}u();var B=`alexa`;function V(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.id==`string`):[]}function H(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.addonId==`string`&&Array.isArray(e.kinds)):[]}var U={connected:`bg-emerald-500/15 text-emerald-700 dark:text-emerald-300`,connecting:`bg-amber-500/15 text-amber-700 dark:text-amber-300`,disconnected:`bg-foreground-subtle/15 text-foreground-subtle`,"auth-failed":`bg-danger/15 text-danger`,unreachable:`bg-danger/15 text-danger`,error:`bg-danger/15 text-danger`};function W({kind:e,onResolved:r,onBack:i}){let[a,s]=m(e===B?`alexa-login`:`existing`),c=n({kind:e}),l=f(()=>V(c.data).filter(t=>t.kind===e),[c.data,e]),u=t(),p=f(()=>{for(let t of H(u.data))if(t.kinds.some(t=>t.kind===e))return t.addonId},[u.data,e]),[g,_]=m(null),[v,x]=m(``),S=o({}),C=()=>{g&&r(g)},w=async t=>{v.trim().length!==0&&r((await S.mutateAsync({kind:e,name:v.trim(),settings:t,...p===void 0?{}:{addonId:p}})).id)},T=e=>{e===`new`?_(null):S.reset(),s(e)};return d(`div`,{className:`space-y-4`,children:[d(`button`,{type:`button`,onClick:i,className:`inline-flex items-center gap-1 text-[11px] text-foreground-subtle hover:text-foreground`,children:[h(b,{className:`h-3.5 w-3.5`}),` Back`]}),d(`div`,{className:`inline-flex rounded-lg border border-border p-0.5 flex-wrap gap-0.5`,children:[e===B&&h(`button`,{type:`button`,onClick:()=>T(`alexa-login`),className:`rounded-md px-3 py-1 text-xs font-medium transition-colors ${a===`alexa-login`?`bg-primary text-primary-foreground`:`text-foreground-subtle hover:text-foreground`}`,children:`Login interactively`}),h(`button`,{type:`button`,onClick:()=>T(`existing`),className:`rounded-md px-3 py-1 text-xs font-medium transition-colors ${a===`existing`?`bg-primary text-primary-foreground`:`text-foreground-subtle hover:text-foreground`}`,children:`Use existing`}),h(`button`,{type:`button`,onClick:()=>T(`new`),className:`rounded-md px-3 py-1 text-xs font-medium transition-colors ${a===`new`?`bg-primary text-primary-foreground`:`text-foreground-subtle hover:text-foreground`}`,children:e===B?`Paste cookie`:`Create new`})]}),a===`alexa-login`&&h(z,{onResolved:r,onCancel:i}),a===`existing`&&d(`div`,{className:`space-y-3`,children:[c.isLoading&&d(`div`,{className:`flex items-center gap-2 text-xs text-foreground-subtle`,children:[h(y,{className:`h-3.5 w-3.5 animate-spin`}),` Loading brokers…`]}),c.isError&&d(`div`,{className:`rounded border border-danger/30 bg-danger/5 text-danger px-3 py-2 text-[11px]`,children:[`Failed to load brokers:`,` `,c.error instanceof Error?c.error.message:`Unknown error`]}),!c.isLoading&&!c.isError&&l.length===0&&d(`div`,{className:`rounded-lg border border-border bg-surface px-3 py-6 text-center text-xs text-foreground-subtle`,children:[`No brokers of this kind yet. Switch to`,` `,h(`span`,{className:`font-medium text-foreground`,children:e===B?`Login interactively`:`Create new`}),` `,`to register one.`]}),h(`div`,{className:`space-y-2`,children:l.map(e=>d(`button`,{type:`button`,onClick:()=>_(e.id),className:`flex w-full items-center justify-between gap-3 rounded-lg border bg-surface p-3 text-left transition-colors ${g===e.id?`border-primary ring-1 ring-primary`:`border-border hover:border-foreground-subtle/30`}`,children:[h(`span`,{className:`text-xs font-semibold text-foreground`,children:e.name}),h(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium ${U[e.status]}`,children:e.status})]},e.id))}),l.length>0&&h(`div`,{className:`flex justify-end pt-1`,children:h(`button`,{type:`button`,onClick:C,disabled:!g,className:`inline-flex items-center gap-1.5 rounded bg-primary px-4 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50`,children:`Use this broker`})})]}),a===`new`&&d(`div`,{className:`space-y-3`,children:[d(`div`,{className:`space-y-1`,children:[h(`label`,{className:`text-[10px] uppercase tracking-wide text-foreground-subtle`,children:`Name`}),h(`input`,{type:`text`,value:v,onChange:e=>x(e.target.value),placeholder:`My Home Assistant`,className:`w-full rounded border border-border bg-background px-2 py-1.5 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-primary`})]}),S.isError&&h(`div`,{className:`rounded border border-danger/30 bg-danger/5 text-danger px-3 py-2 text-[11px]`,children:S.error instanceof Error?S.error.message:String(S.error)}),h(D,{kind:e,...p===void 0?{}:{addonId:p},onSubmit:e=>{w(e).catch(()=>{})},onCancel:i,submitLabel:S.isPending?`Creating…`:`Create broker`,disabled:S.isPending||v.trim().length===0}),v.trim().length===0&&h(`p`,{className:`text-[10px] text-foreground-subtle`,children:`Enter a name before creating.`})]})]})}u();function G({open:t,onClose:n,scope:r}){let i=s(),[a,o]=m(new Set),[l,u]=m(new Set),{data:p}=e({}),g=f(()=>new Set((p??[]).map(e=>e.stableId)),[p]),v=c(async(e,t)=>{u(e=>new Set(e).add(t.stableId));try{await i.mutateAsync({addonId:e,candidate:t}),o(e=>new Set(e).add(t.stableId))}catch{}finally{u(e=>{let n=new Set(e);return n.delete(t.stableId),n})}},[i]),b=c((e,t)=>{let n=typeof t.prefilledConfig.host==`string`?t.prefilledConfig.host:null,r=g.has(t.stableId),i=a.has(t.stableId)||r,o=l.has(t.stableId);return d(`div`,{className:`flex items-center justify-between rounded-lg border border-border bg-surface px-3 py-2`,children:[d(`div`,{className:`min-w-0`,children:[h(`p`,{className:`truncate text-xs font-medium text-foreground`,children:t.suggestedName}),n&&h(`p`,{className:`truncate text-[10px] font-mono text-foreground-subtle`,children:n})]}),i?d(`span`,{className:`flex items-center gap-1 text-[11px] text-foreground-subtle`,children:[h(x,{className:`h-3.5 w-3.5`}),` `,r?`Already added`:`Added`]}):d(`button`,{type:`button`,onClick:()=>void v(e,t),disabled:o,className:`flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 text-[11px] font-medium text-primary-foreground disabled:opacity-50`,children:[o?h(y,{className:`h-3.5 w-3.5 animate-spin`}):h(_,{className:`h-3.5 w-3.5`}),`Add`]})]},t.stableId)},[a,l,g,v]);if(!t)return null;let S=r?`Scan network — ${r.label}`:`Scan network for devices`;return d(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center`,children:[h(`div`,{className:`absolute inset-0 bg-black/60`,onClick:n}),d(`div`,{className:`relative z-10 flex w-full max-w-2xl flex-col max-h-[90vh] rounded-xl border border-border bg-background shadow-2xl`,children:[d(`div`,{className:`flex items-center justify-between border-b border-border px-5 py-4 shrink-0`,children:[d(`div`,{className:`flex items-center gap-2`,children:[h(O,{className:`h-4 w-4 text-primary`}),h(`h2`,{className:`text-sm font-semibold text-foreground`,children:S})]}),h(`button`,{onClick:n,className:`rounded-md p-1 text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors`,children:h(C,{className:`h-4 w-4`})})]}),r?h(q,{scope:r,onAdopt:b,onReset:()=>o(new Set)}):h(K,{onAdopt:b,onReset:()=>o(new Set)})]})]})}function K({onAdopt:e,onReset:t}){let n=i(),r=c(()=>{t(),n.mutate({})},[n,t]);g(()=>{!n.isPending&&!n.data&&r()},[]);let a=f(()=>(n.data?.groups??[]).filter(e=>e.candidates.length>0),[n.data]),o=f(()=>a.reduce((e,t)=>e+t.candidates.length,0),[a]);return d(p,{children:[h(`div`,{className:`flex items-center justify-end gap-2 border-b border-border px-5 py-2 shrink-0`,children:d(`button`,{onClick:r,disabled:n.isPending,className:`flex items-center gap-1 rounded-md border border-border px-2 py-1 text-xs text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors disabled:opacity-50`,children:[h(v,{className:`h-3.5 w-3.5 ${n.isPending?`animate-spin`:``}`}),`Re-scan`]})}),d(`div`,{className:`flex-1 min-h-0 overflow-y-auto px-5 py-4 space-y-4`,children:[n.isPending&&h(J,{label:`Scanning the local network…`}),!n.isPending&&n.isError&&h(Y,{}),!n.isPending&&n.data&&a.length===0&&h(`p`,{className:`py-8 text-center text-xs text-foreground-subtle`,children:`No devices responded to the scan.`}),!n.isPending&&a.length>0&&d(`p`,{className:`text-xs text-foreground-subtle`,children:[`Found `,o,` device`,o===1?``:`s`,` on the network.`]}),!n.isPending&&a.map(t=>d(`div`,{className:`space-y-1.5`,children:[d(`div`,{className:`flex items-center gap-2`,children:[h(`span`,{className:`text-[11px] font-semibold text-foreground`,children:t.label}),d(`span`,{className:`text-[10px] text-foreground-subtle`,children:[`(`,t.candidates.length,`)`]})]}),t.candidates.map(n=>e(t.addonId,n))]},t.addonId))]})]})}function q({scope:e,onAdopt:t,onReset:n}){let i=a({addonId:e.addonId}).data??null,[o,s]=m({}),l=r(),u=c(()=>{n(),l.mutate({addonId:e.addonId,params:o})},[l,e.addonId,o,n]),f=l.data?.candidates??[];return h(p,{children:d(`div`,{className:`flex-1 min-h-0 overflow-y-auto px-5 py-4 space-y-4`,children:[i&&h(E,{schema:i,values:o,onChange:s}),d(`button`,{onClick:u,disabled:l.isPending,className:`flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground disabled:opacity-50`,children:[l.isPending?h(y,{className:`h-3.5 w-3.5 animate-spin`}):h(O,{className:`h-3.5 w-3.5`}),l.isPending?`Scanning…`:`Scan`]}),l.isError&&h(Y,{}),!l.isPending&&l.data&&f.length===0&&h(`p`,{className:`py-6 text-center text-xs text-foreground-subtle`,children:`No devices responded to the scan.`}),!l.isPending&&f.length>0&&d(`div`,{className:`space-y-1.5`,children:[d(`p`,{className:`text-xs text-foreground-subtle`,children:[`Found `,f.length,` device`,f.length===1?``:`s`,`.`]}),f.map(n=>t(e.addonId,n))]})]})})}function J({label:e}){return d(`div`,{className:`flex flex-col items-center py-12`,children:[h(y,{className:`h-6 w-6 animate-spin text-primary`}),h(`p`,{className:`mt-3 text-xs text-foreground-subtle`,children:e})]})}function Y(){return d(`div`,{className:`flex items-start gap-3 rounded-lg border border-destructive/40 bg-destructive/10 px-4 py-3`,children:[h(T,{className:`h-4 w-4 text-destructive mt-0.5 shrink-0`}),h(`p`,{className:`text-xs text-destructive`,children:`The scan failed. Try again.`})]})}export{W as n,O as r,G as t};
@@ -1 +0,0 @@
1
- import{Ai as e,Di as t,Lr as n,Oi as r,ji as i,ki as a,oa as o}from"./src-B_-PRq3y.js";import{I as s,Q as c,S as l,o as u,q as d,x as f}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-DTufy7Ue.js";import{t as p}from"./refresh-cw-BoM3__QD.js";import{t as m}from"./rotate-cw-BcZwqoT5.js";import{C as h,U as g,m as _,t as v}from"./index-msAq9OfF.js";import{t as y}from"./AdminPage-BwmGKnRf.js";var b=g(`arrow-down-to-line`,[[`path`,{d:`M12 17V3`,key:`1cwfxf`}],[`path`,{d:`m6 11 6 6 6-6`,key:`12ii2o`}],[`path`,{d:`M19 21H5`,key:`150jfl`}]]),x=g(`hard-drive-download`,[[`path`,{d:`M12 2v8`,key:`1q4o3n`}],[`path`,{d:`m16 6-4 4-4-4`,key:`6wukr`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,key:`w68u3i`}],[`path`,{d:`M6 18h.01`,key:`uhywen`}],[`path`,{d:`M10 18h.01`,key:`h775k`}]]),S=g(`history`,[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M12 7v5l4 2`,key:`1fdv2h`}]]);c();var C=[[`serverManagement`,`getServerPackageStatus`]];function w({label:e,tone:t}){return f(`span`,{className:`inline-flex items-center rounded px-2 py-0.5 text-[11px] font-medium ${{neutral:`bg-surface-muted text-foreground-subtle`,ok:`bg-emerald-500/15 text-emerald-500`,info:`bg-sky-500/15 text-sky-500`,warn:`bg-amber-500/15 text-amber-500`,error:`bg-red-500/15 text-red-500`}[t]}`,children:e})}function T({label:e,value:t}){return l(`div`,{className:`flex items-center justify-between gap-4 text-sm`,children:[f(`span`,{className:`text-foreground-subtle`,children:e}),f(`span`,{className:`font-mono text-foreground`,children:t??`—`})]})}function E({node:n}){let{t:c}=v(),g=u(),_=o(),[y,E]=d(!1),D=n.isHub?void 0:{nodeId:n.id},O=a(D,{refetchInterval:1e4,enabled:n.isOnline,retry:1}),k=O.data??null,A=s(()=>{g.invalidateQueries({queryKey:C})},[g]),j=r({onSettled:A}),M=t({onSettled:A}),N=i({onSettled:A}),P=e({onSettled:A}),F=s(async()=>{k?.latestVersion!=null&&await _({title:c(`serverManagement.confirmUpdateTitle`,`Update node root package`),message:c(`serverManagement.confirmUpdateBody`,`Install {{pkg}}@{{version}} on node "{{node}}" and restart it to apply. The new version boots on probation: if it fails to reach ready, the node automatically rolls back to the current version. Requires an always-relaunching supervisor (Docker restart policy "unless-stopped" or "always"), otherwise the node stays down after exiting to apply.`,{pkg:k.packageName,version:k.latestVersion,node:n.name}),confirmLabel:c(`serverManagement.confirmUpdateAction`,`Update & restart`)})&&(await M.mutateAsync({version:k.latestVersion,...D})).restarting&&E(!0)},[M,_,n.name,D,k,c]),I=s(async()=>{k?.previousVersion!=null&&await _({title:c(`serverManagement.confirmRollbackTitle`,`Roll back node root package`),message:c(`serverManagement.confirmRollbackBody`,`Restart node "{{node}}" on the previous version ({{version}})?`,{node:n.name,version:k.previousVersion}),confirmLabel:c(`serverManagement.confirmRollbackAction`,`Roll back & restart`)})&&(await N.mutateAsync(D)).restarting&&E(!0)},[_,n.name,N,D,k,c]),L=s(async()=>{await _({title:c(`serverManagement.confirmRestartTitle`,`Restart node`),message:c(`serverManagement.confirmRestartBody`,`Restart node "{{node}}" now? The process exits and its supervisor relaunches it on the same version. In-flight requests to this node are dropped.`,{node:n.name}),confirmLabel:c(`serverManagement.confirmRestartAction`,`Restart`),variant:`warning`})&&(await P.mutateAsync(D)).restarting&&E(!0)},[_,n.name,P,D,c]),R=()=>{switch(k?.bootMode){case`data-root`:return{label:c(`serverManagement.bootDataRoot`,`runtime-updatable`),tone:`ok`};case`workspace`:return{label:c(`serverManagement.bootWorkspace`,`dev workspace`),tone:`info`};default:return{label:c(`serverManagement.bootBaked`,`baked image seed`),tone:`neutral`}}},z=()=>{if(k==null)return null;if(k.rolledBack!=null)return{label:c(`serverManagement.stateRolledBack`,`rolled back (update failed)`),tone:`error`};switch(k.updateState){case`checking`:return{label:c(`serverManagement.stateChecking`,`checking…`),tone:`info`};case`staging`:return{label:c(`serverManagement.stateStaging`,`updating…`),tone:`info`};case`pending-restart`:return{label:c(`serverManagement.statePending`,`restart pending`),tone:`warn`};case`awaiting-confirmation`:return{label:c(`serverManagement.stateAwaitingConfirmation`,`awaiting confirmation`),tone:`warn`};default:return k.updateAvailable?{label:c(`serverManagement.stateUpdateAvailable`,`update available`),tone:`warn`}:{label:c(`serverManagement.stateUpToDate`,`up to date`),tone:`ok`}}},B=k?.bootMode===`workspace`,V=n.isOnline&&k!=null&&!B&&k.updateAvailable&&k.updateState===`idle`&&!M.isPending,H=n.isOnline&&k!=null&&!B&&k.previousVersion!=null&&k.updateState===`idle`&&!N.isPending,U=n.isOnline&&k!=null&&k.updateState===`idle`&&!P.isPending,W=n.isOnline?z():null,G=k?.packageName??n.rootPackage?.name??(n.isHub?`@camstack/server`:`@camstack/agent`);return l(`div`,{className:`rounded-lg border border-border bg-surface p-4 space-y-4`,children:[l(`div`,{className:`flex items-center justify-between gap-3`,children:[l(`div`,{className:`flex items-center gap-2 min-w-0`,children:[f(`span`,{className:`text-sm font-medium text-foreground truncate`,children:n.name}),f(w,{label:n.isHub?c(`serverManagement.nodeHub`,`hub`):c(`serverManagement.nodeAgent`,`agent`),tone:n.isHub?`info`:`neutral`}),!n.isOnline&&f(w,{label:c(`serverManagement.nodeOffline`,`offline`),tone:`error`})]}),W!=null&&f(w,{...W})]}),l(`div`,{className:`flex items-center gap-2`,children:[f(`span`,{className:`font-mono text-xs text-foreground-subtle truncate`,children:G}),n.isOnline&&k!=null&&f(w,{...R()})]}),!n.isOnline&&f(T,{label:c(`serverManagement.lastReportedVersion`,`Last reported version`),value:n.rootPackage?.version??null}),n.isOnline&&O.isLoading&&l(`div`,{className:`flex items-center gap-2 text-sm text-foreground-subtle`,children:[f(h,{className:`h-4 w-4 animate-spin`}),c(`common.loading`,`Loading…`)]}),n.isOnline&&O.isError&&l(`div`,{className:`space-y-1.5`,children:[f(`p`,{className:`text-sm text-red-500`,children:c(`serverManagement.loadError`,`Could not load the node root-package status.`)}),n.rootPackage!=null&&f(T,{label:c(`serverManagement.lastReportedVersion`,`Last reported version`),value:n.rootPackage.version})]}),n.isOnline&&k!=null&&l(`div`,{className:`space-y-1.5`,children:[f(T,{label:c(`serverManagement.runningVersion`,`Running version`),value:k.runningVersion}),f(T,{label:c(`serverManagement.latestVersion`,`Latest on registry`),value:k.latestVersion}),f(T,{label:c(`serverManagement.previousVersion`,`Previous (rollback target)`),value:k.previousVersion}),f(T,{label:c(`serverManagement.seedVersion`,`Image seed version`),value:k.seedVersion}),f(T,{label:c(`serverManagement.nodeRuntimeVersion`,`Node.js runtime`),value:k.nodeRuntimeVersion}),k.pendingVersion!=null&&f(T,{label:c(`serverManagement.pendingVersion`,`Staged (applies on restart)`),value:k.pendingVersion})]}),n.isOnline&&k?.updateState===`awaiting-confirmation`&&f(`div`,{className:`rounded border border-amber-500/30 bg-amber-500/10 p-2.5 text-xs text-amber-500`,children:c(`serverManagement.awaitingConfirmationWarning`,`This node restarted onto {{version}} and is confirming boot health — avoid restarting it now. Update and rollback are temporarily unavailable until the probation boot confirms; a manual restart during this window would auto-roll-back the update.`,{version:k.pendingVersion??k.runningVersion??``})}),n.isOnline&&k?.stateFileCorrupt===!0&&f(`div`,{className:`rounded border border-amber-500/30 bg-amber-500/10 p-2.5 text-xs text-amber-500`,children:c(`serverManagement.stateCorruptWarning`,`The server-root state file on this node is corrupt — it booted from the baked seed and any installed data-directory versions are being ignored. Applying an update will rewrite the state file.`)}),n.isOnline&&k?.rolledBack!=null&&f(`div`,{className:`rounded border border-red-500/30 bg-red-500/10 p-2.5 text-xs text-red-400`,children:c(`serverManagement.rolledBackDetail`,`Update to {{from}} failed and was rolled back to {{to}}: {{reason}}`,{from:k.rolledBack.fromVersion,to:k.rolledBack.toVersion??c(`serverManagement.bakedSeed`,`the baked seed`),reason:k.rolledBack.reason})}),n.isOnline&&B&&f(`p`,{className:`text-xs text-foreground-subtle`,children:c(`serverManagement.workspaceNote`,`Development workspace detected — runtime updates are disabled (the dev loop resolves code from the workspace).`)}),y&&l(`div`,{className:`flex items-center gap-2 text-sm text-amber-500`,children:[f(h,{className:`h-4 w-4 animate-spin`}),c(`serverManagement.nodeRestarting`,`The node is restarting to apply the change…`)]}),n.isOnline&&l(`div`,{className:`flex flex-wrap items-center gap-2 pt-1`,children:[l(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded border border-border px-2.5 py-1.5 text-xs font-medium text-foreground hover:bg-surface-muted disabled:opacity-50`,disabled:j.isPending||k?.updateState===`staging`,onClick:()=>j.mutate(D),children:[j.isPending?f(h,{className:`h-3.5 w-3.5 animate-spin`}):f(p,{className:`h-3.5 w-3.5`}),c(`serverManagement.checkForUpdate`,`Check for update`)]}),V&&l(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded bg-primary px-2.5 py-1.5 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50`,onClick:()=>void F(),children:[M.isPending?f(h,{className:`h-3.5 w-3.5 animate-spin`}):f(b,{className:`h-3.5 w-3.5`}),c(`serverManagement.updateTo`,`Update to {{version}}`,{version:k?.latestVersion??``})]}),H&&l(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded border border-amber-500/40 px-2.5 py-1.5 text-xs font-medium text-amber-500 hover:bg-amber-500/10 disabled:opacity-50`,onClick:()=>void I(),children:[N.isPending?f(h,{className:`h-3.5 w-3.5 animate-spin`}):f(S,{className:`h-3.5 w-3.5`}),c(`serverManagement.rollback`,`Roll back to {{version}}`,{version:k?.previousVersion??``})]}),l(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded border border-border px-2.5 py-1.5 text-xs font-medium text-foreground hover:bg-surface-muted disabled:opacity-50`,disabled:!U,onClick:()=>void L(),children:[P.isPending?f(h,{className:`h-3.5 w-3.5 animate-spin`}):f(m,{className:`h-3.5 w-3.5`}),c(`serverManagement.restart`,`Restart`)]})]}),n.isOnline&&k?.lastCheckedAtMs!=null&&l(`p`,{className:`flex items-center gap-1.5 text-[11px] text-foreground-subtle`,children:[f(x,{className:`h-3 w-3`}),c(`serverManagement.lastChecked`,`Last checked: {{when}}`,{when:new Date(k.lastCheckedAtMs).toLocaleString()})]})]})}var D={id:`hub`,name:`hub`,isHub:!0,isOnline:!0,rootPackage:null};function O(){let{t:e}=v(),r=o(),i=n(void 0,{refetchInterval:15e3}),a=[...(i.data??[]).map(e=>({id:e.id,name:e.name,isHub:e.isHub,isOnline:e.isOnline,rootPackage:e.rootPackage??null}))].sort((e,t)=>e.isHub===t.isHub?e.name.localeCompare(t.name):e.isHub?-1:1),c=a.length>0?a:[D],u=t(),[p,m]=d(!1),g=c.filter(e=>e.isOnline),x=s(async()=>{let t=[...g].sort((e,t)=>e.isHub===t.isHub?0:e.isHub?1:-1);if(await r({title:e(`serverManagement.confirmUpdateAllTitle`,`Update all nodes`),message:e(`serverManagement.confirmUpdateAllBody`,`Sequentially update every online node to its latest published version — agents first, the hub last. Each node installs its root package (only if newer than what it runs) and restarts on probation with automatic rollback; already-current nodes are skipped. The hub restarts last, so this page will reconnect afterwards.`),confirmLabel:e(`serverManagement.confirmUpdateAllAction`,`Update all & restart`),variant:`warning`})){m(!0);try{for(let e of t)try{await u.mutateAsync(e.isHub?{}:{nodeId:e.id})}catch{}}finally{m(!1)}}},[u,r,g,e]);return l(y,{icon:_,title:e(`serverManagement.title`,`Server management`),subtitle:e(`serverManagement.subtitle`,`Runtime-updatable root packages per node — updates install into each node’s data directory and apply on restart with automatic rollback.`),children:[i.isLoading&&l(`div`,{className:`flex items-center gap-2 text-sm text-foreground-subtle`,children:[f(h,{className:`h-4 w-4 animate-spin`}),e(`common.loading`,`Loading…`)]}),i.isError&&f(`p`,{className:`mb-3 text-sm text-red-500`,children:e(`serverManagement.topologyError`,`Could not load the cluster node list — showing the hub only.`)}),g.length>1&&l(`div`,{className:`mb-4 flex items-center gap-3 max-w-5xl`,children:[l(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:opacity-90 disabled:opacity-50`,disabled:p,onClick:()=>void x(),children:[p?f(h,{className:`h-3.5 w-3.5 animate-spin`}):f(b,{className:`h-3.5 w-3.5`}),e(`serverManagement.updateAll`,`Update all nodes`)]}),f(`span`,{className:`text-[11px] text-foreground-subtle`,children:e(`serverManagement.updateAllHint`,`Sequenced agents-first, hub-last — up-to-date nodes are skipped.`)})]}),f(`div`,{className:`grid gap-4 xl:grid-cols-2 max-w-5xl`,children:c.map(e=>f(E,{node:e},e.id))}),f(`p`,{className:`mt-4 max-w-5xl text-[11px] text-foreground-subtle`,children:e(`serverManagement.phase2Note`,`Phase 2: Update moves each node’s main process only (hub + docker agents) — addon runners stay on the /data/framework overlay and the Electron agent stays image-bound until later phases. Do not assume full-stack coherence from one Update click.`)})]})}export{O as ServerManagementPage};
@@ -1 +0,0 @@
1
- import{U as e}from"./index-msAq9OfF.js";var t=e(`circle-check-big`,[[`path`,{d:`M21.801 10A10 10 0 1 1 17 3.335`,key:`yps3ct`}],[`path`,{d:`m9 11 3 3L22 4`,key:`1pflzl`}]]);export{t};
@@ -1 +0,0 @@
1
- import{U as e}from"./index-msAq9OfF.js";var t=e(`clock`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`polyline`,{points:`12 6 12 12 16 14`,key:`68esgv`}]]);export{t};
@@ -1 +0,0 @@
1
- import{K as e,Q as t,S as n,W as r,q as i,x as a,z as o}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-DTufy7Ue.js";import{F as s,I as c,L as l,P as u,R as d,U as f}from"./index-msAq9OfF.js";var p=f(`image-off`,[[`line`,{x1:`2`,x2:`22`,y1:`2`,y2:`22`,key:`a6p6uj`}],[`path`,{d:`M10.41 10.41a2 2 0 1 1-2.83-2.83`,key:`1bzlo9`}],[`line`,{x1:`13.5`,x2:`6`,y1:`13.5`,y2:`21`,key:`1q0aeu`}],[`line`,{x1:`18`,x2:`21`,y1:`12`,y2:`15`,key:`5mozeu`}],[`path`,{d:`M3.59 3.59A1.99 1.99 0 0 0 3 5v14a2 2 0 0 0 2 2h14c.55 0 1.052-.22 1.41-.59`,key:`mmje98`}],[`path`,{d:`M21 15V5a2 2 0 0 0-2-2H9`,key:`43el77`}]]);t();var m={fromMs:null,toMs:null},h=36e5,g=24*h;function _(e,t){switch(e){case`24h`:return{fromMs:t-g,toMs:null};case`7d`:return{fromMs:t-7*g,toMs:null};case`30d`:return{fromMs:t-30*g,toMs:null};case`all`:return m}}function v(e){return e.fromMs!==null||e.toMs!==null}function y(e,t){return v(t)?e.filter(e=>!(t.fromMs!==null&&e.timestamp<t.fromMs||t.toMs!==null&&e.timestamp>t.toMs)):[...e]}function b(e,t){return t.size===0?[...e]:e.filter(e=>t.has(e.deviceId))}function x(e){let t=new Set,n=[];for(let r of e)t.has(r.deviceId)||(t.add(r.deviceId),n.push(r.deviceId));return n}function S(e){if(!e)return null;let t=Date.parse(`${e}T00:00:00`);return Number.isNaN(t)?null:t}function C(e){if(!e)return null;let t=Date.parse(`${e}T23:59:59.999`);return Number.isNaN(t)?null:t}function w(e,t){if(!Number.isFinite(e)||e<=0)return`—`;let n=t-e;return n<6e4?`just now`:n<h?`${String(Math.floor(n/6e4))}m ago`:n<g?`${String(Math.floor(n/h))}h ago`:n<7*g?`${String(Math.floor(n/g))}d ago`:new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`})}function T(e){return!Number.isFinite(e)||e<=0?`—`:new Date(e).toLocaleString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`})}function E({cameras:t,selected:r,onChange:s}){let[u,f]=i(!1),p=e(null);o(()=>{if(!u)return;function e(e){p.current&&e.target instanceof Node&&!p.current.contains(e.target)&&f(!1)}function t(e){e.key===`Escape`&&f(!1)}return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[u]);function m(e){let t=new Set(r);t.has(e)?t.delete(e):t.add(e),s(t)}let h=r.size,g=h===0?`All cameras`:h===1?t.find(e=>r.has(e.id))?.name??`1 camera`:`${String(h)} cameras`;return n(`div`,{ref:p,className:`relative`,children:[n(`button`,{type:`button`,onClick:()=>f(e=>!e),disabled:t.length===0,className:`flex items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs transition-colors disabled:opacity-40 ${h>0?`border-primary/40 bg-primary/8 text-primary`:`border-border text-foreground-subtle hover:bg-surface-hover hover:text-foreground`}`,children:[a(d,{className:`h-3.5 w-3.5`}),a(`span`,{className:`max-w-[10rem] truncate`,children:g}),a(c,{className:`h-3 w-3 opacity-70`})]}),u&&n(`div`,{className:`absolute left-0 z-30 mt-1 max-h-64 w-[min(15rem,calc(100vw-1.5rem))] overflow-y-auto rounded-md border border-border bg-surface p-1 shadow-lg shadow-black/30`,children:[h>0&&a(`button`,{type:`button`,onClick:()=>s(new Set),className:`mb-1 w-full rounded px-2 py-1 text-left text-[11px] text-foreground-subtle hover:bg-surface-hover hover:text-foreground`,children:`Clear selection`}),t.map(e=>{let t=r.has(e.id);return n(`button`,{type:`button`,onClick:()=>m(e.id),className:`flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors ${t?`bg-primary/10 text-primary`:`text-foreground hover:bg-surface-hover`}`,children:[a(`span`,{className:`flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-sm border ${t?`border-primary bg-primary text-white`:`border-border`}`,children:t&&a(l,{className:`h-2.5 w-2.5`})}),a(`span`,{className:`truncate`,children:e.name})]},e.id)})]})]})}t();var D=[{label:`24h`,value:`24h`},{label:`7d`,value:`7d`},{label:`30d`,value:`30d`},{label:`All`,value:`all`}];function O({onChange:e}){let[t,r]=i(`all`),[o,s]=i(``),[c,l]=i(``);function u(t){r(t),s(``),l(``),e(_(t,Date.now()))}function d(t,n){r(`custom`),s(t),l(n),e({fromMs:S(t),toMs:C(n)})}let f=`rounded-md border border-border bg-surface px-2 py-1.5 text-[11px] text-foreground outline-none focus:border-primary [color-scheme:light] dark:[color-scheme:dark]`;return n(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[a(`div`,{className:`flex items-center gap-1 rounded-md border border-border p-0.5`,children:D.map(e=>a(`button`,{type:`button`,onClick:()=>u(e.value),className:`rounded px-2.5 py-1 text-[11px] transition-colors ${t===e.value?`bg-primary/12 text-primary font-medium`:`text-foreground-subtle hover:bg-surface-hover hover:text-foreground`}`,children:e.label},e.value))}),n(`div`,{className:`flex items-center gap-1`,children:[a(`input`,{type:`date`,"aria-label":`From date`,value:o,max:c||void 0,onChange:e=>d(e.target.value,c),className:`${f} ${t===`custom`&&o?`border-primary/50`:``}`}),a(`span`,{className:`text-[11px] text-foreground-subtle`,children:`→`}),a(`input`,{type:`date`,"aria-label":`To date`,value:c,min:o||void 0,onChange:e=>d(o,e.target.value),className:`${f} ${t===`custom`&&c?`border-primary/50`:``}`})]})]})}t();var k=2.6;function A({src:e,alt:t,className:r,overlay:o,fit:s=`contain`}){let[c,l]=i(!1),[u,d]=i(`50% 50%`);function f(e){if(!c){let t=e.currentTarget.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*100,r=(e.clientY-t.top)/t.height*100;d(`${String(n)}% ${String(r)}%`)}l(e=>!e)}let p=s===`natural`;return a(`div`,{className:`relative overflow-hidden bg-background ${r??``}`,onClick:f,children:n(`div`,{className:`relative select-none transition-transform duration-200 ease-out ${p?`w-full`:`h-full w-full`} ${c?`cursor-zoom-out`:`cursor-zoom-in`}`,style:{transformOrigin:u,transform:c?`scale(${String(k)})`:`scale(1)`},children:[a(`img`,{src:e,alt:t,draggable:!1,className:p?`block h-auto w-full object-contain`:`h-full w-full object-contain`}),o]})})}var j=2;function M(e,t){if(t<=1)return[{kind:`page`,n:1}];if(t<=7){let e=[];for(let n=1;n<=t;n++)e.push({kind:`page`,n});return e}let n=[],r=Math.max(2,e-j),i=Math.min(t-1,e+j);n.push({kind:`page`,n:1}),r>2&&n.push({kind:`ellipsis`,side:`left`});for(let e=r;e<=i;e++)n.push({kind:`page`,n:e});return i<t-1&&n.push({kind:`ellipsis`,side:`right`}),n.push({kind:`page`,n:t}),n}function N({currentPage:e,totalItems:t,pageSize:r,onPageChange:i,itemNoun:o=`items`}){if(t<=r)return null;let c=Math.ceil(t/r),l=(e-1)*r+1,d=Math.min(e*r,t),f=M(e,c),p=`inline-flex h-7 min-w-7 items-center justify-center rounded-md px-2 text-[11px] transition-colors disabled:opacity-40`;return n(`div`,{className:`flex items-center justify-between gap-4 flex-wrap pt-2 text-[11px] text-foreground-subtle`,children:[n(`span`,{children:[`Showing `,l,`–`,d,` of `,t,` `,o]}),n(`div`,{className:`flex items-center gap-1`,children:[a(`button`,{type:`button`,className:`${p} hover:bg-surface-hover`,onClick:()=>i(e-1),disabled:e<=1,"aria-label":`Previous page`,children:a(s,{className:`h-3.5 w-3.5`})}),f.map(t=>t.kind===`ellipsis`?a(`span`,{className:`px-1 opacity-60`,children:`…`},`ellipsis-${t.side}`):a(`button`,{type:`button`,className:`${p} ${t.n===e?`bg-primary/12 text-primary font-medium`:`hover:bg-surface-hover hover:text-foreground`}`,onClick:()=>i(t.n),"aria-current":t.n===e?`page`:void 0,children:t.n},t.n)),a(`button`,{type:`button`,className:`${p} hover:bg-surface-hover`,onClick:()=>i(e+1),disabled:e>=c,"aria-label":`Next page`,children:a(u,{className:`h-3.5 w-3.5`})})]})]})}t();function P(e,t,n){let[a,s]=i(1);o(()=>{s(1)},[n]);let c=e.length,l=Math.max(1,Math.ceil(c/t)),u=Math.min(a,l);return o(()=>{u!==a&&s(u)},[u,a]),{page:u,setPage:s,pageItems:r(()=>{let n=(u-1)*t;return e.slice(n,n+t)},[e,u,t]),totalPages:l,totalItems:c,pageSize:t}}function F(e){let{delayMs:t,invalidate:n,setTimeoutFn:r=setTimeout,clearTimeoutFn:i=clearTimeout}=e,a;function o(){a===void 0&&(a=r(()=>{a=void 0,n()},t))}function s(){a!==void 0&&(i(a),a=void 0)}return{trigger:o,cancel:s}}export{O as a,x as c,w as d,T as f,A as i,b as l,P as n,E as o,p,N as r,m as s,F as t,y as u};