@objectstack/console 9.9.1 → 9.11.0
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/{AdapterProvider-DJb3ZVmJ.js → AdapterProvider-DQfb2hDB.js} +1 -1
- package/dist/assets/{AiPendingActionsPage-BI-QQNee.js → AiPendingActionsPage-DBH0IlpT.js} +1 -1
- package/dist/assets/{ApiConsolePage-B6QExly9.js → ApiConsolePage-BV14INY2.js} +1 -1
- package/dist/assets/{AppDocsIndex-S-ilhz4W.js → AppDocsIndex-C22gKPwi.js} +1 -1
- package/dist/assets/{AppManagementPage-JgLQ-wXj.js → AppManagementPage-DTh0NujK.js} +1 -1
- package/dist/assets/{ApprovalsInboxPage-CAyznoRP.js → ApprovalsInboxPage-C0mBPkCR.js} +1 -1
- package/dist/assets/{AuditLogPage-BeEqEy4g.js → AuditLogPage-B_Zg_tx5.js} +1 -1
- package/dist/assets/{ComponentNavView-DmALsugj.js → ComponentNavView-BhShg1Hw.js} +1 -1
- package/dist/assets/ConsoleFloatingChatbot-Ct9u34kL.js +1 -0
- package/dist/assets/{DashboardView-P--eXDC-.js → DashboardView-D3oJL44H.js} +1 -1
- package/dist/assets/{DashboardWidgetInspector-VPDtQEP_.js → DashboardWidgetInspector-BhjBPVJV.js} +1 -1
- package/dist/assets/{DeveloperHubPage-DbQwi1EV.js → DeveloperHubPage--9rLh7im.js} +1 -1
- package/dist/assets/{ExpressionProvider-DKFCgLsJ.js → ExpressionProvider-B9tL1RMW.js} +1 -1
- package/dist/assets/{FlowRunsPage-CCS9xNVc.js → FlowRunsPage-CDYR2nha.js} +1 -1
- package/dist/assets/{IntegrationsPage-DU_wvj4-.js → IntegrationsPage-CMt7Atqp.js} +2 -2
- package/dist/assets/InterfaceListPage-CIYeUsaL.js +1 -0
- package/dist/assets/{ManagedByBadge-Difq_L_A.js → ManagedByBadge-BF_1ck8d.js} +1 -1
- package/dist/assets/{MarketplaceAccessDenied-CXUE33gy.js → MarketplaceAccessDenied-DvMKTKZG.js} +1 -1
- package/dist/assets/{MarketplaceInstalledPage-CBfcARvX.js → MarketplaceInstalledPage-DBh3sDdm.js} +1 -1
- package/dist/assets/MarketplacePackagePage-DuZ5A7L3.js +4 -0
- package/dist/assets/MarketplacePage-8XMnemHc.js +1 -0
- package/dist/assets/{MetadataInspector-BRICMLXW.js → MetadataInspector-BcJZckHC.js} +1 -1
- package/dist/assets/MetadataProvider-xgIDLxXw.js +1 -0
- package/dist/assets/PageView-pabqNsbK.js +1 -0
- package/dist/assets/{ProfilePage-BAtKSxuK.js → ProfilePage-CPP3LKyF.js} +1 -1
- package/dist/assets/PublicFormsPage-CJz8WQst.js +1 -0
- package/dist/assets/RecordDetailView-Dg0FtCgX.js +9 -0
- package/dist/assets/{RecordFormPage-BUfFijzM.js → RecordFormPage-Dh_BBkOw.js} +1 -1
- package/dist/assets/{ReportDefaultInspector-C8gR3RMr.js → ReportDefaultInspector-bXn7Ud0K.js} +1 -1
- package/dist/assets/{ReportView-DSrtPxzA.js → ReportView-CYKdWMWV.js} +1 -1
- package/dist/assets/{RuntimeDraftBar-B2fJIAhv.js → RuntimeDraftBar-CpfEHMPU.js} +1 -1
- package/dist/assets/{SearchResultsPage-C7i-b3gn.js → SearchResultsPage-BPgmZAb1.js} +1 -1
- package/dist/assets/{SettingsHub-BLEC_8Ao.js → SettingsHub-B47RbJU1.js} +1 -1
- package/dist/assets/{SettingsView-BEjR60F6.js → SettingsView-B75wJU1L.js} +1 -1
- package/dist/assets/{SystemHubPage-DWGnZfF0.js → SystemHubPage-DFwicwZT.js} +1 -1
- package/dist/assets/assistantBus-3d9MxsCF.js +1 -0
- package/dist/assets/{data-adapter-CCidkDs3.js → data-adapter-Hh2YXzlW.js} +1 -1
- package/dist/assets/{framework-BLEk-ou3.js → framework-DCMHw4uc.js} +6 -6
- package/dist/assets/{highlighted-body-OFNGDK62-DiT7C6XW.js → highlighted-body-OFNGDK62-0aDolIZW.js} +1 -1
- package/dist/assets/index-DIwBADyw.css +2 -0
- package/dist/assets/index-OUEQY-pz.js +4 -0
- package/dist/assets/mergeServerFields-DLHgCyyI.js +7 -0
- package/dist/assets/mermaid-GHXKKRXX-BkPYaQdJ.js +1 -0
- package/dist/assets/metadata-admin-CLro8Vr2.js +19 -0
- package/dist/assets/{plugin-calendar-DQC9zdKq.js → plugin-calendar-BnAXrMpl.js} +1 -1
- package/dist/assets/{plugin-charts-AMObsZz3.js → plugin-charts-CqgNZ5dQ.js} +2 -2
- package/dist/assets/{plugin-chatbot-Ch8YIyYL.js → plugin-chatbot-76fXVh9-.js} +6 -6
- package/dist/assets/plugin-dashboard-lpyBUnU3.js +5 -0
- package/dist/assets/{plugin-form-DXCdD2d-.js → plugin-form-DjP7n76r.js} +1 -1
- package/dist/assets/plugin-gantt-BRce7Qx4.js +39 -0
- package/dist/assets/plugin-grid-3MIxvbIs.js +6 -0
- package/dist/assets/plugin-kanban-BY5U45PP.js +1 -0
- package/dist/assets/{plugin-map-Bid9UXOR.js → plugin-map-C3ZvB3-I.js} +1 -1
- package/dist/assets/{plugin-markdown-BUQOG31j.js → plugin-markdown-C0Wtx408.js} +1 -1
- package/dist/assets/plugin-report-CjGy4oCX.js +59 -0
- package/dist/assets/{plugin-timeline-DDrFKEb8.js → plugin-timeline-BStIRl3O.js} +1 -1
- package/dist/assets/plugin-view-C15Djdpb.js +1 -0
- package/dist/assets/plugins-views-DvIN271Q.js +4 -0
- package/dist/assets/{skeletons-B_SNEnMn.js → skeletons-Y2db5nbR.js} +1 -1
- package/dist/assets/{src-DbxuLwqh.js → src-BLxLm3Xq.js} +1 -1
- package/dist/assets/src-ChUzpvnF.js +2 -0
- package/dist/assets/{types-CosU35As.js → types-C6YwlE8G.js} +1 -1
- package/dist/assets/ui-components-D1FYlKrM.js +42 -0
- package/dist/assets/ui-layout-CL-1JYQ8.js +1 -0
- package/dist/assets/useActionModal-Dz0k3wwf.js +1 -0
- package/dist/assets/useReconcileOnError-Cxzq30_3.js +1 -0
- package/dist/assets/{utils-bipVuqQL.js → utils-29quoGQV.js} +1 -1
- package/dist/index.html +4 -4
- package/package.json +1 -1
- package/dist/assets/ConsoleFloatingChatbot-D13eK4M8.js +0 -1
- package/dist/assets/InterfaceListPage-B3jzgT27.js +0 -1
- package/dist/assets/MarketplacePackagePage-DOZgrTZo.js +0 -4
- package/dist/assets/MarketplacePage-BT-WkhAG.js +0 -1
- package/dist/assets/MetadataProvider-Bja7m8Gt.js +0 -1
- package/dist/assets/PageView-My4nP5w4.js +0 -1
- package/dist/assets/PublicFormsPage-CcRFrTQC.js +0 -1
- package/dist/assets/RecentItemsProvider-B76qldBH.js +0 -1
- package/dist/assets/RecordDetailView-CMIRy42W.js +0 -1
- package/dist/assets/index-BgnAjV6_.js +0 -4
- package/dist/assets/index-CJe1zUD0.css +0 -2
- package/dist/assets/mergeServerFields-zZ2r6yTA.js +0 -7
- package/dist/assets/mermaid-GHXKKRXX-CK-9EMhD.js +0 -1
- package/dist/assets/metadata-admin-BgoJzjrj.js +0 -19
- package/dist/assets/plugin-dashboard-C7fxXXeO.js +0 -5
- package/dist/assets/plugin-gantt-BHmpu6VX.js +0 -23
- package/dist/assets/plugin-grid-boi_rkH3.js +0 -6
- package/dist/assets/plugin-kanban-DOsTOpJz.js +0 -1
- package/dist/assets/plugin-report-FxG9jOvy.js +0 -59
- package/dist/assets/plugin-view-D58aYgqA.js +0 -1
- package/dist/assets/plugins-views-DUKPQNs8.js +0 -4
- package/dist/assets/resolveActionParams-xmwfLvud.js +0 -9
- package/dist/assets/src-DXFkWHTV.js +0 -2
- package/dist/assets/ui-components-CrPYFyEM.js +0 -42
- package/dist/assets/ui-layout-DAWxaQvy.js +0 -1
- package/dist/assets/useActionModal-DsVCm46J.js +0 -1
- package/dist/assets/useReconcileOnError-D6sIYKrb.js +0 -1
package/dist/assets/{DashboardWidgetInspector-VPDtQEP_.js → DashboardWidgetInspector-BhjBPVJV.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{R as r,l as i,m as a}from"./vendor-objectstack-BNd856rx.js";import{$n as o,$o as s,As as c,Br as l,Bt as u,Ht as d,Is as f,Ms as p,Na as m,Ns as h,Ps as g,Qr as _,Si as v,Sr as y,Ui as b,Ut as x,Vo as S,Vt as C,Wo as w,Wt as T,fc as E,hr as D,io as O,ks as ee,nn as k,on as A,to as j}from"./ui-components-CrPYFyEM.js";import{_ as M,b as N,g as P,h as F,i as I,n as te,p as ne,t as re,v as L,y as R}from"./mergeServerFields-zZ2r6yTA.js";var z=e(t(),1),B={metric:{id:`metric`,label:`Metric (KPI)`,category:`kpi`,icon:j},bar:{id:`bar`,label:`Bar chart`,category:`chart`,icon:p},"horizontal-bar":{id:`horizontal-bar`,label:`Horizontal bar`,category:`chart`,icon:h},line:{id:`line`,label:`Line chart`,category:`chart`,icon:g},area:{id:`area`,label:`Area chart`,category:`chart`,icon:f},pie:{id:`pie`,label:`Pie chart`,category:`chart`,icon:c},donut:{id:`donut`,label:`Donut chart`,category:`chart`,icon:S},scatter:{id:`scatter`,label:`Scatter plot`,category:`chart`,icon:ee},funnel:{id:`funnel`,label:`Funnel`,category:`chart`,icon:l},table:{id:`table`,label:`Data table`,category:`data`,icon:_},pivot:{id:`pivot`,label:`Pivot table`,category:`data`,icon:w},list:{id:`list`,label:`Record list`,category:`data`,icon:m},custom:{id:`custom`,label:`Custom widget`,category:`custom`,icon:s}},V={kpi:`Single value`,chart:`Charts`,data:`Tabular`,custom:`Custom`},H=[`kpi`,`chart`,`data`,`custom`].map(e=>({category:e,types:Object.values(B).filter(t=>t.category===e)})),U=E,W=n();function G({onAdd:e,label:t=`Add widget`}){let[n,r]=z.useState(!1),[i,a]=z.useState(``),o=z.useRef(null),s=z.useRef(null);z.useEffect(()=>{if(!n){a(``);return}let e=e=>{o.current?.contains(e.target)||r(!1)},t=e=>{e.key===`Escape`&&r(!1)};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),queueMicrotask(()=>s.current?.focus()),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[n]);let c=z.useMemo(()=>{let e=i.trim().toLowerCase();return e?H.map(t=>({category:t.category,types:t.types.filter(t=>t.id.toLowerCase().includes(e)||t.label.toLowerCase().includes(e))})).filter(e=>e.types.length):H},[i]);return(0,W.jsxs)(`div`,{ref:o,className:`relative`,children:[(0,W.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded border border-dashed px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted/30 hover:text-foreground`,onClick:()=>r(e=>!e),children:[(0,W.jsx)(b,{className:`h-3 w-3`}),t]}),n&&(0,W.jsxs)(`div`,{className:`absolute right-0 top-full z-40 mt-1 w-72 rounded-md border bg-popover shadow-md`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-2 py-1.5`,children:[(0,W.jsx)(v,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,W.jsx)(`input`,{ref:s,type:`text`,value:i,onChange:e=>a(e.target.value),placeholder:`Search widgets…`,className:`w-full bg-transparent text-xs outline-none placeholder:text-muted-foreground`})]}),(0,W.jsx)(`div`,{className:`max-h-72 overflow-auto py-1`,children:c.length===0?(0,W.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-muted-foreground`,children:`No matches.`}):c.map(t=>(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground`,children:V[t.category]}),t.types.map(t=>(0,W.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs hover:bg-accent`,onClick:()=>{e(t.id),r(!1)},children:[(0,W.jsx)(B[t.id]?.icon??U,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,W.jsx)(`span`,{className:`font-medium truncate`,children:t.label}),(0,W.jsx)(`code`,{className:`ml-auto text-[10px] text-muted-foreground`,children:t.id})]},t.id))]},t.category))})]})]})}var K={io:`input`,unrepresentable:`any`},q=new Set([`widgets`,`label`,`description`,`name`]),J,Y=!1;function ie(){if(J||Y)return J;try{J=r(i,K)}catch(e){Y=!0,typeof console<`u`&&console.warn(`[dashboard-schema] failed to derive Dashboard JSONSchema from spec`,e)}return J}var X;function ae(){if(X)return X;if(!(!a||typeof a!=`object`)){try{let e=JSON.parse(JSON.stringify(a));for(let t of e.sections??[])t.fields=(t.fields??[]).filter(e=>{let t=typeof e==`string`?e:e?.field;return!q.has(t)});e.sections=(e.sections??[]).filter(e=>(e.fields??[]).length>0),X=e}catch(e){typeof console<`u`&&console.warn(`[dashboard-schema] failed to prepare dashboardForm from spec`,e);return}return X}}var oe=new Set([`name`,`label`,`description`,`widgets`]);function se({draft:e,onPatch:t,readOnly:n,locale:r,onSelectionChange:i,serverSchema:a}){let s=z.useCallback(e=>I(e,r),[r]),c=typeof e.label==`string`?e.label:``,l=typeof e.description==`string`?e.description:``,u=z.useMemo(()=>Array.isArray(e.widgets)?e.widgets:[],[e.widgets]),d=e=>{let n=N(`widget`,u.map(e=>e?.id).filter(Boolean)),r=B[e],a=r?`New ${r.label.toLowerCase()}`:`New widget`;t({widgets:M(u,{id:n,type:e,title:a,...r?.defaults??{}})}),i?.({kind:`widget`,id:n,label:a})},f=e=>{t({widgets:R(u,e,null)})},p=(e,n)=>{e!==n&&t({widgets:L(u,e,n)})},m=(e,t)=>{e?.id&&i?.({kind:`widget`,id:e.id,label:e.title||e.id||`Widget ${t+1}`})},[h,g]=z.useState(null),[_,v]=z.useState(null),{schema:b,form:x}=z.useMemo(()=>re({bundledSchema:ie(),bundledForm:ae(),serverSchema:a,excludeFields:oe,sectionTitle:I(`engine.inspector.moreFields`,r)}),[a,r]);return(0,W.jsxs)(F,{kindLabel:s(`engine.inspector.dashboard.kind`),title:String(c||e.name||s(`engine.inspector.dashboard.kind`)),onClose:()=>{},closeLabel:s(`engine.inspector.dashboard.close`),hideClose:!0,children:[(0,W.jsx)(P,{label:s(`engine.inspector.dashboard.label`),value:c,onCommit:e=>t({label:e}),placeholder:s(`engine.inspector.dashboard.labelPlaceholder`),disabled:n}),(0,W.jsx)(P,{label:s(`engine.inspector.dashboard.description`),value:l,onCommit:e=>t({description:e}),placeholder:s(`engine.inspector.dashboard.descriptionPlaceholder`),disabled:n}),(0,W.jsxs)(`div`,{className:`border-t pt-3 space-y-1.5`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,W.jsx)(A,{className:`text-xs text-muted-foreground`,children:s(`engine.inspector.dashboard.widgets`)}),(0,W.jsx)(o,{variant:`outline`,className:`text-[10px]`,children:u.length})]}),u.length===0?(0,W.jsx)(`p`,{className:`rounded-md border border-dashed bg-muted/30 px-3 py-3 text-center text-[11px] text-muted-foreground`,children:s(`engine.inspector.dashboard.widgetsEmpty`)}):(0,W.jsx)(`div`,{className:`space-y-1`,children:u.map((e,t)=>{let r=B[e?.type]?.icon??U;return(0,W.jsxs)(`div`,{draggable:!n,onDragStart:()=>g(t),onDragEnd:()=>{g(null),v(null)},onDragOver:e=>{e.preventDefault(),v(t)},onDrop:()=>{h!=null&&h!==t&&p(h,t),g(null),v(null)},className:`group flex items-center gap-2 rounded-md border px-2 py-1.5 text-xs hover:bg-accent`+(_===t&&h!==null&&h!==t?` border-primary`:``),children:[!n&&(0,W.jsx)(O,{className:`h-3.5 w-3.5 shrink-0 cursor-grab text-muted-foreground`}),(0,W.jsx)(r,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,W.jsx)(`button`,{type:`button`,className:`min-w-0 flex-1 truncate text-left font-medium`,onClick:()=>m(e,t),title:e?.title||e?.id,children:e?.title||e?.id||`Widget ${t+1}`}),(0,W.jsx)(`code`,{className:`text-[10px] text-muted-foreground`,children:e?.type}),!n&&(0,W.jsx)(D,{type:`button`,variant:`ghost`,size:`sm`,className:`h-6 w-6 shrink-0 p-0 opacity-0 group-hover:opacity-100`,onClick:()=>f(t),title:s(`engine.inspector.dashboard.removeWidget`),"aria-label":s(`engine.inspector.dashboard.removeWidget`),children:(0,W.jsx)(y,{className:`h-3.5 w-3.5`})})]},e?.id??t)})}),!n&&(0,W.jsx)(G,{onAdd:d,label:s(`engine.inspector.add.widget`)})]}),(0,W.jsx)(`div`,{className:`border-t pt-3`,children:b?(0,W.jsx)(te,{schema:b,form:x,value:e,hiddenFields:[`name`,`label`,`description`,`widgets`],readOnly:n,onChange:e=>t(e)}):(0,W.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:s(`engine.inspector.dashboard.noSchema`)})})]})}var ce=[{value:`metric`,label:`KPI Metric`},{value:`bar`,label:`Bar Chart`},{value:`line`,label:`Line Chart`},{value:`pie`,label:`Pie Chart`},{value:`table`,label:`Table`},{value:`grid`,label:`Grid`}],Z=[`count`,`sum`,`avg`,`min`,`max`],le=[`default`,`blue`,`teal`,`orange`,`purple`,`success`,`warning`,`danger`];function ue(e,t){let n=Array.isArray(e.widgets)?e.widgets:[],r=n.findIndex(e=>e?.id===t);return r<0?null:{widget:n[r],index:r}}function de({draft:e,selection:t,onPatch:n,onClearSelection:r,onSelectionChange:i,readOnly:a,locale:o}){if(t.kind!==`widget`)return(0,W.jsx)($,{message:`Unsupported selection kind: ${t.kind}`,onClose:r,locale:o});let s=ue(e,t.id);if(!s)return(0,W.jsx)($,{message:`The selected widget was removed from the draft.`,onClose:r,locale:o});let{widget:c,index:l}=s,f=Array.isArray(e.widgets)?e.widgets:[];function p(e){let t=[...f];t[l]={...t[l],...e},n({widgets:t})}let m=c,h=typeof m.dataset==`string`?m.dataset:``,g=Array.isArray(m.dimensions)?m.dimensions.join(`, `):``,_=Array.isArray(m.values)?m.values.join(`, `):``,v=e=>e.split(`,`).map(e=>e.trim()).filter(Boolean);function b(e){n({widgets:L(f,l,e)}),c.id&&i?.({kind:`widget`,id:c.id,label:c.title??void 0})}return(0,W.jsxs)(`div`,{className:`space-y-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,W.jsxs)(`div`,{className:`min-w-0`,children:[(0,W.jsx)(`div`,{className:`text-[10px] uppercase tracking-wider text-muted-foreground`,children:I(`engine.inspector.widget.kind`,o)}),(0,W.jsx)(`div`,{className:`truncate text-sm font-semibold`,children:c.title||t.label||`Widget ${l+1}`})]}),(0,W.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,W.jsx)(ne,{index:l,total:f.length,onMove:b,upLabel:I(`engine.inspector.reorder.up`,o),downLabel:I(`engine.inspector.reorder.down`,o),disabled:a}),(0,W.jsx)(D,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0`,onClick:r,title:I(`engine.inspector.widget.close`,o),"aria-label":I(`engine.inspector.widget.close`,o),children:(0,W.jsx)(y,{className:`h-3.5 w-3.5`})})]})]}),(0,W.jsx)(Q,{id:`widget-title`,label:I(`engine.inspector.widget.title`,o),children:(0,W.jsx)(k,{id:`widget-title`,value:c.title??``,onChange:e=>p({title:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-type`,label:I(`engine.inspector.widget.type`,o),children:(0,W.jsxs)(u,{value:c.type??`metric`,onValueChange:e=>p({type:e}),disabled:a,children:[(0,W.jsx)(x,{id:`widget-type`,children:(0,W.jsx)(T,{})}),(0,W.jsx)(C,{children:ce.map(e=>(0,W.jsx)(d,{value:e.value,children:e.label},e.value))})]})}),(0,W.jsxs)(`div`,{className:`space-y-3 rounded-md border border-dashed border-primary/40 bg-primary/5 p-3`,children:[(0,W.jsx)(`div`,{className:`text-[10px] font-semibold uppercase tracking-wider text-primary/80`,children:I(`engine.inspector.widget.datasetSection`,o)}),(0,W.jsxs)(Q,{id:`widget-dataset`,label:I(`engine.inspector.widget.dataset`,o),children:[(0,W.jsx)(k,{id:`widget-dataset`,value:h,placeholder:I(`engine.inspector.widget.datasetPlaceholder`,o),onChange:e=>p({dataset:e.target.value||void 0}),disabled:a}),(0,W.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:I(`engine.inspector.widget.datasetHint`,o)})]}),h&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(Q,{id:`widget-dimensions`,label:I(`engine.inspector.widget.dimensions`,o),children:[(0,W.jsx)(k,{id:`widget-dimensions`,value:g,placeholder:I(`engine.inspector.widget.dimensionsPlaceholder`,o),onChange:e=>p({dimensions:v(e.target.value)}),disabled:a}),(0,W.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:I(`engine.inspector.widget.dimensionsHint`,o)})]}),(0,W.jsxs)(Q,{id:`widget-values`,label:I(`engine.inspector.widget.values`,o),children:[(0,W.jsx)(k,{id:`widget-values`,value:_,placeholder:I(`engine.inspector.widget.valuesPlaceholder`,o),onChange:e=>p({values:v(e.target.value)}),disabled:a}),(0,W.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:I(`engine.inspector.widget.valuesHint`,o)})]})]})]}),(0,W.jsx)(Q,{id:`widget-object`,label:I(`engine.inspector.widget.object`,o),children:(0,W.jsx)(k,{id:`widget-object`,value:c.object??``,placeholder:`e.g. order`,onChange:e=>p({object:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-value-field`,label:I(`engine.inspector.widget.valueField`,o),children:(0,W.jsx)(k,{id:`widget-value-field`,value:c.valueField??``,placeholder:`e.g. amount`,onChange:e=>p({valueField:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-category-field`,label:I(`engine.inspector.widget.categoryField`,o),children:(0,W.jsx)(k,{id:`widget-category-field`,value:c.categoryField??``,placeholder:`e.g. status`,onChange:e=>p({categoryField:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-aggregate`,label:I(`engine.inspector.widget.aggregate`,o),children:(0,W.jsxs)(u,{value:c.aggregate??`count`,onValueChange:e=>p({aggregate:e}),disabled:a,children:[(0,W.jsx)(x,{id:`widget-aggregate`,children:(0,W.jsx)(T,{})}),(0,W.jsx)(C,{children:Z.map(e=>(0,W.jsx)(d,{value:e,children:e},e))})]})}),(0,W.jsx)(Q,{id:`widget-color`,label:I(`engine.inspector.widget.color`,o),children:(0,W.jsxs)(u,{value:c.colorVariant??`default`,onValueChange:e=>p({colorVariant:e}),disabled:a,children:[(0,W.jsx)(x,{id:`widget-color`,children:(0,W.jsx)(T,{})}),(0,W.jsx)(C,{children:le.map(e=>(0,W.jsx)(d,{value:e,children:e},e))})]})}),(0,W.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,W.jsx)(Q,{id:`widget-w`,label:I(`engine.inspector.widget.width`,o),children:(0,W.jsx)(k,{id:`widget-w`,type:`number`,min:1,value:c.layout?.w??1,onChange:e=>p({layout:{...c.layout??{},w:Number(e.target.value)||1}}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-h`,label:I(`engine.inspector.widget.height`,o),children:(0,W.jsx)(k,{id:`widget-h`,type:`number`,min:1,value:c.layout?.h??1,onChange:e=>p({layout:{...c.layout??{},h:Number(e.target.value)||1}}),disabled:a})})]}),!a&&(0,W.jsx)(`div`,{className:`pt-2 border-t`,children:(0,W.jsx)(D,{type:`button`,variant:`outline`,size:`sm`,className:`w-full text-destructive hover:text-destructive`,onClick:()=>{let t=Array.isArray(e.widgets)?[...e.widgets]:[];t.splice(l,1),n({widgets:t}),r()},children:I(`engine.inspector.widget.remove`,o)})})]})}function Q({id:e,label:t,children:n}){return(0,W.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,W.jsx)(A,{htmlFor:e,className:`text-xs font-medium text-muted-foreground`,children:t}),n]})}function $({message:e,onClose:t,locale:n}){return(0,W.jsxs)(`div`,{className:`space-y-3 rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:[(0,W.jsx)(`p`,{children:e}),(0,W.jsx)(D,{type:`button`,variant:`outline`,size:`sm`,onClick:t,children:I(`engine.inspector.widget.close`,n)})]})}export{B as i,se as n,G as r,de as t};
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{R as r,l as i,m as a}from"./vendor-objectstack-BNd856rx.js";import{$n as o,Br as s,Bt as c,Fs as l,Ht as u,Is as d,Ms as f,Na as p,Ps as m,Qr as h,Rs as g,Si as _,Sr as v,Ui as y,Ut as b,Vo as x,Vt as S,Wo as C,Wt as w,es as ee,hr as T,io as E,js as D,nn as O,on as k,pc as A,to as j}from"./ui-components-D1FYlKrM.js";import{_ as M,b as N,g as P,h as F,i as I,n as te,p as ne,t as re,v as L,y as R}from"./mergeServerFields-DLHgCyyI.js";var z=e(t(),1),B={metric:{id:`metric`,label:`Metric (KPI)`,category:`kpi`,icon:j},bar:{id:`bar`,label:`Bar chart`,category:`chart`,icon:m},"horizontal-bar":{id:`horizontal-bar`,label:`Horizontal bar`,category:`chart`,icon:l},line:{id:`line`,label:`Line chart`,category:`chart`,icon:d},area:{id:`area`,label:`Area chart`,category:`chart`,icon:g},pie:{id:`pie`,label:`Pie chart`,category:`chart`,icon:f},donut:{id:`donut`,label:`Donut chart`,category:`chart`,icon:x},scatter:{id:`scatter`,label:`Scatter plot`,category:`chart`,icon:D},funnel:{id:`funnel`,label:`Funnel`,category:`chart`,icon:s},table:{id:`table`,label:`Data table`,category:`data`,icon:h},pivot:{id:`pivot`,label:`Pivot table`,category:`data`,icon:C},list:{id:`list`,label:`Record list`,category:`data`,icon:p},custom:{id:`custom`,label:`Custom widget`,category:`custom`,icon:ee}},V={kpi:`Single value`,chart:`Charts`,data:`Tabular`,custom:`Custom`},H=[`kpi`,`chart`,`data`,`custom`].map(e=>({category:e,types:Object.values(B).filter(t=>t.category===e)})),U=A,W=n();function G({onAdd:e,label:t=`Add widget`}){let[n,r]=z.useState(!1),[i,a]=z.useState(``),o=z.useRef(null),s=z.useRef(null);z.useEffect(()=>{if(!n){a(``);return}let e=e=>{o.current?.contains(e.target)||r(!1)},t=e=>{e.key===`Escape`&&r(!1)};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),queueMicrotask(()=>s.current?.focus()),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[n]);let c=z.useMemo(()=>{let e=i.trim().toLowerCase();return e?H.map(t=>({category:t.category,types:t.types.filter(t=>t.id.toLowerCase().includes(e)||t.label.toLowerCase().includes(e))})).filter(e=>e.types.length):H},[i]);return(0,W.jsxs)(`div`,{ref:o,className:`relative`,children:[(0,W.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1 rounded border border-dashed px-3 py-1.5 text-xs text-muted-foreground hover:bg-muted/30 hover:text-foreground`,onClick:()=>r(e=>!e),children:[(0,W.jsx)(y,{className:`h-3 w-3`}),t]}),n&&(0,W.jsxs)(`div`,{className:`absolute right-0 top-full z-40 mt-1 w-72 rounded-md border bg-popover shadow-md`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-2 py-1.5`,children:[(0,W.jsx)(_,{className:`h-3.5 w-3.5 text-muted-foreground`}),(0,W.jsx)(`input`,{ref:s,type:`text`,value:i,onChange:e=>a(e.target.value),placeholder:`Search widgets…`,className:`w-full bg-transparent text-xs outline-none placeholder:text-muted-foreground`})]}),(0,W.jsx)(`div`,{className:`max-h-72 overflow-auto py-1`,children:c.length===0?(0,W.jsx)(`div`,{className:`px-3 py-4 text-center text-xs text-muted-foreground`,children:`No matches.`}):c.map(t=>(0,W.jsxs)(`div`,{children:[(0,W.jsx)(`div`,{className:`px-3 pt-2 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground`,children:V[t.category]}),t.types.map(t=>(0,W.jsxs)(`button`,{type:`button`,className:`flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs hover:bg-accent`,onClick:()=>{e(t.id),r(!1)},children:[(0,W.jsx)(B[t.id]?.icon??U,{className:`h-3.5 w-3.5 text-muted-foreground shrink-0`}),(0,W.jsx)(`span`,{className:`font-medium truncate`,children:t.label}),(0,W.jsx)(`code`,{className:`ml-auto text-[10px] text-muted-foreground`,children:t.id})]},t.id))]},t.category))})]})]})}var K={io:`input`,unrepresentable:`any`},q=new Set([`widgets`,`label`,`description`,`name`]),J,Y=!1;function ie(){if(J||Y)return J;try{J=r(i,K)}catch(e){Y=!0,typeof console<`u`&&console.warn(`[dashboard-schema] failed to derive Dashboard JSONSchema from spec`,e)}return J}var X;function ae(){if(X)return X;if(!(!a||typeof a!=`object`)){try{let e=JSON.parse(JSON.stringify(a));for(let t of e.sections??[])t.fields=(t.fields??[]).filter(e=>{let t=typeof e==`string`?e:e?.field;return!q.has(t)});e.sections=(e.sections??[]).filter(e=>(e.fields??[]).length>0),X=e}catch(e){typeof console<`u`&&console.warn(`[dashboard-schema] failed to prepare dashboardForm from spec`,e);return}return X}}var oe=new Set([`name`,`label`,`description`,`widgets`]);function se({draft:e,onPatch:t,readOnly:n,locale:r,onSelectionChange:i,serverSchema:a}){let s=z.useCallback(e=>I(e,r),[r]),c=typeof e.label==`string`?e.label:``,l=typeof e.description==`string`?e.description:``,u=z.useMemo(()=>Array.isArray(e.widgets)?e.widgets:[],[e.widgets]),d=e=>{let n=N(`widget`,u.map(e=>e?.id).filter(Boolean)),r=B[e],a=r?`New ${r.label.toLowerCase()}`:`New widget`;t({widgets:M(u,{id:n,type:e,title:a,...r?.defaults??{}})}),i?.({kind:`widget`,id:n,label:a})},f=e=>{t({widgets:R(u,e,null)})},p=(e,n)=>{e!==n&&t({widgets:L(u,e,n)})},m=(e,t)=>{e?.id&&i?.({kind:`widget`,id:e.id,label:e.title||e.id||`Widget ${t+1}`})},[h,g]=z.useState(null),[_,y]=z.useState(null),{schema:b,form:x}=z.useMemo(()=>re({bundledSchema:ie(),bundledForm:ae(),serverSchema:a,excludeFields:oe,sectionTitle:I(`engine.inspector.moreFields`,r)}),[a,r]);return(0,W.jsxs)(F,{kindLabel:s(`engine.inspector.dashboard.kind`),title:String(c||e.name||s(`engine.inspector.dashboard.kind`)),onClose:()=>{},closeLabel:s(`engine.inspector.dashboard.close`),hideClose:!0,children:[(0,W.jsx)(P,{label:s(`engine.inspector.dashboard.label`),value:c,onCommit:e=>t({label:e}),placeholder:s(`engine.inspector.dashboard.labelPlaceholder`),disabled:n}),(0,W.jsx)(P,{label:s(`engine.inspector.dashboard.description`),value:l,onCommit:e=>t({description:e}),placeholder:s(`engine.inspector.dashboard.descriptionPlaceholder`),disabled:n}),(0,W.jsxs)(`div`,{className:`border-t pt-3 space-y-1.5`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,W.jsx)(k,{className:`text-xs text-muted-foreground`,children:s(`engine.inspector.dashboard.widgets`)}),(0,W.jsx)(o,{variant:`outline`,className:`text-[10px]`,children:u.length})]}),u.length===0?(0,W.jsx)(`p`,{className:`rounded-md border border-dashed bg-muted/30 px-3 py-3 text-center text-[11px] text-muted-foreground`,children:s(`engine.inspector.dashboard.widgetsEmpty`)}):(0,W.jsx)(`div`,{className:`space-y-1`,children:u.map((e,t)=>{let r=B[e?.type]?.icon??U;return(0,W.jsxs)(`div`,{draggable:!n,onDragStart:()=>g(t),onDragEnd:()=>{g(null),y(null)},onDragOver:e=>{e.preventDefault(),y(t)},onDrop:()=>{h!=null&&h!==t&&p(h,t),g(null),y(null)},className:`group flex items-center gap-2 rounded-md border px-2 py-1.5 text-xs hover:bg-accent`+(_===t&&h!==null&&h!==t?` border-primary`:``),children:[!n&&(0,W.jsx)(E,{className:`h-3.5 w-3.5 shrink-0 cursor-grab text-muted-foreground`}),(0,W.jsx)(r,{className:`h-3.5 w-3.5 shrink-0 text-muted-foreground`}),(0,W.jsx)(`button`,{type:`button`,className:`min-w-0 flex-1 truncate text-left font-medium`,onClick:()=>m(e,t),title:e?.title||e?.id,children:e?.title||e?.id||`Widget ${t+1}`}),(0,W.jsx)(`code`,{className:`text-[10px] text-muted-foreground`,children:e?.type}),!n&&(0,W.jsx)(T,{type:`button`,variant:`ghost`,size:`sm`,className:`h-6 w-6 shrink-0 p-0 opacity-0 group-hover:opacity-100`,onClick:()=>f(t),title:s(`engine.inspector.dashboard.removeWidget`),"aria-label":s(`engine.inspector.dashboard.removeWidget`),children:(0,W.jsx)(v,{className:`h-3.5 w-3.5`})})]},e?.id??t)})}),!n&&(0,W.jsx)(G,{onAdd:d,label:s(`engine.inspector.add.widget`)})]}),(0,W.jsx)(`div`,{className:`border-t pt-3`,children:b?(0,W.jsx)(te,{schema:b,form:x,value:e,hiddenFields:[`name`,`label`,`description`,`widgets`],readOnly:n,onChange:e=>t(e)}):(0,W.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:s(`engine.inspector.dashboard.noSchema`)})})]})}var ce=[{value:`metric`,label:`KPI Metric`},{value:`bar`,label:`Bar Chart`},{value:`line`,label:`Line Chart`},{value:`pie`,label:`Pie Chart`},{value:`table`,label:`Table`},{value:`grid`,label:`Grid`}],Z=[`count`,`sum`,`avg`,`min`,`max`],le=[`default`,`blue`,`teal`,`orange`,`purple`,`success`,`warning`,`danger`];function ue(e,t){let n=Array.isArray(e.widgets)?e.widgets:[],r=n.findIndex(e=>e?.id===t);return r<0?null:{widget:n[r],index:r}}function de({draft:e,selection:t,onPatch:n,onClearSelection:r,onSelectionChange:i,readOnly:a,locale:o}){if(t.kind!==`widget`)return(0,W.jsx)($,{message:`Unsupported selection kind: ${t.kind}`,onClose:r,locale:o});let s=ue(e,t.id);if(!s)return(0,W.jsx)($,{message:`The selected widget was removed from the draft.`,onClose:r,locale:o});let{widget:l,index:d}=s,f=Array.isArray(e.widgets)?e.widgets:[];function p(e){let t=[...f];t[d]={...t[d],...e},n({widgets:t})}let m=l,h=typeof m.dataset==`string`?m.dataset:``,g=Array.isArray(m.dimensions)?m.dimensions.join(`, `):``,_=Array.isArray(m.values)?m.values.join(`, `):``,y=e=>e.split(`,`).map(e=>e.trim()).filter(Boolean);function x(e){n({widgets:L(f,d,e)}),l.id&&i?.({kind:`widget`,id:l.id,label:l.title??void 0})}return(0,W.jsxs)(`div`,{className:`space-y-4`,children:[(0,W.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,W.jsxs)(`div`,{className:`min-w-0`,children:[(0,W.jsx)(`div`,{className:`text-[10px] uppercase tracking-wider text-muted-foreground`,children:I(`engine.inspector.widget.kind`,o)}),(0,W.jsx)(`div`,{className:`truncate text-sm font-semibold`,children:l.title||t.label||`Widget ${d+1}`})]}),(0,W.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,W.jsx)(ne,{index:d,total:f.length,onMove:x,upLabel:I(`engine.inspector.reorder.up`,o),downLabel:I(`engine.inspector.reorder.down`,o),disabled:a}),(0,W.jsx)(T,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0`,onClick:r,title:I(`engine.inspector.widget.close`,o),"aria-label":I(`engine.inspector.widget.close`,o),children:(0,W.jsx)(v,{className:`h-3.5 w-3.5`})})]})]}),(0,W.jsx)(Q,{id:`widget-title`,label:I(`engine.inspector.widget.title`,o),children:(0,W.jsx)(O,{id:`widget-title`,value:l.title??``,onChange:e=>p({title:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-type`,label:I(`engine.inspector.widget.type`,o),children:(0,W.jsxs)(c,{value:l.type??`metric`,onValueChange:e=>p({type:e}),disabled:a,children:[(0,W.jsx)(b,{id:`widget-type`,children:(0,W.jsx)(w,{})}),(0,W.jsx)(S,{children:ce.map(e=>(0,W.jsx)(u,{value:e.value,children:e.label},e.value))})]})}),(0,W.jsxs)(`div`,{className:`space-y-3 rounded-md border border-dashed border-primary/40 bg-primary/5 p-3`,children:[(0,W.jsx)(`div`,{className:`text-[10px] font-semibold uppercase tracking-wider text-primary/80`,children:I(`engine.inspector.widget.datasetSection`,o)}),(0,W.jsxs)(Q,{id:`widget-dataset`,label:I(`engine.inspector.widget.dataset`,o),children:[(0,W.jsx)(O,{id:`widget-dataset`,value:h,placeholder:I(`engine.inspector.widget.datasetPlaceholder`,o),onChange:e=>p({dataset:e.target.value||void 0}),disabled:a}),(0,W.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:I(`engine.inspector.widget.datasetHint`,o)})]}),h&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(Q,{id:`widget-dimensions`,label:I(`engine.inspector.widget.dimensions`,o),children:[(0,W.jsx)(O,{id:`widget-dimensions`,value:g,placeholder:I(`engine.inspector.widget.dimensionsPlaceholder`,o),onChange:e=>p({dimensions:y(e.target.value)}),disabled:a}),(0,W.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:I(`engine.inspector.widget.dimensionsHint`,o)})]}),(0,W.jsxs)(Q,{id:`widget-values`,label:I(`engine.inspector.widget.values`,o),children:[(0,W.jsx)(O,{id:`widget-values`,value:_,placeholder:I(`engine.inspector.widget.valuesPlaceholder`,o),onChange:e=>p({values:y(e.target.value)}),disabled:a}),(0,W.jsx)(`p`,{className:`text-[10px] leading-snug text-muted-foreground`,children:I(`engine.inspector.widget.valuesHint`,o)})]})]})]}),(0,W.jsx)(Q,{id:`widget-object`,label:I(`engine.inspector.widget.object`,o),children:(0,W.jsx)(O,{id:`widget-object`,value:l.object??``,placeholder:`e.g. order`,onChange:e=>p({object:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-value-field`,label:I(`engine.inspector.widget.valueField`,o),children:(0,W.jsx)(O,{id:`widget-value-field`,value:l.valueField??``,placeholder:`e.g. amount`,onChange:e=>p({valueField:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-category-field`,label:I(`engine.inspector.widget.categoryField`,o),children:(0,W.jsx)(O,{id:`widget-category-field`,value:l.categoryField??``,placeholder:`e.g. status`,onChange:e=>p({categoryField:e.target.value}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-aggregate`,label:I(`engine.inspector.widget.aggregate`,o),children:(0,W.jsxs)(c,{value:l.aggregate??`count`,onValueChange:e=>p({aggregate:e}),disabled:a,children:[(0,W.jsx)(b,{id:`widget-aggregate`,children:(0,W.jsx)(w,{})}),(0,W.jsx)(S,{children:Z.map(e=>(0,W.jsx)(u,{value:e,children:e},e))})]})}),(0,W.jsx)(Q,{id:`widget-color`,label:I(`engine.inspector.widget.color`,o),children:(0,W.jsxs)(c,{value:l.colorVariant??`default`,onValueChange:e=>p({colorVariant:e}),disabled:a,children:[(0,W.jsx)(b,{id:`widget-color`,children:(0,W.jsx)(w,{})}),(0,W.jsx)(S,{children:le.map(e=>(0,W.jsx)(u,{value:e,children:e},e))})]})}),(0,W.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,W.jsx)(Q,{id:`widget-w`,label:I(`engine.inspector.widget.width`,o),children:(0,W.jsx)(O,{id:`widget-w`,type:`number`,min:1,value:l.layout?.w??1,onChange:e=>p({layout:{...l.layout??{},w:Number(e.target.value)||1}}),disabled:a})}),(0,W.jsx)(Q,{id:`widget-h`,label:I(`engine.inspector.widget.height`,o),children:(0,W.jsx)(O,{id:`widget-h`,type:`number`,min:1,value:l.layout?.h??1,onChange:e=>p({layout:{...l.layout??{},h:Number(e.target.value)||1}}),disabled:a})})]}),!a&&(0,W.jsx)(`div`,{className:`pt-2 border-t`,children:(0,W.jsx)(T,{type:`button`,variant:`outline`,size:`sm`,className:`w-full text-destructive hover:text-destructive`,onClick:()=>{let t=Array.isArray(e.widgets)?[...e.widgets]:[];t.splice(d,1),n({widgets:t}),r()},children:I(`engine.inspector.widget.remove`,o)})})]})}function Q({id:e,label:t,children:n}){return(0,W.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,W.jsx)(k,{htmlFor:e,className:`text-xs font-medium text-muted-foreground`,children:t}),n]})}function $({message:e,onClose:t,locale:n}){return(0,W.jsxs)(`div`,{className:`space-y-3 rounded-md border border-dashed p-4 text-sm text-muted-foreground`,children:[(0,W.jsx)(`p`,{children:e}),(0,W.jsx)(T,{type:`button`,variant:`outline`,size:`sm`,onClick:t,children:I(`engine.inspector.widget.close`,n)})]})}export{B as i,se as n,G as r,de as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as e,t,u as n}from"./vendor-react-DR370ovB.js";import{Co as r,Jn as i,Jr as a,Wi as o,Xn as s,Yn as c,Zn as l,qn as u,wr as d}from"./ui-components-
|
|
1
|
+
import{f as e,t,u as n}from"./vendor-react-DR370ovB.js";import{Co as r,Jn as i,Jr as a,Wi as o,Xn as s,Yn as c,Zn as l,qn as u,wr as d}from"./ui-components-D1FYlKrM.js";var f=t();function p(){let t=n(),{appName:p}=e(),m=p?`/apps/${p}`:``,h=[{title:`Integrations & APIs`,description:`Your app as a REST API — base URL, endpoints, and connect samples`,icon:o,href:`${m}/developer/integrations`},{title:`API Console`,description:`Inspect and exercise REST endpoints with auto-discovered services`,icon:a,href:`${m}/developer/api-console`},{title:`Flow Runs`,description:`Trigger flows with sample inputs and inspect recent run history`,icon:d,href:`${m}/developer/flow-runs`},{title:`Public Forms`,description:`Publish, share, and embed FormViews available to anonymous users`,icon:r,href:`${m}/developer/public-forms`}];return(0,f.jsxs)(`div`,{className:`flex flex-col gap-6 p-4 sm:p-6`,children:[(0,f.jsxs)(`div`,{className:`min-w-0`,children:[(0,f.jsx)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight`,children:`Developer`}),(0,f.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Tools for building, debugging, and sharing ObjectStack apps`})]}),(0,f.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:h.map(e=>{let n=e.icon;return(0,f.jsxs)(u,{className:`cursor-pointer transition-colors hover:bg-accent/50`,onClick:()=>t(e.href),"data-testid":`hub-card-${e.title.toLowerCase().replace(/\s+/g,`-`)}`,role:`link`,tabIndex:0,"aria-label":`${e.title}: ${e.description}`,onKeyDown:n=>{(n.key===`Enter`||n.key===` `)&&(n.preventDefault(),t(e.href))},children:[(0,f.jsxs)(s,{className:`flex flex-row items-center gap-3 pb-2`,children:[(0,f.jsx)(`div`,{className:`flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary`,children:(0,f.jsx)(n,{className:`h-5 w-5`})}),(0,f.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,f.jsx)(l,{className:`text-base`,children:e.title}),(0,f.jsx)(c,{className:`text-xs`,children:e.description})]})]}),(0,f.jsx)(i,{className:`pt-0`})]},e.title)})})]})}export{p as DeveloperHubPage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{ct as r,z as i}from"./framework-DCMHw4uc.js";var a=e(t(),1),o=n(),s=(0,a.createContext)(null);function c({children:e,user:t={},app:n={},data:c={},features:l={}}){let u=(0,a.useMemo)(()=>({user:t,app:n,data:c,features:l,evaluator:new r({user:t,app:n,data:c,features:l})}),[t,n,c,l]),d=(0,a.useMemo)(()=>({user:t,app:n,data:c,features:l}),[t,n,c,l]);return(0,o.jsx)(s.Provider,{value:u,children:(0,o.jsx)(i,{scope:d,children:e})})}function l(){let e=(0,a.useContext)(s);if(!e){let e={user:{},app:{},data:{},features:{}};return{...e,evaluator:new r(e)}}return e}function u(e,t){if(e==null||e===!0||e===`true`)return!0;if(e===!1||e===`false`)return!1;if(typeof e==`string`&&e.includes("${"))try{return t.evaluateCondition(e)}catch{return!0}return!0}export{u as n,l as r,c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{w as r}from"./framework-BLEk-ou3.js";import{$n as i,Fi as a,Ft as o,Gi as s,Gt as c,It as l,Jn as u,Lt as d,Ma as f,Mt as p,Pt as m,Rt as h,Xn as g,Yn as _,Zn as v,cs as y,ct as b,dt as x,ft as S,gs as C,hr as w,lt as T,nn as E,on as D,ot as O,qn as k,rs as A,st as j,tt as M,ut as N,wr as P,ys as F}from"./ui-components-CrPYFyEM.js";import"./src-DXFkWHTV.js";var I=e(t(),1),L=n();function R({status:e}){let t={success:{icon:C,cls:`text-emerald-600 border-emerald-300`},completed:{icon:C,cls:`text-emerald-600 border-emerald-300`},failed:{icon:y,cls:`text-red-600 border-red-300`},error:{icon:y,cls:`text-red-600 border-red-300`},running:{icon:f,cls:`text-blue-600 border-blue-300 animate-pulse`},pending:{icon:A,cls:`text-amber-600 border-amber-300`},skipped:{icon:F,cls:`text-muted-foreground`}}[e]??{icon:F,cls:`text-muted-foreground`},n=t.icon;return(0,L.jsxs)(i,{variant:`outline`,className:`text-[10px] font-mono inline-flex items-center gap-1 ${t.cls}`,children:[(0,L.jsx)(n,{className:`h-3 w-3`}),e]})}function z(e){if(!e)return`—`;try{return new Date(e).toLocaleString()}catch{return e}}function B(e,t){switch(t){case`number`:{if(e===``)return;let t=Number(e);return Number.isNaN(t)?e:t}case`boolean`:return e===`true`;case`object`:case`list`:case`array`:if(e.trim()===``)return;try{return JSON.parse(e)}catch{return e}default:return e}}function V({data:e}){return(0,L.jsx)(`pre`,{className:`rounded border bg-muted/30 p-2 text-xs font-mono overflow-auto whitespace-pre-wrap break-all max-h-96`,children:JSON.stringify(e,null,2)})}function H(){let e=r()?.getClient?.(),[t,n]=(0,I.useState)([]),[i,o]=(0,I.useState)(!0),[s,c]=(0,I.useState)(null),[l,d]=(0,I.useState)(``),[f,m]=(0,I.useState)(0),h=(0,I.useCallback)(async()=>{if(!e?.meta?.getItems){c(`meta.getItems is not available on this client`),o(!1);return}o(!0),c(null);try{let t=await e.meta.getItems(`flow`),r=(Array.isArray(t)?t:Array.isArray(t?.items)?t.items:Array.isArray(t?.value)?t.value:[]).map(e=>({name:e?.spec?.name??e?.name,label:e?.spec?.label,spec:e?.spec??e,updatedAt:e?.updatedAt??e?.updated_at})).filter(e=>e.name);n(r),!l&&r.length>0&&d(r[0].name)}catch(e){c(e?.message??String(e))}finally{o(!1)}},[e,l]);(0,I.useEffect)(()=>{h()},[h]);let y=(0,I.useMemo)(()=>t.find(e=>e.name===l)??null,[t,l]);return(0,L.jsxs)(`div`,{className:`flex flex-col gap-4 p-4 sm:p-6`,children:[(0,L.jsxs)(`div`,{className:`min-w-0`,children:[(0,L.jsxs)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight flex items-center gap-2`,children:[(0,L.jsx)(P,{className:`h-5 w-5`}),`Flow Runs`]}),(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Pick a flow, trigger a test run with sample inputs, and inspect recent run history`})]}),(0,L.jsxs)(k,{children:[(0,L.jsx)(g,{className:`pb-3`,children:(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(v,{className:`text-base`,children:`Flow`}),(0,L.jsx)(_,{children:`Select a flow definition to test`})]}),(0,L.jsxs)(w,{variant:`outline`,size:`sm`,onClick:h,disabled:i,children:[(0,L.jsx)(a,{className:`h-3.5 w-3.5 mr-2 ${i?`animate-spin`:``}`}),`Refresh`]})]})}),(0,L.jsxs)(u,{children:[i&&(0,L.jsx)(p,{className:`h-9 w-72`}),s&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:s}),!i&&!s&&t.length===0&&(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No flow definitions found.`}),!i&&!s&&t.length>0&&(0,L.jsx)(`select`,{value:l,onChange:e=>d(e.target.value),className:`flex h-9 w-full max-w-md rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-1 focus:ring-ring`,children:t.map(e=>(0,L.jsx)(`option`,{value:e.name,children:e.label?`${e.label} (${e.name})`:e.name},e.name))})]})]}),y&&(0,L.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,L.jsx)(U,{client:e,flow:y.spec,onExecuted:()=>m(e=>e+1)}),(0,L.jsx)(W,{client:e,flowName:y.name,refreshKey:f})]})]})}function U({client:e,flow:t,onExecuted:n}){let r=(0,I.useMemo)(()=>(t?.variables??[]).filter(e=>e?.isInput),[t]),[a,o]=(0,I.useState)({}),[c,l]=(0,I.useState)(!1),[d,p]=(0,I.useState)(null),[m,h]=(0,I.useState)(null);(0,I.useEffect)(()=>{o({}),p(null),h(null)},[t?.name]);let b=(e,t)=>o(n=>({...n,[e]:t}));return(0,L.jsxs)(k,{children:[(0,L.jsxs)(g,{className:`pb-3`,children:[(0,L.jsx)(v,{className:`text-base`,children:`Test Run`}),(0,L.jsx)(_,{children:`Provide input values and invoke the flow`})]}),(0,L.jsxs)(u,{className:`space-y-3`,children:[r.length===0&&(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`This flow declares no input variables. Click Run to invoke with no parameters.`}),r.map(e=>(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsxs)(D,{htmlFor:`var-${e.name}`,className:`flex items-center gap-2`,children:[(0,L.jsx)(`span`,{className:`font-mono text-xs`,children:e.name}),(0,L.jsx)(i,{variant:`outline`,className:`text-[10px] font-mono`,children:e.type})]}),e.type===`boolean`?(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,L.jsx)(S,{id:`var-${e.name}`,checked:a[e.name]===`true`,onCheckedChange:t=>b(e.name,t?`true`:`false`)}),(0,L.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:a[e.name]===`true`?`true`:`false`})]}):e.type===`object`||e.type===`list`||e.type===`array`?(0,L.jsx)(M,{id:`var-${e.name}`,placeholder:`JSON ${e.type}`,value:a[e.name]??``,onChange:t=>b(e.name,t.target.value),className:`font-mono text-xs min-h-[80px]`}):(0,L.jsx)(E,{id:`var-${e.name}`,type:e.type===`number`?`number`:`text`,value:a[e.name]??``,onChange:t=>b(e.name,t.target.value)})]},e.name)),(0,L.jsx)(`div`,{className:`pt-1`,children:(0,L.jsxs)(w,{onClick:async()=>{if(!e?.automation?.execute){h(`automation.execute is not available on this client`);return}l(!0),h(null),p(null);try{let i={};for(let e of r){let t=a[e.name];t!==void 0&&(i[e.name]=B(t,e.type))}p(await e.automation.execute(t.name,{params:i})),n?.()}catch(e){h(e?.message??String(e))}finally{l(!1)}},disabled:c,size:`sm`,children:[c?(0,L.jsx)(f,{className:`h-3.5 w-3.5 mr-2 animate-spin`}):(0,L.jsx)(s,{className:`h-3.5 w-3.5 mr-2`}),c?`Running…`:`Run Flow`]})}),(d||m)&&(0,L.jsxs)(`div`,{className:`pt-2 border-t mt-2 space-y-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[m||d?.success===!1?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(y,{className:`h-4 w-4 text-red-500`}),` Failed`]}):(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(C,{className:`h-4 w-4 text-emerald-500`}),` Result`]}),typeof d?.durationMs==`number`&&(0,L.jsxs)(i,{variant:`secondary`,className:`text-[10px] font-mono`,children:[d.durationMs,` ms`]})]}),m&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:m}),d&&(0,L.jsx)(V,{data:d})]})]})]})}function W({client:e,flowName:t,refreshKey:n}){let[r,s]=(0,I.useState)([]),[y,S]=(0,I.useState)(!0),[C,E]=(0,I.useState)(null),[D,A]=(0,I.useState)(null),[M,P]=(0,I.useState)(null),[F,B]=(0,I.useState)(!1),[H,U]=(0,I.useState)(null),W=(0,I.useCallback)(async()=>{if(!e?.automation?.listRuns){E(`automation.listRuns is not available on this client`),S(!1);return}S(!0),E(null);try{let n=await e.automation.listRuns(t,{limit:20});s(Array.isArray(n)?n:n?.items??n?.runs??[])}catch(e){E(e?.message??String(e))}finally{S(!1)}},[e,t]);(0,I.useEffect)(()=>{W()},[W,n]);let G=async n=>{A(n),P(null),U(null),B(!0);try{let r=await e.automation.getRun(t,n);P(r?.run??r)}catch(e){U(e?.message??String(e))}finally{B(!1)}};return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(k,{children:[(0,L.jsx)(g,{className:`pb-3`,children:(0,L.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(v,{className:`text-base`,children:`Recent Runs`}),(0,L.jsx)(_,{className:`font-mono text-xs`,children:t})]}),(0,L.jsxs)(w,{variant:`outline`,size:`sm`,onClick:W,disabled:y,children:[y?(0,L.jsx)(f,{className:`h-3.5 w-3.5 mr-2 animate-spin`}):(0,L.jsx)(a,{className:`h-3.5 w-3.5 mr-2`}),`Refresh`]})]})}),(0,L.jsxs)(u,{children:[y&&(0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(p,{className:`h-8 w-full`}),(0,L.jsx)(p,{className:`h-8 w-full`}),(0,L.jsx)(p,{className:`h-8 w-full`})]}),!y&&C&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:C}),!y&&!C&&r.length===0&&(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground py-6 text-center`,children:`No runs yet. Use the Test Run panel to invoke this flow.`}),!y&&!C&&r.length>0&&(0,L.jsxs)(O,{children:[(0,L.jsx)(N,{children:(0,L.jsxs)(x,{children:[(0,L.jsx)(T,{children:`Run`}),(0,L.jsx)(T,{children:`Status`}),(0,L.jsx)(T,{children:`Started`}),(0,L.jsx)(T,{className:`text-right`,children:`Duration`})]})}),(0,L.jsx)(j,{children:r.map(e=>(0,L.jsxs)(x,{className:`cursor-pointer`,onClick:()=>G(e.id),children:[(0,L.jsxs)(b,{className:`font-mono text-xs`,children:[e.id.slice(0,12),`…`]}),(0,L.jsx)(b,{children:(0,L.jsx)(R,{status:e.status})}),(0,L.jsx)(b,{className:`text-xs text-muted-foreground`,children:z(e.startedAt)}),(0,L.jsx)(b,{className:`text-right font-mono text-xs`,children:typeof e.durationMs==`number`?`${e.durationMs} ms`:`—`})]},e.id))})]})]})]}),(0,L.jsx)(m,{open:!!D,onOpenChange:e=>{e||(A(null),P(null))},children:(0,L.jsxs)(o,{side:`right`,className:`w-full sm:max-w-2xl p-0 flex flex-col`,children:[(0,L.jsxs)(d,{className:`p-4 border-b`,children:[(0,L.jsxs)(h,{className:`font-mono text-sm break-all`,children:[`Run `,D]}),(0,L.jsx)(l,{children:M&&(0,L.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,L.jsx)(R,{status:M.status}),typeof M.durationMs==`number`&&(0,L.jsxs)(i,{variant:`secondary`,className:`text-[10px] font-mono`,children:[M.durationMs,` ms`]}),(0,L.jsx)(`span`,{className:`text-xs`,children:z(M.startedAt)})]})})]}),(0,L.jsxs)(c,{className:`flex-1 p-4`,children:[F&&(0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(p,{className:`h-16 w-full`}),(0,L.jsx)(p,{className:`h-16 w-full`}),(0,L.jsx)(p,{className:`h-16 w-full`})]}),H&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:H}),!F&&M&&(0,L.jsx)(`div`,{className:`space-y-3`,children:Array.isArray(M.steps)&&M.steps.length>0?M.steps.map((e,t)=>(0,L.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,L.jsxs)(`span`,{className:`text-muted-foreground font-mono text-xs`,children:[`#`,t+1]}),(0,L.jsx)(`span`,{className:`font-mono text-sm font-medium`,children:e.nodeLabel||e.nodeId}),e.nodeType&&(0,L.jsx)(i,{variant:`outline`,className:`text-[10px] font-mono`,children:e.nodeType}),(0,L.jsx)(R,{status:e.status}),typeof e.durationMs==`number`&&(0,L.jsxs)(i,{variant:`secondary`,className:`text-[10px] font-mono ml-auto`,children:[e.durationMs,` ms`]})]}),e.input!==void 0&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-muted-foreground mb-1`,children:`Input`}),(0,L.jsx)(V,{data:e.input})]}),e.output!==void 0&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-muted-foreground mb-1`,children:`Output`}),(0,L.jsx)(V,{data:e.output})]}),e.error&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-red-500 mb-1`,children:`Error`}),(0,L.jsx)(V,{data:e.error})]})]},`${e.nodeId}-${t}`)):(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-muted-foreground mb-1`,children:`Run`}),(0,L.jsx)(V,{data:M})]})})]})]})})]})}export{H as FlowRunsPage};
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{w as r}from"./framework-DCMHw4uc.js";import{$n as i,Fi as a,Ft as o,Gi as s,Gt as c,It as l,Jn as u,Lt as d,Ma as f,Mt as p,Pt as m,Rt as h,Xn as g,Yn as _,Zn as v,_s as y,bs as b,ct as x,dt as S,ft as C,hr as w,is as T,ls as E,lt as D,nn as O,on as k,ot as A,qn as j,st as M,tt as N,ut as P,wr as F}from"./ui-components-D1FYlKrM.js";import"./src-ChUzpvnF.js";var I=e(t(),1),L=n();function R({status:e}){let t={success:{icon:y,cls:`text-emerald-600 border-emerald-300`},completed:{icon:y,cls:`text-emerald-600 border-emerald-300`},failed:{icon:E,cls:`text-red-600 border-red-300`},error:{icon:E,cls:`text-red-600 border-red-300`},running:{icon:f,cls:`text-blue-600 border-blue-300 animate-pulse`},pending:{icon:T,cls:`text-amber-600 border-amber-300`},skipped:{icon:b,cls:`text-muted-foreground`}}[e]??{icon:b,cls:`text-muted-foreground`},n=t.icon;return(0,L.jsxs)(i,{variant:`outline`,className:`text-[10px] font-mono inline-flex items-center gap-1 ${t.cls}`,children:[(0,L.jsx)(n,{className:`h-3 w-3`}),e]})}function z(e){if(!e)return`—`;try{return new Date(e).toLocaleString()}catch{return e}}function B(e,t){switch(t){case`number`:{if(e===``)return;let t=Number(e);return Number.isNaN(t)?e:t}case`boolean`:return e===`true`;case`object`:case`list`:case`array`:if(e.trim()===``)return;try{return JSON.parse(e)}catch{return e}default:return e}}function V({data:e}){return(0,L.jsx)(`pre`,{className:`rounded border bg-muted/30 p-2 text-xs font-mono overflow-auto whitespace-pre-wrap break-all max-h-96`,children:JSON.stringify(e,null,2)})}function H(){let e=r()?.getClient?.(),[t,n]=(0,I.useState)([]),[i,o]=(0,I.useState)(!0),[s,c]=(0,I.useState)(null),[l,d]=(0,I.useState)(``),[f,m]=(0,I.useState)(0),h=(0,I.useCallback)(async()=>{if(!e?.meta?.getItems){c(`meta.getItems is not available on this client`),o(!1);return}o(!0),c(null);try{let t=await e.meta.getItems(`flow`),r=(Array.isArray(t)?t:Array.isArray(t?.items)?t.items:Array.isArray(t?.value)?t.value:[]).map(e=>({name:e?.spec?.name??e?.name,label:e?.spec?.label,spec:e?.spec??e,updatedAt:e?.updatedAt??e?.updated_at})).filter(e=>e.name);n(r),!l&&r.length>0&&d(r[0].name)}catch(e){c(e?.message??String(e))}finally{o(!1)}},[e,l]);(0,I.useEffect)(()=>{h()},[h]);let y=(0,I.useMemo)(()=>t.find(e=>e.name===l)??null,[t,l]);return(0,L.jsxs)(`div`,{className:`flex flex-col gap-4 p-4 sm:p-6`,children:[(0,L.jsxs)(`div`,{className:`min-w-0`,children:[(0,L.jsxs)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight flex items-center gap-2`,children:[(0,L.jsx)(F,{className:`h-5 w-5`}),`Flow Runs`]}),(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Pick a flow, trigger a test run with sample inputs, and inspect recent run history`})]}),(0,L.jsxs)(j,{children:[(0,L.jsx)(g,{className:`pb-3`,children:(0,L.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(v,{className:`text-base`,children:`Flow`}),(0,L.jsx)(_,{children:`Select a flow definition to test`})]}),(0,L.jsxs)(w,{variant:`outline`,size:`sm`,onClick:h,disabled:i,children:[(0,L.jsx)(a,{className:`h-3.5 w-3.5 mr-2 ${i?`animate-spin`:``}`}),`Refresh`]})]})}),(0,L.jsxs)(u,{children:[i&&(0,L.jsx)(p,{className:`h-9 w-72`}),s&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:s}),!i&&!s&&t.length===0&&(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No flow definitions found.`}),!i&&!s&&t.length>0&&(0,L.jsx)(`select`,{value:l,onChange:e=>d(e.target.value),className:`flex h-9 w-full max-w-md rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm focus:outline-none focus:ring-1 focus:ring-ring`,children:t.map(e=>(0,L.jsx)(`option`,{value:e.name,children:e.label?`${e.label} (${e.name})`:e.name},e.name))})]})]}),y&&(0,L.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,L.jsx)(U,{client:e,flow:y.spec,onExecuted:()=>m(e=>e+1)}),(0,L.jsx)(W,{client:e,flowName:y.name,refreshKey:f})]})]})}function U({client:e,flow:t,onExecuted:n}){let r=(0,I.useMemo)(()=>(t?.variables??[]).filter(e=>e?.isInput),[t]),[a,o]=(0,I.useState)({}),[c,l]=(0,I.useState)(!1),[d,p]=(0,I.useState)(null),[m,h]=(0,I.useState)(null);(0,I.useEffect)(()=>{o({}),p(null),h(null)},[t?.name]);let b=(e,t)=>o(n=>({...n,[e]:t}));return(0,L.jsxs)(j,{children:[(0,L.jsxs)(g,{className:`pb-3`,children:[(0,L.jsx)(v,{className:`text-base`,children:`Test Run`}),(0,L.jsx)(_,{children:`Provide input values and invoke the flow`})]}),(0,L.jsxs)(u,{className:`space-y-3`,children:[r.length===0&&(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`This flow declares no input variables. Click Run to invoke with no parameters.`}),r.map(e=>(0,L.jsxs)(`div`,{className:`grid gap-1.5`,children:[(0,L.jsxs)(k,{htmlFor:`var-${e.name}`,className:`flex items-center gap-2`,children:[(0,L.jsx)(`span`,{className:`font-mono text-xs`,children:e.name}),(0,L.jsx)(i,{variant:`outline`,className:`text-[10px] font-mono`,children:e.type})]}),e.type===`boolean`?(0,L.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,L.jsx)(C,{id:`var-${e.name}`,checked:a[e.name]===`true`,onCheckedChange:t=>b(e.name,t?`true`:`false`)}),(0,L.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:a[e.name]===`true`?`true`:`false`})]}):e.type===`object`||e.type===`list`||e.type===`array`?(0,L.jsx)(N,{id:`var-${e.name}`,placeholder:`JSON ${e.type}`,value:a[e.name]??``,onChange:t=>b(e.name,t.target.value),className:`font-mono text-xs min-h-[80px]`}):(0,L.jsx)(O,{id:`var-${e.name}`,type:e.type===`number`?`number`:`text`,value:a[e.name]??``,onChange:t=>b(e.name,t.target.value)})]},e.name)),(0,L.jsx)(`div`,{className:`pt-1`,children:(0,L.jsxs)(w,{onClick:async()=>{if(!e?.automation?.execute){h(`automation.execute is not available on this client`);return}l(!0),h(null),p(null);try{let i={};for(let e of r){let t=a[e.name];t!==void 0&&(i[e.name]=B(t,e.type))}p(await e.automation.execute(t.name,{params:i})),n?.()}catch(e){h(e?.message??String(e))}finally{l(!1)}},disabled:c,size:`sm`,children:[c?(0,L.jsx)(f,{className:`h-3.5 w-3.5 mr-2 animate-spin`}):(0,L.jsx)(s,{className:`h-3.5 w-3.5 mr-2`}),c?`Running…`:`Run Flow`]})}),(d||m)&&(0,L.jsxs)(`div`,{className:`pt-2 border-t mt-2 space-y-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-medium`,children:[m||d?.success===!1?(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(E,{className:`h-4 w-4 text-red-500`}),` Failed`]}):(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(y,{className:`h-4 w-4 text-emerald-500`}),` Result`]}),typeof d?.durationMs==`number`&&(0,L.jsxs)(i,{variant:`secondary`,className:`text-[10px] font-mono`,children:[d.durationMs,` ms`]})]}),m&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:m}),d&&(0,L.jsx)(V,{data:d})]})]})]})}function W({client:e,flowName:t,refreshKey:n}){let[r,s]=(0,I.useState)([]),[y,b]=(0,I.useState)(!0),[C,T]=(0,I.useState)(null),[E,O]=(0,I.useState)(null),[k,N]=(0,I.useState)(null),[F,B]=(0,I.useState)(!1),[H,U]=(0,I.useState)(null),W=(0,I.useCallback)(async()=>{if(!e?.automation?.listRuns){T(`automation.listRuns is not available on this client`),b(!1);return}b(!0),T(null);try{let n=await e.automation.listRuns(t,{limit:20});s(Array.isArray(n)?n:n?.items??n?.runs??[])}catch(e){T(e?.message??String(e))}finally{b(!1)}},[e,t]);(0,I.useEffect)(()=>{W()},[W,n]);let G=async n=>{O(n),N(null),U(null),B(!0);try{let r=await e.automation.getRun(t,n);N(r?.run??r)}catch(e){U(e?.message??String(e))}finally{B(!1)}};return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(j,{children:[(0,L.jsx)(g,{className:`pb-3`,children:(0,L.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(v,{className:`text-base`,children:`Recent Runs`}),(0,L.jsx)(_,{className:`font-mono text-xs`,children:t})]}),(0,L.jsxs)(w,{variant:`outline`,size:`sm`,onClick:W,disabled:y,children:[y?(0,L.jsx)(f,{className:`h-3.5 w-3.5 mr-2 animate-spin`}):(0,L.jsx)(a,{className:`h-3.5 w-3.5 mr-2`}),`Refresh`]})]})}),(0,L.jsxs)(u,{children:[y&&(0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(p,{className:`h-8 w-full`}),(0,L.jsx)(p,{className:`h-8 w-full`}),(0,L.jsx)(p,{className:`h-8 w-full`})]}),!y&&C&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:C}),!y&&!C&&r.length===0&&(0,L.jsx)(`p`,{className:`text-sm text-muted-foreground py-6 text-center`,children:`No runs yet. Use the Test Run panel to invoke this flow.`}),!y&&!C&&r.length>0&&(0,L.jsxs)(A,{children:[(0,L.jsx)(P,{children:(0,L.jsxs)(S,{children:[(0,L.jsx)(D,{children:`Run`}),(0,L.jsx)(D,{children:`Status`}),(0,L.jsx)(D,{children:`Started`}),(0,L.jsx)(D,{className:`text-right`,children:`Duration`})]})}),(0,L.jsx)(M,{children:r.map(e=>(0,L.jsxs)(S,{className:`cursor-pointer`,onClick:()=>G(e.id),children:[(0,L.jsxs)(x,{className:`font-mono text-xs`,children:[e.id.slice(0,12),`…`]}),(0,L.jsx)(x,{children:(0,L.jsx)(R,{status:e.status})}),(0,L.jsx)(x,{className:`text-xs text-muted-foreground`,children:z(e.startedAt)}),(0,L.jsx)(x,{className:`text-right font-mono text-xs`,children:typeof e.durationMs==`number`?`${e.durationMs} ms`:`—`})]},e.id))})]})]})]}),(0,L.jsx)(m,{open:!!E,onOpenChange:e=>{e||(O(null),N(null))},children:(0,L.jsxs)(o,{side:`right`,className:`w-full sm:max-w-2xl p-0 flex flex-col`,children:[(0,L.jsxs)(d,{className:`p-4 border-b`,children:[(0,L.jsxs)(h,{className:`font-mono text-sm break-all`,children:[`Run `,E]}),(0,L.jsx)(l,{children:k&&(0,L.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,L.jsx)(R,{status:k.status}),typeof k.durationMs==`number`&&(0,L.jsxs)(i,{variant:`secondary`,className:`text-[10px] font-mono`,children:[k.durationMs,` ms`]}),(0,L.jsx)(`span`,{className:`text-xs`,children:z(k.startedAt)})]})})]}),(0,L.jsxs)(c,{className:`flex-1 p-4`,children:[F&&(0,L.jsxs)(`div`,{className:`space-y-2`,children:[(0,L.jsx)(p,{className:`h-16 w-full`}),(0,L.jsx)(p,{className:`h-16 w-full`}),(0,L.jsx)(p,{className:`h-16 w-full`})]}),H&&(0,L.jsx)(`p`,{className:`text-sm text-red-500 font-mono break-all`,children:H}),!F&&k&&(0,L.jsx)(`div`,{className:`space-y-3`,children:Array.isArray(k.steps)&&k.steps.length>0?k.steps.map((e,t)=>(0,L.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,L.jsxs)(`span`,{className:`text-muted-foreground font-mono text-xs`,children:[`#`,t+1]}),(0,L.jsx)(`span`,{className:`font-mono text-sm font-medium`,children:e.nodeLabel||e.nodeId}),e.nodeType&&(0,L.jsx)(i,{variant:`outline`,className:`text-[10px] font-mono`,children:e.nodeType}),(0,L.jsx)(R,{status:e.status}),typeof e.durationMs==`number`&&(0,L.jsxs)(i,{variant:`secondary`,className:`text-[10px] font-mono ml-auto`,children:[e.durationMs,` ms`]})]}),e.input!==void 0&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-muted-foreground mb-1`,children:`Input`}),(0,L.jsx)(V,{data:e.input})]}),e.output!==void 0&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-muted-foreground mb-1`,children:`Output`}),(0,L.jsx)(V,{data:e.output})]}),e.error&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-red-500 mb-1`,children:`Error`}),(0,L.jsx)(V,{data:e.error})]})]},`${e.nodeId}-${t}`)):(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`div`,{className:`text-[10px] uppercase text-muted-foreground mb-1`,children:`Run`}),(0,L.jsx)(V,{data:k})]})})]})]})})]})}export{H as FlowRunsPage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,f as n,t as r,u as i}from"./vendor-react-DR370ovB.js";import{$n as a,Bn as o,Bo as s,Hn as c,Jn as l,Jr as u,
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,f as n,t as r,u as i}from"./vendor-react-DR370ovB.js";import{$n as a,Bn as o,Bo as s,Hn as c,Jn as l,Jr as u,Js as d,Ka as f,Ln as p,Rn as m,Vn as h,Wi as g,Wo as _,Xn as v,Xo as y,Yn as b,Zn as x,_i as S,ar as C,hr as w,ir as T,ks as E,nn as D,qn as O,rr as k,zn as A}from"./ui-components-D1FYlKrM.js";var j=e(t(),1),M=`objectstack`,N=`Query and modify data in an ObjectStack app over MCP — discover objects, read and filter records, and create/update/delete under your own permissions and row-level security. Use when the user wants to inspect or change data in their ObjectStack environment.`,P=`<YOUR_ENV_MCP_URL>`;function F(e={}){let t=e.mcpUrl?.trim()||P,n=e.envName?.trim();return`---
|
|
2
2
|
name: ${M}
|
|
3
3
|
description: ${N}
|
|
4
4
|
---
|
|
@@ -79,4 +79,4 @@ create/update payload.
|
|
|
79
79
|
3. \`query_records\` to read / verify current state.
|
|
80
80
|
4. \`create_record\` / \`update_record\` / \`delete_record\` to make changes,
|
|
81
81
|
confirming destructive steps with the user.
|
|
82
|
-
`}var I=r();function L(){let[e,t]=(0,j.useState)(!1);return[e,e=>{navigator.clipboard?.writeText(e),t(!0),setTimeout(()=>t(!1),1500)}]}function R({value:e,label:t}){let[n,r]=L();return(0,I.jsxs)(T,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 gap-1.5 px-2 text-xs`,onClick:()=>r(e),"aria-label":`Copy ${t??`value`}`,children:[n?(0,I.jsx)(m,{className:`size-3.5`}):(0,I.jsx)(x,{className:`size-3.5`}),n?`Copied`:`Copy`]})}function z(){let e=typeof window<`u`?window.location.origin:``,[t,n]=(0,j.useState)(null),[r,i]=(0,j.useState)(null),[a,u]=(0,j.useState)(`Agent key`),[_,v]=(0,j.useState)(!1),[M,N]=(0,j.useState)(null),[P,z]=(0,j.useState)(null),[B,V]=(0,j.useState)(!1),[H,U]=L();(0,j.useEffect)(()=>{let t=!1;return(async()=>{try{let r=await(await fetch(`/api/v1/discovery`,{credentials:`include`})).json().catch(()=>({})),a=r?.data?.routes?.mcp??r?.routes?.mcp;if(t)return;a?(n(a.startsWith(`http`)?a:`${e}${a}`),i(!0)):i(!1)}catch{t||i(!1)}})(),()=>{t=!0}},[e]);let W=async()=>{v(!0),N(null);try{let e=await fetch(`/api/v1/keys`,{method:`POST`,credentials:`include`,headers:{"content-type":`application/json`},body:JSON.stringify({name:a.trim()||`Agent key`})}),t=await e.json().catch(()=>({})),n=t?.data;if(!e.ok||!n?.key)throw Error(t?.error?.message||`Request failed (${e.status})`);z(n),V(!0)}catch(e){N(e?.message??`Failed to generate key`)}finally{v(!1)}},G=()=>{let e=F({mcpUrl:t??void 0}),n=new Blob([e],{type:`text/markdown;charset=utf-8`}),r=document.createElement(`a`);r.href=URL.createObjectURL(n),r.download=`SKILL.md`,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(r.href),1e3)},K=t??`${e}/api/v1/mcp`;return(0,I.jsxs)(O,{children:[(0,I.jsxs)(y,{className:`pb-2`,children:[(0,I.jsxs)(S,{className:`text-base flex items-center gap-2`,children:[(0,I.jsx)(f,{className:`size-4`}),` Connect an AI agent (MCP)`]}),(0,I.jsx)(b,{className:`text-xs`,children:`Every app in this environment is an agent-ready toolset. Connect Claude, Cursor, Codex or any MCP client — one connection covers all your apps (new ones appear automatically).`})]}),(0,I.jsxs)(l,{className:`flex flex-col gap-4`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`mb-1 text-xs font-medium text-muted-foreground`,children:`MCP endpoint`}),r===!1?(0,I.jsxs)(k,{children:[(0,I.jsx)(C,{className:`size-4`}),(0,I.jsx)(w,{children:`MCP is not enabled for this environment`}),(0,I.jsxs)(E,{className:`text-xs`,children:[`Connecting agents is opt-in. An admin can enable it by setting`,` `,(0,I.jsx)(`code`,{className:`font-mono`,children:`OS_MCP_SERVER_ENABLED=true`}),`. You can still generate a key and download the skill below.`]})]}):(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(`code`,{className:`flex-1 truncate rounded bg-muted px-2 py-1.5 font-mono text-xs`,children:K}),(0,I.jsx)(R,{value:K,label:`MCP URL`})]})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5 text-xs font-medium text-muted-foreground`,children:[(0,I.jsx)(d,{className:`size-3.5`}),` API key`]}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(D,{value:a,onChange:e=>u(e.target.value),placeholder:`Key name (e.g. Claude desktop)`,className:`h-8 max-w-xs text-sm`}),(0,I.jsx)(T,{type:`button`,size:`sm`,onClick:W,disabled:_,children:_?`Generating…`:`Generate key`})]}),(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`The key acts as you (your permissions + row-level security). Shown once — copy it immediately. Revoke anytime from the API Keys list.`}),M&&(0,I.jsx)(`p`,{className:`mt-1 text-xs text-destructive`,children:M})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`mb-1 text-xs font-medium text-muted-foreground`,children:`Agent skill (portable)`}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsxs)(T,{type:`button`,variant:`outline`,size:`sm`,className:`gap-1.5`,onClick:G,children:[(0,I.jsx)(s,{className:`size-4`}),` Download SKILL.md`]}),(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Works with any skills-capable agent (Claude, Codex, Gemini, Cursor…).`})]})]}),(0,I.jsxs)(`div`,{className:`rounded-lg border bg-muted/30 p-3 text-xs leading-relaxed`,children:[(0,I.jsx)(`div`,{className:`mb-1 font-medium`,children:`Connect in 3 steps`}),(0,I.jsxs)(`ol`,{className:`list-decimal space-y-0.5 pl-4 text-muted-foreground`,children:[(0,I.jsx)(`li`,{children:`Add a remote MCP server pointing at the endpoint above.`}),(0,I.jsxs)(`li`,{children:[`Set the header `,(0,I.jsx)(`code`,{className:`font-mono`,children:`x-api-key: <your key>`}),` (a session Bearer is `,(0,I.jsx)(`em`,{children:`not`}),` an API key).`]}),(0,I.jsxs)(`li`,{children:[`Drop in `,(0,I.jsx)(`code`,{className:`font-mono`,children:`SKILL.md`}),` so the agent knows how to drive your data.`]})]})]})]}),(0,I.jsx)(p,{open:B,onOpenChange:V,children:(0,I.jsxs)(h,{children:[(0,I.jsxs)(g,{children:[(0,I.jsxs)(c,{className:`flex items-center gap-2`,children:[(0,I.jsx)(d,{className:`size-4`}),` Your new API key`]}),(0,I.jsxs)(A,{children:[`Copy this now — for your security it will `,(0,I.jsx)(`strong`,{children:`not be shown again`}),`.`]})]}),(0,I.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(`code`,{className:`flex-1 break-all rounded bg-muted px-2 py-2 font-mono text-xs`,children:P?.key}),(0,I.jsxs)(T,{type:`button`,variant:`secondary`,size:`sm`,className:`gap-1.5`,onClick:()=>P&&U(P.key),children:[H?(0,I.jsx)(m,{className:`size-3.5`}):(0,I.jsx)(x,{className:`size-3.5`}),H?`Copied`:`Copy`]})]}),(0,I.jsxs)(k,{children:[(0,I.jsx)(C,{className:`size-4`}),(0,I.jsxs)(E,{className:`text-xs`,children:[`Send it as `,(0,I.jsx)(`code`,{className:`font-mono`,children:`x-api-key`}),`. It carries your permissions — store it like a password and revoke it if leaked.`]})]})]}),(0,I.jsx)(o,{children:(0,I.jsx)(T,{type:`button`,onClick:()=>V(!1),children:`Done`})})]})})]})}var B={GET:`bg-emerald-500/10 text-emerald-700 dark:text-emerald-400`,POST:`bg-blue-500/10 text-blue-700 dark:text-blue-400`,PATCH:`bg-amber-500/10 text-amber-700 dark:text-amber-400`,DELETE:`bg-red-500/10 text-red-700 dark:text-red-400`};function V({value:e,label:t}){let[n,r]=(0,j.useState)(!1);return(0,I.jsxs)(T,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 gap-1.5 px-2 text-xs`,onClick:()=>{navigator.clipboard?.writeText(e),r(!0),setTimeout(()=>r(!1),1500)},"aria-label":`Copy ${t??`value`}`,children:[n?(0,I.jsx)(m,{className:`size-3.5`}):(0,I.jsx)(x,{className:`size-3.5`}),n?`Copied`:`Copy`]})}function H(){let e=i(),{appName:t}=n(),r=t?`/apps/${t}`:``,o=typeof window<`u`?window.location.origin:``,[s,c]=(0,j.useState)([]),[f,p]=(0,j.useState)(!0),[m,h]=(0,j.useState)(null);(0,j.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await fetch(`/api/v1/meta/object`,{credentials:`include`});if(!t.ok)throw Error(`meta/object ${t.status}`);let n=await t.json(),r=n?.data??n?.items??n??[],i=(Array.isArray(r)?r:[]).map(e=>({name:String(e.name??``),label:e.label||void 0})).filter(e=>e.name&&!e.name.startsWith(`sys_`));e||c(i)}catch(t){e||h(t?.message??`failed to load objects`)}finally{e||p(!1)}})(),()=>{e=!0}},[]);let g=s[0]?.name??`your_object`,x=(0,j.useMemo)(()=>`# List ${g} records\ncurl "${o}/api/v1/data/${g}?$top=10" \\\n -H "x-api-key: <YOUR_API_KEY>"`,[o,g]),C=e=>[{method:`GET`,path:`/api/v1/data/${e}`,desc:`List / query`},{method:`POST`,path:`/api/v1/data/${e}`,desc:`Create`},{method:`GET`,path:`/api/v1/data/${e}/:id`,desc:`Read one`},{method:`PATCH`,path:`/api/v1/data/${e}/:id`,desc:`Update`},{method:`DELETE`,path:`/api/v1/data/${e}/:id`,desc:`Delete`}];return(0,I.jsxs)(`div`,{className:`flex flex-col gap-6 p-4 sm:p-6`,children:[(0,I.jsxs)(`div`,{className:`min-w-0`,children:[(0,I.jsxs)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight flex items-center gap-2`,children:[(0,I.jsx)(_,{className:`size-5 text-primary`}),` Integrations & APIs`]}),(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Every object you build is instantly a REST API. Drive your app from code or an agent.`})]}),(0,I.jsxs)(O,{children:[(0,I.jsxs)(y,{className:`pb-2`,children:[(0,I.jsx)(S,{className:`text-base`,children:`Base URL`}),(0,I.jsx)(b,{className:`text-xs`,children:`This environment's API root.`})]}),(0,I.jsxs)(l,{className:`flex items-center gap-2`,children:[(0,I.jsxs)(`code`,{className:`flex-1 truncate rounded bg-muted px-2 py-1.5 font-mono text-xs`,children:[o,`/api/v1`]}),(0,I.jsx)(V,{value:`${o}/api/v1`,label:`base URL`})]})]}),(0,I.jsx)(z,{}),(0,I.jsxs)(O,{children:[(0,I.jsxs)(y,{className:`pb-2 flex flex-row items-center justify-between`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsxs)(S,{className:`text-base flex items-center gap-2`,children:[(0,I.jsx)(v,{className:`size-4`}),` REST endpoints`]}),(0,I.jsx)(b,{className:`text-xs`,children:`Auto-generated CRUD for every published object (OData query params on list).`})]}),(0,I.jsxs)(T,{type:`button`,variant:`outline`,size:`sm`,className:`gap-1.5`,onClick:()=>e(`${r}/developer/api-console`),children:[(0,I.jsx)(u,{className:`size-4`}),` Open API Console`]})]}),(0,I.jsxs)(l,{className:`flex flex-col gap-4`,children:[f&&(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading objects…`}),m&&(0,I.jsxs)(`p`,{className:`text-sm text-destructive`,children:[`Couldn't load objects: `,m]}),!f&&!m&&s.length===0&&(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No business objects yet — build one with the AI assistant, publish it, and it appears here as an API.`}),s.map(e=>(0,I.jsxs)(`div`,{className:`rounded-lg border`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-3 py-2`,children:[(0,I.jsx)(`span`,{className:`font-medium text-sm`,children:e.label||e.name}),(0,I.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground`,children:e.name})]}),(0,I.jsx)(`div`,{className:`divide-y`,children:C(e.name).map(e=>(0,I.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-1.5`,children:[(0,I.jsx)(a,{className:`w-16 justify-center font-mono text-[10px] ${B[e.method]??``}`,children:e.method}),(0,I.jsx)(`code`,{className:`flex-1 truncate font-mono text-xs`,children:e.path}),(0,I.jsx)(`span`,{className:`hidden shrink-0 text-xs text-muted-foreground sm:inline`,children:e.desc})]},e.method+e.path))})]},e.name))]})]}),(0,I.jsxs)(O,{children:[(0,I.jsx)(y,{className:`pb-2`,children:(0,I.jsxs)(S,{className:`text-base flex items-center gap-2`,children:[(0,I.jsx)(d,{className:`size-4`}),` Authentication`]})}),(0,I.jsxs)(l,{className:`flex flex-col gap-2 text-sm text-muted-foreground`,children:[(0,I.jsxs)(`p`,{children:[`In the console you're already authenticated — use `,(0,I.jsx)(`strong`,{children:`Open API Console`}),` above to call these endpoints now.`]}),(0,I.jsxs)(`p`,{children:[`For external programs and AI agents, generate a `,(0,I.jsx)(`strong`,{children:`self-serve API key`}),` in the `,(0,I.jsx)(`strong`,{children:`Connect an AI agent`}),` section above. Send it as the`,` `,(0,I.jsx)(`code`,{className:`font-mono text-xs`,children:`x-api-key`}),` header; it runs under your permissions and row-level security, and is revocable.`]})]})]}),(0,I.jsxs)(O,{children:[(0,I.jsxs)(y,{className:`pb-2 flex flex-row items-center justify-between`,children:[(0,I.jsx)(S,{className:`text-base`,children:`Sample (cURL)`}),(0,I.jsx)(V,{value:x,label:`cURL sample`})]}),(0,I.jsx)(l,{children:(0,I.jsx)(`pre`,{className:`overflow-x-auto rounded bg-muted p-3 font-mono text-xs leading-relaxed`,children:x})})]})]})}export{H as IntegrationsPage};
|
|
82
|
+
`}var I=r();function L(){let[e,t]=(0,j.useState)(!1);return[e,e=>{navigator.clipboard?.writeText(e),t(!0),setTimeout(()=>t(!1),1500)}]}function R({value:e,label:t}){let[n,r]=L();return(0,I.jsxs)(w,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 gap-1.5 px-2 text-xs`,onClick:()=>r(e),"aria-label":`Copy ${t??`value`}`,children:[n?(0,I.jsx)(E,{className:`size-3.5`}):(0,I.jsx)(y,{className:`size-3.5`}),n?`Copied`:`Copy`]})}function z(){let e=typeof window<`u`?window.location.origin:``,[t,n]=(0,j.useState)(null),[r,i]=(0,j.useState)(null),[a,u]=(0,j.useState)(`Agent key`),[g,_]=(0,j.useState)(!1),[M,N]=(0,j.useState)(null),[P,z]=(0,j.useState)(null),[B,V]=(0,j.useState)(!1),[H,U]=L();(0,j.useEffect)(()=>{let t=!1;return(async()=>{try{let r=await(await fetch(`/api/v1/discovery`,{credentials:`include`})).json().catch(()=>({})),a=r?.data?.routes?.mcp??r?.routes?.mcp;if(t)return;a?(n(a.startsWith(`http`)?a:`${e}${a}`),i(!0)):i(!1)}catch{t||i(!1)}})(),()=>{t=!0}},[e]);let W=async()=>{_(!0),N(null);try{let e=await fetch(`/api/v1/keys`,{method:`POST`,credentials:`include`,headers:{"content-type":`application/json`},body:JSON.stringify({name:a.trim()||`Agent key`})}),t=await e.json().catch(()=>({})),n=t?.data;if(!e.ok||!n?.key)throw Error(t?.error?.message||`Request failed (${e.status})`);z(n),V(!0)}catch(e){N(e?.message??`Failed to generate key`)}finally{_(!1)}},G=()=>{let e=F({mcpUrl:t??void 0}),n=new Blob([e],{type:`text/markdown;charset=utf-8`}),r=document.createElement(`a`);r.href=URL.createObjectURL(n),r.download=`SKILL.md`,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(r.href),1e3)},K=t??`${e}/api/v1/mcp`;return(0,I.jsxs)(O,{children:[(0,I.jsxs)(v,{className:`pb-2`,children:[(0,I.jsxs)(x,{className:`text-base flex items-center gap-2`,children:[(0,I.jsx)(d,{className:`size-4`}),` Connect an AI agent (MCP)`]}),(0,I.jsx)(b,{className:`text-xs`,children:`Every app in this environment is an agent-ready toolset. Connect Claude, Cursor, Codex or any MCP client — one connection covers all your apps (new ones appear automatically).`})]}),(0,I.jsxs)(l,{className:`flex flex-col gap-4`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`mb-1 text-xs font-medium text-muted-foreground`,children:`MCP endpoint`}),r===!1?(0,I.jsxs)(k,{children:[(0,I.jsx)(S,{className:`size-4`}),(0,I.jsx)(C,{children:`MCP is not enabled for this environment`}),(0,I.jsxs)(T,{className:`text-xs`,children:[`Connecting agents is opt-in. An admin can enable it by setting`,` `,(0,I.jsx)(`code`,{className:`font-mono`,children:`OS_MCP_SERVER_ENABLED=true`}),`. You can still generate a key and download the skill below.`]})]}):(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(`code`,{className:`flex-1 truncate rounded bg-muted px-2 py-1.5 font-mono text-xs`,children:K}),(0,I.jsx)(R,{value:K,label:`MCP URL`})]})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsxs)(`div`,{className:`mb-1 flex items-center gap-1.5 text-xs font-medium text-muted-foreground`,children:[(0,I.jsx)(f,{className:`size-3.5`}),` API key`]}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(D,{value:a,onChange:e=>u(e.target.value),placeholder:`Key name (e.g. Claude desktop)`,className:`h-8 max-w-xs text-sm`}),(0,I.jsx)(w,{type:`button`,size:`sm`,onClick:W,disabled:g,children:g?`Generating…`:`Generate key`})]}),(0,I.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:`The key acts as you (your permissions + row-level security). Shown once — copy it immediately. Revoke anytime from the API Keys list.`}),M&&(0,I.jsx)(`p`,{className:`mt-1 text-xs text-destructive`,children:M})]}),(0,I.jsxs)(`div`,{children:[(0,I.jsx)(`div`,{className:`mb-1 text-xs font-medium text-muted-foreground`,children:`Agent skill (portable)`}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsxs)(w,{type:`button`,variant:`outline`,size:`sm`,className:`gap-1.5`,onClick:G,children:[(0,I.jsx)(s,{className:`size-4`}),` Download SKILL.md`]}),(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Works with any skills-capable agent (Claude, Codex, Gemini, Cursor…).`})]})]}),(0,I.jsxs)(`div`,{className:`rounded-lg border bg-muted/30 p-3 text-xs leading-relaxed`,children:[(0,I.jsx)(`div`,{className:`mb-1 font-medium`,children:`Connect in 3 steps`}),(0,I.jsxs)(`ol`,{className:`list-decimal space-y-0.5 pl-4 text-muted-foreground`,children:[(0,I.jsx)(`li`,{children:`Add a remote MCP server pointing at the endpoint above.`}),(0,I.jsxs)(`li`,{children:[`Set the header `,(0,I.jsx)(`code`,{className:`font-mono`,children:`x-api-key: <your key>`}),` (a session Bearer is `,(0,I.jsx)(`em`,{children:`not`}),` an API key).`]}),(0,I.jsxs)(`li`,{children:[`Drop in `,(0,I.jsx)(`code`,{className:`font-mono`,children:`SKILL.md`}),` so the agent knows how to drive your data.`]})]})]})]}),(0,I.jsx)(p,{open:B,onOpenChange:V,children:(0,I.jsxs)(m,{children:[(0,I.jsxs)(h,{children:[(0,I.jsxs)(c,{className:`flex items-center gap-2`,children:[(0,I.jsx)(f,{className:`size-4`}),` Your new API key`]}),(0,I.jsxs)(A,{children:[`Copy this now — for your security it will `,(0,I.jsx)(`strong`,{children:`not be shown again`}),`.`]})]}),(0,I.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(`code`,{className:`flex-1 break-all rounded bg-muted px-2 py-2 font-mono text-xs`,children:P?.key}),(0,I.jsxs)(w,{type:`button`,variant:`secondary`,size:`sm`,className:`gap-1.5`,onClick:()=>P&&U(P.key),children:[H?(0,I.jsx)(E,{className:`size-3.5`}):(0,I.jsx)(y,{className:`size-3.5`}),H?`Copied`:`Copy`]})]}),(0,I.jsxs)(k,{children:[(0,I.jsx)(S,{className:`size-4`}),(0,I.jsxs)(T,{className:`text-xs`,children:[`Send it as `,(0,I.jsx)(`code`,{className:`font-mono`,children:`x-api-key`}),`. It carries your permissions — store it like a password and revoke it if leaked.`]})]})]}),(0,I.jsx)(o,{children:(0,I.jsx)(w,{type:`button`,onClick:()=>V(!1),children:`Done`})})]})})]})}var B={GET:`bg-emerald-500/10 text-emerald-700 dark:text-emerald-400`,POST:`bg-blue-500/10 text-blue-700 dark:text-blue-400`,PATCH:`bg-amber-500/10 text-amber-700 dark:text-amber-400`,DELETE:`bg-red-500/10 text-red-700 dark:text-red-400`};function V({value:e,label:t}){let[n,r]=(0,j.useState)(!1);return(0,I.jsxs)(w,{type:`button`,variant:`ghost`,size:`sm`,className:`h-7 gap-1.5 px-2 text-xs`,onClick:()=>{navigator.clipboard?.writeText(e),r(!0),setTimeout(()=>r(!1),1500)},"aria-label":`Copy ${t??`value`}`,children:[n?(0,I.jsx)(E,{className:`size-3.5`}):(0,I.jsx)(y,{className:`size-3.5`}),n?`Copied`:`Copy`]})}function H(){let e=i(),{appName:t}=n(),r=t?`/apps/${t}`:``,o=typeof window<`u`?window.location.origin:``,[s,c]=(0,j.useState)([]),[d,p]=(0,j.useState)(!0),[m,h]=(0,j.useState)(null);(0,j.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await fetch(`/api/v1/meta/object`,{credentials:`include`});if(!t.ok)throw Error(`meta/object ${t.status}`);let n=await t.json(),r=n?.data??n?.items??n??[],i=(Array.isArray(r)?r:[]).map(e=>({name:String(e.name??``),label:e.label||void 0})).filter(e=>e.name&&!e.name.startsWith(`sys_`));e||c(i)}catch(t){e||h(t?.message??`failed to load objects`)}finally{e||p(!1)}})(),()=>{e=!0}},[]);let y=s[0]?.name??`your_object`,S=(0,j.useMemo)(()=>`# List ${y} records\ncurl "${o}/api/v1/data/${y}?$top=10" \\\n -H "x-api-key: <YOUR_API_KEY>"`,[o,y]),C=e=>[{method:`GET`,path:`/api/v1/data/${e}`,desc:`List / query`},{method:`POST`,path:`/api/v1/data/${e}`,desc:`Create`},{method:`GET`,path:`/api/v1/data/${e}/:id`,desc:`Read one`},{method:`PATCH`,path:`/api/v1/data/${e}/:id`,desc:`Update`},{method:`DELETE`,path:`/api/v1/data/${e}/:id`,desc:`Delete`}];return(0,I.jsxs)(`div`,{className:`flex flex-col gap-6 p-4 sm:p-6`,children:[(0,I.jsxs)(`div`,{className:`min-w-0`,children:[(0,I.jsxs)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight flex items-center gap-2`,children:[(0,I.jsx)(g,{className:`size-5 text-primary`}),` Integrations & APIs`]}),(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Every object you build is instantly a REST API. Drive your app from code or an agent.`})]}),(0,I.jsxs)(O,{children:[(0,I.jsxs)(v,{className:`pb-2`,children:[(0,I.jsx)(x,{className:`text-base`,children:`Base URL`}),(0,I.jsx)(b,{className:`text-xs`,children:`This environment's API root.`})]}),(0,I.jsxs)(l,{className:`flex items-center gap-2`,children:[(0,I.jsxs)(`code`,{className:`flex-1 truncate rounded bg-muted px-2 py-1.5 font-mono text-xs`,children:[o,`/api/v1`]}),(0,I.jsx)(V,{value:`${o}/api/v1`,label:`base URL`})]})]}),(0,I.jsx)(z,{}),(0,I.jsxs)(O,{children:[(0,I.jsxs)(v,{className:`pb-2 flex flex-row items-center justify-between`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsxs)(x,{className:`text-base flex items-center gap-2`,children:[(0,I.jsx)(_,{className:`size-4`}),` REST endpoints`]}),(0,I.jsx)(b,{className:`text-xs`,children:`Auto-generated CRUD for every published object (OData query params on list).`})]}),(0,I.jsxs)(w,{type:`button`,variant:`outline`,size:`sm`,className:`gap-1.5`,onClick:()=>e(`${r}/developer/api-console`),children:[(0,I.jsx)(u,{className:`size-4`}),` Open API Console`]})]}),(0,I.jsxs)(l,{className:`flex flex-col gap-4`,children:[d&&(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading objects…`}),m&&(0,I.jsxs)(`p`,{className:`text-sm text-destructive`,children:[`Couldn't load objects: `,m]}),!d&&!m&&s.length===0&&(0,I.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No business objects yet — build one with the AI assistant, publish it, and it appears here as an API.`}),s.map(e=>(0,I.jsxs)(`div`,{className:`rounded-lg border`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-3 py-2`,children:[(0,I.jsx)(`span`,{className:`font-medium text-sm`,children:e.label||e.name}),(0,I.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground`,children:e.name})]}),(0,I.jsx)(`div`,{className:`divide-y`,children:C(e.name).map(e=>(0,I.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-1.5`,children:[(0,I.jsx)(a,{className:`w-16 justify-center font-mono text-[10px] ${B[e.method]??``}`,children:e.method}),(0,I.jsx)(`code`,{className:`flex-1 truncate font-mono text-xs`,children:e.path}),(0,I.jsx)(`span`,{className:`hidden shrink-0 text-xs text-muted-foreground sm:inline`,children:e.desc})]},e.method+e.path))})]},e.name))]})]}),(0,I.jsxs)(O,{children:[(0,I.jsx)(v,{className:`pb-2`,children:(0,I.jsxs)(x,{className:`text-base flex items-center gap-2`,children:[(0,I.jsx)(f,{className:`size-4`}),` Authentication`]})}),(0,I.jsxs)(l,{className:`flex flex-col gap-2 text-sm text-muted-foreground`,children:[(0,I.jsxs)(`p`,{children:[`In the console you're already authenticated — use `,(0,I.jsx)(`strong`,{children:`Open API Console`}),` above to call these endpoints now.`]}),(0,I.jsxs)(`p`,{children:[`For external programs and AI agents, generate a `,(0,I.jsx)(`strong`,{children:`self-serve API key`}),` in the `,(0,I.jsx)(`strong`,{children:`Connect an AI agent`}),` section above. Send it as the`,` `,(0,I.jsx)(`code`,{className:`font-mono text-xs`,children:`x-api-key`}),` header; it runs under your permissions and row-level security, and is revocable.`]})]})]}),(0,I.jsxs)(O,{children:[(0,I.jsxs)(v,{className:`pb-2 flex flex-row items-center justify-between`,children:[(0,I.jsx)(x,{className:`text-base`,children:`Sample (cURL)`}),(0,I.jsx)(V,{value:S,label:`cURL sample`})]}),(0,I.jsx)(l,{children:(0,I.jsx)(`pre`,{className:`overflow-x-auto rounded bg-muted p-3 font-mono text-xs leading-relaxed`,children:S})})]})]})}export{H as IntegrationsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,p as n,t as r,u as i}from"./vendor-react-DR370ovB.js";import{F as a,L as o,T as s,r as c,w as l}from"./framework-DCMHw4uc.js";import{H as u,I as d,R as f,Wo as p,z as m}from"./ui-components-D1FYlKrM.js";import"./MetadataProvider-xgIDLxXw.js";import{t as h}from"./RecordDetailView-Dg0FtCgX.js";import{c as ee}from"./plugins-views-DvIN271Q.js";var g=e(t(),1),_=`uf_`;function v(e){let t={};return e.forEach((e,n)=>{if(n.startsWith(_)&&e!==``){let r=n.slice(3);t[r]=e.split(`,`).map(e=>{try{return decodeURIComponent(e)}catch{return e}})}}),Object.keys(t).length>0?t:void 0}function y(e,t){let n=new URLSearchParams(e);for(let[e,r]of Object.entries(t)){let t=_+e;r&&r.length>0?n.set(t,r.map(e=>encodeURIComponent(String(e))).join(`,`)):n.delete(t)}return n}var b=r();function x(e){return Array.isArray(e?.columns)&&e.columns.length>0}function S(e,t){let n=e?.listViews||e?.list_views||{},r=(t?[n[`${e?.name}.${t}`],n[t],...t==="default"||t===`list`?[e?.list]:[]]:[e?.list,...Object.values(n)]).filter(Boolean);return r.find(x)??r[0]}var C=new Set([`id`,`created_at`,`createdAt`,`updated_at`,`updatedAt`,`deleted_at`,`deletedAt`,`created_by`,`createdBy`,`updated_by`,`updatedBy`,`_version`,`_rev`]);function w(e){if(Array.isArray(e?.compactLayout)&&e.compactLayout.length>0)return e.compactLayout.filter(t=>e.fields?.[t]);let t=e?.fields;return t&&typeof t==`object`?Object.entries(t).filter(([e,t])=>t&&!t.hidden&&!C.has(e)).map(([e])=>e).slice(0,6):[]}function T(e,t){let n=e?.fields;if(!(!n||typeof n!=`object`))return Object.entries(n).find(([e,n])=>n&&!n.hidden&&!C.has(e)&&t(e,n))?.[0]}var E=new Set([`select`,`multiselect`,`radio`,`enum`,`boolean`]),D=new Set([`date`,`datetime`,`time`]),O=new Set([`image`,`file`,`attachment`,`avatar`,`photo`]);function k(e){let t=T(e,(e,t)=>E.has(t.type))??T(e,e=>/status|stage|state|priority|category|kind/i.test(e));return t?{groupField:t,groupByField:t}:void 0}function A(e){return T(e,(e,t)=>D.has(t.type))??T(e,e=>/date|due|start|end|deadline|schedule/i.test(e))}function j(e){let t=A(e);return t?{startDateField:t}:void 0}function M(e){let t=T(e,(e,t)=>O.has(t.type));return t?{coverField:t}:void 0}var N=new Set([`location`,`geo`,`geolocation`,`geopoint`,`point`]);function P(e){let t=T(e,(e,t)=>D.has(t.type)&&/start|begin|kickoff/i.test(e))??T(e,(e,t)=>D.has(t.type));if(!t)return;let n=T(e,(e,n)=>D.has(n.type)&&e!==t&&/end|due|finish|deadline|close/i.test(e))??T(e,(e,n)=>D.has(n.type)&&e!==t);if(!n)return;let r=T(e,(e,t)=>(t.type===`number`||t.type===`percent`)&&/progress|percent|complete/i.test(e));return{startDateField:t,endDateField:n,...r?{progressField:r}:{}}}function F(e){let t=T(e,(e,t)=>N.has(t.type))??T(e,e=>/location|address|geo|coords?|place|venue/i.test(e));return t?{locationField:t}:void 0}function I({page:e,className:t,onConfigChange:r}){let{t:_}=c(),{objects:C}=s(),T=l(),E=i(),[D,O]=n(),[A]=g.useState(()=>v(new URLSearchParams(window.location.search))),N=g.useCallback(e=>{O(t=>y(t,e),{replace:!0})},[O]),I=e?.interfaceConfig||{},L=g.useMemo(()=>(C||[]).find(e=>e.name===I.source),[C,I.source]),R=g.useMemo(()=>S(L,I.sourceView),[L,I.sourceView]),z=I.recordAction===`page`||I.recordAction===`modal`||I.recordAction===`none`?I.recordAction:`drawer`,B=g.useCallback(e=>`/apps/${window.location.pathname.split(`/`)[2]||``}/${I.source}/record/${encodeURIComponent(String(e))}`,[I.source]),V=a({navigation:{mode:z===`none`?`none`:z},objectName:I.source,onNavigate:e=>E(B(e))}),H=D.get(`recordId`),U=g.useCallback((e,t)=>{if(z===`none`)return;let n=e?.id??e?._id;if(t&&(t.metaKey||t.ctrlKey||t.button===1)&&n!=null){window.open(B(n),`_blank`);return}if((z===`drawer`||z===`modal`)&&n!=null){O(e=>{let t=new URLSearchParams(e);return t.set(`recordId`,String(n)),t});return}V.handleClick(e,t)},[z,B,V,O]),W=g.useCallback(()=>{O(e=>{let t=new URLSearchParams(e);return t.delete(`recordId`),t})},[O]);g.useEffect(()=>{H&&!V.isOpen?V.open({id:H}):!H&&V.isOpen&&V.close()},[H]);let G=L?.name,K=!!R&&!x(R),q=R?.name??(I.sourceView?`${I.source}.${I.sourceView}`:void 0),[J,Y]=g.useState(null);g.useEffect(()=>{let e=!1;if(Y(null),!(!G||!I.source||!K||!q))return(async()=>{try{let t=T,n=null;typeof t?.listViewOverrides==`function`&&(n=(await t.listViewOverrides(I.source))?.[q]??null),!x(n)&&typeof t?.getView==`function`&&(n=await t.getView(I.source,q)),!e&&n&&typeof n==`object`&&Y(n)}catch{}})(),()=>{e=!0}},[G,I.source,I.sourceView,K,q,T]);let X=g.useMemo(()=>J?{...R,...J}:R,[R,J]),Z=JSON.stringify(X??null),Q=g.useMemo(()=>{if(!L)return;let e=X||{},t=I.appearance??e.appearance,n=t?.allowedVisualizations||[],r=new Set(n),i=I.userActions||{},a=e.kanban??(r.has(`kanban`)?k(L):void 0),o=e.calendar??(r.has(`calendar`)?j(L):void 0),s=e.timeline??(r.has(`timeline`)?j(L):void 0),c=e.gallery??(r.has(`gallery`)?M(L):void 0),l=e.gantt??(r.has(`gantt`)?P(L):void 0),u=e.options?.map??(r.has(`map`)?F(L):void 0),d=[...Array.isArray(e.filter)?e.filter:[],...Array.isArray(I.filterBy)?I.filterBy:[]],f=x(I)?I.columns:x(e)?e.columns:w(L),p=Array.isArray(I.sort)&&I.sort.length?I.sort:e.sort;return{type:`list-view`,objectName:L.name,viewType:n[0]??e.type??`grid`,fields:f,...d.length?{filters:d}:{},...p?.length?{sort:p}:{},grouping:e.grouping,rowColor:e.rowColor,pagination:e.pagination,searchableFields:e.searchableFields,emptyState:e.emptyState,kanban:a,calendar:o,gallery:c,timeline:s,gantt:l,...u||e.options?{options:{...e.options??{},...u?{map:u}:{}}}:{},userFilters:I.userFilters??e.userFilters,appearance:t,showViewSwitcher:n.length>1,showRecordCount:I.showRecordCount,addRecord:I.addRecord,showSearch:i.search!==!1,showSort:i.sort!==!1,showFilters:i.filter===!0,showDensity:i.rowHeight===!0,showHideFields:!1,showGroup:!1,showColor:!1,allowExport:!1,inlineEdit:!1}},[G,Z,I]);if(!L||!Q)return(0,b.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,b.jsxs)(f,{children:[(0,b.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,b.jsx)(p,{className:`h-6 w-6 text-muted-foreground`})}),(0,b.jsx)(u,{children:_(`empty.objectNotFound`,{defaultValue:`Source object not found`})}),(0,b.jsx)(m,{children:_(`empty.interfacePageSourceMissing`,{defaultValue:`This interface page references "{{name}}", which is not available.`,name:I.source||`?`})})]})});let $=Array.isArray(I.buttons)&&I.buttons.length?I.buttons.map(e=>(L.actions||[]).find(t=>t?.name===e)).filter(Boolean).map(e=>({...e,locations:[`list_toolbar`]})):[];return(0,b.jsxs)(`div`,{className:t??`h-full flex flex-col`,"data-testid":`interface-list-page`,children:[(0,b.jsxs)(`div`,{className:`px-4 pt-4 pb-2 shrink-0 flex items-start justify-between gap-3`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`h1`,{className:`text-lg font-semibold leading-tight`,children:typeof e.label==`string`?e.label:e.name}),typeof e.description==`string`&&e.description&&(0,b.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:e.description})]}),$.length>0&&(0,b.jsx)(`div`,{className:`shrink-0`,"data-testid":`interface-page-buttons`,children:(0,b.jsx)(o,{schema:{type:`action:bar`,location:`list_toolbar`,actions:$,size:`sm`,variant:`outline`}})})]}),(0,b.jsx)(`div`,{className:`flex-1 min-h-0 overflow-auto`,children:(0,b.jsx)(ee,{schema:Q,dataSource:T,userFilterSelections:A,onUserFilterSelectionsChange:N,onSortChange:r?e=>r({sort:e}):void 0,onColumnStateChange:r?e=>{e?.order?.length&&r({columns:e.order})}:void 0,onRowClick:z===`none`?void 0:U})}),V.isOverlay&&(0,b.jsx)(d,{...V,setIsOpen:e=>{e||W()},title:typeof e.label==`string`?e.label:I.source||`Record`,children:e=>(0,b.jsx)(h,{objectNameOverride:I.source,recordIdOverride:String(e?.id??e?._id??H??``),embedded:!0,dataSource:T,objects:C,onEdit:()=>{}})})]})}export{y as n,v as r,I as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./vendor-react-DR370ovB.js";import{$n as t,At as n,Ot as r,_i as i,ja as a,jt as o,kt as s,
|
|
1
|
+
import{t as e}from"./vendor-react-DR370ovB.js";import{$n as t,At as n,Ot as r,_i as i,ja as a,jt as o,kt as s,mc as c,uc as l,yi as u}from"./ui-components-D1FYlKrM.js";var d=e(),f={config:{icon:u,short:`Admin config`,title:`Administrator configuration`,body:()=>`These rows define how the platform behaves at runtime. Author them here; the runtime data they produce lives in a separate table.`,tone:`border-sky-300/60 bg-sky-50 text-sky-900 hover:bg-sky-100 dark:border-sky-500/40 dark:bg-sky-950/40 dark:text-sky-100`},system:{icon:a,short:`System-managed`,title:`Managed by the platform`,body:()=>`Rows here are created automatically when actions run on the source record. The list below is a read-only monitoring surface — row-level actions (Approve, Recall, Resend, …) live on each row.`,tone:`border-slate-300/60 bg-slate-50 text-slate-900 hover:bg-slate-100 dark:border-slate-500/40 dark:bg-slate-950/40 dark:text-slate-100`},"append-only":{icon:l,short:`Read-only · Audit log`,title:`Read-only historical record`,body:()=>`Immutable audit log. Rows cannot be created, edited, or deleted from the UI — they're written by the platform when events occur. Use Export to download for compliance review.`,tone:`border-zinc-300/60 bg-zinc-50 text-zinc-900 hover:bg-zinc-100 dark:border-zinc-500/40 dark:bg-zinc-950/40 dark:text-zinc-100`},"better-auth":{icon:i,short:`Identity`,title:`Managed by the identity provider`,body:e=>`This object's schema is owned by ${e}. Direct edits bypass password hashing, session validation, two-factor checks, and audit hooks. Use the dedicated identity workflows instead (Invite User, Reset Password, Revoke Session, Rotate Key, …).`,tone:`border-amber-300/60 bg-amber-50 text-amber-900 hover:bg-amber-100 dark:border-amber-500/40 dark:bg-amber-950/40 dark:text-amber-100`}};function p({managedBy:e,label:i,className:a}){if(!e||e===`platform`)return null;let l=f[e];if(!l)return null;let u=l.icon,p=i??`better-auth`;return(0,d.jsx)(n,{delayDuration:200,children:(0,d.jsxs)(r,{children:[(0,d.jsx)(o,{asChild:!0,children:(0,d.jsxs)(t,{variant:`outline`,"data-testid":`managed-by-badge`,"data-bucket":e,className:c(`gap-1 font-normal text-[11px] leading-none py-0.5 px-1.5 cursor-help`,l.tone,a),children:[(0,d.jsx)(u,{className:`h-3 w-3`,"aria-hidden":`true`}),(0,d.jsx)(`span`,{children:l.short})]})}),(0,d.jsxs)(s,{side:`bottom`,align:`start`,className:`max-w-xs text-xs leading-relaxed`,children:[(0,d.jsx)(`p`,{className:`font-semibold mb-1`,children:l.title}),(0,d.jsx)(`p`,{className:`text-muted-foreground`,children:l.body(p)})]})]})})}export{p as t};
|
package/dist/assets/{MarketplaceAccessDenied-CXUE33gy.js → MarketplaceAccessDenied-DvMKTKZG.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as e,t,u as n}from"./vendor-react-DR370ovB.js";import{r}from"./framework-
|
|
1
|
+
import{f as e,t,u as n}from"./vendor-react-DR370ovB.js";import{r}from"./framework-DCMHw4uc.js";import{Jn as i,hr as a,ja as o,qn as s}from"./ui-components-D1FYlKrM.js";var c=t();function l(){let t=n(),{appName:l}=e(),{t:u}=r(),d=l?`/apps/${l}`:`/`;return(0,c.jsx)(`div`,{className:`container mx-auto max-w-2xl px-6 py-16`,children:(0,c.jsx)(s,{children:(0,c.jsxs)(i,{className:`flex flex-col items-center gap-4 py-12 text-center`,children:[(0,c.jsx)(`div`,{className:`rounded-full bg-muted p-3`,children:(0,c.jsx)(o,{className:`h-6 w-6 text-muted-foreground`})}),(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`h2`,{className:`text-lg font-semibold`,children:u(`marketplace.accessDenied.title`)}),(0,c.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:u(`marketplace.accessDenied.description`)})]}),(0,c.jsx)(a,{variant:`outline`,onClick:()=>t(d),children:u(`marketplace.action.backHome`)})]})})})}export{l as t};
|
package/dist/assets/{MarketplaceInstalledPage-CBfcARvX.js → MarketplaceInstalledPage-DBh3sDdm.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e,r as t}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as n,f as r,t as i,u as a}from"./vendor-react-DR370ovB.js";import{d as o}from"./infrastructure-CJNwTVno.js";import{
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as n,f as r,t as i,u as a}from"./vendor-react-DR370ovB.js";import{d as o}from"./infrastructure-CJNwTVno.js";import{pt as s,r as c}from"./framework-DCMHw4uc.js";import{$n as l,Ii as u,Io as d,Jn as f,Mt as p,Vr as m,Xn as h,Zn as g,bs as _,cc as v,ei as y,hr as b,qn as x}from"./ui-components-D1FYlKrM.js";import{_ as S,l as C,u as w}from"./marketplaceApi-CucX7DD9.js";import{t as T}from"./MarketplaceAccessDenied-DvMKTKZG.js";var E=e(n(),1),D=i();function O(){let e=a(),{appName:t}=r(),n=o(),{t:i,language:s}=c(),v=t?`/apps/${t}`:``,[y,O]=(0,E.useState)([]),[k,A]=(0,E.useState)(`local`),[j,M]=(0,E.useState)(!0),[N,P]=(0,E.useState)(null),[F,I]=(0,E.useState)(null),L=async()=>{M(!0);try{let e=await C();e.connected?(A(`cloud`),O(e.items)):(A(`local`),O(await w()))}finally{M(!1)}};(0,E.useEffect)(()=>{L()},[]);let R=async e=>{if(confirm(i(`marketplace.uninstall.confirm`,{manifestId:e.manifestId,version:e.version}))){P(e.manifestId),I(null);try{await S(e.manifestId),I({ok:!0,message:i(`marketplace.uninstall.successInList`,{manifestId:e.manifestId})}),await L()}catch(e){I({ok:!1,message:e?.message??String(e)})}finally{P(null)}}};return n?(0,D.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,D.jsx)(`div`,{className:`flex justify-end`,children:(0,D.jsxs)(b,{variant:`outline`,size:`sm`,onClick:()=>void L(),disabled:j,children:[(0,D.jsx)(u,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),i(`marketplace.refresh`)]})}),F&&(0,D.jsx)(`div`,{className:`rounded-md border p-3 text-sm ${F.ok?`border-green-500/30 bg-green-500/5 text-green-700 dark:text-green-400`:`border-destructive/30 bg-destructive/5 text-destructive`}`,children:(0,D.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,D.jsx)(_,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,D.jsx)(`div`,{children:F.message})]})}),j&&y.length===0?(0,D.jsx)(`div`,{className:`grid gap-3`,children:Array.from({length:3}).map((e,t)=>(0,D.jsx)(p,{className:`h-20 w-full`},t))}):y.length===0?(0,D.jsxs)(`div`,{className:`text-center py-12 text-sm text-muted-foreground border rounded-md`,children:[(0,D.jsx)(`p`,{children:i(`marketplace.installedEmpty`)}),(0,D.jsx)(b,{variant:`link`,className:`mt-2`,onClick:()=>e(`${v}/system/marketplace`),children:i(`marketplace.browseLink`)})]}):(0,D.jsx)(`div`,{className:`grid gap-3`,children:y.map(t=>(0,D.jsxs)(x,{children:[(0,D.jsxs)(h,{className:`flex flex-row items-start justify-between gap-3 pb-2`,children:[(0,D.jsxs)(`div`,{className:`min-w-0`,children:[(0,D.jsxs)(g,{className:`text-base truncate flex items-center gap-2`,children:[t.manifestId,(0,D.jsx)(l,{variant:`outline`,children:i(`marketplace.versionBadge`,{version:t.version})})]}),(0,D.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-1 flex flex-wrap gap-x-3 gap-y-1`,children:[(0,D.jsx)(`span`,{children:i(`marketplace.installedAt`,{when:new Date(t.installedAt).toLocaleString(s||void 0)})}),t.installedBy&&(0,D.jsx)(`span`,{children:i(`marketplace.installedBy`,{user:t.installedBy})}),(0,D.jsxs)(`span`,{children:[i(`marketplace.installedPackageId`),` `,(0,D.jsx)(`code`,{className:`font-mono`,children:t.packageId})]})]})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[(0,D.jsxs)(b,{variant:`ghost`,size:`sm`,onClick:()=>e(`${v}/system/marketplace/${t.packageId}`),children:[(0,D.jsx)(d,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),i(`marketplace.action.details`)]}),k===`local`&&(0,D.jsxs)(b,{variant:`outline`,size:`sm`,onClick:()=>void R(t),disabled:N===t.manifestId,children:[(0,D.jsx)(m,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),N===t.manifestId?i(`marketplace.action.uninstalling`):i(`marketplace.action.uninstall`)]})]})]}),k===`local`&&(0,D.jsx)(f,{className:`pt-0 text-xs text-muted-foreground`,dangerouslySetInnerHTML:{__html:i(`marketplace.cachedAs`,{path:`.objectstack/installed-packages/${t.manifestId.replace(/[^a-zA-Z0-9._-]/g,`_`)}.json`})}})]},t.manifestId))}),(0,D.jsx)(`p`,{className:`text-xs text-muted-foreground border-t pt-4`,dangerouslySetInnerHTML:{__html:i(`marketplace.installedAdditiveNote`)}})]}):(0,D.jsx)(T,{})}s.register(`marketplace:installed-list`,()=>(0,D.jsx)(O,{}),{namespace:`app-shell`,label:`Installed Marketplace Packages`,category:`plugin`,inputs:[]});var k=t({MarketplaceInstalledPage:()=>A});function A(){let e=a(),{appName:t}=r(),{t:n}=c(),i=t?`/apps/${t}`:``;return(0,D.jsxs)(`div`,{className:`flex flex-col gap-6 p-4 sm:p-6 max-w-5xl`,children:[(0,D.jsxs)(b,{variant:`ghost`,size:`sm`,className:`self-start`,onClick:()=>e(`${i}/system/marketplace`),children:[(0,D.jsx)(v,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),n(`marketplace.back`)]}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(y,{className:`h-6 w-6 text-primary`,"aria-hidden":`true`}),(0,D.jsx)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight`,children:n(`marketplace.installedTitle`)})]}),(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,dangerouslySetInnerHTML:{__html:n(`marketplace.installedSubtitle`)}})]}),(0,D.jsx)(O,{})]})}export{k as t};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as n,f as r,t as i,u as a}from"./vendor-react-DR370ovB.js";import{d as ee}from"./infrastructure-CJNwTVno.js";import{T as te,r as ne}from"./framework-DCMHw4uc.js";import{$n as o,Bn as re,Bo as ie,Bt as ae,Er as s,Hn as oe,Ht as se,Io as ce,Jn as le,Kn as c,Ks as l,Ln as ue,Lo as de,Ma as u,Mt as d,Rn as fe,Ut as pe,Vn as me,Vr as f,Vt as he,Wo as ge,Wt as _e,Xn as ve,Zn as ye,_i as be,_s as p,bs as m,cc as xe,cn as Se,es as h,fa as g,gi as Ce,gn as we,ho as Te,hr as _,on as v,qn as Ee,sn as De,ua as Oe,un as y,ys as ke,zn as Ae}from"./ui-components-D1FYlKrM.js";import"./MetadataProvider-xgIDLxXw.js";import{n as je}from"./assistantBus-3d9MxsCF.js";import{_ as Me,a as Ne,b,c as Pe,g as Fe,h as Ie,i as Le,m as Re,o as ze,p as Be,r as x,s as Ve,t as He,u as Ue}from"./marketplaceApi-CucX7DD9.js";import{n as We,t as Ge}from"./usePackageL10n-shLsxEAx.js";import{t as Ke}from"./MarketplaceAccessDenied-DvMKTKZG.js";var S=e(n(),1),C=i();function qe(e){let t=e.replace(/\r\n/g,`
|
|
2
|
+
`).split(`
|
|
3
|
+
`),n=[],r=0;for(;r<t.length;){let e=t[r];if(e.startsWith("```")){let i=e.slice(3).trim();r++;let a=[];for(;r<t.length&&!t[r].startsWith("```");)a.push(t[r]),r++;r++,n.push({type:`code`,text:a.join(`
|
|
4
|
+
`),lang:i});continue}let i=/^(#{1,3})\s+(.*)$/.exec(e);if(i){let e=i[1].length;n.push({type:`h${e}`,text:i[2].trim()}),r++;continue}if(/^[-*]\s+/.test(e)){let e=[];for(;r<t.length&&/^[-*]\s+/.test(t[r]);)e.push(t[r].replace(/^[-*]\s+/,``)),r++;n.push({type:`ul`,items:e});continue}if(/^\d+\.\s+/.test(e)){let e=[];for(;r<t.length&&/^\d+\.\s+/.test(t[r]);)e.push(t[r].replace(/^\d+\.\s+/,``)),r++;n.push({type:`ol`,items:e});continue}if(!e.trim()){r++;continue}let a=[];for(;r<t.length&&t[r].trim()&&!/^#{1,3}\s+/.test(t[r])&&!/^[-*]\s+/.test(t[r])&&!/^\d+\.\s+/.test(t[r])&&!t[r].startsWith("```");)a.push(t[r]),r++;n.push({type:`p`,text:a.join(` `)})}return n}function w(e){let t=[],n=e,r=0,i=[{re:/`([^`]+)`/,render:e=>(0,C.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5 font-mono text-[0.85em]`,children:e[1]},`k${r++}`)},{re:/\*\*([^*]+)\*\*/,render:e=>(0,C.jsx)(`strong`,{className:`font-semibold text-foreground`,children:e[1]},`k${r++}`)},{re:/\*([^*]+)\*/,render:e=>(0,C.jsx)(`em`,{children:e[1]},`k${r++}`)},{re:/\[([^\]]+)\]\(([^)]+)\)/,render:e=>(0,C.jsx)(`a`,{href:e[2],target:`_blank`,rel:`noopener noreferrer`,className:`text-violet-600 underline-offset-2 hover:underline dark:text-violet-400`,children:e[1]},`k${r++}`)}];for(;n;){let e=-1,r=null,a=null;for(let t of i){let i=t.re.exec(n);i&&(e===-1||i.index<e)&&(e=i.index,r=i,a=t)}if(!r||!a){t.push(n);break}e>0&&t.push(n.slice(0,e)),t.push(a.render(r)),n=n.slice(e+r[0].length)}return(0,C.jsx)(C.Fragment,{children:t.map((e,t)=>(0,C.jsx)(S.Fragment,{children:e},t))})}function Je({source:e,className:t}){let n=qe(e);return(0,C.jsx)(`div`,{className:`flex flex-col gap-4 text-sm leading-relaxed text-foreground/90 ${t??``}`,children:n.map((e,t)=>{switch(e.type){case`h1`:return(0,C.jsx)(`h2`,{className:`mt-2 text-xl font-bold tracking-tight`,children:w(e.text??``)},t);case`h2`:return(0,C.jsx)(`h3`,{className:`mt-3 text-base font-semibold tracking-tight`,children:w(e.text??``)},t);case`h3`:return(0,C.jsx)(`h4`,{className:`mt-2 text-sm font-semibold tracking-tight text-foreground/80`,children:w(e.text??``)},t);case`p`:return(0,C.jsx)(`p`,{children:w(e.text??``)},t);case`ul`:return(0,C.jsx)(`ul`,{className:`ml-1 flex list-none flex-col gap-1.5`,children:(e.items??[]).map((e,t)=>(0,C.jsxs)(`li`,{className:`flex gap-2`,children:[(0,C.jsx)(`span`,{"aria-hidden":`true`,className:`mt-1.5 inline-block h-1.5 w-1.5 shrink-0 rounded-full bg-violet-500/70`}),(0,C.jsx)(`span`,{children:w(e)})]},t))},t);case`ol`:return(0,C.jsx)(`ol`,{className:`ml-5 flex list-decimal flex-col gap-1.5 marker:text-muted-foreground`,children:(e.items??[]).map((e,t)=>(0,C.jsx)(`li`,{className:`pl-1`,children:w(e)},t))},t);case`code`:return(0,C.jsx)(`pre`,{className:`overflow-x-auto rounded-lg border bg-muted/40 p-3 text-xs leading-relaxed`,children:(0,C.jsx)(`code`,{className:`font-mono`,children:e.text})},t)}return null})})}var T={node:`In-process · full trust`,sandbox:`Sandboxed`,worker:`Out-of-process`};function E({icon:e,label:t,items:n}){return!n||n.length===0?null:(0,C.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,C.jsx)(e,{className:`h-3.5 w-3.5 mt-0.5 text-muted-foreground shrink-0`,"aria-hidden":`true`}),(0,C.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,C.jsx)(`div`,{className:`text-xs font-medium`,children:t}),(0,C.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-0.5`,children:n.map(e=>(0,C.jsx)(`code`,{className:`font-mono text-[11px] px-1 py-0.5 rounded bg-muted break-all`,children:e},e))})]})]})}function Ye({version:e}){let{t}=ne();if(!e?.contains_code)return null;let n=e.permissions??{},r=(n.services?.length??0)+(n.hooks?.length??0)+(n.network?.length??0)+(n.fs?.length??0)>0;return(0,C.jsxs)(`div`,{className:`rounded-md border border-amber-500/30 bg-amber-500/5 p-3 space-y-3 text-sm`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[(0,C.jsx)(h,{className:`h-4 w-4 text-amber-600 shrink-0`,"aria-hidden":`true`}),t(`marketplace.disclosure.containsCode`,{defaultValue:`This package contains code`})]}),(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[e.runtime&&(0,C.jsx)(o,{variant:`outline`,children:t(`marketplace.disclosure.runtime.${e.runtime}`,{defaultValue:T[e.runtime]??e.runtime})}),e.platform_verified?(0,C.jsxs)(o,{variant:`outline`,className:`gap-1 border-green-500/40 text-green-700 dark:text-green-400`,children:[(0,C.jsx)(Ce,{className:`h-3 w-3`,"aria-hidden":`true`}),t(`marketplace.disclosure.reviewed`,{defaultValue:`Reviewed & approved`})]}):(0,C.jsxs)(o,{variant:`outline`,className:`gap-1 border-amber-500/40 text-amber-700 dark:text-amber-400`,children:[(0,C.jsx)(be,{className:`h-3 w-3`,"aria-hidden":`true`}),t(`marketplace.disclosure.unreviewed`,{defaultValue:`Not yet reviewed`})]}),e.signed&&(0,C.jsxs)(o,{variant:`outline`,className:`gap-1`,children:[(0,C.jsx)(p,{className:`h-3 w-3`,"aria-hidden":`true`}),t(`marketplace.disclosure.signed`,{defaultValue:`Signed`})]})]}),r?(0,C.jsxs)(`div`,{className:`space-y-2`,children:[(0,C.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t(`marketplace.disclosure.grantsIntro`,{defaultValue:`On install, this package will be granted:`})}),(0,C.jsx)(E,{icon:l,label:t(`marketplace.disclosure.services`,{defaultValue:`Platform services`}),items:n.services??void 0}),(0,C.jsx)(E,{icon:s,label:t(`marketplace.disclosure.hooks`,{defaultValue:`Lifecycle hooks`}),items:n.hooks??void 0}),(0,C.jsx)(E,{icon:g,label:t(`marketplace.disclosure.network`,{defaultValue:`Network access`}),items:n.network??void 0}),(0,C.jsx)(E,{icon:Te,label:t(`marketplace.disclosure.fs`,{defaultValue:`Filesystem access`}),items:n.fs??void 0})]}):(0,C.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t(`marketplace.disclosure.noPermissions`,{defaultValue:`Requests no special permissions.`})})]})}var D=t({MarketplacePackagePage:()=>O});function O(){let e=a(),{packageId:t,appName:n}=r(),i=ee(),{t:s,language:l}=ne(),be=n?`/apps/${n}`:``,{refresh:h}=te(),[g,Ce]=(0,S.useState)(null),[Te,qe]=(0,S.useState)(!0),[w,T]=(0,S.useState)(null),[E,D]=(0,S.useState)(!1),[O,Xe]=(0,S.useState)([]),[Ze,k]=(0,S.useState)(!1),[A,j]=(0,S.useState)(null),[M,N]=(0,S.useState)(``),[Qe,$e]=(0,S.useState)({}),[P,et]=(0,S.useState)(!1),[tt,nt]=(0,S.useState)(!1),[F,rt]=(0,S.useState)(!1),[I,L]=(0,S.useState)(null),[R,it]=(0,S.useState)(null),[z,B]=(0,S.useState)(null),[V,H]=(0,S.useState)(null),[U,W]=(0,S.useState)(null),[at,G]=(0,S.useState)([]),[K,q]=(0,S.useState)(!1),[J,Y]=(0,S.useState)(null);(0,S.useEffect)(()=>{if(!b().features.installLocal)return;let e=!1;return(async()=>{let t=await Ue();e||G(t)})(),()=>{e=!0}},[t,J]),(0,S.useEffect)(()=>{if(!t)return;let e=b().defaultEnvironmentId??``,n=!1;return(async()=>{let r=await x(t,e);n||!r||(B(r),it(r.version))})(),()=>{n=!0}},[t]),(0,S.useEffect)(()=>{let e=!1;return(async()=>{if(t){qe(!0),T(null);try{let n=await Le(t);e||Ce(n)}catch(t){e||T(t?.message??String(t))}finally{e||qe(!1)}}})(),()=>{e=!0}},[t]);let ot=async()=>{D(!0),L(null),j(null);let e=b().defaultEnvironmentId;if(e){k(!1),N(e),Xe([]);return}k(!0);try{let[e,n]=await Promise.all([Ve(),Pe()]),r=e.filter(e=>{let t=e.organization_id;return t?n.has(String(t)):!1});Xe(r),$e({});let i=t;i&&Promise.all(r.map(async e=>{try{let t=await x(i,e.id);return t?[e.id,t.version]:null}catch{return null}})).then(e=>{let t={};for(let n of e)n&&(t[n[0]]=n[1]);$e(t)}),e.length>0&&r.length===0?j(s(`marketplace.install.noPermission`)):r.length===1&&N(r[0].id)}catch(e){let t=e?.status;j(t===401||t===403?s(`marketplace.install.signInFirst`):e?.message??String(e))}finally{k(!1)}},st=async()=>{if(!(!t||!M)){rt(!0),L(null);try{it(((await ze({packageId:t,environmentId:M,seedSampleData:P}))?.installation?.version??g?.package?.latest_version?.version??g?.versions?.[0]?.version??``)||`installed`);try{let e=b().defaultEnvironmentId||M;if(e){let n=await x(t,e);n&&B(n)}}catch{}let e=b().defaultEnvironmentId;if(!e||e===M)try{if(typeof sessionStorage<`u`)for(let e of Object.keys(sessionStorage))e.startsWith(`objectui:metadata:`)&&sessionStorage.removeItem(e);await h()}catch{}L({ok:!0,message:s(`marketplace.install.success`)}),je()}catch(e){L({ok:!1,message:e?.message??String(e)})}finally{rt(!1)}}},ct=async()=>{if(t){q(!0),Y(null);try{let e=await Ne({packageId:t});try{await h(`app`)}catch{}Y({ok:!0,message:s(`marketplace.install.localSuccess`,{version:e.version,name:g?.package?Ge(g.package,l).displayName:e.manifestId})}),je()}catch(e){let t=e?.code,n=e?.message??String(e);t===`manifest_conflict`?n=s(`marketplace.install.localManifestConflict`,{message:n}):t===`unauthorized`?n=s(`marketplace.install.localUnauthorized`):t===`marketplace_unavailable`&&(n=s(`marketplace.install.localMarketplaceUnavailable`)),Y({ok:!1,message:n})}finally{q(!1)}}},lt=async()=>{if($&&confirm(s(`marketplace.uninstall.confirm`,{manifestId:$.manifestId,version:$.version}))){q(!0),Y(null);try{await Me($.manifestId);try{await h(`app`)}catch{}Y({ok:!0,message:s(`marketplace.uninstall.successInDetail`,{manifestId:$.manifestId})})}catch(e){Y({ok:!1,message:e?.message??String(e)})}finally{q(!1)}}},ut=async()=>{if(z){H(`reseed`),W(null);try{let e=await Fe(z.installationId);e.ok?(B({...z,withSampleData:!0}),W({ok:!0,text:s(`marketplace.detail.reseedQueued`)||`Sample data will be re-seeded on next environment access.`})):W({ok:!1,text:e.error||`Re-seed failed`})}finally{H(null)}}},dt=async()=>{if(z&&confirm(s(`marketplace.detail.purgeConfirm`)||`Delete all sample records seeded by this package? User-added records will NOT be touched.`)){H(`purge`),W(null);try{let e=await Re(z.installationId);if(e.ok){B({...z,withSampleData:!1});let t=e.deleted??0;W({ok:!0,text:t>0?s(`marketplace.detail.purgeSuccess`,{count:t})||`Removed ${t} sample record(s).`:s(`marketplace.detail.purgeNoData`)||`No sample records found to purge.`})}else W({ok:!1,text:e.error||`Purge failed`})}finally{H(null)}}},ft=async()=>{if($){H(`reseed`),W(null);try{let e=await Ie($.manifestId);G(e=>e.map(e=>e.manifestId===$.manifestId?{...e,withSampleData:!0}:e));let t=e.inserted??0,n=e.updated??0;W({ok:!0,text:s(`marketplace.detail.reseedLocalSuccess`,{inserted:t,updated:n})||`Sample data re-seeded (inserted=${t}, updated=${n}).`})}catch(e){W({ok:!1,text:e?.message||`Re-seed failed`})}finally{H(null)}}},pt=async()=>{if($&&confirm(s(`marketplace.detail.purgeConfirm`)||`Delete all sample records seeded by this package? User-added records will NOT be touched.`)){H(`purge`),W(null);try{let e=await Be($.manifestId);G(e=>e.map(e=>e.manifestId===$.manifestId?{...e,withSampleData:!1}:e));let t=e.deleted??0;W({ok:!0,text:t>0?s(`marketplace.detail.purgeSuccess`,{count:t})||`Removed ${t} sample record(s).`:s(`marketplace.detail.purgeNoData`)||`No sample records found to purge.`})}catch(e){W({ok:!1,text:e?.message||`Purge failed`})}finally{H(null)}}};if(Te)return(0,C.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl flex flex-col gap-6 p-4 sm:p-6`,children:[(0,C.jsx)(d,{className:`h-8 w-32`}),(0,C.jsx)(d,{className:`h-16 w-full`}),(0,C.jsx)(d,{className:`h-64 w-full`})]});if(w||!g)return(0,C.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl flex flex-col gap-6 p-4 sm:p-6`,children:[(0,C.jsxs)(_,{variant:`ghost`,size:`sm`,onClick:()=>e(`${be}/system/marketplace`),children:[(0,C.jsx)(xe,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),s(`marketplace.back`)]}),(0,C.jsxs)(`div`,{className:`flex items-start gap-3 rounded-md border border-destructive/30 bg-destructive/5 p-4 text-sm`,children:[(0,C.jsx)(m,{className:`h-4 w-4 mt-0.5 text-destructive`,"aria-hidden":`true`}),(0,C.jsxs)(`div`,{children:[(0,C.jsx)(`div`,{className:`font-medium text-destructive`,children:s(`marketplace.load.packageFailed`)}),(0,C.jsx)(`div`,{className:`text-muted-foreground mt-1`,children:w??s(`marketplace.load.notFound`)})]})]})]});let X=g.package,Z=Ge(X,l),Q=X.latest_version?.version??g.versions[0]?.version??null,$=at.find(e=>e.manifestId===X.manifest_id)??null,mt=!!X.latest_version?.contains_code,ht=!!R&&R!==`installed`&&!!Q&&R!==Q,gt=b().features.installLocal,_t=!Q||K||F||!gt&&!!R&&!ht,vt=gt?{label:s(K?`marketplace.action.working`:$?`marketplace.action.reinstall`:`marketplace.action.install`),onClick:ct}:{label:F?s(`marketplace.action.installing`):R?ht?s(`marketplace.action.updateTo`,{defaultValue:`Update`,version:Q}):s(`marketplace.action.installed`,{defaultValue:`Installed`}):s(`marketplace.action.installToCloud`),onClick:ot},yt=X.category?s(`marketplace.category.${X.category}`,{defaultValue:X.category}):null;return i?(0,C.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl flex flex-col gap-6 p-4 sm:p-6`,children:[(0,C.jsxs)(_,{variant:`ghost`,size:`sm`,className:`self-start -ml-2 text-muted-foreground hover:text-foreground`,onClick:()=>e(`${be}/system/marketplace`),children:[(0,C.jsx)(xe,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),s(`marketplace.back`)]}),(0,C.jsxs)(`div`,{className:`flex items-start gap-5 flex-wrap sm:flex-nowrap rounded-2xl border bg-gradient-to-br from-primary/5 via-background to-background p-6 sm:p-8`,children:[(0,C.jsx)(We,{iconUrl:X.icon_url,displayName:Z.displayName,manifestId:X.manifest_id,className:`h-20 w-20 rounded-2xl shadow-sm ring-1 ring-border shrink-0`,initialClassName:`text-3xl font-bold`}),(0,C.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,C.jsx)(`h1`,{className:`text-2xl sm:text-3xl font-bold tracking-tight truncate`,children:Z.displayName||X.manifest_id}),X.homepage_url&&(0,C.jsxs)(`a`,{href:X.homepage_url,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors`,title:s(`marketplace.detail.homepage`),children:[(0,C.jsx)(ce,{className:`h-3.5 w-3.5`,"aria-hidden":`true`}),(0,C.jsx)(`span`,{className:`hidden sm:inline`,children:s(`marketplace.detail.homepage`)})]})]}),(0,C.jsxs)(`div`,{className:`text-sm text-muted-foreground mt-2 flex flex-wrap items-center gap-1.5`,children:[(0,C.jsx)(`code`,{className:`font-mono text-xs px-1.5 py-0.5 rounded bg-muted`,children:X.manifest_id}),Q&&(0,C.jsx)(o,{variant:`outline`,children:s(`marketplace.versionBadge`,{version:Q})}),X.publisher&&X.publisher!==`private`&&(0,C.jsx)(o,{variant:X.publisher===`objectstack`?`default`:`secondary`,children:X.publisher}),yt&&(0,C.jsx)(o,{variant:`outline`,children:yt}),X.license&&(0,C.jsx)(o,{variant:`outline`,className:`font-normal`,children:X.license}),$&&(0,C.jsxs)(o,{variant:`default`,className:`bg-green-600 hover:bg-green-600 gap-1`,children:[(0,C.jsx)(p,{className:`h-3 w-3`,"aria-hidden":`true`}),s(`marketplace.detail.installedV`,{version:$.version})]}),!$&&R&&(0,C.jsxs)(o,{variant:`default`,className:`bg-green-600 hover:bg-green-600 gap-1`,children:[(0,C.jsx)(p,{className:`h-3 w-3`,"aria-hidden":`true`}),s(`marketplace.detail.installedV`,{version:R})]}),ht&&(0,C.jsxs)(o,{variant:`default`,className:`bg-amber-500 hover:bg-amber-500 gap-1`,children:[(0,C.jsx)(ke,{className:`h-3 w-3`,"aria-hidden":`true`}),s(`marketplace.detail.updateAvailable`,{defaultValue:`Update available`}),` → v`,Q]})]}),Z.description&&(0,C.jsx)(`p`,{className:`text-sm sm:text-base text-foreground/80 mt-3 max-w-2xl leading-relaxed`,children:Z.description})]}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0 self-start`,children:[(0,C.jsxs)(_,{onClick:vt.onClick,disabled:_t,size:`lg`,className:`min-w-[8rem]`,children:[(0,C.jsx)(ie,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),vt.label]}),$&&(0,C.jsxs)(De,{children:[(0,C.jsx)(we,{asChild:!0,children:(0,C.jsx)(_,{variant:`outline`,size:`lg`,className:`px-2.5`,"aria-label":s(`marketplace.detail.moreOptions`),children:(0,C.jsx)(de,{className:`h-4 w-4`,"aria-hidden":`true`})})}),(0,C.jsxs)(Se,{align:`end`,className:`w-56`,children:[(0,C.jsxs)(y,{onSelect:ft,disabled:V!==null,children:[V===`reseed`?(0,C.jsx)(u,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,C.jsx)(ge,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),$.withSampleData?s(`marketplace.detail.reseedAgain`)||`Re-seed sample data`:s(`marketplace.detail.addSampleData`)||`Add sample data`]}),(0,C.jsxs)(y,{onSelect:pt,disabled:V!==null||!$.withSampleData,className:`text-destructive focus:text-destructive`,children:[V===`purge`?(0,C.jsx)(u,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,C.jsx)(f,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),s(`marketplace.detail.purgeSampleData`)||`Purge sample data`]}),(0,C.jsxs)(y,{onSelect:lt,disabled:K,className:`text-destructive focus:text-destructive`,children:[(0,C.jsx)(f,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),s(`marketplace.detail.uninstallFromRuntime`)]})]})]}),!$&&z&&!b().cloudUrl&&(0,C.jsxs)(De,{children:[(0,C.jsx)(we,{asChild:!0,children:(0,C.jsx)(_,{variant:`outline`,size:`lg`,className:`px-2.5`,"aria-label":s(`marketplace.detail.moreOptions`)||`More options`,children:(0,C.jsx)(de,{className:`h-4 w-4`,"aria-hidden":`true`})})}),(0,C.jsxs)(Se,{align:`end`,className:`w-56`,children:[(0,C.jsxs)(y,{onSelect:ut,disabled:V!==null,children:[V===`reseed`?(0,C.jsx)(u,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,C.jsx)(ge,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),z.withSampleData?s(`marketplace.detail.reseedAgain`)||`Re-seed sample data`:s(`marketplace.detail.addSampleData`)||`Add sample data`]}),(0,C.jsxs)(y,{onSelect:dt,disabled:V!==null||!z.withSampleData,className:`text-destructive focus:text-destructive`,children:[V===`purge`?(0,C.jsx)(u,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,C.jsx)(f,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),s(`marketplace.detail.purgeSampleData`)||`Purge sample data`]})]})]})]})]}),U&&(0,C.jsxs)(`div`,{role:`status`,className:`flex items-start gap-2 rounded-md border p-3 text-sm ${U.ok?`border-green-500/30 bg-green-500/5 text-green-700 dark:text-green-400`:`border-destructive/30 bg-destructive/5 text-destructive`}`,children:[U.ok?(0,C.jsx)(p,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}):(0,C.jsx)(m,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,C.jsx)(`div`,{className:`flex-1`,children:U.text}),(0,C.jsx)(`button`,{type:`button`,className:`text-xs underline opacity-60 hover:opacity-100`,onClick:()=>W(null),children:s(`marketplace.action.dismiss`)})]}),J&&(0,C.jsxs)(`div`,{role:`status`,className:`flex items-start gap-2 rounded-md border p-3 text-sm whitespace-pre-wrap ${J.ok?`border-green-500/30 bg-green-500/5 text-green-700 dark:text-green-400`:`border-destructive/30 bg-destructive/5 text-destructive`}`,children:[J.ok?(0,C.jsx)(p,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}):(0,C.jsx)(m,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,C.jsx)(`div`,{className:`flex-1`,children:J.message}),(0,C.jsx)(`button`,{type:`button`,className:`text-xs underline opacity-60 hover:opacity-100`,onClick:()=>Y(null),children:s(`marketplace.action.dismiss`)})]}),(0,C.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-3`,children:[(0,C.jsx)(`div`,{className:`lg:col-span-2 space-y-4`,children:(0,C.jsxs)(Ee,{children:[(0,C.jsx)(ve,{children:(0,C.jsx)(ye,{className:`text-base`,children:s(`marketplace.detail.about`)})}),(0,C.jsx)(le,{children:Z.readme?(0,C.jsx)(Je,{source:Z.readme}):(0,C.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:s(`marketplace.detail.noReadme`)})})]})}),(0,C.jsx)(`div`,{className:`space-y-4`,children:(0,C.jsxs)(Ee,{children:[(0,C.jsx)(ve,{children:(0,C.jsx)(ye,{className:`text-base`,children:s(`marketplace.detail.versions`)})}),(0,C.jsx)(le,{children:g.versions.length===0?(0,C.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:s(`marketplace.detail.noApprovedVersions`)}):(0,C.jsx)(`ul`,{className:`space-y-3`,children:g.versions.map(e=>(0,C.jsxs)(`li`,{className:`space-y-1 text-sm`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,C.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,C.jsx)(Oe,{className:`h-3.5 w-3.5 text-muted-foreground`,"aria-hidden":`true`}),(0,C.jsxs)(`code`,{className:`font-mono`,children:[`v`,e.version]}),e.is_prerelease&&(0,C.jsx)(o,{variant:`outline`,className:`text-xs`,children:s(`marketplace.detail.prerelease`)})]}),(0,C.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.published_at?new Date(e.published_at).toLocaleDateString():`—`})]}),e.release_notes&&e.release_notes.trim()&&(0,C.jsx)(`p`,{className:`whitespace-pre-line pl-5 text-xs text-muted-foreground`,children:e.release_notes.trim()})]},e.id))})})]})})]}),(0,C.jsx)(ue,{open:E,onOpenChange:e=>{D(e),e||(L(null),nt(!1))},children:(0,C.jsxs)(fe,{children:[(0,C.jsxs)(me,{children:[(0,C.jsx)(oe,{children:s(`marketplace.install.dialogTitle`,{name:Z.displayName||X.manifest_id})}),(0,C.jsx)(Ae,{children:b().defaultEnvironmentId?s(`marketplace.install.dialogDescCurrent`,{host:typeof window<`u`?window.location.host:``}):s(`marketplace.install.dialogDescPicker`)})]}),Ze?(0,C.jsx)(d,{className:`h-10 w-full`}):A?(0,C.jsxs)(`div`,{className:`rounded-md border border-amber-500/30 bg-amber-500/5 p-3 text-sm space-y-2`,children:[(0,C.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,C.jsx)(m,{className:`h-4 w-4 mt-0.5 text-amber-600`,"aria-hidden":`true`}),(0,C.jsx)(`div`,{className:`flex-1`,children:A})]}),(0,C.jsx)(`a`,{href:He(X.id),target:`_blank`,rel:`noopener noreferrer`,children:(0,C.jsxs)(_,{variant:`outline`,size:`sm`,className:`w-full`,children:[(0,C.jsx)(ce,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),s(`marketplace.action.openOnCloud`)]})})]}):b().defaultEnvironmentId?(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(c,{id:`seed`,checked:P,onCheckedChange:e=>et(e===!0)}),(0,C.jsx)(v,{htmlFor:`seed`,className:`text-sm font-normal cursor-pointer`,children:s(`marketplace.install.includeSampleData`)})]}):O.length===0?(0,C.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:s(`marketplace.install.noEnvs`)}):(0,C.jsxs)(`div`,{className:`space-y-4`,children:[(0,C.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,C.jsx)(v,{htmlFor:`env-select`,children:s(`marketplace.install.environment`)}),(0,C.jsxs)(ae,{value:M,onValueChange:N,children:[(0,C.jsx)(pe,{id:`env-select`,children:(0,C.jsx)(_e,{placeholder:s(`marketplace.install.environmentPlaceholder`)})}),(0,C.jsx)(he,{children:O.map(e=>{let t=Qe[e.id],n=!!t&&!!Q&&t!==`installed`&&t!==Q;return(0,C.jsxs)(se,{value:e.id,children:[e.display_name||e.hostname||e.id,e.plan&&(0,C.jsxs)(`span`,{className:`text-muted-foreground`,children:[` · `,e.plan]}),t&&(n?(0,C.jsxs)(`span`,{className:`text-amber-600`,children:[` · `,s(`marketplace.install.updateTo`,{defaultValue:`Update → v{{version}}`,version:Q})]}):(0,C.jsxs)(`span`,{className:`text-muted-foreground`,children:[` · `,s(`marketplace.install.installedVersion`,{defaultValue:`Installed v{{version}}`,version:t})]}))]},e.id)})})]})]}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(c,{id:`seed`,checked:P,onCheckedChange:e=>et(e===!0)}),(0,C.jsx)(v,{htmlFor:`seed`,className:`text-sm font-normal cursor-pointer`,children:s(`marketplace.install.includeSampleData`)})]})]}),mt&&!A&&(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(Ye,{version:X.latest_version}),(0,C.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,C.jsx)(c,{id:`ack-perms`,checked:tt,onCheckedChange:e=>nt(e===!0)}),(0,C.jsx)(v,{htmlFor:`ack-perms`,className:`text-sm font-normal cursor-pointer leading-snug`,children:s(`marketplace.disclosure.acknowledge`,{defaultValue:`I understand this package runs code and grants the permissions above.`})})]})]}),I&&(0,C.jsx)(`div`,{className:`rounded-md border p-3 text-sm ${I.ok?`border-green-500/30 bg-green-500/5 text-green-700`:`border-destructive/30 bg-destructive/5 text-destructive`}`,children:I.message}),(0,C.jsxs)(re,{children:[(0,C.jsx)(_,{variant:`outline`,onClick:()=>D(!1),children:s(`marketplace.action.close`)}),!A&&(0,C.jsx)(_,{onClick:st,disabled:!M||F||I?.ok===!0||mt&&!tt,children:s(F?`marketplace.action.installing`:`marketplace.action.install`)})]})]})})]}):(0,C.jsx)(Ke,{})}export{D as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as n,f as r,t as i,u as a}from"./vendor-react-DR370ovB.js";import{d as ee}from"./infrastructure-CJNwTVno.js";import{r as o}from"./framework-DCMHw4uc.js";import{$n as s,Ii as c,Jn as l,Mt as u,Si as d,Xn as f,Yn as p,Zn as m,_s as h,bi as g,bs as _,ei as v,hr as y,nn as te,qn as b,ua as x}from"./ui-components-D1FYlKrM.js";import{n as ne}from"./assistantBus-3d9MxsCF.js";import{a as S,b as re,d as ie,f as C,l as ae,o as oe,u as se}from"./marketplaceApi-CucX7DD9.js";import{n as w,t as T}from"./usePackageL10n-shLsxEAx.js";import{t as ce}from"./MarketplaceAccessDenied-DvMKTKZG.js";var E=t({MarketplacePage:()=>A}),D=e(n(),1),O=i();function k(){let{language:e,t}=o();return n=>{if(!n)return``;let r=new Date(n);if(Number.isNaN(r.getTime()))return``;let i=Math.floor((Date.now()-r.getTime())/864e5);if(i<1)return t(`marketplace.relativeTime.today`);try{let t=new Intl.RelativeTimeFormat(e||`en`,{numeric:`auto`});return i<30?t.format(-i,`day`):i<365?t.format(-Math.floor(i/30),`month`):t.format(-Math.floor(i/365),`year`)}catch{return i<30?t(`marketplace.relativeTime.daysAgo`,{count:i}):i<365?t(`marketplace.relativeTime.monthsAgo`,{count:Math.floor(i/30)}):t(`marketplace.relativeTime.yearsAgo`,{count:Math.floor(i/365)})}}}function A(){let e=a(),{appName:t}=r(),n=ee(),{t:i,language:E}=o(),A=k(),j=t?`/apps/${t}`:``,[M,N]=(0,D.useState)([]),[P,F]=(0,D.useState)(!0),[I,L]=(0,D.useState)(null),[R,z]=(0,D.useState)(``),[B,V]=(0,D.useState)(``),[H,U]=(0,D.useState)([]),[W,le]=(0,D.useState)([]),[G,K]=(0,D.useState)(null),[q,J]=(0,D.useState)(null),[Y,ue]=(0,D.useState)(new Set),de=(0,D.useMemo)(()=>{let e=new Map;for(let t of H)e.set(t.manifestId,t);return e},[H]),X=async()=>{F(!0),L(null);try{let[e,t,n,r]=await Promise.all([ie({limit:100}),se(),C(),ae()]);N(e.items??[]),U(t),le(n.items??[]);let i=new Set;for(let e of t)i.add(e.manifestId);for(let e of r.items)i.add(e.manifestId);ue(i)}catch(e){L(e?.message??String(e)),N([])}finally{F(!1)}};(0,D.useEffect)(()=>{X()},[]);let fe=async e=>{K(e.id),J(null);try{re().features.installLocal?await S({packageId:e.manifest_id||e.id,versionId:`latest`}):await oe({packageId:e.id,environmentId:``,seedSampleData:!0}),J({ok:!0,text:i(`marketplace.org.installed`,{defaultValue:`Installed ${e.display_name}`,name:e.display_name})}),await X(),ne()}catch(e){J({ok:!1,text:e?.message??String(e)})}finally{K(null)}},Z=(0,D.useMemo)(()=>{let e=new Set;for(let t of M)t.category&&e.add(t.category);return Array.from(e).sort()},[M]),Q=e=>{let t=`marketplace.category.${e}`,n=i(t,{defaultValue:e});return n===t?e:n},$=(0,D.useMemo)(()=>{let e=R.trim().toLowerCase();return M.filter(t=>{if(B&&t.category!==B)return!1;if(!e)return!0;let n=T(t,E);return`${n.displayName} ${t.manifest_id} ${n.description??``}`.toLowerCase().includes(e)})},[M,R,B,E]);return n?(0,O.jsxs)(`div`,{className:`flex flex-col gap-6 p-4 sm:p-6`,children:[(0,O.jsxs)(`div`,{className:`flex items-start justify-between gap-4 flex-wrap`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(v,{className:`h-6 w-6 text-primary`,"aria-hidden":`true`}),(0,O.jsx)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight`,children:i(`marketplace.title`)})]}),(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:i(`marketplace.subtitle`)})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsxs)(y,{variant:`outline`,size:`sm`,onClick:()=>e(`${j}/system/marketplace/installed`),children:[(0,O.jsx)(g,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),H.length>0?i(`marketplace.installedCount`,{count:H.length}):i(`marketplace.installed`)]}),(0,O.jsxs)(y,{variant:`outline`,size:`sm`,onClick:()=>void X(),disabled:P,children:[(0,O.jsx)(c,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),i(`marketplace.refresh`)]})]})]}),(0,O.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3`,children:[(0,O.jsxs)(`div`,{className:`relative flex-1`,children:[(0,O.jsx)(d,{className:`absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground`,"aria-hidden":`true`}),(0,O.jsx)(te,{value:R,onChange:e=>z(e.target.value),placeholder:i(`marketplace.searchPlaceholder`),className:`pl-9`,"aria-label":i(`marketplace.searchAria`)})]}),Z.length>0&&(0,O.jsxs)(`div`,{className:`flex flex-wrap gap-1.5`,children:[(0,O.jsx)(y,{size:`sm`,variant:B===``?`default`:`outline`,onClick:()=>V(``),children:i(`marketplace.all`)}),Z.map(e=>(0,O.jsx)(y,{size:`sm`,variant:B===e?`default`:`outline`,onClick:()=>V(e),children:Q(e)},e))]})]}),I&&(0,O.jsxs)(`div`,{className:`flex items-start gap-3 rounded-md border border-destructive/30 bg-destructive/5 p-4 text-sm`,children:[(0,O.jsx)(_,{className:`h-4 w-4 mt-0.5 text-destructive`,"aria-hidden":`true`}),(0,O.jsxs)(`div`,{children:[(0,O.jsx)(`div`,{className:`font-medium text-destructive`,children:i(`marketplace.load.failed`)}),(0,O.jsx)(`div`,{className:`text-muted-foreground mt-1`,children:I}),(0,O.jsx)(`div`,{className:`text-xs text-muted-foreground mt-2`,dangerouslySetInnerHTML:{__html:i(`marketplace.load.failedHint`)}})]})]}),W.length>0&&(0,O.jsxs)(`section`,{className:`flex flex-col gap-3`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(v,{className:`h-5 w-5 text-primary`,"aria-hidden":`true`}),(0,O.jsx)(`h2`,{className:`text-sm font-semibold`,children:i(`marketplace.org.heading`,{defaultValue:`Your organization`})}),(0,O.jsx)(s,{variant:`secondary`,className:`text-xs`,children:W.length})]}),q&&(0,O.jsx)(`div`,{className:`rounded-md border p-3 text-sm ${q.ok?`border-green-500/30 bg-green-500/5 text-green-700 dark:text-green-400`:`border-destructive/30 bg-destructive/5 text-destructive`}`,children:q.text}),(0,O.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:W.map(e=>{let t=Y.has(e.manifest_id);return(0,O.jsxs)(b,{className:`flex flex-col`,"data-testid":`org-card-${e.manifest_id}`,children:[(0,O.jsxs)(f,{className:`flex flex-row items-start gap-3 pb-2`,children:[(0,O.jsx)(w,{iconUrl:e.icon_url,displayName:e.display_name,manifestId:e.manifest_id}),(0,O.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,O.jsx)(m,{className:`text-base truncate`,children:e.display_name}),(0,O.jsx)(p,{className:`text-xs truncate`,children:(0,O.jsx)(`code`,{className:`font-mono`,children:e.manifest_id})})]}),e.visibility&&(0,O.jsx)(s,{variant:`outline`,className:`shrink-0 text-xs`,children:e.visibility})]}),(0,O.jsxs)(l,{className:`flex-1 flex flex-col gap-2`,children:[(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground line-clamp-2`,children:e.description||i(`marketplace.noDescription`)}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2 mt-auto pt-2 flex-wrap`,children:[e.latest_version&&(0,O.jsxs)(s,{variant:`outline`,className:`text-xs`,children:[(0,O.jsx)(x,{className:`h-3 w-3 mr-1`,"aria-hidden":`true`}),i(`marketplace.versionBadge`,{version:e.latest_version})]}),(0,O.jsx)(`div`,{className:`ml-auto`,children:t?(0,O.jsxs)(s,{variant:`default`,className:`text-xs bg-green-600 hover:bg-green-600`,children:[(0,O.jsx)(h,{className:`h-3 w-3 mr-1`,"aria-hidden":`true`}),i(`marketplace.org.installedBadge`,{defaultValue:`Installed`})]}):(0,O.jsx)(y,{size:`sm`,onClick:()=>void fe(e),disabled:G===e.id,children:G===e.id?i(`marketplace.org.installing`,{defaultValue:`Installing…`}):i(`marketplace.org.install`,{defaultValue:`Install`})})})]})]})]},e.id)})}),(0,O.jsx)(`div`,{className:`border-b pt-2`})]}),P&&M.length===0?(0,O.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:Array.from({length:6}).map((e,t)=>(0,O.jsxs)(b,{children:[(0,O.jsxs)(f,{className:`pb-2`,children:[(0,O.jsx)(u,{className:`h-10 w-10 rounded-lg mb-2`}),(0,O.jsx)(u,{className:`h-5 w-3/4`}),(0,O.jsx)(u,{className:`h-4 w-1/2 mt-1`})]}),(0,O.jsx)(l,{children:(0,O.jsx)(u,{className:`h-12 w-full`})})]},t))}):$.length===0?(0,O.jsx)(`div`,{className:`text-center py-12 text-sm text-muted-foreground`,children:M.length===0?i(`marketplace.noApprovedYet`):i(`marketplace.noMatchFilters`)}):(0,O.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:$.map(t=>{let n=de.get(t.manifest_id),r=T(t,E);return(0,O.jsxs)(b,{className:`cursor-pointer transition-colors hover:bg-accent/50 flex flex-col`,onClick:()=>e(`${j}/system/marketplace/${t.id}`),role:`link`,tabIndex:0,onKeyDown:n=>{(n.key===`Enter`||n.key===` `)&&(n.preventDefault(),e(`${j}/system/marketplace/${t.id}`))},"data-testid":`marketplace-card-${t.manifest_id}`,children:[(0,O.jsxs)(f,{className:`flex flex-row items-start gap-3 pb-2`,children:[(0,O.jsx)(w,{iconUrl:t.icon_url,displayName:r.displayName,manifestId:t.manifest_id}),(0,O.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,O.jsx)(m,{className:`text-base truncate`,children:r.displayName}),(0,O.jsx)(p,{className:`text-xs truncate`,children:(0,O.jsx)(`code`,{className:`font-mono`,children:t.manifest_id})})]}),t.publisher&&t.publisher!==`private`&&(0,O.jsx)(s,{variant:t.publisher===`objectstack`?`default`:`secondary`,className:`shrink-0`,children:t.publisher})]}),(0,O.jsxs)(l,{className:`flex-1 flex flex-col gap-2`,children:[(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground line-clamp-2`,children:r.description||i(`marketplace.noDescription`)}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2 mt-auto pt-2 flex-wrap`,children:[n&&(0,O.jsxs)(s,{variant:`default`,className:`text-xs bg-green-600 hover:bg-green-600`,children:[(0,O.jsx)(h,{className:`h-3 w-3 mr-1`,"aria-hidden":`true`}),i(`marketplace.installedBadge`,{version:n.version})]}),t.latest_version?.version&&(0,O.jsxs)(s,{variant:`outline`,className:`text-xs`,children:[(0,O.jsx)(x,{className:`h-3 w-3 mr-1`,"aria-hidden":`true`}),i(`marketplace.versionBadge`,{version:t.latest_version.version})]}),t.category&&(0,O.jsx)(s,{variant:`outline`,className:`text-xs`,children:Q(t.category)}),t.latest_version?.published_at&&(0,O.jsx)(`span`,{className:`text-xs text-muted-foreground ml-auto`,children:A(t.latest_version.published_at)})]})]})]},t.id)})})]}):(0,O.jsx)(ce,{})}export{E as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{$ as r,r as i}from"./framework-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{$ as r,r as i}from"./framework-DCMHw4uc.js";import{Es as a,Os as o,Xo as s,ks as c}from"./ui-components-D1FYlKrM.js";function l(e,t,n){if(!(!e||t==null)){if(n){let r=e.find(e=>e.name===t&&e._packageId===n);if(r)return r}return e.find(e=>e.name===t)}}var u=e(t(),1),d=n();function f({sections:e,open:t}){if(!t)return null;let{t:n}=i(),[r,l]=(0,u.useState)([`0`]),[f,p]=(0,u.useState)(null),m=async(e,t)=>{try{await navigator.clipboard.writeText(JSON.stringify(e,null,2)),p(t),setTimeout(()=>p(null),2e3)}catch(e){console.error(`Failed to copy:`,e)}},h=e=>{l(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])};return(0,d.jsxs)(`div`,{className:`w-80 border-l bg-background p-0 overflow-hidden flex flex-col shrink-0 z-20 transition-all`,children:[(0,d.jsxs)(`div`,{className:`px-4 py-3 border-b bg-muted/5 flex items-center justify-between`,children:[(0,d.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-wider text-muted-foreground`,children:n(`layout.metadata.panelTitle`)}),(0,d.jsx)(`span`,{className:`text-[10px] text-muted-foreground/60`,children:n(`layout.metadata.jsonBadge`)})]}),(0,d.jsx)(`div`,{className:`flex-1 overflow-auto`,children:e.map((e,t)=>{let i=String(t),l=r.includes(i),u=f===t;return(0,d.jsxs)(`div`,{className:`border-b last:border-b-0`,children:[(0,d.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 hover:bg-muted/5 transition-colors`,children:[(0,d.jsxs)(`button`,{onClick:()=>h(i),className:`flex-1 flex items-center justify-between text-left`,children:[(0,d.jsx)(`h4`,{className:`text-xs font-semibold text-foreground`,children:e.title}),l?(0,d.jsx)(o,{className:`h-3 w-3 text-muted-foreground ml-2`}):(0,d.jsx)(a,{className:`h-3 w-3 text-muted-foreground ml-2`})]}),(0,d.jsx)(`button`,{onClick:()=>m(e.data,t),className:`p-1 hover:bg-muted rounded transition-colors ml-2`,title:n(`layout.metadata.copyJson`),children:u?(0,d.jsx)(c,{className:`h-3 w-3 text-green-600`}):(0,d.jsx)(s,{className:`h-3 w-3 text-muted-foreground`})})]}),l&&(0,d.jsx)(`div`,{className:`px-4 pb-4`,children:(0,d.jsx)(`div`,{className:`relative rounded-md border border-border/50 bg-muted/5 overflow-hidden`,children:(0,d.jsx)(`pre`,{className:`text-[11px] leading-relaxed p-3 overflow-auto max-h-96 font-mono text-foreground/90`,children:JSON.stringify(e.data,null,2)})})})]},t)})})]})}function p(){let[e,t]=(0,u.useState)((0,u.useMemo)(()=>{try{return typeof window<`u`?r(window.location.search).enabled:!1}catch{return!1}},[]));return{showDebug:e,toggleDebug:()=>t(e=>!e)}}export{p as n,l as r,f as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,l as n,t as r,u as i}from"./vendor-react-DR370ovB.js";import{C as a}from"./framework-DCMHw4uc.js";import{n as o}from"./data-adapter-Hh2YXzlW.js";import{i as s}from"./plugin-form-DjP7n76r.js";import{a as c,o as l}from"./assistantBus-3d9MxsCF.js";var u=e(t(),1),d=r(),f=(0,u.createContext)(!1),p=`preview`,m=`draft`;function h(e){return new URLSearchParams(e).get(p)===m}var g=!1;function _(){g=!0}function v({force:e,children:t}){let r=n(),a=i(),o=(0,u.useMemo)(()=>h(r.search),[r.search]),[s,c]=(0,u.useState)(o);return(0,u.useEffect)(()=>{if(o){c(!0),g=!1;return}if(!s)return;if(g){g=!1,c(!1);return}let e=new URLSearchParams(r.search);e.set(p,m),a(`${r.pathname}?${e.toString()}${r.hash}`,{replace:!0})},[o,s,r.pathname,r.search,r.hash,a]),(0,d.jsx)(f.Provider,{value:e??(o||s),children:t})}function y(){return(0,u.useContext)(f)}var b=300*1e3,x=[`app`,`view`],S={apps:`app`,objects:`object`,dashboards:`dashboard`,reports:`report`,pages:`page`},C=`objectui:metadata:`;function w(){try{let e=import.meta;if(e&&e.env&&typeof e.env.MODE==`string`)return e.env.MODE!==`production`}catch{}return!1}var T=w();function E(...e){T&&console.debug(`[MetadataProvider]`,...e)}function D(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`items`in e&&Array.isArray(e.items)?e.items:[]}function O(e){return e==null?null:typeof e==`object`&&`item`in e?e.item??null:e}function k(e){return!!e&&typeof e==`object`&&`name`in e&&typeof e.name==`string`}function A(e){return!!e&&typeof e==`object`&&!!e.viewKind&&!!e.object}function j(e,t){if(!e.length||!t.length)return e;let n={},r=new Set;for(let e of t)A(e)&&r.add(e.object);for(let e of t){if(A(e)){let t=n[e.object]||={listViews:{},formViews:{}},r=e.name||`${e.object}.${e.viewKind}`,i=e.config&&typeof e.config==`object`?e.config:{},a={...i,name:r,label:e.label??i.label,isDefault:!!e.isDefault};e.viewKind===`form`?(t.formViews[r]=a,(e.isDefault||!t.form)&&(t.form=a)):(t.listViews[r]=a,e.isDefault&&(t.primary=a));continue}let t=e?.name||e?.list?.data?.object||e?.form?.data?.object;if(!t||r.has(t))continue;let i=n[t]||={listViews:{},formViews:{}};if(e.list){i.primary=e.list;let t=e.list.name||`list`;i.listViews[t]=e.list}if(e.form&&(i.form=e.form),e.listViews&&typeof e.listViews==`object`)for(let[t,n]of Object.entries(e.listViews))i.listViews[t]=n;if(e.formViews&&typeof e.formViews==`object`)for(let[t,n]of Object.entries(e.formViews))i.formViews[t]=n}return e.map(e=>{let t=n[e.name];if(!t)return e;let r=e.listViews||e.list_views||{},i=e.formViews||e.form_views||{},a={...e,listViews:{...t.listViews,...r}};return(Object.keys(t.formViews).length||Object.keys(i).length)&&(a.formViews={...t.formViews,...i}),t.primary&&!e.list&&(a.list=t.primary),t.form&&!e.form&&(a.form=t.form),a})}function M(e){if(!e?.length)return e;let t={};for(let n of e){let e=n?.fields;if(!e)continue;let r=Array.isArray(e)?e.map(e=>[e?.name,e]):Object.entries(e);for(let[e,i]of r){let r=i;if(!e||!r?.inlineEdit||r.type!==`master_detail`&&r.type!==`lookup`)continue;let a=r.reference;a&&(t[a]||=[]).push({childObject:n.name,relationshipField:e,inlineMode:s(n,r.inlineEdit,{relationshipField:e}),...r.inlineTitle?{title:r.inlineTitle}:{},...Array.isArray(r.inlineColumns)?{columns:r.inlineColumns}:{},...typeof r.inlineAmountField==`string`?{amountField:r.inlineAmountField}:{}})}}return Object.keys(t).length?e.map(e=>{let n=t[e.name];if(!n?.length)return e;let r={...e.form||{type:`simple`}},i=Array.isArray(r.subforms)?r.subforms:[],a=new Set(i.map(e=>e.childObject));r.subforms=[...n.filter(e=>!a.has(e.childObject)),...i];let o={...e,form:r};return e.formViews?.default&&(o.formViews={...e.formViews,default:{...e.formViews.default,subforms:r.subforms}}),o}):e}function N(){return{status:`idle`,items:[],byName:new Map,error:null,fetchedAt:0,promise:null}}function P(e){if(typeof sessionStorage>`u`)return null;try{let t=sessionStorage.getItem(C+e);if(!t)return null;let n=JSON.parse(t);return Array.isArray(n)?n:null}catch{return null}}function F(e,t){if(!(typeof sessionStorage>`u`))try{sessionStorage.setItem(C+e,JSON.stringify(t))}catch{}}function I({children:e,adapter:t,ttlMs:n=b}){let r=(0,u.useRef)(new Map),i=(0,u.useRef)(new Map),s=(0,u.useRef)(t);s.current=t;let f=y(),p=(0,u.useMemo)(()=>f?new o({baseUrl:``,previewDrafts:!0}):null,[f]),m=(0,u.useRef)(p);m.current=p;let[h,g]=(0,u.useState)(0),_=(0,u.useCallback)(()=>{typeof queueMicrotask==`function`?queueMicrotask(()=>g(e=>e+1)):Promise.resolve().then(()=>g(e=>e+1))},[]);(0,u.useEffect)(()=>{r.current.clear(),i.current.clear(),_()},[f,_]);let v=(0,u.useCallback)(e=>{let t=r.current.get(e);return t||(t=N(),r.current.set(e,t)),t},[]),C=(0,u.useCallback)(e=>{let t=v(e);if(t.promise)return t.promise;if(t.status===`ready`&&Date.now()-t.fetchedAt<n)return E(`cache hit (fresh) type=${e} items=${t.items.length}`),Promise.resolve(t.items);let r=Date.now();t.status=`loading`,t.error=null;let i=m.current,a=(i?i.list(e):s.current.getClient().meta.getItems(e)).then(n=>{let a=D(n);t.items=a,t.status=`ready`,t.error=null,t.fetchedAt=Date.now(),t.promise=null,t.byName.clear();for(let e of a)k(e)&&t.byName.set(e.name,e);return e===`app`&&!i&&F(e,a),E(`fetched type=${e} items=${a.length} in ${Date.now()-r}ms`),_(),a}).catch(n=>{let r=n instanceof Error?n:Error(String(n));return t.status=`error`,t.error=r,t.promise=null,E(`fetch failed type=${e}`,r),_(),[]});return t.promise=a,a},[_,v,n]),w=(0,u.useCallback)((e,t)=>{let n=v(e);if(n.byName.has(t))return E(`item cache hit type=${e} name=${t}`),Promise.resolve(n.byName.get(t)??null);let r=i.current.get(e);r||(r=new Map,i.current.set(e,r));let a=r.get(t);if(a)return a;let o=Date.now(),c=m.current,l=(c?c.get(e,t):s.current.getClient().meta.getItem(e,t)).then(i=>{let a=O(i);return a&&n.byName.set(t,a),E(`fetched item type=${e} name=${t} in ${Date.now()-o}ms`),r.delete(t),a}).catch(n=>(r.delete(t),E(`fetch item failed type=${e} name=${t}`,n),null));return r.set(t,l),l},[v]),T=(0,u.useCallback)(async e=>{if(e){let t=v(e);t.fetchedAt=0,t.byName.clear(),await C(e);return}let t=Array.from(r.current.keys()).filter(e=>r.current.get(e).status!==`idle`);await Promise.all(t.map(e=>{let t=r.current.get(e);return t.fetchedAt=0,t.byName.clear(),C(e)}))},[C,v]),A=(0,u.useCallback)((e,t)=>{let n=r.current.get(e);n&&(t?(n.byName.delete(t),n.items=n.items.filter(e=>e?.name!==t),E(`invalidated type=${e} name=${t}`)):(n.status=`idle`,n.items=[],n.byName.clear(),n.error=null,n.fetchedAt=0,E(`invalidated type=${e}`)),_())},[_]);(0,u.useEffect)(()=>{if(f)return c(({type:e})=>{A(e)})},[f,A]),(0,u.useEffect)(()=>l(()=>{T()}),[T]);let[I,L]=(0,u.useState)(!0),[R,z]=(0,u.useState)(null);(0,u.useEffect)(()=>{let e=!1,t=f?null:P(`app`);if(t){let e=v(`app`);e.items=t,e.status=`ready`,e.fetchedAt=0;for(let n of t)k(n)&&e.byName.set(n.name,n);_(),L(!1)}return(async()=>{for(let t of x)try{await C(t),e||z(null)}catch(t){e||z(t instanceof Error?t:Error(String(t)))}e||L(!1)})(),()=>{e=!0}},[t,C,v,_,f]);let B=(0,u.useMemo)(()=>{let e=e=>{let t=v(e);return t.status===`idle`&&C(e),t.items};return{apps:v(`app`).items,get objects(){let t=e(S.objects),n=e(`view`);return M(n.length?j(t,n):t)},get dashboards(){return e(S.dashboards)},get reports(){return e(S.reports)},get pages(){return e(S.pages)},loading:I,error:R??v(`app`).error,refresh:T,invalidate:A,ensureType:C,getItem:w,getItemsByType:t=>e(t),getTypeStatus:e=>v(e).status}},[h,I,R,C,w,v,T,A]);return(0,d.jsx)(a.Provider,{value:B,children:e})}export{y as a,_ as i,p as n,v as r,I as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as n,f as r,l as i,p as a,t as o,u as s}from"./vendor-react-DR370ovB.js";import{f as c,m as l}from"./infrastructure-CJNwTVno.js";import{A as u,L as d,O as f,T as p,r as m,w as h}from"./framework-DCMHw4uc.js";import{Co as g,H as _,R as v,Xi as y,_c as b,z as x}from"./ui-components-D1FYlKrM.js";import{r as S}from"./vendor-ui-utils-rQOI1gAo.js";import"./MetadataProvider-xgIDLxXw.js";import{r as C}from"./ExpressionProvider-B9tL1RMW.js";import{a as w,i as T,o as E,r as D,s as O}from"./RecordDetailView-Dg0FtCgX.js";import{n as k,r as A,t as j}from"./MetadataInspector-BcJZckHC.js";import{t as M}from"./InterfaceListPage-CIYeUsaL.js";var N=e(n(),1),P=o(),F={id:`current-user`,name:`Demo User`,isPlatformAdmin:!1};function I(e){let{dataSource:t,objects:n,objectName:r,onRefresh:i}=e,a=s(),{user:o,activeOrganization:d}=c(),{fieldLabel:f,fieldOptionLabel:p,actionParamText:m,actionParamOptionLabel:h,actionDescription:g}=b(),_=(0,N.useMemo)(()=>r?n?.find(e=>e.name===r):void 0,[n,r]),v=r||_?.name,y=(0,N.useCallback)(()=>{i?.()},[i]),x=u({dataSource:t,onUndo:()=>{y(),S.success(`Change undone`)}}),[C,k]=(0,N.useState)({open:!1,message:``}),[A,j]=(0,N.useState)({open:!1,params:[]}),[M,I]=(0,N.useState)({open:!1}),[L,R]=(0,N.useState)(null),z=(0,N.useRef)(new Set),B=(0,N.useCallback)((e,t)=>new Promise(n=>{I({open:!0,spec:e,data:t,resolve:n})}),[]),V=(0,N.useCallback)((e,t)=>new Promise(n=>{k({open:!0,message:e,options:t,resolve:n})}),[]),H=(0,N.useCallback)((e,t)=>new Promise(i=>{let a=t?.params&&!Array.isArray(t.params)?t.params._rowRecord:void 0,o=D(e,{objectName:r||_?.name||``,objects:n||[],fieldLabel:f,fieldOptionLabel:p,row:a}),s=r||_?.name;j({open:!0,params:o.map(e=>({...e,label:m(s,t?.name,e.name,`label`,e.label)??e.label,placeholder:m(s,t?.name,e.name,`placeholder`,e.placeholder)??e.placeholder,helpText:m(s,t?.name,e.name,`helpText`,e.helpText)??e.helpText,options:Array.isArray(e.options)?e.options.map(n=>({...n,label:h(s,t?.name,e.name,n.value,n.label)})):e.options})),title:t?.label||t?.title,description:g(s,t?.name,t?.description),resolve:i})}),[r,_,n,f,p,m,h]),U=o?{id:o.id,name:o.name,avatar:o.image,isPlatformAdmin:o?.isPlatformAdmin??!1}:F,W=(0,N.useCallback)((e,t)=>{if(t?.type===`error`){S.error(e);return}if(t?.undo){S.success(e,{duration:t.duration,action:{label:t.undo.label||`Undo`,onClick:()=>{x.undo()}}});return}S.success(e,{duration:t?.duration})},[x]),G=(0,N.useCallback)((e,t)=>{t?.external||t?.newTab?window.open(e,`_blank`,`noopener,noreferrer`):a(e)},[a]),K=(0,N.useMemo)(()=>l(),[]),q=(0,N.useCallback)(async e=>{try{let n=e.target||e.name,r=e.params||{},i=typeof n==`string`?n:``;if(i.startsWith(`/`)||/^https?:\/\//i.test(i)){let t={...r},n=t._rowRecord;delete t._rowRecord;let a=i;n&&/\{[a-z_][a-z0-9_]*\}/i.test(a)&&(a=a.replace(/\{([a-z_][a-z0-9_]*)\}/gi,(e,t)=>{let r=n[t];return r==null?``:encodeURIComponent(String(r))}));let o=a.startsWith(`http`)?a:`${a}`,s=e.bodyShape&&typeof e.bodyShape==`object`&&e.bodyShape.wrap?e.bodyShape.wrap:void 0,c=s?{[s]:t}:{...t};if(n&&e.recordIdParam){let t=n[e.recordIdField||`id`];t!=null&&(c[e.recordIdParam]=t)}/\/api\/v1\/auth\//.test(a)&&!c.organizationId&&d?.id&&(c.organizationId=d.id),e.bodyExtra&&typeof e.bodyExtra==`object`&&Object.assign(c,e.bodyExtra);let l=(e.method||`POST`).toUpperCase(),u={method:l,headers:{"Content-Type":`application/json`},credentials:`include`};l!==`GET`&&l!==`DELETE`&&(u.body=JSON.stringify(c));let f=await K(o,u);if(!f.ok){let e=`HTTP ${f.status}`;try{let t=await f.json();e=t?.error||t?.message||e}catch{}return{success:!1,error:e}}let p=await f.json().catch(()=>({}));return e.refreshAfter!==!1&&y(),{success:!0,data:p,reload:e.refreshAfter!==!1}}let a=e.objectName||v,o=r._rowRecord,s={...r};delete s._rowRecord;let c=s.recordId??o?.[e.recordIdField||`id`];delete s.recordId,e.bodyExtra&&typeof e.bodyExtra==`object`&&Object.assign(s,e.bodyExtra),a&&typeof t?.execute==`function`?await t.execute(a,n,s):a&&c&&Object.keys(s).length>0&&typeof t?.update==`function`&&await t.update(a,c,s);let l;if(e.undoable&&a&&c&&o&&Object.keys(s).length>0&&typeof t?.update==`function`){let t={};for(let e of Object.keys(s))t[e]=o[e]??null;l={id:`undo-${a}-${c}-${Date.now()}`,type:`update`,objectName:a,recordId:String(c),timestamp:Date.now(),description:e.label||`Undo ${a}`,undoData:t,redoData:{...s}}}let u=e.refreshAfter!==!1;return u&&y(),{success:!0,reload:u,undo:l}}catch(e){return{success:!1,error:e.message}}},[t,v,K,d,y]),J=(0,N.useCallback)(async(e,t)=>{let n=e.target||e.name;if(!n)return{success:!1,error:`No flow target provided for flow action`};try{let r={...e.params||{}},i=r._rowRecord;delete r._rowRecord;let a=r.recordId??i?.id;if(a==null){let e=Array.isArray(t?.selectedRecords)?t.selectedRecords:[];if(e.length===1)a=e[0]?.id;else if(e.length>1)return{success:!1,error:`This flow runs on a single record — select exactly one row.`}}a!=null&&r.recordId==null&&(r.recordId=a);let o=await K(`/api/v1/automation/${encodeURIComponent(n)}/trigger`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({recordId:a,objectName:e.objectName||v,params:r})}),s=await o.json().catch(()=>null);if(!o.ok||s&&s.success===!1)return{success:!1,error:s?.error||`Flow "${n}" failed (HTTP ${o.status})`};let c=s?.data??{};if(c.status===`paused`&&c.screen)return R({flowName:n,runId:c.runId,screen:c.screen}),{success:!0,silent:!0};let l=e.refreshAfter!==!1;return l&&y(),{success:!0,data:s?.data,reload:l}}catch(e){return{success:!1,error:e.message}}},[K,v,y]),Y=(0,N.useCallback)(async(e,t)=>{let n=e.target||e.name;if(!n)return{success:!1,error:`No action target provided`};let r=e.params&&!Array.isArray(e.params)?{...e.params}:{},i=r._rowRecord;delete r._rowRecord;let a=e.recordIdField||`id`,o=r.recordId??i?.[a];if(o==null){let e=Array.isArray(t?.selectedRecords)?t.selectedRecords:[];if(e.length===1)o=e[0]?.[a];else if(e.length>1)return{success:!1,error:`This action runs on a single record — select exactly one row.`}}let s=`${n}:${o??``}`;if(z.current.has(s))return{success:!1,error:`Action already in progress`};z.current.add(s);let c=null;if(e.opensInNewTab)try{c=window.open(`about:blank`,`_blank`),c&&(c.document.write(`<!doctype html><meta charset="utf-8"><title>正在打开… Opening…</title><body style="margin:0;font-family:system-ui,sans-serif;display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;gap:16px;color:#4b5563"><div style="width:28px;height:28px;border:3px solid #e5e7eb;border-top-color:#6366f1;border-radius:50%;animation:s .8s linear infinite"></div><div>正在为你打开环境…</div><style>@keyframes s{to{transform:rotate(360deg)}}</style></body>`),c.document.close())}catch{c=null}try{let t=typeof e.newTabUrl==`string`?e.newTabUrl:``;if(e.opensInNewTab&&t){if(o==null){if(c)try{c.close()}catch{}return{success:!1,error:`This action runs on a single record — no record id available.`}}let n=`${window.location.origin}${t.replace(`{recordId}`,encodeURIComponent(String(o)))}`;if(c)try{c.location.href=n}catch{try{c.close()}catch{}window.location.href=n}else{let e=null;try{e=window.open(n,`_blank`)}catch{e=null}e||S(`浏览器拦截了弹窗 / Popup blocked`,{description:`点击在新标签页打开环境`,action:{label:`打开环境`,onClick:()=>{try{window.open(n,`_blank`)}catch{window.location.href=n}}},duration:1e4})}return e.refreshAfter===!0&&y(),{success:!0}}let i=e.objectName||v||`global`,a=await K(`/api/v1/actions/${encodeURIComponent(i)}/${encodeURIComponent(n)}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({recordId:o,params:r})}),s=await a.json().catch(()=>null);if(!a.ok||s&&s.success===!1){let e=s?.error||`Action "${n}" failed (HTTP ${a.status})`;if(c)try{c.close()}catch{}return S.error(e),{success:!1,error:e}}let l=e.refreshAfter!==!1;l&&y();let u=s?.data,d=u&&typeof u==`object`&&typeof u.redirectUrl==`string`?u.redirectUrl:null;if(d)if(c)try{c.location.href=d}catch{try{c.close()}catch{}window.location.href=d}else{let e=null;try{e=window.open(d,`_blank`)}catch{e=null}e||S(`浏览器拦截了弹窗 / Popup blocked`,{description:`点击在新标签页打开环境`,action:{label:`打开环境`,onClick:()=>{try{window.open(d,`_blank`)}catch{window.location.href=d}}},duration:1e4})}else if(c)try{c.close()}catch{}return{success:!0,data:u,reload:l}}catch(e){if(c)try{c.close()}catch{}let t=e.message;return S.error(t),{success:!1,error:t}}finally{z.current.delete(s)}},[K,v,y]);return{confirmHandler:V,toastHandler:W,navigateHandler:G,paramCollectionHandler:H,resultDialogHandler:B,apiHandler:q,flowHandler:J,serverActionHandler:Y,authFetch:K,actionProviderProps:(0,N.useMemo)(()=>({context:{...r?{objectName:r}:{},user:U,apiBase:``,activeOrganization:d?{id:d.id,slug:d.slug,name:d.name}:null},onConfirm:V,onToast:W,onNavigate:G,onParamCollection:H,onResultDialog:B,handlers:{api:q,flow:J,script:Y,modal:Y}}),[r,U,d,V,W,G,H,B,q,J,Y]),dialogs:(0,P.jsxs)(P.Fragment,{children:[(0,P.jsx)(O,{state:C,onOpenChange:e=>{e||k({open:!1,message:``})}}),(0,P.jsx)(E,{state:A,onOpenChange:e=>{e||j({open:!1,params:[]})}}),(0,P.jsx)(w,{state:M,onAcknowledge:()=>{M.resolve?.(),I({open:!1})}}),(0,P.jsx)(T,{state:L,authFetch:K,baseUrl:``,dataSource:t,objects:n,onClose:()=>R(null),onComplete:()=>{R(null),y()}})]})}}function L({children:e,...t}){let n=I(t);return(0,P.jsxs)(f,{...n.actionProviderProps,children:[e,n.dialogs]})}var R=t({PageView:()=>z});function z(){let{t:e}=m(),{pageName:t}=r(),[n]=a(),{showDebug:o}=k(),l=s(),u=i(),{user:f}=c(),b=f?.role===`admin`,{pages:S,objects:w}=p(),{app:T}=C(),E=h(),[D,O]=(0,N.useState)(0),F=A(S,t,T?._packageId);if(!F)return(0,P.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,P.jsxs)(v,{children:[(0,P.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,P.jsx)(g,{className:`h-6 w-6 text-muted-foreground`})}),(0,P.jsx)(_,{children:e(`empty.pageNotFound`)}),(0,P.jsx)(x,{children:e(`empty.pageNotFoundDescription`,{name:t})})]})});let I=Object.fromEntries(n.entries()),R=u.pathname.match(/\/apps\/([^/]+)/)?.[1],z=b&&!!R&&!!t;return(0,P.jsx)(L,{dataSource:E,objects:w,onRefresh:()=>O(e=>e+1),children:(0,P.jsxs)(`div`,{className:`flex flex-row h-full w-full overflow-hidden relative`,children:[(0,P.jsxs)(`div`,{className:`flex-1 overflow-auto h-full relative`,children:[z&&(0,P.jsx)(`button`,{type:`button`,onClick:()=>{z&&l(`/apps/${R}/metadata/page/${encodeURIComponent(t)}`)},className:`absolute right-3 top-3 z-30 inline-flex h-7 w-7 items-center justify-center rounded-md border border-input bg-background/90 text-muted-foreground shadow-sm backdrop-blur hover:bg-accent hover:text-accent-foreground`,"data-testid":`page-edit-in-studio-button`,title:e(`common.editInStudio`,{defaultValue:`Edit in studio`}),"aria-label":e(`common.editInStudio`,{defaultValue:`Edit in studio`}),children:(0,P.jsx)(y,{className:`h-3.5 w-3.5`})}),F.interfaceConfig?.source?(0,P.jsx)(M,{page:F},D):(0,P.jsx)(d,{schema:{...F,type:F.type||`page`,context:{...F.context,params:I,refreshKey:D}}},D)]}),(0,P.jsx)(j,{open:o,sections:[{title:`Page Configuration`,data:F}]})]})})}export{I as n,R as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{f as r,o as i}from"./infrastructure-CJNwTVno.js";import{$n as a,Jn as o,Ma as s,Pr as c,Sr as l,Xn as u,Yn as d,Zn as f,
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{f as r,o as i}from"./infrastructure-CJNwTVno.js";import{$n as a,Jn as o,Ma as s,Pr as c,Sr as l,Xn as u,Yn as d,Zn as f,_s as p,b as m,bs as h,er as g,hr as _,ir as v,ja as y,jr as b,nn as x,nr as S,on as C,qn as w,rr as T,tr as E}from"./ui-components-D1FYlKrM.js";var D=e(t(),1),O=n();function k(){let{user:e,updateUser:t,isLoading:n,changePassword:y,setInitialPassword:k,hasLocalPassword:j}=r(),{upload:M}=m(),[N,P]=(0,D.useState)(e?.name??``),[F,I]=(0,D.useState)(!1),[L,R]=(0,D.useState)(null),z=(0,D.useRef)(null),[B,V]=(0,D.useState)(!1),[H,U]=(0,D.useState)(null);return(0,D.useEffect)(()=>{P(e?.name??``)},[e?.name]),e?(0,O.jsxs)(`div`,{className:`flex flex-col gap-4 sm:gap-6 p-4 sm:p-6 max-w-2xl`,children:[(0,O.jsxs)(`div`,{className:`min-w-0`,children:[(0,O.jsx)(`h1`,{className:`text-xl sm:text-2xl font-bold tracking-tight`,children:`Profile`}),(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground mt-1`,children:`Manage your account settings`})]}),(0,O.jsx)(w,{children:(0,O.jsxs)(o,{className:`pt-6`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,O.jsxs)(g,{className:`h-16 w-16`,children:[(0,O.jsx)(S,{src:e.image??void 0,alt:e.name??`User`}),(0,O.jsx)(E,{className:`text-lg bg-primary text-primary-foreground`,children:i(e)})]}),(0,O.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,O.jsx)(`p`,{className:`text-lg font-semibold truncate`,children:e.name??`User`}),(0,O.jsx)(`p`,{className:`text-sm text-muted-foreground truncate`,children:e.email}),(0,O.jsx)(a,{variant:`secondary`,className:`mt-1`,children:e.role??`member`})]}),(0,O.jsxs)(`div`,{className:`flex flex-col gap-2 shrink-0`,children:[(0,O.jsx)(`input`,{ref:z,type:`file`,accept:`image/*`,className:`hidden`,onChange:async e=>{let n=e.target.files?.[0];if(z.current&&(z.current.value=``),n){V(!0),U(null);try{await t({image:(await M(n)).url})}catch(e){U(e instanceof Error?e.message:String(e))}finally{V(!1)}}},"data-testid":`profile-avatar-file`}),(0,O.jsxs)(_,{type:`button`,variant:`outline`,size:`sm`,disabled:B,onClick:()=>z.current?.click(),"data-testid":`profile-avatar-upload-btn`,children:[B?(0,O.jsx)(s,{className:`mr-2 h-4 w-4 animate-spin`}):(0,O.jsx)(c,{className:`mr-2 h-4 w-4`}),e.image?`Replace`:`Upload`]}),e.image&&(0,O.jsxs)(_,{type:`button`,variant:`ghost`,size:`sm`,disabled:B,onClick:async()=>{V(!0),U(null);try{await t({image:null})}catch(e){U(e instanceof Error?e.message:String(e))}finally{V(!1)}},"data-testid":`profile-avatar-remove-btn`,children:[(0,O.jsx)(l,{className:`mr-2 h-4 w-4`}),`Remove`]})]})]}),H&&(0,O.jsxs)(T,{variant:`destructive`,className:`mt-4`,children:[(0,O.jsx)(h,{className:`h-4 w-4`}),(0,O.jsx)(v,{children:H})]})]})}),(0,O.jsxs)(w,{children:[(0,O.jsxs)(u,{children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(b,{className:`h-4 w-4 text-muted-foreground`}),(0,O.jsx)(f,{className:`text-base sm:text-lg`,children:`Personal Information`})]}),(0,O.jsx)(d,{children:`Update your name and view account details`})]}),(0,O.jsx)(o,{children:(0,O.jsxs)(`form`,{onSubmit:async e=>{e.preventDefault(),R(null),I(!1);try{await t({name:N}),I(!0)}catch(e){R(e instanceof Error?e.message:String(e))}},className:`space-y-4`,children:[L&&(0,O.jsxs)(T,{variant:`destructive`,children:[(0,O.jsx)(h,{className:`h-4 w-4`}),(0,O.jsx)(v,{children:L})]}),F&&(0,O.jsxs)(T,{children:[(0,O.jsx)(p,{className:`h-4 w-4 text-green-600`}),(0,O.jsx)(v,{className:`text-green-800 dark:text-green-400`,children:`Profile updated successfully.`})]}),(0,O.jsxs)(`div`,{className:`space-y-2`,children:[(0,O.jsx)(C,{htmlFor:`profile-name`,children:`Name`}),(0,O.jsx)(x,{id:`profile-name`,type:`text`,value:N,onChange:e=>P(e.target.value),required:!0,"aria-required":`true`,disabled:n})]}),(0,O.jsxs)(`div`,{className:`space-y-2`,children:[(0,O.jsx)(C,{htmlFor:`profile-email`,children:`Email`}),(0,O.jsx)(x,{id:`profile-email`,type:`email`,value:e.email,disabled:!0,className:`bg-muted text-muted-foreground`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Email cannot be changed.`})]}),(0,O.jsxs)(`div`,{className:`space-y-2`,children:[(0,O.jsx)(C,{children:`Role`}),(0,O.jsx)(x,{type:`text`,value:e.role??`member`,disabled:!0,className:`bg-muted text-muted-foreground`})]}),(0,O.jsx)(_,{type:`submit`,disabled:n,className:`w-full sm:w-auto`,children:n?`Saving…`:`Save Changes`})]})})]}),(0,O.jsx)(A,{changePassword:y,setInitialPassword:k,hasLocalPassword:j})]}):null}function A({changePassword:e,setInitialPassword:t,hasLocalPassword:n,highlight:r,onPasswordSet:i}){let[a,s]=(0,D.useState)(null),[c,l]=(0,D.useState)(``),[m,g]=(0,D.useState)(``),[b,S]=(0,D.useState)(``),[E,k]=(0,D.useState)(!1),[A,j]=(0,D.useState)(null),[M,N]=(0,D.useState)(null);(0,D.useEffect)(()=>{let e=!1;return n().then(t=>{e||s(t)}).catch(()=>{e||s(!1)}),()=>{e=!0}},[n]);let P=()=>{l(``),g(``),S(``)},F=async n=>{if(n.preventDefault(),j(null),N(null),m.length<8){j(`Password must be at least 8 characters`);return}if(m!==b){j(`Passwords do not match`);return}k(!0);try{if(a){if(!c){j(`Enter your current password`),k(!1);return}await e(c,m),N(`Password changed.`)}else await t(m),N(`Local password set. You can now sign in with email and password on this environment.`),s(!0),i?.();P()}catch(e){j(e instanceof Error?e.message:String(e))}finally{k(!1)}},I=a===null;return(0,O.jsxs)(w,{className:r?`ring-2 ring-amber-300 dark:ring-amber-700`:void 0,children:[(0,O.jsxs)(u,{children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(y,{className:`h-4 w-4 text-muted-foreground`}),(0,O.jsx)(f,{className:`text-base sm:text-lg`,children:a?`Change Password`:`Set Local Password`})]}),(0,O.jsx)(d,{children:a?`Update the password you use to sign in to this environment.`:`You signed in via single sign-on. Set a local password to also sign in with email and password on this environment.`})]}),(0,O.jsx)(o,{children:(0,O.jsxs)(`form`,{onSubmit:F,className:`space-y-4 max-w-md`,children:[a&&(0,O.jsxs)(`div`,{className:`space-y-2`,children:[(0,O.jsx)(C,{htmlFor:`current-password`,children:`Current password`}),(0,O.jsx)(x,{id:`current-password`,type:`password`,autoComplete:`current-password`,value:c,onChange:e=>l(e.target.value),disabled:E||I,required:!0})]}),(0,O.jsxs)(`div`,{className:`space-y-2`,children:[(0,O.jsx)(C,{htmlFor:`new-password`,children:a?`New password`:`Password`}),(0,O.jsx)(x,{id:`new-password`,type:`password`,autoComplete:`new-password`,value:m,onChange:e=>g(e.target.value),disabled:E||I,minLength:8,required:!0})]}),(0,O.jsxs)(`div`,{className:`space-y-2`,children:[(0,O.jsx)(C,{htmlFor:`confirm-password`,children:`Confirm password`}),(0,O.jsx)(x,{id:`confirm-password`,type:`password`,autoComplete:`new-password`,value:b,onChange:e=>S(e.target.value),disabled:E||I,minLength:8,required:!0})]}),A&&(0,O.jsxs)(T,{variant:`destructive`,children:[(0,O.jsx)(h,{className:`h-4 w-4`}),(0,O.jsx)(v,{children:A})]}),M&&(0,O.jsxs)(T,{children:[(0,O.jsx)(p,{className:`h-4 w-4`}),(0,O.jsx)(v,{children:M})]}),(0,O.jsx)(_,{type:`submit`,disabled:E||I,className:`w-full sm:w-auto`,children:E?`Saving…`:a?`Change password`:`Set password`})]})})]})}export{k as ProfilePage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as e}from"./rolldown-runtime-CMxvf4Kt.js";import{_ as t,t as n}from"./vendor-react-DR370ovB.js";import{w as r}from"./framework-DCMHw4uc.js";import{$n as i,Bn as a,Fi as o,Hn as s,Ia as ee,Io as te,Jn as ne,Ln as c,Ri as re,Rn as l,Ui as ie,Vn as u,Xn as ae,Xo as oe,Yn as se,Zn as ce,ct as d,dt as f,es as le,hr as p,lt as m,nn as h,on as g,ot as ue,qn as de,st as fe,ut as pe,yi as me,zn as _}from"./ui-components-D1FYlKrM.js";import{r as v}from"./vendor-ui-utils-rQOI1gAo.js";import"./src-ChUzpvnF.js";var y=e(t(),1),b=n();function he(e){return e?e.replace(/^\/+/,``).match(/^forms\/([^/?#]+)/i)?.[1]??null:null}function x(e){return e.trim().toLowerCase().replace(/[^a-z0-9-_]+/g,`-`).replace(/^-+|-+$/g,``)}function S(){let e=r()?.getClient?.(),[t,n]=(0,y.useState)([]),[S,ge]=(0,y.useState)([]),[C,w]=(0,y.useState)(!0),[T,E]=(0,y.useState)(null),[_e,D]=(0,y.useState)(!1),[O,k]=(0,y.useState)(``),[A,j]=(0,y.useState)(``),[M,N]=(0,y.useState)(!1),[ve,P]=(0,y.useState)(!1),[F,I]=(0,y.useState)(null),[L,R]=(0,y.useState)(``),[z,B]=(0,y.useState)(`thank-you`),[V,H]=(0,y.useState)(``),[U,W]=(0,y.useState)(``),[G,K]=(0,y.useState)(``),[q,J]=(0,y.useState)(!1),Y=async()=>{if(!e?.meta?.getItems){E(`meta.getItems is not available on this client`),w(!1);return}w(!0),E(null);try{let t=await e.meta.getItems(`view`),r=Array.isArray(t)?t:Array.isArray(t?.items)?t.items:Array.isArray(t?.value)?t.value:[],i=[],a=[];for(let e of r){let t=e?.spec??e;if(!(t?.sections||t?.groups||t?.form||t?.type===`simple`||t?.type===`tabbed`||t?.type===`wizard`||t?.viewType===`form`))continue;let n=t?.sharing,r=n?.publicLink,o=he(r);n?.allowAnonymous&&o&&r?i.push({name:t?.name??e?.name,label:t?.label,object:t?.object,slug:o,publicLink:r,updatedAt:e?.updatedAt??e?.updated_at,spec:t}):a.push({name:t?.name??e?.name,label:t?.label,object:t?.object,spec:t})}n(i),ge(a)}catch(e){E(e?.message??String(e))}finally{w(!1)}};(0,y.useEffect)(()=>{Y()},[]);let ye=typeof window<`u`?window.location.origin:``,X=e=>`${ye}/console/f/${e}`,Z=e=>`<iframe src="${X(e)}" width="100%" height="640" frameborder="0" style="border:0;"></iframe>`,be=e=>`<iframe\n src={\`${X(e)}\`}\n title="Public form"\n style={{ width: '100%', height: 640, border: 0 }}\n/>`,Q=async(e,t)=>{try{await navigator.clipboard.writeText(t),v.success(`Copied ${e}`)}catch{v.error(`Clipboard unavailable`)}},xe=async()=>{if(!O||!A)return;let t=S.find(e=>e.name===O);if(!t)return;let n=x(A);if(!n){v.error(`Invalid slug`);return}let r={...t.spec,sharing:{...t.spec.sharing??{},enabled:!0,allowAnonymous:!0,publicLink:`/forms/${n}`}};N(!0);try{await e.meta.saveItem(`view`,t.name,r),v.success(`Published ${t.name}`),D(!1),k(``),j(``),await Y()}catch(e){v.error(`Publish failed: ${e?.message??e}`)}finally{N(!1)}},Se=e=>{I(e),R(e.slug);let t=e.spec?.submitBehavior;B(t?.kind??`thank-you`),H(t?.title??``),W(t?.message??``),K(t?.url??``),P(!0)},Ce=async()=>{if(!F)return;let t=x(L);if(!t){v.error(`Invalid slug`);return}let n;switch(z){case`thank-you`:n={kind:`thank-you`},V&&(n.title=V),U&&(n.message=U);break;case`redirect`:if(!G){v.error(`Redirect URL is required`);return}n={kind:`redirect`,url:G};break;case`continue`:case`next-record`:n={kind:z};break}let r={...F.spec,sharing:{...F.spec.sharing??{},enabled:!0,allowAnonymous:!0,publicLink:`/forms/${t}`},submitBehavior:n};J(!0);try{await e.meta.saveItem(`view`,F.name,r),v.success(`Saved ${F.name}`),P(!1),I(null),await Y()}catch(e){v.error(`Save failed: ${e?.message??e}`)}finally{J(!1)}},$=t.length>0;return(0,b.jsxs)(`div`,{className:`flex flex-1 flex-col gap-4 p-4 md:p-6 overflow-auto`,children:[(0,b.jsxs)(de,{children:[(0,b.jsxs)(ae,{className:`flex flex-row items-start justify-between gap-4 space-y-0`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(ce,{className:`flex items-center gap-2`,children:[(0,b.jsx)(re,{className:`h-4 w-4`}),`Public Forms`]}),(0,b.jsx)(se,{children:`Forms anyone can fill out — no login required. Publish a form to get a shareable link; submissions land directly in the bound object.`})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsxs)(p,{variant:`default`,size:`sm`,onClick:()=>D(!0),disabled:S.length===0,title:S.length===0?`No non-public FormViews available`:`Publish a FormView`,children:[(0,b.jsx)(ie,{className:`h-3.5 w-3.5`}),(0,b.jsx)(`span`,{className:`ml-1.5`,children:`Publish form…`})]}),(0,b.jsxs)(p,{variant:`outline`,size:`sm`,onClick:Y,disabled:C,children:[(0,b.jsx)(o,{className:`h-3.5 w-3.5 ${C?`animate-spin`:``}`}),(0,b.jsx)(`span`,{className:`ml-1.5`,children:`Refresh`})]})]})]}),(0,b.jsxs)(ne,{children:[T&&(0,b.jsx)(`div`,{className:`mb-3 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:T}),!C&&!$&&(0,b.jsxs)(`div`,{className:`rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground`,children:[(0,b.jsx)(`p`,{className:`font-medium text-foreground`,children:`No public forms yet`}),(0,b.jsxs)(`p`,{className:`mt-1`,children:[`Click `,(0,b.jsx)(`strong`,{children:`Publish form…`}),` above to share an existing form, or build a new one in Views & Apps and mark it public.`]})]}),$&&(0,b.jsxs)(ue,{children:[(0,b.jsx)(pe,{children:(0,b.jsxs)(f,{children:[(0,b.jsx)(m,{children:`Name`}),(0,b.jsx)(m,{children:`Object`}),(0,b.jsx)(m,{children:`Slug`}),(0,b.jsx)(m,{children:`Public URL`}),(0,b.jsx)(m,{className:`text-right`,children:`Actions`})]})}),(0,b.jsx)(fe,{children:t.map(e=>{let t=X(e.slug);return(0,b.jsxs)(f,{children:[(0,b.jsx)(d,{children:(0,b.jsxs)(`div`,{className:`flex flex-col`,children:[(0,b.jsx)(`span`,{className:`font-medium`,children:e.label??e.name}),(0,b.jsx)(`code`,{className:`text-xs text-muted-foreground`,children:e.name})]})}),(0,b.jsx)(d,{children:e.object?(0,b.jsx)(i,{variant:`secondary`,children:e.object}):(0,b.jsx)(`span`,{className:`text-muted-foreground`,children:`—`})}),(0,b.jsx)(d,{children:(0,b.jsx)(`code`,{className:`text-xs`,children:e.slug})}),(0,b.jsx)(d,{children:(0,b.jsxs)(`a`,{href:t,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-xs text-primary underline-offset-2 hover:underline`,children:[t,(0,b.jsx)(te,{className:`h-3 w-3`})]})}),(0,b.jsx)(d,{className:`text-right`,children:(0,b.jsxs)(`div`,{className:`inline-flex gap-1`,children:[(0,b.jsx)(p,{variant:`ghost`,size:`sm`,title:`Copy URL`,onClick:()=>Q(`URL`,t),children:(0,b.jsx)(ee,{className:`h-3.5 w-3.5`})}),(0,b.jsx)(p,{variant:`ghost`,size:`sm`,title:`Copy <iframe> embed`,onClick:()=>Q(`iframe snippet`,Z(e.slug)),children:(0,b.jsx)(le,{className:`h-3.5 w-3.5`})}),(0,b.jsx)(p,{variant:`ghost`,size:`sm`,title:`Copy React snippet`,onClick:()=>Q(`React snippet`,be(e.slug)),children:(0,b.jsx)(oe,{className:`h-3.5 w-3.5`})}),(0,b.jsx)(p,{variant:`ghost`,size:`sm`,title:`Edit sharing & post-submit behavior`,onClick:()=>Se(e),children:(0,b.jsx)(me,{className:`h-3.5 w-3.5`})})]})})]},e.name)})})]})]})]}),(0,b.jsx)(c,{open:_e,onOpenChange:D,children:(0,b.jsxs)(l,{className:`sm:max-w-md`,children:[(0,b.jsxs)(u,{children:[(0,b.jsx)(s,{children:`Publish a FormView`}),(0,b.jsxs)(_,{children:[`Pick an existing FormView and turn it into a public form by enabling `,(0,b.jsx)(`code`,{className:`text-xs`,children:`sharing.allowAnonymous`}),` `,`and setting `,(0,b.jsx)(`code`,{className:`text-xs`,children:`publicLink`}),`.`]})]}),(0,b.jsxs)(`div`,{className:`space-y-3`,children:[(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`publish-view`,children:`FormView`}),(0,b.jsxs)(`select`,{id:`publish-view`,className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,value:O,onChange:e=>k(e.target.value),children:[(0,b.jsx)(`option`,{value:``,children:`— Select a FormView —`}),S.map(e=>(0,b.jsxs)(`option`,{value:e.name,children:[e.label??e.name,` (`,e.name,`) `,e.object?`· ${e.object}`:``]},e.name))]})]}),(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`publish-slug`,children:`URL slug`}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap`,children:`/console/f/`}),(0,b.jsx)(h,{id:`publish-slug`,placeholder:`contact-us`,value:A,onChange:e=>j(e.target.value)})]}),(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Lowercase letters, digits, dashes and underscores only.`})]})]}),(0,b.jsxs)(a,{children:[(0,b.jsx)(p,{variant:`ghost`,onClick:()=>D(!1),disabled:M,children:`Cancel`}),(0,b.jsx)(p,{onClick:xe,disabled:M||!O||!A,children:M?`Publishing…`:`Publish`})]})]})}),(0,b.jsx)(c,{open:ve,onOpenChange:P,children:(0,b.jsxs)(l,{className:`sm:max-w-lg`,children:[(0,b.jsxs)(u,{children:[(0,b.jsx)(s,{children:F?`Edit ${F.label??F.name}`:`Edit form`}),(0,b.jsx)(_,{children:`Configure the public URL and what happens after submit.`})]}),(0,b.jsxs)(`div`,{className:`space-y-3`,children:[(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`edit-slug`,children:`URL slug`}),(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap`,children:`/console/f/`}),(0,b.jsx)(h,{id:`edit-slug`,value:L,onChange:e=>R(e.target.value)})]})]}),(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`edit-behavior`,children:`After submit`}),(0,b.jsxs)(`select`,{id:`edit-behavior`,className:`flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm`,value:z,onChange:e=>B(e.target.value),children:[(0,b.jsx)(`option`,{value:`thank-you`,children:`Show a thank-you panel`}),(0,b.jsx)(`option`,{value:`redirect`,children:`Redirect to a URL`}),(0,b.jsx)(`option`,{value:`continue`,children:`Reset for another response`}),(0,b.jsx)(`option`,{value:`next-record`,children:`Advance to next record (internal queues)`})]})]}),z===`thank-you`&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`edit-tytitle`,children:`Title`}),(0,b.jsx)(h,{id:`edit-tytitle`,placeholder:`Thanks!`,value:V,onChange:e=>H(e.target.value)})]}),(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`edit-tymsg`,children:`Message`}),(0,b.jsx)(h,{id:`edit-tymsg`,placeholder:`Your submission has been received.`,value:U,onChange:e=>W(e.target.value)})]})]}),z===`redirect`&&(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsx)(g,{htmlFor:`edit-url`,children:`Redirect URL`}),(0,b.jsx)(h,{id:`edit-url`,type:`url`,placeholder:`https://example.com/thanks`,value:G,onChange:e=>K(e.target.value)})]})]}),(0,b.jsxs)(a,{children:[(0,b.jsx)(p,{variant:`ghost`,onClick:()=>P(!1),disabled:q,children:`Cancel`}),(0,b.jsx)(p,{onClick:Ce,disabled:q||!L,children:q?`Saving…`:`Save`})]})]})})]})}export{S as PublicFormsPage};
|