@camstack/addon-admin-ui 1.2.459 → 1.2.461
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.
- package/dist/assets/{AddonAssetIcon-BJEJ1k08.js → AddonAssetIcon-CmEqgzfX.js} +1 -1
- package/dist/assets/Addons-CVkkdf3V.js +4 -0
- package/dist/assets/{AdminPage-COkr2pSl.js → AdminPage-N36spL8r.js} +1 -1
- package/dist/assets/{AdminSectionedPage-DacqZ038.js → AdminSectionedPage-B4DO1cch.js} +1 -1
- package/dist/assets/AiProfiles-Dm1A5qaJ.js +3 -0
- package/dist/assets/BrokerForm-BDBUNSWe.js +1 -0
- package/dist/assets/Build-Btk8hgSX.js +40 -0
- package/dist/assets/Calendars-C4GvODYM.js +1 -0
- package/dist/assets/{Cluster-9x8btsN4.js → Cluster-CUaBA2On.js} +1 -1
- package/dist/assets/CompositionEditor-Kq2kEnnh.js +1 -0
- package/dist/assets/CompositionEditorPage-D89-6PCw.js +1 -0
- package/dist/assets/Data-B49CFnpf.js +2 -0
- package/dist/assets/DeviceDetail-BPyZ6uyd.js +2 -0
- package/dist/assets/DeviceDoActionFields-zsHf4EON.js +1 -0
- package/dist/assets/Devices-DHWIbLrr.js +1 -0
- package/dist/assets/{EmbedPlayerPage-yV8Ghwca.js → EmbedPlayerPage-C3Riyl8J.js} +1 -1
- package/dist/assets/History-g1qlGuSi.js +1 -0
- package/dist/assets/Identity-DWlP85j-.js +1 -0
- package/dist/assets/IntegrationDetail-y7qRdb6V.js +1 -0
- package/dist/assets/IntegrationHub-D4VoDe9W.js +1 -0
- package/dist/assets/Integrations-ByoGCmDg.js +1 -0
- package/dist/assets/Integrations-YNiehsXN.js +1 -0
- package/dist/assets/Library-BF596aV_.js +1 -0
- package/dist/assets/Locations-CWErnyPW.js +3 -0
- package/dist/assets/{Logs--6yOXDdG.js → Logs-CQcRBcxc.js} +1 -1
- package/dist/assets/{MaskShapeCanvas-BFRANocL.js → MaskShapeCanvas-CBe03CMO.js} +1 -1
- package/dist/assets/{MotionZonesSettings-DAR1lGRc.js → MotionZonesSettings-Ci1jf-Mm.js} +1 -1
- package/dist/assets/MyAccess-DUFCQyd0.js +2 -0
- package/dist/assets/Network-CfC1bac2.js +1 -0
- package/dist/assets/NodeAddonsSettingsPanel-CxfoWry5.js +1 -0
- package/dist/assets/Notifications-BqYoqEfY.js +1 -0
- package/dist/assets/Pipeline-D8nt-Y81.js +1 -0
- package/dist/assets/{PrivacyMaskSettings-CFjaiNPa.js → PrivacyMaskSettings-DSh1TEIJ.js} +1 -1
- package/dist/assets/Recordings-D2QgV6gh.js +1 -0
- package/dist/assets/ScanNetworkModal-Ba_B2lf-.js +1 -0
- package/dist/assets/{SceneMonitorEditor-CtObZ92A.js → SceneMonitorEditor-Dn0NH3UY.js} +1 -1
- package/dist/assets/SessionsList-Bik0vNoP.js +2 -0
- package/dist/assets/Showroom-BFwRdZBU.js +1 -0
- package/dist/assets/System-DSqTdlP0.js +1 -0
- package/dist/assets/{Terminal-CfhgVSfX.js → Terminal-DviYZMzd.js} +3 -3
- package/dist/assets/{Viewer-DOy7SpD5.js → Viewer-BqGWuKOT.js} +1 -1
- package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-FGBBI8DM.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-C-OpByVg.js} +1 -1
- package/dist/assets/{addon-icons-context-zSgVMYOT.js → addon-icons-context-Dk7L05cY.js} +1 -1
- package/dist/assets/{archive-CCdQLR92.js → archive-S-zO_vQF.js} +1 -1
- package/dist/assets/{authed-media-BnRlGkoA.js → authed-media-Cpc0v-lW.js} +1 -1
- package/dist/assets/{bell-off-CqtliYfE.js → bell-off-B0BNkY5Q.js} +1 -1
- package/dist/assets/{board-model-DcXa88Au.js → board-model-BLL_cD-z.js} +1 -1
- package/dist/assets/{boxes-DQn7OALq.js → boxes-B89A109J.js} +1 -1
- package/dist/assets/circle-slash-DtOy5nTT.js +1 -0
- package/dist/assets/client-B741nZQJ.js +358 -0
- package/dist/assets/{cloud-upload-Ds0DBFF4.js → cloud-upload-EnqEFlW5.js} +1 -1
- package/dist/assets/crop-BM88jjat.js +1 -0
- package/dist/assets/device-integration-icon-DpIPAgxb.js +1 -0
- package/dist/assets/device-picker-model-BIknMBUl.js +1 -0
- package/dist/assets/{dist-DGtsAF0e.js → dist-CnH0kuMY.js} +1 -1
- package/dist/assets/dist-xq0sTO1C.js +358 -0
- package/dist/assets/{eraser-CBhjXP5B.js → eraser-CTiJOqJH.js} +1 -1
- package/dist/assets/format-3n872UoD.js +1 -0
- package/dist/assets/{hard-drive-download-Bbqt0BU7.js → hard-drive-download-B-xmEXyG.js} +1 -1
- package/dist/assets/{hostInit-DYH0aGPp.js → hostInit-CGuLmCP7.js} +1 -1
- package/dist/assets/i18n-SRLxy4I7.js +1 -0
- package/dist/assets/{icons-CIAj8beD.js → icons-D1XGgPoq.js} +1 -1
- package/dist/assets/index-Av4-A8rY.js +4 -0
- package/dist/assets/index-DhkrLRVh.css +2 -0
- package/dist/assets/{key-BrmsyfQ2.js → key-BEqu-lXr.js} +1 -1
- package/dist/assets/{key-round-DupHhW0i.js → key-round-Bx5_IMpS.js} +1 -1
- package/dist/assets/{layers-jV4_DPMS.js → layers-Dl1ZfXjR.js} +1 -1
- package/dist/assets/linked-devices-model-7z16tmo3.js +1 -0
- package/dist/assets/{list-ordered-DOEvj-y0.js → list-ordered-Dgp6etRJ.js} +1 -1
- package/dist/assets/location-owned-usage-bGdU9_ER.js +1 -0
- package/dist/assets/{log-in-CcPfrqgr.js → log-in-D8cVgea3.js} +1 -1
- package/dist/assets/{memory-stick-q_w6rp-t.js → memory-stick-9OcSMd1G.js} +1 -1
- package/dist/assets/{message-square-plus-9n6eNHhb.js → message-square-plus-C4vA4iYJ.js} +1 -1
- package/dist/assets/{mf-entry-bootstrap-0-44ebd2c3.js → mf-entry-bootstrap-0-6251002a.js} +2 -2
- package/dist/assets/{mic-off-D8Z3zvJC.js → mic-off-3EqpKDCs.js} +1 -1
- package/dist/assets/{monitor-off-ChiwdYm2.js → monitor-off-BnrglR7J.js} +1 -1
- package/dist/assets/{monitor-smartphone-5A2YPeJg.js → monitor-smartphone-CjzyjUlp.js} +1 -1
- package/dist/assets/mount-BIknMBUl.js +1 -0
- package/dist/assets/{player-overlays-B2uKzPiF.js → player-overlays-C2qGnksg.js} +1 -1
- package/dist/assets/{recycle-lkNup4GK.js → recycle-tvZPZI99.js} +1 -1
- package/dist/assets/remoteEntry-C-4WYf0M.js +1 -0
- package/dist/assets/{scan-eye-CJpdZenM.js → scan-eye-6_8sPy1t.js} +1 -1
- package/dist/assets/{scissors-v8FUfmH0.js → scissors-BYLfeqTv.js} +1 -1
- package/dist/assets/{search-x-CJx173bU.js → search-x-CLjmzP4o.js} +1 -1
- package/dist/assets/{send-XYAWcADm.js → send-CcDHb3r4.js} +1 -1
- package/dist/assets/{settings-2-Bgu4fxha.js → settings-2-G-7M0you.js} +1 -1
- package/dist/assets/{speaker-ofUzLdUT.js → speaker-CaxICJfu.js} +1 -1
- package/dist/assets/src-D1steZEF.js +67 -0
- package/dist/assets/step-inspector-model-p9HUQGve.js +1 -0
- package/dist/assets/{timer-reset-D-5iU9l-.js → timer-reset-D0SmO8M1.js} +1 -1
- package/dist/assets/{ungroup-DD3pb37b.js → ungroup-BjWmPSAJ.js} +1 -1
- package/dist/assets/{unlink-xgj0DHXA.js → unlink-8CYYb6J2.js} +1 -1
- package/dist/assets/{usb-COQJ7FVk.js → usb-vxNmd1OO.js} +1 -1
- package/dist/assets/{use-scenes-feed-Cr8WJGCC.js → use-scenes-feed-BepTQeVo.js} +1 -1
- package/dist/assets/{use-stationary-objects-kiH5Q2gT.js → use-stationary-objects-Dnn6yNrY.js} +1 -1
- package/dist/assets/useEventInvalidation-BIknMBUl.js +1 -0
- package/dist/assets/useNodeUrlSelection-i_Uu58Pu.js +1 -0
- package/dist/assets/user-round-DD5YK-sO.js +1 -0
- package/dist/assets/{user-x-CBuwxTd8.js → user-x-_Ch_VgmF.js} +1 -1
- package/dist/assets/{video-CCbgIO_h.js → video-CnGFIENR.js} +1 -1
- package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CxTajz7L.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-sNr_TQNF.js} +2 -2
- package/dist/index.html +10 -11
- package/dist/server/addon.js +190 -91
- package/package.json +1 -1
- package/dist/assets/Addons-DHanUVT2.js +0 -4
- package/dist/assets/AiProfiles-00eup-gf.js +0 -3
- package/dist/assets/BrokerForm-BZXEvLK0.js +0 -1
- package/dist/assets/Build-C-5lgbq3.js +0 -40
- package/dist/assets/Calendars-BkpP1D2U.js +0 -1
- package/dist/assets/CompositionEditor-r0DF2l8O.js +0 -1
- package/dist/assets/CompositionEditorPage-ZgZUzIco.js +0 -1
- package/dist/assets/Data-CRUK3PE2.js +0 -2
- package/dist/assets/DeviceDetail-B-WDYuF4.js +0 -2
- package/dist/assets/DeviceDoActionFields-B6h8uYuA.js +0 -1
- package/dist/assets/Devices--JO66DyO.js +0 -1
- package/dist/assets/History-BwlSzH55.js +0 -1
- package/dist/assets/Identity-BWhaEMdv.js +0 -1
- package/dist/assets/IntegrationDetail-CQTl55bJ.js +0 -1
- package/dist/assets/IntegrationHub-1t9XtENg.js +0 -1
- package/dist/assets/Integrations-BsHioywX.js +0 -1
- package/dist/assets/Integrations-DAZG8yCP.js +0 -1
- package/dist/assets/Library-I8I-H4B0.js +0 -1
- package/dist/assets/Locations-DpID1z6R.js +0 -3
- package/dist/assets/MyAccess-BlPaAQNJ.js +0 -2
- package/dist/assets/Network-68PrEWb3.js +0 -1
- package/dist/assets/NodeAddonsSettingsPanel-BU9D0unj.js +0 -1
- package/dist/assets/Notifications-BHMdjbhb.js +0 -1
- package/dist/assets/Pipeline-BntRM_Gg.js +0 -1
- package/dist/assets/Recordings-B0PFCiE6.js +0 -1
- package/dist/assets/ScanNetworkModal-KVlo34E_.js +0 -1
- package/dist/assets/SessionsList-BqQzJQzH.js +0 -2
- package/dist/assets/Showroom-BpbWCBms.js +0 -1
- package/dist/assets/System-Bi2UJjp7.js +0 -1
- package/dist/assets/circle-slash-BqXxDfpK.js +0 -1
- package/dist/assets/client-DUabg_ow.js +0 -358
- package/dist/assets/crop-Cfvx74Ee.js +0 -1
- package/dist/assets/device-integration-icon-Bb8AOXEF.js +0 -1
- package/dist/assets/device-picker-model-BtgtDdnV.js +0 -1
- package/dist/assets/dist-BgJn1_Ws.js +0 -358
- package/dist/assets/i18n-aZ2iCAl5.js +0 -1
- package/dist/assets/index-DKfAHLRf.js +0 -4
- package/dist/assets/index-I9On1g0c.css +0 -2
- package/dist/assets/linked-devices-model-Wflvd004.js +0 -1
- package/dist/assets/location-owned-usage-D3Zl9d5o.js +0 -1
- package/dist/assets/mount-BtgtDdnV.js +0 -1
- package/dist/assets/notification-schedule-field-BGziM8ff.js +0 -1
- package/dist/assets/remoteEntry-DwoMnkvg.js +0 -1
- package/dist/assets/src-N0x0aMoc.js +0 -67
- package/dist/assets/step-inspector-model-C7JCmVfz.js +0 -1
- package/dist/assets/useEventInvalidation-BtgtDdnV.js +0 -1
- package/dist/assets/useNodeUrlSelection-DpqDFKVD.js +0 -1
- package/dist/assets/user-round-Dy1LJO0f.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,B as t,G as n,J as r,L as i,S as a,b as o,o as s,x as c}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEHpkaJP.js";import{An as l,Br as u,D as d,It as f,L as p,Nt as m,Si as h,Yt as g,Z as _,Zr as v,Zt as y,bn as b,dn as x,dt as S,hn as ee,ht as C,kn as w,on as T,or as E,ot as D,rr as O,yn as te,zn as k}from"./player-overlays-B2uKzPiF.js";import{On as ne,ar as re,lr as ie,ur as ae}from"./client-DUabg_ow.js";import{t as A}from"./boxes-DQn7OALq.js";import{l as j,s as oe}from"./video-CCbgIO_h.js";import{t as se}from"./log-in-CcPfrqgr.js";import{An as ce,As as le,Cs as ue,Ds as de,Es as fe,Ms as pe,Nu as me,Ou as he,Rr as M,Ts as ge,Za as _e,_s as ve,bs as ye,dn as be,ds as xe,du as Se,fn as Ce,fr as we,gs as Te,hr as N,js as Ee,ln as De,ls as Oe,mn as ke,ms as Ae,oi as P,si as F,sr as je,us as Me,ws as Ne,ys as Pe}from"./src-N0x0aMoc.js";import{t as I}from"./i18n-aZ2iCAl5.js";import{t as L}from"./useTranslation-D3Is_4B6.js";import"./mount-BtgtDdnV.js";import{$ as Fe,Q as Ie,T as Le,a as R,i as z,nt as Re}from"./index-DKfAHLRf.js";import{t as ze}from"./AdminSectionedPage-DacqZ038.js";import{t as B}from"./AdminPage-COkr2pSl.js";import{t as Be}from"./NodeAddonsSettingsPanel-BU9D0unj.js";import{n as V,r as Ve,t as H}from"./IntegrationHub-1t9XtENg.js";import{n as U,t as W}from"./addon-display-names-BkwMrExv.js";e();var G=5e3,K=`network-access`,He={connected:!1,endpoint:null};function Ue(){let{t:e}=L(),t=s(),i=F({capName:`network-access`},{refetchInterval:G}),a=P(void 0,{refetchInterval:G}),o=n(()=>W(a.data??[]),[a.data]),l=n(()=>(i.data??[]).map(e=>({addonId:e.addonId,displayName:o.get(e.addonId)??e.addonId,isActive:e.isActive})),[i.data,o]),[u,d]=r(null),[f,p]=r({}),m=(e,n)=>{let r=n?.addonId;t.invalidateQueries({queryKey:[[`networkAccess`,`getStatus`],{input:{addonId:r},type:`query`}]}),d(null),p(e=>{if(r===void 0||!(r in e))return e;let t={...e};return delete t[r],t})},h=(e,t)=>{d(null);let n=t?.addonId;if(n===void 0)return;let r=e instanceof Error?e.message:String(e);p(e=>({...e,[n]:r}))},g=Ee({onSuccess:m,onError:h}),_=pe({onSuccess:m,onError:h}),v=[{id:K,label:e(`system.remoteAccess.remoteAccess`,`Remote access`),install:{capability:K,label:e(`system.remoteAccess.addTunnel`,`Add tunnel`)},entries:l.map(e=>({id:e.addonId,name:e.displayName,fallbackIcon:j,...U(e.isActive),render:()=>c(V,{addonId:e.addonId,displayName:e.displayName,capName:K,isActive:e.isActive,badges:c(Ge,{addonId:e.addonId}),error:f[e.addonId]??null,primaryAction:c(Ke,{addonId:e.addonId,busyId:u,onStart:e=>{d(e),g.mutate({addonId:e})},onStop:e=>{d(e),_.mutate({addonId:e})}})})}))}];return c(H,{embedded:!0,icon:j,title:e(`system.remoteAccess.remoteAccess2`,`Remote Access`),subtitle:e(`system.remoteAccess.publicFacingTunnelsThatExpose`,`Public-facing tunnels that expose this hub to the internet (Cloudflare Tunnel, ngrok, …).`),groups:v,isLoading:i.isLoading,emptyTitle:e(`system.remoteAccess.noRemoteAccessProvidersInstalled`,`No remote-access providers installed`),emptyDescription:e(`system.remoteAccess.installATunnelAddonE`,`Install a tunnel addon (e.g. @camstack/addon-cloudflare) to expose this hub publicly.`)})}function We(e){let{data:t}=le({addonId:e},{refetchInterval:G,retry:!1}),n=t?re.safeParse(t):null;return n?.success?n.data:He}function Ge({addonId:e}){let{t}=L(),n=We(e);return a(o,{children:[c(M,{variant:n.connected?`success`:`default`,className:Ve,children:n.connected?t(`system.remoteAccess.connected`,`Connected`):t(`system.remoteAccess.disconnected`,`Disconnected`)}),n.endpoint&&a(`a`,{href:n.endpoint.url,target:`_blank`,rel:`noopener noreferrer`,className:`flex min-w-0 items-center gap-1 break-all text-[11px] text-success hover:underline`,children:[c(u,{className:`h-3 w-3`}),n.endpoint.url]})]})}function Ke({addonId:e,busyId:t,onStart:n,onStop:r}){let{t:i}=L(),o=We(e),s=t===e;return o.connected?a(N,{size:`sm`,variant:`secondary`,disabled:s,onClick:()=>r(e),children:[s?c(E,{className:`h-3 w-3 animate-spin`}):c(g,{className:`h-3 w-3`}),i(`system.remoteAccess.stop`,`Stop`)]}):a(N,{size:`sm`,variant:`primary`,disabled:s,onClick:()=>n(e),children:[s?c(E,{className:`h-3 w-3 animate-spin`}):c(l,{className:`h-3 w-3`}),i(`system.remoteAccess.start`,`Start`)]})}e();var qe=3e4,q=`turn-provider`;function Je(e){let t=[];for(let n of e)typeof n.urls==`string`?t.push(n.urls):t.push(...n.urls);return t}function Ye(){let{t:e}=L(),t=F({capName:`turn-provider`},{refetchInterval:qe}),r=P(void 0,{refetchInterval:qe}),i=Se(),o=i.data??[],s=n(()=>W(r.data??[]),[r.data]),l=n(()=>(t.data??[]).map(e=>({addonId:e.addonId,displayName:s.get(e.addonId)??e.addonId,isActive:e.isActive})),[t.data,s]),u=[{id:q,label:e(`system.turnServers.turnProviders`,`TURN providers`),install:{capability:q,label:e(`system.turnServers.addProvider`,`Add provider`)},entries:l.map(t=>({id:t.addonId,name:t.displayName,fallbackIcon:k,...U(t.isActive),render:()=>c(V,{addonId:t.addonId,displayName:t.displayName,capName:q,isActive:t.isActive,panels:[{id:`ice-servers`,title:e(`system.turnServers.discoveredIceServers`,`Discovered ICE servers`),icon:k,content:c(Xe,{addonId:t.addonId,enabled:t.isActive})}]})}))}];return c(H,{embedded:!0,icon:k,title:e(`system.turnServers.turnServers`,`TURN Servers`),subtitle:e(`system.turnServers.iceServersUsedForWebrtc`,`ICE servers used for WebRTC NAT traversal. Multiple providers can coexist — the WebRTC layer concatenates servers from all enabled providers per session.`),groups:u,isLoading:t.isLoading,emptyTitle:e(`system.turnServers.noTurnProvidersInstalled`,`No TURN providers installed`),emptyDescription:e(`system.turnServers.installATurnAddonE`,`Install a TURN addon (e.g. @camstack/addon-cloudflare) to enable WebRTC behind restrictive NATs.`),trailing:c(Ce,{headingId:`turn-combined-ice`,title:e(`system.turnServers.combinedIceServerListAll`,`Combined ICE server list — all enabled providers`),icon:k,actions:c(N,{size:`sm`,variant:`secondary`,onClick:()=>i.refetch(),disabled:i.isFetching,children:e(`common.refresh`,`Refresh`)}),children:c(`div`,{className:d,children:o.length===0?c(`div`,{className:`text-xs text-foreground-subtle`,children:e(`system.turnServers.noServersFromEnabledProviders`,`No servers from enabled providers.`)}):c(`div`,{className:`flex flex-col gap-3`,children:o.map((e,t)=>{let n=Array.isArray(e.urls)?e.urls:[e.urls];return a(`div`,{className:`rounded border border-border bg-surface`,children:[(e.username||e.credential)&&a(`div`,{className:`px-3 py-1.5 border-b border-border text-[10px] font-mono text-foreground-subtle flex items-center gap-3`,children:[e.username&&a(`span`,{children:[c(`span`,{className:`text-foreground-subtle`,children:`user:`}),` `,c(`span`,{className:`text-foreground`,children:e.username})]}),e.credential&&a(`span`,{children:[c(`span`,{className:`text-foreground-subtle`,children:`credential:`}),` `,c(`span`,{className:`text-foreground`,children:`••••••••`})]})]}),c(`ul`,{className:`divide-y divide-border`,children:n.map(e=>c(`li`,{className:`px-3 py-1.5 font-mono text-xs text-foreground break-all`,children:e},e))})]},t)})})})})})}function Xe({addonId:e,enabled:t}){let r=Se({addonId:e},{enabled:t,retry:!1}),i=n(()=>Je(r.data??[]),[r.data]),a=t?r.isLoading?`Loading…`:i.length===0?`This provider returned no servers.`:null:`Disabled — enable the provider to fetch its servers.`;return c(`div`,{className:`rounded-lg border border-border bg-surface p-2 sm:p-3`,children:a===null?c(`div`,{className:`flex flex-wrap gap-1`,children:i.map(e=>c(`span`,{className:`inline-block break-all rounded bg-foreground-subtle/10 px-1.5 py-0.5 font-mono text-[10px] text-foreground`,children:e},e))}):c(`div`,{className:`text-xs text-foreground-subtle`,children:a})})}e();var Ze={lan:k,wifi:C,docker:A,vpn:O,loopback:x,other:x},Qe={lan:`LAN`,wifi:`Wi-Fi`,docker:`Docker`,vpn:`VPN`,loopback:`Loopback`,other:`Other`},$e=[`lan`,`wifi`,`vpn`,`docker`,`other`,`loopback`];function et(e){let{t}=L(),{interfaces:r,disabled:i,hideLoopback:o,ipv4Only:s,emptyMessage:l}=e,u=n(()=>r.filter(e=>!(o&&e.kind===`loopback`||s&&e.family!==`IPv4`)),[r,o,s]),d=n(()=>{let e=new Map;for(let t of u){let n=e.get(t.kind)??[];n.push(t),e.set(t.kind,n)}return $e.filter(t=>e.has(t)).map(t=>({kind:t,items:e.get(t)}))},[u]),f=t=>e.mode===`single`?e.value===t:e.value.includes(t),p=t=>{if(i||t.kind===`loopback`)return;if(e.mode===`single`){e.onChange(e.value===t.address?null:t.address);return}let n=new Set(e.value);n.has(t.address)?n.delete(t.address):n.add(t.address),e.onChange([...n])};return u.length===0?c(`div`,{className:`text-xs text-foreground-subtle italic`,children:l??t(`shared.addressSelector.noAddressesAvailable`,`No addresses available.`)}):c(`div`,{className:`flex flex-col gap-3`,children:d.map(({kind:n,items:r})=>a(`div`,{className:`rounded-md border border-border overflow-hidden`,children:[a(`div`,{className:`flex items-center gap-2 px-3 py-1.5 bg-surface-hover/30 border-b border-border`,children:[c(Ze[n]??x,{className:`h-3.5 w-3.5 text-foreground-subtle`}),c(`span`,{className:`text-[11px] font-semibold uppercase tracking-wide text-foreground-subtle`,children:Qe[n]??n}),a(`span`,{className:`text-[10px] text-foreground-subtle`,children:[`· `,r.length]})]}),c(`ul`,{className:`divide-y divide-border`,children:r.map(n=>{let r=f(n.address),o=n.kind===`loopback`,s=!n.plausible&&!o;return a(`li`,{className:`flex items-center gap-3 px-3 py-2 ${o?`opacity-60 cursor-not-allowed`:i?`opacity-60`:s?`cursor-pointer hover:bg-surface-hover/30 bg-amber-500/[0.04]`:`cursor-pointer hover:bg-surface-hover/30`}`,onClick:()=>p(n),children:[c(`span`,{className:`flex items-center justify-center h-4 w-4 rounded ${e.mode===`single`?`rounded-full`:`rounded`} border ${r?`border-primary bg-primary text-primary-foreground`:`border-border bg-surface`}`,children:r&&c(h,{className:`h-3 w-3`})}),a(`div`,{className:`flex-1 min-w-0 ${s?`text-foreground-subtle`:``}`,children:[a(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[c(`span`,{className:`font-mono text-xs font-semibold ${s?`text-foreground-subtle`:`text-foreground`}`,children:n.name}),c(`span`,{className:`text-[10px] rounded px-1.5 py-0.5 bg-foreground-subtle/10 text-foreground-subtle font-mono`,children:n.family}),n.preferred&&c(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium bg-primary/15 text-primary`,children:t(`shared.addressSelector.autoPreferred`,`Auto-preferred`)}),o&&c(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium bg-foreground-subtle/15 text-foreground-subtle`,children:t(`shared.addressSelector.alwaysIncluded`,`Always included`)}),s&&a(`span`,{className:`inline-flex items-center gap-1 text-[10px] rounded-full px-2 py-0.5 font-medium bg-amber-500/15 text-amber-700 dark:text-amber-300`,title:n.plausibleReason||void 0,children:[c(m,{className:`h-2.5 w-2.5`}),t(`shared.addressSelector.unlikelyUsable`,`Unlikely usable`)]})]}),a(`div`,{className:`text-xs text-foreground-subtle mt-0.5 font-mono break-all`,children:[n.address,n.cidr&&n.cidr!==n.address?` (${n.cidr})`:``]})]})]},`${n.name}-${n.family}-${n.address}`)})})]},n))})}var J=[{role:`appConnections`,get title(){return I.t(`helpers.addressTableModel.appConnectionsTitle`)},single:!1,get help(){return I.t(`helpers.addressTableModel.appConnectionsHelp`)}},{role:`notificationTaps`,get title(){return I.t(`helpers.addressTableModel.notificationTapsTitle`)},single:!0,get help(){return I.t(`helpers.addressTableModel.notificationTapsHelp`)}},{role:`publicEndpoint`,get title(){return I.t(`helpers.addressTableModel.publicEndpointTitle`)},single:!0,get help(){return I.t(`helpers.addressTableModel.publicEndpointHelp`)}},{role:`internal`,get title(){return I.t(`helpers.addressTableModel.internalTitle`)},single:!0,get help(){return I.t(`helpers.addressTableModel.internalHelp`)}}],tt=`A role with nothing ticked is automatic. Add a custom address when the hub is reached at an address it cannot see itself (NAT, reverse proxy, VPN, Docker bridge).`;function Y(e,t){return e.inUse.includes(t)}function nt(e,t){if(!e.eligible.includes(t))return{kind:`none`};if(e.kind===`app-link`)return Y(e,t)?{kind:`none`}:{kind:`set`,input:{role:t,baseUrl:null,enabled:!0}};if(e.flags.includes(t)||t===`appConnections`&&Y(e,t))return{kind:`set`,input:{role:t,baseUrl:e.baseUrl,enabled:!1}};let n={role:t,baseUrl:e.baseUrl,enabled:!0};return t===`publicEndpoint`&&e.baseUrl.startsWith(`http:`)?{kind:`confirm-http`,input:n,reason:ie}:{kind:`set`,input:n}}function rt(e){return J.map(({role:t,title:n})=>{if(t===`appConnections`){let r=e.roles.appConnections;return{role:t,title:n,inUse:r.resolved.length===0?`nothing reachable`:r.resolved.join(`, `),automatic:r.source!==`flagged`}}let r=e.roles[t];return{role:t,title:n,inUse:r.resolved===null?`nothing reachable`:t===`notificationTaps`&&r.source===`auto`?`CamStack app link`:r.resolved,automatic:r.source!==`flagged`}})}e();var it={"lan-ipv4":{labelKey:`system.addressesCard.kindIpv4`,className:`bg-emerald-500/15 text-emerald-700 dark:text-emerald-300`},"lan-ipv6":{labelKey:`system.addressesCard.kindIpv6`,className:`bg-violet-500/15 text-violet-700 dark:text-violet-300`},public:{labelKey:`system.addressesCard.kindPublic`,className:`bg-blue-500/15 text-blue-700 dark:text-blue-300`},"app-link":{labelKey:`system.addressesCard.kindAppLink`,className:`bg-amber-500/15 text-amber-700 dark:text-amber-300`},custom:{labelKey:`system.addressesCard.kindCustom`,className:`bg-sky-500/15 text-sky-700 dark:text-sky-300`},loopback:{labelKey:`system.addressesCard.kindLoopback`,className:`bg-foreground-subtle/15 text-foreground-subtle`}};function at({book:e,loading:t,saving:n,error:i,onSetRole:o,onAdd:s,onRemove:l}){let{t:u}=L(),[d,p]=r(``),[h,g]=r(``),[_,v]=r(null),[y,b]=r(null),x=()=>{let e=ae(d);if(!e.ok){v(e.reason);return}v(null),p(``),g(``),s(e.baseUrl,h.trim())},S=(e,t)=>{let n=nt(e,t.role);if(n.kind!==`none`){if(n.kind===`confirm-http`){b({input:n.input,reason:n.reason});return}b(null),o(n.input)}},ee=[{key:`url`,header:u(`system.addressesCard.address`,`Address`),render:t=>a(`div`,{className:`min-w-0 py-0.5`,children:[c(`div`,{className:`font-mono text-[12px] break-all ${t.plausible?`text-foreground`:`text-foreground-subtle`}`,children:t.baseUrl}),a(`div`,{className:`mt-0.5 flex flex-wrap items-center gap-1.5 text-[11px] text-foreground-subtle`,children:[c(`span`,{children:t.label}),t.kind===`app-link`&&a(`span`,{className:`font-mono`,children:[`hub=`,` `,e?.appLinkHub??u(`system.addressesCard.noneNoTunnelOrTailscale`,`none (no tunnel or Tailscale)`)]}),t.custom&&t.detected&&c(`span`,{children:u(`system.addressesCard.alsoAddedAsACustom`,`also added as a custom address`)}),t.kind!==`custom`&&t.interfaceKind!==`lan`&&t.interfaceKind!==`public`&&t.interfaceKind!==`other`&&c(`span`,{className:`uppercase tracking-wide`,children:t.interfaceKind}),!t.plausible&&t.interfaceKind!==`loopback`&&a(`span`,{className:`inline-flex items-center gap-1 text-amber-700 dark:text-amber-300`,title:t.plausibleReason||void 0,children:[c(m,{className:`h-2.5 w-2.5`}),u(`system.addressesCard.unlikelyUsable`,`Unlikely usable`)]})]})]})},{key:`kind`,header:u(`system.addressesCard.kind`,`Kind`),nowrap:!0,render:e=>{let t=it[e.kind]??it.loopback;return c(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium ${t.className}`,children:u(t.labelKey)})}},...J.map(e=>({key:e.role,headerRender:()=>c(`span`,{title:e.help,children:e.title}),align:`center`,nowrap:!0,width:`w-24`,render:t=>{let r=t.eligible.includes(e.role),i=t.flags.includes(e.role),o=Y(t,e.role);return a(`label`,{className:`inline-flex items-center justify-center gap-1 ${r?`cursor-pointer`:`cursor-not-allowed opacity-40`}`,title:r?o&&!i?u(`system.addressesCard.inUseAutomatically`,`{{title}}: in use automatically. {{help}}`,{title:e.title,help:e.help}):e.help:u(`system.addressesCard.thisAddressCannotBeUsed`,`This address cannot be used for this.`),children:[c(ce,{checked:r&&o,disabled:!r||n,onChange:()=>S(t,e),"aria-label":`${e.title}: ${t.baseUrl}`}),o&&!i&&r&&c(`span`,{className:`text-[9px] text-foreground-subtle`,children:u(`common.auto`)})]})}})),{key:`actions`,header:``,align:`right`,nowrap:!0,render:e=>e.custom?c(N,{size:`sm`,variant:`ghost`,disabled:n,onClick:()=>l(e.baseUrl),"aria-label":u(`system.addressesCard.remove`,`Remove {{baseUrl}}`,{baseUrl:e.baseUrl}),title:u(`system.addressesCard.removeThisCustomAddressIts`,`Remove this custom address (its roles turn automatic)`),children:c(f,{className:`h-3 w-3`})}):null}],C=e===void 0?[]:rt(e);return a(je,{children:[a(`div`,{className:`px-4 py-3 border-b border-border flex flex-col gap-2`,children:[a(`div`,{children:[c(`div`,{className:`text-sm font-semibold`,children:u(`system.addressesCard.addresses`,`Addresses`)}),c(`div`,{className:`text-xs text-foreground-subtle max-w-3xl`,children:u(`system.addressesCard.everyAddressThisHubIs`,`Every address this hub is reached at, detected or added by you. Tick what each one is used for.`)}),a(`details`,{className:`mt-1.5 text-xs max-w-3xl`,"data-testid":`address-roles-help`,children:[c(`summary`,{className:`cursor-pointer select-none text-foreground-subtle hover:text-foreground`,children:u(`system.addressesCard.whatAreRoles`,`What are roles?`)}),c(`dl`,{className:`mt-1.5 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1`,children:J.map(e=>a(`div`,{className:`contents`,children:[c(`dt`,{className:`font-medium`,children:e.title}),c(`dd`,{className:`text-foreground-subtle`,children:e.help})]},e.role))}),c(`p`,{className:`mt-1.5 text-foreground-subtle`,children:tt})]})]}),C.length>0&&c(`div`,{className:`grid grid-cols-[auto_1fr_auto] gap-x-3 gap-y-1 items-baseline text-xs`,"data-testid":`address-roles-summary`,children:C.map(e=>a(`div`,{className:`contents`,children:[c(`span`,{className:`text-foreground-subtle`,children:e.title}),a(`span`,{className:`font-mono break-all`,"data-testid":`address-role-${e.role}`,children:[e.inUse,c(`span`,{className:`ml-1.5 font-sans text-foreground-subtle`,children:e.automatic?u(`system.addressesCard.automatic`,`(automatic)`):u(`system.addressesCard.setByYou`,`(set by you)`)})]}),e.automatic?c(`span`,{}):c(N,{size:`sm`,variant:`secondary`,disabled:n,onClick:()=>o({role:e.role,baseUrl:null,enabled:!1}),children:u(`system.addressesCard.useAutomatic`,`Use automatic`)})]},e.role))}),y!==null&&a(`div`,{className:`rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs flex flex-wrap items-center gap-2`,children:[c(m,{className:`h-3.5 w-3.5 text-amber-600`}),c(`span`,{className:`flex-1 min-w-[220px]`,children:y.reason}),c(N,{size:`sm`,variant:`secondary`,onClick:()=>{o({...y.input,acceptInsecureHttp:!0}),b(null)},children:u(`system.addressesCard.useHttpAnyway`,`Use http anyway`)}),c(N,{size:`sm`,variant:`ghost`,onClick:()=>b(null),children:u(`common.cancel`,`Cancel`)})]}),i!==null&&c(`div`,{className:`text-[11px] text-red-600 dark:text-red-400`,role:`alert`,children:i})]}),c(ke,{columns:ee,rows:e?.rows??[],rowKey:e=>`${e.kind}-${e.baseUrl}`,minWidthPx:760,bordered:!1,emptyMessage:t?u(`common.loading`,`Loading…`):u(`system.addressesCard.noAddressesAvailable`,`No addresses available.`),rowClassName:e=>e.plausible?void 0:`opacity-80`}),a(`div`,{className:`px-4 py-3 border-t border-border flex flex-wrap items-start gap-2`,children:[a(`div`,{className:`flex-1 min-w-[220px]`,children:[c(me,{value:d,onChange:e=>{p(e.target.value),v(null)},placeholder:`https://cams.example.com or https://192.168.1.50:4443`,"aria-label":u(`system.addressesCard.customAddress`,`Custom address`),disabled:n}),_!==null&&c(`div`,{className:`mt-1 text-[11px] text-red-600 dark:text-red-400`,children:_})]}),c(`div`,{className:`w-48`,children:c(me,{value:h,onChange:e=>g(e.target.value),placeholder:u(`system.addressesCard.labelOptional`,`Label (optional)`),"aria-label":u(`system.addressesCard.customAddressLabel`,`Custom address label`),maxLength:80,disabled:n})}),a(N,{size:`sm`,variant:`secondary`,disabled:n||d.trim()===``,onClick:x,children:[c(w,{className:`h-3 w-3`}),u(`system.addressesCard.addCustomAddress`,`Add custom address`)]})]})]})}e();function ot(){let{t:e}=L(),i=s(),o=()=>{i.invalidateQueries({queryKey:[[`localNetwork`]]})},l=Ae(void 0,{refetchInterval:3e4}),u=xe(void 0),f=ye({onSuccess:o}),p=ve({onSuccess:e=>{w(e.addresses),o()}}),m=n(()=>l.data?.interfaces??[],[l.data]),h=Me({scheme:typeof window<`u`&&window.location.protocol===`https:`?`https`:`http`},{refetchInterval:3e4}),g=Pe({onSuccess:o}),_=Oe({onSuccess:o}),v=Te({onSuccess:o}),x=g.error?.message??_.error?.message??v.error?.message??null,S=g.isPending||_.isPending||v.isPending,[C,w]=r([]),[T,E]=r(!1);t(()=>{!T&&u.data&&(w(u.data.addresses),E(!0))},[u.data,T]);let D=u.data?.addresses??[],O=n(()=>{if(C.length!==D.length)return!0;let e=[...C].toSorted(),t=[...D].toSorted();return e.some((e,n)=>e!==t[n])},[C,D]);return a(B,{embedded:!0,children:[a(`div`,{className:`flex items-center justify-between gap-3 flex-wrap`,children:[c(`p`,{className:`text-xs text-foreground-subtle max-w-2xl`,children:e(`system.networkAddresses.pinWhichHostInterfacesExist`,`Pin which host interfaces exist, then tick what each address is used for. Add a custom address when this hub is reached at one it cannot detect.`)}),c(`div`,{className:`flex items-center gap-2 shrink-0`,children:a(N,{size:`sm`,variant:`secondary`,onClick:()=>{l.refetch(),u.refetch(),h.refetch()},disabled:l.isLoading,children:[c(b,{className:`h-3 w-3 ${l.isLoading?`animate-spin`:``}`}),e(`common.refresh`,`Refresh`)]})})]}),c(Ce,{headingId:`network-allowed-addresses`,title:e(`system.networkAddresses.allowedAddresses`,`Allowed addresses`),actions:a(`div`,{className:`flex flex-wrap items-center gap-1`,children:[a(N,{size:`sm`,variant:`secondary`,onClick:()=>p.mutate(void 0),disabled:p.isPending||f.isPending,title:e(`system.networkAddresses.reRunTheAutoDetection`,`Re-run the auto-detection heuristic + overwrite the current allowlist with the best matches.`),children:[c(y,{className:`h-3 w-3`}),p.isPending?e(`system.networkAddresses.detecting`,`Detecting…`):e(`system.networkAddresses.bestMatch`,`Best match`)]}),a(N,{size:`sm`,variant:`secondary`,onClick:()=>{w([])},disabled:C.length===0||f.isPending,children:[c(te,{className:`h-3 w-3`}),e(`system.networkAddresses.clear`,`Clear`)]}),O&&c(N,{size:`sm`,variant:`secondary`,onClick:()=>{w(D)},disabled:f.isPending,children:e(`system.networkAddresses.discard`,`Discard`)}),a(N,{size:`sm`,variant:`primary`,onClick:()=>{f.mutate({addresses:[...C]})},disabled:!O||f.isPending,children:[c(ee,{className:`h-3 w-3`}),f.isPending?e(`system.networkAddresses.saving`,`Saving…`):e(`common.save`,`Save`)]})]}),children:a(`div`,{className:d,children:[c(`p`,{className:`mb-3 text-xs text-foreground-subtle`,children:C.length===0?e(`system.networkAddresses.autoEveryNonLoopbackNon`,`Auto — every non-loopback / non-link-local interface participates.`):e(`system.networkAddresses.pinned`,`{{value1}} pinned`,{value1:String(C.length)})}),c(et,{mode:`multiple`,interfaces:m,value:C,onChange:w,disabled:f.isPending,emptyMessage:l.isLoading?e(`system.networkAddresses.loadingInterfaces`,`Loading interfaces…`):e(`system.networkAddresses.noInterfacesDetected`,`No interfaces detected.`)})]})}),c(at,{book:h.data,loading:h.isLoading,saving:S,error:x,onSetRole:e=>g.mutate({...e}),onAdd:(e,t)=>_.mutate({baseUrl:e,label:t}),onRemove:e=>v.mutate({baseUrl:e})})]})}e();var st={mesh:`bg-violet-500/15 text-violet-700 dark:text-violet-300`,public:`bg-blue-500/15 text-blue-700 dark:text-blue-300`},X=5e3,Z=`mesh-network`,ct=3e4,lt={joined:!1,meshIp:``,magicDnsHostname:``,peerCount:0,endpoints:[],tenantName:``,magicDnsSuffix:``,userLogin:null,controlPlaneUrl:``,keyExpiry:null};function ut(){let{t:e}=L(),t=F({capName:`mesh-network`},{refetchInterval:X}),r=P(void 0,{refetchInterval:X}),i=n(()=>W(r.data??[]),[r.data]),a=n(()=>(t.data??[]).map(e=>({addonId:e.addonId,displayName:i.get(e.addonId)??e.addonId,isActive:e.isActive})),[t.data,i]),o=[{id:Z,label:e(`system.meshNetworks.meshNetworks`,`Mesh networks`),install:{capability:Z,label:e(`system.meshNetworks.addMesh`,`Add mesh`)},entries:a.map(t=>({id:t.addonId,name:t.displayName,fallbackIcon:k,...U(t.isActive),render:()=>c(V,{addonId:t.addonId,displayName:t.displayName,capName:Z,isActive:t.isActive,badges:c(dt,{addonId:t.addonId}),primaryAction:c(ft,{addonId:t.addonId}),panels:[{id:`status`,title:e(`system.meshNetworks.status`,`Status`),icon:A,content:c(pt,{addonId:t.addonId})}]})}))}];return c(H,{embedded:!0,icon:A,title:e(`system.meshNetworks.meshNetworks2`,`Mesh Networks`),subtitle:e(`system.meshNetworks.privateVpnMeshesThatConnect`,`Private VPN meshes that connect CamStack to your other devices (Tailscale, Headscale, …). Each provider can also expose this hub publicly via its ingress (Tailscale Funnel).`),groups:o,isLoading:t.isLoading,emptyTitle:e(`system.meshNetworks.noMeshNetworkProvidersInstalled`,`No mesh-network providers installed`),emptyDescription:e(`system.meshNetworks.installAMeshAddonE`,`Install a mesh addon (e.g. @camstack/addon-tailscale) to join this hub into a private VPN mesh.`)})}function Q(e){let{data:t,isLoading:n}=ue({addonId:e},{refetchInterval:X,retry:!1}),r=t?ne.safeParse(t):null;return{status:r?.success?r.data:lt,isLoading:n}}function dt({addonId:e}){let{t}=L(),{status:n}=Q(e);return a(o,{children:[c(M,{variant:n.joined?`success`:`default`,className:Ve,children:n.joined?t(`system.meshNetworks.joined`,`Joined`):t(`system.meshNetworks.notJoined`,`Not joined`)}),n.joined&&c(M,{className:`text-[10px]`,children:t(`common.peers`,{count:n.peerCount})})]})}function ft({addonId:e}){let{t}=L(),n=s(),[l,u]=r(!1),[d,f]=r(null),p=D(),{status:m}=Q(e),h=i(()=>{n.invalidateQueries({queryKey:[[`meshNetwork`]]})},[n]),g=de(),_=Ne({onSuccess:h}),v=fe({onSuccess:h}),y=i(async()=>{u(!0);let t={cancelled:!1};f(t);try{let n=await g.mutateAsync({addonId:e});if(t.cancelled)return;n.loginUrl&&window.open(n.loginUrl,`_blank`,`noopener,noreferrer`);let r=Date.now();for(;!t.cancelled&&(await yt(2e3),!t.cancelled);){let t=await p.trpcClient.meshNetwork.getStatus.query({addonId:e}).catch(()=>null),n=t?ne.safeParse(t):null;if(n?.success&&n.data.joined){h();break}if(Date.now()-r>6e5)break}}finally{u(!1),f(null)}},[e,h,g,p]),b=i(()=>{d&&(d.cancelled=!0),u(!1),f(null)},[d]);return c(o,{children:m.joined?a(o,{children:[a(N,{size:`sm`,variant:`secondary`,disabled:_.isPending,onClick:()=>_.mutate({addonId:e}),children:[_.isPending?c(E,{className:`h-3 w-3 animate-spin`}):c(oe,{className:`h-3 w-3`}),t(`system.meshNetworks.disconnect`,`Disconnect`)]}),a(N,{size:`sm`,variant:`ghost`,disabled:v.isPending,onClick:()=>v.mutate({addonId:e}),children:[v.isPending?c(E,{className:`h-3 w-3 animate-spin`}):c(T,{className:`h-3 w-3`}),t(`system.meshNetworks.logOut`,`Log out`)]})]}):l?a(N,{size:`sm`,variant:`ghost`,onClick:b,children:[c(S,{className:`h-3 w-3 mr-1`}),` `,t(`common.cancel`)]}):a(o,{children:[a(N,{size:`sm`,variant:`primary`,onClick:()=>void y(),children:[c(se,{className:`h-3 w-3`}),t(`system.meshNetworks.connect`,`Connect`)]}),a(N,{size:`sm`,variant:`ghost`,disabled:v.isPending,onClick:()=>v.mutate({addonId:e}),children:[v.isPending?c(E,{className:`h-3 w-3 animate-spin`}):c(T,{className:`h-3 w-3`}),t(`system.meshNetworks.logOut`,`Log out`)]})]})})}function pt({addonId:e}){let{t}=L(),{status:n}=Q(e),r=ge({addonId:e},{refetchInterval:ct,retry:!1});return a(`div`,{className:`rounded-lg border border-border bg-surface`,children:[a(`div`,{className:`space-y-4 p-2 sm:p-4`,children:[n.error&&c(we,{message:n.error}),c(mt,{status:n}),n.endpoints.length>0&&a(`div`,{className:`space-y-1.5`,children:[c(`div`,{className:`text-[11px] font-semibold text-foreground-subtle uppercase tracking-wide`,children:t(`system.meshNetworks.endpoints`,`Endpoints`)}),n.endpoints.map(e=>a(`div`,{className:`flex items-center gap-2 text-xs flex-wrap`,children:[a(`span`,{className:`text-[10px] rounded-full px-2 py-0.5 font-medium ${st[e.scope]??`bg-foreground-subtle/15 text-foreground-subtle`}`,children:[e.scope===`public`?c(j,{className:`inline h-2.5 w-2.5 mr-0.5`}):null,e.label]}),a(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,className:`text-emerald-700 dark:text-emerald-300 hover:underline break-all flex items-center gap-1`,children:[c(u,{className:`h-3 w-3 shrink-0`}),e.url]})]},e.id))]})]}),c(`div`,{className:`border-t border-border`,children:c(gt,{peers:r.data?.peers??[],loading:r.isLoading})})]})}function mt({status:e}){let{t}=L();return c(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-1.5`,children:[{label:t(`system.meshNetworks.tenant`,`Tenant`),value:e.tenantName||`—`},{label:t(`system.meshNetworks.user`,`User`),value:e.userLogin??`—`},{label:t(`system.meshNetworks.controlPlane`,`Control plane`),value:e.controlPlaneUrl||`—`},{label:t(`system.meshNetworks.meshIp`,`Mesh IP`),value:e.meshIp||`—`,mono:!0},{label:t(`system.meshNetworks.magicdns`,`MagicDNS`),value:e.magicDnsHostname||`—`,mono:!0},{label:t(`system.meshNetworks.dnsSuffix`,`DNS suffix`),value:e.magicDnsSuffix||`—`,mono:!0},{label:t(`system.meshNetworks.peers`,`Peers`),value:String(e.peerCount)},{label:t(`system.meshNetworks.keyExpiry`,`Key expiry`),value:e.keyExpiry?ht(e.keyExpiry):`—`}].map(e=>a(`div`,{className:`flex items-baseline justify-between gap-3 text-xs`,children:[c(`span`,{className:`text-foreground-subtle shrink-0`,children:e.label}),c(`span`,{className:`text-foreground truncate ${e.mono?`font-mono`:``}`,children:e.value})]},e.label))})}function ht(e){let t=e-Date.now();if(t<0)return I.t(`system.meshNetworks.expiredAgo`,{when:$(e)});let n=Math.floor(t/864e5);if(n>60)return new Date(e).toLocaleDateString();if(n>1)return I.t(`system.meshNetworks.expiryDays`,{count:n});let r=Math.floor(t/36e5);return r>1?I.t(`system.meshNetworks.expiryHours`,{count:r}):I.t(`system.meshNetworks.expiryMin`,{count:Math.max(1,Math.floor(t/6e4))})}function gt({peers:e,loading:t}){let{t:r}=L(),o=n(()=>e.map(e=>({...e,_id:e.id})),[e]),s=i(e=>{e&&navigator.clipboard?.writeText(e)},[]),l=n(()=>[{key:`hostname`,header:r(`system.meshNetworks.hostname`,`Hostname`),render:e=>a(`div`,{className:`flex flex-col`,children:[a(`div`,{className:`flex items-center gap-1.5`,children:[c(`span`,{className:`font-medium text-foreground`,children:e.hostname||r(`system.meshNetworks.unknown`,`(unknown)`)}),e.isSelf&&c(M,{variant:`info`,children:r(`common.self`)}),e.exitNodeOption&&c(M,{variant:`warning`,children:`exit-node`})]}),e.userLogin&&c(`div`,{className:`text-[10px] text-foreground-subtle truncate`,children:e.userLogin})]})},{key:`magicDns`,header:r(`system.meshNetworks.magicdns`,`MagicDNS`),render:e=>e.magicDns?a(`div`,{className:`flex items-center gap-1`,children:[c(`span`,{className:`font-mono text-xs truncate`,children:e.magicDns}),c(`button`,{onClick:()=>s(e.magicDns),className:`p-0.5 hover:bg-foreground-subtle/10 rounded`,"aria-label":r(`system.meshNetworks.copyMagicdns`,`Copy MagicDNS`),children:c(v,{className:`h-3 w-3 text-foreground-subtle`})})]}):c(`span`,{className:`text-foreground-subtle`,children:`—`})},{key:`addresses`,header:`IP`,render:e=>{let t=e.addresses[0]??``;return t?a(`div`,{className:`flex items-center gap-1`,children:[c(`span`,{className:`font-mono text-xs`,children:t}),c(`button`,{onClick:()=>s(t),className:`p-0.5 hover:bg-foreground-subtle/10 rounded`,"aria-label":r(`system.meshNetworks.copyIp`,`Copy IP`),children:c(v,{className:`h-3 w-3 text-foreground-subtle`})})]}):c(`span`,{className:`text-foreground-subtle`,children:`—`})}},{key:`connection`,header:r(`system.meshNetworks.connection`,`Connection`),render:e=>a(`div`,{className:`flex items-center gap-1.5`,children:[c(M,{variant:_t(e.connection),children:e.connection}),e.relay&&c(`span`,{className:`text-[10px] text-foreground-subtle font-mono`,children:e.relay})]})},{key:`routes`,header:r(`system.meshNetworks.routes`,`Routes`),render:e=>e.advertisedRoutes.length>0?c(`span`,{className:`text-[10px] font-mono text-foreground-subtle truncate`,children:e.advertisedRoutes.join(`, `)}):c(`span`,{className:`text-foreground-subtle`,children:`—`})},{key:`tx`,header:r(`system.meshNetworks.txRx`,`TX / RX`),render:e=>a(`span`,{className:`text-[10px] text-foreground-subtle font-mono`,children:[`↑ `,vt(e.txBytes),` · ↓ `,vt(e.rxBytes)]})},{key:`lastSeen`,header:r(`system.meshNetworks.lastSeen`,`Last seen`),render:e=>c(`span`,{className:`text-[10px] text-foreground-subtle`,children:e.lastSeenMs>0?$(e.lastSeenMs):`—`})}],[s,r]);return t&&e.length===0?a(`div`,{className:`p-4 text-xs text-foreground-subtle`,children:[c(E,{className:`h-3 w-3 animate-spin inline mr-1`}),` `,r(`systemPage.meshNetworks.loadingPeers`)]}):e.length===0?c(`div`,{className:`p-4 text-xs text-foreground-subtle`,children:r(`system.meshNetworks.noPeersVisibleYourTailnet`,`No peers visible — your tailnet may be empty or the host is not joined.`)}):c(`div`,{className:`p-4`,children:c(ke,{columns:l,rows:o,rowKey:e=>e._id,minWidthPx:820})})}function _t(e){return e===`direct`?`success`:e===`relay`?`warning`:`info`}function vt(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:e<1024*1024*1024?`${(e/1024/1024).toFixed(1)}MB`:`${(e/1024/1024/1024).toFixed(2)}GB`}function $(e){let t=Date.now()-e;return t<6e4?I.t(`system.meshNetworks.justNow`):t<36e5?I.t(`system.meshNetworks.agoMin`,{count:Math.round(t/6e4)}):t<864e5?I.t(`system.meshNetworks.agoHour`,{count:Math.round(t/36e5)}):I.t(`system.meshNetworks.agoDay`,{count:Math.round(t/864e5)})}function yt(e){return new Promise(t=>setTimeout(t,e))}var bt=`/system/identity?tab=certificates`;function xt(){let{t:e}=L();return c(B,{embedded:!0,children:a(`div`,{className:p,children:[c(Be,{nodeId:`hub`,addonIds:[`local-network`],level:`global`,title:e(`system.localAccess.lanHttp`,`LAN HTTP`),description:e(`system.localAccess.nativeAppsOnThisWi`,`Native apps on this Wi-Fi use http:// and skip the private certificate. The tunnel and this admin UI stay on HTTPS.`)}),a(`p`,{className:`text-xs text-foreground-subtle`,"data-testid":`https-certificate-hint`,children:[e(`system.localAccess.certificateMoved`,`The HTTPS certificate and the local CA are managed under`),` `,c(Ie,{className:`underline`,to:bt,children:e(`system.localAccess.certificateMovedLink`,`Identity → Certificates`)}),`.`]})]})})}e();function St({value:e,onChange:t}){let{t:r}=L(),{data:i}=_e({isCamera:!0,projection:`slim`}),o=n(()=>i===void 0?[{value:``,label:r(`system.networkDiagnostics.loadingCameras`,`Loading cameras…`)}]:i.length===0?[{value:``,label:r(`system.networkDiagnostics.noCameras`,`No cameras`)}]:[{value:``,label:r(`system.networkDiagnostics.pickACamera`,`Pick a camera`)},...i.toSorted((e,t)=>e.name.localeCompare(t.name)).map(e=>({value:String(e.id),label:`${e.name} (#${String(e.id)})`}))],[i,r]);return a(`label`,{className:`flex min-w-0 flex-col gap-1`,children:[c(`span`,{className:`text-[11px] text-foreground-subtle`,children:r(`system.networkDiagnostics.camera`,`Camera`)}),c(he,{value:e===null?``:String(e),disabled:i===void 0||i.length===0,onChange:e=>t(e.target.value===``?null:Number(e.target.value)),options:o})]})}function Ct(){let e=D(),[t,n]=r(null);return c(B,{embedded:!0,children:a(`div`,{className:p,"data-testid":`network-diagnostics`,children:[c(be,{loadServers:i(async()=>e.trpcClient.turnProvider.getTurnServers.query(),[e])}),c(De,{trpc:e.trpcClient,serverUrl:_(),deviceId:t,cameraField:c(St,{value:t,onChange:n})})]})})}var wt=[`certificate`,`certificates`,`https`];function Tt(){let{t:e}=L(),[t]=Re();if(wt.includes(t.get(`tab`)??``))return c(Fe,{to:bt,replace:!0});let n=Le(`/system/network`,{t:e,isAdmin:!0})??{icon:j,title:e(`system.network`,`Network`)};return c(ze,{icon:n.icon,title:n.title,defaultSection:`addresses`,sectionsLabel:`${n.title} sections`,sections:[{id:`local-access`,label:e(`systemPage.network.localAccess`,`Local access`),content:c(xt,{})},{id:`addresses`,label:e(`systemPage.network.networkAddresses`,`Network Addresses`),content:c(ot,{})},{id:R.remoteAccess.tab,label:e(`systemPage.network.remoteAccess`,`Remote Access`),content:c(Ue,{}),ownedParams:z},{id:R.mesh.tab,label:e(`systemPage.network.meshNetworks`,`Mesh Networks`),content:c(ut,{}),ownedParams:z},{id:R.turn.tab,label:e(`systemPage.network.turnServers`,`TURN Servers`),content:c(Ye,{}),ownedParams:z},{id:`diagnostics`,label:e(`systemPage.network.diagnostics`,`Diagnostics`),content:c(Ct,{})}]})}export{Tt as NetworkPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,A as t,B as n,G as r,J as i,L as a,S as o,U as s,i as c,o as l,p as u,q as d,t as f,x as p}from"./_virtual_mf___mfe_internal__admin_ui_host__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-CEHpkaJP.js";import{ot as m}from"./player-overlays-B2uKzPiF.js";import{Ri as h}from"./client-DUabg_ow.js";import{Di as g,Xr as _,Zr as v,ft as y,oi as ee,va as te}from"./src-N0x0aMoc.js";import{t as ne}from"./useTranslation-D3Is_4B6.js";import{B as b,L as re,R as ie,z as x}from"./index-DKfAHLRf.js";e();var S=t(function({addonId:e,schema:t,serverValues:i,onImmediateSave:o,onStateChange:c,onAction:l,disabled:u},f){let m=b({schema:t,serverValues:i,onImmediateSave:a(t=>o(e,t),[e,o]),onDeferredSave:a(()=>{},[])});s(f,()=>({flush:()=>{let e={};for(let t of m.pendingKeys)e[t]=m.values[t];return m.handleDiscard(m.pendingKeys),e},discard:()=>m.resetAll()}),[m]);let h=m.pendingKeys,g=h.join(`|`),_=r(()=>h.map(e=>`${e}=${JSON.stringify(m.values[e])}`).join(`,`),[h,m.values]),v=d(c);n(()=>{v.current=c},[c]),n(()=>{let t={};for(let e of h)t[e]=m.values[e];v.current({addonId:e,pendingKeys:h,pendingValues:t})},[e,g,_]);let y=r(()=>{if(l)return(t,n,r)=>l(e,t,n,r)},[e,l]);return p(x,{schema:t,values:m.values,onChange:m.handleChange,disabled:u,onAction:y})});function C(e){return`perNode`in e&&e.perNode===!0}function w(e,t){if(e.type===`group`){let n=T(e.fields,t);return n.length>0?{...e,fields:n}:null}if(e.type===`sub-tabs`){let n=e.tabs.map(e=>({...e,fields:T(e.fields,t)})).filter(e=>e.fields.length>0);return n.length>0?{...e,tabs:n}:null}return C(e)===(t===`perNode`)?e:null}function T(e,t){let n=[];for(let r of e){let e=w(r,t);e!==null&&n.push(e)}return n}function ae(e,t){let n=[];for(let r of e.sections){let e=T(r.fields,t);e.length!==0&&n.push({...r,fields:e})}return{...e,sections:n}}function oe(e,t){let n=e??`general`;return t?.[n]??n}function E(e){return typeof e!=`object`||!e||!(`key`in e)?null:typeof e.key==`string`?e.key:null}function se(e,t){let n=t.fieldKeys===void 0?null:new Set(t.fieldKeys),r=[];for(let i of e){let e=n===null?i.fields:i.fields.filter(e=>{let t=E(e);return t!==null&&n.has(t)});e.length!==0&&r.push({...i,fields:e,...t.tabAliases===void 0?{}:{tab:oe(i.tab,t.tabAliases)},...t.hideSectionChrome===!0?{title:``,description:void 0}:{}})}return r}e();function D(e,t){if(e.type===`separator`||e.type===`info`||e.type===`button`)return e;if(e.type===`group`){let n=e.fields.map(e=>D(e,t));return{...e,fields:n}}let n=e;t[e.key]=n.value;let{value:r,...i}=n;return i}function O(e,t){return{...e,fields:e.fields.map(e=>D(e,t))}}function ce(e){let t={};return{schema:{...e.tabs?{tabs:e.tabs}:{},sections:e.sections.map(e=>O(e,t))},values:t}}function k({nodeId:e,addonIds:t,level:n,deviceId:s,capability:b,sectionIds:x,omitSectionIds:S,fieldKeys:C,hideSectionChrome:w,tabAliases:T,tabLabelOverrides:E,sectionTab:D,fieldScope:O,surface:k,emptyMessage:ue,extraTabs:A,schemaTabExtras:j,title:M,description:N,selfTabbed:de,activeTab:fe,onActiveTabChange:pe}){let{t:P}=ne(),F=l(),I=m().trpcClient,L=v(),R=_(),me=te(),z=g(),B=de===!0||!!(A&&A.length>0),[he,ge]=i(null);if(n===`device`&&!s)throw Error(`NodeAddonsSettingsPanel: deviceId is required when level === "device"`);if(k!==void 0){if(n!==`global`||s!==void 0)throw Error(`NodeAddonsSettingsPanel: integration-level settings are addon-wide — they cannot be mounted at device level or with a deviceId. A second page, never a second scope.`);if(e!==null)throw Error(`NodeAddonsSettingsPanel: an integration has no node behind it — pass nodeId={null}. Received ${JSON.stringify(e)}.`);if(O!==void 0)throw Error("NodeAddonsSettingsPanel: integration-level settings arrive already cluster-scoped from core — remove `fieldScope` rather than restating it.")}let V=e??`hub`,H=c({queries:t.map(e=>({queryKey:[[`addonSettings`,k===void 0?n===`global`?`getGlobalSettings`:`getDeviceSettings`:`getIntegrationSettings`],{addonId:e,nodeId:V,deviceId:s??null,cap:b??null,scope:O??null}],queryFn:async()=>{let t=e=>e!==null&&O!==void 0?ae(e,O):e;return k===void 0?n===`global`?{addonId:e,result:t(await I.addonSettings.getGlobalSettings.query({addonId:e,nodeId:V,...b?{cap:b}:{}}))}:{addonId:e,result:t(await I.addonSettings.getDeviceSettings.query({addonId:e,deviceId:s,nodeId:V}))}:{addonId:e,result:await I.addonSettings.getIntegrationSettings.query({addonId:e,nodeId:V})}},placeholderData:u}))}),_e=H.some(e=>e.isLoading),ve=H.map(e=>{if(!e.data)return`-`;if(e.data.result===null)return`${e.data.addonId}:n`;let t=[];for(let n of e.data.result.sections){t.push(`s:${n.id}:${n.tab??`general`}`);for(let e of n.fields){if(!(`key`in e))continue;let n=`options`in e&&Array.isArray(e.options)?e.options.map(e=>e.value).join(`,`):``,r=e.value,i=r===void 0?``:typeof r==`string`?r:JSON.stringify(r);t.push(`f:${e.key}:${n}:${i}`)}}return`${e.data.addonId}:${t.join(`|`)}`}).join(`||`),U=r(()=>{let e=new Set;for(let t of H){let n=t.data?.result?.sections;if(n)for(let t of n)e.add(oe(t.tab,T))}return[...e]},[T,ve+`::`+H.map(e=>(e.data?.result?.sections??[]).map(e=>e.tab??`general`).join(`,`)).join(`::`)]),W=r(()=>new Map((A??[]).map(e=>[e.id,e])),[A]),G=r(()=>{if(!B)return[];let e=[...new Set([...U,...(A??[]).map(e=>e.id),...(j??[]).map(e=>e.tabId)])],t=e=>{let t=W.get(e);if(t?.order!==void 0)return t.order;let n=h[e];return n?n.order:50};return e.toSorted((e,n)=>{let r=t(e),i=t(n);return r===i?e.localeCompare(n):r-i})},[B,U,A,W,j]),ye=r(()=>{let e=new Map,t=e=>h[e]?.label??e.charAt(0).toUpperCase()+e.slice(1);for(let n of U)e.set(n,t(n));for(let n of j??[])e.has(n.tabId)||e.set(n.tabId,t(n.tabId));for(let t of A??[])e.set(t.id,t.label);for(let[t,n]of Object.entries(E??{}))e.set(t,n);return e},[U,A,j,E]),K=fe===void 0?he:fe,q=B?K&&G.includes(K)?K:G[0]??null:null,be=e=>{ge(e),pe?.(e)},xe=q!==null&&W.has(q),J=B?q&&!xe?q:void 0:D,{data:Se}=ee(void 0),Ce=r(()=>{let e=new Map;for(let t of Se??[]){let n=t.manifest?.id;if(!n)continue;let r=t.manifest?.name??t.manifest?.packageDisplayName??n;e.set(n,r)}return e},[Se]),we=d(new Map),Y=r(()=>{let e=x?new Set(x):null,t=S?new Set(S):null,n=n=>!(e!==null&&!e.has(n)||t!==null&&t.has(n)),r=[];for(let e of H){if(!e.data)continue;let t=e.data.result??we.current.get(e.data.addonId)??null;if(e.data.result!==null&&we.current.set(e.data.addonId,e.data.result),t===null)continue;let{schema:i,values:a}=ce(t),o={...C===void 0?{}:{fieldKeys:C},...w===void 0?{}:{hideSectionChrome:w},...T===void 0?{}:{tabAliases:T}},s=se(i.sections.filter(e=>n(e.id)),o);if(s.length===0)continue;let c={...t,sections:se(t.sections.filter(e=>n(e.id)),o)},l={...i,sections:s};r.push({addonId:e.data.addonId,schemaWithValues:c,schema:l,serverValues:a})}return r},[ve,x,S,C,w,T]),[X,Te]=i(new Map),Ee=a(e=>{Te(t=>{let n=new Map(t);return n.set(e.addonId,e),n})},[]),Z=d(new Map),De=a(e=>t=>{t?Z.current.set(e,t):Z.current.delete(e)},[]),Oe=a(async(e,t)=>{n===`global`?await L.mutateAsync({addonId:e,nodeId:V,patch:t}):await R.mutateAsync({addonId:e,deviceId:s,nodeId:V,patch:t}),F.invalidateQueries({queryKey:[[`addonSettings`]]})},[L,R,V,n,s,F]),ke=a(async(e,t,n,r)=>{let i=V;try{switch(t){case`reprobe-hwaccel`:await me.mutateAsync({nodeId:i}),F.invalidateQueries({queryKey:[[`addonSettings`]]});return;case`reprobe-audio-engine`:await z.mutateAsync({nodeId:i}),F.invalidateQueries({queryKey:[[`addonSettings`]]});return;default:{let n=await I.addons.custom.mutate({addonId:e,action:t,input:r});return F.invalidateQueries({queryKey:[[`addonSettings`]]}),n}}}catch(n){throw console.error(`[NodeAddonsSettingsPanel] action failed`,{addonId:e,action:t,err:n}),n}},[me,z,V,F,I]),Ae=a((e,t)=>{Oe(e,t)},[Oe]),Q=f({mutationFn:async()=>{let e=[];for(let t of Y){let n=X.get(t.addonId);!n||n.pendingKeys.length===0||e.push({addonId:t.addonId,patch:n.pendingValues})}return e.length===0?{saved:[]}:{saved:await Promise.all(e.map(async({addonId:e,patch:t})=>(n===`global`?await L.mutateAsync({addonId:e,nodeId:V,patch:t}):await R.mutateAsync({addonId:e,deviceId:s,nodeId:V,patch:t}),e)))}},onSuccess:({saved:e})=>{for(let t of e)Z.current.get(t)?.discard();F.invalidateQueries({queryKey:[[`addonSettings`]]})}}),je=a(()=>{for(let e of Z.current.values())e.discard()},[]),Me=r(()=>{let e=0;for(let t of Y){let n=X.get(t.addonId);n&&(e+=n.pendingKeys.length)}return e},[Y,X]),Ne=r(()=>{let e=new Map;for(let t of Y){let n=X.get(t.addonId);if(!n||n.pendingKeys.length===0)continue;let r=new Set(n.pendingKeys);for(let n of t.schema.sections){let t=n.tab??`general`;for(let i of n.fields)`key`in i&&r.has(i.key)&&e.set(t,(e.get(t)??0)+1)}}return e},[Y,X]);if(_e)return p(`div`,{className:`h-24 rounded-lg border border-border bg-surface animate-pulse`});let $=q&&xe?W.get(q):void 0;if(!B&&Y.length===0)return p(`div`,{className:`text-[11px] text-foreground-subtle italic`,children:ue??P(`settings.nodeAddonsSettingsPanel.noAddonsIn`,{scope:t.length>0?`[${t.join(`, `)}]`:P(`settings.nodeAddonsSettingsPanel.theCurrentSelection`,`the current selection`),level:n})});let Pe=Q.isPending;return o(`div`,{className:`space-y-4`,children:[(M||N)&&o(`div`,{className:`border-b border-border pb-2`,children:[M&&p(`h2`,{className:`text-sm font-semibold text-foreground`,children:M}),N&&p(`p`,{className:`text-[11px] text-foreground-subtle mt-0.5`,children:N})]}),B&&p(re,{tabs:G.map(e=>({id:e,label:ye.get(e)??e})),activeId:q,onChange:be,pendingByTab:Ne}),Q.isError&&o(`div`,{className:`rounded-md border border-red-500/40 bg-red-500/10 px-3 py-2 text-[11px] text-red-400`,children:[P(`settings.nodeAddonsSettingsPanel.saveFailed`,`Save failed:`),` `,String(Q.error?.message??Q.error)]}),p(y,{tabKey:$?`extra:${q??``}`:`tab:${q??``}`,children:$?$.content:(()=>{let e=J?Y.reduce((e,t)=>e+t.schemaWithValues.sections.filter(e=>(e.tab??`general`)===J).length,0):0,t=!!J&&e<=1,n=Y.map(e=>({...e,renderedWithValues:{...e.schemaWithValues,sections:e.schemaWithValues.sections.filter(e=>J?(e.tab??`general`)===J:!0).map(e=>t?{...e,title:``,description:void 0}:e)}})).filter(e=>e.renderedWithValues.sections.length>0).toSorted((e,t)=>{let n=e=>{let t=1/0;for(let n of e)typeof n.order==`number`&&n.order<t&&(t=n.order);return t},r=n(e.renderedWithValues.sections),i=n(t.renderedWithValues.sections);return r===i?0:r-i}),r=(j??[]).filter(e=>e.tabId===J),i=r.filter(e=>(e.placement??`before`)===`before`),a=r.filter(e=>e.placement===`after`);return n.length===0&&r.length===0?p(`div`,{className:`text-[11px] text-foreground-subtle italic`,children:ue??P(`settings.nodeAddonsSettingsPanel.nothingToConfigureHereFor`,`Nothing to configure here for this node.`)}):o(`div`,{className:`space-y-6`,children:[i.map((e,t)=>p(`div`,{children:e.content},`extra-before-${t}`)),n.length>0&&p(le,{entries:n,paneStates:X,displayNames:Ce,disabled:Pe,setPaneRef:De,onPaneStateChange:Ee,onImmediateSave:Ae,onAction:ke,inline:B||!!D}),a.map((e,t)=>p(`div`,{children:e.content},`extra-after-${t}`))]})})()}),!_e&&p(ie,{pendingCount:Me,onSave:()=>Q.mutate(),onDiscard:je,saving:Pe})]})}function le({entries:e,paneStates:t,displayNames:a,disabled:s,setPaneRef:c,onPaneStateChange:l,onImmediateSave:u,onAction:d,inline:f}){let m=r(()=>[...e].toSorted((e,t)=>{if(e.addonId===`system-config`)return-1;if(t.addonId===`system-config`)return 1;let n=a.get(e.addonId)??e.addonId,r=a.get(t.addonId)??t.addonId;return n.localeCompare(r)}),[e,a]),[h,g]=i(m[0]?.addonId??``);n(()=>{m.length!==0&&(m.find(e=>e.addonId===h)||g(m[0].addonId))},[m,h]);let _=m.find(e=>e.addonId===h)??m[0];if(!_)return null;let v=r(()=>d?(e,t,n,r)=>d(e,t,n,r):void 0,[d]),y=e=>p(S,{ref:c(e.addonId),addonId:e.addonId,schema:e.renderedWithValues,serverValues:e.serverValues,onImmediateSave:u,onStateChange:l,onAction:v,disabled:s},e.addonId);return m.length===1||f?p(`div`,{className:`flex flex-col gap-4`,children:m.map(y)}):o(`div`,{className:`flex flex-col gap-3`,children:[p(`div`,{className:`flex flex-wrap items-center gap-1 border-b border-border shrink-0`,children:m.map(e=>{let n=a.get(e.addonId)??e.addonId,r=e.addonId===_.addonId,i=(t.get(e.addonId)?.pendingKeys.length??0)>0;return o(`button`,{type:`button`,onClick:()=>g(e.addonId),className:`relative px-3 py-1.5 text-xs font-medium rounded-t-md transition-colors -mb-px border-b-2 whitespace-nowrap ${r?`text-primary border-primary bg-primary/5`:`text-foreground-subtle border-transparent hover:text-foreground hover:bg-surface-hover`}`,children:[n,i&&p(`span`,{className:`ml-1.5 inline-flex h-1.5 w-1.5 rounded-full bg-amber-400`})]},e.addonId)})}),p(`div`,{className:`space-y-2`,children:m.map(e=>p(`div`,{style:e.addonId===_.addonId?void 0:{display:`none`},children:y(e)},e.addonId))})]})}export{k as t};
|