@camstack/addon-admin-ui 1.2.518 → 1.2.520

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 (137) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/assets/{AddonAssetIcon-BC78agF0.js → AddonAssetIcon-Do54wTZ7.js} +1 -1
  3. package/dist/assets/Addons-B1OJ_ktZ.js +5 -0
  4. package/dist/assets/{AdminPage-Bjs-nytk.js → AdminPage-BmoKOToB.js} +1 -1
  5. package/dist/assets/{AdminSectionedPage-C2tP0k-6.js → AdminSectionedPage-O0ffiJOS.js} +1 -1
  6. package/dist/assets/{AiProfiles-pD02-18U.js → AiProfiles-koWE1ekm.js} +2 -2
  7. package/dist/assets/{BrokerEditorDialog-DqKS37Rv.js → BrokerEditorDialog-CcvbGDox.js} +1 -1
  8. package/dist/assets/{Build-CS_dj5Hw.js → Build-DkW1vw1Z.js} +7 -7
  9. package/dist/assets/{Calendars-DCACjLC6.js → Calendars-DeDcWHS-.js} +1 -1
  10. package/dist/assets/Cluster-CZB476Cv.js +1 -0
  11. package/dist/assets/{ComposedDeviceEditDialog-BbJPDw4o.js → ComposedDeviceEditDialog-DiO4bitz.js} +1 -1
  12. package/dist/assets/CompositionBlockEditor-BQbgk5OR.js +2 -0
  13. package/dist/assets/{CompositionEditorPage-DP0zujWv.js → CompositionEditorPage-caLz4h3I.js} +1 -1
  14. package/dist/assets/Data-Cpi9Lb2k.js +2 -0
  15. package/dist/assets/{DeviceDetail-DkP5CZVE.js → DeviceDetail-SAboiNCE.js} +2 -2
  16. package/dist/assets/DeviceDoActionFields-C5Oeqy94.js +1 -0
  17. package/dist/assets/{Devices-mBnndiKl.js → Devices-DArtILxr.js} +1 -1
  18. package/dist/assets/{EmbedPlayerPage-BcZOBNUY.js → EmbedPlayerPage-B-NlJHwD.js} +1 -1
  19. package/dist/assets/{History-DaqaF73n.js → History-B_xZFQt7.js} +1 -1
  20. package/dist/assets/Identity-Cawa92L2.js +1 -0
  21. package/dist/assets/IntegrationDetail-D6gLTapX.js +1 -0
  22. package/dist/assets/{IntegrationHub-CBRrUUwz.js → IntegrationHub-vZ23z1RD.js} +1 -1
  23. package/dist/assets/{Integrations-LJTGYZMx.js → Integrations-BLhvc6uB.js} +1 -1
  24. package/dist/assets/Integrations-Bt-5ZNBV.js +1 -0
  25. package/dist/assets/{Library-DpuCsSIr.js → Library-K2waPmh-.js} +1 -1
  26. package/dist/assets/Locations-GaQ-Vlg2.js +3 -0
  27. package/dist/assets/{Logs-D1cD43iv.js → Logs-8qT_HE5j.js} +1 -1
  28. package/dist/assets/{MaskShapeCanvas-uxChMknO.js → MaskShapeCanvas-B599Qff8.js} +1 -1
  29. package/dist/assets/{MotionZonesSettings--b5THRq8.js → MotionZonesSettings-kGwQFrli.js} +1 -1
  30. package/dist/assets/{MyAccess-CM3VRR_i.js → MyAccess-A5l6WoMd.js} +1 -1
  31. package/dist/assets/Network-B_HZ4sjm.js +1 -0
  32. package/dist/assets/{NodeAddonsSettingsPanel-09f8jHVS.js → NodeAddonsSettingsPanel-Ccww7SgZ.js} +1 -1
  33. package/dist/assets/Notifications-DxoAS5SX.js +1 -0
  34. package/dist/assets/{Pipeline-Bbec-Y6A.js → Pipeline-7I-tbGWA.js} +1 -1
  35. package/dist/assets/{PrivacyMaskSettings-C4vaTevi.js → PrivacyMaskSettings-D3OKCG5L.js} +1 -1
  36. package/dist/assets/Recordings-Dqxrdll7.js +1 -0
  37. package/dist/assets/{RemoteGrid-BEi9hXEQ.js → RemoteGrid-BC7RcI7j.js} +1 -1
  38. package/dist/assets/{ScanNetworkModal-Da7Ia5fk.js → ScanNetworkModal-De1BMqEu.js} +1 -1
  39. package/dist/assets/{SceneMonitorEditor-CRNON98X.js → SceneMonitorEditor-BWwBdarY.js} +1 -1
  40. package/dist/assets/SessionsList-DK9sBB3z.js +2 -0
  41. package/dist/assets/{Showroom-B8oIkjzd.js → Showroom-bS5UisOb.js} +1 -1
  42. package/dist/assets/{System-BAxBoDDo.js → System-CoCWu43h.js} +1 -1
  43. package/dist/assets/{Templates-BzDGxVCB.js → Templates-DIMuzzu_.js} +1 -1
  44. package/dist/assets/{Terminal-DOuAcBhK.js → Terminal-CaIDL65f.js} +3 -3
  45. package/dist/assets/{Viewer-D8Z0j_5f.js → Viewer-BzxcMFB5.js} +1 -1
  46. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-CAe-SPFx.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DvIAWVsR.js} +1 -1
  47. package/dist/assets/{addon-icons-context-BFP9swAt.js → addon-icons-context-D-3KCr36.js} +1 -1
  48. package/dist/assets/{archive-Ci7cm4G6.js → archive-sIPC64K9.js} +1 -1
  49. package/dist/assets/{assignment-candidates-VjT4o6uu.js → assignment-candidates-C_UoiwJK.js} +1 -1
  50. package/dist/assets/{authed-media-Cez6z7Na.js → authed-media-BE3neYoh.js} +1 -1
  51. package/dist/assets/{bell-off-BQ5f8XC0.js → bell-off-DBYFNI8u.js} +1 -1
  52. package/dist/assets/{board-model-BTA-bFlQ.js → board-model-CeWFKx9n.js} +1 -1
  53. package/dist/assets/{boxes-Czy7yEhH.js → boxes-5j10egHw.js} +1 -1
  54. package/dist/assets/circle-slash-VFJ46qWN.js +1 -0
  55. package/dist/assets/client-BmfSvq-t.js +674 -0
  56. package/dist/assets/{cloud-upload-BA2sS5fo.js → cloud-upload-CUkN17bl.js} +1 -1
  57. package/dist/assets/crop-DwwjG8X9.js +1 -0
  58. package/dist/assets/{device-integration-icon-DSBE3o4D.js → device-integration-icon-DUQvGDM8.js} +1 -1
  59. package/dist/assets/device-picker-model-C2rxDYB3.js +1 -0
  60. package/dist/assets/dist-CGa31Bpn.js +674 -0
  61. package/dist/assets/{dist-eJJt48HH.js → dist-dCyhYCji.js} +1 -1
  62. package/dist/assets/{file-up-CoCeS48c.js → file-up-DF9281zn.js} +1 -1
  63. package/dist/assets/format-Ctn7h3o7.js +1 -0
  64. package/dist/assets/{hard-drive-download-D1726cbL.js → hard-drive-download-YoDQjZ6G.js} +1 -1
  65. package/dist/assets/{hostInit-DrD-30zD.js → hostInit-BqZN7ExA.js} +1 -1
  66. package/dist/assets/i18n-CWf2gqjI.js +1 -0
  67. package/dist/assets/{icons-BMj2QemZ.js → icons-CUtj9rug.js} +1 -1
  68. package/dist/assets/{index-DhFn-OXx.js → index-s2JBApLj.js} +3 -3
  69. package/dist/assets/{key-Cuez9yo6.js → key-BpA5yjS5.js} +1 -1
  70. package/dist/assets/{key-round-aeHPqKM8.js → key-round-BbwlZYgP.js} +1 -1
  71. package/dist/assets/{layers-CR_BGB4-.js → layers-Bxrx5612.js} +1 -1
  72. package/dist/assets/{linked-devices-model-DFhvKJk0.js → linked-devices-model-4X2JNgtv.js} +1 -1
  73. package/dist/assets/{list-ordered-C8f5XMRn.js → list-ordered-BQZRweJv.js} +1 -1
  74. package/dist/assets/{location-owned-usage-DtY0j8BQ.js → location-owned-usage-Dwc8i-A6.js} +1 -1
  75. package/dist/assets/{log-in-CHoY0fr_.js → log-in-BFtLVkKt.js} +1 -1
  76. package/dist/assets/{memory-stick-BEIQDnvw.js → memory-stick-65f0Nh--.js} +1 -1
  77. package/dist/assets/{message-square-plus-BRE3KNcy.js → message-square-plus-Cz97-8Ea.js} +1 -1
  78. package/dist/assets/{mf-entry-bootstrap-0-193177ad.js → mf-entry-bootstrap-0-bfee715d.js} +2 -2
  79. package/dist/assets/{mic-off-DdBze9n7.js → mic-off-C90AfhxH.js} +1 -1
  80. package/dist/assets/{monitor-off-BlV0-S9V.js → monitor-off-Kj0KouMn.js} +1 -1
  81. package/dist/assets/{monitor-smartphone-dysQUSro.js → monitor-smartphone-dJjQFha0.js} +1 -1
  82. package/dist/assets/mount-C2rxDYB3.js +1 -0
  83. package/dist/assets/{player-overlays-gMD_rhHz.js → player-overlays-Cl9fdVyE.js} +1 -1
  84. package/dist/assets/{recycle-BA7-S0W8.js → recycle-B_n3HNql.js} +1 -1
  85. package/dist/assets/remoteEntry-Bgu2wj6M.js +1 -0
  86. package/dist/assets/{ruler-D9Jk5se7.js → ruler-DFksgfFc.js} +1 -1
  87. package/dist/assets/{scan-eye-C8pDlR8P.js → scan-eye-Dcs85qj4.js} +1 -1
  88. package/dist/assets/{scissors-DXW7xXbW.js → scissors-DpVQCMjY.js} +1 -1
  89. package/dist/assets/{search-x-D_xVJpAe.js → search-x-BUboqisx.js} +1 -1
  90. package/dist/assets/{send-rR1Ku0wT.js → send-i8_gi4Wv.js} +1 -1
  91. package/dist/assets/{settings-2-D4IIivH2.js → settings-2-BuOeZPiK.js} +1 -1
  92. package/dist/assets/{shapes-w5Fgi2N8.js → shapes-DGstG7DR.js} +1 -1
  93. package/dist/assets/{sigma-CaOfCqqr.js → sigma-B0KIxXLC.js} +1 -1
  94. package/dist/assets/{speaker-CwxMftpn.js → speaker-C7Ctczma.js} +1 -1
  95. package/dist/assets/src-Cjqv1L1_.js +67 -0
  96. package/dist/assets/{step-inspector-model-DjL5SesH.js → step-inspector-model-Du5MgFTI.js} +1 -1
  97. package/dist/assets/{table-2-8ixw9N56.js → table-2-Bi2N6ehZ.js} +1 -1
  98. package/dist/assets/{timer-reset-CKI15cld.js → timer-reset-C-DbgYsd.js} +1 -1
  99. package/dist/assets/{unlink-CCyI_xx8.js → unlink-DOrqvhrS.js} +1 -1
  100. package/dist/assets/{usb-DEn49T2d.js → usb-D21IcPqp.js} +1 -1
  101. package/dist/assets/{use-device-bound-caps-T07YegIU.js → use-device-bound-caps-DUbLU0h-.js} +1 -1
  102. package/dist/assets/{use-scenes-feed-D5RNpqtT.js → use-scenes-feed-Cc_FfCf0.js} +1 -1
  103. package/dist/assets/{use-stationary-objects-DD6qOZ6v.js → use-stationary-objects-C9cIQpEH.js} +1 -1
  104. package/dist/assets/useEventInvalidation-C2rxDYB3.js +1 -0
  105. package/dist/assets/{useNodeUrlSelection-DR_meIYe.js → useNodeUrlSelection-B-iNHDOR.js} +1 -1
  106. package/dist/assets/user-round-CCHLAyrG.js +1 -0
  107. package/dist/assets/{user-x-DQZ1obZM.js → user-x-dk19_EsK.js} +1 -1
  108. package/dist/assets/{variable-BxoapzPU.js → variable-jCYthbGt.js} +1 -1
  109. package/dist/assets/{video-BnPjevi_.js → video-BbvU47vV.js} +1 -1
  110. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-BhdwB_BG.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DOT_MvML.js} +2 -2
  111. package/dist/index.html +9 -9
  112. package/dist/server/addon.js +67 -7
  113. package/package.json +1 -1
  114. package/dist/assets/Addons-CQDH0HWD.js +0 -5
  115. package/dist/assets/Cluster-BrqN0cCD.js +0 -1
  116. package/dist/assets/CompositionBlockEditor-Dmmow4DP.js +0 -2
  117. package/dist/assets/Data-CqOCFJFz.js +0 -2
  118. package/dist/assets/DeviceDoActionFields-H3tNQT9N.js +0 -1
  119. package/dist/assets/Identity-_pfy495m.js +0 -1
  120. package/dist/assets/IntegrationDetail-CoIH_IOT.js +0 -1
  121. package/dist/assets/Integrations-BgQD7R9-.js +0 -1
  122. package/dist/assets/Locations-itQSSJiL.js +0 -3
  123. package/dist/assets/Network-Bu0zlJZn.js +0 -1
  124. package/dist/assets/Notifications-CNGSWjOJ.js +0 -1
  125. package/dist/assets/Recordings-Ccv0flf6.js +0 -1
  126. package/dist/assets/SessionsList-BT-nRXks.js +0 -2
  127. package/dist/assets/circle-slash-Bj89nMWC.js +0 -1
  128. package/dist/assets/client-Btf9JC4a.js +0 -674
  129. package/dist/assets/crop-Cf489T6c.js +0 -1
  130. package/dist/assets/device-picker-model-BGDU8PR0.js +0 -1
  131. package/dist/assets/dist-Ca-InGm-.js +0 -674
  132. package/dist/assets/i18n-Bz5ob6rD.js +0 -1
  133. package/dist/assets/mount-BGDU8PR0.js +0 -1
  134. package/dist/assets/remoteEntry-BvdQpL1M.js +0 -1
  135. package/dist/assets/src-D55o373U.js +0 -67
  136. package/dist/assets/useEventInvalidation-BGDU8PR0.js +0 -1
  137. package/dist/assets/user-round-Dds3N7A4.js +0 -1
@@ -1 +1 @@
1
- import{C as e,J as t,K as n,R as r,S as i,V as a,Y as o,a as s,et as c,o as l,t as u,x as d}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{Dn as f,Fn as p,Ht as m,Pn as h,Vn as g,bt as _,cr as v,dt as ee,fr as y,hn as b,st as x}from"./player-overlays-gMD_rhHz.js";import{tn as S,va as te,yi as C}from"./client-Btf9JC4a.js";import{g as w,s as T}from"./video-BnPjevi_.js";import{t as E}from"./log-in-CHoY0fr_.js";import{t as D}from"./monitor-smartphone-dysQUSro.js";import{t as ne}from"./recycle-BA7-S0W8.js";import{At as O,Dn as re,Ma as k,Nr as ie,Oa as A,Pa as j,ci as M,dr as N,ei as P,gt as ae,ka as F,kt as I,mt as oe,no as se,zi as L}from"./src-D55o373U.js";import{t as R}from"./i18n-Bz5ob6rD.js";import{t as z}from"./useTranslation-BJr-n0es.js";import{T as B,_r as V,g as H,i as U,yr as W}from"./index-DhFn-OXx.js";import{t as G}from"./AdminSectionedPage-C2tP0k-6.js";import{n as K,r as q,t as J}from"./BrokerEditorDialog-DqKS37Rv.js";import{t as ce}from"./NodeAddonsSettingsPanel-09f8jHVS.js";import{n as Y,r as X,t as le}from"./IntegrationHub-CBRrUUwz.js";c();var Z={connected:`success`,connecting:`warning`,disconnected:`default`,"auth-failed":`danger`,unreachable:`danger`,error:`danger`};function Q({status:e}){return i(M,{variant:Z[e],className:`text-[10px]`,children:e})}function ue({broker:t,interactiveConnectPath:n,interactiveDisconnectPath:r,kindLabel:a,onEdit:s}){let{t:c}=z(),u=l(),d=x(),[f,p]=o(null),h=j({onSuccess:e=>p(e.ok?{ok:!0}:{ok:!1,error:e.error}),onError:e=>p({ok:!1,error:e instanceof Error?e.message:String(e)})}),v=k({onSuccess:()=>{u.invalidateQueries({queryKey:[[`broker`,`list`]]})}}),ee=async()=>{await d({title:c(`brokers.brokerManager.deleteBroker`,`Delete broker`),message:c(`brokers.brokerManager.deleteBrokerIntegrationsThatDepend`,`Delete broker "{{name}}"? Integrations that depend on it will stop working.`,{name:t.name}),confirmLabel:c(`common.delete`,`Delete`),variant:`danger`})&&v.mutate({id:t.id,addonId:t.addonId})},b=n!==void 0&&n.length>0&&t.status!==`connected`,S=r!==void 0&&r.length>0&&t.status===`connected`;return e(`tr`,{className:`border-b border-border last:border-0`,children:[i(`td`,{className:`px-3 py-2 text-xs text-foreground font-medium`,children:t.name}),i(`td`,{className:`px-3 py-2 text-xs text-foreground-subtle`,children:a}),e(`td`,{className:`px-3 py-2`,children:[i(Q,{status:t.status}),f&&i(`span`,{className:`ml-2 text-[10px] ${f.ok?`text-success`:`text-danger`}`,children:f.ok?`OK`:f.error??c(`common.failedWord`)})]}),i(`td`,{className:`px-3 py-2`,children:e(`div`,{className:`flex items-center justify-end gap-1.5`,children:[b&&e(P,{variant:`primary`,size:`sm`,onClick:()=>{H(n,t.id,()=>{u.invalidateQueries({queryKey:[[`broker`,`list`]]})})},title:c(`brokers.brokerManager.signInOpensAPopup`,`Sign in — opens a popup that closes when done`),children:[i(E,{className:`h-3 w-3`}),` `,c(`brokers.brokerManager.signIn`)]}),S&&e(P,{variant:`outline`,size:`sm`,onClick:()=>{H(r,t.id,()=>{u.invalidateQueries({queryKey:[[`broker`,`list`]]})})},title:c(`brokers.brokerManager.signOutClearsTheLinked`,`Sign out — clears the linked Google account on this broker`),children:[i(T,{className:`h-3 w-3`}),` `,c(`brokers.brokerManager.signOut`)]}),e(P,{variant:`outline`,size:`sm`,onClick:()=>h.mutate({id:t.id,addonId:t.addonId}),disabled:h.isPending,title:c(`brokers.brokerManager.testConnection`,`Test connection`),children:[h.isPending?i(y,{className:`h-3 w-3 animate-spin`}):i(_,{className:`h-3 w-3`}),c(`brokers.brokerManager.test`,`Test`)]}),e(P,{variant:`outline`,size:`sm`,onClick:()=>s(t),title:c(`common.edit`,`Edit`),children:[i(g,{className:`h-3 w-3`}),` `,c(`common.edit`)]}),e(P,{variant:`outline`,size:`sm`,className:`border-danger/40 text-danger hover:bg-danger/10`,onClick:()=>{ee()},disabled:v.isPending,title:c(`common.delete`,`Delete`),children:[v.isPending?i(y,{className:`h-3 w-3 animate-spin`}):i(m,{className:`h-3 w-3`}),c(`common.delete`,`Delete`)]})]})})]})}function de({addonId:t}={}){let{t:r}=z(),a=F({}),s=n(()=>K(a.data).filter(e=>t===void 0||e.addonId===t),[a.data,t]),[c,l]=o(!1),[u,d]=o(null),{options:f}=q(t===void 0?{}:{addonId:t}),m=n(()=>new Map(f.map(e=>[e.kind,e.label])),[f]),h=n(()=>{let e=new Map;for(let t of f)e.has(t.kind)||e.set(t.kind,{...t.interactiveConnectPath===void 0?{}:{connect:t.interactiveConnectPath},...t.interactiveDisconnectPath===void 0?{}:{disconnect:t.interactiveDisconnectPath}});return e},[f]);return e(`div`,{className:`space-y-3`,children:[i(`div`,{className:`flex items-center justify-end`,children:e(P,{variant:`primary`,size:`sm`,onClick:()=>l(!0),disabled:f.length===0,title:f.length===0?r(`brokers.brokerManager.noBrokerProvidersAvailable`,`No broker providers available`):void 0,children:[i(p,{className:`h-3.5 w-3.5`}),` `,r(`brokers.brokerManager.addBroker`)]})}),i(`div`,{className:`rounded-lg border border-border bg-surface overflow-x-auto`,children:e(`table`,{className:`w-full min-w-[36rem] border-collapse`,children:[i(`thead`,{children:e(`tr`,{className:`border-b border-border bg-background/50`,children:[i(`th`,{className:`px-3 py-2 text-left text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.name`,`Name`)}),i(`th`,{className:`px-3 py-2 text-left text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.kind`,`Kind`)}),i(`th`,{className:`px-3 py-2 text-left text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.status`,`Status`)}),i(`th`,{className:`px-3 py-2 text-right text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.actions`,`Actions`)})]})}),e(`tbody`,{children:[a.isLoading&&i(`tr`,{children:e(`td`,{colSpan:4,className:`px-3 py-6 text-center text-xs text-foreground-subtle`,children:[i(y,{className:`inline h-4 w-4 animate-spin`}),` `,r(`brokers.brokerManager.loadingBrokers`)]})}),a.isError&&i(`tr`,{children:e(`td`,{colSpan:4,className:`px-3 py-4 text-center text-xs text-danger`,children:[r(`brokers.brokerManager.failedToLoadBrokers`,`Failed to load brokers:`),` `,a.error instanceof Error?a.error.message:r(`brokers.brokerManager.unknownError`,`Unknown error`)]})}),!a.isLoading&&!a.isError&&s.length===0&&i(`tr`,{children:i(`td`,{colSpan:4,className:`px-3 py-6 text-center text-xs text-foreground-subtle`,children:r(`brokers.brokerManager.noBrokersRegisteredYetAdd`,`No brokers registered yet. Add one to publish device events for downstream automations.`)})}),s.map(e=>{let t=h.get(e.kind);return i(ue,{broker:e,...t?.connect===void 0?{}:{interactiveConnectPath:t.connect},...t?.disconnect===void 0?{}:{interactiveDisconnectPath:t.disconnect},kindLabel:m.get(e.kind)??e.kind,onEdit:d},e.id)})]})]})}),c&&i(J,{...t===void 0?{}:{addonId:t},onClose:()=>l(!1),onSaved:()=>l(!1)}),u&&i(J,{broker:u,onClose:()=>d(null),onSaved:()=>d(null)})]})}function fe(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e){let t=e.name;if(typeof t==`string`)return t}return null}function pe(e){let t=e,n=t?.manifest;if(n?.id===void 0)return null;let r=(n.capabilities??[]).map(fe).filter(e=>e!==null);return{addonId:n.id,displayName:n.packageDisplayName??n.name??n.id,capNames:r,processState:t?.process?.state??null}}function me(e,t){return Object.entries(e).filter(([,e])=>e===t).map(([e])=>e)}function he(e,t){return t.find(t=>e.capNames.includes(t))??null}function ge(e){switch(e){case`running`:return{state:`ok`,label:R.t(`helpers.connectivityModel.running`)};case`crashed`:case`failed`:return{state:`error`,label:e};case`stopped`:case`disabled`:return{state:`off`,label:R.t(`helpers.connectivityModel.stopped`)};default:return{state:`unknown`,label:e??R.t(`common.unknownWord`)}}}c();var _e=[`wasteCollections`,`listSources`],ve=[`wasteCollections`,`listCountries`];function ye(e){return e instanceof Error?e.message:String(e)}function be(e){return typeof e!=`object`||!e?!1:Array.isArray(Reflect.get(e,`sections`))}function xe(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let e=Reflect.get(n,`id`),r=Reflect.get(n,`label`),i=Reflect.get(n,`module`);if(typeof e!=`string`||typeof r!=`string`||typeof i!=`string`)continue;let a=Reflect.get(n,`enabled`),o=Reflect.get(n,`formValues`),s=Reflect.get(n,`serviceId`),c=Reflect.get(n,`countryId`);t.push({id:e,label:r,module:i,enabled:typeof a==`boolean`?a:!0,formValues:typeof o==`object`&&o&&!Array.isArray(o)?o:void 0,serviceId:typeof s==`string`?s:void 0,countryId:typeof c==`string`?c:void 0})}return t}function Se(e){return Array.isArray(e)?e.flatMap(e=>{if(typeof e!=`object`||!e)return[];let t=Reflect.get(e,`id`),n=Reflect.get(e,`label`);return typeof t!=`string`||typeof n!=`string`?[]:[{id:t,label:n}]}):[]}function Ce(e){return Array.isArray(e)?e.flatMap(e=>{if(typeof e!=`object`||!e)return[];let t=Reflect.get(e,`id`),n=Reflect.get(e,`label`),r=Reflect.get(e,`module`);if(typeof t!=`string`||typeof n!=`string`||typeof r!=`string`)return[];let i=Reflect.get(e,`title`);return[{id:t,label:n,title:typeof i==`string`&&i.length>0?i:n,module:r}]}):[]}function we(e,t,n){return{sections:[{id:`picker`,title:R.t(`system.wasteSettingsSources.countryService`,`Country & service`),columns:2,fields:[{type:`select`,key:`countryId`,label:R.t(`system.wasteSettingsSources.country`,`Country`),options:[{value:``,label:R.t(`system.wasteSettingsSources.selectCountry`,`Select country…`)},...e.map(e=>({value:e.id,label:e.label}))]},{type:`select`,key:`serviceId`,label:R.t(`system.wasteSettingsSources.service`,`Service`),options:[{value:``,label:n===``?R.t(`system.wasteSettingsSources.pickACountryFirst`,`Pick a country first`):R.t(`system.wasteSettingsSources.selectService`,`Select service…`)},...t.map(e=>({value:e.id,label:e.label}))]}]}]}}function Te({addonId:c,capName:f}){let{t:h}=z(),g=ee(),_=l(),v=x(),y=oe({editKey:`wasteEdit`,newKey:`wasteNew`}),[b,S]=o(!1),[te,C]=o(null),[w,T]=o({countryId:``,serviceId:``}),[E,D]=o({label:h(`system.wasteSettingsSources.newSource`,`New source`),enabled:!0}),O=t(null),k=typeof w.countryId==`string`?w.countryId:``,A=typeof w.serviceId==`string`?w.serviceId:``,j=r((e,t)=>g.trpcClient.addons.custom.mutate({addonId:c,action:e,input:t}),[c,g]),F=s({queryKey:[..._e,c],queryFn:async()=>xe(await j(`listSources`,{}))}),I=s({queryKey:[...ve,c],queryFn:async()=>Se(await j(`listCountries`,{}))}),se=s({queryKey:[`wasteCollections`,`listServices`,c,k],enabled:k!==``,queryFn:async()=>Ce(await j(`listServices`,{countryId:k}))}),L=s({queryKey:[`wasteCollections`,`serviceFormSchema`,c,A],enabled:A!==``,queryFn:async()=>j(`serviceFormSchema`,{serviceId:A})}),R=F.data??[],B=I.data??[],V=se.data??[],H=be(L.data)?L.data:void 0,U=n(()=>we(B,k===``?[]:V,k),[B,V,k]),W=y.state,G=W.mode===`edit`?R.find(e=>e.id===W.id)??null:null;a(()=>{if(y.state.mode===`edit`&&G!==null){let e=`edit:${G.id}`;if(O.current===e)return;O.current=e,C(null),T({countryId:G.countryId??``,serviceId:G.serviceId??``}),D(G.formValues===void 0?{label:G.label,enabled:G.enabled}:{...G.formValues});return}if(y.state.mode===`new`){if(O.current===`new`)return;O.current=`new`,C(null),T({countryId:``,serviceId:``}),D({label:h(`system.wasteSettingsSources.newSource`,`New source`),enabled:!0})}},[G,y.state]),a(()=>{if(y.state.mode!==`new`||A===``)return;let e=V.find(e=>e.id===A);e&&D(t=>{let n=t.label;return typeof n==`string`&&n!==``&&n!==`New source`?t:{...t,label:e.title}})},[y.state.mode,A,V]);let K=r(e=>{T(t=>{let n=typeof e.countryId==`string`?e.countryId:``;return n===(typeof t.countryId==`string`?t.countryId:``)?e:{countryId:n,serviceId:``}})},[]),q=r(async()=>{await _.invalidateQueries({queryKey:_e})},[_]),J=u({mutationFn:async e=>j(`deleteSource`,{id:e}),onSuccess:async()=>q()}),Y=r(async e=>{await v({title:h(`system.wasteSettingsSources.deleteWasteSource`,`Delete waste source?`),message:h(`system.wasteSettingsSources.removeItsCalendarUnderSystem`,`Remove “{{label}}” ({{id}}). Its calendar under System → Calendars is dropped.`,{label:e.label,id:e.id}),confirmLabel:h(`common.delete`,`Delete`),cancelLabel:h(`common.cancel`,`Cancel`),variant:`danger`})&&(await J.mutateAsync(e.id),y.state.mode===`edit`&&y.state.id===e.id&&(y.close(),O.current=null))},[v,J,y,h]),X=r(async()=>{let e=E.label,t=typeof e==`string`&&e.trim()!==``?e.trim():``;if(t===``){C(`Label is required.`);return}if(A===``){C(`Pick a country and a service.`);return}let n=y.state.mode===`new`,r=G?.id;if(!n&&(r===void 0||r===``)){C(`That source is no longer available.`);return}let i=E.enabled,a={...E};delete a.label,delete a.enabled,S(!0),C(null);try{n?await j(`createSource`,{label:t,serviceId:A,args:a,enabled:typeof i==`boolean`?i:!0}):r!==void 0&&await j(`updateSource`,{id:r,label:t,serviceId:A,args:a,enabled:typeof i==`boolean`?i:!0}),await q(),y.close(),O.current=null}catch(e){C(ye(e))}finally{S(!1)}},[j,G,y,E,q,A]),le=n(()=>[{key:`label`,header:h(`system.wasteSettingsSources.label`,`Label`),sortValue:e=>e.label,render:e=>i(`span`,{className:`text-sm text-foreground`,children:e.label})},{key:`module`,header:h(`system.wasteSettingsSources.module`,`Module`),sortValue:e=>e.module,render:e=>i(`span`,{className:`font-mono text-xs text-foreground-muted`,children:e.module})},{key:`enabled`,header:h(`system.wasteSettingsSources.enabled`,`Enabled`),sortValue:e=>+!!e.enabled,render:e=>i(M,{variant:e.enabled?`success`:`default`,children:e.enabled?h(`system.wasteSettingsSources.on`,`On`):h(`system.wasteSettingsSources.off`,`Off`)})},{key:`actions`,header:``,notSortableReason:`actions`,render:e=>i(P,{type:`button`,size:`sm`,variant:`ghost`,"aria-label":h(`system.wasteSettingsSources.delete`,`Delete {{label}}`,{label:e.label}),"data-testid":`waste-source-delete-${e.id}`,onClick:t=>{t.stopPropagation(),Y(e)},children:i(m,{className:`h-3.5 w-3.5 text-danger`})})}],[Y,h]),Z=y.state.mode===`new`,Q=Z||G!==null,ue=`${A}:${Z?`new`:G?.id??`closed`}`;return e(`div`,{className:`flex min-h-0 flex-col gap-4`,"data-testid":`waste-settings-sources`,children:[e(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[i(`p`,{className:`text-sm text-foreground-muted`,children:h(`system.wasteSettingsSources.pickACountryAndA`,`Pick a country and a service — configuration fields come from that HACS source.`)}),e(P,{type:`button`,size:`sm`,"data-testid":`waste-sources-add`,onClick:()=>y.openNew(),children:[i(p,{className:`h-3.5 w-3.5`}),h(`system.wasteSettingsSources.addSource`,`Add source`)]})]}),F.isError?i(`p`,{className:`text-sm text-danger`,children:h(`system.wasteSettingsSources.couldNotLoadSources`,`Could not load sources.`)}):null,F.isPending?i(ie,{className:`h-32 w-full`}):i(re,{columns:le,rows:R,rowKey:e=>e.id,pageSize:25,emptyMessage:h(`system.wasteSettingsSources.noWasteSourcesYetAdd`,`No waste sources yet. Add one to register a municipal service.`),onRowClick:e=>y.openEdit(e.id),defaultSort:{columnKey:`label`,dir:`asc`}}),i(ae,{open:Q,onClose:()=>{y.close(),C(null),O.current=null},title:Z?h(`system.wasteSettingsSources.addWasteSource`,`Add waste source`):h(`system.wasteSettingsSources.edit`,`Edit {{value1}}`,{value1:G?.label??`source`}),icon:ne,width:`xl`,testId:`waste-source-editor`,error:te,footer:i(P,{type:`button`,size:`sm`,disabled:b||A===``,onClick:()=>void X(),children:b?h(`system.wasteSettingsSources.saving`,`Saving…`):h(`common.save`,`Save`)}),children:Q?e(d,{children:[i(`div`,{"data-testid":`waste-country-service`,children:i(N,{schema:U,values:w,onChange:K},`picker:${k}:${V.length}`)}),A!==``&&H!==void 0?i(N,{schema:H,values:E,onChange:D,bare:!0},ue):A!==``&&L.isPending?i(`p`,{className:`text-sm text-foreground-muted`,children:h(`system.wasteSettingsSources.loadingFields`,`Loading fields…`)}):i(`p`,{className:`text-sm text-foreground-muted`,children:h(`system.wasteSettingsSources.chooseACountryAndService`,`Choose a country and service to see the required fields.`)})]}):null}),i(ce,{nodeId:`hub`,addonIds:[c],level:`global`,capability:f,hideSectionChrome:!0})]})}c();var $=1e4,Ee={"device-export":`exporters`,exporters:`exporters`,email:`email`,broker:`brokers`,brokers:`brokers`,"message-brokers":`brokers`,calendar:`calendars`,calendars:`calendars`,"calendar-source":`calendars`},De=[{sectionId:`exporters`,kind:`device-export`,labelKey:`system.connectivity.exporters`,icon:b,installLabelKey:`system.connectivity.exportersInstall`,emptyTitleKey:`system.connectivity.exportersEmptyTitle`,emptyDescriptionKey:`system.connectivity.exportersEmptyDescription`},{sectionId:`email`,kind:`email`,labelKey:`system.connectivity.email`,icon:v,installLabelKey:`system.connectivity.emailInstall`,emptyTitleKey:`system.connectivity.emailEmptyTitle`,emptyDescriptionKey:`system.connectivity.emailEmptyDescription`},{sectionId:`brokers`,kind:`broker`,labelKey:`system.connectivity.brokers`,icon:f,installLabelKey:`system.connectivity.brokersInstall`,emptyTitleKey:`system.connectivity.brokersEmptyTitle`,emptyDescriptionKey:`system.connectivity.brokersEmptyDescription`},{sectionId:`calendars`,kind:`calendar`,labelKey:`system.connectivity.calendars`,icon:w,installLabelKey:`system.connectivity.calendarsInstall`,emptyTitleKey:`system.connectivity.calendarsEmptyTitle`,emptyDescriptionKey:`system.connectivity.calendarsEmptyDescription`}];function Oe(t,n,r,a){let o=me(S,t.kind),s=n.flatMap(n=>{let a=he(n,o);if(a===null)return[];let s=ge(n.processState);return[{id:n.addonId,name:n.displayName,fallbackIcon:t.icon,state:s.state,stateLabel:s.label,render:()=>i(Y,{addonId:n.addonId,displayName:n.displayName,capName:a,isActive:n.processState===`running`,badges:e(d,{children:[i(Me,{processState:n.processState}),i(Ne,{kind:t.kind,addonId:n.addonId})]}),lead:t.kind===`device-export`?i(O,{addonId:n.addonId}):void 0,panels:je(t.kind,n.addonId,e=>r(`/devices/${e}`)),settingsContent:n.addonId===`waste-collections`?i(Te,{addonId:n.addonId,capName:a}):void 0})}]});return{id:t.sectionId,label:a(t.labelKey),entries:s,install:{capability:o[0]??t.kind,label:a(t.installLabelKey)}}}function ke({descriptor:e,rows:t,isLoading:r}){let{t:a}=z(),o=V(),s=n(()=>Oe(e,t,o,a),[e,t,o,a]);return i(le,{embedded:!0,icon:e.icon,title:a(e.labelKey),subtitle:null,groups:[s],isLoading:r,emptyTitle:a(e.emptyTitleKey),emptyDescription:a(e.emptyDescriptionKey)})}function Ae(){let{t:e}=z(),t=L(void 0,{refetchInterval:$}),[r,o]=W(),s=B(`/system/integrations`,{t:e,isAdmin:!0})??{icon:h,title:e(`admin.system.integrations.connectivity`,`Connectivity`)};a(()=>{let e=r.get(`tab`);if(e===null)return;let t=Ee[e];t===void 0||t===e||o(e=>{let n=new URLSearchParams(e);return n.set(`tab`,t),n},{replace:!0})},[r,o]);let c=n(()=>(t.data??[]).map(pe).filter(e=>e!==null),[t.data]),l=n(()=>De.map(n=>({id:n.sectionId,label:e(n.labelKey),ownedParams:U,content:i(ke,{descriptor:n,rows:c,isLoading:t.isLoading})})),[t.isLoading,c,e]);return i(G,{icon:s.icon,title:s.title,subtitle:e(`admin.system.integrations.externalSystemsThisHubTalks`,`External systems this hub talks to — exporters, email, brokers and calendar sources.`),defaultSection:`exporters`,sectionsLabel:`Connectivity sections`,sections:l})}function je(e,t,n){return e===`device-export`?[{id:`devices`,title:R.t(`admin.system.integrations.devices`,`Devices`),icon:D,placement:`end`,content:i(I,{addonId:t,onOpenDevice:n,showSetup:!1})}]:e===`broker`?[{id:`connections`,title:R.t(`admin.system.integrations.connections`,`Connections`),icon:f,content:i(de,{addonId:t})}]:[]}function Me({processState:e}){let{state:t,label:n}=ge(e);return i(M,{variant:t===`ok`?`success`:t===`error`?`danger`:`default`,className:`${X} capitalize`,children:n})}function Ne({kind:e,addonId:t}){return e===`broker`?i(Pe,{addonId:t}):e===`device-export`?i(Fe,{addonId:t}):null}function Pe({addonId:e}){let{t}=z(),{data:n}=A({addonId:e},{refetchInterval:$,retry:!1}),r=te.safeParse(n);if(!r.success)return null;let{brokerCount:a,connectedCount:o}=r.data;return i(M,{variant:`info`,className:X,children:o>0?t(`system.connectivity.connectionsConnected`,{count:a,connected:o}):t(`system.connectivity.connections`,{count:a})})}function Fe({addonId:e}){let{t}=z(),{data:n}=se({addonId:e},{refetchInterval:$,retry:!1}),r=C.safeParse(n);if(!r.success)return null;let{linkState:a,exposedDeviceCount:o}=r.data;return i(M,{variant:a===`linked`?`success`:a===`error`?`danger`:`default`,className:X,children:t(`admin.system.integrations.exposed`,`{{linkState}} · {{exposedDeviceCount}} exposed`,{linkState:a,exposedDeviceCount:o})})}export{Ae as IntegrationsPage};
1
+ import{C as e,J as t,K as n,R as r,S as i,V as a,Y as o,a as s,et as c,o as l,t as u,x as d}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{Dn as f,Fn as p,Ht as m,Pn as h,Vn as g,bt as _,cr as v,dt as ee,fr as y,hn as b,st as x}from"./player-overlays-Cl9fdVyE.js";import{tn as S,va as te,yi as C}from"./client-BmfSvq-t.js";import{g as w,s as T}from"./video-BbvU47vV.js";import{t as E}from"./log-in-BFtLVkKt.js";import{t as D}from"./monitor-smartphone-dJjQFha0.js";import{t as ne}from"./recycle-B_n3HNql.js";import{At as O,Dn as re,Ma as k,Nr as ie,Oa as A,Pa as j,ci as M,dr as N,ei as P,gt as ae,ka as F,kt as I,mt as oe,no as se,zi as L}from"./src-Cjqv1L1_.js";import{t as R}from"./i18n-CWf2gqjI.js";import{t as z}from"./useTranslation-BJr-n0es.js";import{T as B,_r as V,g as H,i as U,yr as W}from"./index-s2JBApLj.js";import{t as G}from"./AdminSectionedPage-O0ffiJOS.js";import{n as K,r as q,t as J}from"./BrokerEditorDialog-CcvbGDox.js";import{t as ce}from"./NodeAddonsSettingsPanel-Ccww7SgZ.js";import{n as Y,r as X,t as le}from"./IntegrationHub-vZ23z1RD.js";c();var Z={connected:`success`,connecting:`warning`,disconnected:`default`,"auth-failed":`danger`,unreachable:`danger`,error:`danger`};function Q({status:e}){return i(M,{variant:Z[e],className:`text-[10px]`,children:e})}function ue({broker:t,interactiveConnectPath:n,interactiveDisconnectPath:r,kindLabel:a,onEdit:s}){let{t:c}=z(),u=l(),d=x(),[f,p]=o(null),h=j({onSuccess:e=>p(e.ok?{ok:!0}:{ok:!1,error:e.error}),onError:e=>p({ok:!1,error:e instanceof Error?e.message:String(e)})}),v=k({onSuccess:()=>{u.invalidateQueries({queryKey:[[`broker`,`list`]]})}}),ee=async()=>{await d({title:c(`brokers.brokerManager.deleteBroker`,`Delete broker`),message:c(`brokers.brokerManager.deleteBrokerIntegrationsThatDepend`,`Delete broker "{{name}}"? Integrations that depend on it will stop working.`,{name:t.name}),confirmLabel:c(`common.delete`,`Delete`),variant:`danger`})&&v.mutate({id:t.id,addonId:t.addonId})},b=n!==void 0&&n.length>0&&t.status!==`connected`,S=r!==void 0&&r.length>0&&t.status===`connected`;return e(`tr`,{className:`border-b border-border last:border-0`,children:[i(`td`,{className:`px-3 py-2 text-xs text-foreground font-medium`,children:t.name}),i(`td`,{className:`px-3 py-2 text-xs text-foreground-subtle`,children:a}),e(`td`,{className:`px-3 py-2`,children:[i(Q,{status:t.status}),f&&i(`span`,{className:`ml-2 text-[10px] ${f.ok?`text-success`:`text-danger`}`,children:f.ok?`OK`:f.error??c(`common.failedWord`)})]}),i(`td`,{className:`px-3 py-2`,children:e(`div`,{className:`flex items-center justify-end gap-1.5`,children:[b&&e(P,{variant:`primary`,size:`sm`,onClick:()=>{H(n,t.id,()=>{u.invalidateQueries({queryKey:[[`broker`,`list`]]})})},title:c(`brokers.brokerManager.signInOpensAPopup`,`Sign in — opens a popup that closes when done`),children:[i(E,{className:`h-3 w-3`}),` `,c(`brokers.brokerManager.signIn`)]}),S&&e(P,{variant:`outline`,size:`sm`,onClick:()=>{H(r,t.id,()=>{u.invalidateQueries({queryKey:[[`broker`,`list`]]})})},title:c(`brokers.brokerManager.signOutClearsTheLinked`,`Sign out — clears the linked Google account on this broker`),children:[i(T,{className:`h-3 w-3`}),` `,c(`brokers.brokerManager.signOut`)]}),e(P,{variant:`outline`,size:`sm`,onClick:()=>h.mutate({id:t.id,addonId:t.addonId}),disabled:h.isPending,title:c(`brokers.brokerManager.testConnection`,`Test connection`),children:[h.isPending?i(y,{className:`h-3 w-3 animate-spin`}):i(_,{className:`h-3 w-3`}),c(`brokers.brokerManager.test`,`Test`)]}),e(P,{variant:`outline`,size:`sm`,onClick:()=>s(t),title:c(`common.edit`,`Edit`),children:[i(g,{className:`h-3 w-3`}),` `,c(`common.edit`)]}),e(P,{variant:`outline`,size:`sm`,className:`border-danger/40 text-danger hover:bg-danger/10`,onClick:()=>{ee()},disabled:v.isPending,title:c(`common.delete`,`Delete`),children:[v.isPending?i(y,{className:`h-3 w-3 animate-spin`}):i(m,{className:`h-3 w-3`}),c(`common.delete`,`Delete`)]})]})})]})}function de({addonId:t}={}){let{t:r}=z(),a=F({}),s=n(()=>K(a.data).filter(e=>t===void 0||e.addonId===t),[a.data,t]),[c,l]=o(!1),[u,d]=o(null),{options:f}=q(t===void 0?{}:{addonId:t}),m=n(()=>new Map(f.map(e=>[e.kind,e.label])),[f]),h=n(()=>{let e=new Map;for(let t of f)e.has(t.kind)||e.set(t.kind,{...t.interactiveConnectPath===void 0?{}:{connect:t.interactiveConnectPath},...t.interactiveDisconnectPath===void 0?{}:{disconnect:t.interactiveDisconnectPath}});return e},[f]);return e(`div`,{className:`space-y-3`,children:[i(`div`,{className:`flex items-center justify-end`,children:e(P,{variant:`primary`,size:`sm`,onClick:()=>l(!0),disabled:f.length===0,title:f.length===0?r(`brokers.brokerManager.noBrokerProvidersAvailable`,`No broker providers available`):void 0,children:[i(p,{className:`h-3.5 w-3.5`}),` `,r(`brokers.brokerManager.addBroker`)]})}),i(`div`,{className:`rounded-lg border border-border bg-surface overflow-x-auto`,children:e(`table`,{className:`w-full min-w-[36rem] border-collapse`,children:[i(`thead`,{children:e(`tr`,{className:`border-b border-border bg-background/50`,children:[i(`th`,{className:`px-3 py-2 text-left text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.name`,`Name`)}),i(`th`,{className:`px-3 py-2 text-left text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.kind`,`Kind`)}),i(`th`,{className:`px-3 py-2 text-left text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.status`,`Status`)}),i(`th`,{className:`px-3 py-2 text-right text-[10px] font-semibold uppercase tracking-wider text-foreground-subtle`,children:r(`brokers.brokerManager.actions`,`Actions`)})]})}),e(`tbody`,{children:[a.isLoading&&i(`tr`,{children:e(`td`,{colSpan:4,className:`px-3 py-6 text-center text-xs text-foreground-subtle`,children:[i(y,{className:`inline h-4 w-4 animate-spin`}),` `,r(`brokers.brokerManager.loadingBrokers`)]})}),a.isError&&i(`tr`,{children:e(`td`,{colSpan:4,className:`px-3 py-4 text-center text-xs text-danger`,children:[r(`brokers.brokerManager.failedToLoadBrokers`,`Failed to load brokers:`),` `,a.error instanceof Error?a.error.message:r(`brokers.brokerManager.unknownError`,`Unknown error`)]})}),!a.isLoading&&!a.isError&&s.length===0&&i(`tr`,{children:i(`td`,{colSpan:4,className:`px-3 py-6 text-center text-xs text-foreground-subtle`,children:r(`brokers.brokerManager.noBrokersRegisteredYetAdd`,`No brokers registered yet. Add one to publish device events for downstream automations.`)})}),s.map(e=>{let t=h.get(e.kind);return i(ue,{broker:e,...t?.connect===void 0?{}:{interactiveConnectPath:t.connect},...t?.disconnect===void 0?{}:{interactiveDisconnectPath:t.disconnect},kindLabel:m.get(e.kind)??e.kind,onEdit:d},e.id)})]})]})}),c&&i(J,{...t===void 0?{}:{addonId:t},onClose:()=>l(!1),onSaved:()=>l(!1)}),u&&i(J,{broker:u,onClose:()=>d(null),onSaved:()=>d(null)})]})}function fe(e){if(typeof e==`string`)return e;if(typeof e==`object`&&e){let t=e.name;if(typeof t==`string`)return t}return null}function pe(e){let t=e,n=t?.manifest;if(n?.id===void 0)return null;let r=(n.capabilities??[]).map(fe).filter(e=>e!==null);return{addonId:n.id,displayName:n.packageDisplayName??n.name??n.id,capNames:r,processState:t?.process?.state??null}}function me(e,t){return Object.entries(e).filter(([,e])=>e===t).map(([e])=>e)}function he(e,t){return t.find(t=>e.capNames.includes(t))??null}function ge(e){switch(e){case`running`:return{state:`ok`,label:R.t(`helpers.connectivityModel.running`)};case`crashed`:case`failed`:return{state:`error`,label:e};case`stopped`:case`disabled`:return{state:`off`,label:R.t(`helpers.connectivityModel.stopped`)};default:return{state:`unknown`,label:e??R.t(`common.unknownWord`)}}}c();var _e=[`wasteCollections`,`listSources`],ve=[`wasteCollections`,`listCountries`];function ye(e){return e instanceof Error?e.message:String(e)}function be(e){return typeof e!=`object`||!e?!1:Array.isArray(Reflect.get(e,`sections`))}function xe(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){if(typeof n!=`object`||!n)continue;let e=Reflect.get(n,`id`),r=Reflect.get(n,`label`),i=Reflect.get(n,`module`);if(typeof e!=`string`||typeof r!=`string`||typeof i!=`string`)continue;let a=Reflect.get(n,`enabled`),o=Reflect.get(n,`formValues`),s=Reflect.get(n,`serviceId`),c=Reflect.get(n,`countryId`);t.push({id:e,label:r,module:i,enabled:typeof a==`boolean`?a:!0,formValues:typeof o==`object`&&o&&!Array.isArray(o)?o:void 0,serviceId:typeof s==`string`?s:void 0,countryId:typeof c==`string`?c:void 0})}return t}function Se(e){return Array.isArray(e)?e.flatMap(e=>{if(typeof e!=`object`||!e)return[];let t=Reflect.get(e,`id`),n=Reflect.get(e,`label`);return typeof t!=`string`||typeof n!=`string`?[]:[{id:t,label:n}]}):[]}function Ce(e){return Array.isArray(e)?e.flatMap(e=>{if(typeof e!=`object`||!e)return[];let t=Reflect.get(e,`id`),n=Reflect.get(e,`label`),r=Reflect.get(e,`module`);if(typeof t!=`string`||typeof n!=`string`||typeof r!=`string`)return[];let i=Reflect.get(e,`title`);return[{id:t,label:n,title:typeof i==`string`&&i.length>0?i:n,module:r}]}):[]}function we(e,t,n){return{sections:[{id:`picker`,title:R.t(`system.wasteSettingsSources.countryService`,`Country & service`),columns:2,fields:[{type:`select`,key:`countryId`,label:R.t(`system.wasteSettingsSources.country`,`Country`),options:[{value:``,label:R.t(`system.wasteSettingsSources.selectCountry`,`Select country…`)},...e.map(e=>({value:e.id,label:e.label}))]},{type:`select`,key:`serviceId`,label:R.t(`system.wasteSettingsSources.service`,`Service`),options:[{value:``,label:n===``?R.t(`system.wasteSettingsSources.pickACountryFirst`,`Pick a country first`):R.t(`system.wasteSettingsSources.selectService`,`Select service…`)},...t.map(e=>({value:e.id,label:e.label}))]}]}]}}function Te({addonId:c,capName:f}){let{t:h}=z(),g=ee(),_=l(),v=x(),y=oe({editKey:`wasteEdit`,newKey:`wasteNew`}),[b,S]=o(!1),[te,C]=o(null),[w,T]=o({countryId:``,serviceId:``}),[E,D]=o({label:h(`system.wasteSettingsSources.newSource`,`New source`),enabled:!0}),O=t(null),k=typeof w.countryId==`string`?w.countryId:``,A=typeof w.serviceId==`string`?w.serviceId:``,j=r((e,t)=>g.trpcClient.addons.custom.mutate({addonId:c,action:e,input:t}),[c,g]),F=s({queryKey:[..._e,c],queryFn:async()=>xe(await j(`listSources`,{}))}),I=s({queryKey:[...ve,c],queryFn:async()=>Se(await j(`listCountries`,{}))}),se=s({queryKey:[`wasteCollections`,`listServices`,c,k],enabled:k!==``,queryFn:async()=>Ce(await j(`listServices`,{countryId:k}))}),L=s({queryKey:[`wasteCollections`,`serviceFormSchema`,c,A],enabled:A!==``,queryFn:async()=>j(`serviceFormSchema`,{serviceId:A})}),R=F.data??[],B=I.data??[],V=se.data??[],H=be(L.data)?L.data:void 0,U=n(()=>we(B,k===``?[]:V,k),[B,V,k]),W=y.state,G=W.mode===`edit`?R.find(e=>e.id===W.id)??null:null;a(()=>{if(y.state.mode===`edit`&&G!==null){let e=`edit:${G.id}`;if(O.current===e)return;O.current=e,C(null),T({countryId:G.countryId??``,serviceId:G.serviceId??``}),D(G.formValues===void 0?{label:G.label,enabled:G.enabled}:{...G.formValues});return}if(y.state.mode===`new`){if(O.current===`new`)return;O.current=`new`,C(null),T({countryId:``,serviceId:``}),D({label:h(`system.wasteSettingsSources.newSource`,`New source`),enabled:!0})}},[G,y.state]),a(()=>{if(y.state.mode!==`new`||A===``)return;let e=V.find(e=>e.id===A);e&&D(t=>{let n=t.label;return typeof n==`string`&&n!==``&&n!==`New source`?t:{...t,label:e.title}})},[y.state.mode,A,V]);let K=r(e=>{T(t=>{let n=typeof e.countryId==`string`?e.countryId:``;return n===(typeof t.countryId==`string`?t.countryId:``)?e:{countryId:n,serviceId:``}})},[]),q=r(async()=>{await _.invalidateQueries({queryKey:_e})},[_]),J=u({mutationFn:async e=>j(`deleteSource`,{id:e}),onSuccess:async()=>q()}),Y=r(async e=>{await v({title:h(`system.wasteSettingsSources.deleteWasteSource`,`Delete waste source?`),message:h(`system.wasteSettingsSources.removeItsCalendarUnderSystem`,`Remove “{{label}}” ({{id}}). Its calendar under System → Calendars is dropped.`,{label:e.label,id:e.id}),confirmLabel:h(`common.delete`,`Delete`),cancelLabel:h(`common.cancel`,`Cancel`),variant:`danger`})&&(await J.mutateAsync(e.id),y.state.mode===`edit`&&y.state.id===e.id&&(y.close(),O.current=null))},[v,J,y,h]),X=r(async()=>{let e=E.label,t=typeof e==`string`&&e.trim()!==``?e.trim():``;if(t===``){C(`Label is required.`);return}if(A===``){C(`Pick a country and a service.`);return}let n=y.state.mode===`new`,r=G?.id;if(!n&&(r===void 0||r===``)){C(`That source is no longer available.`);return}let i=E.enabled,a={...E};delete a.label,delete a.enabled,S(!0),C(null);try{n?await j(`createSource`,{label:t,serviceId:A,args:a,enabled:typeof i==`boolean`?i:!0}):r!==void 0&&await j(`updateSource`,{id:r,label:t,serviceId:A,args:a,enabled:typeof i==`boolean`?i:!0}),await q(),y.close(),O.current=null}catch(e){C(ye(e))}finally{S(!1)}},[j,G,y,E,q,A]),le=n(()=>[{key:`label`,header:h(`system.wasteSettingsSources.label`,`Label`),sortValue:e=>e.label,render:e=>i(`span`,{className:`text-sm text-foreground`,children:e.label})},{key:`module`,header:h(`system.wasteSettingsSources.module`,`Module`),sortValue:e=>e.module,render:e=>i(`span`,{className:`font-mono text-xs text-foreground-muted`,children:e.module})},{key:`enabled`,header:h(`system.wasteSettingsSources.enabled`,`Enabled`),sortValue:e=>+!!e.enabled,render:e=>i(M,{variant:e.enabled?`success`:`default`,children:e.enabled?h(`system.wasteSettingsSources.on`,`On`):h(`system.wasteSettingsSources.off`,`Off`)})},{key:`actions`,header:``,notSortableReason:`actions`,render:e=>i(P,{type:`button`,size:`sm`,variant:`ghost`,"aria-label":h(`system.wasteSettingsSources.delete`,`Delete {{label}}`,{label:e.label}),"data-testid":`waste-source-delete-${e.id}`,onClick:t=>{t.stopPropagation(),Y(e)},children:i(m,{className:`h-3.5 w-3.5 text-danger`})})}],[Y,h]),Z=y.state.mode===`new`,Q=Z||G!==null,ue=`${A}:${Z?`new`:G?.id??`closed`}`;return e(`div`,{className:`flex min-h-0 flex-col gap-4`,"data-testid":`waste-settings-sources`,children:[e(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[i(`p`,{className:`text-sm text-foreground-muted`,children:h(`system.wasteSettingsSources.pickACountryAndA`,`Pick a country and a service — configuration fields come from that HACS source.`)}),e(P,{type:`button`,size:`sm`,"data-testid":`waste-sources-add`,onClick:()=>y.openNew(),children:[i(p,{className:`h-3.5 w-3.5`}),h(`system.wasteSettingsSources.addSource`,`Add source`)]})]}),F.isError?i(`p`,{className:`text-sm text-danger`,children:h(`system.wasteSettingsSources.couldNotLoadSources`,`Could not load sources.`)}):null,F.isPending?i(ie,{className:`h-32 w-full`}):i(re,{columns:le,rows:R,rowKey:e=>e.id,pageSize:25,emptyMessage:h(`system.wasteSettingsSources.noWasteSourcesYetAdd`,`No waste sources yet. Add one to register a municipal service.`),onRowClick:e=>y.openEdit(e.id),defaultSort:{columnKey:`label`,dir:`asc`}}),i(ae,{open:Q,onClose:()=>{y.close(),C(null),O.current=null},title:Z?h(`system.wasteSettingsSources.addWasteSource`,`Add waste source`):h(`system.wasteSettingsSources.edit`,`Edit {{value1}}`,{value1:G?.label??`source`}),icon:ne,width:`xl`,testId:`waste-source-editor`,error:te,footer:i(P,{type:`button`,size:`sm`,disabled:b||A===``,onClick:()=>void X(),children:b?h(`system.wasteSettingsSources.saving`,`Saving…`):h(`common.save`,`Save`)}),children:Q?e(d,{children:[i(`div`,{"data-testid":`waste-country-service`,children:i(N,{schema:U,values:w,onChange:K},`picker:${k}:${V.length}`)}),A!==``&&H!==void 0?i(N,{schema:H,values:E,onChange:D,bare:!0},ue):A!==``&&L.isPending?i(`p`,{className:`text-sm text-foreground-muted`,children:h(`system.wasteSettingsSources.loadingFields`,`Loading fields…`)}):i(`p`,{className:`text-sm text-foreground-muted`,children:h(`system.wasteSettingsSources.chooseACountryAndService`,`Choose a country and service to see the required fields.`)})]}):null}),i(ce,{nodeId:`hub`,addonIds:[c],level:`global`,capability:f,hideSectionChrome:!0})]})}c();var $=1e4,Ee={"device-export":`exporters`,exporters:`exporters`,email:`email`,broker:`brokers`,brokers:`brokers`,"message-brokers":`brokers`,calendar:`calendars`,calendars:`calendars`,"calendar-source":`calendars`},De=[{sectionId:`exporters`,kind:`device-export`,labelKey:`system.connectivity.exporters`,icon:b,installLabelKey:`system.connectivity.exportersInstall`,emptyTitleKey:`system.connectivity.exportersEmptyTitle`,emptyDescriptionKey:`system.connectivity.exportersEmptyDescription`},{sectionId:`email`,kind:`email`,labelKey:`system.connectivity.email`,icon:v,installLabelKey:`system.connectivity.emailInstall`,emptyTitleKey:`system.connectivity.emailEmptyTitle`,emptyDescriptionKey:`system.connectivity.emailEmptyDescription`},{sectionId:`brokers`,kind:`broker`,labelKey:`system.connectivity.brokers`,icon:f,installLabelKey:`system.connectivity.brokersInstall`,emptyTitleKey:`system.connectivity.brokersEmptyTitle`,emptyDescriptionKey:`system.connectivity.brokersEmptyDescription`},{sectionId:`calendars`,kind:`calendar`,labelKey:`system.connectivity.calendars`,icon:w,installLabelKey:`system.connectivity.calendarsInstall`,emptyTitleKey:`system.connectivity.calendarsEmptyTitle`,emptyDescriptionKey:`system.connectivity.calendarsEmptyDescription`}];function Oe(t,n,r,a){let o=me(S,t.kind),s=n.flatMap(n=>{let a=he(n,o);if(a===null)return[];let s=ge(n.processState);return[{id:n.addonId,name:n.displayName,fallbackIcon:t.icon,state:s.state,stateLabel:s.label,render:()=>i(Y,{addonId:n.addonId,displayName:n.displayName,capName:a,isActive:n.processState===`running`,badges:e(d,{children:[i(Me,{processState:n.processState}),i(Ne,{kind:t.kind,addonId:n.addonId})]}),lead:t.kind===`device-export`?i(O,{addonId:n.addonId}):void 0,panels:je(t.kind,n.addonId,e=>r(`/devices/${e}`)),settingsContent:n.addonId===`waste-collections`?i(Te,{addonId:n.addonId,capName:a}):void 0})}]});return{id:t.sectionId,label:a(t.labelKey),entries:s,install:{capability:o[0]??t.kind,label:a(t.installLabelKey)}}}function ke({descriptor:e,rows:t,isLoading:r}){let{t:a}=z(),o=V(),s=n(()=>Oe(e,t,o,a),[e,t,o,a]);return i(le,{embedded:!0,icon:e.icon,title:a(e.labelKey),subtitle:null,groups:[s],isLoading:r,emptyTitle:a(e.emptyTitleKey),emptyDescription:a(e.emptyDescriptionKey)})}function Ae(){let{t:e}=z(),t=L(void 0,{refetchInterval:$}),[r,o]=W(),s=B(`/system/integrations`,{t:e,isAdmin:!0})??{icon:h,title:e(`admin.system.integrations.connectivity`,`Connectivity`)};a(()=>{let e=r.get(`tab`);if(e===null)return;let t=Ee[e];t===void 0||t===e||o(e=>{let n=new URLSearchParams(e);return n.set(`tab`,t),n},{replace:!0})},[r,o]);let c=n(()=>(t.data??[]).map(pe).filter(e=>e!==null),[t.data]),l=n(()=>De.map(n=>({id:n.sectionId,label:e(n.labelKey),ownedParams:U,content:i(ke,{descriptor:n,rows:c,isLoading:t.isLoading})})),[t.isLoading,c,e]);return i(G,{icon:s.icon,title:s.title,subtitle:e(`admin.system.integrations.externalSystemsThisHubTalks`,`External systems this hub talks to — exporters, email, brokers and calendar sources.`),defaultSection:`exporters`,sectionsLabel:`Connectivity sections`,sections:l})}function je(e,t,n){return e===`device-export`?[{id:`devices`,title:R.t(`admin.system.integrations.devices`,`Devices`),icon:D,placement:`end`,content:i(I,{addonId:t,onOpenDevice:n,showSetup:!1})}]:e===`broker`?[{id:`connections`,title:R.t(`admin.system.integrations.connections`,`Connections`),icon:f,content:i(de,{addonId:t})}]:[]}function Me({processState:e}){let{state:t,label:n}=ge(e);return i(M,{variant:t===`ok`?`success`:t===`error`?`danger`:`default`,className:`${X} capitalize`,children:n})}function Ne({kind:e,addonId:t}){return e===`broker`?i(Pe,{addonId:t}):e===`device-export`?i(Fe,{addonId:t}):null}function Pe({addonId:e}){let{t}=z(),{data:n}=A({addonId:e},{refetchInterval:$,retry:!1}),r=te.safeParse(n);if(!r.success)return null;let{brokerCount:a,connectedCount:o}=r.data;return i(M,{variant:`info`,className:X,children:o>0?t(`system.connectivity.connectionsConnected`,{count:a,connected:o}):t(`system.connectivity.connections`,{count:a})})}function Fe({addonId:e}){let{t}=z(),{data:n}=se({addonId:e},{refetchInterval:$,retry:!1}),r=C.safeParse(n);if(!r.success)return null;let{linkState:a,exposedDeviceCount:o}=r.data;return i(M,{variant:a===`linked`?`success`:a===`error`?`danger`:`default`,className:X,children:t(`admin.system.integrations.exposed`,`{{linkState}} · {{exposedDeviceCount}} exposed`,{linkState:a,exposedDeviceCount:o})})}export{Ae as IntegrationsPage};
@@ -0,0 +1 @@
1
+ import{C as e,J as t,K as n,R as r,S as i,V as a,Y as o,et as s,o as c,x as l}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEyXHAdg.js";import{Ei as u,En as d,Fn as f,Oi as p,Pi as m,Pn as h,V as g,dt as _,fr as ee,gn as v,gt as y,ki as b,kn as x,vn as S,vr as C}from"./player-overlays-Cl9fdVyE.js";import{t as te}from"./table-2-Bi2N6ehZ.js";import{Ar as w,Ei as ne,Es as re,L as ie,Mo as T,Mt as ae,Pt as E,ei as oe,jd as D,js as se,jt as O,ks as ce,lo as k,r as le,st as A,xo as ue,zd as de,zi as j}from"./src-Cjqv1L1_.js";import{t as M}from"./i18n-CWf2gqjI.js";import{t as N}from"./useTranslation-BJr-n0es.js";import{C as P,_r as fe,dr as F,gr as pe,yr as I}from"./index-s2JBApLj.js";import{t as L}from"./AdminPage-BmoKOToB.js";import"./useEventInvalidation-C2rxDYB3.js";import{t as me}from"./device-integration-icon-DUQvGDM8.js";import{i as he,n as ge,r as _e,t as ve}from"./ScanNetworkModal-De1BMqEu.js";import{t as R}from"./framework-packages-B7oma9J4.js";s();function ye(e){return e.some(e=>e.status===`running`)?`running`:e.some(e=>e.status===`stopped`)?`stopped`:`disabled`}function be(e,t){let n=new Map;for(let t of e){let e=n.get(t.addonId);e===void 0?n.set(t.addonId,[t]):e.push(t)}return[...n.entries()].map(([e,n])=>{let r=t.get(e)?.trim()??``;return{addonId:e,name:r.length>0?r:n[0]?.name??e,instances:n,instanceCount:n.length,deviceCount:n.reduce((e,t)=>e+t.deviceCount,0),status:ye(n)}})}function xe(e){return e.integrationSection===void 0?R(e.packageName)?`system`:`providers`:e.integrationSection}function z(e){let t=new Set;for(let n of e??[])xe(n.manifest)===`system`&&t.add(n.manifest.id);return t}function B(e,t){return{providers:e.filter(e=>!t.has(e.addonId)),system:e.filter(e=>t.has(e.addonId))}}function V(e,t){return[...e].sort((e,n)=>e.name.localeCompare(n.name,t,{sensitivity:`base`}))}function H({kind:t,children:n}){let{t:r}=N(),a=`integrations-section-${t}`;return e(`section`,{"aria-labelledby":a,"data-testid":a,className:`min-w-0 space-y-2`,children:[i(`h2`,{id:a,className:g,children:t===`providers`?r(`integrations.sections.providers`,`Providers`):r(`integrations.sections.system`,`System`)}),n]})}function U({children:e}){return i(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3`,children:e})}function W({addonId:t,name:n,openLabel:r,onOpen:a,body:o,footer:s,disabled:c=!1,testId:l,buttonTestId:u}){return e(`article`,{"data-testid":l,className:`relative flex min-w-0 items-stretch gap-3 overflow-x-clip rounded-lg border border-border bg-surface p-3`,children:[i(oe,{type:`button`,variant:`ghost`,"aria-label":r,disabled:c,"data-testid":u,onClick:a,className:`absolute inset-0 z-0 h-auto w-auto rounded-lg p-0 focus-visible:ring-2 focus-visible:ring-primary`}),i(`div`,{className:`pointer-events-none relative z-10 flex w-20 shrink-0 items-center justify-center`,children:i(F,{type:t,size:`xl`})}),e(`div`,{className:`pointer-events-none relative z-10 grid min-w-0 flex-1 grid-rows-[1fr_auto_1fr] gap-1`,children:[i(`p`,{className:`min-w-0 self-start truncate text-sm font-semibold text-foreground`,children:n}),o,i(`div`,{className:`self-end justify-self-start`,children:s})]})]})}function Se({providers:t,system:r,onOpen:a,searchPlaceholder:s,emptyLabel:c}){let[l,u]=o(``),d=n(()=>{let e=l.trim().toLowerCase(),n=t=>e.length===0||`${t.name} ${t.addonId} ${t.instances.map(e=>e.name).join(` `)}`.toLowerCase().includes(e);return{providers:t.filter(n),system:r.filter(n)}},[l,t,r]),f=d.providers.length===0&&d.system.length===0;return e(`div`,{className:`space-y-3`,children:[e(`div`,{className:`relative`,children:[i(S,{className:`pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-foreground-subtle`,"aria-hidden":!0}),i(D,{type:`search`,value:l,onChange:e=>u(e.target.value),placeholder:s,"aria-label":s,className:`pl-8`})]}),f?i(`p`,{className:`py-8 text-center text-xs text-foreground-subtle`,children:c}):e(`div`,{className:`space-y-4`,children:[d.providers.length>0&&i(H,{kind:`providers`,children:i(G,{groups:d.providers,onOpen:a})}),d.system.length>0&&i(H,{kind:`system`,children:i(G,{groups:d.system,onOpen:a})})]})]})}function G({groups:e,onOpen:t}){let{t:r,i18n:a}=N();return i(U,{children:n(()=>V(e,a.language),[e,a.language]).map(e=>i(W,{testId:`integration-card-${e.addonId}`,addonId:e.addonId,name:e.name,openLabel:r(`integrations.openNamed`,{name:e.name,defaultValue:`Open {{name}}`}),onOpen:()=>t(e),body:i(`p`,{className:`text-xs text-foreground-muted`,children:r(`integrations.addonCard.summary`,{integrations:r(`integrations.addonCard.integrationCount`,{count:e.instanceCount}),devices:r(`integrations.integrationColumns.deviceCount`,{count:e.deviceCount}),defaultValue:`{{integrations}} · {{devices}}`})}),footer:i(A,{status:e.status,className:`shrink-0`})},e.addonId))})}s();var K=`camstack.admin.integrations.view`;function Ce(e){return e===`table`||e===`grid`}function q(){try{return typeof window>`u`?null:window.localStorage}catch{return null}}function we(e=q()){if(e===null)return`table`;try{let t=e.getItem(K);return Ce(t)?t:`table`}catch{return`table`}}function Te(e,t=q()){if(t!==null)try{t.setItem(K,e)}catch{}}function Ee(){let[e,t]=o(()=>we());return[e,r(e=>{t(e),Te(e)},[])]}s();function De(e=!0){a(()=>{if(!e)return;let t=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=t}},[e])}s();function Oe(e,t){let[n,r]=o(!1);return a(()=>{if(!e){r(!1);return}r(!1);let n=setTimeout(()=>r(!0),t);return()=>clearTimeout(n)},[e,t]),n}s();function ke({providerId:t,onImport:n,onSkip:r}){let{t:s}=N(),[c,l]=o(new Set),u=ue(),d=u.data,f=u.isPending||!u.data&&!u.isError;a(()=>{t&&(u.isPending||u.data||u.mutate({addonId:t}))},[t,u]);function p(e){l(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}if(f)return e(`div`,{className:`flex flex-col items-center py-12`,children:[i(`div`,{className:`h-6 w-6 animate-spin rounded-full border-2 border-primary border-t-transparent`}),i(`p`,{className:`mt-3 text-xs text-foreground-subtle`,children:s(`integrations.searchingDevices`)})]});let h=d??[];return e(`div`,{className:`space-y-4`,children:[i(`p`,{className:`text-xs text-foreground-subtle`,children:h.length>0?s(`integrations.foundDevices`,{count:h.length}):s(`integrations.noDevicesFound`)}),h.length>0&&i(`div`,{className:`space-y-1.5 max-h-64 overflow-y-auto`,children:h.map(t=>{let n=t.stableId,r=t.suggestedName??n,a=c.has(n),o=t.alreadyOnboarded===!0;return e(`button`,{onClick:()=>{o||p(n)},disabled:o,title:o?s(`integrations.alreadyAddedHint`,{defaultValue:`Already added as "{{name}}" — re-adding would overwrite its settings.`,name:t.onboardedName??r}):void 0,className:`flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors ${o?`border-border bg-surface opacity-60 cursor-not-allowed`:a?`border-primary/40 bg-primary/5`:`border-border bg-surface hover:border-foreground-subtle/30`}`,children:[i(`div`,{className:`flex h-5 w-5 items-center justify-center rounded border flex-shrink-0 ${a&&!o?`border-primary bg-primary`:`border-border`}`,children:a&&!o&&i(b,{className:`h-3 w-3 text-primary-foreground`})}),i(m,{className:`h-3.5 w-3.5 text-foreground-subtle flex-shrink-0`}),i(`span`,{className:`text-xs font-medium text-foreground truncate`,children:r}),o&&i(`span`,{className:`ml-auto flex-shrink-0 rounded bg-surface-muted px-1.5 py-0.5 text-[10px] font-medium text-foreground-subtle`,children:s(`integrations.alreadyAdded`,{defaultValue:`Already added`})})]},n)})}),e(`div`,{className:`flex items-center justify-between pt-2`,children:[i(`button`,{onClick:r,className:`rounded-lg border border-border px-3 py-1.5 text-xs text-foreground-subtle hover:text-foreground transition-colors`,children:s(`integrations.skip`)}),h.length>0&&e(`button`,{onClick:()=>n(Array.from(c)),disabled:c.size===0,className:`rounded-lg bg-primary px-4 py-1.5 text-xs font-medium text-primary-foreground shadow-sm disabled:opacity-50`,children:[s(`integrations.importSelected`),` (`,c.size,`)`]})]})]})}var J=`(hover: none) and (pointer: coarse)`;function Y(){if(typeof window>`u`||typeof window.matchMedia!=`function`)return!0;try{return!window.matchMedia(J).matches}catch{return!0}}s();function Ae({onSelect:r,onClose:s,pendingAddonId:c=null}){let{t:l,i18n:u}=N(),d=fe(),[f,p]=o(``),m=t(null),{data:h,isLoading:g}=ce();a(()=>{g||!Y()||m.current?.focus()},[g]);let _=n(()=>{let e=h??[],t=f.trim().toLowerCase();return t.length===0?e:e.filter(e=>`${e.name} ${e.description??``} ${e.addonId}`.toLowerCase().includes(t))},[h,f]),{data:y}=j(void 0),b=n(()=>{let e=B(_,z(y));return{providers:V(e.providers,u.language),system:V(e.system,u.language)}},[_,y,u.language]);if(g)return i(`div`,{className:`grid grid-cols-1 gap-2 p-2 sm:grid-cols-2 lg:grid-cols-3`,children:[1,2,3,4].map(e=>i(`div`,{className:`h-24 rounded-lg bg-surface animate-pulse`},e))});let x=c!==null,C=t=>i(U,{children:t.map(t=>{let n=t.instanceMode===`unique`&&t.existingInstances.length>0,a=c===t.addonId;return i(W,{testId:`provider-card-${t.addonId}`,buttonTestId:`provider-pick-${t.addonId}`,addonId:t.addonId,name:t.name,openLabel:t.name,disabled:x,onOpen:()=>{if(n){let e=t.existingInstances[0].id;s(),d(P(t.addonId,e))}else r(t.addonId,t.instanceMode,t.discoveryMode,t.name,t.kind,t.brokerKind,t.mode,t.canTest)},body:t.description?i(`p`,{className:`line-clamp-2 text-xs text-foreground-muted`,children:t.description}):i(`span`,{}),footer:a?i(ee,{className:`h-4 w-4 animate-spin text-primary`}):n?e(`span`,{className:`flex items-center gap-1 text-xs font-medium text-foreground-subtle`,children:[i(v,{className:`h-3 w-3`}),l(`integrations.manage`)]}):null},t.addonId)})});return e(`div`,{className:`space-y-3`,"data-testid":`provider-picker`,children:[e(`div`,{className:`relative`,children:[i(S,{className:`pointer-events-none absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-foreground-subtle`,"aria-hidden":!0}),i(D,{ref:m,type:`search`,value:f,onChange:e=>p(e.target.value),placeholder:l(`integrations.searchProviders`,`Search integrations…`),className:`pl-8`,"data-testid":`provider-picker-search`,"aria-label":l(`integrations.searchProviders`,`Search integrations…`)})]}),b.providers.length>0&&i(H,{kind:`providers`,children:C(b.providers)}),b.system.length>0&&i(H,{kind:`system`,children:C(b.system)}),_.length===0&&i(`div`,{className:`py-8 text-center text-xs text-foreground-subtle`,children:(h??[]).length===0?l(`integrations.noProviders`):l(`integrations.noProvidersMatch`,`No integrations match your search.`)})]})}s();function je(e){let t=e=>{if(e.type===`separator`||e.type===`info`||e.type===`button`)return e;if(e.type===`group`)return{...e,fields:e.fields.map(e=>t(e))};let{value:n,...r}=e;return r};return{...e.tabs?{tabs:e.tabs}:{},sections:e.sections.map(e=>({...e,fields:e.fields.map(t)}))}}var Me=2e4;function Ne({open:t,onClose:r,seed:s=null}){let{t:u}=N(),d=fe(),f=c(),[p,m]=o(`picker`),[h,g]=o(null),[_,v]=o(null),[b,x]=o(`manual`),[S,C]=o(null),[te,w]=o(``),[ie,T]=o(null),[ae,E]=o(null),[oe,D]=o(!1),[se,O]=o({}),[le,A]=o(``),de=s?.config.host,j=s===null?``:`${s.addonId}\0${s.name}\0${typeof de==`string`?de:``}`;t&&s!==null&&le!==j&&(A(j),g(s.addonId),w(s.name),O({...s.config}),m(`config`));let M=ce(void 0,{enabled:t&&s!==null}),{data:F}=ne({addonId:h??``,nodeId:`hub`},{enabled:h!=null}),pe=n(()=>F?je(F):null,[F]),I=re({onSuccess:()=>f.invalidateQueries({queryKey:[[`integrations`]]})}),L=ue(),me=L.data;a(()=>{if(!t||s===null)return;let e=M.data?.find(e=>e.addonId===s.addonId);e&&(D(e.canTest),x(e.discoveryMode))},[t,s,M.data]),a(()=>{p!==`discovery`||!_||!h||L.isPending||L.data||L.mutate({addonId:h})},[p,_,h,L]);let ge=k({onSuccess:()=>f.invalidateQueries({queryKey:[[`deviceManager`]]})});function ve(e,t,n,r,i,a,o,s){if(!I.isPending){if(g(e),D(s),x(n),w(r),E(null),o===`broker`){if(!a){E(`Addon '${e}' declares mode 'broker' but no brokerKind in its manifest`);return}C(a),m(`broker`);return}if(o===`account`){m(`config`);return}R(e,r)}}async function R(e,t){try{let n=await I.mutateAsync({addonId:e,name:t,settings:{}});r(),B(),d(`${P(e,n.id)}&add=1`)}catch{}}async function ye(e){if(h)try{let t=await I.mutateAsync({addonId:h,name:e.name,settings:e.config,secretKeys:[...e.secretKeys]});v(t.id),T(t.id),b===`auto`||b===`both`?m(`discovery`):z(t.id,{openAdd:!0})}catch{}}async function be(e){if(h)try{let t=await I.mutateAsync({addonId:h,name:te,settings:{brokerId:e}});T(t.id),v(t.id),z(t.id)}catch{}}async function xe(e){if(h){for(let t of e){let e=me?.find(e=>e.stableId===t);e&&await ge.mutateAsync({addonId:h,candidate:e,...ie===null?{}:{integrationId:ie}})}z()}}function z(e,t){let n=e??_??h;if(r(),B(),n&&h){let e=P(h,n);d(t?.openAdd===!0?`${e}&add=1`:e)}}function B(){m(`picker`),g(null),v(null),x(`manual`),C(null),w(``),T(null),E(null),D(!1),O({}),A(``)}function V(){r(),B()}De(t);let H=I.isPending,U=Oe(H,Me);if(!t)return null;let W={picker:u(`integrations.newIntegration`),config:u(`integrations.configureIntegration`),discovery:u(`integrations.importDevices`),broker:u(`integrations.connectBroker`,{defaultValue:`Connect a broker`})},Se=H?h:null,G=I.error,K=H&&!U;return e(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center`,children:[i(`div`,{className:`absolute inset-0 bg-black/60`,onClick:K?void 0:V}),e(`div`,{className:`relative z-10 w-full ${p===`picker`?`max-w-5xl`:`max-w-lg`} max-h-[calc(85dvh-2*max(env(safe-area-inset-top),env(safe-area-inset-bottom)))] rounded-xl border border-border bg-background shadow-2xl flex flex-col overflow-hidden`,children:[e(`div`,{className:`flex items-center justify-between border-b border-border px-5 py-4 flex-shrink-0`,children:[i(`h2`,{className:`text-sm font-semibold text-foreground`,children:W[p]}),i(`button`,{onClick:V,disabled:K,className:`rounded-md p-1 text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed`,children:i(y,{className:`h-4 w-4`})})]}),e(`div`,{className:`px-5 py-4 flex-1 overflow-y-auto overscroll-contain`,children:[G&&!H&&i(`div`,{className:`mb-3 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive`,children:G instanceof Error?G.message:String(G)}),p===`picker`&&e(l,{children:[ae&&i(`div`,{className:`mb-3 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive`,children:ae}),i(Ae,{onSelect:ve,onClose:V,pendingAddonId:Se})]}),p===`config`&&h&&i(_e,{addonId:h,configSchema:pe??null,canTest:oe,initialName:typeof se.host==`string`?te:void 0,initialConfig:{...se},onSave:ye,onBack:()=>{O({}),m(`picker`)}},j.length>0?j:h),p===`broker`&&S&&i(he,{kind:S,onResolved:e=>{be(e)},onBack:()=>m(`picker`)}),p===`discovery`&&_&&i(ke,{providerId:_,onImport:xe,onSkip:z})]}),H&&e(`div`,{className:`absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-xl bg-background/85 backdrop-blur-sm px-6 text-center`,children:[i(ee,{className:`h-6 w-6 animate-spin text-primary`}),i(`p`,{className:`text-xs font-medium text-foreground`,children:u(`integrations.creating`,{defaultValue:`Creating integration…`})}),!U&&i(`p`,{className:`text-[10px] text-foreground-subtle`,children:u(`integrations.creatingHint`,{defaultValue:`Waiting for the addon to restart and register`})}),U&&e(l,{children:[i(`p`,{className:`text-[10px] text-foreground-subtle max-w-xs`,children:u(`integrations.creatingOverdue`,{defaultValue:`This is taking longer than expected. The integration may already have been created — close this dialog and refresh to check.`})}),i(`button`,{onClick:V,className:`mt-1 rounded-md border border-border bg-surface px-3 py-1.5 text-[11px] font-medium text-foreground hover:bg-surface-hover transition-colors`,children:u(`integrations.closeAndRefresh`,{defaultValue:`Close`})})]})]})]})]})}function X({integration:t,expanded:n,onToggleExpand:r}){let{t:a}=N();return e(`div`,{className:`flex items-center gap-2.5`,children:[i(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),r(t.addonId)},"aria-label":n?a(`integrations.integrationColumns.collapse`,`Collapse`):a(`integrations.integrationColumns.expand`,`Expand`),"aria-expanded":n,className:`flex h-5 w-5 flex-shrink-0 items-center justify-center rounded text-foreground-subtle transition-colors hover:bg-surface-hover hover:text-foreground`,children:i(n?p:u,{className:`h-3.5 w-3.5`})}),i(F,{type:t.addonId,size:`sm`}),e(`div`,{className:`flex min-w-0 flex-col`,children:[i(`span`,{className:`truncate text-xs font-semibold text-foreground`,children:t.name}),i(`span`,{className:`truncate text-[10px] text-foreground-subtle`,children:t.addonId})]})]})}function Pe(e){let{isExpanded:t,onToggleExpand:n}=e;return[{key:`name`,header:M.t(`integrations.integrationColumns.integration`,`Integration`),headerClassName:`w-[55%]`,cell:e=>i(X,{integration:e,expanded:t(e),onToggleExpand:n})},{key:`devices`,header:M.t(`integrations.integrationColumns.devices`,`Devices`),headerClassName:`w-[15%]`,cellClassName:`text-[11px] text-foreground-subtle`,cell:e=>M.t(`integrations.integrationColumns.deviceCount`,{count:e.deviceCount})},{key:`status`,header:M.t(`integrations.integrationColumns.status`,`Status`),headerClassName:`w-[15%]`,cell:e=>i(A,{status:e.status})}]}s();function Fe(e){if(!e.enabled)return`disabled`;switch(e.processState){case`running`:return`running`;default:return`stopped`}}var Z=`expand`;function Ie(){let{t}=N(),s=fe(),c=pe(),u=_(),[p]=I(),[m,g]=Ee(),[ee,v]=o(!1),[y,b]=o(null),S=r(()=>{b(null),v(!0)},[]),ne=r(()=>{v(!1),b(null)},[]),re=r(e=>{D(!1),b(e),v(!0)},[]),[oe,D]=o(!1);a(()=>{let e=ge(c.state);e!==null&&(b(e),v(!0),s(`/integrations`,{replace:!0,state:null}))},[c.state,s]);let k=p.get(`setup`);a(()=>{k===null||k.length===0||(b({addonId:k,name:k,config:{}}),v(!0))},[k]);let A=r(()=>D(!0),[]),ue=r(()=>D(!1),[]);le([`integrations`],[`integration.enabled`,`integration.disabled`,`integration.deleted`,`provider.started`,`provider.stopped`,`addon.installed`,`addon.uninstalled`,`addon.started`,`addon.stopped`,`addon.updated`]),le([`deviceManager`],[`device.registered`,`device.unregistered`,`device.online`,`device.offline`,`device.disabled`,`device.enabled`]);let{data:M,isLoading:F,isError:he,refetch:_e}=se(void 0),{data:R,isLoading:ye,isError:xe,refetch:V}=T({projection:`slim`}),U=n(()=>R??[],[R]),W=n(()=>M??[],[M]),G=n(()=>{let e=new Map;for(let t of U)e.set(t.id,{id:t.id,name:t.name??t.stableId??`#${String(t.id)}`});return e},[U]),K=n(()=>ae(M),[M]),Ce=n(()=>{let e=new Map;for(let t of E(U)){let n=K(t);if(n.kind!==`resolved`)continue;let r=n.integration.id;e.set(r,(e.get(r)??0)+1)}return e},[U,K]),q=n(()=>W.map(e=>({id:e.id,addonId:e.addonId,name:e.name,enabled:e.enabled,status:Fe(e),deviceCount:Ce.get(e.id)??0})),[W,Ce]),{data:we}=ce(),Te=n(()=>new Map((we??[]).map(e=>[e.addonId,e.name])),[we]),De=p.get(Z),Oe=r(e=>{let t=new URLSearchParams(window.location.search);t.get(Z)===e?t.delete(Z):t.set(Z,e);let n=t.toString(),r=`${window.location.pathname}${n?`?${n}`:``}${window.location.hash}`;window.history.replaceState(window.history.state,``,r),window.dispatchEvent(new PopStateEvent(`popstate`))},[]),{data:ke}=j(void 0),J=n(()=>z(ke),[ke]),Y=n(()=>B(q,J),[q,J]),Ae=n(()=>B(be(q,Te),J),[q,Te,J]),je=r(e=>s(P(e.addonId)),[s]),Me=r(e=>s(P(e.addonId,e.id)),[s]),X=r(e=>G.get(e)??null,[G]),Ie=r(e=>s(`/devices/${String(e)}`),[s]),Le=r(e=>i(O,{context:`integration-detail`,devices:U,trpc:u.trpcClient,integrationOf:K,forceIntegrationId:e.id,urlScope:`nested`,lsKey:`integrations:nested:${e.addonId}`,resolveIntegrationIcon:me,resolveParent:X,onNavigate:Ie}),[U,u.trpcClient,K,X,Ie]),Re=r(e=>De===e.addonId,[De]),ze=n(()=>Pe({isExpanded:Re,onToggleExpand:Oe}),[Re,Oe]),Be=r(e=>`${e.name} ${e.addonId}`,[]),Ve=r(e=>e.id,[]),He=e=>i(O,{mode:`generic`,items:e,getKey:Ve,getSearchText:Be,columns:ze,onRowClick:Me,isExpanded:Re,renderExpanded:Le,searchPlaceholder:t(`integrations.search`,{defaultValue:`Search integrations…`}),emptyLabel:t(`integrations.empty`,{defaultValue:`No integrations found.`})}),Ue=r(()=>{_e(),V()},[_e,V]),Q=he===!0||xe===!0,$=!Q&&(F||ye||M===void 0||R===void 0),We=W.length>0,Ge=[{id:`table`,label:t(`integrations.viewTable`,`Table`),icon:te},{id:`grid`,label:t(`integrations.viewGrid`,`Grid`),icon:C}];return e(L,{icon:h,title:t(`nav.integrations`,`Integrations`),actions:e(l,{children:[i(ie,{ariaLabel:t(`integrations.viewLabel`,`Layout`),value:m,onChange:g,options:Ge,testId:`integrations-view`}),i(`button`,{onClick:Ue,disabled:$,className:`flex items-center gap-1 rounded-lg border border-border bg-surface px-2.5 py-1.5 text-xs font-medium text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors disabled:opacity-50`,title:t(`common.refresh`,`Refresh`),children:i(d,{className:de(`h-3.5 w-3.5`,$&&`animate-spin`)})}),e(`button`,{onClick:A,className:`flex items-center gap-1.5 rounded-lg border border-border bg-surface px-2.5 py-1.5 text-xs font-medium text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors`,title:t(`integrations.scanTheLocalNetworkFor`,`Scan the local network for devices`),children:[i(x,{className:`h-3.5 w-3.5`}),t(`integrations.scanNetwork`,`Scan network`)]}),e(`button`,{onClick:S,className:`flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground shadow-sm`,children:[i(f,{className:`h-3.5 w-3.5`}),t(`integrations.newIntegration`,`New Integration`)]})]}),children:[Q&&i(w,{message:t(`integrations.loadFailed`,`Integrations could not be loaded.`),onRetry:Ue}),$&&i(`div`,{className:`space-y-2`,"data-testid":`integrations-pending`,children:[1,2,3].map(e=>i(`div`,{className:`h-12 rounded-lg border border-border bg-surface animate-pulse`},e))}),!Q&&!$&&!We&&e(`div`,{className:`flex flex-col items-center py-20 text-foreground-subtle`,children:[i(`p`,{className:`text-sm`,children:t(`integrations.noIntegrationsConfigured`,`No integrations configured.`)}),i(`p`,{className:`text-xs mt-1`,children:t(`integrations.clickNewIntegrationToConnect`,`Click "New Integration" to connect cameras and devices.`)})]}),!Q&&!$&&We&&m===`table`&&e(`div`,{className:`space-y-4`,children:[Y.providers.length>0&&i(H,{kind:`providers`,children:He(Y.providers)}),Y.system.length>0&&i(H,{kind:`system`,children:He(Y.system)})]}),!Q&&!$&&We&&m===`grid`&&i(Se,{providers:Ae.providers,system:Ae.system,onOpen:je,searchPlaceholder:t(`integrations.search`,{defaultValue:`Search integrations…`}),emptyLabel:t(`integrations.empty`,{defaultValue:`No integrations found.`})}),i(Ne,{open:ee,onClose:ne,seed:y}),i(ve,{open:oe,onClose:ue,onSetupIntegration:re})]})}export{Ie as IntegrationsPage};