convex-cms 0.0.3 → 0.0.5-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -13
- package/admin-dist/nitro.json +1 -1
- package/admin-dist/public/assets/{CmsEmptyState-CRswfTzk.js → CmsEmptyState-CiMQwSQV.js} +2 -2
- package/admin-dist/public/assets/{CmsPageHeader-CirpXndm.js → CmsPageHeader-ohOq0luT.js} +1 -1
- package/admin-dist/public/assets/{CmsStatusBadge-CbEUpQu-.js → CmsStatusBadge-BdNf0V9v.js} +1 -1
- package/admin-dist/public/assets/CmsSurface-CWup6Jh7.js +1 -0
- package/admin-dist/public/assets/{CmsToolbar-BI2nZOXp.js → CmsToolbar-cEBlCHa3.js} +1 -1
- package/admin-dist/public/assets/{ContentEntryEditor-CBeCyK_m.js → ContentEntryEditor-BY5ypfUs.js} +1 -1
- package/admin-dist/public/assets/{ErrorState-BIVaWmom.js → ErrorState-C4nJ-ml4.js} +1 -1
- package/admin-dist/public/assets/{TaxonomyFilter-ChaY6Y_x.js → TaxonomyFilter-BgE_SR_O.js} +1 -1
- package/admin-dist/public/assets/{_contentTypeId-DQ8k_Rvw.js → _contentTypeId-DtZectcC.js} +1 -1
- package/admin-dist/public/assets/{_entryId-CKU_glsK.js → _entryId-BpSmrfAm.js} +1 -1
- package/admin-dist/public/assets/alert-Bf2l8kxw.js +1 -0
- package/admin-dist/public/assets/{badge-hvUOzpVZ.js → badge-qPrc4AUM.js} +1 -1
- package/admin-dist/public/assets/{circle-check-big-CF_pR17r.js → circle-check-big-Dgozy3vV.js} +1 -1
- package/admin-dist/public/assets/{command-DU82cJlt.js → command-QOmNhlb0.js} +1 -1
- package/admin-dist/public/assets/content-OEBGlxg1.js +1 -0
- package/admin-dist/public/assets/content-types-CjQliqVV.js +2 -0
- package/admin-dist/public/assets/{globals-CS6BZ0zp.css → globals-hAmgC66w.css} +1 -1
- package/admin-dist/public/assets/index-BH_ECMhv.js +1 -0
- package/admin-dist/public/assets/{label-KNtpL71g.js → label-DCsUdvFh.js} +1 -1
- package/admin-dist/public/assets/{link-2-Bw2aI4V4.js → link-2-Czw1N61H.js} +1 -1
- package/admin-dist/public/assets/{list-sYepHjt_.js → list-DtCsXj8-.js} +1 -1
- package/admin-dist/public/assets/{main-CKj5yfEi.js → main-CXgkZMhe.js} +3 -3
- package/admin-dist/public/assets/{media-Bkrkffm7.js → media-DTJ3-ViE.js} +1 -1
- package/admin-dist/public/assets/{new._contentTypeId-C3LstjNs.js → new._contentTypeId-CoTDxKzf.js} +1 -1
- package/admin-dist/public/assets/{plus-DUn8v_Xf.js → plus-xCFJK0RC.js} +1 -1
- package/admin-dist/public/assets/{rotate-ccw-DJEoHcRI.js → rotate-ccw-DIqK63wY.js} +1 -1
- package/admin-dist/public/assets/scroll-area-B-yrE66a.js +1 -0
- package/admin-dist/public/assets/{search-MuAUDJKR.js → search-CbCbboeU.js} +1 -1
- package/admin-dist/public/assets/select-Co3TZFJb.js +1 -0
- package/admin-dist/public/assets/settings-BspTTv_o.js +1 -0
- package/admin-dist/public/assets/switch-CfavASmR.js +1 -0
- package/admin-dist/public/assets/tabs-CN5s5u2W.js +1 -0
- package/admin-dist/public/assets/tanstack-adapter-npeE3RdY.js +1 -0
- package/admin-dist/public/assets/taxonomies-CgG46fIF.js +1 -0
- package/admin-dist/public/assets/{textarea-BTy7nwzR.js → textarea-BJ0XFZpT.js} +1 -1
- package/admin-dist/public/assets/trash-B3daldm5.js +1 -0
- package/admin-dist/public/assets/{triangle-alert-E52Vfeuh.js → triangle-alert-BZRcqsUg.js} +1 -1
- package/admin-dist/public/assets/useBreadcrumbLabel-DwZlwvFF.js +1 -0
- package/admin-dist/public/assets/{usePermissions-Basjs9BT.js → usePermissions-C1JQhfqb.js} +1 -1
- package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +7 -0
- package/admin-dist/server/_ssr/{badge-6BsP37vG.mjs → CmsButton-B45JAKR1.mjs} +33 -33
- package/admin-dist/server/_ssr/{CmsEmptyState-DU7-7-mV.mjs → CmsEmptyState-D_BQFAVR.mjs} +2 -2
- package/admin-dist/server/_ssr/{CmsPageHeader-CseW0AHm.mjs → CmsPageHeader-CrUZA59A.mjs} +1 -1
- package/admin-dist/server/_ssr/{CmsStatusBadge-B_pi4KCp.mjs → CmsStatusBadge-B-sj6yaj.mjs} +2 -2
- package/admin-dist/server/_ssr/CmsSurface-DKJZhpjk.mjs +44 -0
- package/admin-dist/server/_ssr/{CmsToolbar-X75ex6ek.mjs → CmsToolbar-ByaW5iXf.mjs} +2 -2
- package/admin-dist/server/_ssr/{ContentEntryEditor-CepusRsA.mjs → ContentEntryEditor-D3_Jb1dq.mjs} +11 -11
- package/admin-dist/server/_ssr/{TaxonomyFilter-Bwrq0-cz.mjs → TaxonomyFilter-BRJkuCtA.mjs} +4 -4
- package/admin-dist/server/_ssr/{_contentTypeId-BqYKEcLr.mjs → _contentTypeId-B9kA6CaM.mjs} +11 -11
- package/admin-dist/server/_ssr/{_entryId-CRfnqeDf.mjs → _entryId-BddcMkZN.mjs} +14 -14
- package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dd7AmelK.mjs +4 -0
- package/admin-dist/server/_ssr/{command-fy8epIKf.mjs → command-CGtVr8Gb.mjs} +1 -1
- package/admin-dist/server/_ssr/{content-B5RhL7uW.mjs → content-D1tbeOd0.mjs} +201 -86
- package/admin-dist/server/_ssr/{content-types-BIOqCQYN.mjs → content-types-BZqY_BER.mjs} +279 -103
- package/admin-dist/server/_ssr/{index-DHSHDPt1.mjs → index-BIdq4xaC.mjs} +88 -17
- package/admin-dist/server/_ssr/index.mjs +2 -2
- package/admin-dist/server/_ssr/{label-C8Dko1j7.mjs → label-T-QNKAr6.mjs} +1 -1
- package/admin-dist/server/_ssr/{media-CSx3XttC.mjs → media-C-xqjBrl.mjs} +40 -40
- package/admin-dist/server/_ssr/{new._contentTypeId-DzanEZQM.mjs → new._contentTypeId-DWic9cRq.mjs} +13 -13
- package/admin-dist/server/_ssr/{router-DDWcF-kt.mjs → router-D1BMAMJT.mjs} +11 -11
- package/admin-dist/server/_ssr/{scroll-area-bjPYwhXN.mjs → scroll-area-C0pic_WA.mjs} +1 -1
- package/admin-dist/server/_ssr/{select-BUhDDf4T.mjs → select-CqmuN2F6.mjs} +1 -1
- package/admin-dist/server/_ssr/{settings-DAsxnw2q.mjs → settings-CAkncGGV.mjs} +211 -129
- package/admin-dist/server/_ssr/{switch-BgyRtQ1Z.mjs → switch-CgmuJkT9.mjs} +1 -1
- package/admin-dist/server/_ssr/{tabs-DzMdRB1A.mjs → tabs-CnMj0aRy.mjs} +5 -3
- package/admin-dist/server/_ssr/tanstack-adapter-BXZrMauE.mjs +119 -0
- package/admin-dist/server/_ssr/{taxonomies-C8j8g5Q5.mjs → taxonomies-thl3BfVm.mjs} +168 -68
- package/admin-dist/server/_ssr/{textarea-9jNeYJSc.mjs → textarea-4K5OJgeh.mjs} +1 -1
- package/admin-dist/server/_ssr/{trash-DYMxwhZB.mjs → trash-B40Gx5zP.mjs} +206 -86
- package/admin-dist/server/_ssr/{useBreadcrumbLabel-FNSAr2Ha.mjs → useBreadcrumbLabel-rn-fL4zV.mjs} +1 -1
- package/admin-dist/server/_ssr/{usePermissions-BJGGahrJ.mjs → usePermissions-CKeM6_Vw.mjs} +1 -1
- package/admin-dist/server/index.mjs +194 -180
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +156 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/client/admin-config.d.ts +2 -2
- package/dist/client/admin-config.js +2 -2
- package/dist/client/adminApi.d.ts +1877 -1851
- package/dist/client/adminApi.d.ts.map +1 -1
- package/dist/client/adminApi.js +649 -629
- package/dist/client/adminApi.js.map +1 -1
- package/dist/client/agentTools.d.ts +7 -17
- package/dist/client/agentTools.d.ts.map +1 -1
- package/dist/client/agentTools.js +4 -4
- package/dist/client/index.d.ts +4 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/schema/codegen.d.ts +2 -2
- package/dist/client/schema/codegen.d.ts.map +1 -1
- package/dist/client/schema/codegen.js +3 -3
- package/dist/client/schema/codegen.js.map +1 -1
- package/dist/client/schema/defineContentType.d.ts +3 -3
- package/dist/client/schema/defineContentType.js +3 -3
- package/dist/client/schema/index.d.ts +7 -7
- package/dist/client/schema/index.d.ts.map +1 -1
- package/dist/client/schema/index.js +5 -5
- package/dist/client/schema/index.js.map +1 -1
- package/dist/client/schema/schemaDrift.d.ts +1 -1
- package/dist/client/schema/schemaDrift.js +1 -1
- package/dist/client/schema/typedClient.d.ts +2 -2
- package/dist/client/schema/typedClient.js +2 -2
- package/dist/client/schema/types.d.ts +1 -1
- package/dist/client/schema/types.js +1 -1
- package/dist/client/wrapper.d.ts +108 -65
- package/dist/client/wrapper.d.ts.map +1 -1
- package/dist/client/wrapper.js +22 -22
- package/dist/client/wrapper.js.map +1 -1
- package/dist/component/convex.config.d.ts +2 -2
- package/dist/component/convex.config.js +2 -2
- package/dist/component/index.d.ts +1 -1
- package/dist/component/index.js +1 -1
- package/dist/component/lib/ragContentChunker.d.ts +1 -1
- package/dist/component/lib/ragContentChunker.js +1 -1
- package/dist/component/roles.d.ts +1 -1
- package/dist/component/roles.js +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +13 -7
- package/dist/react/index.js.map +1 -1
- package/dist/test.d.ts +2 -2
- package/dist/test.js +2 -2
- package/package.json +31 -11
- package/admin-dist/public/assets/alert-BXjTqrwQ.js +0 -1
- package/admin-dist/public/assets/content-_LXl3pp7.js +0 -1
- package/admin-dist/public/assets/content-types-KjxaXGxY.js +0 -2
- package/admin-dist/public/assets/index-DNGIZHL-.js +0 -1
- package/admin-dist/public/assets/scroll-area-DfIlT0in.js +0 -1
- package/admin-dist/public/assets/select-BD29IXCI.js +0 -1
- package/admin-dist/public/assets/settings-DmMyn_6A.js +0 -1
- package/admin-dist/public/assets/switch-h3Rrnl5i.js +0 -1
- package/admin-dist/public/assets/tabs-imc8h-Dp.js +0 -1
- package/admin-dist/public/assets/taxonomies-dAsrT65H.js +0 -1
- package/admin-dist/public/assets/trash-SAWKZZHv.js +0 -1
- package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +0 -1
- package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +0 -4
- package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +0 -92
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { I as Input, a as Checkbox, C as CmsEmptyState, c as CmsDialog } from "./CmsEmptyState-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from "./select-BUhDDf4T.mjs";
|
|
1
|
+
import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
|
|
2
|
+
import { a as api, c as cn } from "./router-D1BMAMJT.mjs";
|
|
3
|
+
import { C as CmsButton, B as Badge } from "./CmsButton-B45JAKR1.mjs";
|
|
4
|
+
import { I as Input, a as Checkbox, C as CmsEmptyState, c as CmsDialog } from "./CmsEmptyState-D_BQFAVR.mjs";
|
|
5
|
+
import { L as Label } from "./label-T-QNKAr6.mjs";
|
|
6
|
+
import { T as Textarea } from "./textarea-4K5OJgeh.mjs";
|
|
7
|
+
import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from "./select-CqmuN2F6.mjs";
|
|
9
8
|
import { E as ErrorState, a as ErrorAlert } from "./ErrorState-cI-bKLez.mjs";
|
|
10
|
-
import { C as CmsPageHeader } from "./CmsPageHeader-
|
|
11
|
-
import { C as CmsToolbar } from "./CmsToolbar-
|
|
9
|
+
import { C as CmsPageHeader } from "./CmsPageHeader-CrUZA59A.mjs";
|
|
10
|
+
import { C as CmsToolbar } from "./CmsToolbar-ByaW5iXf.mjs";
|
|
11
|
+
import { u as useTanStackNavigation } from "./tanstack-adapter-BXZrMauE.mjs";
|
|
12
12
|
import { u as useQuery, d as useMutation } from "../_libs/convex.mjs";
|
|
13
13
|
import { ad as Grid3x3, ae as List, Q as Plus, N as Search, af as FileType, W as Pencil, ag as TextAlignStart, ah as FolderOpen, V as Tag, d as ChevronDown, p as Braces, I as Image, a8 as Link2, u as Calendar, T as ToggleLeft, r as Hash, ai as ChevronUp, X, O as TriangleAlert } from "../_libs/lucide-react.mjs";
|
|
14
|
+
import "../_chunks/_libs/@tanstack/react-router.mjs";
|
|
14
15
|
import "../_libs/tiny-warning.mjs";
|
|
15
16
|
import "../_chunks/_libs/@tanstack/router-core.mjs";
|
|
16
17
|
import "../_libs/cookie-es.mjs";
|
|
@@ -987,7 +988,7 @@ const FIELD_ICONS = {
|
|
|
987
988
|
tags: /* @__PURE__ */ jsxRuntimeExports.jsx(Tag, { className: "size-3" }),
|
|
988
989
|
category: /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3" })
|
|
989
990
|
};
|
|
990
|
-
function ContentTypesPage() {
|
|
991
|
+
function ContentTypesPage({ api: api2, navigation }) {
|
|
991
992
|
const [searchQuery, setSearchQuery] = reactExports.useState("");
|
|
992
993
|
const [viewMode, setViewMode] = reactExports.useState("grid");
|
|
993
994
|
const [showActiveOnly, setShowActiveOnly] = reactExports.useState(true);
|
|
@@ -1000,7 +1001,7 @@ function ContentTypesPage() {
|
|
|
1000
1001
|
const handleContentTypeUpdated = reactExports.useCallback(() => {
|
|
1001
1002
|
setEditingContentType(null);
|
|
1002
1003
|
}, []);
|
|
1003
|
-
const contentTypesResult = useQuery(
|
|
1004
|
+
const contentTypesResult = useQuery(api2.contentTypes.list, {
|
|
1004
1005
|
isActive: showActiveOnly ? true : void 0,
|
|
1005
1006
|
includeEntryCounts: true
|
|
1006
1007
|
});
|
|
@@ -1016,7 +1017,9 @@ function ContentTypesPage() {
|
|
|
1016
1017
|
return contentTypes;
|
|
1017
1018
|
}
|
|
1018
1019
|
const query = searchQuery.toLowerCase();
|
|
1019
|
-
return contentTypes.filter(
|
|
1020
|
+
return contentTypes.filter(
|
|
1021
|
+
(type) => type.name.toLowerCase().includes(query) || type.displayName.toLowerCase().includes(query)
|
|
1022
|
+
);
|
|
1020
1023
|
}, [contentTypes, searchQuery]);
|
|
1021
1024
|
const formatDate = (timestamp) => {
|
|
1022
1025
|
return new Date(timestamp).toLocaleDateString("en-US", {
|
|
@@ -1046,76 +1049,198 @@ function ContentTypesPage() {
|
|
|
1046
1049
|
};
|
|
1047
1050
|
if (error && !isLoading) {
|
|
1048
1051
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
|
|
1049
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1050
|
-
|
|
1052
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1053
|
+
CmsPageHeader,
|
|
1054
|
+
{
|
|
1055
|
+
title: "Content Types",
|
|
1056
|
+
description: "Define the structure of your content with custom fields and validation rules."
|
|
1057
|
+
}
|
|
1058
|
+
),
|
|
1059
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1060
|
+
ErrorState,
|
|
1061
|
+
{
|
|
1062
|
+
error,
|
|
1063
|
+
title: "Failed to load content types",
|
|
1064
|
+
onRetry: handleRetry
|
|
1065
|
+
}
|
|
1066
|
+
)
|
|
1051
1067
|
] });
|
|
1052
1068
|
}
|
|
1053
1069
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-6 p-6", children: [
|
|
1054
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
"
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
] })
|
|
1086
|
-
] }),
|
|
1087
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/entries/type/$contentTypeId", params: {
|
|
1088
|
-
contentTypeId: contentType._id
|
|
1089
|
-
}, className: "flex flex-1 flex-col", children: [
|
|
1090
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-semibold text-foreground", children: contentType.displayName }),
|
|
1091
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: contentType.name }),
|
|
1092
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex items-center gap-4", children: [
|
|
1093
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
|
|
1094
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.fields.length }),
|
|
1095
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.fields.length === 1 ? "Field" : "Fields" })
|
|
1070
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1071
|
+
CmsPageHeader,
|
|
1072
|
+
{
|
|
1073
|
+
title: "Content Types",
|
|
1074
|
+
description: "Define the structure of your content with custom fields and validation rules."
|
|
1075
|
+
}
|
|
1076
|
+
),
|
|
1077
|
+
error && !dismissedError && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1078
|
+
ErrorAlert,
|
|
1079
|
+
{
|
|
1080
|
+
error,
|
|
1081
|
+
onDismiss: () => setDismissedError(true),
|
|
1082
|
+
onRetry: handleRetry
|
|
1083
|
+
}
|
|
1084
|
+
),
|
|
1085
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1086
|
+
CmsToolbar,
|
|
1087
|
+
{
|
|
1088
|
+
left: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
1089
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [
|
|
1090
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }),
|
|
1091
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1092
|
+
Input,
|
|
1093
|
+
{
|
|
1094
|
+
type: "search",
|
|
1095
|
+
placeholder: "Search content types...",
|
|
1096
|
+
value: searchQuery,
|
|
1097
|
+
onChange: (e) => setSearchQuery(e.target.value),
|
|
1098
|
+
className: "w-64 pl-9"
|
|
1099
|
+
}
|
|
1100
|
+
)
|
|
1096
1101
|
] }),
|
|
1097
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("
|
|
1098
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
] }, field.name)),
|
|
1107
|
-
contentType.fields.length > 4 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: [
|
|
1108
|
-
"+",
|
|
1109
|
-
contentType.fields.length - 4,
|
|
1110
|
-
" more"
|
|
1102
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [
|
|
1103
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1104
|
+
Checkbox,
|
|
1105
|
+
{
|
|
1106
|
+
checked: showActiveOnly,
|
|
1107
|
+
onCheckedChange: (checked) => setShowActiveOnly(checked)
|
|
1108
|
+
}
|
|
1109
|
+
),
|
|
1110
|
+
"Active only"
|
|
1111
1111
|
] })
|
|
1112
1112
|
] }),
|
|
1113
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("
|
|
1114
|
-
"
|
|
1115
|
-
|
|
1113
|
+
right: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1114
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex rounded-md border bg-muted/30", children: [
|
|
1115
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1116
|
+
"button",
|
|
1117
|
+
{
|
|
1118
|
+
className: cn(
|
|
1119
|
+
"rounded-l-md p-2 transition-colors",
|
|
1120
|
+
viewMode === "grid" ? "bg-background shadow-sm" : "hover:bg-muted/50"
|
|
1121
|
+
),
|
|
1122
|
+
onClick: () => setViewMode("grid"),
|
|
1123
|
+
title: "Grid view",
|
|
1124
|
+
"aria-label": "Grid view",
|
|
1125
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Grid3x3, { className: "size-4" })
|
|
1126
|
+
}
|
|
1127
|
+
),
|
|
1128
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1129
|
+
"button",
|
|
1130
|
+
{
|
|
1131
|
+
className: cn(
|
|
1132
|
+
"rounded-r-md p-2 transition-colors",
|
|
1133
|
+
viewMode === "list" ? "bg-background shadow-sm" : "hover:bg-muted/50"
|
|
1134
|
+
),
|
|
1135
|
+
onClick: () => setViewMode("list"),
|
|
1136
|
+
title: "List view",
|
|
1137
|
+
"aria-label": "List view",
|
|
1138
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(List, { className: "size-4" })
|
|
1139
|
+
}
|
|
1140
|
+
)
|
|
1141
|
+
] }),
|
|
1142
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1143
|
+
CmsButton,
|
|
1144
|
+
{
|
|
1145
|
+
onClick: () => setShowCreateModal(true),
|
|
1146
|
+
"data-testid": "create-content-type-button",
|
|
1147
|
+
children: [
|
|
1148
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-4" }),
|
|
1149
|
+
"Create Content Type"
|
|
1150
|
+
]
|
|
1151
|
+
}
|
|
1152
|
+
)
|
|
1116
1153
|
] })
|
|
1117
|
-
|
|
1118
|
-
|
|
1154
|
+
}
|
|
1155
|
+
),
|
|
1156
|
+
isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-12", children: [
|
|
1157
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-8 animate-spin rounded-full border-2 border-muted border-t-primary" }),
|
|
1158
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-sm text-muted-foreground", children: "Loading content types..." })
|
|
1159
|
+
] }) : filteredContentTypes.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1160
|
+
CmsEmptyState,
|
|
1161
|
+
{
|
|
1162
|
+
icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileType, { className: "size-6" }),
|
|
1163
|
+
title: searchQuery ? "No content types match your search" : "No content types defined",
|
|
1164
|
+
description: searchQuery ? "Try adjusting your search query or filters." : "Content types define the schema for your content. Create one to get started."
|
|
1165
|
+
}
|
|
1166
|
+
) : viewMode === "grid" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1167
|
+
"div",
|
|
1168
|
+
{
|
|
1169
|
+
className: "group flex flex-col rounded-lg border bg-card p-4 transition-all hover:border-primary/50 hover:shadow-md",
|
|
1170
|
+
children: [
|
|
1171
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
|
|
1172
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-10 items-center justify-center rounded-md bg-muted text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(FileType, { className: "size-5" }) }),
|
|
1173
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1174
|
+
!contentType.isActive && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", className: "text-xs font-normal", children: "Inactive" }),
|
|
1175
|
+
contentType.singleton && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1176
|
+
Badge,
|
|
1177
|
+
{
|
|
1178
|
+
variant: "secondary",
|
|
1179
|
+
className: "border-amber-200 bg-amber-50 text-xs font-normal text-amber-700",
|
|
1180
|
+
children: "Singleton"
|
|
1181
|
+
}
|
|
1182
|
+
),
|
|
1183
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1184
|
+
"button",
|
|
1185
|
+
{
|
|
1186
|
+
onClick: () => setEditingContentType(contentType),
|
|
1187
|
+
className: "rounded p-1.5 text-muted-foreground opacity-0 transition-all hover:bg-muted hover:text-foreground group-hover:opacity-100",
|
|
1188
|
+
title: "Edit content type",
|
|
1189
|
+
"aria-label": "Edit content type",
|
|
1190
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-4" })
|
|
1191
|
+
}
|
|
1192
|
+
)
|
|
1193
|
+
] })
|
|
1194
|
+
] }),
|
|
1195
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1196
|
+
"button",
|
|
1197
|
+
{
|
|
1198
|
+
type: "button",
|
|
1199
|
+
onClick: () => navigation.navigateToContentType(contentType._id),
|
|
1200
|
+
className: "flex flex-1 flex-col text-left",
|
|
1201
|
+
children: [
|
|
1202
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-semibold text-foreground", children: contentType.displayName }),
|
|
1203
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: contentType.name }),
|
|
1204
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex items-center gap-4", children: [
|
|
1205
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
|
|
1206
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.fields.length }),
|
|
1207
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.fields.length === 1 ? "Field" : "Fields" })
|
|
1208
|
+
] }),
|
|
1209
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
|
|
1210
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: contentType.entryCount ?? 0 }),
|
|
1211
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.entryCount === 1 ? "Entry" : "Entries" })
|
|
1212
|
+
] })
|
|
1213
|
+
] }),
|
|
1214
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [
|
|
1215
|
+
contentType.fields.slice(0, 4).map((field) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1216
|
+
"span",
|
|
1217
|
+
{
|
|
1218
|
+
className: "flex items-center gap-1 rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground",
|
|
1219
|
+
title: field.label,
|
|
1220
|
+
children: [
|
|
1221
|
+
FIELD_ICONS[field.type] || /* @__PURE__ */ jsxRuntimeExports.jsx(TextAlignStart, { className: "size-3" }),
|
|
1222
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: field.label })
|
|
1223
|
+
]
|
|
1224
|
+
},
|
|
1225
|
+
field.name
|
|
1226
|
+
)),
|
|
1227
|
+
contentType.fields.length > 4 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "rounded-md bg-muted px-1.5 py-0.5 text-xs text-muted-foreground", children: [
|
|
1228
|
+
"+",
|
|
1229
|
+
contentType.fields.length - 4,
|
|
1230
|
+
" more"
|
|
1231
|
+
] })
|
|
1232
|
+
] }),
|
|
1233
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-auto pt-3 text-xs text-muted-foreground", children: [
|
|
1234
|
+
"Updated ",
|
|
1235
|
+
getRelativeTime(contentType._creationTime)
|
|
1236
|
+
] })
|
|
1237
|
+
]
|
|
1238
|
+
}
|
|
1239
|
+
)
|
|
1240
|
+
]
|
|
1241
|
+
},
|
|
1242
|
+
contentType._id
|
|
1243
|
+
)) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-lg border bg-card", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("table", { className: "w-full", children: [
|
|
1119
1244
|
/* @__PURE__ */ jsxRuntimeExports.jsx("thead", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("tr", { className: "border-b", children: [
|
|
1120
1245
|
/* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Name" }),
|
|
1121
1246
|
/* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Fields" }),
|
|
@@ -1124,28 +1249,66 @@ function ContentTypesPage() {
|
|
|
1124
1249
|
/* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Last Updated" }),
|
|
1125
1250
|
/* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "p-3 text-left text-sm font-medium text-muted-foreground", children: "Actions" })
|
|
1126
1251
|
] }) }),
|
|
1127
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1252
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("tbody", { children: filteredContentTypes.map((contentType) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1253
|
+
"tr",
|
|
1254
|
+
{
|
|
1255
|
+
className: "border-b last:border-0 transition-colors hover:bg-muted/50",
|
|
1256
|
+
children: [
|
|
1257
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("td", { className: "p-3", children: [
|
|
1258
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground", children: contentType.displayName }),
|
|
1259
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: contentType.name })
|
|
1260
|
+
] }),
|
|
1261
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: contentType.fields.length }),
|
|
1262
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: contentType.entryCount ?? 0 }),
|
|
1263
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1264
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1265
|
+
Badge,
|
|
1266
|
+
{
|
|
1267
|
+
variant: contentType.isActive ? "default" : "secondary",
|
|
1268
|
+
className: cn(
|
|
1269
|
+
"text-xs font-normal",
|
|
1270
|
+
contentType.isActive && "border-emerald-200 bg-emerald-50 text-emerald-700"
|
|
1271
|
+
),
|
|
1272
|
+
children: contentType.isActive ? "Active" : "Inactive"
|
|
1273
|
+
}
|
|
1274
|
+
),
|
|
1275
|
+
contentType.singleton && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1276
|
+
Badge,
|
|
1277
|
+
{
|
|
1278
|
+
variant: "secondary",
|
|
1279
|
+
className: "border-amber-200 bg-amber-50 text-xs font-normal text-amber-700",
|
|
1280
|
+
children: "Singleton"
|
|
1281
|
+
}
|
|
1282
|
+
)
|
|
1283
|
+
] }) }),
|
|
1284
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3 text-sm text-muted-foreground", children: formatDate(contentType._creationTime) }),
|
|
1285
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "p-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1286
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
1287
|
+
CmsButton,
|
|
1288
|
+
{
|
|
1289
|
+
variant: "outline",
|
|
1290
|
+
size: "sm",
|
|
1291
|
+
onClick: () => setEditingContentType(contentType),
|
|
1292
|
+
children: [
|
|
1293
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3.5" }),
|
|
1294
|
+
"Edit"
|
|
1295
|
+
]
|
|
1296
|
+
}
|
|
1297
|
+
),
|
|
1298
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1299
|
+
CmsButton,
|
|
1300
|
+
{
|
|
1301
|
+
variant: "outline",
|
|
1302
|
+
size: "sm",
|
|
1303
|
+
onClick: () => navigation.navigateToContentType(contentType._id),
|
|
1304
|
+
children: "View Entries"
|
|
1305
|
+
}
|
|
1306
|
+
)
|
|
1307
|
+
] }) })
|
|
1308
|
+
]
|
|
1309
|
+
},
|
|
1310
|
+
contentType._id
|
|
1311
|
+
)) })
|
|
1149
1312
|
] }) }),
|
|
1150
1313
|
!isLoading && filteredContentTypes.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [
|
|
1151
1314
|
"Showing ",
|
|
@@ -1155,12 +1318,25 @@ function ContentTypesPage() {
|
|
|
1155
1318
|
" content type",
|
|
1156
1319
|
contentTypes.length !== 1 ? "s" : ""
|
|
1157
1320
|
] }),
|
|
1158
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1321
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
1322
|
+
ContentTypeFormModal,
|
|
1323
|
+
{
|
|
1324
|
+
isOpen: showCreateModal || !!editingContentType,
|
|
1325
|
+
onClose: () => {
|
|
1326
|
+
setShowCreateModal(false);
|
|
1327
|
+
setEditingContentType(null);
|
|
1328
|
+
},
|
|
1329
|
+
contentType: editingContentType,
|
|
1330
|
+
onCreated: handleContentTypeCreated,
|
|
1331
|
+
onUpdated: handleContentTypeUpdated
|
|
1332
|
+
}
|
|
1333
|
+
)
|
|
1162
1334
|
] });
|
|
1163
1335
|
}
|
|
1336
|
+
function ContentTypesRoute() {
|
|
1337
|
+
const navigation = useTanStackNavigation();
|
|
1338
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(ContentTypesPage, { api, navigation });
|
|
1339
|
+
}
|
|
1164
1340
|
export {
|
|
1165
|
-
|
|
1341
|
+
ContentTypesRoute as component
|
|
1166
1342
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { a as api, c as cn } from "./router-D1BMAMJT.mjs";
|
|
3
|
+
import { C as CmsPageHeader } from "./CmsPageHeader-CrUZA59A.mjs";
|
|
4
|
+
import { u as useTanStackNavigation } from "./tanstack-adapter-BXZrMauE.mjs";
|
|
5
5
|
import { u as useQuery } from "../_libs/convex.mjs";
|
|
6
6
|
import { J as FileText, I as Image, a as Layers, x as Settings, ak as TrendingUp } from "../_libs/lucide-react.mjs";
|
|
7
|
+
import "../_chunks/_libs/@tanstack/react-router.mjs";
|
|
7
8
|
import "../_libs/tiny-warning.mjs";
|
|
8
9
|
import "../_chunks/_libs/@tanstack/router-core.mjs";
|
|
9
10
|
import "../_libs/cookie-es.mjs";
|
|
@@ -138,17 +139,55 @@ function Skeleton({ className, ...props }) {
|
|
|
138
139
|
}
|
|
139
140
|
);
|
|
140
141
|
}
|
|
141
|
-
function DashboardPage() {
|
|
142
|
-
const stats = useQuery(
|
|
142
|
+
function DashboardPage({ api: api2, navigation }) {
|
|
143
|
+
const stats = useQuery(api2.stats.getDashboardStats);
|
|
143
144
|
const isLoading = stats === void 0;
|
|
144
145
|
const hasError = stats === null;
|
|
145
146
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-8", children: [
|
|
146
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
147
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
148
|
+
CmsPageHeader,
|
|
149
|
+
{
|
|
150
|
+
title: "Dashboard",
|
|
151
|
+
description: "Welcome to Convex CMS Admin. Manage your content, media, and publishing workflows."
|
|
152
|
+
}
|
|
153
|
+
),
|
|
147
154
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: [
|
|
148
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
155
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
156
|
+
DashboardCard,
|
|
157
|
+
{
|
|
158
|
+
title: "Content Entries",
|
|
159
|
+
description: "Create and manage your content",
|
|
160
|
+
onClick: () => navigation.navigate("/content"),
|
|
161
|
+
icon: /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-5" })
|
|
162
|
+
}
|
|
163
|
+
),
|
|
164
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
165
|
+
DashboardCard,
|
|
166
|
+
{
|
|
167
|
+
title: "Media Library",
|
|
168
|
+
description: "Upload and organize media assets",
|
|
169
|
+
onClick: () => navigation.navigate("/media"),
|
|
170
|
+
icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Image, { className: "size-5" })
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
174
|
+
DashboardCard,
|
|
175
|
+
{
|
|
176
|
+
title: "Content Types",
|
|
177
|
+
description: "Define content schemas and fields",
|
|
178
|
+
onClick: () => navigation.navigate("/content-types"),
|
|
179
|
+
icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Layers, { className: "size-5" })
|
|
180
|
+
}
|
|
181
|
+
),
|
|
182
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
183
|
+
DashboardCard,
|
|
184
|
+
{
|
|
185
|
+
title: "Settings",
|
|
186
|
+
description: "Configure CMS settings",
|
|
187
|
+
onClick: () => navigation.navigate("/settings"),
|
|
188
|
+
icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings, { className: "size-5" })
|
|
189
|
+
}
|
|
190
|
+
)
|
|
152
191
|
] }),
|
|
153
192
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "space-y-4", children: [
|
|
154
193
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
@@ -156,10 +195,38 @@ function DashboardPage() {
|
|
|
156
195
|
/* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold", children: "Quick Stats" })
|
|
157
196
|
] }),
|
|
158
197
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4", children: [
|
|
159
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
198
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
199
|
+
StatCard,
|
|
200
|
+
{
|
|
201
|
+
label: "Content Types",
|
|
202
|
+
value: isLoading ? void 0 : hasError ? "—" : String(stats.contentTypes),
|
|
203
|
+
isLoading
|
|
204
|
+
}
|
|
205
|
+
),
|
|
206
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
207
|
+
StatCard,
|
|
208
|
+
{
|
|
209
|
+
label: "Content Entries",
|
|
210
|
+
value: isLoading ? void 0 : hasError ? "—" : String(stats.contentEntries),
|
|
211
|
+
isLoading
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
215
|
+
StatCard,
|
|
216
|
+
{
|
|
217
|
+
label: "Media Assets",
|
|
218
|
+
value: isLoading ? void 0 : hasError ? "—" : String(stats.mediaAssets),
|
|
219
|
+
isLoading
|
|
220
|
+
}
|
|
221
|
+
),
|
|
222
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
223
|
+
StatCard,
|
|
224
|
+
{
|
|
225
|
+
label: "Published",
|
|
226
|
+
value: isLoading ? void 0 : hasError ? "—" : String(stats.published),
|
|
227
|
+
isLoading
|
|
228
|
+
}
|
|
229
|
+
)
|
|
163
230
|
] })
|
|
164
231
|
] })
|
|
165
232
|
] });
|
|
@@ -167,10 +234,10 @@ function DashboardPage() {
|
|
|
167
234
|
function DashboardCard({
|
|
168
235
|
title,
|
|
169
236
|
description,
|
|
170
|
-
|
|
237
|
+
onClick,
|
|
171
238
|
icon
|
|
172
239
|
}) {
|
|
173
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
240
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "button", onClick, className: "text-left", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "h-full transition-colors hover:bg-accent/50", children: [
|
|
174
241
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "pb-2", children: [
|
|
175
242
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-2 flex size-10 items-center justify-center rounded-lg bg-primary/10 text-primary", children: icon }),
|
|
176
243
|
/* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base", children: title })
|
|
@@ -188,6 +255,10 @@ function StatCard({
|
|
|
188
255
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground", children: label })
|
|
189
256
|
] }) });
|
|
190
257
|
}
|
|
258
|
+
function DashboardRoute() {
|
|
259
|
+
const navigation = useTanStackNavigation();
|
|
260
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(DashboardPage, { api, navigation });
|
|
261
|
+
}
|
|
191
262
|
export {
|
|
192
|
-
|
|
263
|
+
DashboardRoute as component
|
|
193
264
|
};
|
|
@@ -440,7 +440,7 @@ function getResponse() {
|
|
|
440
440
|
return event.res;
|
|
441
441
|
}
|
|
442
442
|
async function getStartManifest(matchedRoutes) {
|
|
443
|
-
const { tsrStartManifest } = await import("./_tanstack-start-manifest_v-
|
|
443
|
+
const { tsrStartManifest } = await import("./_tanstack-start-manifest_v-Dd7AmelK.mjs");
|
|
444
444
|
const startManifest = tsrStartManifest();
|
|
445
445
|
const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
|
|
446
446
|
rootRoute.assets = rootRoute.assets || [];
|
|
@@ -915,7 +915,7 @@ function getStartResponseHeaders(opts) {
|
|
|
915
915
|
let entriesPromise;
|
|
916
916
|
let manifestPromise;
|
|
917
917
|
async function loadEntries() {
|
|
918
|
-
const routerEntry = await import("./router-
|
|
918
|
+
const routerEntry = await import("./router-D1BMAMJT.mjs").then((n) => n.s);
|
|
919
919
|
const startEntry = await import("./start-HYkvq4Ni.mjs");
|
|
920
920
|
return { startEntry, routerEntry };
|
|
921
921
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { j as jsxRuntimeExports } from "../_chunks/_libs/react.mjs";
|
|
2
2
|
import { R as Root } from "../_chunks/_libs/@radix-ui/react-label.mjs";
|
|
3
|
-
import { c as cn } from "./router-
|
|
3
|
+
import { c as cn } from "./router-D1BMAMJT.mjs";
|
|
4
4
|
function Label({
|
|
5
5
|
className,
|
|
6
6
|
...props
|