convex-cms 0.0.9-alpha.9 → 0.0.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 (117) hide show
  1. package/admin/src/components/Header.tsx +1 -1
  2. package/admin/src/components/RouteGuard.tsx +1 -1
  3. package/admin/src/components/UploadDropzone.tsx +1 -1
  4. package/admin/src/components/ui/sidebar.tsx +1 -1
  5. package/admin/src/contexts/AuthContext.tsx +1 -1
  6. package/admin/src/embed/components/EmbedSidebar.tsx +10 -10
  7. package/admin/src/embed/contexts/ApiContext.tsx +1 -1
  8. package/admin/src/hooks/usePermissions.ts +1 -1
  9. package/admin/src/index.css +432 -0
  10. package/admin/src/lib/cmsExports.ts +6 -0
  11. package/admin/src/pages/DashboardPage.tsx +2 -3
  12. package/admin/src/routes/__root.tsx +1 -1
  13. package/admin-dist/nitro.json +1 -1
  14. package/admin-dist/public/assets/{CmsEmptyState-DTlpzjOI.js → CmsEmptyState-BKeL4DBB.js} +1 -1
  15. package/admin-dist/public/assets/CmsFilterBar-CEpMHd_c.js +1 -0
  16. package/admin-dist/public/assets/{CmsPageHeader-0REGRH4X.js → CmsPageHeader-CIEkTbyH.js} +1 -1
  17. package/admin-dist/public/assets/{CmsStatusBadge-D_n8u8xa.js → CmsStatusBadge-BFMOsfMW.js} +1 -1
  18. package/admin-dist/public/assets/{CmsSurface-BHmvNai4.js → CmsSurface-kqqaFKUI.js} +1 -1
  19. package/admin-dist/public/assets/CmsTable-Db53Exq0.js +1 -0
  20. package/admin-dist/public/assets/ContentEntryEditor-Ct7cHayy.js +4 -0
  21. package/admin-dist/public/assets/TaxonomyFilter-Bm1DI1A7.js +1 -0
  22. package/admin-dist/public/assets/_contentTypeId-BekeCblX.js +1 -0
  23. package/admin-dist/public/assets/{_entryId-jPXz4z9T.js → _entryId-CoZDE0l0.js} +1 -1
  24. package/admin-dist/public/assets/{alert-CG97cMfC.js → alert-CpLdsTGU.js} +1 -1
  25. package/admin-dist/public/assets/{badge-C6qt24oj.js → badge-BQAotc5B.js} +1 -1
  26. package/admin-dist/public/assets/{circle-check-big-PltpxuB1.js → circle-check-big-BF3Y5nES.js} +1 -1
  27. package/admin-dist/public/assets/{command-CJ8i86fd.js → command-lEq6f_Ee.js} +1 -1
  28. package/admin-dist/public/assets/content-DH6k0dN6.js +1 -0
  29. package/admin-dist/public/assets/content-types-DHr9tc2V.js +1 -0
  30. package/admin-dist/public/assets/index-Cf0lbl0G.js +1 -0
  31. package/admin-dist/public/assets/index-D-4wFfgU.css +1 -0
  32. package/admin-dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  33. package/admin-dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  34. package/admin-dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  35. package/admin-dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  36. package/admin-dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  37. package/admin-dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  38. package/admin-dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  39. package/admin-dist/public/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  40. package/admin-dist/public/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  41. package/admin-dist/public/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  42. package/admin-dist/public/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  43. package/admin-dist/public/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  44. package/admin-dist/public/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  45. package/admin-dist/public/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  46. package/admin-dist/public/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  47. package/admin-dist/public/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  48. package/admin-dist/public/assets/main-B-6700eG.js +137 -0
  49. package/admin-dist/public/assets/media-DY5zD52L.js +1 -0
  50. package/admin-dist/public/assets/{new._contentTypeId-qsvo01mH.js → new._contentTypeId-Dq_NqTQV.js} +1 -1
  51. package/admin-dist/public/assets/{pencil-gAL0R34f.js → pencil-CI_KfxSx.js} +1 -1
  52. package/admin-dist/public/assets/refresh-cw-BrXg9a2r.js +1 -0
  53. package/admin-dist/public/assets/rotate-ccw-PwzxdPxd.js +1 -0
  54. package/admin-dist/public/assets/{scroll-area-CJBhf9pf.js → scroll-area-DX_nZYp8.js} +1 -1
  55. package/admin-dist/public/assets/{search-WXp6KxDJ.js → search-DlwBH4C5.js} +1 -1
  56. package/admin-dist/public/assets/settings-2mx3_ORG.js +1 -0
  57. package/admin-dist/public/assets/{switch-Ck9ecqEX.js → switch-CjPi4DKH.js} +1 -1
  58. package/admin-dist/public/assets/{tabs-vQYu8rjC.js → tabs-B5X37GEM.js} +1 -1
  59. package/admin-dist/public/assets/tanstack-adapter-KSm-nO5L.js +1 -0
  60. package/admin-dist/public/assets/{taxonomies-DvILUNvr.js → taxonomies-CHjJKNlR.js} +1 -1
  61. package/admin-dist/public/assets/trash-Cle-tcqq.js +1 -0
  62. package/admin-dist/public/assets/{useBreadcrumbLabel-tlSh7dtO.js → useBreadcrumbLabel-yZQG_N_3.js} +1 -1
  63. package/admin-dist/public/assets/{usePermissions-BTGdTOJS.js → usePermissions-D6vsoaJf.js} +1 -1
  64. package/admin-dist/server/_libs/convex-helpers.mjs +1077 -2
  65. package/admin-dist/server/_libs/convex.mjs +222 -13
  66. package/admin-dist/server/_libs/lucide-react.mjs +57 -51
  67. package/admin-dist/server/_ssr/{CmsEmptyState-CB6e53i5.mjs → CmsEmptyState-DzzuQG0S.mjs} +1 -1
  68. package/admin-dist/server/_ssr/CmsFilterBar-C5XADS12.mjs +81 -0
  69. package/admin-dist/server/_ssr/{CmsPageHeader-COUHuECp.mjs → CmsPageHeader-DZ6h7smh.mjs} +1 -1
  70. package/admin-dist/server/_ssr/{CmsStatusBadge-kMTL6koE.mjs → CmsStatusBadge-D-YFSAa1.mjs} +3 -3
  71. package/admin-dist/server/_ssr/{CmsSurface-D1HDYjRg.mjs → CmsSurface-Cv51NBLZ.mjs} +1 -1
  72. package/admin-dist/server/_ssr/CmsTable-DG88C5nO.mjs +189 -0
  73. package/admin-dist/server/_ssr/{ContentEntryEditor-Bq8FR_uK.mjs → ContentEntryEditor-CRjwXB17.mjs} +10 -10
  74. package/admin-dist/server/_ssr/{TaxonomyFilter-bm_p4ADg.mjs → TaxonomyFilter-xGwcgtjr.mjs} +3 -3
  75. package/admin-dist/server/_ssr/{_contentTypeId-B7obLmi_.mjs → _contentTypeId-DRCfeKkm.mjs} +53 -12
  76. package/admin-dist/server/_ssr/{_entryId-B4zhQqFg.mjs → _entryId-DULm2TDy.mjs} +11 -11
  77. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-iX3K33p1.mjs +4 -0
  78. package/admin-dist/server/_ssr/{badge-NOEC9bkk.mjs → badge-CbjIvhb6.mjs} +1 -1
  79. package/admin-dist/server/_ssr/{command-h4-OYNBo.mjs → command-xB2uiYps.mjs} +2 -2
  80. package/admin-dist/server/_ssr/{content-CShtLuhK.mjs → content-BfLBaJCZ.mjs} +108 -138
  81. package/admin-dist/server/_ssr/{content-types-PeyRyfbc.mjs → content-types-DZbF6O2q.mjs} +130 -119
  82. package/admin-dist/server/_ssr/{index-CplFXpGg.mjs → index-Cfe8sZv5.mjs} +65 -39
  83. package/admin-dist/server/_ssr/index.mjs +2 -2
  84. package/admin-dist/server/_ssr/{media-QAkNdX54.mjs → media-Bds2AnPC.mjs} +36 -56
  85. package/admin-dist/server/_ssr/{new._contentTypeId-DEJyMphJ.mjs → new._contentTypeId-DGvz_tlW.mjs} +10 -10
  86. package/admin-dist/server/_ssr/{router-CQXMuGMF.mjs → router-DxF7GBcO.mjs} +8804 -4995
  87. package/admin-dist/server/_ssr/{scroll-area-B7zoNyWB.mjs → scroll-area-DLDlXI07.mjs} +1 -1
  88. package/admin-dist/server/_ssr/{settings-CNaqVa4D.mjs → settings-BbaiS6z9.mjs} +13 -10
  89. package/admin-dist/server/_ssr/{switch-BKZhvryc.mjs → switch-Bl89Pfxu.mjs} +1 -1
  90. package/admin-dist/server/_ssr/{tabs-DtIIQxiD.mjs → tabs-QkbR0iir.mjs} +3 -3
  91. package/admin-dist/server/_ssr/{tanstack-adapter-CLavdbUY.mjs → tanstack-adapter-CKknPtcU.mjs} +19 -1
  92. package/admin-dist/server/_ssr/{taxonomies-vIZYICzr.mjs → taxonomies-S_Ontd0z.mjs} +9 -9
  93. package/admin-dist/server/_ssr/{trash-7yGR4-dF.mjs → trash-BzAIsbbN.mjs} +109 -132
  94. package/admin-dist/server/_ssr/{useBreadcrumbLabel-DR5FaAMf.mjs → useBreadcrumbLabel-BjiR1fM_.mjs} +1 -1
  95. package/admin-dist/server/_ssr/{usePermissions-DKkpETj_.mjs → usePermissions-CDHN95Nz.mjs} +1 -1
  96. package/admin-dist/server/index.mjs +284 -165
  97. package/package.json +3 -2
  98. package/admin/src/styles/globals.css +0 -82
  99. package/admin/src/styles/tailwind-config.css +0 -111
  100. package/admin/src/styles/theme.css +0 -384
  101. package/admin-dist/public/assets/CmsToolbar-CY6GV2L8.js +0 -1
  102. package/admin-dist/public/assets/ContentEntryEditor-CRgcRkk5.js +0 -4
  103. package/admin-dist/public/assets/TaxonomyFilter-Ohv5Jg9c.js +0 -1
  104. package/admin-dist/public/assets/_contentTypeId-C_vJq22X.js +0 -1
  105. package/admin-dist/public/assets/content-pKaIL2ru.js +0 -1
  106. package/admin-dist/public/assets/content-types-Bl_8I1Re.js +0 -1
  107. package/admin-dist/public/assets/globals-CoCRjt0K.css +0 -1
  108. package/admin-dist/public/assets/index-CtHq_P5q.js +0 -1
  109. package/admin-dist/public/assets/main-CA-4LyFT.js +0 -107
  110. package/admin-dist/public/assets/media-Bl1tBbJQ.js +0 -1
  111. package/admin-dist/public/assets/refresh-cw-sdVUGJNs.js +0 -1
  112. package/admin-dist/public/assets/rotate-ccw-6OcXCcxb.js +0 -1
  113. package/admin-dist/public/assets/settings-D8crrFCn.js +0 -1
  114. package/admin-dist/public/assets/tanstack-adapter-BRt2CUCw.js +0 -1
  115. package/admin-dist/public/assets/trash-YyYaC3L9.js +0 -1
  116. package/admin-dist/server/_ssr/CmsToolbar-NB014hsd.mjs +0 -48
  117. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DndoqCo7.mjs +0 -4
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
2
  import { R as Root, V as Viewport, C as Corner, S as ScrollAreaScrollbar, a as ScrollAreaThumb } from "../_chunks/_libs/@radix-ui/react-scroll-area.mjs";
3
- import { f as cn } from "./router-CQXMuGMF.mjs";
3
+ import { e as cn } from "./router-DxF7GBcO.mjs";
4
4
  function ScrollArea({
5
5
  className,
6
6
  children,
@@ -1,13 +1,13 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { h as api, j as useAdminConfig, R as RouteGuard, C as CmsButton, L as Label, S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem, k as useTheme, f as cn } from "./router-CQXMuGMF.mjs";
3
- import { B as Badge } from "./badge-NOEC9bkk.mjs";
4
- import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-CLavdbUY.mjs";
5
- import { u as usePermissions } from "./usePermissions-DKkpETj_.mjs";
6
- import { C as CmsPageHeader } from "./CmsPageHeader-COUHuECp.mjs";
7
- import { C as CmsSurface } from "./CmsSurface-D1HDYjRg.mjs";
8
- import { S as Switch } from "./switch-BKZhvryc.mjs";
9
- import { u as useQuery, f as useMutation } from "../_libs/convex.mjs";
10
- import { i as Check, X, z as Lock, a5 as Info, a6 as Sun, a7 as Moon, a8 as Monitor } from "../_libs/lucide-react.mjs";
2
+ import { b as api, f as useAdminConfig, R as RouteGuard, C as CmsButton, L as Label, S as Select, g as SelectTrigger, h as SelectValue, i as SelectContent, j as SelectItem, k as useTheme, e as cn } from "./router-DxF7GBcO.mjs";
3
+ import { B as Badge } from "./badge-CbjIvhb6.mjs";
4
+ import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-CKknPtcU.mjs";
5
+ import { u as usePermissions } from "./usePermissions-CDHN95Nz.mjs";
6
+ import { C as CmsPageHeader } from "./CmsPageHeader-DZ6h7smh.mjs";
7
+ import { C as CmsSurface } from "./CmsSurface-Cv51NBLZ.mjs";
8
+ import { S as Switch } from "./switch-Bl89Pfxu.mjs";
9
+ import { u as useQuery, k as useMutation } from "../_libs/convex.mjs";
10
+ import { i as Check, X, z as Lock, a4 as Info, a5 as Sun, a6 as Moon, a7 as Monitor } from "../_libs/lucide-react.mjs";
11
11
  import "../_chunks/_libs/@tanstack/react-router.mjs";
12
12
  import "../_libs/tiny-warning.mjs";
13
13
  import "../_chunks/_libs/@tanstack/router-core.mjs";
@@ -104,7 +104,10 @@ const THEME_OPTIONS = [
104
104
  { value: "system", label: "System", icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { className: "size-4" }) }
105
105
  ];
106
106
  function AppearanceSection() {
107
- const { theme, setTheme } = useTheme();
107
+ const { theme, setTheme, canToggleDarkMode } = useTheme();
108
+ if (!canToggleDarkMode) {
109
+ return null;
110
+ }
108
111
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(CmsSurface, { elevation: "base", className: "p-6", children: [
109
112
  /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-4 text-lg font-semibold text-foreground", children: "Appearance" }),
110
113
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
2
  import { R as Root, T as Thumb } from "../_chunks/_libs/@radix-ui/react-switch.mjs";
3
- import { f as cn } from "./router-CQXMuGMF.mjs";
3
+ import { e as cn } from "./router-DxF7GBcO.mjs";
4
4
  function Switch({
5
5
  className,
6
6
  ...props
@@ -1,8 +1,8 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { f as cn, C as CmsButton } from "./router-CQXMuGMF.mjs";
2
+ import { e as cn, C as CmsButton } from "./router-DxF7GBcO.mjs";
3
3
  import { R as Root2, L as List, T as Trigger, C as Content } from "../_chunks/_libs/@radix-ui/react-tabs.mjs";
4
- import { j as CircleAlert, ab as Upload, X, ao as RefreshCw, i as Check } from "../_libs/lucide-react.mjs";
5
- import { f as useMutation } from "../_libs/convex.mjs";
4
+ import { j as CircleAlert, aa as Upload, X, ap as RefreshCw, i as Check } from "../_libs/lucide-react.mjs";
5
+ import { k as useMutation } from "../_libs/convex.mjs";
6
6
  function generateUploadId() {
7
7
  return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
8
8
  }
@@ -1,7 +1,24 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
2
+ import { e as cn, I as Input } from "./router-DxF7GBcO.mjs";
2
3
  import { c as cva } from "../_libs/class-variance-authority.mjs";
3
- import { f as cn } from "./router-CQXMuGMF.mjs";
4
4
  import { d as useNavigate, e as useLocation, f as useParams } from "../_chunks/_libs/@tanstack/react-router.mjs";
5
+ const CmsInput = reactExports.forwardRef(
6
+ ({ className, error, ...props }, ref) => {
7
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
8
+ Input,
9
+ {
10
+ ref,
11
+ className: cn(
12
+ error && "border-destructive focus-visible:ring-destructive",
13
+ className
14
+ ),
15
+ "aria-invalid": error,
16
+ ...props
17
+ }
18
+ );
19
+ }
20
+ );
21
+ CmsInput.displayName = "CmsInput";
5
22
  const alertVariants = cva(
6
23
  "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
7
24
  {
@@ -127,6 +144,7 @@ function useTanStackNavigation() {
127
144
  }
128
145
  export {
129
146
  Alert as A,
147
+ CmsInput as C,
130
148
  AlertDescription as a,
131
149
  AlertTitle as b,
132
150
  useTanStackNavigation as u
@@ -1,13 +1,13 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { h as api, C as CmsButton, f as cn, g as CmsConfirmDialog, u as useApi, i as CmsDialog, L as Label, I as Input, T as Textarea, e as Checkbox } from "./router-CQXMuGMF.mjs";
3
- import { B as Badge } from "./badge-NOEC9bkk.mjs";
4
- import { u as useTanStackNavigation } from "./tanstack-adapter-CLavdbUY.mjs";
5
- import { C as CmsEmptyState } from "./CmsEmptyState-CB6e53i5.mjs";
6
- import { C as CmsPageHeader } from "./CmsPageHeader-COUHuECp.mjs";
7
- import { C as CmsSurface } from "./CmsSurface-D1HDYjRg.mjs";
8
- import { S as ScrollArea } from "./scroll-area-B7zoNyWB.mjs";
9
- import { u as useQuery, f as useMutation } from "../_libs/convex.mjs";
10
- import { P as Plus, W as Tag, a3 as Pencil, I as Trash2, a4 as FolderTree, N as Tags, d as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
2
+ import { b as api, C as CmsButton, e as cn, a as CmsConfirmDialog, u as useApi, c as CmsDialog, L as Label, I as Input, T as Textarea, d as Checkbox } from "./router-DxF7GBcO.mjs";
3
+ import { B as Badge } from "./badge-CbjIvhb6.mjs";
4
+ import { u as useTanStackNavigation } from "./tanstack-adapter-CKknPtcU.mjs";
5
+ import { C as CmsEmptyState } from "./CmsEmptyState-DzzuQG0S.mjs";
6
+ import { C as CmsPageHeader } from "./CmsPageHeader-DZ6h7smh.mjs";
7
+ import { C as CmsSurface } from "./CmsSurface-Cv51NBLZ.mjs";
8
+ import { S as ScrollArea } from "./scroll-area-DLDlXI07.mjs";
9
+ import { u as useQuery, k as useMutation } from "../_libs/convex.mjs";
10
+ import { P as Plus, W as Tag, a2 as Pencil, I as Trash2, a3 as FolderTree, N as Tags, d as ChevronDown, h as ChevronRight } from "../_libs/lucide-react.mjs";
11
11
  import "../_chunks/_libs/@tanstack/react-router.mjs";
12
12
  import "../_libs/tiny-warning.mjs";
13
13
  import "../_chunks/_libs/@tanstack/router-core.mjs";
@@ -1,13 +1,14 @@
1
1
  import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { h as api, C as CmsButton, I as Input, S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem, e as Checkbox, f as cn, g as CmsConfirmDialog } from "./router-CQXMuGMF.mjs";
3
- import { B as Badge } from "./badge-NOEC9bkk.mjs";
4
- import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-CLavdbUY.mjs";
5
- import { C as CmsPageHeader } from "./CmsPageHeader-COUHuECp.mjs";
6
- import { C as CmsToolbar } from "./CmsToolbar-NB014hsd.mjs";
7
- import { C as CmsEmptyState } from "./CmsEmptyState-CB6e53i5.mjs";
8
- import { C as CmsSurface } from "./CmsSurface-D1HDYjRg.mjs";
9
- import { u as useQuery, f as useMutation } from "../_libs/convex.mjs";
10
- import { I as Trash2, a1 as Search, a0 as TriangleAlert, X, a2 as RotateCcw } from "../_libs/lucide-react.mjs";
2
+ import { b as api, C as CmsButton, a as CmsConfirmDialog } from "./router-DxF7GBcO.mjs";
3
+ import { B as Badge } from "./badge-CbjIvhb6.mjs";
4
+ import { u as useTanStackNavigation, A as Alert, a as AlertDescription } from "./tanstack-adapter-CKknPtcU.mjs";
5
+ import { C as CmsSurface } from "./CmsSurface-Cv51NBLZ.mjs";
6
+ import { C as CmsEmptyState } from "./CmsEmptyState-DzzuQG0S.mjs";
7
+ import { C as CmsPageHeader } from "./CmsPageHeader-DZ6h7smh.mjs";
8
+ import { C as CmsTable } from "./CmsTable-DG88C5nO.mjs";
9
+ import { C as CmsFilterBar } from "./CmsFilterBar-C5XADS12.mjs";
10
+ import { u as useQuery, k as useMutation } from "../_libs/convex.mjs";
11
+ import { a1 as RotateCcw, I as Trash2, a0 as TriangleAlert, X } from "../_libs/lucide-react.mjs";
11
12
  import "../_chunks/_libs/@tanstack/react-router.mjs";
12
13
  import "../_libs/tiny-warning.mjs";
13
14
  import "../_chunks/_libs/@tanstack/router-core.mjs";
@@ -99,24 +100,6 @@ function TrashPage({ api: api2, navigation: _navigation }) {
99
100
  const isLoading = trashQuery === void 0;
100
101
  const config = configQuery;
101
102
  const stats = statsQuery;
102
- const handleSelectItem = reactExports.useCallback((itemId, selected) => {
103
- setSelectedItems((prev) => {
104
- const next = new Set(prev);
105
- if (selected) {
106
- next.add(itemId);
107
- } else {
108
- next.delete(itemId);
109
- }
110
- return next;
111
- });
112
- }, []);
113
- const handleSelectAll = reactExports.useCallback(() => {
114
- if (selectedItems.size === trashItems.length) {
115
- setSelectedItems(/* @__PURE__ */ new Set());
116
- } else {
117
- setSelectedItems(new Set(trashItems.map((item) => item._id)));
118
- }
119
- }, [selectedItems.size, trashItems]);
120
103
  const handleRestore = reactExports.useCallback(
121
104
  async (ids) => {
122
105
  setIsRestoring(true);
@@ -177,6 +160,71 @@ function TrashPage({ api: api2, navigation: _navigation }) {
177
160
  }
178
161
  return item.slug || item._id;
179
162
  };
163
+ const trashColumns = reactExports.useMemo(
164
+ () => [
165
+ {
166
+ key: "name",
167
+ header: "Name",
168
+ cell: (item) => /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
169
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: getItemTitle(item) }),
170
+ item.slug && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-xs text-muted-foreground", children: item.slug })
171
+ ] })
172
+ },
173
+ {
174
+ key: "type",
175
+ header: "Type",
176
+ cell: (item) => /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-muted-foreground", children: item.contentTypeName || "Unknown" })
177
+ },
178
+ {
179
+ key: "deleted",
180
+ header: "Deleted",
181
+ cell: (item) => /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
182
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-muted-foreground", children: formatDate(item.deletedAt) }),
183
+ item.deletedBy && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "block text-xs text-muted-foreground", children: [
184
+ "by ",
185
+ item.deletedBy
186
+ ] })
187
+ ] })
188
+ },
189
+ {
190
+ key: "expires",
191
+ header: "Expires In",
192
+ cell: (item) => {
193
+ const daysLeft = getDaysUntilDeletion(item.deletedAt);
194
+ return daysLeft !== null ? /* @__PURE__ */ jsxRuntimeExports.jsxs(
195
+ Badge,
196
+ {
197
+ variant: daysLeft <= 3 ? "destructive" : "secondary",
198
+ className: "font-normal",
199
+ children: [
200
+ daysLeft,
201
+ " ",
202
+ daysLeft === 1 ? "day" : "days"
203
+ ]
204
+ }
205
+ ) : null;
206
+ }
207
+ },
208
+ {
209
+ key: "actions",
210
+ header: "Actions",
211
+ cell: (item) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
212
+ CmsButton,
213
+ {
214
+ variant: "outline",
215
+ size: "sm",
216
+ onClick: () => handleRestore([item._id]),
217
+ loading: isRestoring,
218
+ children: [
219
+ /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: "size-4" }),
220
+ "Restore"
221
+ ]
222
+ }
223
+ )
224
+ }
225
+ ],
226
+ [isRestoring, handleRestore, config?.retentionDays]
227
+ );
180
228
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
181
229
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between", children: [
182
230
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -202,37 +250,29 @@ function TrashPage({ api: api2, navigation: _navigation }) {
202
250
  ] })
203
251
  ] }),
204
252
  /* @__PURE__ */ jsxRuntimeExports.jsx(
205
- CmsToolbar,
253
+ CmsFilterBar,
206
254
  {
207
- left: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
208
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [
209
- /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }),
210
- /* @__PURE__ */ jsxRuntimeExports.jsx(
211
- Input,
212
- {
213
- type: "text",
214
- placeholder: "Search deleted items...",
215
- value: searchQuery,
216
- onChange: (e) => setSearchQuery(e.target.value),
217
- className: "w-64 pl-9"
218
- }
219
- )
220
- ] }),
221
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
222
- Select,
223
- {
224
- value: selectedContentType || "all",
225
- onValueChange: (v) => setSelectedContentType(v === "all" ? "" : v),
226
- children: [
227
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "w-48", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All Content Types" }) }),
228
- /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [
229
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "all", children: "All Content Types" }),
230
- contentTypes.map((type) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: type._id, children: type.displayName }, type._id))
231
- ] })
232
- ]
233
- }
234
- )
235
- ] })
255
+ search: {
256
+ value: searchQuery,
257
+ onChange: setSearchQuery,
258
+ placeholder: "Search deleted items...",
259
+ className: "w-64"
260
+ },
261
+ filters: [
262
+ {
263
+ key: "contentType",
264
+ value: selectedContentType || "all",
265
+ onChange: (v) => setSelectedContentType(v === "all" ? "" : v),
266
+ options: [
267
+ { value: "all", label: "All Content Types" },
268
+ ...contentTypes.map((type) => ({
269
+ value: type._id,
270
+ label: type.displayName
271
+ }))
272
+ ],
273
+ className: "w-48"
274
+ }
275
+ ]
236
276
  }
237
277
  ),
238
278
  restoreError && /* @__PURE__ */ jsxRuntimeExports.jsxs(Alert, { variant: "destructive", children: [
@@ -306,81 +346,18 @@ function TrashPage({ api: api2, navigation: _navigation }) {
306
346
  title: "Trash is empty",
307
347
  description: "Deleted items will appear here"
308
348
  }
309
- ) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg border bg-card", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full", children: [
310
- /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b", children: [
311
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "w-10 p-3 text-left", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
312
- Checkbox,
313
- {
314
- checked: selectedItems.size === trashItems.length && trashItems.length > 0,
315
- onCheckedChange: handleSelectAll
316
- }
317
- ) }),
318
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Name" }),
319
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Type" }),
320
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Deleted" }),
321
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Expires In" }),
322
- /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Actions" })
323
- ] }) }),
324
- /* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: trashItems.map((item) => {
325
- const daysLeft = getDaysUntilDeletion(item.deletedAt);
326
- return /* @__PURE__ */ jsxRuntimeExports.jsxs(
327
- "tr",
328
- {
329
- className: cn(
330
- "border-b last:border-0 transition-colors hover:bg-muted/50",
331
- selectedItems.has(item._id) && "bg-primary/5"
332
- ),
333
- children: [
334
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
335
- Checkbox,
336
- {
337
- checked: selectedItems.has(item._id),
338
- onCheckedChange: (checked) => handleSelectItem(item._id, checked)
339
- }
340
- ) }),
341
- /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "p-3", children: [
342
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: getItemTitle(item) }),
343
- item.slug && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-xs text-muted-foreground", children: item.slug })
344
- ] }),
345
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: item.contentTypeName || "Unknown" }),
346
- /* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "p-3", children: [
347
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-muted-foreground", children: formatDate(item.deletedAt) }),
348
- item.deletedBy && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "block text-xs text-muted-foreground", children: [
349
- "by ",
350
- item.deletedBy
351
- ] })
352
- ] }),
353
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: daysLeft !== null && /* @__PURE__ */ jsxRuntimeExports.jsxs(
354
- Badge,
355
- {
356
- variant: daysLeft <= 3 ? "destructive" : "secondary",
357
- className: "font-normal",
358
- children: [
359
- daysLeft,
360
- " ",
361
- daysLeft === 1 ? "day" : "days"
362
- ]
363
- }
364
- ) }),
365
- /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
366
- CmsButton,
367
- {
368
- variant: "outline",
369
- size: "sm",
370
- onClick: () => handleRestore([item._id]),
371
- loading: isRestoring,
372
- children: [
373
- /* @__PURE__ */ jsxRuntimeExports.jsx(RotateCcw, { className: "size-4" }),
374
- "Restore"
375
- ]
376
- }
377
- ) })
378
- ]
379
- },
380
- item._id
381
- );
382
- }) })
383
- ] }) }),
349
+ ) : /* @__PURE__ */ jsxRuntimeExports.jsx(
350
+ CmsTable,
351
+ {
352
+ columns: trashColumns,
353
+ data: trashItems,
354
+ getRowId: (item) => item._id,
355
+ selectable: true,
356
+ selectedIds: selectedItems,
357
+ onSelectionChange: setSelectedItems,
358
+ emptyMessage: "No items in trash"
359
+ }
360
+ ),
384
361
  /* @__PURE__ */ jsxRuntimeExports.jsx(
385
362
  CmsConfirmDialog,
386
363
  {
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { M as useBreadcrumbContext } from "./router-CQXMuGMF.mjs";
2
+ import { M as useBreadcrumbContext } from "./router-DxF7GBcO.mjs";
3
3
  function useBreadcrumbLabel(path, label) {
4
4
  const { setOverride, clearOverride } = useBreadcrumbContext();
5
5
  reactExports.useEffect(() => {
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports } from "../_chunks/_libs/react.mjs";
2
- import { E as useAuth, F as getResourcePermissions, G as canAccessResource, H as hasPermission } from "./router-CQXMuGMF.mjs";
2
+ import { E as useAuth, F as getResourcePermissions, G as canAccessResource, H as hasPermission } from "./router-DxF7GBcO.mjs";
3
3
  function usePermissions() {
4
4
  const { role } = useAuth();
5
5
  return reactExports.useMemo(() => {