headroom-cms 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/admin/assets/{AdminsPage-Bt_ekZen.js → AdminsPage-BIWASote.js} +1 -1
  2. package/admin/assets/AllContentPage-1gXe2OC7.js +1 -0
  3. package/admin/assets/{ApiKeysPage-BfWCxGhC.js → ApiKeysPage-BBW4ATBx.js} +1 -1
  4. package/admin/assets/AuditPage-B5GGFWGG.js +1 -0
  5. package/admin/assets/BlockEditor-CQpF8tYb.css +1 -0
  6. package/admin/assets/BlockEditor-ClskiZoX.js +176 -0
  7. package/admin/assets/BlockTypeEditPage-CY0gCPei.js +1 -0
  8. package/admin/assets/BlockTypesPage-D8Me6OeX.js +1 -0
  9. package/admin/assets/{BulkActionBar-TRiXXLQd.js → BulkActionBar--35xjnOP.js} +1 -1
  10. package/admin/assets/CollectionEditPage-y8t0ZO89.js +1 -0
  11. package/admin/assets/{CollectionsPage-ClplrxNn.js → CollectionsPage-BQmGXpvW.js} +1 -1
  12. package/admin/assets/{ContentCreatePage-DfYcEH1u.js → ContentCreatePage-DlgxamOe.js} +1 -1
  13. package/admin/assets/ContentEditPage-WkSbCnnG.js +1 -0
  14. package/admin/assets/ContentField-D04Uo1Ov.js +1 -0
  15. package/admin/assets/ContentListPage-BDMx7pWb.js +1 -0
  16. package/admin/assets/CustomBlockPreview-Cs9bFDh4.js +479 -0
  17. package/admin/assets/FieldRenderer-wE-mtqZB.js +2 -0
  18. package/admin/assets/FilterBar-kFcOLffg.js +1 -0
  19. package/admin/assets/FloatingComposerController-D4uLQfUX-C0Lhbmda.js +1 -0
  20. package/admin/assets/IconPicker-BrgSAsa_.js +3 -0
  21. package/admin/assets/{LoginPage-DutieANA.js → LoginPage-Bi7TBzK4.js} +1 -1
  22. package/admin/assets/MediaField-B-Cz8TlK.js +1 -0
  23. package/admin/assets/MediaPage-C84p9d1U.js +1 -0
  24. package/admin/assets/Pagination-CuHwUPHi.js +1 -0
  25. package/admin/assets/RelationshipPicker-Dv7GaLcU.js +1 -0
  26. package/admin/assets/{SiteSettingsPage-BtCC3RKc.js → SiteSettingsPage-nBT7NzkA.js} +1 -1
  27. package/admin/assets/{SiteUserEditPage-ClHmp0T-.js → SiteUserEditPage-DroUTii9.js} +1 -1
  28. package/admin/assets/SiteUsersPage-iVXPCBPe.js +1 -0
  29. package/admin/assets/{SitesPage-Bw_WBN6v.js → SitesPage-BefZeWuJ.js} +1 -1
  30. package/admin/assets/{SubmissionDetailPage-DS08LGxd.js → SubmissionDetailPage-ktmzzOE1.js} +1 -1
  31. package/admin/assets/SubmissionEditPage-C-ykTI2t.js +1 -0
  32. package/admin/assets/SubmissionListPage-DA-8deUy.js +1 -0
  33. package/admin/assets/{TagInput-BILCaC9b.js → TagInput-d-Hw1fkL.js} +1 -1
  34. package/admin/assets/{TagsPage-DdeZokow.js → TagsPage-BZzDvcKa.js} +1 -1
  35. package/admin/assets/{UsersPage-B0vLxjrg.js → UsersPage-CnQAOOGF.js} +1 -1
  36. package/admin/assets/{WebhookEditPage-SlJE4d3z.js → WebhookEditPage-KeS8hmdW.js} +1 -1
  37. package/admin/assets/{WebhooksPage-C6lGZLpr.js → WebhooksPage-CASjmlPN.js} +1 -1
  38. package/admin/assets/{card-hXVtlM0q.js → card-CZTHR2Qa.js} +1 -1
  39. package/admin/assets/checkbox-DEgzM8H9.js +1 -0
  40. package/admin/assets/{collapsible-B414SspL.js → collapsible-D3d29uJp.js} +1 -1
  41. package/admin/assets/{command-fvBFHye4.js → command-CdzYw11U.js} +1 -1
  42. package/admin/assets/contentStatus-CkPi9Dh6.js +1 -0
  43. package/admin/assets/{core.esm-B_kcYf6n.js → core.esm-DdQHdRkd.js} +2 -2
  44. package/admin/assets/index-BA3y7HJs.js +18 -0
  45. package/admin/assets/index-c7UygSvP.css +1 -0
  46. package/admin/assets/popover-BFw_h3j6.js +1 -0
  47. package/admin/assets/radix-C5ZmWuuL.js +51 -0
  48. package/admin/assets/select-dX9e6VDt.js +1 -0
  49. package/admin/assets/{serializeToText-DR_WnxiI.js → serializeToText-Zin3gYPm.js} +1 -1
  50. package/admin/assets/{sortable.esm-QyXA6fio.js → sortable.esm-qVEMoaTg.js} +1 -1
  51. package/admin/assets/{table-DLoIbCQ5.js → table-Dk7eeOt2.js} +1 -1
  52. package/admin/assets/{textarea-vSXNxwTe.js → textarea-CpDSUg2s.js} +1 -1
  53. package/admin/assets/useAdminResolver-Bljb4XGQ.js +1 -0
  54. package/admin/assets/useContent-CW0tm0FY.js +1 -0
  55. package/admin/assets/useContentSearch-_bwacEth.js +1 -0
  56. package/admin/assets/{useMedia-e3sqWm_t.js → useMedia-Cu5N4rY8.js} +1 -1
  57. package/admin/assets/usePageTitle-DYvuJQp6.js +1 -0
  58. package/admin/assets/useSiteUsers-CKtC_8Jc.js +1 -0
  59. package/admin/assets/{useTags-f7AVSLuj.js → useTags-ybsMbCst.js} +1 -1
  60. package/admin/assets/{useWebhooks-BH_r8-Mo.js → useWebhooks-BAB-3sLa.js} +1 -1
  61. package/admin/assets/yjs-tXBm_srz.js +5 -0
  62. package/admin/index.html +3 -3
  63. package/admin/sw.js +1 -1
  64. package/dist/admin-site.d.ts +12 -0
  65. package/dist/admin-site.d.ts.map +1 -1
  66. package/dist/admin-site.js +8 -1
  67. package/dist/admin-site.js.map +1 -1
  68. package/dist/api.d.ts +7 -0
  69. package/dist/api.d.ts.map +1 -1
  70. package/dist/api.js +8 -1
  71. package/dist/api.js.map +1 -1
  72. package/dist/collaboration.d.ts +55 -0
  73. package/dist/collaboration.d.ts.map +1 -0
  74. package/dist/collaboration.js +141 -0
  75. package/dist/collaboration.js.map +1 -0
  76. package/dist/index.d.ts +12 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +29 -4
  79. package/dist/index.js.map +1 -1
  80. package/dist/storage.d.ts +2 -0
  81. package/dist/storage.d.ts.map +1 -1
  82. package/dist/storage.js +33 -0
  83. package/dist/storage.js.map +1 -1
  84. package/lambda/api/bootstrap +0 -0
  85. package/lambda/webhook-worker/bootstrap +0 -0
  86. package/package.json +1 -1
  87. package/src/admin-site.ts +20 -1
  88. package/src/api.ts +15 -1
  89. package/src/collaboration.ts +187 -0
  90. package/src/index.ts +44 -4
  91. package/src/sst-env.d.ts +28 -0
  92. package/src/storage.ts +35 -0
  93. package/admin/assets/AllContentPage-CFqEMAl9.js +0 -1
  94. package/admin/assets/AuditPage-BE0XIUl2.js +0 -1
  95. package/admin/assets/BlockEditor-6wqsThJ7.js +0 -179
  96. package/admin/assets/BlockEditor-Cp_wZ2xN.css +0 -1
  97. package/admin/assets/BlockTypeEditPage-CuNJfZw0.js +0 -1
  98. package/admin/assets/BlockTypesPage-BIMBVxBs.js +0 -1
  99. package/admin/assets/CollectionEditPage-BqX_0cC2.js +0 -1
  100. package/admin/assets/ContentEditPage-D3Rvlktk.js +0 -2
  101. package/admin/assets/ContentListPage-zmO8Is4d.js +0 -1
  102. package/admin/assets/CustomBlockPreview-C6HqS4xv.js +0 -479
  103. package/admin/assets/FieldBuilder-36tfpSyM.js +0 -3
  104. package/admin/assets/FilterBar-DhRwTqFv.js +0 -1
  105. package/admin/assets/MediaField-J2TLG_fu.js +0 -1
  106. package/admin/assets/MediaPage-DZZKMGF4.js +0 -1
  107. package/admin/assets/RelationshipPicker-CDFs4TMW.js +0 -1
  108. package/admin/assets/SiteUsersPage-AyJvcVM7.js +0 -1
  109. package/admin/assets/SubmissionEditPage-Brf-DK2X.js +0 -1
  110. package/admin/assets/SubmissionListPage-DNMzQZHS.js +0 -1
  111. package/admin/assets/checkbox-WGrS3sUr.js +0 -1
  112. package/admin/assets/contentStatus-BmaiYVOm.js +0 -1
  113. package/admin/assets/index-Cir9tY_P.js +0 -18
  114. package/admin/assets/index-DACBYsKM.css +0 -1
  115. package/admin/assets/popover-D5_HjjUC.js +0 -1
  116. package/admin/assets/radix-C1kb_NqW.js +0 -51
  117. package/admin/assets/select-_uJYxzeZ.js +0 -1
  118. package/admin/assets/useAdminResolver-D-LlmquD.js +0 -1
  119. package/admin/assets/useContent-e8beBIuq.js +0 -1
  120. package/admin/assets/useContentSearch-DOjveB9t.js +0 -1
  121. package/admin/assets/useDebouncedValue-C-cQUcLG.js +0 -1
  122. package/admin/assets/usePageTitle-BNSba9_L.js +0 -1
  123. package/admin/assets/useSiteUsers-BdnvuM2E.js +0 -1
@@ -0,0 +1 @@
1
+ import{j as e}from"./tanstack-Bs3zYPPV.js";import{u as R,f as U,r as o}from"./react-vendor-C2CvUxFh.js";import{W as b,aF as V,S as T,aG as G,aH as W,aI as z,x as J,L as u,I as K,a0 as B,B as x,a as Q,D as X,i as Y,T as Z,k as ee,l as se,m as te,n as ae,o as ie,v as h}from"./index-BA3y7HJs.js";import{I as ne,a as re,F as le}from"./IconPicker-BrgSAsa_.js";import{i as oe}from"./format-C88SDH8g.js";import{T as ce}from"./textarea-CpDSUg2s.js";import{C as de,a as me,b as pe,c as ue}from"./card-CZTHR2Qa.js";import{C as $,a as D,b as F}from"./collapsible-D3d29uJp.js";import{C as xe}from"./CustomBlockPreview-Cs9bFDh4.js";import{F as he}from"./FieldRenderer-wE-mtqZB.js";import{u as N}from"./useContentSearch-_bwacEth.js";import{u as je}from"./usePageTitle-DYvuJQp6.js";import"./radix-C5ZmWuuL.js";import"./core.esm-DdQHdRkd.js";import"./sortable.esm-qVEMoaTg.js";import"./select-dX9e6VDt.js";import"./checkbox-DEgzM8H9.js";import"./popover-BFw_h3j6.js";import"./media-url-DIg_vSyf.js";import"./MediaField-B-Cz8TlK.js";import"./useMedia-Cu5N4rY8.js";import"./ContentField-D04Uo1Ov.js";import"./command-CdzYw11U.js";function fe({fields:a,previewTemplate:s,previewData:t,onPreviewDataChange:i,blockTypeName:l,blockTypeLabel:d,blockTypeIcon:v}){const n=N(s,300),g=N(t,300);return e.jsxs("div",{className:"space-y-4",children:[e.jsx(he,{fields:a,values:t,onChange:i}),e.jsx(b,{}),e.jsx("div",{className:"overflow-hidden rounded-md border p-4",children:e.jsx(xe,{blockType:{name:l,label:d,icon:v,fields:a,previewTemplate:n},props:g,blocksToHTML:()=>""})})]})}function Ue(){const{host:a,name:s}=R(),t=s==="new",{data:i,isLoading:l}=V(a,t?"":s);return!t&&l?e.jsxs("div",{className:"space-y-4",children:[e.jsx(T,{className:"h-8 w-64"}),e.jsx(T,{className:"h-64 w-full"})]}):t?e.jsx(C,{host:a,isNew:!0}):i?e.jsx(C,{host:a,isNew:!1,blockType:i},i.name):e.jsx("p",{className:"text-muted-foreground",children:"Block type not found."})}function C({host:a,isNew:s,blockType:t}){const i=U(),l=G(a),d=W(a,t?.name??""),v=z(a,t?.name??""),[n,g]=o.useState(t?.name??""),[j,y]=o.useState(t?.label??""),[f,P]=o.useState(t?.icon??""),[S,L]=o.useState(!s),I=new Set((t?.fields??[]).map(r=>r.name).filter(Boolean)),[c,E]=o.useState(t?.fields??[]),[m,O]=o.useState(t?.previewTemplate??""),[p,q]=o.useState(t?.previewData??{}),[H,w]=o.useState(!1),_=J();je({title:s?"New Block Type":t?.label??n,showBack:!0,backTo:`/sites/${a}/settings/block-types`});async function A(r){r.preventDefault();try{s?(await l.mutateAsync({name:n,label:j,icon:f,fields:c,previewTemplate:m||void 0,previewData:Object.keys(p).length>0?p:void 0}),h.success("Block type created"),i(`/sites/${a}/settings/block-types/${n}`)):(await d.mutateAsync({label:j,icon:f,fields:c,previewTemplate:m||void 0,previewData:Object.keys(p).length>0?p:void 0}),h.success("Block type updated"))}catch(k){h.error(s?"Failed to create":"Failed to update",{description:k instanceof Error?k.message:void 0})}}async function M(){try{await v.mutateAsync(),h.success("Block type deleted"),i(`/sites/${a}/settings/block-types`)}catch(r){h.error("Failed to delete",{description:r instanceof Error?r.message:void 0})}}return e.jsxs("div",{className:"mx-auto max-w-2xl",children:[!_&&e.jsx("h1",{className:"mb-6 text-2xl font-semibold",children:s?"New Block Type":`Edit: ${t?.label??n}`}),e.jsxs(de,{children:[e.jsx(me,{children:e.jsx(pe,{children:"Block Type Settings"})}),e.jsx(ue,{children:e.jsxs("form",{onSubmit:A,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(u,{htmlFor:"name",children:"Name"}),e.jsx(ne,{id:"name",value:n,onChange:g,onBlur:()=>{n&&!S&&y(oe(n))},readOnly:!s,placeholder:"e.g. hero_banner",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(u,{htmlFor:"label",children:"Label"}),e.jsx(K,{id:"label",value:j,onChange:r=>{y(r.target.value),L(!0)},required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(u,{children:"Icon"}),e.jsx(re,{value:f,onChange:P})]}),e.jsx(b,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(u,{children:"Block Fields"}),e.jsx(le,{fields:c,onChange:E,existingFieldNames:I})]}),e.jsx(b,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(u,{htmlFor:"preview-template",children:"Preview Template (Liquid + Tailwind)"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Optional. Use Liquid syntax to render a preview. Tailwind utility classes are supported."}),e.jsx(ce,{id:"preview-template",value:m,onChange:r=>O(r.target.value),rows:6,placeholder:'<div class="p-4">{{ title }}</div>',className:"font-mono text-sm"}),c.length>0&&e.jsx(ge,{fields:c})]}),(m||c.length>0)&&e.jsxs($,{children:[e.jsxs(D,{className:"flex w-full items-center gap-2 text-sm font-medium",children:[e.jsx(B,{className:"h-4 w-4 transition-transform [[data-state=open]>&]:rotate-90"}),"Preview"]}),e.jsx(F,{className:"mt-2",children:e.jsx(fe,{fields:c,previewTemplate:m,previewData:p,onPreviewDataChange:q,blockTypeName:n,blockTypeLabel:j,blockTypeIcon:f})})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(x,{type:"submit",disabled:l.isPending||d.isPending,children:[(l.isPending||d.isPending)&&e.jsx(Q,{className:"mr-2 h-4 w-4 animate-spin"}),s?"Create":"Save"]}),e.jsx(x,{type:"button",variant:"outline",onClick:()=>i(`/sites/${a}/settings/block-types`),children:"Cancel"})]})]})})]}),!s&&e.jsx("div",{className:"mt-6",children:e.jsxs(X,{open:H,onOpenChange:w,children:[e.jsx(Y,{asChild:!0,children:e.jsxs(x,{variant:"destructive",children:[e.jsx(Z,{className:"mr-2 h-4 w-4"}),"Delete Block Type"]})}),e.jsxs(ee,{children:[e.jsxs(se,{children:[e.jsx(te,{children:"Delete block type?"}),e.jsx(ae,{children:"This will permanently delete this block type."})]}),e.jsxs(ie,{children:[e.jsx(x,{variant:"outline",onClick:()=>w(!1),children:"Cancel"}),e.jsx(x,{variant:"destructive",onClick:M,children:"Delete"})]})]})]})})]})}function ve(a){const s=a.name;switch(a.type){case"media":return`{{ ${s}.url | media_url }} {{ ${s}.alt }} {{ ${s}.width }}`;case"content":return`{{ ${s}.title }} {{ ${s}.id }}`;case"boolean":return`{% if ${s} %}...{% endif %}`;case"array":{const t=a.options?.itemFields;if(t&&t.length>0){const i=t.map(l=>`item.${l.name}`).join(" }} {{ ");return`{% for item in ${s} %}{{ ${i} }}{% endfor %}`}return`{% for item in ${s} %}{{ item }}{% endfor %}`}case"select":return a.options?.multiple?`{% for item in ${s} %}{{ item }}{% endfor %}`:`{{ ${s} }}`;case"container":{const t=a.options?.fields;return t&&t.length>0?t.map(i=>`{{ ${s}.${i.name} }}`).join(" "):`{{ ${s}.fieldName }}`}case"blocks":return`{{ ${s} | blocks_html }} or {{ ${s} | blocks_text }}`;default:return`{{ ${s} }}`}}function ge({fields:a}){return e.jsxs($,{children:[e.jsxs(D,{className:"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground",children:[e.jsx(B,{className:"h-3 w-3 transition-transform [[data-state=open]>&]:rotate-90"}),"Template variables"]}),e.jsx(F,{children:e.jsx("div",{className:"mt-1 rounded-md border bg-muted/50 p-2 font-mono text-xs space-y-0.5",children:a.map(s=>e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("span",{className:"text-muted-foreground shrink-0",children:[s.label,":"]}),e.jsx("code",{children:ve(s)})]},s.name))})})]})}export{Ue as BlockTypeEditPage};
@@ -0,0 +1 @@
1
+ import{j as s}from"./tanstack-Bs3zYPPV.js";import{u as h,f as j}from"./react-vendor-C2CvUxFh.js";import{aD as p,x as u,B as c,P as o,S as f,aE as N}from"./index-BA3y7HJs.js";import{T as g,a as y,b as r,c as l,d as k,e as n}from"./table-Dk7eeOt2.js";import{u as T}from"./usePageTitle-DYvuJQp6.js";import"./radix-C5ZmWuuL.js";function $(){const{host:a}=h(),i=j(),{data:t,isLoading:m}=p(a),d=u();return T({title:"Block Types",actions:s.jsx(c,{size:"sm",onClick:()=>i(`/sites/${a}/settings/block-types/new`),children:s.jsx(o,{className:"h-4 w-4"})})}),s.jsxs("div",{children:[!d&&s.jsxs("div",{className:"mb-6 flex items-center justify-between",children:[s.jsx("h1",{className:"text-2xl font-semibold",children:"Block Types"}),s.jsxs(c,{onClick:()=>i(`/sites/${a}/settings/block-types/new`),children:[s.jsx(o,{className:"mr-2 h-4 w-4"}),"New Block Type"]})]}),m?s.jsx("div",{className:"space-y-2",children:Array.from({length:3}).map((e,x)=>s.jsx(f,{className:"h-12 w-full"},x))}):t?.items.length?s.jsxs(g,{children:[s.jsx(y,{children:s.jsxs(r,{children:[s.jsx(l,{children:"Name"}),s.jsx(l,{children:"Label"}),s.jsx(l,{children:"Icon"}),s.jsx(l,{children:"Fields"})]})}),s.jsx(k,{children:t.items.map(e=>s.jsxs(r,{className:"cursor-pointer",onClick:()=>i(`/sites/${a}/settings/block-types/${e.name}`),children:[s.jsx(n,{className:"font-mono text-sm",children:e.name}),s.jsx(n,{children:e.label}),s.jsx(n,{children:e.icon?s.jsx(N,{name:e.icon,className:"h-4 w-4 text-muted-foreground"}):s.jsx("span",{className:"text-muted-foreground",children:"—"})}),s.jsx(n,{className:"text-muted-foreground",children:e.fields?.length??0})]},e.name))})]}):s.jsx("p",{className:"text-muted-foreground",children:"No block types defined."})]})}export{$ as BlockTypesPage};
@@ -1 +1 @@
1
- import{j as e}from"./tanstack-Bs3zYPPV.js";import{r as m}from"./react-vendor-C2CvUxFh.js";import{B as a,a as t,X as x,D as h,k as j,l as p,m as u,n as D,o as b}from"./index-Cir9tY_P.js";function k({selectedCount:i,onPublish:n,onUnpublish:r,onDelete:o,onClear:c,isPending:s}){const[d,l]=m.useState(!1);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-4 flex items-center gap-3 rounded-md border bg-muted/50 px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium",children:[i," selected"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(a,{size:"sm",variant:"outline",onClick:n,disabled:s,children:[s&&e.jsx(t,{className:"mr-1 h-3 w-3 animate-spin"}),"Publish"]}),e.jsx(a,{size:"sm",variant:"outline",onClick:r,disabled:s,children:"Unpublish"}),e.jsx(a,{size:"sm",variant:"destructive",onClick:()=>l(!0),disabled:s,children:"Delete"})]}),e.jsx(a,{size:"sm",variant:"ghost",onClick:c,className:"ml-auto",disabled:s,children:e.jsx(x,{className:"h-4 w-4"})})]}),e.jsx(h,{open:d,onOpenChange:l,children:e.jsxs(j,{children:[e.jsxs(p,{children:[e.jsxs(u,{children:["Delete ",i," item",i!==1?"s":"","?"]}),e.jsx(D,{children:"This action cannot be undone. The selected content items will be permanently deleted."})]}),e.jsxs(b,{children:[e.jsx(a,{variant:"outline",onClick:()=>l(!1),children:"Cancel"}),e.jsxs(a,{variant:"destructive",onClick:async()=>{l(!1),await o()},disabled:s,children:[s&&e.jsx(t,{className:"mr-1 h-3 w-3 animate-spin"}),"Delete"]})]})]})})]})}export{k as B};
1
+ import{j as e}from"./tanstack-Bs3zYPPV.js";import{r as m}from"./react-vendor-C2CvUxFh.js";import{B as a,a as t,X as x,D as h,k as j,l as p,m as u,n as D,o as b}from"./index-BA3y7HJs.js";function k({selectedCount:i,onPublish:n,onUnpublish:r,onDelete:o,onClear:c,isPending:s}){const[d,l]=m.useState(!1);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-4 flex items-center gap-3 rounded-md border bg-muted/50 px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium",children:[i," selected"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(a,{size:"sm",variant:"outline",onClick:n,disabled:s,children:[s&&e.jsx(t,{className:"mr-1 h-3 w-3 animate-spin"}),"Publish"]}),e.jsx(a,{size:"sm",variant:"outline",onClick:r,disabled:s,children:"Unpublish"}),e.jsx(a,{size:"sm",variant:"destructive",onClick:()=>l(!0),disabled:s,children:"Delete"})]}),e.jsx(a,{size:"sm",variant:"ghost",onClick:c,className:"ml-auto",disabled:s,children:e.jsx(x,{className:"h-4 w-4"})})]}),e.jsx(h,{open:d,onOpenChange:l,children:e.jsxs(j,{children:[e.jsxs(p,{children:[e.jsxs(u,{children:["Delete ",i," item",i!==1?"s":"","?"]}),e.jsx(D,{children:"This action cannot be undone. The selected content items will be permanently deleted."})]}),e.jsxs(b,{children:[e.jsx(a,{variant:"outline",onClick:()=>l(!1),children:"Cancel"}),e.jsxs(a,{variant:"destructive",onClick:async()=>{l(!1),await o()},disabled:s,children:[s&&e.jsx(t,{className:"mr-1 h-3 w-3 animate-spin"}),"Delete"]})]})]})})]})}export{k as B};
@@ -0,0 +1 @@
1
+ import{j as e}from"./tanstack-Bs3zYPPV.js";import{r,u as je,f as be}from"./react-vendor-C2CvUxFh.js";import{ai as pe,a0 as fe,y as ve,ax as Ce,B as N,T as K,I as L,P as Se,ay as Ne,S as U,x as ye,w as ke,az as De,aA as Ee,aB as Pe,L as m,aC as Ie,W as z,a as Fe,D as Le,i as Re,k as Te,l as Ae,m as Be,n as we,o as Oe,v as P}from"./index-BA3y7HJs.js";import{I as Q,F as qe,a as $e}from"./IconPicker-BrgSAsa_.js";import{i as Z,c as Me}from"./format-C88SDH8g.js";import{C as O}from"./checkbox-DEgzM8H9.js";import{C as W,a as Y,b as G,c as X}from"./card-CZTHR2Qa.js";import{u as _e}from"./usePageTitle-DYvuJQp6.js";import{S as q,a as $,b as M,c as _,d as g}from"./select-dX9e6VDt.js";import{C as Ve,b as He,c as Ue,P as ze,D as We,e as Ye}from"./core.esm-DdQHdRkd.js";import{u as Ge,S as Xe,v as Je,a as Ke}from"./sortable.esm-qVEMoaTg.js";import{C as Qe,a as Ze,b as es}from"./collapsible-D3d29uJp.js";import"./radix-C5ZmWuuL.js";import"./textarea-CpDSUg2s.js";import"./popover-BFw_h3j6.js";function ss({id:l,relationship:s,onChange:a,onRemove:u,collections:j,readOnlyName:p,defaultExpanded:f}){const[b,k]=r.useState(f??!1),[d,D]=r.useState(!!s.label),{attributes:v,listeners:o,setNodeRef:i,transform:c,transition:C}=Ge({id:l}),y={transform:Ve.Transform.toString(c),transition:C};function x(n){a({...s,...n})}const I=j.find(n=>n.name===s.targetCollection)?.label??s.targetCollection;return e.jsx("div",{ref:i,style:y,className:"rounded-md border bg-card",children:e.jsxs(Qe,{open:b,onOpenChange:k,children:[e.jsxs("div",{className:"flex items-center gap-2 p-2",children:[e.jsx("button",{type:"button",className:"cursor-grab touch-none text-muted-foreground hover:text-foreground",...v,...o,children:e.jsx(pe,{className:"h-4 w-4"})}),e.jsx(Ze,{asChild:!0,children:e.jsx("button",{type:"button",className:"flex items-center",children:e.jsx(fe,{className:ve("h-4 w-4 transition-transform",b&&"rotate-90")})})}),e.jsx("span",{className:"min-w-[80px] text-sm font-mono",children:s.name||"unnamed"}),e.jsx(Ce,{className:"h-3 w-3 text-muted-foreground"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:I}),e.jsx("span",{className:"flex-1 truncate text-sm text-muted-foreground",children:s.label}),e.jsx(N,{type:"button",variant:"ghost",size:"sm",onClick:u,className:"text-destructive",children:e.jsx(K,{className:"h-3 w-3"})})]}),e.jsx(es,{children:e.jsxs("div",{className:"space-y-3 border-t p-3",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs text-muted-foreground",children:"Name"}),e.jsx(Q,{value:s.name,onChange:n=>x({name:n}),onBlur:()=>{s.name&&!d&&x({label:Z(s.name)})},readOnly:p,className:"h-8 text-sm"})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs text-muted-foreground",children:"Label"}),e.jsx(L,{value:s.label,onChange:n=>{x({label:n.target.value}),D(!0)},className:"h-8 text-sm"})]})]}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("label",{className:"text-xs text-muted-foreground",children:"Target Collection"}),e.jsxs(q,{value:s.targetCollection,onValueChange:n=>x({targetCollection:n}),children:[e.jsx($,{className:"h-8 text-sm",children:e.jsx(M,{placeholder:"Select collection..."})}),e.jsx(_,{children:j.map(n=>e.jsx(g,{value:n.name,children:n.label},n.name))})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(O,{id:`${l}-multiple`,checked:s.multiple,onCheckedChange:n=>x({multiple:!!n})}),e.jsx("label",{htmlFor:`${l}-multiple`,className:"text-sm",children:"Allow multiple"})]})]})})]})})}function ts({relationships:l,onChange:s,collections:a,existingRelNames:u}){const j=He(Ue(ze)),p=l.map((o,i)=>`rel-${i}`),[f,b]=r.useState(null);function k(){b(l.length),s([...l,{name:"",label:"",targetCollection:"",multiple:!1}])}function d(o,i){const c=[...l];c[o]=i,s(c)}function D(o){s(l.filter((i,c)=>c!==o))}function v(o){const{active:i,over:c}=o;if(c&&i.id!==c.id){const C=p.indexOf(String(i.id)),y=p.indexOf(String(c.id));s(Ke(l,C,y))}}return e.jsx(We,{sensors:j,collisionDetection:Ye,onDragEnd:v,children:e.jsx(Xe,{items:p,strategy:Je,children:e.jsxs("div",{className:"space-y-2",children:[l.map((o,i)=>e.jsx(ss,{id:`rel-${i}`,relationship:o,onChange:c=>d(i,c),onRemove:()=>D(i),collections:a,readOnlyName:!!(u?.has(o.name)&&o.name),defaultExpanded:i===f},`rel-${i}`)),e.jsxs(N,{type:"button",variant:"outline",size:"sm",onClick:k,children:[e.jsx(Se,{className:"mr-2 h-3 w-3"})," Add Relationship"]})]})})})}const as=["text","textarea","number","boolean","select","array"],ls=["url","email","date","content","blocks"];function vs(){const{host:l,name:s}=je(),a=s==="new",{data:u,isLoading:j}=Ne(l,a?"":s);return!a&&j?e.jsxs("div",{className:"space-y-4",children:[e.jsx(U,{className:"h-8 w-64"}),e.jsx(U,{className:"h-64 w-full"})]}):a?e.jsx(J,{host:l,isNew:!0}):u?e.jsx(J,{host:l,isNew:!1,collection:u},u.name):e.jsx("p",{className:"text-muted-foreground",children:"Collection not found."})}function J({host:l,isNew:s,collection:a}){const u=be(),j=ye(),{collections:p}=ke(),f=De(l),b=Ee(l,a?.name??""),k=Pe(l,a?.name??""),[d,D]=r.useState(a?.name??""),[v,o]=r.useState(a?.label??""),[i,c]=r.useState(a?.labelSingular??""),[C,y]=r.useState(a?.slug??""),[x,I]=r.useState(a?.singleton??!1),[n,ee]=r.useState(a?.mode??"content"),[R,se]=r.useState(a?.requireAuth??!1),h=n==="submission",[te,ae]=r.useState(!s),[le,ne]=r.useState(!s),[ie,re]=r.useState(!s),oe=new Set((a?.fields??[]).map(t=>t.name).filter(Boolean)),T=[{name:"blocks",label:"Blocks",type:"blocks",options:{}}],[E,F]=r.useState(a?.fields??(s&&!x?T:[])),[A,ce]=r.useState(a?.relationships??[]),de=new Set((a?.relationships??[]).map(t=>t.name).filter(Boolean)),[B,ue]=r.useState(a?.mobileNavPriority??0),[w,me]=r.useState(a?.icon??""),[xe,V]=r.useState(!1);_e({title:s?"New Collection":a?.label??d,showBack:!0,backTo:`/sites/${l}/settings/collections`});function he(){if(!d)return;const t=Z(d);te||o(t),le||c(Me(t)),ie||y(d.replace(/_/g,"-"))}async function H(t){t?.preventDefault();try{s?(await f.mutateAsync({name:d,label:v,labelSingular:i,slug:C,singleton:h?!1:x,fields:E,relationships:A,mobileNavPriority:B,icon:w,mode:n,requireAuth:h?R:void 0}),P.success("Collection created"),u(`/sites/${l}/settings/collections/${d}`)):(await b.mutateAsync({label:v,labelSingular:i,slug:h?void 0:C,singleton:h?!1:x,fields:E,relationships:A,mobileNavPriority:B,icon:w,mode:n,requireAuth:h?R:void 0}),P.success("Collection updated"))}catch(S){P.error(s?"Failed to create":"Failed to update",{description:S instanceof Error?S.message:void 0})}}async function ge(){try{await k.mutateAsync(),P.success("Collection deleted"),u(`/sites/${l}/settings/collections`)}catch(t){P.error("Failed to delete",{description:t instanceof Error?t.message:void 0})}}return e.jsxs("div",{className:"mx-auto max-w-2xl",children:[!j&&e.jsx("h1",{className:"mb-6 text-2xl font-semibold",children:s?"New Collection":`Edit: ${a?.label??d}`}),e.jsxs(W,{children:[e.jsx(Y,{children:e.jsx(G,{children:"Collection Settings"})}),e.jsx(X,{children:e.jsxs("form",{onSubmit:H,className:"space-y-4","aria-label":"Collection settings",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{htmlFor:"name",children:"Name"}),e.jsx(Q,{id:"name",value:d,onChange:D,onBlur:he,readOnly:!s,placeholder:"e.g. blog_posts",required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{htmlFor:"mode",children:"Mode"}),e.jsxs(q,{value:n,onValueChange:t=>{ee(t),t==="submission"&&s&&(I(!1),F(E.filter(S=>as.includes(S.type)))),t==="content"&&s&&E.length===0&&F(T)},disabled:!s,children:[e.jsx($,{id:"mode",children:e.jsx(M,{})}),e.jsxs(_,{children:[e.jsx(g,{value:"content",children:"Content"}),e.jsx(g,{value:"submission",children:"Submissions"})]})]}),!s&&e.jsx("p",{className:"text-xs text-muted-foreground",children:"Mode cannot be changed after creation."})]}),h&&e.jsx("div",{className:"rounded-md border border-blue-200 bg-blue-50 p-3 text-sm text-blue-800 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-200",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx(Ie,{className:"mt-0.5 h-4 w-4 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium",children:"Submission Collection"}),e.jsxs("p",{className:"mt-1",children:["Submissions are created via the API:"," ",e.jsxs("code",{className:"rounded bg-blue-100 px-1 dark:bg-blue-900",children:["POST /v1/","{site}","/submit/",d||"{collection}"]})]})]})]})}),h&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(O,{id:"requireAuth",checked:R,onCheckedChange:t=>se(!!t)}),e.jsx(m,{htmlFor:"requireAuth",children:"Require authentication (site users must be logged in to submit)"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{htmlFor:"label",children:"Label"}),e.jsx(L,{id:"label",value:v,onChange:t=>{o(t.target.value),ae(!0)},required:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{htmlFor:"label-singular",children:"Label Singular"}),e.jsx(L,{id:"label-singular",value:i,onChange:t=>{c(t.target.value),ne(!0)},required:!0})]}),!h&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{htmlFor:"slug",children:"Slug"}),e.jsx(L,{id:"slug",value:C,onChange:t=>{y(t.target.value),re(!0)},required:!0})]}),!h&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(O,{id:"singleton",checked:x,onCheckedChange:t=>{const S=!!t;I(S),s&&F(S?[]:T)},disabled:!s}),e.jsx(m,{htmlFor:"singleton",children:"Singleton (single entry, no list)"})]}),e.jsx(z,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{children:"Fields"}),e.jsx(qe,{fields:E,onChange:F,excludeTypes:h?ls:void 0,existingFieldNames:oe})]}),e.jsx(z,{}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{children:"Relationships"}),e.jsx(ts,{relationships:A,onChange:ce,collections:p,existingRelNames:de})]})]})})]}),e.jsxs(W,{className:"mt-6",children:[e.jsx(Y,{children:e.jsx(G,{children:"Navigation"})}),e.jsxs(X,{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{children:"Icon"}),e.jsx($e,{value:w,onChange:me})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(m,{htmlFor:"mobileNavPriority",children:"Bottom Nav Priority"}),e.jsxs(q,{value:String(B),onValueChange:t=>ue(Number(t)),children:[e.jsx($,{id:"mobileNavPriority",children:e.jsx(M,{})}),e.jsxs(_,{children:[e.jsx(g,{value:"0",children:"0 - Hidden"}),e.jsx(g,{value:"1",children:"1"}),e.jsx(g,{value:"2",children:"2"}),e.jsx(g,{value:"3",children:"3"}),e.jsx(g,{value:"4",children:"4"}),e.jsx(g,{value:"5",children:"5 - Highest"})]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Collections with priority > 0 appear in the mobile bottom navigation bar."})]})]})]}),e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(N,{type:"button",variant:"outline",onClick:()=>u(`/sites/${l}/settings/collections`),children:"Cancel"}),e.jsxs(N,{onClick:H,disabled:f.isPending||b.isPending,children:[(f.isPending||b.isPending)&&e.jsx(Fe,{className:"mr-2 h-4 w-4 animate-spin"}),s?"Create":"Save"]})]}),!s&&e.jsx("div",{className:"mt-6",children:e.jsxs(Le,{open:xe,onOpenChange:V,children:[e.jsx(Re,{asChild:!0,children:e.jsxs(N,{variant:"destructive",children:[e.jsx(K,{className:"mr-2 h-4 w-4"}),"Delete Collection"]})}),e.jsxs(Te,{children:[e.jsxs(Ae,{children:[e.jsx(Be,{children:"Delete collection?"}),e.jsx(we,{children:"This will permanently delete the collection and all its content."})]}),e.jsxs(Oe,{children:[e.jsx(N,{variant:"outline",onClick:()=>V(!1),children:"Cancel"}),e.jsx(N,{variant:"destructive",onClick:ge,children:"Delete"})]})]})]})})]})}export{vs as CollectionEditPage};
@@ -1 +1 @@
1
- import{j as e}from"./tanstack-Bs3zYPPV.js";import{u as j,f as u}from"./react-vendor-C2CvUxFh.js";import{ar as f,x as g,B as o,P as c,S as b,j as r}from"./index-Cir9tY_P.js";import{T as p,a as N,b as d,c as i,d as C,e as n}from"./table-DLoIbCQ5.js";import{u as T}from"./usePageTitle-BNSba9_L.js";import"./radix-C1kb_NqW.js";function $(){const{host:l}=j(),a=u(),{data:t,isLoading:m}=f(l),x=g();return T({title:"Collections",actions:e.jsx(o,{size:"sm",onClick:()=>a(`/sites/${l}/settings/collections/new`),children:e.jsx(c,{className:"h-4 w-4"})})}),e.jsxs("div",{children:[!x&&e.jsxs("div",{className:"mb-6 flex items-center justify-between",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Collections"}),e.jsxs(o,{onClick:()=>a(`/sites/${l}/settings/collections/new`),children:[e.jsx(c,{className:"mr-2 h-4 w-4"}),"New Collection"]})]}),m?e.jsx("div",{className:"space-y-2",children:Array.from({length:3}).map((s,h)=>e.jsx(b,{className:"h-12 w-full"},h))}):t?.items.length?e.jsxs(p,{children:[e.jsx(N,{children:e.jsxs(d,{children:[e.jsx(i,{children:"Name"}),e.jsx(i,{children:"Label"}),e.jsx(i,{children:"Type"}),e.jsx(i,{children:"Fields"})]})}),e.jsx(C,{children:t.items.map(s=>e.jsxs(d,{className:"cursor-pointer",onClick:()=>a(`/sites/${l}/settings/collections/${s.name}`),children:[e.jsx(n,{className:"font-mono text-sm",children:s.name}),e.jsx(n,{children:s.label}),e.jsx(n,{children:s.singleton?e.jsx(r,{variant:"secondary",children:"Singleton"}):e.jsx(r,{variant:"outline",children:"Collection"})}),e.jsx(n,{className:"text-muted-foreground",children:s.fields?.length??0})]},s.name))})]}):e.jsx("p",{className:"text-muted-foreground",children:"No collections defined."})]})}export{$ as CollectionsPage};
1
+ import{j as e}from"./tanstack-Bs3zYPPV.js";import{u as j,f as u}from"./react-vendor-C2CvUxFh.js";import{aw as f,x as g,B as o,P as c,S as b,j as r}from"./index-BA3y7HJs.js";import{T as p,a as N,b as d,c as i,d as C,e as n}from"./table-Dk7eeOt2.js";import{u as w}from"./usePageTitle-DYvuJQp6.js";import"./radix-C5ZmWuuL.js";function $(){const{host:l}=j(),a=u(),{data:t,isLoading:m}=f(l),x=g();return w({title:"Collections",actions:e.jsx(o,{size:"sm",onClick:()=>a(`/sites/${l}/settings/collections/new`),children:e.jsx(c,{className:"h-4 w-4"})})}),e.jsxs("div",{children:[!x&&e.jsxs("div",{className:"mb-6 flex items-center justify-between",children:[e.jsx("h1",{className:"text-2xl font-semibold",children:"Collections"}),e.jsxs(o,{onClick:()=>a(`/sites/${l}/settings/collections/new`),children:[e.jsx(c,{className:"mr-2 h-4 w-4"}),"New Collection"]})]}),m?e.jsx("div",{className:"space-y-2",children:Array.from({length:3}).map((s,h)=>e.jsx(b,{className:"h-12 w-full"},h))}):t?.items.length?e.jsxs(p,{children:[e.jsx(N,{children:e.jsxs(d,{children:[e.jsx(i,{children:"Name"}),e.jsx(i,{children:"Label"}),e.jsx(i,{children:"Type"}),e.jsx(i,{children:"Fields"})]})}),e.jsx(C,{children:t.items.map(s=>e.jsxs(d,{className:"cursor-pointer",onClick:()=>a(`/sites/${l}/settings/collections/${s.name}`),children:[e.jsx(n,{className:"font-mono text-sm",children:s.name}),e.jsx(n,{children:s.label}),e.jsx(n,{children:s.singleton?e.jsx(r,{variant:"secondary",children:"Singleton"}):e.jsx(r,{variant:"outline",children:"Collection"})}),e.jsx(n,{className:"text-muted-foreground",children:s.fields?.length??0})]},s.name))})]}):e.jsx("p",{className:"text-muted-foreground",children:"No collections defined."})]})}export{$ as CollectionsPage};
@@ -1 +1 @@
1
- import{j as e}from"./tanstack-Bs3zYPPV.js";import{u as E,f as P,r as i,m as I,N as T}from"./react-vendor-C2CvUxFh.js";import{w as F,x as k,L as g,I as h,B as f,a as A,v as p,C as B}from"./index-Cir9tY_P.js";import{e as L}from"./useContent-e8beBIuq.js";import{C as D,a as H,b as M,c as q}from"./card-hXVtlM0q.js";import{u as R}from"./usePageTitle-BNSba9_L.js";import{s as z}from"./format-C88SDH8g.js";import"./radix-C1kb_NqW.js";function X(){const{host:a,collection:s}=E(),c=P(),{collections:C}=F(),o=L(a),[l,j]=i.useState(""),[u,d]=i.useState(""),[v,b]=i.useState(!1),[m,x]=i.useState(null),N=k(),[S]=I(),r=C.find(t=>t.name===s),$=S.get("from")==="recent"?`/sites/${a}/content`:`/sites/${a}/content/${s}`;if(R({title:`New ${r?.labelSingular??s}`,showBack:!0,backTo:$}),r?.singleton){const t=r.singletonContentId?`/sites/${a}/content/${s}/${r.singletonContentId}`:`/sites/${a}/content/${s}`;return e.jsx(T,{to:t,replace:!0})}function y(t){j(t),v||d(z(t))}async function w(t){t.preventDefault(),x(null);try{const n=await o.mutateAsync({collection:s,title:l,slug:u||void 0});p.success("Content created"),c(`/sites/${a}/content/${s}/${n.contentId}`)}catch(n){n instanceof B&&n.status===409?x("A content item with this slug already exists. Choose a different slug."):p.error("Failed to create content",{description:n instanceof Error?n.message:void 0})}}return e.jsxs("div",{className:"mx-auto max-w-2xl",children:[!N&&e.jsxs("h1",{className:"mb-6 text-2xl font-semibold",children:["New ",r?.labelSingular??s]}),e.jsxs(D,{children:[e.jsx(H,{children:e.jsx(M,{children:"Details"})}),e.jsx(q,{children:e.jsxs("form",{onSubmit:w,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(g,{htmlFor:"title",children:"Title"}),e.jsx(h,{id:"title",value:l,onChange:t=>y(t.target.value),required:!0,autoFocus:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(g,{htmlFor:"slug",children:"Slug"}),e.jsx(h,{id:"slug",value:u,onChange:t=>{d(t.target.value),b(!0)}})]}),m&&e.jsx("p",{className:"text-sm text-destructive",children:m}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(f,{type:"submit",disabled:!l||o.isPending,children:[o.isPending&&e.jsx(A,{className:"mr-2 h-4 w-4 animate-spin"}),"Create"]}),e.jsx(f,{type:"button",variant:"outline",onClick:()=>c(-1),children:"Cancel"})]})]})})]})]})}export{X as ContentCreatePage};
1
+ import{j as e}from"./tanstack-Bs3zYPPV.js";import{u as E,f as P,r as i,m as I,N as T}from"./react-vendor-C2CvUxFh.js";import{w as F,x as k,L as g,I as h,B as f,a as A,v as p,C as B}from"./index-BA3y7HJs.js";import{e as L}from"./useContent-CW0tm0FY.js";import{C as D,a as H,b as M,c as q}from"./card-CZTHR2Qa.js";import{u as R}from"./usePageTitle-DYvuJQp6.js";import{s as z}from"./format-C88SDH8g.js";import"./radix-C5ZmWuuL.js";function X(){const{host:a,collection:s}=E(),c=P(),{collections:C}=F(),o=L(a),[l,j]=i.useState(""),[u,d]=i.useState(""),[v,b]=i.useState(!1),[m,x]=i.useState(null),N=k(),[S]=I(),r=C.find(t=>t.name===s),$=S.get("from")==="recent"?`/sites/${a}/content`:`/sites/${a}/content/${s}`;if(R({title:`New ${r?.labelSingular??s}`,showBack:!0,backTo:$}),r?.singleton){const t=r.singletonContentId?`/sites/${a}/content/${s}/${r.singletonContentId}`:`/sites/${a}/content/${s}`;return e.jsx(T,{to:t,replace:!0})}function y(t){j(t),v||d(z(t))}async function w(t){t.preventDefault(),x(null);try{const n=await o.mutateAsync({collection:s,title:l,slug:u||void 0});p.success("Content created"),c(`/sites/${a}/content/${s}/${n.contentId}`)}catch(n){n instanceof B&&n.status===409?x("A content item with this slug already exists. Choose a different slug."):p.error("Failed to create content",{description:n instanceof Error?n.message:void 0})}}return e.jsxs("div",{className:"mx-auto max-w-2xl",children:[!N&&e.jsxs("h1",{className:"mb-6 text-2xl font-semibold",children:["New ",r?.labelSingular??s]}),e.jsxs(D,{children:[e.jsx(H,{children:e.jsx(M,{children:"Details"})}),e.jsx(q,{children:e.jsxs("form",{onSubmit:w,className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx(g,{htmlFor:"title",children:"Title"}),e.jsx(h,{id:"title",value:l,onChange:t=>y(t.target.value),required:!0,autoFocus:!0})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(g,{htmlFor:"slug",children:"Slug"}),e.jsx(h,{id:"slug",value:u,onChange:t=>{d(t.target.value),b(!0)}})]}),m&&e.jsx("p",{className:"text-sm text-destructive",children:m}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs(f,{type:"submit",disabled:!l||o.isPending,children:[o.isPending&&e.jsx(A,{className:"mr-2 h-4 w-4 animate-spin"}),"Create"]}),e.jsx(f,{type:"button",variant:"outline",onClick:()=>c(-1),children:"Cancel"})]})]})})]})]})}export{X as ContentCreatePage};
@@ -0,0 +1 @@
1
+ import{a as Ft,u as It,b as Ot,j as e}from"./tanstack-Bs3zYPPV.js";import{r,u as qt,f as $t,m as Vt,L as _t}from"./react-vendor-C2CvUxFh.js";import{f as Bt,g as Ms,h as Mt,i as Hs,j as Ht,k as Jt,l as zt,m as Yt,n as Kt,o as Gt,p as Qt,q as Wt,r as Js}from"./useContent-CW0tm0FY.js";import{C as Ee,v as U,E as cs,e as Oe,u as os,F as Xt,G as Zt,B as P,y as qe,J as ea,K as sa,M as ta,N as aa,S as Z,O as zs,Q as Ys,R as Te,V as Ue,W as Ks,Y as Gs,Z as Qs,_ as Ws,U as na,$ as ia,w as la,x as ra,L as Le,I as Ps,a0 as Xs,X as Ds,a1 as ca,a2 as Ls,a3 as oa,a4 as Rs,a5 as da,j as ua,a as te,a6 as As,a7 as Es,a8 as ha,a9 as Ts,aa as Ke,ab as ma,ac as fa,D as ss,k as ts,l as as,m as ns,n as is,o as ls,i as pa,T as ba}from"./index-BA3y7HJs.js";import{A as ds,a as us,b as hs,c as ms,d as fs,e as ps,f as bs,g as Zs,T as ga}from"./TagInput-d-Hw1fkL.js";import{u as xa}from"./useAdminResolver-Bljb4XGQ.js";import{u as va}from"./usePageTitle-DYvuJQp6.js";import{s as me,T as ja,d as ya}from"./serializeToText-Zin3gYPm.js";import{S as ka,a as Ca,b as wa,c as Sa,d as Ge,e as Na,f as Pa,g as Da}from"./select-dX9e6VDt.js";import{f as ne,a as Qe}from"./format-C88SDH8g.js";import{T as La}from"./textarea-CpDSUg2s.js";import{C as ue,c as he,a as Us,b as Fs}from"./card-CZTHR2Qa.js";import{C as et,a as st,b as tt}from"./collapsible-D3d29uJp.js";import{u as Ra}from"./useTags-ybsMbCst.js";import{M as Aa}from"./MediaField-B-Cz8TlK.js";import{m as Ea}from"./media-url-DIg_vSyf.js";import{R as Ta}from"./RelationshipPicker-Dv7GaLcU.js";import{A as Ua,a as Fa,i as Ia,F as Oa,b as Re,C as qa}from"./FieldRenderer-wE-mtqZB.js";import{g as $a,a as Va,b as _a}from"./contentStatus-CkPi9Dh6.js";import{O as Ba,f as Ma,g as Fe,e as at,w as We,a as Ha,t as Ja,r as Xe,b as za,c as Ya,d as Ka,h as Ga,i as Is,j as Qa,D as Wa}from"./yjs-tXBm_srz.js";import"./radix-C5ZmWuuL.js";import"./useMedia-Cu5N4rY8.js";import"./core.esm-DdQHdRkd.js";import"./sortable.esm-qVEMoaTg.js";import"./ContentField-D04Uo1Ov.js";import"./popover-BFw_h3j6.js";import"./command-CdzYw11U.js";import"./useContentSearch-_bwacEth.js";import"./checkbox-DEgzM8H9.js";const Xa=3e3,Za="__HEADROOM_API_URL__".replace(/\/+$/,"");function en(a,s,n,t,l,c=Xa,d){const f=Bt(a,s),u=r.useRef(null),m=r.useRef(n?JSON.stringify(n):""),v=r.useRef(void 0),[w,p]=r.useState(null),[S,b]=r.useState(null),L=r.useRef(!1),y=r.useRef(d);r.useEffect(()=>{y.current=d},[d]);const h=r.useCallback(A=>{JSON.stringify(A)!==m.current&&(u.current=A,clearTimeout(v.current),v.current=window.setTimeout(()=>{if(u.current){const F=u.current,E=JSON.stringify(F);u.current=null,f.mutate(F,{onSuccess:T=>{if(L.current){L.current=!1;return}m.current=E,p(Date.now()),T?.blockId&&b(T.blockId),y.current?.(T)},onError:T=>{T instanceof Ee&&T.code==="SLUG_TAKEN"?t?.():T instanceof Ee&&T.code==="LOCK_HELD"?l?.(T):T instanceof Ee&&T.status===400&&U.error("Auto-save failed",{description:T.message})}})}},c))},[f,t,l,c]),g=r.useCallback(async A=>{if(clearTimeout(v.current),u.current){const o={...u.current};A?.createVersion&&(o.createVersion=!0);const F=JSON.stringify(u.current);u.current=null;const E=await f.mutateAsync(o);m.current=F,p(Date.now()),E?.blockId&&b(E.blockId)}else if(A?.createVersion&&m.current){const F={...JSON.parse(m.current),createVersion:!0},E=await f.mutateAsync(F);p(Date.now()),E?.blockId&&b(E.blockId)}},[f]),N=r.useCallback(()=>{clearTimeout(v.current),u.current=null},[]),_=r.useCallback(A=>{m.current=JSON.stringify(A)},[]),R=r.useCallback(()=>{clearTimeout(v.current),u.current=null,L.current=!0,b(null)},[]);return r.useEffect(()=>()=>{if(clearTimeout(v.current),u.current){const A=JSON.stringify(u.current),o=cs(),F=`${Za}/v1/admin/sites/${a}/content/${s}/draft`;fetch(F,{method:"PUT",body:A,headers:{"Content-Type":"application/json",...o?{Authorization:`Bearer ${o}`}:{}},keepalive:!0}).catch(()=>{}),u.current=null}},[a,s]),{schedule:h,flush:g,cancel:N,resetBaseline:_,discard:R,isSaving:f.isPending,lastSavedAt:w,lastSavedBlockId:S}}const sn="__HEADROOM_API_URL__".replace(/\/+$/,""),tn=5e3,an=3600*1e3;function nn(a){const s=`headroom:editSession:${a}`;let n=sessionStorage.getItem(s);return n||(n=Xt(),sessionStorage.setItem(s,n)),n}const Ze=new Map;function ln(a,s){const n=Oe(),{user:t}=os(),l=Ft(),[c,d]=r.useState("loading"),[f,u]=r.useState(null),[m,v]=r.useState(null),[w,p]=r.useState([]),[S,b]=r.useState(!1),[L,y]=r.useState(!1),h=s?nn(s):"",g=r.useRef(0),N=r.useRef(!1),_=r.useRef(!1),R=r.useCallback(async(j=!1)=>{if(!a||!s||!h)return null;const x=`${a}:${s}`,O=Ze.get(x);if(O)return O;const q=n.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock`,{method:"POST",body:JSON.stringify({sessionId:h,force:j,email:t?.email,name:t?.name})}).finally(()=>{Ze.delete(x)});return Ze.set(x,q),q},[n,a,s,h,t?.email,t?.name]),A=r.useCallback(async()=>{if(!(!a||!s||!h))try{await n.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock`,{method:"DELETE",body:JSON.stringify({sessionId:h})})}catch{}},[n,a,s,h]);r.useEffect(()=>{if(!a||!s||!h)return;const j=()=>{if(!N.current)return;const x=cs(),O=`${sn}/v1/admin/sites/${a}/content/${s}/edit-lock`;fetch(O,{method:"DELETE",body:JSON.stringify({sessionId:h}),headers:{"Content-Type":"application/json",...x?{Authorization:`Bearer ${x}`}:{}},keepalive:!0}).catch(()=>{})};return window.addEventListener("beforeunload",j),()=>window.removeEventListener("beforeunload",j)},[a,s,h]),r.useEffect(()=>{if(!a||!s||!h||!t)return;_.current=!1;let j=!1;return(async()=>{try{const x=await R();if(j||!x)return;x.acquired?(N.current=!0,d("acquired"),u(x.lockHolder??null),v(x.takeoverReason),y(x.collaborationEnabled)):x.lockHolder&&x.lockHolder.sub===t.sub&&x.lockHolder.sessionId!==h?(d("same-user-other-tab"),u(x.lockHolder)):(d("read-only"),u(x.lockHolder??null),g.current=Date.now())}catch(x){if(!j){const O=x;if(O.status===409){const q=O.body?.lockHolder??null,V=O.body?.collaborationEnabled??!1;q&&q.sub===t.sub&&q.sessionId!==h?(d("same-user-other-tab"),u(q)):(d("read-only"),u(q),y(V),g.current=Date.now())}else d("error")}}})(),()=>{j=!0,N.current&&!_.current&&(_.current=!0,N.current=!1,A())}},[a,s,h,t,R,A]);const o=c==="read-only"&&!S,F=r.useCallback(j=>{if(g.current&&Date.now()-g.current>an){b(!0),d("poll-ceiling");return}const x=j.lock;if(!x)u(null),y(!1),p([]);else{u(x.heldBy),y(x.collaborationEnabled);const O=(x.accessRequests??[]).filter(q=>q.sub!==t?.sub);p(O)}},[t?.sub]);It({queryKey:["sites",a,"edit-lock",s],queryFn:async()=>{try{const j=await n.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock`);return F(j),j}catch{return{lock:f?{heldBy:f,expiresAt:0,collaborationEnabled:L,accessRequests:[]}:null}}},enabled:o,refetchInterval:o?tn:!1,refetchIntervalInBackground:!1,retry:!1});const E=Ot({mutationFn:()=>n.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock/access-requests`,{method:"POST",body:JSON.stringify({sessionId:h,email:t?.email,name:t?.name})})}),T=r.useCallback(async()=>{const j=await R(!0);return j?.acquired&&(N.current=!0,d("acquired"),u(j.lockHolder??null),v(j.takeoverReason),y(j.collaborationEnabled),l.invalidateQueries({queryKey:["sites",a,"edit-lock",s]})),j},[R,l,a,s]),re=r.useCallback(async()=>{const j=await R(!1);return j?.acquired&&(N.current=!0,d("acquired"),u(j.lockHolder??null),v(j.takeoverReason),y(j.collaborationEnabled),l.invalidateQueries({queryKey:["sites",a,"edit-lock",s]})),j},[R,l,a,s]),k=r.useCallback(j=>{N.current=!1,d("expired"),u(j.lockHolder??null),v(j.takeoverReason??null)},[]),ce=r.useCallback(()=>{N.current=!1,d("read-only"),g.current=Date.now()},[]);return{status:c,lockHolder:f,takeoverReason:m,accessRequests:w,sessionId:h,pollCeiling:S,collaborationEnabled:L,acquireLock:R,releaseLock:A,requestCollaboration:E,forceTakeover:T,takeEditing:re,onAutosaveConflict:k,dismissModal:ce,setAccessRequests:p,setCollaborationEnabled:y}}function $e(){return"__HEADROOM_COLLAB_ENABLED__"!=="false"}function rn({lockHolder:a,onRequestCollaboration:s,onForceTakeover:n,isRequesting:t,requestSent:l}){const c=$e();return e.jsx("div",{className:"bg-amber-50 border border-amber-200 rounded-lg p-4 mb-4","data-testid":"edit-lock-banner",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Zt,{className:"h-5 w-5 text-amber-600 mt-0.5 shrink-0"}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("p",{className:"font-medium text-amber-900",children:["Editing: ",a.name||a.email]}),e.jsx("p",{className:"text-sm text-amber-700 mt-1",children:c?"This content is being edited. You can view it read-only or ask to collaborate.":"This content is being edited. You can view it read-only until the editor is finished."}),e.jsxs("div",{className:"flex gap-2 mt-3",children:[c&&e.jsx(P,{size:"sm",variant:"outline",onClick:s,disabled:t||l,"data-testid":"request-collaboration-btn",children:l?"Request sent":"Request collaboration"}),n&&e.jsx(P,{size:"sm",variant:"destructive",onClick:n,"data-testid":"force-takeover-btn",children:"Take over"})]})]})]})})}function cn({open:a,lockHolder:s,takeoverReason:n,currentUserSub:t,onRequestCollaboration:l,onViewReadOnly:c}){let d="Your edit lock expired",f="";return n==="expired"?f=s?`${s.name||s.email} is now editing this content. Your latest changes have not been saved.`:"Another user is now editing this content. Your latest changes have not been saved.":n==="forced"?s&&s.sub===t?(d="Editing moved to another tab",f="This content is now being edited in another tab of yours."):(d="Edit session taken over",f=s?`A super-admin has taken over this edit session — ${s.name||s.email} is now editing.`:"A super-admin has taken over this edit session."):f=s?`${s.name||s.email} is now editing this content. Your latest changes have not been saved.`:"Your edit lock has expired.",e.jsx(ds,{open:a,children:e.jsxs(us,{"data-testid":"lock-expired-modal",children:[e.jsxs(hs,{children:[e.jsx(ms,{children:d}),e.jsx(fs,{children:f})]}),e.jsxs(ps,{children:[$e()&&e.jsx(P,{variant:"outline",onClick:l,"data-testid":"lock-expired-request-collab",children:"Request collaboration"}),e.jsx(bs,{onClick:c,"data-testid":"lock-expired-view-readonly",children:"View read-only"})]})]})})}function on({open:a,onTakeOver:s,onCancel:n}){return e.jsx(ds,{open:a,children:e.jsxs(us,{"data-testid":"same-user-other-tab-modal",children:[e.jsxs(hs,{children:[e.jsx(ms,{children:"Already editing in another tab"}),e.jsx(fs,{children:"You're already editing this content in another tab. Taking over here will end the editing session in the other tab."})]}),e.jsxs(ps,{children:[e.jsx(Zs,{onClick:n,children:"Cancel"}),e.jsx(bs,{onClick:s,"data-testid":"take-over-btn",children:"Take over here"})]})]})})}function dn({lines:a}){return e.jsx("div",{className:"font-mono text-sm leading-relaxed",children:a.map((s,n)=>e.jsx("div",{style:{paddingLeft:`${s.indent*1.5}rem`},className:qe("min-h-[1.5em]",s.type==="label"&&"text-muted-foreground font-semibold mt-1",s.type==="heading"&&"font-bold",s.type==="empty"&&"h-2"),children:s.text},n))})}function rs(a){switch(a.kind){case"draft":return"Draft";case"published":return"Published";case"history":return ne(a.createdAt)}}function Ie(a){switch(a.kind){case"draft":return"draft";case"published":return"published";case"history":return`history:${a.blockId}`}}function Os({value:a,onChange:s,isPublished:n,versions:t,exclude:l,size:c}){const d=l?Ie(l):null;function f(u){if(u==="draft")s({kind:"draft"});else if(u==="published")s({kind:"published"});else if(u.startsWith("history:")){const m=u.slice(8),v=t.find(w=>w.blockId===m);v&&s({kind:"history",blockId:v.blockId,createdAt:v.createdAt,title:v.title})}}return e.jsxs(ka,{value:Ie(a),onValueChange:f,children:[e.jsx(Ca,{size:c,children:e.jsx(wa,{children:rs(a)})}),e.jsxs(Sa,{position:"popper",children:[d!=="draft"&&e.jsx(Ge,{value:"draft",children:"Draft"}),n&&d!=="published"&&e.jsx(Ge,{value:"published",children:"Published"}),t.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(Na,{}),e.jsxs(Pa,{children:[e.jsx(Da,{children:"Version History"}),t.map(u=>{const m=`history:${u.blockId}`;return m===d?null:e.jsx(Ge,{value:m,children:ne(u.createdAt)},m)})]})]})]})]})}function qs({ref:a,host:s,contentId:n,collectionFields:t,isSingleton:l,draftBody:c,draftMetadata:d,collectionRelationships:f,draftRelationships:u}){const m=a?.kind==="published",v=a?.kind==="history",w=v?a.blockId:null,{data:p,isLoading:S}=Ms(s,n,m),{data:b,isLoading:L}=Mt(s,n,v?w:null),y=r.useMemo(()=>(f??[]).map(N=>({name:N.name,label:N.label})),[f]);function h(N){if(y.length!==0)return{defs:y,values:N??{}}}const g=r.useMemo(()=>{if(!a)return[];if(a.kind==="draft")return c?me(t,c,l?void 0:d,h(u)):[];if(a.kind==="published"){if(!p)return[];const R=l?void 0:{title:p.title,slug:p.slug,snippet:p.snippet,tags:p.tags},A=p.relationships;return me(t,p.fields??{},R,h(A))}if(!b)return[];const N=l?void 0:{title:b.title,slug:b.slug,snippet:b.snippet,tags:b.tags},_=b.relationships;return me(t,b.body??{},N,h(_))},[a,c,d,u,p,b,t,l,y]);return a?a.kind==="draft"?{lines:g,isLoading:!1,hasData:!!c}:a.kind==="published"?{lines:g,isLoading:S,hasData:!!p}:{lines:g,isLoading:L,hasData:!!b}:{lines:[],isLoading:!1,hasData:!1}}function un({open:a,onOpenChange:s,host:n,contentId:t,collectionFields:l,isSingleton:c,isPublished:d,draftBody:f,draftMetadata:u,initialVersion:m,collectionRelationships:v,draftRelationships:w}){const[p,S]=r.useState(m??{kind:"published"}),[b,L]=r.useState({kind:"draft"}),[y,h]=r.useState(a),[g,N]=r.useState(m);if((a!==y||m!==g)&&(h(a),N(m),a)){const T=m??{kind:"published"};S(T),L(T.kind==="draft"?{kind:"published"}:{kind:"draft"})}Ie(p)===Ie(b)&&(p.kind!=="draft"?L({kind:"draft"}):d&&L({kind:"published"}));const{data:_}=Hs(n,t),R=_?.items??[],A={host:n,contentId:t,collectionFields:l,isSingleton:c,draftBody:f,draftMetadata:u,collectionRelationships:v,draftRelationships:w},o=qs({ref:a?p:null,...A}),F=qs({ref:a?b:null,...A}),E=o.isLoading;return e.jsx(ea,{open:a,onOpenChange:s,children:e.jsxs(sa,{className:"w-[calc(100vw-2rem)] sm:max-w-2xl overflow-y-auto pt-[env(safe-area-inset-top,0px)] pr-[env(safe-area-inset-right,0px)]",children:[e.jsx(ta,{children:e.jsxs(aa,{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-muted-foreground text-sm font-normal",children:"Viewing"}),e.jsx(Os,{value:p,onChange:S,isPublished:d,versions:R,size:"sm"})]})}),E&&e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsx(Z,{className:"h-6 w-48"}),e.jsx(Z,{className:"h-4 w-full"}),e.jsx(Z,{className:"h-4 w-full"}),e.jsx(Z,{className:"h-4 w-2/3"})]}),!E&&!o.hasData&&e.jsx("p",{className:"p-4 text-sm text-muted-foreground",children:"No data available for this version."}),!E&&o.hasData&&e.jsx("div",{className:"p-4",children:e.jsxs(zs,{defaultValue:"changes",children:[e.jsxs(Ys,{variant:"line",className:"mb-4",children:[e.jsx(Te,{value:"content",children:"Content"}),e.jsx(Te,{value:"changes",children:"Changes"})]}),e.jsx(Ue,{value:"content",children:e.jsx(dn,{lines:o.lines})}),e.jsxs(Ue,{value:"changes",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:"Compare with"}),e.jsx(Os,{value:b,onChange:L,isPublished:d,versions:R,exclude:p,size:"sm"})]}),F.isLoading?e.jsxs("div",{className:"space-y-4",children:[e.jsx(Z,{className:"h-4 w-full"}),e.jsx(Z,{className:"h-4 w-full"}),e.jsx(Z,{className:"h-4 w-2/3"})]}):F.hasData?e.jsx(ja,{left:F.lines,right:o.lines,leftLabel:rs(b),rightLabel:rs(p)}):e.jsx("p",{className:"text-sm text-muted-foreground italic",children:"No data available for comparison."})]})]})})]})})}const es=3e4;class hn extends Ba{constructor(s){super(),this.doc=s,this.clientID=s.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval(()=>{const n=Fe();this.getLocalState()!==null&&es/2<=n-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach((l,c)=>{c!==this.clientID&&es<=n-l.lastUpdated&&this.states.has(c)&&t.push(c)}),t.length>0&&mn(this,t,"timeout")},Ma(es/10)),s.on("destroy",()=>{this.destroy()}),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(s){const n=this.clientID,t=this.meta.get(n),l=t===void 0?0:t.clock+1,c=this.states.get(n);s===null?this.states.delete(n):this.states.set(n,s),this.meta.set(n,{clock:l,lastUpdated:Fe()});const d=[],f=[],u=[],m=[];s===null?m.push(n):c==null?s!=null&&d.push(n):(f.push(n),at(c,s)||u.push(n)),(d.length>0||u.length>0||m.length>0)&&this.emit("change",[{added:d,updated:u,removed:m},"local"]),this.emit("update",[{added:d,updated:f,removed:m},"local"])}setLocalStateField(s,n){const t=this.getLocalState();t!==null&&this.setLocalState({...t,[s]:n})}getStates(){return this.states}}const mn=(a,s,n)=>{const t=[];for(let l=0;l<s.length;l++){const c=s[l];if(a.states.has(c)){if(a.states.delete(c),c===a.clientID){const d=a.meta.get(c);a.meta.set(c,{clock:d.clock+1,lastUpdated:Fe()})}t.push(c)}}t.length>0&&(a.emit("change",[{added:[],updated:[],removed:t},n]),a.emit("update",[{added:[],updated:[],removed:t},n]))},$s=(a,s,n=a.states)=>{const t=s.length,l=Ya();We(l,t);for(let c=0;c<t;c++){const d=s[c],f=n.get(d)||null,u=a.meta.get(d).clock;We(l,d),We(l,u),Ha(l,JSON.stringify(f))}return Ja(l)},fn=(a,s,n)=>{const t=Ka(s),l=Fe(),c=[],d=[],f=[],u=[],m=Xe(t);for(let v=0;v<m;v++){const w=Xe(t);let p=Xe(t);const S=JSON.parse(za(t)),b=a.meta.get(w),L=a.states.get(w),y=b===void 0?0:b.clock;(y<p||y===p&&S===null&&a.states.has(w))&&(S===null?w===a.clientID&&a.getLocalState()!=null?p++:a.states.delete(w):a.states.set(w,S),a.meta.set(w,{clock:p,lastUpdated:l}),b===void 0&&S!==null?c.push(w):b!==void 0&&S===null?u.push(w):S!==null&&(at(S,L)||f.push(w),d.push(w)))}(c.length>0||f.length>0||u.length>0)&&a.emit("change",[{added:c,updated:f,removed:u},n]),(c.length>0||d.length>0||u.length>0)&&a.emit("update",[{added:c,updated:d,removed:u},n])},Vs=[1e3,2e3,4e3,8e3,16e3];class gs{awareness;ws=null;doc;room;wsUrl;ticket;getTicket;reconnectAttempt=0;reconnectTimer=null;connected=!1;destroyed=!1;pendingUpdates=[];pendingFieldUpdates=[];static MAX_PENDING_FIELD_UPDATES=100;statusListeners=new Set;constructor(s){this.doc=s.doc,this.room=s.room,this.wsUrl=s.wsUrl,this.ticket=s.ticket,this.getTicket=s.getTicket,this.awareness=new hn(this.doc),this.awareness.setLocalStateField("user",s.user),this.doc.on("update",this.handleDocUpdate),this.awareness.on("update",this.handleAwarenessUpdate),this.connect()}onStatus(s){return this.statusListeners.add(s),()=>{this.statusListeners.delete(s)}}connect(){if(this.destroyed)return;this.statusListeners.forEach(n=>n("connecting"));const s=`${this.wsUrl}?ticket=${encodeURIComponent(this.ticket)}&room=${encodeURIComponent(this.room)}`;this.ws=new WebSocket(s),this.ws.onopen=()=>{this.connected=!0,this.reconnectAttempt=0,this.statusListeners.forEach(l=>l("connected"));const n=Ga(this.doc);this.ws.send(JSON.stringify({action:"yjs",type:"sync-step-1",data:de(n)}));const t=$s(this.awareness,[this.doc.clientID]);this.ws.send(JSON.stringify({action:"awareness",data:de(t)}))},this.ws.onmessage=n=>{const t=JSON.parse(n.data);switch(t.action){case"yjs":this.handleYjsMessage(t);break;case"field":this.fieldListeners.forEach(l=>l(t));break;case"awareness":this.handleAwarenessMessage(t);break;case"presence":this.presenceListeners.forEach(l=>l(t));break;case"leader-change":this.leaderChangeListeners.forEach(l=>l(t));break;case"collaboration-disabled":this.collabDisabledListeners.forEach(l=>l());break;case"publish-requested":this.publishRequestedListeners.forEach(l=>l(t));break;case"save-version-requested":this.saveVersionRequestedListeners.forEach(l=>l(t));break;case"publish-in-progress":this.publishInProgressListeners.forEach(l=>l());break;case"published":this.publishedListeners.forEach(l=>l(t));break}},this.ws.onclose=()=>{this.connected=!1,this.statusListeners.forEach(n=>n("disconnected")),this.scheduleReconnect()},this.ws.onerror=()=>{this.ws?.close()}}handleDocUpdate=(s,n)=>{n!=="remote"&&(this.connected?this.sendYjsUpdate(s):this.pendingUpdates.push(s))};sendYjsUpdate(s){this.ws?.send(JSON.stringify({action:"yjs",type:"update",data:de(s)}))}flushPendingUpdates(){for(const s of this.pendingUpdates)this.sendYjsUpdate(s);this.pendingUpdates=[]}handleYjsMessage(s){const n=_s(s.data);switch(s.type){case"sync-step-1":{const t=Qa(this.doc,n);this.ws.send(JSON.stringify({action:"yjs",type:"sync-step-2",data:de(t)}));break}case"sync-step-2":Is(this.doc,n,"remote"),this.flushPendingUpdates(),this.flushPendingFieldUpdates();break;case"update":Is(this.doc,n,"remote");break}}fieldListeners=new Set;onFieldUpdate(s){return this.fieldListeners.add(s),()=>{this.fieldListeners.delete(s)}}sendFieldUpdate(s,n){if(!this.connected){const t=this.pendingFieldUpdates.findIndex(l=>l.field===s);t>=0?this.pendingFieldUpdates[t]={field:s,value:n}:(this.pendingFieldUpdates.length>=gs.MAX_PENDING_FIELD_UPDATES&&this.pendingFieldUpdates.shift(),this.pendingFieldUpdates.push({field:s,value:n}));return}this.ws?.send(JSON.stringify({action:"field",field:s,value:n}))}flushPendingFieldUpdates(){for(const{field:s,value:n}of this.pendingFieldUpdates)this.ws?.send(JSON.stringify({action:"field",field:s,value:n}));this.pendingFieldUpdates=[]}presenceListeners=new Set;onPresence(s){return this.presenceListeners.add(s),()=>{this.presenceListeners.delete(s)}}leaderChangeListeners=new Set;onLeaderChange(s){return this.leaderChangeListeners.add(s),()=>{this.leaderChangeListeners.delete(s)}}collabDisabledListeners=new Set;onCollabDisabled(s){return this.collabDisabledListeners.add(s),()=>{this.collabDisabledListeners.delete(s)}}sendDisableCollab(){this.connected&&this.ws?.send(JSON.stringify({action:"disable-collab"}))}publishRequestedListeners=new Set;onPublishRequested(s){return this.publishRequestedListeners.add(s),()=>{this.publishRequestedListeners.delete(s)}}saveVersionRequestedListeners=new Set;onSaveVersionRequested(s){return this.saveVersionRequestedListeners.add(s),()=>{this.saveVersionRequestedListeners.delete(s)}}publishInProgressListeners=new Set;onPublishInProgress(s){return this.publishInProgressListeners.add(s),()=>{this.publishInProgressListeners.delete(s)}}publishedListeners=new Set;onPublished(s){return this.publishedListeners.add(s),()=>{this.publishedListeners.delete(s)}}sendRequestPublish(){this.connected&&this.ws?.send(JSON.stringify({action:"request-publish"}))}sendRequestSaveVersion(){this.connected&&this.ws?.send(JSON.stringify({action:"request-save-version"}))}sendPublishInProgress(){this.connected&&this.ws?.send(JSON.stringify({action:"publish-in-progress"}))}sendPublished(s){this.connected&&this.ws?.send(JSON.stringify({action:"published",...s?.contentId?{contentId:s.contentId}:{},...s?.version!==void 0?{version:s.version}:{}}))}handleAwarenessUpdate=({added:s,updated:n,removed:t})=>{if(!this.connected)return;const l=$s(this.awareness,[...s,...n,...t]);this.ws?.send(JSON.stringify({action:"awareness",data:de(l)}))};handleAwarenessMessage(s){const n=_s(s.data);fn(this.awareness,n,"remote")}scheduleReconnect(){if(this.destroyed)return;const s=Vs[Math.min(this.reconnectAttempt,Vs.length-1)];this.reconnectAttempt++,this.reconnectTimer=window.setTimeout(async()=>{try{this.ticket=await this.getTicket()}catch{this.statusListeners.forEach(n=>n("disconnected"));return}this.connect()},s)}destroy(){this.destroyed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.doc.off("update",this.handleDocUpdate),this.awareness.off("update",this.handleAwarenessUpdate),this.awareness.destroy(),this.ws?.close()}}function de(a){let s="";for(let t=0;t<a.length;t+=8192)s+=String.fromCharCode(...a.subarray(t,t+8192));return btoa(s)}function _s(a){const s=atob(a),n=new Uint8Array(s.length);for(let t=0;t<s.length;t++)n[t]=s.charCodeAt(t);return n}const Ae=["#3b82f6","#ef4444","#10b981","#f59e0b","#8b5cf6","#ec4899","#14b8a6","#f97316"];function pn(a,s,n,t){const{user:l}=os(),[c,d]=r.useState(null),[f,u]=r.useState("disconnected"),[m,v]=r.useState([]),[w,p]=r.useState({}),S=r.useRef(null),b=r.useRef(t?.onCollabDisabled),L=r.useRef(t?.onPublishRequested),y=r.useRef(t?.onSaveVersionRequested),h=r.useRef(t?.onPublishInProgress),g=r.useRef(t?.onPublished);r.useEffect(()=>{b.current=t?.onCollabDisabled,L.current=t?.onPublishRequested,y.current=t?.onSaveVersionRequested,h.current=t?.onPublishInProgress,g.current=t?.onPublished},[t?.onCollabDisabled,t?.onPublishRequested,t?.onSaveVersionRequested,t?.onPublishInProgress,t?.onPublished]);const N="__HEADROOM_COLLAB_WS_URL__",_=$e(),R=_&&!!c&&f==="connected";r.useEffect(()=>{if(!_||!N||!l||!n)return;const C=new Wa;S.current=C;const I=`${a}/${s}`,Y=async()=>{const M=cs();if(!M)throw new Error("No access token");const ee="__HEADROOM_API_URL__".replace(/\/+$/,""),H=await fetch(`${ee}/v1/admin/sites/${a}/content/${s}/collab/ticket`,{method:"POST",headers:{Authorization:`Bearer ${M}`,"Content-Type":"application/json"},body:JSON.stringify({room:I})});if(!H.ok)throw new Error(`Ticket request failed: ${H.status}`);return(await H.json()).ticket};let B=!1,$=null;return Y().then(M=>{if(B)return;const ee=Bs(l.sub)%Ae.length;$=new gs({wsUrl:N,room:I,ticket:M,getTicket:Y,doc:C,user:{sub:l.sub,name:l.name||l.email,color:Ae[ee]}}),$.onStatus(u),$.onPresence(H=>{v(H.connections.filter(J=>J.connectionId!==H.youAre).map(J=>({sub:J.adminSub,name:J.adminName,color:J.color})));const G=H.connections.find(J=>J.connectionId===H.youAre);V(G?.isLeader??!1)}),$.onCollabDisabled(()=>{b.current?.()}),$.onPublishRequested(()=>L.current?.()),$.onSaveVersionRequested(()=>y.current?.()),$.onPublishInProgress(()=>h.current?.()),$.onPublished(H=>g.current?.({contentId:H.contentId,version:H.version})),d($)}).catch(()=>{B||u("disconnected")}),()=>{B=!0,$?.destroy(),C.destroy(),d(null),u("disconnected")}},[a,s,l?.sub,n,N]);const A=r.useCallback(C=>{if(!c||!l||!S.current)return;const I=S.current.getXmlFragment(`document-store-${C}`),Y=Bs(l.sub)%Ae.length;return{provider:c,fragment:I,user:{name:l.email,color:Ae[Y]}}},[c,l]);r.useEffect(()=>{if(!c){p({});return}const C=()=>{const I={};c.awareness.getStates().forEach(B=>{const $=B?.user?.sub;if(!$)return;const M=B.activeField??null;I[$]=M}),p(I)};return C(),c.awareness.on("change",C),()=>{c.awareness.off("change",C)}},[c]);const o=r.useMemo(()=>m.map(C=>({...C,activeField:w[C.sub]??null})),[m,w]),F=r.useCallback(C=>{c&&c.awareness.setLocalStateField("activeField",C)},[c]),E=r.useRef(new Set),T=r.useCallback(C=>(E.current.add(C),()=>{E.current.delete(C)}),[]);r.useEffect(()=>{if(c)return c.onFieldUpdate(C=>{E.current.forEach(I=>I(C.field,C.value))})},[c]);const re=r.useCallback((C,I)=>{c?.sendFieldUpdate(C,I)},[c]),k=r.useCallback(()=>{c?.sendDisableCollab()},[c]),ce=r.useCallback(()=>{c?.sendRequestPublish()},[c]),j=r.useCallback(()=>{c?.sendRequestSaveVersion()},[c]),x=r.useCallback(()=>{c?.sendPublishInProgress()},[c]),O=r.useCallback(C=>{c?.sendPublished(C)},[c]),[q,V]=r.useState(!1);return r.useEffect(()=>{if(c)return c.onLeaderChange(C=>{V(C.leaderSub===l?.sub)})},[c,l]),{active:R,status:f,editors:o,isLeader:q,getBlockNoteCollab:A,updateField:re,onRemoteFieldChange:T,setActiveField:F,sendDisableCollab:k,sendRequestPublish:ce,sendRequestSaveVersion:j,sendPublishInProgress:x,sendPublished:O}}function Bs(a){let s=0;for(let n=0;n<a.length;n++)s=(s<<5)-s+a.charCodeAt(n)|0;return Math.abs(s)}function bn({status:a,editors:s}){return s.length===0&&a==="connected"?null:e.jsxs("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-muted/50 rounded-md text-sm","data-testid":"collaboration-bar",children:[e.jsxs("div",{className:"flex items-center gap-1.5","aria-label":a,children:[e.jsx("span",{"data-testid":"collaboration-bar-status-dot","data-status":a,className:qe("h-2 w-2 rounded-full",a==="connected"&&"bg-green-500",a==="connecting"&&"bg-yellow-500 animate-pulse",a==="disconnected"&&"bg-red-500")}),e.jsx("span",{className:"text-muted-foreground text-xs",children:a==="connected"?"Live":a==="connecting"?"Connecting...":"Offline"})]}),s.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(Ks,{orientation:"vertical",className:"h-4"}),e.jsx("div",{className:"flex -space-x-1.5",children:s.map(n=>e.jsxs(Gs,{children:[e.jsx(Qs,{asChild:!0,children:e.jsx(Ua,{className:"h-6 w-6 border-2",style:{borderColor:n.color},"aria-label":n.name,children:e.jsx(Fa,{className:"text-[10px]",style:{backgroundColor:n.color+"20"},children:Ia(n.name)})})}),e.jsx(Ws,{children:n.name})]},n.sub))}),e.jsxs("span",{className:"text-muted-foreground text-xs",children:[s.length," other ",s.length===1?"editor":"editors"]})]})]})}function gn({host:a,contentId:s,collaborationEnabled:n,hasConnectedPeers:t,isLockHolder:l,sessionId:c,onChange:d,onBeforeDisable:f}){const[u,m]=r.useState(!1),v=Oe();if(!$e()||!l)return null;const w=async()=>{const y=!n;m(!0);try{if(!y)try{f?.()}catch{}await v.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock/collaboration`,{method:"POST",body:JSON.stringify({collaborationEnabled:y,sessionId:c})}),d(y)}catch{U.error("Failed to update collaboration setting")}finally{m(!1)}},p=n&&t,S=u||p,b=p?"Cannot stop sharing while other editors are connected":null,L=e.jsxs(P,{variant:n?"default":"outline",size:"sm",disabled:S,onClick:w,"aria-pressed":n,children:[n?e.jsx(na,{className:"h-4 w-4"}):e.jsx(ia,{className:"h-4 w-4"}),n?"Collaborating":"Collaborate"]});return b?e.jsxs(Gs,{children:[e.jsx(Qs,{asChild:!0,children:L}),e.jsx(Ws,{children:b})]}):L}function xn(a,s,n,t,l){const c=r.useRef(new Set),d=Oe();r.useEffect(()=>{const f=new Set(t.map(u=>u.sub));for(const u of Array.from(c.current))f.has(u)||c.current.delete(u)},[t]),r.useEffect(()=>{for(const f of t){if(c.current.has(f.sub))continue;c.current.add(f.sub);const u=f.name||f.email||"Someone";U(`${u} wants to collaborate`,{action:{label:"Allow",onClick:()=>{d.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock/collaboration`,{method:"POST",body:JSON.stringify({collaborationEnabled:!0,sessionId:n})}).then(()=>l()).catch(()=>U.error("Failed to enable collaboration"))}},cancel:{label:"Decline",onClick:()=>{d.apiFetch(`/v1/admin/sites/${a}/content/${s}/edit-lock/access-requests/${f.sub}?sessionId=${n}`,{method:"DELETE"}).catch(()=>U.error("Failed to decline request"))}},duration:1/0})}},[t,a,s,n,l,d])}function Xn(){const{host:a,collection:s,id:n}=qt(),{data:t,isLoading:l}=Ht(a,n);return l?e.jsxs("div",{className:"space-y-4",children:[e.jsx(Z,{className:"h-8 w-64"}),e.jsx(Z,{className:"h-64 w-full"})]}):t?.content?e.jsx(vn,{host:a,collection:s,contentId:n,content:t.content,draft:t.draft,publishedBlockId:t.publishedBlockId}):e.jsx("p",{className:"text-muted-foreground",children:"Content not found."})}function vn({host:a,collection:s,contentId:n,content:t,draft:l,publishedBlockId:c}){const d=$t(),f=Oe(),{collections:u}=la(),m=Jt(a,n),v=zt(a,n),w=Yt(a,n),p=Kt(a,n),S=Gt(a,n),b=Qt(a,n),L=l?{title:l.title??t.title,slug:l.slug??t.slug??"",snippet:l.snippet??t.snippet??"",tags:l.tags??t.tags??[],cover:l.cover??t.cover??null,body:l.body??{},relationships:l.relationships??{}}:void 0,{user:y}=os(),h=ln(a,n),g=(h.status==="read-only"||h.status==="poll-ceiling")&&!h.collaborationEnabled,N=r.useRef(()=>{}),_=r.useRef(()=>{}),[R,A]=r.useState(!1),o=pn(a,n,h.collaborationEnabled,{onCollabDisabled:()=>h.setCollaborationEnabled(!1),onPublishRequested:()=>N.current(),onSaveVersionRequested:()=>_.current(),onPublishInProgress:()=>A(!0),onPublished:()=>{A(!1),U.success("Content published")}}),[F,E]=r.useState(null),T=o.active?1e4:void 0,re=r.useCallback(i=>{const ae=(i?.accessRequests??[]).filter(De=>De.sub!==y?.sub);h.setAccessRequests(ae)},[h,y?.sub]),k=en(a,n,L,()=>{E("This slug is already in use by another item in this collection")},i=>{h.onAutosaveConflict({lockHolder:i.body?.lockHolder??void 0,takeoverReason:i.body?.takeoverReason??"expired"})},T,re);xn(a,n,h.sessionId,h.accessRequests,()=>h.setCollaborationEnabled(!0));const{data:ce}=Ra(a),j=ce?.map(i=>i.tag),x=u.find(i=>i.name===s),O=r.useMemo(()=>x?.fields??[],[x?.fields]),q=r.useMemo(()=>x?.relationships??[],[x?.relationships]),V=x?.singleton??!1,C=ra(),[I,Y]=r.useState(l?.title??t.title),[B,$]=r.useState(l?.slug??t.slug??""),[M,ee]=r.useState(l?.snippet??t.snippet??""),H=l?.autoSnippet??"",[G,J]=r.useState(l?.tags??t.tags??[]),[Q,fe]=r.useState(l?.cover??t.cover??null),[ie,pe]=r.useState(l?.body??{}),[le,be]=r.useState(l?.relationships??{}),[nt,it]=r.useState(0),[lt,rt]=r.useState(!1),[ct,ge]=r.useState(!1),[ot,oe]=r.useState(!1),[dt,xe]=r.useState(null),[Ve,ve]=r.useState(!1),[ut,je]=r.useState(!1),[ht,ye]=r.useState(!1),[ke,xs]=r.useState(""),[mt,_e]=r.useState(!1),[Be,vs]=r.useState(""),js=Wt(a,n),K=r.useCallback(()=>({title:I,slug:B,snippet:M,tags:G,cover:Q,body:ie,relationships:le,...h.sessionId?{sessionId:h.sessionId}:{}}),[I,B,M,G,Q,ie,le,h.sessionId]),ft=o.active?i=>{Y(i),o.updateField("title",i)}:i=>{Y(i),k.schedule({...K(),title:i})},pt=o.active?i=>{$(i),E(null),o.updateField("slug",i)}:i=>{$(i),E(null),k.schedule({...K(),slug:i})},bt=o.active?i=>{ee(i),o.updateField("snippet",i)}:i=>{ee(i),k.schedule({...K(),snippet:i})},gt=o.active?i=>{J(i),o.updateField("tags",i)}:i=>{J(i),k.schedule({...K(),tags:i})},ys=o.active?i=>{fe(i),o.updateField("cover",i)}:i=>{fe(i),k.schedule({...K(),cover:i})},xt=o.active?i=>{pe(i),o.updateField("body",i)}:i=>{pe(i),k.schedule({...K(),body:i})},vt=o.active?i=>{be(i),o.updateField("relationships",i)}:i=>{be(i),k.schedule({...K(),relationships:i})},Ce=o.active,we=o.setActiveField,Me=r.useCallback(i=>{Ce&&we(i)},[Ce,we]),He=r.useCallback(()=>{Ce&&we(null)},[Ce,we]);r.useEffect(()=>{if(o.active)return o.onRemoteFieldChange((i,D)=>{switch(i){case"title":Y(D);break;case"slug":$(D);break;case"snippet":ee(D);break;case"tags":J(D);break;case"cover":fe(D);break;case"body":pe(D);break;case"relationships":be(D);break}o.isLeader&&k.schedule(K())})},[o.active,o.onRemoteFieldChange,o.isLeader]);const ks=o.active?o.isLeader:!0;r.useEffect(()=>{if(!o.active||!ks)return;k.schedule(K());const i=window.setInterval(()=>{k.schedule(K())},1e4);return()=>window.clearInterval(i)},[ks,o.active]);const jt=k.lastSavedBlockId??l?.blockId,W=$a(t.publishedAt,t.lastPublishedAt,c,jt,t.scheduledAt,t.scheduledFailed),Se=Va(W),Ne=_a(W),{data:se}=Ms(a,n,!!t.publishedAt),X=r.useMemo(()=>{if(!Ve||!se)return null;const i=V?void 0:{title:se.title,slug:se.slug,snippet:se.snippet,tags:se.tags},D=q.map(z=>({name:z.name,label:z.label})),ae=se.relationships,De=D.length>0?{defs:D,values:ae??{}}:void 0,Rt=me(O,se.fields??{},i,De),At=V?void 0:{title:I,slug:B,snippet:M,tags:G},Et=D.length>0?{defs:D,values:le}:void 0,Tt=me(O,ie,At,Et),Ut=ya(Rt,Tt,{comparator:(z,Ye)=>z.text===Ye.text&&z.indent===Ye.indent&&z.type===Ye.type});let Ss=0,Ns=0;for(const z of Ut)z.added?Ss+=z.count??0:z.removed&&(Ns+=z.count??0);return{added:Ss,removed:Ns}},[Ve,se,O,q,V,I,B,M,G,ie,le]),[yt]=Vt(),kt=yt.get("from")==="recent"?`/sites/${a}/content`:`/sites/${a}/content/${s}`;va({title:V?x?.label??s:I||"Untitled",showBack:!V,backTo:V?void 0:kt,badge:{label:Se.label,variant:Se.variant}});function Pe(){if(o.active&&!o.isLeader){o.sendRequestPublish();return}if(t.publishedAt&&t.slug&&B!==t.slug){je(!0);return}W==="published-changes"?ve(!0):Je()}async function Je(){o.active&&o.isLeader&&o.sendPublishInProgress();try{await k.flush({createVersion:!0}),await m.mutateAsync(void 0),k.discard(),U.success("Content published"),o.active&&o.isLeader&&o.sendPublished({contentId:n})}catch(i){if(i instanceof Ee&&i.code==="SLUG_TAKEN"){E("This slug is already in use by another item in this collection"),U.error("Slug already in use",{description:"Please choose a different slug before publishing."});return}U.error("Failed to publish",{description:i instanceof Error?i.message:void 0})}finally{}}function Ct(){if(o.active&&!o.isLeader){o.sendRequestSaveVersion();return}k.flush({createVersion:!0})}r.useEffect(()=>{N.current=Pe,_.current=()=>{k.flush({createVersion:!0})}});async function wt(){try{await v.mutateAsync(),oe(!1),U.success("Content unpublished")}catch(i){U.error("Failed to unpublish",{description:i instanceof Error?i.message:void 0})}}async function St(){try{k.discard();const i=await f.apiFetch(`/v1/admin/sites/${a}/content/${n}/published`);await js.mutateAsync();const D={title:i.title??"",slug:i.slug??"",snippet:i.snippet??"",tags:i.tags??[],cover:i.cover??null,body:i.fields??{},relationships:i.relationships??{}};Y(D.title),$(D.slug),ee(D.snippet),J(D.tags),fe(D.cover),pe(D.body),be(D.relationships),it(ae=>ae+1),k.resetBaseline(D),U.success("Changes discarded")}catch(i){U.error("Failed to discard changes",{description:i instanceof Error?i.message:void 0})}}async function Nt(){try{await w.mutateAsync(),U.success("Content deleted"),d(`/sites/${a}/content/${s}`)}catch(i){U.error("Failed to delete",{description:i instanceof Error?i.message:void 0})}}async function Pt(){if(ke)try{await k.flush({createVersion:!0});const i=new Date(ke).getTime();await S.mutateAsync(i),ye(!1),xs(""),U.success("Content scheduled for publishing")}catch(i){U.error("Failed to schedule",{description:i instanceof Error?i.message:void 0})}}async function Dt(){try{await b.mutateAsync(),U.success("Schedule cancelled")}catch(i){U.error("Failed to cancel schedule",{description:i instanceof Error?i.message:void 0})}}async function Lt(){if(Be)try{const i=new Date(Be).getTime();await p.mutateAsync(i),_e(!1),U.success("Publish date updated")}catch(i){U.error("Failed to update publish date",{description:i instanceof Error?i.message:void 0})}}function ze(i){const D=new Date(i),ae=D.getTimezoneOffset();return new Date(D.getTime()-ae*6e4).toISOString().slice(0,16)}const Cs=e.jsx("div",{className:`space-y-6 ${g?"pointer-events-none opacity-60 select-none":""}`,"aria-readonly":g||void 0,children:O.length>0?e.jsx(Oa,{fields:O,values:ie,onChange:xt},nt):e.jsx(ue,{children:e.jsx(he,{className:"py-8 text-center",children:e.jsxs("p",{className:"text-sm text-muted-foreground",children:["No fields defined for this collection."," ",e.jsx(_t,{to:`/sites/${a}/settings/collections/${s}`,className:"underline",children:"Configure fields"})]})})})}),ws=e.jsxs("div",{className:`space-y-6 ${g?"pointer-events-none opacity-60 select-none":""}`,"aria-readonly":g||void 0,children:[!V&&e.jsx(ue,{children:e.jsxs(he,{className:"space-y-4 pt-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsxs(Le,{htmlFor:"title",className:"flex items-center",children:["Title",e.jsx(Re,{field:"title",editors:o.editors})]}),e.jsx(Ps,{id:"title",value:I,onChange:i=>ft(i.target.value),onFocus:()=>Me("title"),onBlur:He})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsxs(Le,{htmlFor:"slug",className:"flex items-center",children:["Slug",e.jsx(Re,{field:"slug",editors:o.editors})]}),e.jsx(Ps,{id:"slug",value:B,onChange:i=>pt(i.target.value),onFocus:()=>Me("slug"),onBlur:He,className:F?"border-destructive":""}),F&&e.jsx("p",{className:"text-sm text-destructive",children:F})]}),e.jsxs(et,{defaultOpen:!!M,children:[e.jsxs(st,{className:"flex w-full items-center gap-2 text-sm font-medium",children:[e.jsx(Xs,{className:"h-4 w-4 transition-transform [[data-state=open]>&]:rotate-90"}),"Snippet",e.jsx("span",{className:"text-xs text-muted-foreground",children:"(auto-generated if empty)"}),e.jsx(Re,{field:"snippet",editors:o.editors})]}),e.jsxs(tt,{className:"mt-2 space-y-2",children:[e.jsx(La,{id:"snippet",value:M,onChange:i=>bt(i.target.value),onFocus:()=>Me("snippet"),onBlur:He,rows:3,placeholder:"Brief summary of this content..."}),!M&&H&&e.jsxs("p",{className:"text-xs italic text-muted-foreground",children:["Auto-generated: ",H]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Le,{children:"Cover Image"}),Q?e.jsxs("div",{className:"flex items-center gap-3 rounded-md border p-2 cursor-pointer hover:bg-muted/50 transition-colors",onClick:()=>ge(!0),children:[e.jsx("img",{src:Ea(Q.url),alt:Q.alt??Q.filename??"",className:"h-10 w-10 rounded object-cover bg-muted"}),e.jsx("span",{className:"flex-1 truncate text-sm",children:Q.filename??Q.alt??Q.id}),e.jsx(P,{type:"button",variant:"ghost",size:"sm",onClick:i=>{i.stopPropagation(),ys(null)},children:e.jsx(Ds,{className:"h-3 w-3"})})]}):e.jsxs(P,{type:"button",variant:"outline",className:"w-full",onClick:()=>ge(!0),children:[e.jsx(ca,{className:"mr-2 h-4 w-4"}),"Select Image"]}),e.jsx(Aa,{open:ct,onClose:()=>ge(!1),onSelect:i=>{ys({id:i.mediaId,url:i.url,width:i.width??0,height:i.height??0,alt:i.alt,caption:i.caption,filename:i.filename}),ge(!1)},allowedTypes:["image/*"]})]})]})}),!V&&e.jsxs(ue,{children:[e.jsx(Us,{children:e.jsxs(Fs,{className:"flex items-center",children:["Tags",e.jsx(Re,{field:"tags",editors:o.editors})]})}),e.jsx(he,{children:e.jsx(ga,{tags:G,onChange:gt,suggestions:j})})]}),q.length>0&&e.jsx(Ta,{relationships:q,values:le,onChange:vt,host:a}),e.jsxs(ue,{children:[e.jsx(Us,{children:e.jsx(Fs,{children:"Info"})}),e.jsxs(he,{className:"space-y-2 text-sm",children:[e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Collection"}),e.jsx("span",{children:t.collection})]}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"ID"}),e.jsx("span",{className:"font-mono text-xs",children:t.contentId})]}),t.publishedAt?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("span",{className:"text-muted-foreground",children:"Published"}),mt?e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("input",{type:"datetime-local",value:Be,onChange:i=>vs(i.target.value),className:"text-xs border rounded px-1 py-0.5",max:ze(Date.now())}),e.jsx(P,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:Lt,disabled:p.isPending,children:e.jsx(Ls,{className:"h-3 w-3"})}),e.jsx(P,{variant:"ghost",size:"sm",className:"h-6 w-6 p-0",onClick:()=>_e(!1),children:e.jsx(Ds,{className:"h-3 w-3"})})]}):e.jsxs("span",{className:"cursor-pointer hover:underline",title:ne(t.publishedAt),onClick:()=>{vs(ze(t.publishedAt)),_e(!0)},children:[Qe(t.publishedAt),e.jsx(oa,{className:"inline ml-1 h-3 w-3 text-muted-foreground"})]})]}),t.lastPublishedAt&&t.lastPublishedAt!==t.publishedAt&&e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Last published"}),e.jsx("span",{title:ne(t.lastPublishedAt),children:Qe(t.lastPublishedAt)})]})]}):t.lastPublishedAt?e.jsxs("div",{className:"flex justify-between",children:[e.jsx("span",{className:"text-muted-foreground",children:"Last published"}),e.jsx("span",{title:ne(t.lastPublishedAt),children:Qe(t.lastPublishedAt)})]}):null,W==="scheduled"&&t.scheduledAt&&e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("span",{className:"text-muted-foreground",children:"Scheduled for"}),e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(Rs,{className:"h-3 w-3"}),ne(t.scheduledAt)]})]}),W==="schedule-failed"&&e.jsx("div",{className:"text-destructive text-xs",children:"Scheduled publishing failed after multiple attempts."}),t.publishedAt&&e.jsxs(P,{variant:"outline",size:"sm",className:"w-full mt-2",onClick:()=>{xe({kind:"published"}),oe(!0)},children:[e.jsx(da,{className:"mr-2 h-4 w-4"}),"View published"]})]})]}),e.jsx(kn,{host:a,contentId:n,onViewVersion:i=>{xe({kind:"history",blockId:i.blockId,createdAt:i.createdAt,title:i.title}),oe(!0)}}),!V&&e.jsx(yn,{deleteOpen:lt,setDeleteOpen:rt,onDelete:Nt,host:a,contentId:n})]});return e.jsx(qa.Provider,{value:o.active?o:null,children:e.jsxs("div",{className:"mx-auto max-w-6xl",children:[h.collaborationEnabled&&e.jsx("div",{className:"mb-3",children:e.jsx(bn,{status:o.status,editors:o.editors})}),g&&h.lockHolder&&e.jsx(rn,{lockHolder:h.lockHolder,onRequestCollaboration:()=>h.requestCollaboration.mutate(),isRequesting:h.requestCollaboration.isPending,requestSent:h.requestCollaboration.isSuccess}),g&&!h.lockHolder&&e.jsxs("div",{className:"bg-emerald-50 border border-emerald-200 rounded-lg p-4 mb-4 flex items-center justify-between gap-3","data-testid":"lock-available-banner",children:[e.jsx("p",{className:"text-sm text-emerald-900",children:"Lock available — you can take over editing now."}),e.jsx(P,{size:"sm",onClick:()=>void h.takeEditing(),"data-testid":"take-editing-btn",children:"Take editing"})]}),e.jsx(cn,{open:h.status==="expired",lockHolder:h.lockHolder,takeoverReason:h.takeoverReason,currentUserSub:y?.sub??"",onRequestCollaboration:()=>{h.requestCollaboration.mutate(),h.dismissModal()},onViewReadOnly:()=>h.dismissModal()}),e.jsx(on,{open:h.status==="same-user-other-tab",onTakeOver:()=>void h.forceTakeover(),onCancel:()=>h.dismissModal()}),!C&&e.jsxs("div",{className:"mb-4 flex flex-wrap items-center gap-2 md:mb-6 md:flex-nowrap md:gap-3 md:justify-between",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2 md:gap-3",children:[e.jsx("h1",{className:"truncate text-xl font-semibold md:text-2xl",children:V?x?.label??s:I||"Untitled"}),e.jsx(ua,{variant:Se.variant,children:Se.label}),k.isSaving&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[e.jsx(te,{className:"h-3 w-3 animate-spin"}),"Saving..."]}),!k.isSaving&&k.lastSavedAt&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[e.jsx(Ls,{className:"h-3 w-3"}),"Saved"]})]}),e.jsxs("div",{className:"flex gap-2 ml-auto",children:[e.jsx(gn,{host:a,contentId:n,collaborationEnabled:h.collaborationEnabled,hasConnectedPeers:o.editors.length>0,isLockHolder:h.status==="acquired",sessionId:h.sessionId,onChange:i=>h.setCollaborationEnabled(i),onBeforeDisable:o.sendDisableCollab}),e.jsxs(P,{variant:"outline",size:"sm",onClick:Ct,disabled:k.isSaving||g,className:"px-3",children:[k.isSaving&&e.jsx(te,{className:"mr-2 h-4 w-4 animate-spin"}),"Save Draft"]}),W==="scheduled"&&e.jsxs(e.Fragment,{children:[e.jsxs(P,{variant:"outline",size:"sm",onClick:Dt,disabled:b.isPending||g,className:"px-3",children:[b.isPending&&e.jsx(te,{className:"mr-2 h-4 w-4 animate-spin"}),"Cancel Schedule"]}),e.jsxs(P,{size:"sm",onClick:Pe,disabled:m.isPending||R||g,className:"px-3",children:[(m.isPending||R)&&e.jsx(te,{className:"mr-2 h-4 w-4 animate-spin"}),"Publish Now"]})]}),W!=="scheduled"&&Ne&&e.jsxs("div",{className:"flex",children:[e.jsxs(P,{size:"sm",onClick:Pe,disabled:m.isPending||R||g,className:qe("px-3",!t.publishedAt&&"rounded-r-none"),children:[(m.isPending||R)&&e.jsx(te,{className:"mr-2 h-4 w-4 animate-spin"}),Ne]}),!t.publishedAt&&e.jsxs(As,{children:[e.jsx(Es,{asChild:!0,children:e.jsx(P,{size:"sm",className:"rounded-l-none border-l px-2",disabled:m.isPending||R||g,children:e.jsx(ha,{className:"h-4 w-4"})})}),e.jsx(Ts,{align:"end",children:e.jsxs(Ke,{onClick:()=>ye(!0),disabled:g,children:[e.jsx(Rs,{className:"mr-2 h-4 w-4"}),"Schedule for later"]})})]})]}),t.publishedAt&&e.jsxs(As,{children:[e.jsx(Es,{asChild:!0,children:e.jsx(P,{variant:"outline",size:"sm",className:"size-8 p-0",disabled:g,children:e.jsx(ma,{className:"h-4 w-4"})})}),e.jsxs(Ts,{align:"end",children:[W==="published-changes"&&e.jsxs(Ke,{onClick:St,disabled:js.isPending||g,children:[e.jsx(fa,{className:"mr-2 h-4 w-4"}),"Discard Changes"]}),e.jsx(Ke,{onClick:wt,className:"text-destructive focus:text-destructive",disabled:g,children:"Unpublish"})]})]})]})]}),C?e.jsxs(zs,{defaultValue:"content",children:[e.jsxs("div",{className:"mb-2 flex items-center",children:[e.jsxs(Ys,{variant:"line",children:[e.jsx(Te,{value:"content",children:"Content"}),e.jsx(Te,{value:"info",children:"Info"})]}),e.jsxs("div",{className:"ml-auto flex gap-2",children:[e.jsxs(P,{variant:"outline",size:"sm",onClick:()=>k.flush({createVersion:!0}),disabled:k.isSaving||g,children:[k.isSaving&&e.jsx(te,{className:"mr-1 h-3 w-3 animate-spin"}),"Save"]}),W!=="scheduled"&&Ne&&e.jsxs(P,{size:"sm",onClick:Pe,disabled:m.isPending||g,children:[m.isPending&&e.jsx(te,{className:"mr-1 h-3 w-3 animate-spin"}),Ne]})]})]}),e.jsx(Ue,{value:"content",className:"mt-0",children:Cs}),e.jsx(Ue,{value:"info",className:"mt-0",children:ws})]}):e.jsxs("div",{className:"grid gap-6 lg:grid-cols-3",children:[e.jsx("div",{className:"lg:col-span-2",children:Cs}),e.jsx("div",{children:ws})]}),e.jsx(un,{open:ot,onOpenChange:i=>{oe(i),i||xe(null)},host:a,contentId:n,collectionFields:O,isSingleton:V,isPublished:!!t.publishedAt,draftBody:ie,draftMetadata:V?void 0:{title:I,slug:B,snippet:M,tags:G},initialVersion:dt,collectionRelationships:q,draftRelationships:le}),e.jsx(ds,{open:Ve,onOpenChange:ve,children:e.jsxs(us,{children:[e.jsxs(hs,{children:[e.jsx(ms,{children:"Publish changes?"}),e.jsx(fs,{children:X?e.jsxs(e.Fragment,{children:[X.added>0&&e.jsxs("span",{className:"text-green-600",children:["+",X.added," added"]}),X.added>0&&X.removed>0&&", ",X.removed>0&&e.jsxs("span",{className:"text-red-600",children:["-",X.removed," removed"]}),X.added===0&&X.removed===0&&e.jsx("span",{children:"No visible changes detected."})]}):"This will update the published version with your current changes."})]}),e.jsx("div",{className:"mb-2",children:e.jsx(P,{variant:"link",className:"p-0 h-auto text-sm",onClick:()=>{ve(!1),xe({kind:"draft"}),oe(!0)},children:"View full diff"})}),e.jsxs(ps,{children:[e.jsx(Zs,{children:"Cancel"}),e.jsx(bs,{onClick:()=>{ve(!1),Je()},children:"Publish Update"})]})]})}),e.jsx(ss,{open:ut,onOpenChange:je,children:e.jsxs(ts,{children:[e.jsxs(as,{children:[e.jsx(ns,{children:"Slug change detected"}),e.jsxs(is,{children:["You are changing the slug from “",t.slug,"” to “",B,"”. This may break external bookmarks and SEO links."]})]}),e.jsx(jn,{host:a,contentId:n}),e.jsxs(ls,{children:[e.jsx(P,{variant:"outline",onClick:()=>je(!1),children:"Cancel"}),e.jsx(P,{onClick:()=>{je(!1),Je()},children:"Publish Anyway"})]})]})}),e.jsx(ss,{open:ht,onOpenChange:ye,children:e.jsxs(ts,{children:[e.jsxs(as,{children:[e.jsx(ns,{children:"Schedule publishing"}),e.jsx(is,{children:"Choose a date and time to automatically publish this content. Times are rounded to the nearest 15-minute interval."})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx(Le,{htmlFor:"schedule-date",children:"Publish at"}),e.jsx("input",{id:"schedule-date",type:"datetime-local",value:ke,onChange:i=>xs(i.target.value),min:ze(Date.now()+1200*1e3),className:"w-full rounded-md border px-3 py-2 text-sm",step:"900"})]}),e.jsxs(ls,{children:[e.jsx(P,{variant:"outline",onClick:()=>ye(!1),children:"Cancel"}),e.jsxs(P,{onClick:Pt,disabled:!ke||S.isPending,children:[S.isPending&&e.jsx(te,{className:"mr-2 h-4 w-4 animate-spin"}),"Schedule"]})]})]})})]})})}function jn({host:a,contentId:s}){const{data:n}=Js(a,s,!0);return!n||n.count===0?null:e.jsxs("div",{className:"rounded-md border border-yellow-500/50 bg-yellow-50 p-3 text-sm dark:bg-yellow-950/30",children:[e.jsxs("p",{className:"font-medium text-yellow-800 dark:text-yellow-200",children:["This content is referenced by ",n.count," other"," ",n.count===1?"item":"items",":"]}),e.jsxs("ul",{className:"mt-1 list-disc pl-5 text-yellow-700 dark:text-yellow-300",children:[n.items.slice(0,5).map(t=>e.jsxs("li",{children:[t.title," (",t.collection,")"]},`${t.contentId}-${t.fieldName}`)),n.items.length>5&&e.jsxs("li",{children:["and ",n.items.length-5," more..."]})]})]})}function yn({deleteOpen:a,setDeleteOpen:s,onDelete:n,host:t,contentId:l}){const{data:c}=Js(t,l,a);return e.jsxs(e.Fragment,{children:[e.jsx(Ks,{}),e.jsxs(ss,{open:a,onOpenChange:s,children:[e.jsx(pa,{asChild:!0,children:e.jsxs(P,{variant:"destructive",className:"w-full",children:[e.jsx(ba,{className:"mr-2 h-4 w-4"}),"Delete"]})}),e.jsxs(ts,{children:[e.jsxs(as,{children:[e.jsx(ns,{children:"Delete content?"}),e.jsx(is,{children:"This action cannot be undone. The content will be permanently deleted."})]}),c&&c.count>0&&e.jsxs("div",{className:"rounded-md border border-yellow-500/50 bg-yellow-50 p-3 text-sm dark:bg-yellow-950/30",children:[e.jsxs("p",{className:"font-medium text-yellow-800 dark:text-yellow-200",children:["This content is referenced by ",c.count," other"," ",c.count===1?"item":"items",":"]}),e.jsxs("ul",{className:"mt-1 list-disc pl-5 text-yellow-700 dark:text-yellow-300",children:[c.items.slice(0,5).map(d=>e.jsxs("li",{children:[d.title," (",d.collection,")"]},`${d.contentId}-${d.fieldName}`)),c.items.length>5&&e.jsxs("li",{children:["and ",c.items.length-5," more..."]})]})]}),e.jsxs(ls,{children:[e.jsx(P,{variant:"outline",onClick:()=>s(!1),children:"Cancel"}),e.jsx(P,{variant:"destructive",onClick:n,children:"Delete"})]})]})]})]})}function kn({host:a,contentId:s,onViewVersion:n}){const{data:t}=Hs(a,s),[l,c]=r.useState(!1),d=t?.items??[],f=d.map(m=>m.createdBy).filter(Boolean),{resolve:u}=xa(f);return d.length===0?null:e.jsx(ue,{children:e.jsx(he,{className:"pt-4",children:e.jsxs(et,{open:l,onOpenChange:c,children:[e.jsxs(st,{className:"flex w-full items-center gap-2 text-sm font-medium",children:[e.jsx(Xs,{className:qe("h-4 w-4 transition",l&&"rotate-90")}),"Version History (",d.length,")"]}),e.jsx(tt,{className:"mt-2",children:e.jsx("div",{className:"space-y-1",children:d.map((m,v)=>e.jsxs("button",{className:"py-1 text-sm hover:bg-muted rounded px-1 -mx-1 transition-colors w-full text-left",onClick:()=>n(m),children:[e.jsx("span",{children:ne(m.createdAt)}),m.createdBy&&e.jsx("span",{className:"ml-2 text-muted-foreground",children:u(m.createdBy)}),m.title&&e.jsx("span",{className:"ml-2 text-muted-foreground",children:m.title})]},`${m.createdAt}-${v}`))})})]})})})}export{Xn as ContentEditPage};
@@ -0,0 +1 @@
1
+ import{j as e}from"./tanstack-Bs3zYPPV.js";import{r as C,u as P}from"./react-vendor-C2CvUxFh.js";import{C as w,b as D,c as F,P as k,D as E,e as O}from"./core.esm-DdQHdRkd.js";import{u as R,S as z,v as B,a as L}from"./sortable.esm-qVEMoaTg.js";import{ai as T,ad as h,j as v,B as p,X as b,P as V}from"./index-BA3y7HJs.js";import{P as G,a as M,b as Q}from"./popover-BFw_h3j6.js";import{C as q,a as A,b as X,c as _,d as H,e as J}from"./command-CdzYw11U.js";import{u as K,a as U}from"./useContentSearch-_bwacEth.js";function ce({field:l,value:r,onChange:s}){const{host:o}=P(),c=l.options,i=!!c?.multiple,a=c?.collections;return i?e.jsx(Y,{host:o,collections:a,value:r??[],onChange:s}):e.jsx(W,{host:o,collections:a,value:r,onChange:s})}function W({host:l,collections:r,value:s,onChange:o}){const[c,i]=C.useState(!1),a=s?[s.contentId]:[];function n(d){o(d),i(!1)}return e.jsx("div",{children:s?e.jsxs("div",{className:"flex items-center gap-3 rounded-md border p-2",children:[e.jsx(h,{className:"h-4 w-4 shrink-0 text-muted-foreground"}),e.jsx("span",{className:"flex-1 truncate text-sm",children:s.title}),e.jsx(v,{variant:"secondary",children:s.collection}),e.jsx(p,{type:"button",variant:"ghost",size:"sm",onClick:()=>o(null),children:e.jsx(b,{className:"h-3 w-3"})})]}):e.jsx(y,{host:l,collections:r,selectedIds:a,open:c,onOpenChange:i,onSelect:n,trigger:e.jsxs(p,{type:"button",variant:"outline",children:[e.jsx(h,{className:"mr-2 h-4 w-4"}),"Select Content"]})})})}function Y({host:l,collections:r,value:s,onChange:o}){const c=D(F(k)),[i,a]=C.useState(!1),n=s??[],d=n.map(t=>t.contentId),j=n.map(t=>t.contentId);function x(t){o([...n,t]),a(!1)}function f(t){o(n.filter((m,u)=>u!==t))}function g(t){const{active:m,over:u}=t;if(u&&m.id!==u.id){const I=n.findIndex(S=>S.contentId===String(m.id)),N=n.findIndex(S=>S.contentId===String(u.id));I!==-1&&N!==-1&&o(L(n,I,N))}}return e.jsx(E,{sensors:c,collisionDetection:O,onDragEnd:g,children:e.jsx(z,{items:d,strategy:B,children:e.jsxs("div",{className:"space-y-2",children:[n.map(t=>e.jsx(Z,{id:t.contentId,contentRef:t,onRemove:()=>f(n.indexOf(t))},t.contentId)),e.jsx(y,{host:l,collections:r,selectedIds:j,open:i,onOpenChange:a,onSelect:x,trigger:e.jsxs(p,{type:"button",variant:"outline",size:"sm",children:[e.jsx(V,{className:"mr-2 h-3 w-3"}),"Add Content"]})})]})})})}function Z({id:l,contentRef:r,onRemove:s}){const{attributes:o,listeners:c,setNodeRef:i,transform:a,transition:n}=R({id:l}),d={transform:w.Transform.toString(a),transition:n};return e.jsxs("div",{ref:i,style:d,className:"flex items-center gap-2 rounded-md border p-2",children:[e.jsx("button",{type:"button",className:"cursor-grab touch-none text-muted-foreground hover:text-foreground",...o,...c,children:e.jsx(T,{className:"h-4 w-4"})}),e.jsx(h,{className:"h-4 w-4 shrink-0 text-muted-foreground"}),e.jsx("span",{className:"flex-1 truncate text-sm",children:r.title}),e.jsx(v,{variant:"secondary",children:r.collection}),e.jsx(p,{type:"button",variant:"ghost",size:"sm",onClick:s,className:"text-destructive",children:e.jsx(b,{className:"h-3 w-3"})})]})}function y({host:l,collections:r,selectedIds:s,open:o,onOpenChange:c,onSelect:i,trigger:a,status:n}){const[d,j]=C.useState(""),x=K(d,300),{data:f,isLoading:g}=U(l,x,r,n);return e.jsxs(G,{open:o,onOpenChange:c,children:[e.jsx(M,{asChild:!0,children:a}),e.jsx(Q,{className:"w-80 p-0",align:"start",children:e.jsxs(q,{shouldFilter:!1,children:[e.jsx(A,{placeholder:"Search content...",value:d,onValueChange:j}),e.jsx(X,{children:g?e.jsx("p",{className:"py-6 text-center text-sm text-muted-foreground",children:"Searching..."}):e.jsxs(e.Fragment,{children:[e.jsx(_,{children:"No content found."}),e.jsx(H,{heading:x.length===0?"Recent":void 0,children:f?.items.map(t=>{const m=s.includes(t.contentId);return e.jsxs(J,{value:t.contentId,disabled:m,onSelect:()=>i({contentId:t.contentId,collection:t.collection,slug:t.slug??"",title:t.title}),children:[e.jsx(h,{className:"h-4 w-4"}),e.jsx("span",{className:"flex-1 truncate",children:t.title}),e.jsx(v,{variant:"outline",className:"text-xs",children:t.collection})]},t.contentId)})})]})})]})})]})}export{ce as C,Z as S,y as a};
@@ -0,0 +1 @@
1
+ import{j as s}from"./tanstack-Bs3zYPPV.js";import{u as Ce,f as ke,r as S}from"./react-vendor-C2CvUxFh.js";import{w as ye,x as Ae,B as R,P as ie,v as w,z as de,I as oe,X as B,A as Pe,L as z,j as T,S as Te,a as _e,y as Ie}from"./index-BA3y7HJs.js";import{d as $e,e as Fe,a as Ve,b as Be,c as De}from"./useContent-CW0tm0FY.js";import{u as Le}from"./useTags-ybsMbCst.js";import{u as Ue}from"./useContentSearch-_bwacEth.js";import{u as qe}from"./usePageTitle-DYvuJQp6.js";import{u as Me}from"./useFilterParams-DYdEuWPE.js";import{m as ue}from"./media-url-DIg_vSyf.js";import{u as Re,F as ze}from"./FilterBar-kFcOLffg.js";import{C as Oe,c as Ee}from"./card-CZTHR2Qa.js";import{C as Z}from"./checkbox-DEgzM8H9.js";import{P as He,a as We,b as Xe}from"./popover-BFw_h3j6.js";import{S as C,a as k,b as y,c as A,d as o}from"./select-dX9e6VDt.js";import{T as Ze,a as Ge,b as he,c as D,d as Qe,e as L}from"./table-Dk7eeOt2.js";import{a as I,f as xe}from"./format-C88SDH8g.js";import{g as me,a as ge}from"./contentStatus-CkPi9Dh6.js";import{B as Je}from"./BulkActionBar--35xjnOP.js";import{P as Ke}from"./Pagination-CuHwUPHi.js";import"./radix-C5ZmWuuL.js";import"./command-CdzYw11U.js";const O=3,fe=[{value:"updated_desc",label:"Last updated"},{value:"updated_asc",label:"Oldest updated"},{value:"title_asc",label:"Title A–Z",requiresCollection:!0},{value:"title_desc",label:"Title Z–A",requiresCollection:!0},{value:"created_desc",label:"Newest created"},{value:"created_asc",label:"Oldest created"}],G=[{value:"all",label:"All statuses"},{value:"draft",label:"Draft"},{value:"published",label:"Published"},{value:"changed",label:"Changed"},{value:"unpublished",label:"Unpublished"},{value:"scheduled",label:"Scheduled"}];function bs(){const{host:c,collection:r}=Ce(),_=ke(),{collections:pe}=ye(),[i,a]=Me([{key:"q",defaultValue:""},{key:"search",defaultValue:"prefix"},{key:"tag",defaultValue:""},{key:"status",defaultValue:""},{key:"sort",defaultValue:"updated_desc"},{key:"relatedTo",defaultValue:""},{key:"relField",defaultValue:""},{key:"page",defaultValue:"1"},{key:"perPage",defaultValue:"20"},{key:"after",defaultValue:""}]),$=i.search,x=i.tag||void 0,m=i.status||void 0,g=i.sort,j=i.relatedTo,v=i.relField,b=Number(i.page)||1,E=Number(i.perPage)||20,Q=S.useMemo(()=>{const e=i.after;return e?e.split(","):[]},[i.after]),[F,V]=S.useState(i.q),[u,t]=S.useState(new Set),H=Ae(),f=pe.find(e=>e.name===r),U=f?.relationships??[],{data:J}=Re(c,j||void 0),K=S.useMemo(()=>{if(!j||!v)return null;const e=U.find(n=>n.name===v);return{type:"relationship",relName:v,relLabel:e?.label??v,contentId:j,contentTitle:J??"Loading..."}},[j,v,U,J]);qe({title:f?.label??r??"",actions:f?.singleton?void 0:s.jsx(R,{size:"sm",onClick:()=>_(`/sites/${c}/content/${r}/new`),children:s.jsx(ie,{className:"h-4 w-4"})})});const h=Ue(F,300);S.useEffect(()=>{h!==i.q&&a({q:h})},[h,i.q,a]);const N=S.useCallback(()=>{a({page:"1",after:""}),t(new Set)},[a]),je=S.useMemo(()=>{const e={};return h&&(e.q=h,e.search=$),x&&(e.tag=x),m&&(e.status=m),g!=="updated_desc"&&(e.sort=g),j&&(e.relatedTo=j),v&&(e.relField=v),e.limit=E,e},[h,$,x,m,g,j,v,E]),ve=b>1?Q[b-2]:void 0,{data:P,isLoading:be}=$e(c,r,je,ve),W=Fe(c),Y=Ve(c),ee=Be(c),se=De(c),{data:ae}=Le(c),q=S.useMemo(()=>ae?.map(e=>e.tag)??[],[ae]);if(f?.singleton&&P?.items.length===1)return _(`/sites/${c}/content/${r}/${P.items[0].contentId}`,{replace:!0}),null;const M=P?.items,X=M?.map(e=>e.contentId)??[],te=X.length>0&&X.every(e=>u.has(e));function le(e){t(n=>{const l=new Set(n);return l.has(e)?l.delete(e):l.add(e),l})}function Ne(){t(te?new Set:new Set(X))}const ne=!!(h||x||m||j),re=!!h,ce=[$!=="prefix"?1:0,x?1:0,m?1:0,g!=="updated_desc"?1:0].reduce((e,n)=>e+n,0),Se=Y.isPending||ee.isPending||se.isPending;async function we(){try{const e=await W.mutateAsync({collection:r,title:f?.label??r});w.success("Singleton content recreated"),_(`/sites/${c}/content/${r}/${e.contentId}`)}catch(e){w.error("Failed to recreate singleton",{description:e instanceof Error?e.message:void 0})}}return s.jsxs("div",{children:[!H&&s.jsxs("div",{className:"mb-6 flex items-center justify-between",children:[s.jsx("h1",{className:"text-2xl font-semibold",children:f?.label??r}),!f?.singleton&&s.jsxs(R,{onClick:()=>_(`/sites/${c}/content/${r}/new`),children:[s.jsx(ie,{className:"mr-2 h-4 w-4"}),"New"]})]}),u.size>0?s.jsx(Je,{selectedCount:u.size,onPublish:async()=>{const e=[...u],l=(await Y.mutateAsync(e)).filter(d=>d.status==="rejected").length;l?w.error(`${l} of ${e.length} failed to publish`):w.success(`${e.length} item(s) published`),N()},onUnpublish:async()=>{const e=[...u],l=(await ee.mutateAsync(e)).filter(d=>d.status==="rejected").length;l?w.error(`${l} of ${e.length} failed to unpublish`):w.success(`${e.length} item(s) unpublished`),N()},onDelete:async()=>{const e=[...u],l=(await se.mutateAsync(e)).filter(d=>d.status==="rejected").length;l?w.error(`${l} of ${e.length} failed to delete`):w.success(`${e.length} item(s) deleted`),N()},onClear:()=>t(new Set),isPending:Se}):H?s.jsxs("div",{className:"mb-4 flex items-center gap-2",children:[s.jsxs("div",{className:"relative flex-1",children:[s.jsx(de,{className:"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground"}),s.jsx(oe,{placeholder:"Search...",value:F,onChange:e=>{V(e.target.value),N()},className:"pl-8 pr-8"}),F&&s.jsx("button",{onClick:()=>{V(""),N()},className:"absolute right-2 top-2.5 text-muted-foreground hover:text-foreground",children:s.jsx(B,{className:"h-4 w-4"})})]}),s.jsxs(He,{children:[s.jsx(We,{asChild:!0,children:s.jsxs(R,{variant:"outline",size:"icon",className:"relative shrink-0","aria-label":"Filters",children:[s.jsx(Pe,{className:"h-4 w-4"}),ce>0&&s.jsx("span",{className:"absolute -right-1 -top-1 flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[10px] text-primary-foreground",children:ce})]})}),s.jsxs(Xe,{className:"w-64 space-y-3",align:"end",children:[s.jsxs("div",{className:"space-y-2",children:[s.jsx(z,{className:"text-xs font-medium",children:"Search Mode"}),s.jsxs(C,{value:$,onValueChange:e=>{a({search:e,page:"1",after:""}),t(new Set)},children:[s.jsx(k,{children:s.jsx(y,{})}),s.jsxs(A,{children:[s.jsx(o,{value:"prefix",children:"Starts with"}),s.jsx(o,{value:"full",children:"Contains"})]})]})]}),q.length>0&&s.jsxs("div",{className:"space-y-2",children:[s.jsx(z,{className:"text-xs font-medium",children:"Tag"}),s.jsxs(C,{value:x??"__all__",onValueChange:e=>{a({tag:e==="__all__"?"":e,page:"1",after:""}),t(new Set)},children:[s.jsx(k,{children:s.jsx(y,{})}),s.jsxs(A,{children:[s.jsx(o,{value:"__all__",children:"All tags"}),q.map(e=>s.jsx(o,{value:e,children:e},e))]})]})]}),s.jsxs("div",{className:"space-y-2",children:[s.jsx(z,{className:"text-xs font-medium",children:"Status"}),s.jsxs(C,{value:m??"all",onValueChange:e=>{a({status:e==="all"?"":e,page:"1",after:""}),t(new Set)},children:[s.jsx(k,{children:s.jsx(y,{})}),s.jsx(A,{children:G.map(e=>s.jsx(o,{value:e.value??"all",children:e.label},e.value??"all"))})]})]}),s.jsxs("div",{className:"space-y-2",children:[s.jsx(z,{className:"text-xs font-medium",children:"Sort"}),s.jsxs(C,{value:g,onValueChange:e=>{a({sort:e,page:"1",after:""}),t(new Set)},disabled:re,children:[s.jsx(k,{children:s.jsx(y,{})}),s.jsx(A,{children:fe.map(e=>s.jsx(o,{value:e.value,disabled:e.requiresCollection&&!r,children:e.label},e.value))})]})]})]})]})]}):s.jsxs("div",{className:"mb-4 flex flex-wrap items-center gap-2",children:[s.jsxs("div",{className:"relative flex items-center",children:[s.jsx(de,{className:"absolute left-2.5 h-4 w-4 text-muted-foreground"}),s.jsx(oe,{placeholder:"Search titles...",value:F,onChange:e=>{V(e.target.value),N()},className:"w-56 pl-8 pr-8"}),F&&s.jsx("button",{onClick:()=>{V(""),N()},className:"absolute right-2 text-muted-foreground hover:text-foreground",children:s.jsx(B,{className:"h-4 w-4"})})]}),s.jsxs(C,{value:$,onValueChange:e=>{a({search:e,page:"1",after:""}),t(new Set)},children:[s.jsx(k,{className:"w-[130px]",children:s.jsx(y,{})}),s.jsxs(A,{children:[s.jsx(o,{value:"prefix",children:"Starts with"}),s.jsx(o,{value:"full",children:"Contains"})]})]}),q.length>0&&s.jsxs(C,{value:x??"__all__",onValueChange:e=>{a({tag:e==="__all__"?"":e,page:"1",after:""}),t(new Set)},children:[s.jsx(k,{className:"w-[140px]",children:s.jsx(y,{placeholder:"Tag"})}),s.jsxs(A,{children:[s.jsx(o,{value:"__all__",children:"All tags"}),q.map(e=>s.jsx(o,{value:e,children:e},e))]})]}),s.jsxs(C,{value:m??"all",onValueChange:e=>{a({status:e==="all"?"":e,page:"1",after:""}),t(new Set)},children:[s.jsx(k,{className:"w-[150px]",children:s.jsx(y,{})}),s.jsx(A,{children:G.map(e=>s.jsx(o,{value:e.value??"all",children:e.label},e.value??"all"))})]}),s.jsx("div",{className:"ml-auto",children:s.jsxs(C,{value:g,onValueChange:e=>{a({sort:e,page:"1",after:""}),t(new Set)},disabled:re,children:[s.jsx(k,{className:"w-[170px]",children:s.jsx(y,{})}),s.jsx(A,{children:fe.map(e=>s.jsx(o,{value:e.value,disabled:e.requiresCollection&&!r,children:e.label},e.value))})]})})]}),U.length>0&&s.jsx("div",{className:"mb-3",children:s.jsx(ze,{relationships:U,activeFilters:K?[K]:[],onFilterAdd:e=>{a({relatedTo:e.contentId,relField:e.relName,page:"1",after:""}),t(new Set)},onFilterRemove:()=>{a({relatedTo:"",relField:"",page:"1",after:""}),t(new Set)}})}),ne&&u.size===0&&s.jsxs("div",{className:"mb-3 flex flex-wrap items-center gap-1.5",children:[h&&s.jsxs(T,{variant:"secondary",className:"gap-1",children:["Search: ",h,s.jsx("button",{onClick:()=>{V(""),N()},children:s.jsx(B,{className:"h-3 w-3"})})]}),x&&s.jsxs(T,{variant:"secondary",className:"gap-1",children:["Tag: ",x,s.jsx("button",{onClick:()=>{a({tag:"",page:"1",after:""}),t(new Set)},children:s.jsx(B,{className:"h-3 w-3"})})]}),m&&s.jsxs(T,{variant:"secondary",className:"gap-1",children:["Status: ",G.find(e=>e.value===m)?.label,s.jsx("button",{onClick:()=>{a({status:"",page:"1",after:""}),t(new Set)},children:s.jsx(B,{className:"h-3 w-3"})})]})]}),be?s.jsx("div",{className:"space-y-2",children:Array.from({length:5}).map((e,n)=>s.jsx(Te,{className:"h-12 w-full"},n))}):M?.length?s.jsxs(s.Fragment,{children:[H?s.jsx("div",{className:"grid gap-3 sm:grid-cols-2","data-testid":"content-card-view",children:M.map(e=>{const n=me(e.publishedAt,e.lastPublishedAt,e.publishedBlockId,e.lastDraftBlockId,e.scheduledAt,e.scheduledFailed),l=ge(n),d=e.tags??[];return s.jsx(Oe,{className:Ie("cursor-pointer gap-0 overflow-hidden py-0 transition-shadow hover:shadow-md",u.has(e.contentId)&&"ring-2 ring-primary"),onClick:()=>_(`/sites/${c}/content/${r}/${e.contentId}`),children:s.jsxs(Ee,{className:"p-3",children:[s.jsxs("div",{className:"flex items-start gap-3 min-w-0",children:[e.cover?.url&&s.jsx("img",{src:ue(e.cover.url),alt:e.cover.alt??"",className:"h-12 w-12 rounded object-cover flex-shrink-0"}),s.jsxs("div",{className:"min-w-0 flex-1",children:[s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:"font-medium truncate",children:e.draftTitle||e.title||"Untitled"}),s.jsx(T,{variant:l.variant,className:"shrink-0",children:l.label})]}),(e.draftSlug||e.slug)&&s.jsxs("p",{className:"text-xs text-muted-foreground truncate mt-0.5",children:["/",e.draftSlug||e.slug]}),s.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:g.startsWith("created")?e.createdAt?I(e.createdAt):"—":e.lastDraftAt?I(e.lastDraftAt):"—"})]}),s.jsx(Z,{checked:u.has(e.contentId),onCheckedChange:()=>le(e.contentId),onClick:p=>p.stopPropagation(),className:"mt-1"})]}),d.length>0&&s.jsx("div",{className:"mt-2 flex flex-wrap gap-1",children:d.slice(0,O).map(p=>s.jsx(T,{variant:"outline",className:"text-[10px] px-1.5 py-0",children:p},p))})]})},e.contentId)})}):s.jsxs(Ze,{children:[s.jsx(Ge,{children:s.jsxs(he,{children:[s.jsx(D,{className:"w-10",children:s.jsx(Z,{checked:te,onCheckedChange:Ne,"aria-label":"Select all"})}),s.jsx(D,{children:"Title"}),s.jsx(D,{children:"Slug"}),s.jsx(D,{children:"Status"}),s.jsx(D,{children:g.startsWith("created")?"Created":"Updated"})]})}),s.jsx(Qe,{children:M.map(e=>{const n=me(e.publishedAt,e.lastPublishedAt,e.publishedBlockId,e.lastDraftBlockId),l=ge(n),d=e.tags??[];return s.jsxs(he,{className:"cursor-pointer",onClick:()=>_(`/sites/${c}/content/${r}/${e.contentId}`),children:[s.jsx(L,{onClick:p=>p.stopPropagation(),children:s.jsx(Z,{checked:u.has(e.contentId),onCheckedChange:()=>le(e.contentId),"aria-label":`Select ${e.draftTitle||e.title||"Untitled"}`})}),s.jsx(L,{className:"font-medium",children:s.jsxs("div",{className:"flex items-center gap-3",children:[e.cover?.url&&s.jsx("img",{src:ue(e.cover.url),alt:e.cover.alt??"",className:"h-8 w-8 rounded object-cover flex-shrink-0"}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("span",{children:e.draftTitle||e.title||"Untitled"}),d.length>0&&s.jsxs("div",{className:"mt-0.5 flex flex-wrap gap-1",children:[d.slice(0,O).map(p=>s.jsx(T,{variant:"outline",className:"text-[10px] px-1.5 py-0 font-normal text-muted-foreground",children:p},p)),d.length>O&&s.jsxs("span",{className:"text-[10px] text-muted-foreground",children:["+",d.length-O," more"]})]})]})]})}),s.jsx(L,{className:"text-muted-foreground text-sm",children:e.draftSlug||e.slug||"—"}),s.jsx(L,{children:s.jsx(T,{variant:l.variant,children:l.label})}),s.jsx(L,{className:"text-muted-foreground",children:g.startsWith("created")?e.createdAt?I(e.createdAt):"—":e.scheduledAt&&!e.publishedAt?s.jsxs("span",{title:xe(e.scheduledAt),children:["Scheduled ",I(e.scheduledAt)]}):e.publishedAt?s.jsx("span",{title:xe(e.publishedAt),children:I(e.publishedAt)}):e.lastDraftAt?I(e.lastDraftAt):"—"})]},e.contentId)})})]}),s.jsx(Ke,{page:b,hasNext:!!P?.hasMore,hasPrevious:b>1,onNext:()=>{if(P?.items.length){const e=P.items[P.items.length-1].contentId,n=[...Q.slice(0,b-1),e];a({page:String(b+1),after:n.join(",")})}else a({page:String(b+1)});t(new Set)},onPrevious:()=>{const e=b-1;a(e<=1?{page:"1",after:""}:{page:String(e)}),t(new Set)},perPage:E,onPerPageChange:e=>{a({perPage:String(e),page:"1",after:""}),t(new Set)}})]}):f?.singleton?s.jsxs("div",{className:"space-y-4",children:[s.jsx("p",{className:"text-muted-foreground",children:"Singleton content is missing. Click below to recreate it."}),s.jsxs(R,{onClick:we,disabled:W.isPending,children:[W.isPending&&s.jsx(_e,{className:"mr-2 h-4 w-4 animate-spin"}),"Recreate ",f.label]})]}):s.jsx("p",{className:"text-muted-foreground",children:ne?"No content matches the current filters.":"No content yet."})]})}export{bs as ContentListPage};