@objectstack/console 17.0.0-rc.2 → 17.0.0-rc.3
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/CHANGELOG.md +2 -0
- package/dist/assets/{AdapterProvider-CtRy19L4.js → AdapterProvider-Bur-uZKZ.js} +1 -1
- package/dist/assets/{ApiConsolePage-CGg1YX-S.js → ApiConsolePage-D0rZy0lx.js} +1 -1
- package/dist/assets/{AppDocsIndex-BhbMTMti.js → AppDocsIndex-CQo6tZPY.js} +1 -1
- package/dist/assets/{AppManagementPage-H6lFpmYT.js → AppManagementPage-jLhhl_WS.js} +1 -1
- package/dist/assets/{ApprovalsInboxPage-CbWL6D_v.js → ApprovalsInboxPage-COyyj1KQ.js} +1 -1
- package/dist/assets/{CreateViewDialog-Dt1MUhLX.js → CreateViewDialog-C6sZGaIB.js} +1 -1
- package/dist/assets/{DashboardView-OZHG8o0x.js → DashboardView-S5Fshq0v.js} +1 -1
- package/dist/assets/{FlowRunsPage-DTUvw7r2.js → FlowRunsPage-DGyj2PBP.js} +1 -1
- package/dist/assets/{InterfaceListPage-bZdYVg1W.js → InterfaceListPage-DcFmVgXg.js} +1 -1
- package/dist/assets/{MarketplacePackagePage-MX3QKebj.js → MarketplacePackagePage-DZkqNaao.js} +1 -1
- package/dist/assets/{MetadataProvider-87BSQkFa.js → MetadataProvider-D9fSVVZp.js} +1 -1
- package/dist/assets/{ObjectDataPage-JASSibf6.js → ObjectDataPage-BZ4pf0ji.js} +1 -1
- package/dist/assets/{PageView-DwZUXknG.js → PageView-B8qkF17f.js} +1 -1
- package/dist/assets/{PublicFormsPage-Cu_VttTH.js → PublicFormsPage-C3z0TH0k.js} +1 -1
- package/dist/assets/{RecordFormPage-qcCOHj3T.js → RecordFormPage-CyAjEE1O.js} +1 -1
- package/dist/assets/{ReportDefaultInspector-Byof8OYm.js → ReportDefaultInspector-BqgFtk2E.js} +1 -1
- package/dist/assets/{ReportView-D91loQjH.js → ReportView-CfQ-Z9TJ.js} +1 -1
- package/dist/assets/{SearchResultsPage-Dzm_0iUD.js → SearchResultsPage-Ct2q9Lrf.js} +1 -1
- package/dist/assets/{SystemHubPage-B3uHe11N.js → SystemHubPage-BSunYA-X.js} +1 -1
- package/dist/assets/{createDerive-DmbuzviK.js → createDerive-CGF05Hgy.js} +1 -1
- package/dist/assets/{data-adapter-sj_1S7TJ.js → data-adapter-rnhaIuyx.js} +2 -2
- package/dist/assets/{index-rkbFgKQu.js → index-U6sSlA28.js} +1 -1
- package/dist/assets/{metadata-admin-DA08xWlg.js → metadata-admin-Ci8bBNxq.js} +1 -1
- package/dist/assets/{runtime-metadata-persistence-BsgvioOn.js → runtime-metadata-persistence-BjYxldgR.js} +1 -1
- package/dist/assets/{src-D0ueU0ix.js → src-CSrGzA_t.js} +2 -2
- package/dist/assets/{src-Chkzn0bG.js → src-DzTCerTm.js} +1 -1
- package/dist/assets/{use-book-data-CAZ23DZb.js → use-book-data-D8LHn21q.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{f as t,h as n,r,y as i}from"./vendor-react-DpRf6e0g.js";import{_ as a}from"./infrastructure-PXm1h5tB.js";import{N as o,P as s,X as c,et as l,fn as u}from"./framework-UESyszCj.js";import{ct as d,dt as f,it as p,nl as m,st as h,xs as g}from"./ui-components-BbC0qTrK.js";import"./MetadataProvider-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{f as t,h as n,r,y as i}from"./vendor-react-DpRf6e0g.js";import{_ as a}from"./infrastructure-PXm1h5tB.js";import{N as o,P as s,X as c,et as l,fn as u}from"./framework-UESyszCj.js";import{ct as d,dt as f,it as p,nl as m,st as h,xs as g}from"./ui-components-BbC0qTrK.js";import"./MetadataProvider-D9fSVVZp.js";import{t as _}from"./RecordDetailView-CP1b5rdr.js";import{d as ee}from"./plugins-views-CJKuyDvq.js";var v=e(i(),1),y=[`single`,`group`,`isolated`];function b(){let{getAuthConfig:e}=a(),[t,n]=(0,v.useState)(void 0);return(0,v.useEffect)(()=>{let t=!1;return e?.().then(e=>{if(t)return;let r=e?.features?.tenancyPosture;r&&y.includes(r)&&n(r)}).catch(()=>{}),()=>{t=!0}},[e]),t}var x=`uf_`;function S(e){let t={};return e.forEach((e,n)=>{if(n.startsWith(x)&&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 C(e,t){let n=new URLSearchParams(e);for(let[e,r]of Object.entries(t)){let t=x+e;r&&r.length>0?n.set(t,r.map(e=>encodeURIComponent(String(e))).join(`,`)):n.delete(t)}return n}var w=r();function T(e){return Array.isArray(e?.columns)&&e.columns.length>0}function E(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(T)??r[0]}function D(e,t){let n=n=>t?.orgAttribution&&e?.fields?.organization_id&&!n.includes(`organization_id`)?[...n,`organization_id`]:n,r=e?.highlightFields;if(Array.isArray(r)&&r.length>0)return n(r.filter(t=>e.fields?.[t]));let i=e?.fields;return i&&typeof i==`object`?n(Object.entries(i).filter(([e,t])=>t&&!t.hidden&&!u(e,t)).map(([e])=>e).slice(0,6)):[]}function O(e,t){let n=e?.fields;if(!(!n||typeof n!=`object`))return Object.entries(n).find(([e,n])=>n&&!n.hidden&&!u(e,n)&&t(e,n))?.[0]}var k=new Set([`select`,`multiselect`,`radio`,`enum`,`boolean`]),A=new Set([`date`,`datetime`,`time`]),j=new Set([`image`,`file`,`attachment`,`avatar`,`photo`]);function M(e){let t=O(e,(e,t)=>k.has(t.type))??O(e,e=>/status|stage|state|priority|category|kind/i.test(e));return t?{groupByField:t}:void 0}function N(e){return O(e,(e,t)=>A.has(t.type))??O(e,e=>/date|due|start|end|deadline|schedule/i.test(e))}function P(e){let t=N(e);return t?{startDateField:t}:void 0}function F(e){let t=O(e,(e,t)=>j.has(t.type));return t?{coverField:t}:void 0}var I=new Set([`location`,`geo`,`geolocation`,`geopoint`,`point`]);function L(e){let t=O(e,(e,t)=>A.has(t.type)&&/start|begin|kickoff/i.test(e))??O(e,(e,t)=>A.has(t.type));if(!t)return;let n=O(e,(e,n)=>A.has(n.type)&&e!==t&&/end|due|finish|deadline|close/i.test(e))??O(e,(e,n)=>A.has(n.type)&&e!==t);if(!n)return;let r=O(e,(e,t)=>(t.type===`number`||t.type===`percent`)&&/progress|percent|complete/i.test(e));return{startDateField:t,endDateField:n,...r?{progressField:r}:{}}}function R(e){let t=O(e,(e,t)=>I.has(t.type))??O(e,e=>/location|address|geo|coords?|place|venue/i.test(e));return t?{locationField:t}:void 0}function z({page:e,className:r,onConfigChange:i,reserveEditAffordance:a}){let{t:u}=m(),{objects:y}=s(),x=o(),O=t(),[k,A]=n(),j=b()===`group`,[N]=v.useState(()=>S(new URLSearchParams(window.location.search))),I=v.useCallback(e=>{A(t=>C(t,e),{replace:!0})},[A]),z=e?.interfaceConfig||{},B=v.useMemo(()=>(y||[]).find(e=>e.name===z.source),[y,z.source]),V=v.useMemo(()=>E(B,z.sourceView),[B,z.sourceView]),H=z.recordAction===`page`||z.recordAction===`modal`||z.recordAction===`none`?z.recordAction:`drawer`,U=v.useCallback(e=>`/apps/${window.location.pathname.split(`/`)[2]||``}/${z.source}/record/${encodeURIComponent(String(e))}`,[z.source]),W=c({navigation:{mode:H===`none`?`none`:H},objectName:z.source,onNavigate:e=>O(U(e))}),G=k.get(`recordId`),te=v.useCallback((e,t)=>{if(H===`none`)return;let n=e?.id??e?._id;if(t&&(t.metaKey||t.ctrlKey||t.button===1)&&n!=null){window.open(U(n),`_blank`);return}if((H===`drawer`||H===`modal`)&&n!=null){A(e=>{let t=new URLSearchParams(e);return t.set(`recordId`,String(n)),t});return}W.handleClick(e,t)},[H,U,W,A]),ne=v.useCallback(()=>{A(e=>{let t=new URLSearchParams(e);return t.delete(`recordId`),t})},[A]);v.useEffect(()=>{G&&!W.isOpen?W.open({id:G}):!G&&W.isOpen&&W.close()},[G]);let K=B?.name,q=!!V&&!T(V),J=V?.name??(z.sourceView?`${z.source}.${z.sourceView}`:void 0),[Y,X]=v.useState(null);v.useEffect(()=>{let e=!1;if(X(null),!(!K||!z.source||!q||!J))return(async()=>{try{let t=x,n=null;typeof t?.listViewOverrides==`function`&&(n=(await t.listViewOverrides(z.source))?.[J]??null),!T(n)&&typeof t?.getView==`function`&&(n=await t.getView(z.source,J)),!e&&n&&typeof n==`object`&&X(n)}catch{}})(),()=>{e=!0}},[K,z.source,z.sourceView,q,J,x]);let Z=v.useMemo(()=>Y?{...V,...Y}:V,[V,Y]),re=JSON.stringify(Z??null),Q=v.useMemo(()=>{if(!B)return;let e=Z||{},t=z.appearance??e.appearance,n=t?.allowedVisualizations||[],r=new Set(n),i=z.userActions||{},a=e.kanban??(r.has(`kanban`)?M(B):void 0),o=e.calendar??(r.has(`calendar`)?P(B):void 0),s=e.timeline??(r.has(`timeline`)?P(B):void 0),c=e.gallery??(r.has(`gallery`)?F(B):void 0),l=e.gantt??(r.has(`gantt`)?L(B):void 0),u=e.options?.map??(r.has(`map`)?R(B):void 0),d=[...Array.isArray(e.filter)?e.filter:[],...Array.isArray(z.filterBy)?z.filterBy:[]],f=T(z)?z.columns:T(e)?e.columns:D(B,{orgAttribution:j}),p=Array.isArray(z.sort)&&z.sort.length?z.sort:e.sort;return{type:`list-view`,objectName:B.name,viewType:n[0]??e.type??`grid`,columns:f,...d.length?{filter: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:z.userFilters??e.userFilters,appearance:t,showViewSwitcher:n.length>1,showRecordCount:z.showRecordCount,addRecord:z.addRecord,userActions:{search:i.search!==!1,sort:i.sort!==!1,filter:i.filter===!0,rowHeight:i.rowHeight===!0,group:i.group===!0,hideFields:i.hideFields===!0,rowColor:i.rowColor===!0},allowExport:!1,inlineEdit:i.editInline===!0}},[K,re,z,j]);if(!B||!Q)return(0,w.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,w.jsxs)(h,{children:[(0,w.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,w.jsx)(g,{className:`h-6 w-6 text-muted-foreground`})}),(0,w.jsx)(f,{children:u(`empty.objectNotFound`,{defaultValue:`Source object not found`})}),(0,w.jsx)(d,{children:u(`empty.interfacePageSourceMissing`,{defaultValue:`This interface page references "{{name}}", which is not available.`,name:z.source||`?`})})]})});let $=Array.isArray(z.buttons)&&z.buttons.length?z.buttons.map(e=>(B.actions||[]).find(t=>t?.name===e)).filter(Boolean).map(e=>({...e,locations:[`list_toolbar`]})):[];return(0,w.jsxs)(`div`,{className:r??`h-full flex flex-col`,"data-testid":`interface-list-page`,children:[(0,w.jsxs)(`div`,{className:`pl-4 pt-4 pb-2 shrink-0 flex items-start justify-between gap-3 ${a?`pr-12`:`pr-4`}`,children:[(0,w.jsxs)(`div`,{className:`min-w-0`,children:[(0,w.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,w.jsx)(`p`,{className:`text-sm text-muted-foreground mt-0.5`,children:e.description})]}),$.length>0&&(0,w.jsx)(`div`,{className:`shrink-0`,"data-testid":`interface-page-buttons`,children:(0,w.jsx)(l,{schema:{type:`action:bar`,location:`list_toolbar`,actions:$,size:`sm`,variant:`outline`}})})]}),(0,w.jsx)(`div`,{className:`flex-1 min-h-0 overflow-auto`,children:(0,w.jsx)(ee,{schema:Q,dataSource:x,userFilterSelections:N,onUserFilterSelectionsChange:I,onSortChange:i?e=>i({sort:e}):void 0,onColumnStateChange:i?e=>{e?.order?.length&&i({columns:e.order})}:void 0,onRowClick:H===`none`?void 0:te})}),W.isOverlay&&(0,w.jsx)(p,{...W,setIsOpen:e=>{e||ne()},title:typeof e.label==`string`?e.label:z.source||`Record`,children:e=>(0,w.jsx)(_,{objectNameOverride:z.source,recordIdOverride:String(e?.id??e?._id??G??``),embedded:!0,dataSource:x,objects:y,onEdit:()=>{}})})]})}export{M as a,b as c,F as i,P as n,C as o,D as r,S as s,z as t};
|
package/dist/assets/{MarketplacePackagePage-MX3QKebj.js → MarketplacePackagePage-DZkqNaao.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{f as n,m as r,r as i,y as a}from"./vendor-react-DpRf6e0g.js";import{b as o,g as ee}from"./infrastructure-PXm1h5tB.js";import{P as s,rn as c}from"./framework-UESyszCj.js";import{An as te,Cr as l,Gc as u,Hi as d,Ia as ne,Ko as re,Nn as f,Os as p,Sc as m,Ui as ie,Vi as ae,Xr as h,Xs as g,Ys as oe,_n as se,_r as ce,_s as le,an as _,br as ue,cr as de,di as fe,dr as pe,fr as me,gn as he,gr as ge,hn as _e,jn as ve,kn as v,lr as ye,mn as be,ms as xe,nl as Se,oo as y,pn as Ce,ps as we,qs as b,sr as Te,ur as Ee,vr as De,xr as Oe,xs as ke,za as x,zc as Ae,zn as je,zr as S}from"./ui-components-BbC0qTrK.js";import{r as C}from"./vendor-ui-utils-CnzHPXVC.js";import"./MetadataProvider-
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{f as n,m as r,r as i,y as a}from"./vendor-react-DpRf6e0g.js";import{b as o,g as ee}from"./infrastructure-PXm1h5tB.js";import{P as s,rn as c}from"./framework-UESyszCj.js";import{An as te,Cr as l,Gc as u,Hi as d,Ia as ne,Ko as re,Nn as f,Os as p,Sc as m,Ui as ie,Vi as ae,Xr as h,Xs as g,Ys as oe,_n as se,_r as ce,_s as le,an as _,br as ue,cr as de,di as fe,dr as pe,fr as me,gn as he,gr as ge,hn as _e,jn as ve,kn as v,lr as ye,mn as be,ms as xe,nl as Se,oo as y,pn as Ce,ps as we,qs as b,sr as Te,ur as Ee,vr as De,xr as Oe,xs as ke,za as x,zc as Ae,zn as je,zr as S}from"./ui-components-BbC0qTrK.js";import{r as C}from"./vendor-ui-utils-CnzHPXVC.js";import"./MetadataProvider-D9fSVVZp.js";import{t as Me}from"./assistantBus-CpACs9I7.js";import{D as w,_ as Ne,a as Pe,c as Fe,d as Ie,g as Le,h as Re,i as T,l as ze,m as Be,n as Ve,o as He,s as Ue,t as We,v as Ge}from"./MarketplaceAccessDenied-DDTfnIA8.js";import{n as Ke,t as qe}from"./usePackageL10n-BgDMgWzW.js";var E=e(a(),1),D=i();function Je(e){let t=e.replace(/\r\n/g,`
|
|
2
2
|
`).split(`
|
|
3
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
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 O(e){let t=[],n=e,r=0,i=[{re:/`([^`]+)`/,render:e=>(0,D.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,D.jsx)(`strong`,{className:`font-semibold text-foreground`,children:e[1]},`k${r++}`)},{re:/\*([^*]+)\*/,render:e=>(0,D.jsx)(`em`,{children:e[1]},`k${r++}`)},{re:/\[([^\]]+)\]\(([^)]+)\)/,render:e=>(0,D.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,D.jsx)(D.Fragment,{children:t.map((e,t)=>(0,D.jsx)(E.Fragment,{children:e},t))})}function Ye({source:e,className:t}){let n=Je(e);return(0,D.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,D.jsx)(`h2`,{className:`mt-2 text-xl font-bold tracking-tight`,children:O(e.text??``)},t);case`h2`:return(0,D.jsx)(`h3`,{className:`mt-3 text-base font-semibold tracking-tight`,children:O(e.text??``)},t);case`h3`:return(0,D.jsx)(`h4`,{className:`mt-2 text-sm font-semibold tracking-tight text-foreground/80`,children:O(e.text??``)},t);case`p`:return(0,D.jsx)(`p`,{children:O(e.text??``)},t);case`ul`:return(0,D.jsx)(`ul`,{className:`ml-1 flex list-none flex-col gap-1.5`,children:(e.items??[]).map((e,t)=>(0,D.jsxs)(`li`,{className:`flex gap-2`,children:[(0,D.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,D.jsx)(`span`,{children:O(e)})]},t))},t);case`ol`:return(0,D.jsx)(`ol`,{className:`ml-5 flex list-decimal flex-col gap-1.5 marker:text-muted-foreground`,children:(e.items??[]).map((e,t)=>(0,D.jsx)(`li`,{className:`pl-1`,children:O(e)},t))},t);case`code`:return(0,D.jsx)(`pre`,{className:`overflow-x-auto rounded-lg border bg-muted/40 p-3 text-xs leading-relaxed`,children:(0,D.jsx)(`code`,{className:`font-mono`,children:e.text})},t)}return null})})}var Xe={node:`In-process · full trust`,sandbox:`Sandboxed`,worker:`Out-of-process`};function k({icon:e,label:t,items:n}){return!n||n.length===0?null:(0,D.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,D.jsx)(e,{className:`h-3.5 w-3.5 mt-0.5 text-muted-foreground shrink-0`,"aria-hidden":`true`}),(0,D.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,D.jsx)(`div`,{className:`text-xs font-medium`,children:t}),(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-0.5`,children:n.map(e=>(0,D.jsx)(`code`,{className:`font-mono text-[11px] px-1 py-0.5 rounded bg-muted break-all`,children:e},e))})]})]})}function Ze({version:e}){let{t}=Se();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,D.jsxs)(`div`,{className:`rounded-md border border-amber-500/30 bg-amber-500/5 p-3 space-y-3 text-sm`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 font-medium`,children:[(0,D.jsx)(p,{className:`h-4 w-4 text-amber-600 shrink-0`,"aria-hidden":`true`}),t(`marketplace.disclosure.containsCode`,{defaultValue:`This package contains code`})]}),(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[e.runtime&&(0,D.jsx)(l,{variant:`outline`,children:t(`marketplace.disclosure.runtime.${e.runtime}`,{defaultValue:Xe[e.runtime]??e.runtime})}),e.platform_verified?(0,D.jsxs)(l,{variant:`outline`,className:`gap-1 border-green-500/40 text-green-700 dark:text-green-400`,children:[(0,D.jsx)(d,{className:`h-3 w-3`,"aria-hidden":`true`}),t(`marketplace.disclosure.reviewed`,{defaultValue:`Reviewed & approved`})]}):(0,D.jsxs)(l,{variant:`outline`,className:`gap-1 border-amber-500/40 text-amber-700 dark:text-amber-400`,children:[(0,D.jsx)(ie,{className:`h-3 w-3`,"aria-hidden":`true`}),t(`marketplace.disclosure.unreviewed`,{defaultValue:`Not yet reviewed`})]}),e.signed&&(0,D.jsxs)(l,{variant:`outline`,className:`gap-1`,children:[(0,D.jsx)(b,{className:`h-3 w-3`,"aria-hidden":`true`}),t(`marketplace.disclosure.signed`,{defaultValue:`Signed`})]})]}),r?(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t(`marketplace.disclosure.grantsIntro`,{defaultValue:`On install, this package will be granted:`})}),(0,D.jsx)(k,{icon:m,label:t(`marketplace.disclosure.services`,{defaultValue:`Platform services`}),items:n.services??void 0}),(0,D.jsx)(k,{icon:h,label:t(`marketplace.disclosure.hooks`,{defaultValue:`Lifecycle hooks`}),items:n.hooks??void 0}),(0,D.jsx)(k,{icon:x,label:t(`marketplace.disclosure.network`,{defaultValue:`Network access`}),items:n.network??void 0}),(0,D.jsx)(k,{icon:re,label:t(`marketplace.disclosure.fs`,{defaultValue:`Filesystem access`}),items:n.fs??void 0})]}):(0,D.jsx)(`div`,{className:`text-xs text-muted-foreground`,children:t(`marketplace.disclosure.noPermissions`,{defaultValue:`Requests no special permissions.`})})]})}var A=`${``.replace(/\/$/,``)}/api/v1/security/suggested-bindings`;function j(e={}){let t={Accept:`application/json`,...e},n=o.get();return n?{...t,Authorization:`Bearer ${n}`}:t}async function M(e){let t=null;try{t=await e.json()}catch{}if(!e.ok){let n=t?.error?.code??`HTTP_${e.status}`,r=t?.error?.message??t?.error??e.statusText,i=Error(typeof r==`string`?r:String(n));throw i.code=n,i.status=e.status,i}return t?.data??t}async function N(e={}){let t=new URLSearchParams;e.status&&t.set(`status`,e.status),e.packageId&&t.set(`packageId`,e.packageId);let n=t.toString(),r=await M(await fetch(`${A}${n?`?${n}`:``}`,{credentials:`include`,headers:j()}));return Array.isArray(r?.suggestions)?r.suggestions:[]}async function P(e){return(await M(await fetch(`${A}/${encodeURIComponent(e)}/confirm`,{method:`POST`,credentials:`include`,headers:j({"Content-Type":`application/json`})})))?.suggestion}async function F(e){return(await M(await fetch(`${A}/${encodeURIComponent(e)}/dismiss`,{method:`POST`,credentials:`include`,headers:j({"Content-Type":`application/json`})})))?.suggestion}function Qe({packageId:e,strings:t,className:n,onResolved:r}){let[i,a]=(0,E.useState)([]),[o,ee]=(0,E.useState)(null),s=(0,E.useCallback)(()=>{let t=!1;return N({status:`pending`,...e?{packageId:e}:{}}).then(e=>{t||a(e)}).catch(()=>{}),()=>{t=!0}},[e]);(0,E.useEffect)(()=>s(),[s]);let c=async(e,n)=>{ee(e.id);try{let i=n===`confirm`?await P(e.id):await F(e.id);a(t=>t.filter(t=>t.id!==e.id)),C.success(n===`confirm`?t.confirmedToast(e):t.dismissedToast(e)),r?.(i??e)}catch(e){C.error(e?.message??String(e))}finally{ee(null)}};return i.length===0?null:(0,D.jsx)(`div`,{"data-testid":`suggested-bindings-panel`,className:u(`rounded-lg border border-amber-300/60 dark:border-amber-700/50 bg-amber-50 dark:bg-amber-950/30 px-3 py-2 space-y-2`,n),children:i.map(e=>(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(ae,{className:`h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400`}),(0,D.jsx)(`p`,{className:`flex-1 min-w-0 text-sm text-amber-900 dark:text-amber-200`,children:t.describe(e)}),(0,D.jsx)(S,{size:`sm`,disabled:o===e.id,onClick:()=>c(e,`confirm`),"data-testid":`suggested-binding-confirm-${e.permission_set_name}`,children:o===e.id?t.confirming:t.confirm}),(0,D.jsx)(S,{size:`sm`,variant:`ghost`,disabled:o===e.id,onClick:()=>c(e,`dismiss`),"data-testid":`suggested-binding-dismiss-${e.permission_set_name}`,children:t.dismiss})]},e.id))})}var $e=t({MarketplacePackagePage:()=>et});function et(){let e=n(),{packageId:t,appName:i}=r(),a=ee(),{t:o,language:u}=Se(),d={describe:e=>o(e.anchor===`guest`?`marketplace.suggestedBindings.promptGuest`:`marketplace.suggestedBindings.promptEveryone`,{set:e.permission_set_name}),confirm:o(`marketplace.suggestedBindings.confirm`),confirming:o(`marketplace.suggestedBindings.confirming`),dismiss:o(`marketplace.suggestedBindings.dismiss`),confirmedToast:e=>o(`marketplace.suggestedBindings.confirmedToast`,{set:e.permission_set_name,anchor:e.anchor}),dismissedToast:e=>o(`marketplace.suggestedBindings.dismissedToast`,{set:e.permission_set_name})},re=i?`/apps/${i}`:``,{refresh:p}=s(),[m,ie]=(0,E.useState)(null),[ae,h]=(0,E.useState)(!0),[x,C]=(0,E.useState)(null),[Je,O]=(0,E.useState)(!1),[Xe,k]=(0,E.useState)([]),[A,j]=(0,E.useState)(!1),[M,N]=(0,E.useState)(null),[P,F]=(0,E.useState)(``),[$e,et]=(0,E.useState)({}),[tt,nt]=(0,E.useState)(!1),[rt,it]=(0,E.useState)(!1),[I,at]=(0,E.useState)(!1),[L,R]=(0,E.useState)(null),[z,ot]=(0,E.useState)(null),[B,V]=(0,E.useState)(null),[H,U]=(0,E.useState)(null),[W,G]=(0,E.useState)(null),[st,ct]=(0,E.useState)([]),[lt,K]=(0,E.useState)(!1),[q,J]=(0,E.useState)(null);(0,E.useEffect)(()=>{if(!w().features.installLocal)return;let e=!1;return(async()=>{let t=await Ie();e||ct(t)})(),()=>{e=!0}},[t,q]),(0,E.useEffect)(()=>{if(!t)return;let e=w().defaultEnvironmentId??``,n=!1;return(async()=>{let r=await T(t,e);n||!r||(V(r),ot(r.version))})(),()=>{n=!0}},[t]),(0,E.useEffect)(()=>{let e=!1;return(async()=>{if(t){h(!0),C(null);try{let n=await Pe(t);e||ie(n)}catch(t){e||C(t?.message??String(t))}finally{e||h(!1)}}})(),()=>{e=!0}},[t]);let ut=async()=>{O(!0),R(null),N(null);let e=w().defaultEnvironmentId;if(e){j(!1),F(e),k([]);return}j(!0);try{let[e,n]=await Promise.all([Fe(),ze()]),r=e.filter(e=>{let t=e.organization_id;return t?n.has(String(t)):!1});k(r),et({});let i=t;i&&Promise.all(r.map(async e=>{try{let t=await T(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]);et(t)}),e.length>0&&r.length===0?N(o(`marketplace.install.noPermission`)):r.length===1&&F(r[0].id)}catch(e){let t=e?.status;N(t===401||t===403?o(`marketplace.install.signInFirst`):e?.message??String(e))}finally{j(!1)}},dt=async()=>{if(!(!t||!P)){at(!0),R(null);try{let e=(await Ue({packageId:t,environmentId:P,seedSampleData:tt}))?.installation?.version??m?.package?.latest_version?.version??m?.versions?.[0]?.version??``;ot(e||`installed`);try{let e=w().defaultEnvironmentId||P;if(e){let n=await T(t,e);n&&V(n)}}catch{}let n=w().defaultEnvironmentId;if(!n||n===P)try{if(typeof sessionStorage<`u`)for(let e of Object.keys(sessionStorage))e.startsWith(`objectui:metadata:`)&&sessionStorage.removeItem(e);await p()}catch{}R({ok:!0,message:o(`marketplace.install.success`)}),Me()}catch(e){R({ok:!1,message:e?.message??String(e)})}finally{at(!1)}}},ft=async()=>{if(t){K(!0),J(null);try{let e=await He({packageId:t});try{await p(`app`)}catch{}J({ok:!0,message:o(`marketplace.install.localSuccess`,{version:e.version,name:m?.package?qe(m.package,u).displayName:e.manifestId})}),Me()}catch(e){e?.code;let t=e?.message??String(e);c(e,`MANIFEST_CONFLICT`)?t=o(`marketplace.install.localManifestConflict`,{message:t}):c(e,`UNAUTHENTICATED`)?t=o(`marketplace.install.localUnauthorized`):c(e,`MARKETPLACE_UNAVAILABLE`)&&(t=o(`marketplace.install.localMarketplaceUnavailable`)),J({ok:!1,message:t})}finally{K(!1)}}},pt=async()=>{if(Q&&confirm(o(`marketplace.uninstall.confirm`,{manifestId:Q.manifestId,version:Q.version}))){K(!0),J(null);try{await Ge(Q.manifestId);try{await p(`app`)}catch{}J({ok:!0,message:o(`marketplace.uninstall.successInDetail`,{manifestId:Q.manifestId})})}catch(e){J({ok:!1,message:e?.message??String(e)})}finally{K(!1)}}},mt=async()=>{if(B){U(`reseed`),G(null);try{let e=await Ne(B.installationId);e.ok?(V({...B,withSampleData:!0}),G({ok:!0,text:o(`marketplace.detail.reseedQueued`)||`Sample data will be re-seeded on next environment access.`})):G({ok:!1,text:e.error||`Re-seed failed`})}finally{U(null)}}},ht=async()=>{if(B&&confirm(o(`marketplace.detail.purgeConfirm`)||`Delete all sample records seeded by this package? User-added records will NOT be touched.`)){U(`purge`),G(null);try{let e=await Re(B.installationId);if(e.ok){V({...B,withSampleData:!1});let t=e.deleted??0;G({ok:!0,text:t>0?o(`marketplace.detail.purgeSuccess`,{count:t})||`Removed ${t} sample record(s).`:o(`marketplace.detail.purgeNoData`)||`No sample records found to purge.`})}else G({ok:!1,text:e.error||`Purge failed`})}finally{U(null)}}},gt=async()=>{if(Q){U(`reseed`),G(null);try{let e=await Le(Q.manifestId);ct(e=>e.map(e=>e.manifestId===Q.manifestId?{...e,withSampleData:!0}:e));let t=e.inserted??0,n=e.updated??0,r=e.errors??0,i=o(`marketplace.detail.reseedLocalSuccess`,{inserted:t,updated:n})||`Sample data re-seeded (inserted=${t}, updated=${n}).`;G(r>0?{ok:!1,text:`${i} ${o(`marketplace.detail.reseedPartialErrors`,{count:r})||`(${r} record(s) failed to write)`}`}:{ok:!0,text:i})}catch(e){G({ok:!1,text:e?.message||`Re-seed failed`})}finally{U(null)}}},_t=async()=>{if(Q&&confirm(o(`marketplace.detail.purgeConfirm`)||`Delete all sample records seeded by this package? User-added records will NOT be touched.`)){U(`purge`),G(null);try{let e=await Be(Q.manifestId);ct(e=>e.map(e=>e.manifestId===Q.manifestId?{...e,withSampleData:!1}:e));let t=e.deleted??0;G({ok:!0,text:t>0?o(`marketplace.detail.purgeSuccess`,{count:t})||`Removed ${t} sample record(s).`:o(`marketplace.detail.purgeNoData`)||`No sample records found to purge.`})}catch(e){G({ok:!1,text:e?.message||`Purge failed`})}finally{U(null)}}};if(ae)return(0,D.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl flex flex-col gap-6 p-4 sm:p-6`,children:[(0,D.jsx)(_,{className:`h-8 w-32`}),(0,D.jsx)(_,{className:`h-16 w-full`}),(0,D.jsx)(_,{className:`h-64 w-full`})]});if(x||!m)return(0,D.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl flex flex-col gap-6 p-4 sm:p-6`,children:[(0,D.jsxs)(S,{variant:`ghost`,size:`sm`,onClick:()=>e(`${re}/system/marketplace`),children:[(0,D.jsx)(Ae,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),o(`marketplace.back`)]}),(0,D.jsxs)(`div`,{className:`flex items-start gap-3 rounded-md border border-destructive/30 bg-destructive/5 p-4 text-sm`,children:[(0,D.jsx)(g,{className:`h-4 w-4 mt-0.5 text-destructive`,"aria-hidden":`true`}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`font-medium text-destructive`,children:o(`marketplace.load.packageFailed`)}),(0,D.jsx)(`div`,{className:`text-muted-foreground mt-1`,children:x??o(`marketplace.load.notFound`)})]})]})]});let Y=m.package,X=qe(Y,u),Z=Y.latest_version?.version??m.versions[0]?.version??null,Q=st.find(e=>e.manifestId===Y.manifest_id)??null,vt=!!Y.latest_version?.contains_code,$=!!z&&z!==`installed`&&!!Z&&z!==Z,yt=w().features.installLocal,bt=!Z||lt||I||!yt&&!!z&&!$,xt=yt?{label:o(lt?`marketplace.action.working`:Q?`marketplace.action.reinstall`:`marketplace.action.install`),onClick:ft}:{label:I?o(`marketplace.action.installing`):z?$?o(`marketplace.action.updateTo`,{defaultValue:`Update`,version:Z}):o(`marketplace.action.installed`,{defaultValue:`Installed`}):o(`marketplace.action.installToCloud`),onClick:ut},St=Y.category?o(`marketplace.category.${Y.category}`,{defaultValue:Y.category}):null;return a?(0,D.jsxs)(`div`,{className:`mx-auto w-full max-w-6xl flex flex-col gap-6 p-4 sm:p-6`,children:[(0,D.jsxs)(S,{variant:`ghost`,size:`sm`,className:`self-start -ml-2 text-muted-foreground hover:text-foreground`,onClick:()=>e(`${re}/system/marketplace`),children:[(0,D.jsx)(Ae,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),o(`marketplace.back`)]}),(0,D.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,D.jsx)(Ke,{iconUrl:Y.icon_url,displayName:X.displayName,manifestId:Y.manifest_id,className:`h-20 w-20 rounded-2xl shadow-sm ring-1 ring-border shrink-0`,initialClassName:`text-3xl font-bold`}),(0,D.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,D.jsx)(`h1`,{className:`text-2xl sm:text-3xl font-bold tracking-tight truncate`,children:X.displayName||Y.manifest_id}),Y.homepage_url&&(0,D.jsxs)(`a`,{href:Y.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:o(`marketplace.detail.homepage`),children:[(0,D.jsx)(we,{className:`h-3.5 w-3.5`,"aria-hidden":`true`}),(0,D.jsx)(`span`,{className:`hidden sm:inline`,children:o(`marketplace.detail.homepage`)})]})]}),(0,D.jsxs)(`div`,{className:`text-sm text-muted-foreground mt-2 flex flex-wrap items-center gap-1.5`,children:[(0,D.jsx)(`code`,{className:`font-mono text-xs px-1.5 py-0.5 rounded bg-muted`,children:Y.manifest_id}),Z&&(0,D.jsx)(l,{variant:`outline`,children:o(`marketplace.versionBadge`,{version:Z})}),Y.publisher&&Y.publisher!==`private`&&(0,D.jsx)(l,{variant:Y.publisher===`objectstack`?`default`:`secondary`,children:Y.publisher}),St&&(0,D.jsx)(l,{variant:`outline`,children:St}),Y.license&&(0,D.jsx)(l,{variant:`outline`,className:`font-normal`,children:Y.license}),Q&&(0,D.jsxs)(l,{variant:`default`,className:`bg-green-600 hover:bg-green-600 gap-1`,children:[(0,D.jsx)(b,{className:`h-3 w-3`,"aria-hidden":`true`}),o(`marketplace.detail.installedV`,{version:Q.version})]}),!Q&&z&&(0,D.jsxs)(l,{variant:`default`,className:`bg-green-600 hover:bg-green-600 gap-1`,children:[(0,D.jsx)(b,{className:`h-3 w-3`,"aria-hidden":`true`}),o(`marketplace.detail.installedV`,{version:z})]}),$&&(0,D.jsxs)(l,{variant:`default`,className:`bg-amber-500 hover:bg-amber-500 gap-1`,children:[(0,D.jsx)(oe,{className:`h-3 w-3`,"aria-hidden":`true`}),o(`marketplace.detail.updateAvailable`,{defaultValue:`Update available`}),` → v`,Z]})]}),X.description&&(0,D.jsx)(`p`,{className:`text-sm sm:text-base text-foreground/80 mt-3 max-w-2xl leading-relaxed`,children:X.description})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0 self-start`,children:[(0,D.jsxs)(S,{onClick:xt.onClick,disabled:bt,size:`lg`,className:`min-w-[8rem]`,children:[(0,D.jsx)(le,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),xt.label]}),Q&&(0,D.jsxs)(te,{children:[(0,D.jsx)(je,{asChild:!0,children:(0,D.jsx)(S,{variant:`outline`,size:`lg`,className:`px-2.5`,"aria-label":o(`marketplace.detail.moreOptions`),children:(0,D.jsx)(xe,{className:`h-4 w-4`,"aria-hidden":`true`})})}),(0,D.jsxs)(ve,{align:`end`,className:`w-56`,children:[(0,D.jsxs)(f,{onSelect:gt,disabled:H!==null,children:[H===`reseed`?(0,D.jsx)(y,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,D.jsx)(ke,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),Q.withSampleData?o(`marketplace.detail.reseedAgain`)||`Re-seed sample data`:o(`marketplace.detail.addSampleData`)||`Add sample data`]}),(0,D.jsxs)(f,{onSelect:_t,disabled:H!==null||!Q.withSampleData,className:`text-destructive focus:text-destructive`,children:[H===`purge`?(0,D.jsx)(y,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,D.jsx)(fe,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),o(`marketplace.detail.purgeSampleData`)||`Purge sample data`]}),(0,D.jsxs)(f,{onSelect:pt,disabled:lt,className:`text-destructive focus:text-destructive`,children:[(0,D.jsx)(fe,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),o(`marketplace.detail.uninstallFromRuntime`)]})]})]}),!Q&&B&&!w().cloudUrl&&(0,D.jsxs)(te,{children:[(0,D.jsx)(je,{asChild:!0,children:(0,D.jsx)(S,{variant:`outline`,size:`lg`,className:`px-2.5`,"aria-label":o(`marketplace.detail.moreOptions`)||`More options`,children:(0,D.jsx)(xe,{className:`h-4 w-4`,"aria-hidden":`true`})})}),(0,D.jsxs)(ve,{align:`end`,className:`w-56`,children:[(0,D.jsxs)(f,{onSelect:mt,disabled:H!==null,children:[H===`reseed`?(0,D.jsx)(y,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,D.jsx)(ke,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),B.withSampleData?o(`marketplace.detail.reseedAgain`)||`Re-seed sample data`:o(`marketplace.detail.addSampleData`)||`Add sample data`]}),(0,D.jsxs)(f,{onSelect:ht,disabled:H!==null||!B.withSampleData,className:`text-destructive focus:text-destructive`,children:[H===`purge`?(0,D.jsx)(y,{className:`h-4 w-4 mr-2 animate-spin`,"aria-hidden":`true`}):(0,D.jsx)(fe,{className:`h-4 w-4 mr-2`,"aria-hidden":`true`}),o(`marketplace.detail.purgeSampleData`)||`Purge sample data`]})]})]})]})]}),W&&(0,D.jsxs)(`div`,{role:`status`,className:`flex items-start gap-2 rounded-md border p-3 text-sm ${W.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:[W.ok?(0,D.jsx)(b,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}):(0,D.jsx)(g,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,D.jsx)(`div`,{className:`flex-1`,children:W.text}),(0,D.jsx)(`button`,{type:`button`,className:`text-xs underline opacity-60 hover:opacity-100`,onClick:()=>G(null),children:o(`marketplace.action.dismiss`)})]}),q&&(0,D.jsxs)(`div`,{role:`status`,className:`flex items-start gap-2 rounded-md border p-3 text-sm whitespace-pre-wrap ${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.ok?(0,D.jsx)(b,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}):(0,D.jsx)(g,{className:`h-4 w-4 mt-0.5 shrink-0`,"aria-hidden":`true`}),(0,D.jsxs)(`div`,{className:`flex-1`,children:[q.message,q.ok&&(0,D.jsx)(Qe,{packageId:Y.manifest_id,strings:d,className:`mt-2`})]}),(0,D.jsx)(`button`,{type:`button`,className:`text-xs underline opacity-60 hover:opacity-100`,onClick:()=>J(null),children:o(`marketplace.action.dismiss`)})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-3`,children:[(0,D.jsx)(`div`,{className:`lg:col-span-2 space-y-4`,children:(0,D.jsxs)(ce,{children:[(0,D.jsx)(ue,{children:(0,D.jsx)(Oe,{className:`text-base`,children:o(`marketplace.detail.about`)})}),(0,D.jsx)(De,{children:X.readme?(0,D.jsx)(Ye,{source:X.readme}):(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o(`marketplace.detail.noReadme`)})})]})}),(0,D.jsx)(`div`,{className:`space-y-4`,children:(0,D.jsxs)(ce,{children:[(0,D.jsx)(ue,{children:(0,D.jsx)(Oe,{className:`text-base`,children:o(`marketplace.detail.versions`)})}),(0,D.jsx)(De,{children:m.versions.length===0?(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o(`marketplace.detail.noApprovedVersions`)}):(0,D.jsx)(`ul`,{className:`space-y-3`,children:m.versions.map(e=>(0,D.jsxs)(`li`,{className:`space-y-1 text-sm`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,D.jsxs)(`span`,{className:`flex items-center gap-1.5`,children:[(0,D.jsx)(ne,{className:`h-3.5 w-3.5 text-muted-foreground`,"aria-hidden":`true`}),(0,D.jsxs)(`code`,{className:`font-mono`,children:[`v`,e.version]}),e.is_prerelease&&(0,D.jsx)(l,{variant:`outline`,className:`text-xs`,children:o(`marketplace.detail.prerelease`)})]}),(0,D.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,D.jsx)(`p`,{className:`whitespace-pre-line pl-5 text-xs text-muted-foreground`,children:e.release_notes.trim()})]},e.id))})})]})})]}),(0,D.jsx)(Te,{open:Je,onOpenChange:e=>{O(e),e||(R(null),it(!1))},children:(0,D.jsxs)(de,{children:[(0,D.jsxs)(pe,{children:[(0,D.jsx)(me,{children:o(`marketplace.install.dialogTitle`,{name:X.displayName||Y.manifest_id})}),(0,D.jsx)(ye,{children:w().defaultEnvironmentId?o(`marketplace.install.dialogDescCurrent`,{host:typeof window<`u`?window.location.host:``}):o(`marketplace.install.dialogDescPicker`)})]}),A?(0,D.jsx)(_,{className:`h-10 w-full`}):M?(0,D.jsxs)(`div`,{className:`rounded-md border border-amber-500/30 bg-amber-500/5 p-3 text-sm space-y-2`,children:[(0,D.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,D.jsx)(g,{className:`h-4 w-4 mt-0.5 text-amber-600`,"aria-hidden":`true`}),(0,D.jsx)(`div`,{className:`flex-1`,children:M})]}),(0,D.jsx)(`a`,{href:Ve(Y.id),target:`_blank`,rel:`noopener noreferrer`,children:(0,D.jsxs)(S,{variant:`outline`,size:`sm`,className:`w-full`,children:[(0,D.jsx)(we,{className:`h-4 w-4 mr-1.5`,"aria-hidden":`true`}),o(`marketplace.action.openOnCloud`)]})})]}):w().defaultEnvironmentId?(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(ge,{id:`seed`,checked:tt,onCheckedChange:e=>nt(e===!0)}),(0,D.jsx)(v,{htmlFor:`seed`,className:`text-sm font-normal cursor-pointer`,children:o(`marketplace.install.includeSampleData`)})]}):Xe.length===0?(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:o(`marketplace.install.noEnvs`)}):(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,D.jsx)(v,{htmlFor:`env-select`,children:o(`marketplace.install.environment`)}),(0,D.jsxs)(Ce,{value:P,onValueChange:F,children:[(0,D.jsx)(he,{id:`env-select`,children:(0,D.jsx)(se,{placeholder:o(`marketplace.install.environmentPlaceholder`)})}),(0,D.jsx)(be,{children:Xe.map(e=>{let t=$e[e.id],n=!!t&&!!Z&&t!==`installed`&&t!==Z;return(0,D.jsxs)(_e,{value:e.id,children:[e.display_name||e.hostname||e.id,e.plan&&(0,D.jsxs)(`span`,{className:`text-muted-foreground`,children:[` · `,e.plan]}),t&&(n?(0,D.jsxs)(`span`,{className:`text-amber-600`,children:[` · `,o(`marketplace.install.updateTo`,{defaultValue:`Update → v{{version}}`,version:Z})]}):(0,D.jsxs)(`span`,{className:`text-muted-foreground`,children:[` · `,o(`marketplace.install.installedVersion`,{defaultValue:`Installed v{{version}}`,version:t})]}))]},e.id)})})]})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(ge,{id:`seed`,checked:tt,onCheckedChange:e=>nt(e===!0)}),(0,D.jsx)(v,{htmlFor:`seed`,className:`text-sm font-normal cursor-pointer`,children:o(`marketplace.install.includeSampleData`)})]})]}),vt&&!M&&(0,D.jsxs)(`div`,{className:`space-y-3`,children:[(0,D.jsx)(Ze,{version:Y.latest_version}),(0,D.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,D.jsx)(ge,{id:`ack-perms`,checked:rt,onCheckedChange:e=>it(e===!0)}),(0,D.jsx)(v,{htmlFor:`ack-perms`,className:`text-sm font-normal cursor-pointer leading-snug`,children:o(`marketplace.disclosure.acknowledge`,{defaultValue:`I understand this package runs code and grants the permissions above.`})})]})]}),L&&(0,D.jsx)(`div`,{className:`rounded-md border p-3 text-sm ${L.ok?`border-green-500/30 bg-green-500/5 text-green-700`:`border-destructive/30 bg-destructive/5 text-destructive`}`,children:L.message}),L?.ok===!0&&w().defaultEnvironmentId&&w().defaultEnvironmentId===P&&(0,D.jsx)(Qe,{packageId:Y.manifest_id,strings:d}),(0,D.jsxs)(Ee,{children:[(0,D.jsx)(S,{variant:`outline`,onClick:()=>O(!1),children:o(`marketplace.action.close`)}),!M&&(0,D.jsx)(S,{onClick:dt,disabled:!P||I||L?.ok===!0||vt&&!rt,children:o(I?`marketplace.action.installing`:`marketplace.action.install`)})]})]})})]}):(0,D.jsx)(We,{})}export{Qe as n,$e as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{d as t,f as n,r,y as i}from"./vendor-react-DpRf6e0g.js";import{y as a}from"./infrastructure-PXm1h5tB.js";import{M as o,_t as s}from"./framework-UESyszCj.js";import{r as c}from"./data-adapter-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{d as t,f as n,r,y as i}from"./vendor-react-DpRf6e0g.js";import{y as a}from"./infrastructure-PXm1h5tB.js";import{M as o,_t as s}from"./framework-UESyszCj.js";import{r as c}from"./data-adapter-rnhaIuyx.js";import{i as l}from"./plugin-form-D_JAwPGr.js";import{i as u,r as d}from"./assistantBus-CpACs9I7.js";var f=e(i(),1),p=r(),m=(0,f.createContext)(!1),h=`preview`,g=`draft`;function _(e){return new URLSearchParams(e).get(h)===g}var v=!1;function y(){v=!0}function b({force:e,children:r}){let i=t(),a=n(),o=(0,f.useMemo)(()=>_(i.search),[i.search]),[s,c]=(0,f.useState)(o);return(0,f.useEffect)(()=>{if(o){c(!0),v=!1;return}if(!s)return;if(v){v=!1,c(!1);return}let e=new URLSearchParams(i.search);e.set(h,g),a(`${i.pathname}?${e.toString()}${i.hash}`,{replace:!0})},[o,s,i.pathname,i.search,i.hash,a]),(0,p.jsx)(m.Provider,{value:e??(o||s),children:r})}function x(){return(0,f.useContext)(m)}var S=a();function C(){return``}function w(e={}){let{previewDrafts:t=!1,environmentId:n}=e,r=new c({baseUrl:C(),previewDrafts:t,fetch:S});return n?r.withEnvironment(n):r}var T=3e5,E=[`app`,`view`],D={apps:`app`,objects:`object`,dashboards:`dashboard`,reports:`report`,pages:`page`},O=`objectui:metadata:`;function k(){try{let e=import.meta;if(e&&e.env&&typeof e.env.MODE==`string`)return e.env.MODE!==`production`}catch{}return!1}var A=k();function j(...e){A&&console.debug(`[MetadataProvider]`,...e)}function M(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`items`in e&&Array.isArray(e.items)?e.items:[]}function N(e){return e==null?null:typeof e==`object`&&`item`in e?e.item??null:e}function P(e){return!!e&&typeof e==`object`&&`name`in e&&typeof e.name==`string`}function F(e){return!!e&&typeof e==`object`&&!!e.viewKind&&!!e.object}function I(e,t){if(!e.length||!t.length)return e;let n={},r=new Set;for(let e of t)F(e)&&r.add(e.object);for(let e of t){if(F(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 L(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??r.reference_to;a&&(t[a]||=[]).push({childObject:n.name,relationshipField:e,inlineMode:l(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 R(){return{status:`idle`,items:[],byName:new Map,error:null,fetchedAt:0,promise:null}}function z(e){if(typeof sessionStorage>`u`)return null;try{let t=sessionStorage.getItem(O+e);if(!t)return null;let n=JSON.parse(t);return Array.isArray(n)?n:null}catch{return null}}function B(e,t){if(!(typeof sessionStorage>`u`))try{sessionStorage.setItem(O+e,JSON.stringify(t))}catch{}}function V({children:e,adapter:t,ttlMs:n=T}){let r=(0,f.useRef)(new Map),i=(0,f.useRef)(new Map),a=(0,f.useRef)(t);a.current=t;let c=x(),l=(0,f.useMemo)(()=>c?w({previewDrafts:!0}):null,[c]),m=(0,f.useRef)(l);m.current=l;let[h,g]=(0,f.useState)(0),_=(0,f.useCallback)(()=>{typeof queueMicrotask==`function`?queueMicrotask(()=>g(e=>e+1)):Promise.resolve().then(()=>g(e=>e+1))},[]);(0,f.useEffect)(()=>{r.current.clear(),i.current.clear(),_()},[c,_]);let v=(0,f.useCallback)(e=>{let t=r.current.get(e);return t||(t=R(),r.current.set(e,t)),t},[]),y=(0,f.useCallback)(e=>{let t=v(e);if(t.promise)return t.promise;if(t.status===`ready`&&Date.now()-t.fetchedAt<n)return j(`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,o=(i?i.list(e):a.current.getClient().meta.getItems(e)).then(n=>{let a=M(n);if(e===`object`)for(let e of a)s(e);t.items=a,t.status=`ready`,t.error=null,t.fetchedAt=Date.now(),t.promise=null,t.byName.clear();for(let e of a)P(e)&&t.byName.set(e.name,e);return e===`app`&&!i&&B(e,a),j(`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,j(`fetch failed type=${e}`,r),_(),[]});return t.promise=o,o},[_,v,n]),b=(0,f.useCallback)((e,t)=>{let n=v(e);if(n.byName.has(t))return j(`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 o=r.get(t);if(o)return o;let s=Date.now(),c=m.current,l=(c?c.get(e,t):a.current.getClient().meta.getItem(e,t)).then(i=>{let a=N(i);return a&&n.byName.set(t,a),j(`fetched item type=${e} name=${t} in ${Date.now()-s}ms`),r.delete(t),a}).catch(n=>(r.delete(t),j(`fetch item failed type=${e} name=${t}`,n),null));return r.set(t,l),l},[v]),S=(0,f.useCallback)(async e=>{if(e){let t=v(e);t.fetchedAt=0,t.byName.clear(),await y(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(),y(e)}))},[y,v]),C=(0,f.useCallback)((e,t)=>{let n=r.current.get(e);n&&(t?(n.byName.delete(t),n.items=n.items.filter(e=>e?.name!==t),j(`invalidated type=${e} name=${t}`)):(n.status=`idle`,n.items=[],n.byName.clear(),n.error=null,n.fetchedAt=0,j(`invalidated type=${e}`)),_())},[_]);(0,f.useEffect)(()=>{if(c)return d(({type:e})=>{C(e)})},[c,C]),(0,f.useEffect)(()=>u(()=>{try{a.current?.clearCache?.()}catch{}S()}),[S]);let[O,k]=(0,f.useState)(!0),[A,F]=(0,f.useState)(null);(0,f.useEffect)(()=>{let e=!1,t=c?null:z(`app`);if(t){let e=v(`app`);e.items=t,e.status=`ready`,e.fetchedAt=0;for(let n of t)P(n)&&e.byName.set(n.name,n);_(),k(!1)}return(async()=>{for(let t of E)try{await y(t),e||F(null)}catch(t){e||F(t instanceof Error?t:Error(String(t)))}e||k(!1)})(),()=>{e=!0}},[t,y,v,_,c]);let V=(0,f.useMemo)(()=>{let e=e=>{let t=v(e);return t.status===`idle`&&y(e),t.items};return{apps:v(`app`).items,get objects(){let t=e(D.objects),n=e(`view`);return L(n.length?I(t,n):t)},get dashboards(){return e(D.dashboards)},get reports(){return e(D.reports)},get pages(){return e(D.pages)},loading:O,error:A??v(`app`).error,refresh:S,invalidate:C,ensureType:y,getItem:b,getItemsByType:t=>e(t),getTypeStatus:e=>v(e).status}},[h,O,A,y,b,v,S,C]);return(0,p.jsx)(o.Provider,{value:V,children:e})}export{b as a,g as i,w as n,y as o,h as r,x as s,V as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{f as t,h as n,m as r,r as i,y as a}from"./vendor-react-DpRf6e0g.js";import{_ as o,g as s,n as ee,t as c}from"./infrastructure-PXm1h5tB.js";import{Bt as te,X as ne}from"./framework-UESyszCj.js";import{Kr as re,Xi as ie,Zc as ae,ao as oe,ct as l,dt as u,ha as d,it as f,nl as p,st as m,xs as h,zr as g}from"./ui-components-BbC0qTrK.js";import{i as _,r as se,s as ce}from"./MetadataProvider-
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{f as t,h as n,m as r,r as i,y as a}from"./vendor-react-DpRf6e0g.js";import{_ as o,g as s,n as ee,t as c}from"./infrastructure-PXm1h5tB.js";import{Bt as te,X as ne}from"./framework-UESyszCj.js";import{Kr as re,Xi as ie,Zc as ae,ao as oe,ct as l,dt as u,ha as d,it as f,nl as p,st as m,xs as h,zr as g}from"./ui-components-BbC0qTrK.js";import{i as _,r as se,s as ce}from"./MetadataProvider-D9fSVVZp.js";import{t as le}from"./RecordDetailView-CP1b5rdr.js";import{a as ue,c as de,i as fe,n as pe,o as me,r as he,s as ge}from"./InterfaceListPage-DcFmVgXg.js";import{t as _e}from"./getIcon-D3yCrAri.js";import{o as ve}from"./createDerive-CGF05Hgy.js";import{n as ye,t as be}from"./CreateViewDialog-C6sZGaIB.js";import{d as xe}from"./plugins-views-CJKuyDvq.js";import{o as Se,t as Ce}from"./runtime-metadata-persistence-BjYxldgR.js";import{n as v,r as y,t as b}from"./drillUrlFilters-BL8PeMrH.js";var x=e(a(),1),S=i(),C=new Set([`select`,`multiselect`,`radio`,`enum`,`boolean`]),w=4;function T({dataSource:e,objects:i}){let{appName:a,objectName:T}=r(),{t:E}=p(),{objectLabel:D,fieldLabel:O}=ae(),k=t(),[A,j]=n(),{can:M}=ee(),{canRead:N}=c(T??``),{user:P,activeOrganization:F}=o(),I=s(),L=ve(),R=de()===`group`,z=ce(),[we,B]=x.useState(!1),V=x.useMemo(()=>(i||[]).find(e=>e.name===T),[i,T]),[Te]=x.useState(()=>ge(new URLSearchParams(window.location.search))),Ee=x.useCallback(e=>{j(t=>me(t,e),{replace:!0})},[j]),H=Array.from(A.entries()).filter(([e])=>e.startsWith(`filter[`)).map(([e,t])=>`${e}=${t}`).join(`&`),U=x.useMemo(()=>{let e=y(new URLSearchParams(H)),t=e.filter(([e])=>N(e));if(t.length<e.length){let t=e.filter(([e])=>!N(e)).map(([e])=>e);console.warn(`[ObjectDataPage] Dropped URL filter(s) on unreadable field(s): ${t.join(`, `)}`)}return te(t,{currentUserId:P?.id??null,currentOrgId:F?.id??null})},[H,N,P?.id,F?.id]),De=x.useMemo(()=>v(U),[U]),Oe=x.useCallback(e=>{j(t=>b(new URLSearchParams(t),e))},[j]),W=x.useMemo(()=>he(V,{orgAttribution:R}).filter(e=>N(e)),[V,N,R]),G=x.useMemo(()=>{let e=V?.fields;if(!e||typeof e!=`object`)return;let t=Object.entries(e).filter(([e,t])=>t&&!t.hidden&&C.has(t.type)&&N(e)).slice(0,w).map(([e])=>({field:e}));return t.length>0?{element:`dropdown`,fields:t}:void 0},[V,N]),K=x.useCallback(e=>`/apps/${a}/${T}/record/${encodeURIComponent(String(e))}`,[a,T]),q=ne({navigation:{mode:`drawer`},objectName:T??``,onNavigate:e=>k(K(e))}),J=A.get(`recordId`),ke=x.useCallback((e,t)=>{let n=e?.id??e?._id;if(t&&(t.metaKey||t.ctrlKey||t.button===1)&&n!=null){window.open(K(n),`_blank`);return}n!=null&&j(e=>{let t=new URLSearchParams(e);return t.set(`recordId`,String(n)),t})},[K,j]),Ae=x.useCallback(()=>{j(e=>{let t=new URLSearchParams(e);return t.delete(`recordId`),t})},[j]);x.useEffect(()=>{J&&!q.isOpen?q.open({id:J}):!J&&q.isOpen&&q.close()},[J]);let Y=x.useMemo(()=>ue(V),[V]),X=x.useMemo(()=>pe(V),[V]),Z=x.useMemo(()=>fe(V),[V]),Q=x.useMemo(()=>{let e=[`grid`];return Y&&e.push(`kanban`),X&&e.push(`calendar`),Z&&e.push(`gallery`),e},[Y,X,Z]),$=x.useMemo(()=>{if(V)return{type:`list-view`,objectName:V.name,viewType:`grid`,columns:W,...U.length?{filter:U}:{},kanban:Y,calendar:X,gallery:Z,userFilters:G,appearance:{allowedVisualizations:Q},showViewSwitcher:Q.length>1,userActions:{search:!0,sort:!0,filter:!0,rowHeight:!0,group:!0,hideFields:!0},showRecordCount:!0}},[V,W,U,Y,X,Z,G,Q]),je=x.useCallback(async e=>{try{let t={...e,columns:Array.isArray(e.columns)&&e.columns.length>0?e.columns:W,...U.length?{filter:U}:{}},n=Se(T??``,t,{name:e.name,label:e.label}),r=await Ce(`view`,n.name,n,{metadataClient:L});if(r){let e=z?``:`?${se}=${_}`;k(`../view/${r}${e}`,{relative:`path`})}}catch(e){console.error(`[ObjectDataPage] Failed to save view:`,e)}},[W,U,L,k,T,z]);return V?M(V.name,`read`)?(0,S.jsxs)(`div`,{className:`h-full flex flex-col bg-background min-w-0 overflow-hidden`,"data-testid":`object-data-page`,children:[(0,S.jsx)(`div`,{className:`hidden sm:block`,children:(0,S.jsx)(ye,{title:(0,S.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,S.jsx)(`span`,{className:`truncate`,children:D(V)}),(0,S.jsx)(`span`,{className:`rounded border px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground`,children:E(`console.objectData.badge`,{defaultValue:`Data`})})]}),description:E(`console.objectData.description`,{defaultValue:`URL-defined data slice — not bound to any saved view.`}),icon:x.createElement(_e(V?.icon),{className:`h-4 w-4`}),actions:(0,S.jsxs)(S.Fragment,{children:[M(V.name,`create`)&&(0,S.jsxs)(g,{size:`sm`,onClick:()=>k(`../new`,{relative:`path`}),className:`shadow-none gap-1.5 h-8 sm:h-9`,"data-testid":`object-data-new-button`,children:[(0,S.jsx)(d,{className:`h-4 w-4`}),(0,S.jsx)(`span`,{className:`hidden sm:inline`,children:E(`console.objectView.new`)})]}),I&&(0,S.jsxs)(g,{size:`sm`,variant:`outline`,onClick:()=>B(!0),className:`shadow-none gap-1.5 h-8 sm:h-9`,"data-testid":`object-data-save-as-view`,children:[(0,S.jsx)(ie,{className:`h-4 w-4`}),(0,S.jsx)(`span`,{className:`hidden sm:inline`,children:E(`console.objectData.saveAsView`,{defaultValue:`Save as view`})})]})]})})}),U.length>0&&(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5 border-b px-3 sm:px-4 py-2 shrink-0`,"data-testid":`object-data-filter-chips`,children:[(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:E(`console.objectData.filteredBy`,{defaultValue:`Filtered by`})}),De.map(({field:e,text:t})=>(0,S.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full border bg-muted/40 px-2 py-0.5 text-xs`,children:[(0,S.jsx)(`span`,{className:`font-medium`,children:O(V.name,e,e)}),(0,S.jsx)(`span`,{className:`text-muted-foreground`,children:t}),(0,S.jsx)(`button`,{type:`button`,onClick:()=>Oe(e),className:`ml-0.5 rounded-full hover:bg-muted p-0.5`,"aria-label":E(`console.objectData.removeFilter`,{defaultValue:`Remove filter {{field}}`,field:e}),"data-testid":`object-data-remove-filter-${e}`,children:(0,S.jsx)(re,{className:`h-3 w-3`})})]},e))]}),(0,S.jsx)(`div`,{className:`flex-1 min-h-0 overflow-auto`,children:$&&(0,S.jsx)(xe,{schema:$,dataSource:e,userFilterSelections:Te,onUserFilterSelectionsChange:Ee,onRowClick:ke})}),q.isOverlay&&(0,S.jsx)(f,{...q,setIsOpen:e=>{e||Ae()},title:D(V),children:t=>(0,S.jsx)(le,{objectNameOverride:V.name,recordIdOverride:String(t?.id??t?._id??J??``),embedded:!0,dataSource:e,objects:i,onEdit:()=>{}})}),I&&(0,S.jsx)(be,{open:we,onOpenChange:B,onCreate:je,objectDef:V})]}):(0,S.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,"data-testid":`object-data-403`,children:(0,S.jsxs)(m,{children:[(0,S.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,S.jsx)(oe,{className:`h-6 w-6 text-muted-foreground`})}),(0,S.jsx)(u,{children:E(`console.objectData.noAccessTitle`,{defaultValue:`Access denied`})}),(0,S.jsx)(l,{children:E(`console.objectData.noAccess`,{defaultValue:`You do not have permission to view this data.`})})]})}):(0,S.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,S.jsxs)(m,{children:[(0,S.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,S.jsx)(h,{className:`h-6 w-6 text-muted-foreground`})}),(0,S.jsx)(u,{children:E(`console.objectView.objectNotFound`)}),(0,S.jsx)(l,{children:E(`console.objectView.objectNotFoundDescription`,{objectName:T})})]})})}export{T as ObjectDataPage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{d as n,f as r,h as i,m as a,r as o,y as s}from"./vendor-react-DpRf6e0g.js";import{_ as c,g as l,n as u,y as d}from"./infrastructure-PXm1h5tB.js";import{G as f,N as p,P as m,et as h,p as g}from"./framework-UESyszCj.js";import{Ar as _,Fr as v,Ir as y,Lr as b,Mr as x,Nr as S,Pr as C,Sa as w,Zc as T,ct as ee,dt as E,es as D,nl as O,rt as k,st as A,zr as j}from"./ui-components-BbC0qTrK.js";import{r as M}from"./vendor-ui-utils-CnzHPXVC.js";import"./MetadataProvider-87BSQkFa.js";import{r as te}from"./ExpressionProvider-BQFSoabd.js";import{D as ne,E as re,F as ie,I as ae,L as oe,N as se,O as N,T as ce,w as le}from"./RecordDetailView-CP1b5rdr.js";import{t as ue}from"./preferLocal-CKqyhTP9.js";import{t as P}from"./InterfaceListPage-bZdYVg1W.js";import{n as F,t as I}from"./MetadataInspector-B7LigfJm.js";var L=e(s(),1),R=o();function z(e,t){if(/^https?:\/\//i.test(e)||e.startsWith(`mailto:`))return{href:e,external:!e.startsWith(`mailto:`)};let n=(t||``).replace(/\/+$/,``);return{href:`${n}${e}`,external:!!n}}function B({cta:e,apiBase:t,primary:n,onNavigate:r}){let{href:i,external:a}=z(e.url,t);return(0,R.jsx)(j,{asChild:!0,variant:n?`default`:`outline`,size:`sm`,children:(0,R.jsx)(`a`,{href:i,onClick:r,...a?{target:`_blank`,rel:`noopener noreferrer`}:{},"data-testid":`entitlement-cta-${n?`primary`:`secondary`}`,children:e.label})})}function de({state:e,apiBase:t,onOpenChange:n}){let r=e.spec,{t:i}=O();return(0,R.jsx)(_,{open:e.open,onOpenChange:e=>{e||n(!1)},children:(0,R.jsxs)(S,{"data-testid":`environment-entitlement-dialog`,children:[(0,R.jsxs)(y,{children:[(0,R.jsx)(b,{children:r?.title}),(0,R.jsx)(C,{children:r?.message})]}),(0,R.jsxs)(v,{children:[(0,R.jsx)(x,{children:i(`common.close`,{defaultValue:`Close`})}),r?.secondaryCta&&(0,R.jsx)(B,{cta:r.secondaryCta,apiBase:t,primary:!1,onNavigate:()=>n(!1)}),r?.cta&&(0,R.jsx)(B,{cta:r.cta,apiBase:t,primary:!0,onNavigate:()=>n(!1)})]})]})})}var V=new Set([`DEV_ENV_PLAN_LOCKED`,`DEV_ENV_LIMIT`,`PRODUCTION_ENV_LIMIT`]);function H(e){return typeof e==`string`&&V.has(e)}var U=`/settings/billing`;function W(e,t){return(typeof t?.defaultValue==`string`?t.defaultValue:e).replace(/\{\{(\w+)\}\}/g,(e,n)=>String(t?.[n]??``))}function G(e,t){return typeof t==`string`&&t&&t!==`free`?e(`environment.entitlement.namedPlan`,{plan:t,defaultValue:`{{plan}} plan`}):e(`environment.entitlement.freePlan`,{defaultValue:`free plan`})}function K(e){let t=e?.error;return t&&typeof t==`object`?t:e}function fe(e,t=W){let n=K(e),r=n?.code;if(!H(r))return null;let i=typeof n?.upgrade_url==`string`&&n.upgrade_url?n.upgrade_url:U,a=typeof n?.contact_url==`string`&&n.contact_url?n.contact_url:``;if(r===`PRODUCTION_ENV_LIMIT`)return{code:r,title:t(`environment.entitlement.productionLimitTitle`,{defaultValue:`You already have your production environment`}),message:t(`environment.entitlement.productionLimitBody`,{defaultValue:`Each organization includes exactly one production environment. Create a separate organization for another, or contact us about an Enterprise arrangement.`}),cta:a?{label:t(`environment.entitlement.contactSalesCta`,{defaultValue:`Contact sales`}),url:a}:void 0};let o={label:t(`environment.entitlement.upgradeCta`,{defaultValue:`Upgrade plan`}),url:i};if(r===`DEV_ENV_PLAN_LOCKED`)return{code:r,title:t(`environment.entitlement.planLockedTitle`,{defaultValue:`Development environments are a paid feature`}),message:t(`environment.entitlement.planLockedBody`,{plan:G(t,n?.plan),defaultValue:`Your {{plan}} includes one production environment. Upgrade to add development environments — build in dev, then publish to production.`}),cta:o};let s=Number(n?.current),c=Number(n?.limit),l=Number.isFinite(s)&&Number.isFinite(c);return{code:r,title:t(`environment.entitlement.limitTitle`,{defaultValue:`Development environment limit reached`}),message:l?t(`environment.entitlement.limitBodyWithCount`,{used:s,limit:c,defaultValue:`You are using {{used}} of {{limit}} development environments. Capacity scales with AI seats — add an AI seat, or archive an unused development environment to free one up.`}):t(`environment.entitlement.limitBody`,{defaultValue:`Capacity scales with AI seats. Add an AI seat, or archive an unused development environment to free one up.`}),cta:o}}function q(e){return e.hasProductionEnv?e.canCreateDevelopmentEnv===!1?`upgrade_for_development`:`add_development`:`setup_production`}function J(e,t=W){return{code:`DEV_ENV_PLAN_LOCKED`,title:t(`environment.entitlement.planLockedTitle`,{defaultValue:`Development environments are a paid feature`}),message:t(`environment.entitlement.planLockedBody`,{plan:G(t,e.plan),defaultValue:`Your {{plan}} includes one production environment. Upgrade to add development environments — build in dev, then publish to production.`}),cta:{label:t(`environment.entitlement.upgradeCta`,{defaultValue:`Upgrade plan`}),url:e.upgradeUrl||`/settings/billing`}}}var Y=/^\s*\{\{\s*page\.([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\}\}\s*$/;function X(e,t){let n=t;for(let t of e.split(`.`)){if(n==null)return;n=n[t]}return n}function Z(e,t){if(!e.includes(`{{`))return e;let n=e.match(Y);if(n){let e=X(n[1],t);return e===void 0?``:e}return e.replace(/\{\{\s*page\.([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\}\}/g,(e,n)=>{let r=X(n,t);return r==null?``:String(r)})}function Q(e,t){if(typeof e==`string`)return Z(e,t);if(Array.isArray(e))return e.map(e=>Q(e,t));if(e&&typeof e==`object`){let n={};for(let[r,i]of Object.entries(e))n[r]=Q(i,t);return n}return e}function pe(e,t){return t?Q(e,t):e}var me={id:`current-user`,name:`Demo User`,isPlatformAdmin:!1};function he(e){let t=e.locations;return Array.isArray(t)?t.some(e=>e===`list_item`||e===`record_header`||e===`record_more`||e===`record_section`):!1}var ge=N;function $(e){let{dataSource:t,objects:n,objectName:i,onRefresh:a}=e,o=r(),{user:s,activeOrganization:l}=c(),{systemPermissions:f}=u(),{fieldLabel:p,fieldOptionLabel:m,actionParamText:h,actionParamOptionLabel:_,actionDescription:v,actionResultDialog:y}=T(),{t:b}=O(),x=(0,L.useMemo)(()=>i?n?.find(e=>e.name===i):void 0,[n,i]),S=i||x?.name,C=(0,L.useCallback)(()=>{a?.()},[a]),w=g({dataSource:t,onUndo:()=>{C(),M.success(`Change undone`)}}),[ee,E]=(0,L.useState)({open:!1,message:``}),[D,k]=(0,L.useState)({open:!1,params:[]}),[A,j]=(0,L.useState)({open:!1}),[te,N]=(0,L.useState)(null),[ue,P]=(0,L.useState)({open:!1}),F=(0,L.useRef)(new Set),I=(0,L.useCallback)((e,t,n)=>new Promise(r=>{let a=typeof n?.objectName==`string`&&n.objectName?n.objectName:i||x?.name,o=y(a,n?.name,e)??e;j({open:!0,spec:o,data:t,resolve:r})}),[i,x,y]),z=(0,L.useCallback)((e,t)=>new Promise(n=>{E({open:!0,message:e,options:t,resolve:n})}),[]),B=(0,L.useCallback)((e,t)=>new Promise(r=>{let a=t?.params&&!Array.isArray(t.params)?t.params._rowRecord:void 0,o=typeof t?.objectName==`string`&&t.objectName?t.objectName:void 0,s=ce(e,{objectName:o||i||x?.name||``,objects:n||[],fieldLabel:p,fieldOptionLabel:m,row:a}),c=o||i||x?.name,l=s.map(e=>({...e,label:h(c,t?.name,e.name,`label`,e.label)??e.label,placeholder:h(c,t?.name,e.name,`placeholder`,e.placeholder)??e.placeholder,helpText:h(c,t?.name,e.name,`helpText`,e.helpText)??e.helpText,options:Array.isArray(e.options)?e.options.map(n=>({...n,label:_(c,t?.name,e.name,n.value,n.label)})):e.options}));k({open:!0,params:l,title:t?.label||t?.title,description:v(c,t?.name,t?.description),resolve:r})}),[i,x,n,p,m,h,_]),V=s?{id:s.id,name:s.name,avatar:s.image,isPlatformAdmin:s?.isPlatformAdmin??!1,systemPermissions:f??[]}:{...me,systemPermissions:f??[]},H=(0,L.useCallback)((e,t)=>{if(t?.type===`error`){M.error(e);return}if(t?.undo){M.success(e,{duration:t.duration,action:{label:t.undo.label||`Undo`,onClick:()=>{w.undo()}}});return}M.success(e,{duration:t?.duration})},[w]),U=(0,L.useCallback)((e,t)=>{t?.external||t?.newTab?window.open(e,`_blank`,`noopener,noreferrer`):o(e)},[o]),W=(0,L.useMemo)(()=>d(),[]),G=(0,L.useCallback)(e=>{P({open:!0,spec:e})},[]),K=(0,L.useCallback)(async(e,n)=>{try{let r=e.target||e.name,i=e.params||{},a=typeof r==`string`?r:``;if(a.startsWith(`/`)||/^https?:\/\//i.test(a)){let t={...i},r=t._rowRecord;delete t._rowRecord;let o=n?.pageVariables??void 0,s=pe(t,o),c=a;r&&/\{[a-z_][a-z0-9_]*\}/i.test(c)&&(c=c.replace(/\{([a-z_][a-z0-9_]*)\}/gi,(e,t)=>{let n=r[t];return n==null?``:encodeURIComponent(String(n))}));let u=c.startsWith(`http`)?c:`${c}`,d=e.bodyShape&&typeof e.bodyShape==`object`&&e.bodyShape.wrap?e.bodyShape.wrap:void 0,f=d?{[d]:s}:{...s};for(let e of Object.keys(f))if(e.startsWith(`outputs.`)&&e.length>8){let t=f[e];if(delete f[e],t===void 0||t===``)continue;(f.outputs??={})[e.slice(8)]=t}if(r&&e.recordIdParam){let t=r[e.recordIdField||`id`];t!=null&&(f[e.recordIdParam]=t)}/\/api\/v1\/auth\//.test(c)&&!f.organizationId&&l?.id&&(f.organizationId=l.id),e.bodyExtra&&typeof e.bodyExtra==`object`&&Object.assign(f,pe(e.bodyExtra,o));let p=(e.method||`POST`).toUpperCase(),m={method:p,headers:{"Content-Type":`application/json`},credentials:`include`};p!==`GET`&&p!==`DELETE`&&(m.body=JSON.stringify(f));let h=await W(u,m);if(!h.ok){let e=null;try{e=await h.json()}catch{}let t=fe(e,b);return t?(G(t),{success:!1}):{success:!1,error:ge(e,`HTTP ${h.status}`)}}let g=await h.json().catch(()=>({}));return g&&typeof g==`object`&&g.success===!1?{success:!1,error:ge(g,`Action "${e.name||a}" failed`)}:(e.refreshAfter!==!1&&C(),{success:!0,data:g&&typeof g==`object`&&!Array.isArray(g)&&`data`in g?g.data:g,reload:e.refreshAfter!==!1})}let o=e.objectName||S,s=i._rowRecord,c={...i};delete c._rowRecord;let u=c.recordId??s?.[e.recordIdField||`id`];delete c.recordId,e.bodyExtra&&typeof e.bodyExtra==`object`&&Object.assign(c,e.bodyExtra),o&&typeof t?.execute==`function`?await t.execute(o,r,c):o&&u&&Object.keys(c).length>0&&typeof t?.update==`function`&&await t.update(o,u,c);let d;if(e.undoable&&o&&u&&s&&Object.keys(c).length>0&&typeof t?.update==`function`){let t={};for(let e of Object.keys(c))t[e]=s[e]??null;d={id:`undo-${o}-${u}-${Date.now()}`,type:`update`,objectName:o,recordId:String(u),timestamp:Date.now(),description:e.label||`Undo ${o}`,undoData:t,redoData:{...c}}}let f=e.refreshAfter!==!1;return f&&C(),{success:!0,reload:f,undo:d}}catch(e){return{success:!1,error:e.message}}},[t,S,W,l,C,G,b]),q=(0,L.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 n=Array.isArray(t?.selectedRecords)?t.selectedRecords:[];if(n.length===1)a=n[0]?.id;else if(n.length>1)return{success:!1,error:`This flow runs on a single record — select exactly one row.`};else if(he(e))return{success:!1,error:`This flow runs on a single record — select a row first.`}}a!=null&&r.recordId==null&&(r.recordId=a);let o=await W(`/api/v1/automation/${encodeURIComponent(n)}/trigger`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({recordId:a,objectName:e.objectName||S,params:r})}),s=await o.json().catch(()=>null),c=ne(o,s,`Flow "${n}"`);if(c.kind===`failed`)return{success:!1,error:c.error};if(c.kind===`paused`)return N({flowName:n,runId:c.runId??``,screen:c.screen}),{success:!0,silent:!0};let l=e.refreshAfter!==!1;return l&&C(),{success:!0,data:c.data,reload:l}}catch(e){return{success:!1,error:e.message}}},[W,S,C]),J=(0,L.useCallback)(async(e,t)=>{let n=e.name;if(!n)return{success:!1,error:`Action has no name — a server action must declare one`};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],s=Array.isArray(r._selectedIds);if(o==null&&!s){let n=Array.isArray(t?.selectedRecords)?t.selectedRecords:[];if(n.length===1)o=n[0]?.[a];else if(n.length>1)return{success:!1,error:`This action runs on a single record — select exactly one row.`};else if(he(e))return{success:!1,error:`This action runs on a single record — select a row first.`}}let c=`${n}:${o??``}`;if(F.current.has(c))return{success:!1,error:`Action already in progress`};F.current.add(c);let l=null;if(e.opensInNewTab)try{l=window.open(`about:blank`,`_blank`),l&&(l.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>`),l.document.close())}catch{l=null}try{let t=typeof e.newTabUrl==`string`?e.newTabUrl:``;if(e.opensInNewTab&&t){if(o==null){if(l)try{l.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(l)try{l.location.href=n}catch{try{l.close()}catch{}window.location.href=n}else{let e=null;try{e=window.open(n,`_blank`)}catch{e=null}e||M(`浏览器拦截了弹窗 / Popup blocked`,{description:`点击在新标签页打开环境`,action:{label:`打开环境`,onClick:()=>{try{window.open(n,`_blank`)}catch{window.location.href=n}}},duration:1e4})}return e.refreshAfter===!0&&C(),{success:!0}}let i=e.objectName||S||`global`,a=await W(`/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),c=le(a,s,`Action "${n}"`);if(!c.ok){if(l)try{l.close()}catch{}return{success:!1,error:c.error}}let u=e.refreshAfter!==!1;u&&C();let d=c.envelope,f=c.payload,p=f&&typeof f==`object`&&typeof f.redirectUrl==`string`?f.redirectUrl:null;if(p)if(l)try{l.location.href=p}catch{try{l.close()}catch{}window.location.href=p}else{let e=null;try{e=window.open(p,`_blank`)}catch{e=null}e||M(`浏览器拦截了弹窗 / Popup blocked`,{description:`点击在新标签页打开环境`,action:{label:`打开环境`,onClick:()=>{try{window.open(p,`_blank`)}catch{window.location.href=p}}},duration:1e4})}else if(l)try{l.close()}catch{}return{success:!0,data:d,reload:u}}catch(e){if(l)try{l.close()}catch{}return{success:!1,error:e.message}}finally{F.current.delete(c)}},[W,S,C]),{modalHandler:Y,modalElement:X,resolveModalTarget:Z}=oe(t),Q=(0,L.useCallback)(async(e,t)=>{let n=e.modal??e.target??e.params?.schema,r=n==null?null:await Z(n);return r?Y(r):{success:!1,error:`Action "${e.name}" is type:'modal' but its target ${n==null?``:`"${String(n)}" `}names no page or object to open. Point it at a page, or use type:'script' with params to collect input and run a handler.`}},[Z,Y]);return{confirmHandler:z,toastHandler:H,navigateHandler:U,paramCollectionHandler:B,resultDialogHandler:I,apiHandler:K,flowHandler:q,serverActionHandler:J,modalActionHandler:Q,authFetch:W,openEntitlementDialog:G,actionProviderProps:(0,L.useMemo)(()=>({context:{...i?{objectName:i}:{},user:V,apiBase:``,activeOrganization:l?{id:l.id,slug:l.slug,name:l.name}:null},onConfirm:z,onToast:H,onNavigate:U,onParamCollection:B,onResultDialog:I,onModal:Y,handlers:{api:K,flow:q,script:J,modal:Q}}),[i,V,l,z,H,U,B,I,K,q,J,Y,Q]),dialogs:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(ae,{state:ee,onOpenChange:e=>{e||E({open:!1,message:``})}}),(0,R.jsx)(ie,{state:D,onOpenChange:e=>{e||k({open:!1,params:[]})}}),(0,R.jsx)(se,{state:A,onAcknowledge:()=>{A.resolve?.(),j({open:!1})}}),(0,R.jsx)(re,{state:te,authFetch:W,baseUrl:``,dataSource:t,objects:n,onClose:()=>N(null),onComplete:()=>{N(null),C()}}),(0,R.jsx)(de,{state:ue,apiBase:``,onOpenChange:e=>{e||P({open:!1})}}),X]})}}function _e({children:e,...t}){let n=$(t);return(0,R.jsxs)(f,{...n.actionProviderProps,children:[e,n.dialogs]})}var ve=t({PageView:()=>ye});function ye(){let{t:e}=O(),{pageName:t}=a(),[o]=i(),{showDebug:s}=F(),c=r(),u=n(),d=l(),{pages:f,objects:g,getTypeStatus:_}=m(),{app:v}=te(),y=p(),[b,x]=(0,L.useState)(0),S=ue(f,t,v?._packageId);if(!S){let n=_?.(`page`);return n===`idle`||n===`loading`?(0,R.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,"data-testid":`page-loading`,children:(0,R.jsx)(k,{className:`h-5 w-5 text-muted-foreground`})}):(0,R.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,R.jsxs)(A,{children:[(0,R.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,R.jsx)(D,{className:`h-6 w-6 text-muted-foreground`})}),(0,R.jsx)(E,{children:e(`empty.pageNotFound`)}),(0,R.jsx)(ee,{children:e(`empty.pageNotFoundDescription`,{name:t})})]})})}let C=Object.fromEntries(o.entries()),T=u.pathname.match(/\/apps\/([^/]+)/)?.[1],j=d&&!!T&&!!t;return(0,R.jsx)(_e,{dataSource:y,objects:g,onRefresh:()=>x(e=>e+1),children:(0,R.jsxs)(`div`,{className:`flex flex-row h-full w-full overflow-hidden relative`,children:[(0,R.jsxs)(`div`,{className:`flex-1 overflow-auto h-full relative`,children:[j&&(0,R.jsx)(`button`,{type:`button`,onClick:()=>{j&&c(`/apps/${T}/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,R.jsx)(w,{className:`h-3.5 w-3.5`})}),S.interfaceConfig?.source?(0,R.jsx)(P,{page:S,reserveEditAffordance:j},b):(0,R.jsx)(h,{schema:{...S,type:S.type||`page`,pageType:S.type,context:{...S.context,params:C,refreshKey:b}}},b)]}),(0,R.jsx)(I,{open:s,sections:[{title:`Page Configuration`,data:S}]})]})})}export{J as a,q as i,$ as n,U as r,ve as t};
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{d as n,f as r,h as i,m as a,r as o,y as s}from"./vendor-react-DpRf6e0g.js";import{_ as c,g as l,n as u,y as d}from"./infrastructure-PXm1h5tB.js";import{G as f,N as p,P as m,et as h,p as g}from"./framework-UESyszCj.js";import{Ar as _,Fr as v,Ir as y,Lr as b,Mr as x,Nr as S,Pr as C,Sa as w,Zc as T,ct as ee,dt as E,es as D,nl as O,rt as k,st as A,zr as j}from"./ui-components-BbC0qTrK.js";import{r as M}from"./vendor-ui-utils-CnzHPXVC.js";import"./MetadataProvider-D9fSVVZp.js";import{r as te}from"./ExpressionProvider-BQFSoabd.js";import{D as ne,E as re,F as ie,I as ae,L as oe,N as se,O as N,T as ce,w as le}from"./RecordDetailView-CP1b5rdr.js";import{t as ue}from"./preferLocal-CKqyhTP9.js";import{t as P}from"./InterfaceListPage-DcFmVgXg.js";import{n as F,t as I}from"./MetadataInspector-B7LigfJm.js";var L=e(s(),1),R=o();function z(e,t){if(/^https?:\/\//i.test(e)||e.startsWith(`mailto:`))return{href:e,external:!e.startsWith(`mailto:`)};let n=(t||``).replace(/\/+$/,``);return{href:`${n}${e}`,external:!!n}}function B({cta:e,apiBase:t,primary:n,onNavigate:r}){let{href:i,external:a}=z(e.url,t);return(0,R.jsx)(j,{asChild:!0,variant:n?`default`:`outline`,size:`sm`,children:(0,R.jsx)(`a`,{href:i,onClick:r,...a?{target:`_blank`,rel:`noopener noreferrer`}:{},"data-testid":`entitlement-cta-${n?`primary`:`secondary`}`,children:e.label})})}function de({state:e,apiBase:t,onOpenChange:n}){let r=e.spec,{t:i}=O();return(0,R.jsx)(_,{open:e.open,onOpenChange:e=>{e||n(!1)},children:(0,R.jsxs)(S,{"data-testid":`environment-entitlement-dialog`,children:[(0,R.jsxs)(y,{children:[(0,R.jsx)(b,{children:r?.title}),(0,R.jsx)(C,{children:r?.message})]}),(0,R.jsxs)(v,{children:[(0,R.jsx)(x,{children:i(`common.close`,{defaultValue:`Close`})}),r?.secondaryCta&&(0,R.jsx)(B,{cta:r.secondaryCta,apiBase:t,primary:!1,onNavigate:()=>n(!1)}),r?.cta&&(0,R.jsx)(B,{cta:r.cta,apiBase:t,primary:!0,onNavigate:()=>n(!1)})]})]})})}var V=new Set([`DEV_ENV_PLAN_LOCKED`,`DEV_ENV_LIMIT`,`PRODUCTION_ENV_LIMIT`]);function H(e){return typeof e==`string`&&V.has(e)}var U=`/settings/billing`;function W(e,t){return(typeof t?.defaultValue==`string`?t.defaultValue:e).replace(/\{\{(\w+)\}\}/g,(e,n)=>String(t?.[n]??``))}function G(e,t){return typeof t==`string`&&t&&t!==`free`?e(`environment.entitlement.namedPlan`,{plan:t,defaultValue:`{{plan}} plan`}):e(`environment.entitlement.freePlan`,{defaultValue:`free plan`})}function K(e){let t=e?.error;return t&&typeof t==`object`?t:e}function fe(e,t=W){let n=K(e),r=n?.code;if(!H(r))return null;let i=typeof n?.upgrade_url==`string`&&n.upgrade_url?n.upgrade_url:U,a=typeof n?.contact_url==`string`&&n.contact_url?n.contact_url:``;if(r===`PRODUCTION_ENV_LIMIT`)return{code:r,title:t(`environment.entitlement.productionLimitTitle`,{defaultValue:`You already have your production environment`}),message:t(`environment.entitlement.productionLimitBody`,{defaultValue:`Each organization includes exactly one production environment. Create a separate organization for another, or contact us about an Enterprise arrangement.`}),cta:a?{label:t(`environment.entitlement.contactSalesCta`,{defaultValue:`Contact sales`}),url:a}:void 0};let o={label:t(`environment.entitlement.upgradeCta`,{defaultValue:`Upgrade plan`}),url:i};if(r===`DEV_ENV_PLAN_LOCKED`)return{code:r,title:t(`environment.entitlement.planLockedTitle`,{defaultValue:`Development environments are a paid feature`}),message:t(`environment.entitlement.planLockedBody`,{plan:G(t,n?.plan),defaultValue:`Your {{plan}} includes one production environment. Upgrade to add development environments — build in dev, then publish to production.`}),cta:o};let s=Number(n?.current),c=Number(n?.limit),l=Number.isFinite(s)&&Number.isFinite(c);return{code:r,title:t(`environment.entitlement.limitTitle`,{defaultValue:`Development environment limit reached`}),message:l?t(`environment.entitlement.limitBodyWithCount`,{used:s,limit:c,defaultValue:`You are using {{used}} of {{limit}} development environments. Capacity scales with AI seats — add an AI seat, or archive an unused development environment to free one up.`}):t(`environment.entitlement.limitBody`,{defaultValue:`Capacity scales with AI seats. Add an AI seat, or archive an unused development environment to free one up.`}),cta:o}}function q(e){return e.hasProductionEnv?e.canCreateDevelopmentEnv===!1?`upgrade_for_development`:`add_development`:`setup_production`}function J(e,t=W){return{code:`DEV_ENV_PLAN_LOCKED`,title:t(`environment.entitlement.planLockedTitle`,{defaultValue:`Development environments are a paid feature`}),message:t(`environment.entitlement.planLockedBody`,{plan:G(t,e.plan),defaultValue:`Your {{plan}} includes one production environment. Upgrade to add development environments — build in dev, then publish to production.`}),cta:{label:t(`environment.entitlement.upgradeCta`,{defaultValue:`Upgrade plan`}),url:e.upgradeUrl||`/settings/billing`}}}var Y=/^\s*\{\{\s*page\.([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\}\}\s*$/;function X(e,t){let n=t;for(let t of e.split(`.`)){if(n==null)return;n=n[t]}return n}function Z(e,t){if(!e.includes(`{{`))return e;let n=e.match(Y);if(n){let e=X(n[1],t);return e===void 0?``:e}return e.replace(/\{\{\s*page\.([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\}\}/g,(e,n)=>{let r=X(n,t);return r==null?``:String(r)})}function Q(e,t){if(typeof e==`string`)return Z(e,t);if(Array.isArray(e))return e.map(e=>Q(e,t));if(e&&typeof e==`object`){let n={};for(let[r,i]of Object.entries(e))n[r]=Q(i,t);return n}return e}function pe(e,t){return t?Q(e,t):e}var me={id:`current-user`,name:`Demo User`,isPlatformAdmin:!1};function he(e){let t=e.locations;return Array.isArray(t)?t.some(e=>e===`list_item`||e===`record_header`||e===`record_more`||e===`record_section`):!1}var ge=N;function $(e){let{dataSource:t,objects:n,objectName:i,onRefresh:a}=e,o=r(),{user:s,activeOrganization:l}=c(),{systemPermissions:f}=u(),{fieldLabel:p,fieldOptionLabel:m,actionParamText:h,actionParamOptionLabel:_,actionDescription:v,actionResultDialog:y}=T(),{t:b}=O(),x=(0,L.useMemo)(()=>i?n?.find(e=>e.name===i):void 0,[n,i]),S=i||x?.name,C=(0,L.useCallback)(()=>{a?.()},[a]),w=g({dataSource:t,onUndo:()=>{C(),M.success(`Change undone`)}}),[ee,E]=(0,L.useState)({open:!1,message:``}),[D,k]=(0,L.useState)({open:!1,params:[]}),[A,j]=(0,L.useState)({open:!1}),[te,N]=(0,L.useState)(null),[ue,P]=(0,L.useState)({open:!1}),F=(0,L.useRef)(new Set),I=(0,L.useCallback)((e,t,n)=>new Promise(r=>{let a=typeof n?.objectName==`string`&&n.objectName?n.objectName:i||x?.name,o=y(a,n?.name,e)??e;j({open:!0,spec:o,data:t,resolve:r})}),[i,x,y]),z=(0,L.useCallback)((e,t)=>new Promise(n=>{E({open:!0,message:e,options:t,resolve:n})}),[]),B=(0,L.useCallback)((e,t)=>new Promise(r=>{let a=t?.params&&!Array.isArray(t.params)?t.params._rowRecord:void 0,o=typeof t?.objectName==`string`&&t.objectName?t.objectName:void 0,s=ce(e,{objectName:o||i||x?.name||``,objects:n||[],fieldLabel:p,fieldOptionLabel:m,row:a}),c=o||i||x?.name,l=s.map(e=>({...e,label:h(c,t?.name,e.name,`label`,e.label)??e.label,placeholder:h(c,t?.name,e.name,`placeholder`,e.placeholder)??e.placeholder,helpText:h(c,t?.name,e.name,`helpText`,e.helpText)??e.helpText,options:Array.isArray(e.options)?e.options.map(n=>({...n,label:_(c,t?.name,e.name,n.value,n.label)})):e.options}));k({open:!0,params:l,title:t?.label||t?.title,description:v(c,t?.name,t?.description),resolve:r})}),[i,x,n,p,m,h,_]),V=s?{id:s.id,name:s.name,avatar:s.image,isPlatformAdmin:s?.isPlatformAdmin??!1,systemPermissions:f??[]}:{...me,systemPermissions:f??[]},H=(0,L.useCallback)((e,t)=>{if(t?.type===`error`){M.error(e);return}if(t?.undo){M.success(e,{duration:t.duration,action:{label:t.undo.label||`Undo`,onClick:()=>{w.undo()}}});return}M.success(e,{duration:t?.duration})},[w]),U=(0,L.useCallback)((e,t)=>{t?.external||t?.newTab?window.open(e,`_blank`,`noopener,noreferrer`):o(e)},[o]),W=(0,L.useMemo)(()=>d(),[]),G=(0,L.useCallback)(e=>{P({open:!0,spec:e})},[]),K=(0,L.useCallback)(async(e,n)=>{try{let r=e.target||e.name,i=e.params||{},a=typeof r==`string`?r:``;if(a.startsWith(`/`)||/^https?:\/\//i.test(a)){let t={...i},r=t._rowRecord;delete t._rowRecord;let o=n?.pageVariables??void 0,s=pe(t,o),c=a;r&&/\{[a-z_][a-z0-9_]*\}/i.test(c)&&(c=c.replace(/\{([a-z_][a-z0-9_]*)\}/gi,(e,t)=>{let n=r[t];return n==null?``:encodeURIComponent(String(n))}));let u=c.startsWith(`http`)?c:`${c}`,d=e.bodyShape&&typeof e.bodyShape==`object`&&e.bodyShape.wrap?e.bodyShape.wrap:void 0,f=d?{[d]:s}:{...s};for(let e of Object.keys(f))if(e.startsWith(`outputs.`)&&e.length>8){let t=f[e];if(delete f[e],t===void 0||t===``)continue;(f.outputs??={})[e.slice(8)]=t}if(r&&e.recordIdParam){let t=r[e.recordIdField||`id`];t!=null&&(f[e.recordIdParam]=t)}/\/api\/v1\/auth\//.test(c)&&!f.organizationId&&l?.id&&(f.organizationId=l.id),e.bodyExtra&&typeof e.bodyExtra==`object`&&Object.assign(f,pe(e.bodyExtra,o));let p=(e.method||`POST`).toUpperCase(),m={method:p,headers:{"Content-Type":`application/json`},credentials:`include`};p!==`GET`&&p!==`DELETE`&&(m.body=JSON.stringify(f));let h=await W(u,m);if(!h.ok){let e=null;try{e=await h.json()}catch{}let t=fe(e,b);return t?(G(t),{success:!1}):{success:!1,error:ge(e,`HTTP ${h.status}`)}}let g=await h.json().catch(()=>({}));return g&&typeof g==`object`&&g.success===!1?{success:!1,error:ge(g,`Action "${e.name||a}" failed`)}:(e.refreshAfter!==!1&&C(),{success:!0,data:g&&typeof g==`object`&&!Array.isArray(g)&&`data`in g?g.data:g,reload:e.refreshAfter!==!1})}let o=e.objectName||S,s=i._rowRecord,c={...i};delete c._rowRecord;let u=c.recordId??s?.[e.recordIdField||`id`];delete c.recordId,e.bodyExtra&&typeof e.bodyExtra==`object`&&Object.assign(c,e.bodyExtra),o&&typeof t?.execute==`function`?await t.execute(o,r,c):o&&u&&Object.keys(c).length>0&&typeof t?.update==`function`&&await t.update(o,u,c);let d;if(e.undoable&&o&&u&&s&&Object.keys(c).length>0&&typeof t?.update==`function`){let t={};for(let e of Object.keys(c))t[e]=s[e]??null;d={id:`undo-${o}-${u}-${Date.now()}`,type:`update`,objectName:o,recordId:String(u),timestamp:Date.now(),description:e.label||`Undo ${o}`,undoData:t,redoData:{...c}}}let f=e.refreshAfter!==!1;return f&&C(),{success:!0,reload:f,undo:d}}catch(e){return{success:!1,error:e.message}}},[t,S,W,l,C,G,b]),q=(0,L.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 n=Array.isArray(t?.selectedRecords)?t.selectedRecords:[];if(n.length===1)a=n[0]?.id;else if(n.length>1)return{success:!1,error:`This flow runs on a single record — select exactly one row.`};else if(he(e))return{success:!1,error:`This flow runs on a single record — select a row first.`}}a!=null&&r.recordId==null&&(r.recordId=a);let o=await W(`/api/v1/automation/${encodeURIComponent(n)}/trigger`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({recordId:a,objectName:e.objectName||S,params:r})}),s=await o.json().catch(()=>null),c=ne(o,s,`Flow "${n}"`);if(c.kind===`failed`)return{success:!1,error:c.error};if(c.kind===`paused`)return N({flowName:n,runId:c.runId??``,screen:c.screen}),{success:!0,silent:!0};let l=e.refreshAfter!==!1;return l&&C(),{success:!0,data:c.data,reload:l}}catch(e){return{success:!1,error:e.message}}},[W,S,C]),J=(0,L.useCallback)(async(e,t)=>{let n=e.name;if(!n)return{success:!1,error:`Action has no name — a server action must declare one`};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],s=Array.isArray(r._selectedIds);if(o==null&&!s){let n=Array.isArray(t?.selectedRecords)?t.selectedRecords:[];if(n.length===1)o=n[0]?.[a];else if(n.length>1)return{success:!1,error:`This action runs on a single record — select exactly one row.`};else if(he(e))return{success:!1,error:`This action runs on a single record — select a row first.`}}let c=`${n}:${o??``}`;if(F.current.has(c))return{success:!1,error:`Action already in progress`};F.current.add(c);let l=null;if(e.opensInNewTab)try{l=window.open(`about:blank`,`_blank`),l&&(l.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>`),l.document.close())}catch{l=null}try{let t=typeof e.newTabUrl==`string`?e.newTabUrl:``;if(e.opensInNewTab&&t){if(o==null){if(l)try{l.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(l)try{l.location.href=n}catch{try{l.close()}catch{}window.location.href=n}else{let e=null;try{e=window.open(n,`_blank`)}catch{e=null}e||M(`浏览器拦截了弹窗 / Popup blocked`,{description:`点击在新标签页打开环境`,action:{label:`打开环境`,onClick:()=>{try{window.open(n,`_blank`)}catch{window.location.href=n}}},duration:1e4})}return e.refreshAfter===!0&&C(),{success:!0}}let i=e.objectName||S||`global`,a=await W(`/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),c=le(a,s,`Action "${n}"`);if(!c.ok){if(l)try{l.close()}catch{}return{success:!1,error:c.error}}let u=e.refreshAfter!==!1;u&&C();let d=c.envelope,f=c.payload,p=f&&typeof f==`object`&&typeof f.redirectUrl==`string`?f.redirectUrl:null;if(p)if(l)try{l.location.href=p}catch{try{l.close()}catch{}window.location.href=p}else{let e=null;try{e=window.open(p,`_blank`)}catch{e=null}e||M(`浏览器拦截了弹窗 / Popup blocked`,{description:`点击在新标签页打开环境`,action:{label:`打开环境`,onClick:()=>{try{window.open(p,`_blank`)}catch{window.location.href=p}}},duration:1e4})}else if(l)try{l.close()}catch{}return{success:!0,data:d,reload:u}}catch(e){if(l)try{l.close()}catch{}return{success:!1,error:e.message}}finally{F.current.delete(c)}},[W,S,C]),{modalHandler:Y,modalElement:X,resolveModalTarget:Z}=oe(t),Q=(0,L.useCallback)(async(e,t)=>{let n=e.modal??e.target??e.params?.schema,r=n==null?null:await Z(n);return r?Y(r):{success:!1,error:`Action "${e.name}" is type:'modal' but its target ${n==null?``:`"${String(n)}" `}names no page or object to open. Point it at a page, or use type:'script' with params to collect input and run a handler.`}},[Z,Y]);return{confirmHandler:z,toastHandler:H,navigateHandler:U,paramCollectionHandler:B,resultDialogHandler:I,apiHandler:K,flowHandler:q,serverActionHandler:J,modalActionHandler:Q,authFetch:W,openEntitlementDialog:G,actionProviderProps:(0,L.useMemo)(()=>({context:{...i?{objectName:i}:{},user:V,apiBase:``,activeOrganization:l?{id:l.id,slug:l.slug,name:l.name}:null},onConfirm:z,onToast:H,onNavigate:U,onParamCollection:B,onResultDialog:I,onModal:Y,handlers:{api:K,flow:q,script:J,modal:Q}}),[i,V,l,z,H,U,B,I,K,q,J,Y,Q]),dialogs:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(ae,{state:ee,onOpenChange:e=>{e||E({open:!1,message:``})}}),(0,R.jsx)(ie,{state:D,onOpenChange:e=>{e||k({open:!1,params:[]})}}),(0,R.jsx)(se,{state:A,onAcknowledge:()=>{A.resolve?.(),j({open:!1})}}),(0,R.jsx)(re,{state:te,authFetch:W,baseUrl:``,dataSource:t,objects:n,onClose:()=>N(null),onComplete:()=>{N(null),C()}}),(0,R.jsx)(de,{state:ue,apiBase:``,onOpenChange:e=>{e||P({open:!1})}}),X]})}}function _e({children:e,...t}){let n=$(t);return(0,R.jsxs)(f,{...n.actionProviderProps,children:[e,n.dialogs]})}var ve=t({PageView:()=>ye});function ye(){let{t:e}=O(),{pageName:t}=a(),[o]=i(),{showDebug:s}=F(),c=r(),u=n(),d=l(),{pages:f,objects:g,getTypeStatus:_}=m(),{app:v}=te(),y=p(),[b,x]=(0,L.useState)(0),S=ue(f,t,v?._packageId);if(!S){let n=_?.(`page`);return n===`idle`||n===`loading`?(0,R.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,"data-testid":`page-loading`,children:(0,R.jsx)(k,{className:`h-5 w-5 text-muted-foreground`})}):(0,R.jsx)(`div`,{className:`h-full flex items-center justify-center p-8`,children:(0,R.jsxs)(A,{children:[(0,R.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,R.jsx)(D,{className:`h-6 w-6 text-muted-foreground`})}),(0,R.jsx)(E,{children:e(`empty.pageNotFound`)}),(0,R.jsx)(ee,{children:e(`empty.pageNotFoundDescription`,{name:t})})]})})}let C=Object.fromEntries(o.entries()),T=u.pathname.match(/\/apps\/([^/]+)/)?.[1],j=d&&!!T&&!!t;return(0,R.jsx)(_e,{dataSource:y,objects:g,onRefresh:()=>x(e=>e+1),children:(0,R.jsxs)(`div`,{className:`flex flex-row h-full w-full overflow-hidden relative`,children:[(0,R.jsxs)(`div`,{className:`flex-1 overflow-auto h-full relative`,children:[j&&(0,R.jsx)(`button`,{type:`button`,onClick:()=>{j&&c(`/apps/${T}/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,R.jsx)(w,{className:`h-3.5 w-3.5`})}),S.interfaceConfig?.source?(0,R.jsx)(P,{page:S,reserveEditAffordance:j},b):(0,R.jsx)(h,{schema:{...S,type:S.type||`page`,pageType:S.type,context:{...S.context,params:C,refreshKey:b}}},b)]}),(0,R.jsx)(I,{open:s,sections:[{title:`Page Configuration`,data:S}]})]})})}export{J as a,q as i,$ as n,U as r,ve as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{r as t,y as n}from"./vendor-react-DpRf6e0g.js";import{N as r}from"./framework-UESyszCj.js";import{Cr as i,Ft as a,It as o,Ki as ee,Lt as te,Nt as ne,Os as re,Pt as s,Rt as c,Tn as l,_r as ie,br as ae,cr as u,dr as d,fo as oe,fr as f,ha as p,kn as m,la as se,lr as h,oa as ce,ps as le,sr as g,ur as _,vr as ue,ws as de,xr as fe,yr as pe,zr as v}from"./ui-components-BbC0qTrK.js";import{r as y}from"./vendor-ui-utils-CnzHPXVC.js";import"./src-D0ueU0ix.js";var b=e(n(),1),x=t();function me(e){return e?e.replace(/^\/+/,``).match(/^forms\/([^/?#]+)/i)?.[1]??null:null}function S(e){return e.trim().toLowerCase().replace(/[^a-z0-9-_]+/g,`-`).replace(/^-+|-+$/g,``)}function C(){let e=r()?.getClient?.(),[t,n]=(0,b.useState)([]),[C,he]=(0,b.useState)([]),[w,T]=(0,b.useState)(!0),[E,D]=(0,b.useState)(null),[ge,O]=(0,b.useState)(!1),[k,A]=(0,b.useState)(``),[j,M]=(0,b.useState)(``),[N,P]=(0,b.useState)(!1),[_e,F]=(0,b.useState)(!1),[I,L]=(0,b.useState)(null),[R,z]=(0,b.useState)(``),[B,V]=(0,b.useState)(`thank-you`),[H,U]=(0,b.useState)(``),[W,G]=(0,b.useState)(``),[K,q]=(0,b.useState)(``),[J,Y]=(0,b.useState)(!1),X=async()=>{if(!e?.meta?.getItems){D(`meta.getItems is not available on this client`),T(!1);return}T(!0),D(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=me(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),he(a)}catch(e){D(e?.message??String(e))}finally{T(!1)}};(0,b.useEffect)(()=>{X()},[]);let ve=typeof window<`u`?window.location.origin:``,Z=e=>`${ve}/console/f/${e}`,ye=e=>`<iframe src="${Z(e)}" width="100%" height="640" frameborder="0" style="border:0;"></iframe>`,be=e=>`<iframe\n src={\`${Z(e)}\`}\n title="Public form"\n style={{ width: '100%', height: 640, border: 0 }}\n/>`,Q=async(e,t)=>{try{await navigator.clipboard.writeText(t),y.success(`Copied ${e}`)}catch{y.error(`Clipboard unavailable`)}},xe=async()=>{if(!k||!j)return;let t=C.find(e=>e.name===k);if(!t)return;let n=S(j);if(!n){y.error(`Invalid slug`);return}let r={...t.spec,sharing:{...t.spec.sharing??{},enabled:!0,allowAnonymous:!0,publicLink:`/forms/${n}`}};P(!0);try{await e.meta.saveItem(`view`,t.name,r),y.success(`Published ${t.name}`),O(!1),A(``),M(``),await X()}catch(e){y.error(`Publish failed: ${e?.message??e}`)}finally{P(!1)}},Se=e=>{L(e),z(e.slug);let t=e.spec?.submitBehavior,n=t?.kind??`thank-you`;V(n),U(t?.title??``),G(t?.message??``),q(t?.url??``),F(!0)},Ce=async()=>{if(!I)return;let t=S(R);if(!t){y.error(`Invalid slug`);return}let n;switch(B){case`thank-you`:n={kind:`thank-you`},H&&(n.title=H),W&&(n.message=W);break;case`redirect`:if(!K){y.error(`Redirect URL is required`);return}n={kind:`redirect`,url:K};break;case`continue`:case`next-record`:n={kind:B}}let r={...I.spec,sharing:{...I.spec.sharing??{},enabled:!0,allowAnonymous:!0,publicLink:`/forms/${t}`},submitBehavior:n};Y(!0);try{await e.meta.saveItem(`view`,I.name,r),y.success(`Saved ${I.name}`),F(!1),L(null),await X()}catch(e){y.error(`Save failed: ${e?.message??e}`)}finally{Y(!1)}},$=t.length>0;return(0,x.jsxs)(`div`,{className:`flex flex-1 flex-col gap-4 p-4 md:p-6 overflow-auto`,children:[(0,x.jsxs)(ie,{children:[(0,x.jsxs)(ae,{className:`flex flex-row items-start justify-between gap-4 space-y-0`,children:[(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(fe,{className:`flex items-center gap-2`,children:[(0,x.jsx)(se,{className:`h-4 w-4`}),`Public Forms`]}),(0,x.jsx)(pe,{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,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsxs)(v,{variant:`default`,size:`sm`,onClick:()=>O(!0),disabled:C.length===0,title:C.length===0?`No non-public FormViews available`:`Publish a FormView`,children:[(0,x.jsx)(p,{className:`h-3.5 w-3.5`}),(0,x.jsx)(`span`,{className:`ml-1.5`,children:`Publish form…`})]}),(0,x.jsxs)(v,{variant:`outline`,size:`sm`,onClick:X,disabled:w,children:[(0,x.jsx)(ce,{className:`h-3.5 w-3.5 ${w?`animate-spin`:``}`}),(0,x.jsx)(`span`,{className:`ml-1.5`,children:`Refresh`})]})]})]}),(0,x.jsxs)(ue,{children:[E&&(0,x.jsx)(`div`,{className:`mb-3 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:E}),!w&&!$&&(0,x.jsxs)(`div`,{className:`rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground`,children:[(0,x.jsx)(`p`,{className:`font-medium text-foreground`,children:`No public forms yet`}),(0,x.jsxs)(`p`,{className:`mt-1`,children:[`Click `,(0,x.jsx)(`strong`,{children:`Publish form…`}),` above to share an existing form, or build a new one in Views & Apps and mark it public.`]})]}),$&&(0,x.jsxs)(ne,{children:[(0,x.jsx)(te,{children:(0,x.jsxs)(c,{children:[(0,x.jsx)(o,{children:`Name`}),(0,x.jsx)(o,{children:`Object`}),(0,x.jsx)(o,{children:`Slug`}),(0,x.jsx)(o,{children:`Public URL`}),(0,x.jsx)(o,{className:`text-right`,children:`Actions`})]})}),(0,x.jsx)(s,{children:t.map(e=>{let t=Z(e.slug);return(0,x.jsxs)(c,{children:[(0,x.jsx)(a,{children:(0,x.jsxs)(`div`,{className:`flex flex-col`,children:[(0,x.jsx)(`span`,{className:`font-medium`,children:e.label??e.name}),(0,x.jsx)(`code`,{className:`text-xs text-muted-foreground`,children:e.name})]})}),(0,x.jsx)(a,{children:e.object?(0,x.jsx)(i,{variant:`secondary`,children:e.object}):(0,x.jsx)(`span`,{className:`text-muted-foreground`,children:`—`})}),(0,x.jsx)(a,{children:(0,x.jsx)(`code`,{className:`text-xs`,children:e.slug})}),(0,x.jsx)(a,{children:(0,x.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,x.jsx)(le,{className:`h-3 w-3`})]})}),(0,x.jsx)(a,{className:`text-right`,children:(0,x.jsxs)(`div`,{className:`inline-flex gap-1`,children:[(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Copy URL`,onClick:()=>Q(`URL`,t),children:(0,x.jsx)(oe,{className:`h-3.5 w-3.5`})}),(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Copy <iframe> embed`,onClick:()=>Q(`iframe snippet`,ye(e.slug)),children:(0,x.jsx)(re,{className:`h-3.5 w-3.5`})}),(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Copy React snippet`,onClick:()=>Q(`React snippet`,be(e.slug)),children:(0,x.jsx)(de,{className:`h-3.5 w-3.5`})}),(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Edit sharing & post-submit behavior`,onClick:()=>Se(e),children:(0,x.jsx)(ee,{className:`h-3.5 w-3.5`})})]})})]},e.name)})})]})]})]}),(0,x.jsx)(g,{open:ge,onOpenChange:O,children:(0,x.jsxs)(u,{className:`sm:max-w-md`,children:[(0,x.jsxs)(d,{children:[(0,x.jsx)(f,{children:`Publish a FormView`}),(0,x.jsxs)(h,{children:[`Pick an existing FormView and turn it into a public form by enabling `,(0,x.jsx)(`code`,{className:`text-xs`,children:`sharing.allowAnonymous`}),` `,`and setting `,(0,x.jsx)(`code`,{className:`text-xs`,children:`publicLink`}),`.`]})]}),(0,x.jsxs)(`div`,{className:`space-y-3`,children:[(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`publish-view`,children:`FormView`}),(0,x.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:k,onChange:e=>A(e.target.value),children:[(0,x.jsx)(`option`,{value:``,children:`— Select a FormView —`}),C.map(e=>(0,x.jsxs)(`option`,{value:e.name,children:[e.label??e.name,` (`,e.name,`) `,e.object?`· ${e.object}`:``]},e.name))]})]}),(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`publish-slug`,children:`URL slug`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap`,children:`/console/f/`}),(0,x.jsx)(l,{id:`publish-slug`,placeholder:`contact-us`,value:j,onChange:e=>M(e.target.value)})]}),(0,x.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Lowercase letters, digits, dashes and underscores only.`})]})]}),(0,x.jsxs)(_,{children:[(0,x.jsx)(v,{variant:`ghost`,onClick:()=>O(!1),disabled:N,children:`Cancel`}),(0,x.jsx)(v,{onClick:xe,disabled:N||!k||!j,children:N?`Publishing…`:`Publish`})]})]})}),(0,x.jsx)(g,{open:_e,onOpenChange:F,children:(0,x.jsxs)(u,{className:`sm:max-w-lg`,children:[(0,x.jsxs)(d,{children:[(0,x.jsx)(f,{children:I?`Edit ${I.label??I.name}`:`Edit form`}),(0,x.jsx)(h,{children:`Configure the public URL and what happens after submit.`})]}),(0,x.jsxs)(`div`,{className:`space-y-3`,children:[(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-slug`,children:`URL slug`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap`,children:`/console/f/`}),(0,x.jsx)(l,{id:`edit-slug`,value:R,onChange:e=>z(e.target.value)})]})]}),(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-behavior`,children:`After submit`}),(0,x.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:B,onChange:e=>V(e.target.value),children:[(0,x.jsx)(`option`,{value:`thank-you`,children:`Show a thank-you panel`}),(0,x.jsx)(`option`,{value:`redirect`,children:`Redirect to a URL`}),(0,x.jsx)(`option`,{value:`continue`,children:`Reset for another response`}),(0,x.jsx)(`option`,{value:`next-record`,children:`Advance to next record (internal queues)`})]})]}),B===`thank-you`&&(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-tytitle`,children:`Title`}),(0,x.jsx)(l,{id:`edit-tytitle`,placeholder:`Thanks!`,value:H,onChange:e=>U(e.target.value)})]}),(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-tymsg`,children:`Message`}),(0,x.jsx)(l,{id:`edit-tymsg`,placeholder:`Your submission has been received.`,value:W,onChange:e=>G(e.target.value)})]})]}),B===`redirect`&&(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-url`,children:`Redirect URL`}),(0,x.jsx)(l,{id:`edit-url`,type:`url`,placeholder:`https://example.com/thanks`,value:K,onChange:e=>q(e.target.value)})]})]}),(0,x.jsxs)(_,{children:[(0,x.jsx)(v,{variant:`ghost`,onClick:()=>F(!1),disabled:J,children:`Cancel`}),(0,x.jsx)(v,{onClick:Ce,disabled:J||!R,children:J?`Saving…`:`Save`})]})]})})]})}export{C as PublicFormsPage};
|
|
1
|
+
import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{r as t,y as n}from"./vendor-react-DpRf6e0g.js";import{N as r}from"./framework-UESyszCj.js";import{Cr as i,Ft as a,It as o,Ki as ee,Lt as te,Nt as ne,Os as re,Pt as s,Rt as c,Tn as l,_r as ie,br as ae,cr as u,dr as d,fo as oe,fr as f,ha as p,kn as m,la as se,lr as h,oa as ce,ps as le,sr as g,ur as _,vr as ue,ws as de,xr as fe,yr as pe,zr as v}from"./ui-components-BbC0qTrK.js";import{r as y}from"./vendor-ui-utils-CnzHPXVC.js";import"./src-CSrGzA_t.js";var b=e(n(),1),x=t();function me(e){return e?e.replace(/^\/+/,``).match(/^forms\/([^/?#]+)/i)?.[1]??null:null}function S(e){return e.trim().toLowerCase().replace(/[^a-z0-9-_]+/g,`-`).replace(/^-+|-+$/g,``)}function C(){let e=r()?.getClient?.(),[t,n]=(0,b.useState)([]),[C,he]=(0,b.useState)([]),[w,T]=(0,b.useState)(!0),[E,D]=(0,b.useState)(null),[ge,O]=(0,b.useState)(!1),[k,A]=(0,b.useState)(``),[j,M]=(0,b.useState)(``),[N,P]=(0,b.useState)(!1),[_e,F]=(0,b.useState)(!1),[I,L]=(0,b.useState)(null),[R,z]=(0,b.useState)(``),[B,V]=(0,b.useState)(`thank-you`),[H,U]=(0,b.useState)(``),[W,G]=(0,b.useState)(``),[K,q]=(0,b.useState)(``),[J,Y]=(0,b.useState)(!1),X=async()=>{if(!e?.meta?.getItems){D(`meta.getItems is not available on this client`),T(!1);return}T(!0),D(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=me(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),he(a)}catch(e){D(e?.message??String(e))}finally{T(!1)}};(0,b.useEffect)(()=>{X()},[]);let ve=typeof window<`u`?window.location.origin:``,Z=e=>`${ve}/console/f/${e}`,ye=e=>`<iframe src="${Z(e)}" width="100%" height="640" frameborder="0" style="border:0;"></iframe>`,be=e=>`<iframe\n src={\`${Z(e)}\`}\n title="Public form"\n style={{ width: '100%', height: 640, border: 0 }}\n/>`,Q=async(e,t)=>{try{await navigator.clipboard.writeText(t),y.success(`Copied ${e}`)}catch{y.error(`Clipboard unavailable`)}},xe=async()=>{if(!k||!j)return;let t=C.find(e=>e.name===k);if(!t)return;let n=S(j);if(!n){y.error(`Invalid slug`);return}let r={...t.spec,sharing:{...t.spec.sharing??{},enabled:!0,allowAnonymous:!0,publicLink:`/forms/${n}`}};P(!0);try{await e.meta.saveItem(`view`,t.name,r),y.success(`Published ${t.name}`),O(!1),A(``),M(``),await X()}catch(e){y.error(`Publish failed: ${e?.message??e}`)}finally{P(!1)}},Se=e=>{L(e),z(e.slug);let t=e.spec?.submitBehavior,n=t?.kind??`thank-you`;V(n),U(t?.title??``),G(t?.message??``),q(t?.url??``),F(!0)},Ce=async()=>{if(!I)return;let t=S(R);if(!t){y.error(`Invalid slug`);return}let n;switch(B){case`thank-you`:n={kind:`thank-you`},H&&(n.title=H),W&&(n.message=W);break;case`redirect`:if(!K){y.error(`Redirect URL is required`);return}n={kind:`redirect`,url:K};break;case`continue`:case`next-record`:n={kind:B}}let r={...I.spec,sharing:{...I.spec.sharing??{},enabled:!0,allowAnonymous:!0,publicLink:`/forms/${t}`},submitBehavior:n};Y(!0);try{await e.meta.saveItem(`view`,I.name,r),y.success(`Saved ${I.name}`),F(!1),L(null),await X()}catch(e){y.error(`Save failed: ${e?.message??e}`)}finally{Y(!1)}},$=t.length>0;return(0,x.jsxs)(`div`,{className:`flex flex-1 flex-col gap-4 p-4 md:p-6 overflow-auto`,children:[(0,x.jsxs)(ie,{children:[(0,x.jsxs)(ae,{className:`flex flex-row items-start justify-between gap-4 space-y-0`,children:[(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(fe,{className:`flex items-center gap-2`,children:[(0,x.jsx)(se,{className:`h-4 w-4`}),`Public Forms`]}),(0,x.jsx)(pe,{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,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsxs)(v,{variant:`default`,size:`sm`,onClick:()=>O(!0),disabled:C.length===0,title:C.length===0?`No non-public FormViews available`:`Publish a FormView`,children:[(0,x.jsx)(p,{className:`h-3.5 w-3.5`}),(0,x.jsx)(`span`,{className:`ml-1.5`,children:`Publish form…`})]}),(0,x.jsxs)(v,{variant:`outline`,size:`sm`,onClick:X,disabled:w,children:[(0,x.jsx)(ce,{className:`h-3.5 w-3.5 ${w?`animate-spin`:``}`}),(0,x.jsx)(`span`,{className:`ml-1.5`,children:`Refresh`})]})]})]}),(0,x.jsxs)(ue,{children:[E&&(0,x.jsx)(`div`,{className:`mb-3 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm text-destructive`,children:E}),!w&&!$&&(0,x.jsxs)(`div`,{className:`rounded-md border border-dashed p-6 text-center text-sm text-muted-foreground`,children:[(0,x.jsx)(`p`,{className:`font-medium text-foreground`,children:`No public forms yet`}),(0,x.jsxs)(`p`,{className:`mt-1`,children:[`Click `,(0,x.jsx)(`strong`,{children:`Publish form…`}),` above to share an existing form, or build a new one in Views & Apps and mark it public.`]})]}),$&&(0,x.jsxs)(ne,{children:[(0,x.jsx)(te,{children:(0,x.jsxs)(c,{children:[(0,x.jsx)(o,{children:`Name`}),(0,x.jsx)(o,{children:`Object`}),(0,x.jsx)(o,{children:`Slug`}),(0,x.jsx)(o,{children:`Public URL`}),(0,x.jsx)(o,{className:`text-right`,children:`Actions`})]})}),(0,x.jsx)(s,{children:t.map(e=>{let t=Z(e.slug);return(0,x.jsxs)(c,{children:[(0,x.jsx)(a,{children:(0,x.jsxs)(`div`,{className:`flex flex-col`,children:[(0,x.jsx)(`span`,{className:`font-medium`,children:e.label??e.name}),(0,x.jsx)(`code`,{className:`text-xs text-muted-foreground`,children:e.name})]})}),(0,x.jsx)(a,{children:e.object?(0,x.jsx)(i,{variant:`secondary`,children:e.object}):(0,x.jsx)(`span`,{className:`text-muted-foreground`,children:`—`})}),(0,x.jsx)(a,{children:(0,x.jsx)(`code`,{className:`text-xs`,children:e.slug})}),(0,x.jsx)(a,{children:(0,x.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,x.jsx)(le,{className:`h-3 w-3`})]})}),(0,x.jsx)(a,{className:`text-right`,children:(0,x.jsxs)(`div`,{className:`inline-flex gap-1`,children:[(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Copy URL`,onClick:()=>Q(`URL`,t),children:(0,x.jsx)(oe,{className:`h-3.5 w-3.5`})}),(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Copy <iframe> embed`,onClick:()=>Q(`iframe snippet`,ye(e.slug)),children:(0,x.jsx)(re,{className:`h-3.5 w-3.5`})}),(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Copy React snippet`,onClick:()=>Q(`React snippet`,be(e.slug)),children:(0,x.jsx)(de,{className:`h-3.5 w-3.5`})}),(0,x.jsx)(v,{variant:`ghost`,size:`sm`,title:`Edit sharing & post-submit behavior`,onClick:()=>Se(e),children:(0,x.jsx)(ee,{className:`h-3.5 w-3.5`})})]})})]},e.name)})})]})]})]}),(0,x.jsx)(g,{open:ge,onOpenChange:O,children:(0,x.jsxs)(u,{className:`sm:max-w-md`,children:[(0,x.jsxs)(d,{children:[(0,x.jsx)(f,{children:`Publish a FormView`}),(0,x.jsxs)(h,{children:[`Pick an existing FormView and turn it into a public form by enabling `,(0,x.jsx)(`code`,{className:`text-xs`,children:`sharing.allowAnonymous`}),` `,`and setting `,(0,x.jsx)(`code`,{className:`text-xs`,children:`publicLink`}),`.`]})]}),(0,x.jsxs)(`div`,{className:`space-y-3`,children:[(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`publish-view`,children:`FormView`}),(0,x.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:k,onChange:e=>A(e.target.value),children:[(0,x.jsx)(`option`,{value:``,children:`— Select a FormView —`}),C.map(e=>(0,x.jsxs)(`option`,{value:e.name,children:[e.label??e.name,` (`,e.name,`) `,e.object?`· ${e.object}`:``]},e.name))]})]}),(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`publish-slug`,children:`URL slug`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap`,children:`/console/f/`}),(0,x.jsx)(l,{id:`publish-slug`,placeholder:`contact-us`,value:j,onChange:e=>M(e.target.value)})]}),(0,x.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Lowercase letters, digits, dashes and underscores only.`})]})]}),(0,x.jsxs)(_,{children:[(0,x.jsx)(v,{variant:`ghost`,onClick:()=>O(!1),disabled:N,children:`Cancel`}),(0,x.jsx)(v,{onClick:xe,disabled:N||!k||!j,children:N?`Publishing…`:`Publish`})]})]})}),(0,x.jsx)(g,{open:_e,onOpenChange:F,children:(0,x.jsxs)(u,{className:`sm:max-w-lg`,children:[(0,x.jsxs)(d,{children:[(0,x.jsx)(f,{children:I?`Edit ${I.label??I.name}`:`Edit form`}),(0,x.jsx)(h,{children:`Configure the public URL and what happens after submit.`})]}),(0,x.jsxs)(`div`,{className:`space-y-3`,children:[(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-slug`,children:`URL slug`}),(0,x.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(`span`,{className:`text-xs text-muted-foreground whitespace-nowrap`,children:`/console/f/`}),(0,x.jsx)(l,{id:`edit-slug`,value:R,onChange:e=>z(e.target.value)})]})]}),(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-behavior`,children:`After submit`}),(0,x.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:B,onChange:e=>V(e.target.value),children:[(0,x.jsx)(`option`,{value:`thank-you`,children:`Show a thank-you panel`}),(0,x.jsx)(`option`,{value:`redirect`,children:`Redirect to a URL`}),(0,x.jsx)(`option`,{value:`continue`,children:`Reset for another response`}),(0,x.jsx)(`option`,{value:`next-record`,children:`Advance to next record (internal queues)`})]})]}),B===`thank-you`&&(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-tytitle`,children:`Title`}),(0,x.jsx)(l,{id:`edit-tytitle`,placeholder:`Thanks!`,value:H,onChange:e=>U(e.target.value)})]}),(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-tymsg`,children:`Message`}),(0,x.jsx)(l,{id:`edit-tymsg`,placeholder:`Your submission has been received.`,value:W,onChange:e=>G(e.target.value)})]})]}),B===`redirect`&&(0,x.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,x.jsx)(m,{htmlFor:`edit-url`,children:`Redirect URL`}),(0,x.jsx)(l,{id:`edit-url`,type:`url`,placeholder:`https://example.com/thanks`,value:K,onChange:e=>q(e.target.value)})]})]}),(0,x.jsxs)(_,{children:[(0,x.jsx)(v,{variant:`ghost`,onClick:()=>F(!1),disabled:J,children:`Cancel`}),(0,x.jsx)(v,{onClick:Ce,disabled:J||!R,children:J?`Saving…`:`Save`})]})]})})]})}export{C as PublicFormsPage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{a as n,f as r,h as i,m as a,r as o,y as s}from"./vendor-react-DpRf6e0g.js";import{_ as c}from"./infrastructure-PXm1h5tB.js";import{N as l,P as u,bn as d}from"./framework-UESyszCj.js";import{Zc as f,_c as ee,ct as p,dt as m,nl as h,st as g,xs as _,zc as v,zr as y}from"./ui-components-BbC0qTrK.js";import{r as b}from"./vendor-ui-utils-CnzHPXVC.js";import"./AdapterProvider-
|
|
1
|
+
import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{a as n,f as r,h as i,m as a,r as o,y as s}from"./vendor-react-DpRf6e0g.js";import{_ as c}from"./infrastructure-PXm1h5tB.js";import{N as l,P as u,bn as d}from"./framework-UESyszCj.js";import{Zc as f,_c as ee,ct as p,dt as m,nl as h,st as g,xs as _,zc as v,zr as y}from"./ui-components-BbC0qTrK.js";import{r as b}from"./vendor-ui-utils-CnzHPXVC.js";import"./AdapterProvider-Bur-uZKZ.js";import{t as x}from"./plugin-form-D_JAwPGr.js";import"./MetadataProvider-D9fSVVZp.js";import{n as S,t as C}from"./ExpressionProvider-BQFSoabd.js";import{t as w}from"./ManagedByBadge-pdWk_Jcc.js";import{t as T}from"./skeletons-C8REUFE6.js";var E=t({RecordFormPage:()=>k}),D=e(s(),1),O=o();function k({mode:e}){let{appName:t,objectName:o,recordId:s}=a(),E=r(),[k]=i(),A=l(),{objects:j,loading:M}=u(),{t:N}=h(),{objectLabel:P}=f(),{user:F,getAuthConfig:I,activeOrganization:L}=c(),[R,z]=(0,D.useState)({});(0,D.useEffect)(()=>{let e=!1;return I().then(t=>{e||z(t?.features??{})}).catch(()=>{}),()=>{e=!0}},[I]);let B=(0,D.useMemo)(()=>{if(e!==`create`)return;let t=[];for(let[e,n]of k.entries())e&&n&&t.push([e,n]);return t.length>0?Object.fromEntries(t):void 0},[e,k.toString()]),V=(0,D.useMemo)(()=>j.find(e=>e.name===o),[j,o]),H=`/apps/${t}`,U=`${H}/${o}`,W=e===`edit`&&s?`${H}/${o}/record/${encodeURIComponent(s)}`:U,G=(0,D.useCallback)(()=>{typeof window<`u`&&window.history.length>1?E(-1):E(W,{replace:!0})},[E,W]),K=V?P(V):o??``,q=e===`create`?N(`form.createTitle`,{object:K,defaultValue:`New ${K}`}):N(`form.editTitle`,{object:K,defaultValue:`Edit ${K}`}),J=(0,D.useCallback)(()=>{b.success(e===`create`?N(`form.createSuccess`,{object:K,defaultValue:`${K} created successfully`}):N(`form.updateSuccess`,{object:K,defaultValue:`${K} updated successfully`})),G()},[e,N,K,G]),Y=(0,D.useCallback)(()=>{G()},[G]),X=(0,D.useMemo)(()=>F?{name:F.name,email:F.email,role:F.role??`user`,positions:F.positions??[]}:{name:`Anonymous`,email:``,role:`guest`,positions:[]},[F]),Z=(0,D.useMemo)(()=>new d({user:X,app:{name:t},data:{}}),[X,t]),Q=(0,D.useMemo)(()=>V?.fields?Array.isArray(V.fields)?V.fields.filter(e=>typeof e==`string`||S(e.visible,Z)).map(e=>typeof e==`string`?e:e.name):Object.entries(V.fields).filter(([,e])=>S(e.visible,Z)).map(([e])=>e):[],[V,Z]);if(M)return(0,O.jsx)(T,{});if(!V)return(0,O.jsx)(`div`,{className:`flex h-full items-center justify-center p-4`,children:(0,O.jsxs)(g,{children:[(0,O.jsx)(`div`,{className:`mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted`,children:(0,O.jsx)(_,{className:`h-6 w-6 text-muted-foreground`})}),(0,O.jsx)(m,{children:N(`empty.objectNotFound`)}),(0,O.jsx)(p,{children:N(`empty.objectNotFoundDescription`,{name:o})}),(0,O.jsx)(`div`,{className:`mt-4`,children:(0,O.jsxs)(y,{variant:`outline`,onClick:()=>E(H),children:[(0,O.jsx)(v,{className:`mr-2 h-4 w-4`}),N(`empty.back`)]})})]})});let $=V.form??V.formViews?.default??{},te=[`tabbed`,`wizard`,`split`].includes($.type)?$.type:`simple`,ne=Array.isArray($.sections)&&$.sections.length>0?{sections:$.sections,defaultTab:$.defaultTab,tabPosition:$.tabPosition,allowSkip:$.allowSkip,showStepIndicator:$.showStepIndicator,splitDirection:$.splitDirection,splitSize:$.splitSize,splitResizable:$.splitResizable}:{};return(0,O.jsx)(C,{user:X,app:{name:t},data:{},features:R,children:(0,O.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden bg-background`,"data-testid":`record-form-page`,"data-mode":e,children:[(0,O.jsxs)(`header`,{className:`sticky top-0 z-10 flex items-center gap-3 border-b bg-background px-4 py-3 sm:px-6`,children:[(0,O.jsx)(y,{variant:`ghost`,size:`sm`,onClick:G,"data-testid":`record-form-page-back`,"aria-label":N(`common.back`,{defaultValue:`Back`}),children:(0,O.jsx)(v,{className:`h-4 w-4`})}),(0,O.jsxs)(`nav`,{"aria-label":`Breadcrumb`,className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,O.jsx)(n,{to:U,className:`hover:text-foreground transition-colors`,children:K}),(0,O.jsx)(`span`,{"aria-hidden":`true`,children:`/`}),(0,O.jsx)(`span`,{className:`text-foreground font-medium`,"data-testid":`record-form-page-title`,children:q}),(0,O.jsx)(w,{managedBy:V?.managedBy,className:`ml-1`})]}),e===`create`&&R?.tenancyPosture===`group`&&L&&V?.fields?.organization_id&&(0,O.jsxs)(`span`,{className:`ml-auto inline-flex items-center gap-1.5 rounded-md border bg-muted/50 px-2 py-1 text-xs text-muted-foreground`,"data-testid":`record-form-write-target-org`,children:[(0,O.jsx)(ee,{className:`h-3.5 w-3.5 shrink-0`}),N(`form.createTargetOrg`,{org:L.name,defaultValue:`Creates in ${L.name}`})]})]}),(0,O.jsx)(`div`,{className:`flex-1 overflow-auto p-4 sm:p-6`,children:(0,O.jsx)(`div`,{className:`mx-auto max-w-4xl`,children:(0,O.jsx)(x,{schema:{type:`object-form`,formType:te,...ne,objectName:V.name,mode:e,recordId:e===`edit`?s:void 0,...B&&{initialValues:B},...$.buttons&&{buttons:$.buttons},...$.defaults&&{defaults:$.defaults},title:q,layout:`vertical`,fields:Q,subforms:V.form?.subforms??V.formViews?.default?.subforms,onSuccess:J,onCancel:Y,showSubmit:!0,showCancel:!0,submitText:N(`form.saveRecord`,{defaultValue:`Save`}),cancelText:N(`common.cancel`,{defaultValue:`Cancel`})},dataSource:A??void 0},`${e}:${o}:${s??`new`}`)})})]})})}export{E as t};
|