convex-cms 0.0.9-alpha.7 → 0.0.9-alpha.9
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 +27 -0
- package/admin/src/components/cmsds/CmsFilterBar.tsx +74 -0
- package/admin/src/components/cmsds/CmsInput.tsx +24 -0
- package/admin/src/components/cmsds/CmsPagination.tsx +79 -0
- package/admin/src/components/cmsds/CmsSelect.tsx +59 -0
- package/admin/src/components/cmsds/CmsStatCard.tsx +79 -0
- package/admin/src/components/cmsds/CmsStatusBadge.tsx +1 -1
- package/admin/src/components/cmsds/index.ts +5 -0
- package/admin/src/contexts/ThemeContext.tsx +85 -17
- package/admin/src/embed/components/EmbedHeader.tsx +11 -9
- package/admin/src/embed/index.tsx +10 -6
- package/admin/src/embed/types.ts +12 -0
- package/admin/src/pages/ContentPage.tsx +116 -172
- package/admin/src/pages/ContentTypeEntriesPage.tsx +120 -194
- package/admin/src/pages/ContentTypesPage.tsx +136 -139
- package/admin/src/pages/DashboardPage.tsx +13 -52
- package/admin/src/pages/MediaPage.tsx +31 -57
- package/admin/src/pages/SettingsPage.tsx +5 -1
- package/admin/src/pages/TrashPage.tsx +115 -170
- package/admin/src/styles/globals.css +18 -31
- package/admin/src/styles/tailwind-config.css +12 -0
- package/admin/src/styles/theme.css +299 -38
- package/admin-dist/nitro.json +1 -1
- package/admin-dist/public/assets/{CmsEmptyState-gxhf-b6F.js → CmsEmptyState-DTlpzjOI.js} +1 -1
- package/admin-dist/public/assets/{CmsPageHeader-equV7Sd9.js → CmsPageHeader-0REGRH4X.js} +1 -1
- package/admin-dist/public/assets/{CmsStatusBadge-DQAslyW4.js → CmsStatusBadge-D_n8u8xa.js} +1 -1
- package/admin-dist/public/assets/{CmsSurface-DdC_aGB5.js → CmsSurface-BHmvNai4.js} +1 -1
- package/admin-dist/public/assets/{CmsToolbar-Crleacii.js → CmsToolbar-CY6GV2L8.js} +1 -1
- package/admin-dist/public/assets/{ContentEntryEditor-RmtIo3lE.js → ContentEntryEditor-CRgcRkk5.js} +1 -1
- package/admin-dist/public/assets/{TaxonomyFilter-BsoK90hw.js → TaxonomyFilter-Ohv5Jg9c.js} +1 -1
- package/admin-dist/public/assets/{_contentTypeId-Bn2ItET5.js → _contentTypeId-C_vJq22X.js} +1 -1
- package/admin-dist/public/assets/{_entryId-CkZWLvOZ.js → _entryId-jPXz4z9T.js} +1 -1
- package/admin-dist/public/assets/{alert-C7q0k4u0.js → alert-CG97cMfC.js} +1 -1
- package/admin-dist/public/assets/{badge-DiaAY1It.js → badge-C6qt24oj.js} +1 -1
- package/admin-dist/public/assets/{circle-check-big-Bl0y10am.js → circle-check-big-PltpxuB1.js} +1 -1
- package/admin-dist/public/assets/{command-QyTDg7pa.js → command-CJ8i86fd.js} +1 -1
- package/admin-dist/public/assets/{content-D868GT7T.js → content-pKaIL2ru.js} +1 -1
- package/admin-dist/public/assets/{content-types-DD7fJA5i.js → content-types-Bl_8I1Re.js} +1 -1
- package/admin-dist/public/assets/{index-CMnzrG_D.js → index-CtHq_P5q.js} +1 -1
- package/admin-dist/public/assets/{main-DWSY6jZL.js → main-CA-4LyFT.js} +2 -2
- package/admin-dist/public/assets/{media-aqxopgtw.js → media-Bl1tBbJQ.js} +1 -1
- package/admin-dist/public/assets/{new._contentTypeId-9ji3Hibs.js → new._contentTypeId-qsvo01mH.js} +1 -1
- package/admin-dist/public/assets/{pencil-D8GqMaV3.js → pencil-gAL0R34f.js} +1 -1
- package/admin-dist/public/assets/{refresh-cw-JipRPLLT.js → refresh-cw-sdVUGJNs.js} +1 -1
- package/admin-dist/public/assets/{rotate-ccw-CK11hP79.js → rotate-ccw-6OcXCcxb.js} +1 -1
- package/admin-dist/public/assets/{scroll-area-CJS1P20j.js → scroll-area-CJBhf9pf.js} +1 -1
- package/admin-dist/public/assets/{search-BT8HTHxb.js → search-WXp6KxDJ.js} +1 -1
- package/admin-dist/public/assets/settings-D8crrFCn.js +1 -0
- package/admin-dist/public/assets/{switch-Cb-ecsrJ.js → switch-Ck9ecqEX.js} +1 -1
- package/admin-dist/public/assets/{tabs-CFEXN2p7.js → tabs-vQYu8rjC.js} +1 -1
- package/admin-dist/public/assets/{tanstack-adapter-CGxC-fmP.js → tanstack-adapter-BRt2CUCw.js} +1 -1
- package/admin-dist/public/assets/{taxonomies-C21Z8CBa.js → taxonomies-DvILUNvr.js} +1 -1
- package/admin-dist/public/assets/{trash-CMRJlzc0.js → trash-YyYaC3L9.js} +1 -1
- package/admin-dist/public/assets/{useBreadcrumbLabel-ZZFYdqzi.js → useBreadcrumbLabel-tlSh7dtO.js} +1 -1
- package/admin-dist/public/assets/{usePermissions-C2FRye75.js → usePermissions-BTGdTOJS.js} +1 -1
- package/admin-dist/server/_ssr/{CmsEmptyState-DWqt3y_O.mjs → CmsEmptyState-CB6e53i5.mjs} +1 -1
- package/admin-dist/server/_ssr/{CmsPageHeader-BuN0dOPA.mjs → CmsPageHeader-COUHuECp.mjs} +1 -1
- package/admin-dist/server/_ssr/{CmsStatusBadge-CV35-X_8.mjs → CmsStatusBadge-kMTL6koE.mjs} +2 -2
- package/admin-dist/server/_ssr/{CmsSurface-DEcWf_aJ.mjs → CmsSurface-D1HDYjRg.mjs} +1 -1
- package/admin-dist/server/_ssr/{CmsToolbar-BMBEZVgb.mjs → CmsToolbar-NB014hsd.mjs} +1 -1
- package/admin-dist/server/_ssr/{ContentEntryEditor-Db9Sy_0y.mjs → ContentEntryEditor-Bq8FR_uK.mjs} +8 -8
- package/admin-dist/server/_ssr/{TaxonomyFilter-D_xDfC8t.mjs → TaxonomyFilter-bm_p4ADg.mjs} +3 -3
- package/admin-dist/server/_ssr/{_contentTypeId-HZlfcQi-.mjs → _contentTypeId-B7obLmi_.mjs} +10 -10
- package/admin-dist/server/_ssr/{_entryId-Cc_Ry7AV.mjs → _entryId-B4zhQqFg.mjs} +11 -11
- package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DndoqCo7.mjs +4 -0
- package/admin-dist/server/_ssr/{badge-CmG74mbX.mjs → badge-NOEC9bkk.mjs} +1 -1
- package/admin-dist/server/_ssr/{command-DWXiOsOb.mjs → command-h4-OYNBo.mjs} +1 -1
- package/admin-dist/server/_ssr/{content-CAgFQzx-.mjs → content-CShtLuhK.mjs} +8 -8
- package/admin-dist/server/_ssr/{content-types-CqKvAZ8P.mjs → content-types-PeyRyfbc.mjs} +6 -6
- package/admin-dist/server/_ssr/{index--qYdIqvh.mjs → index-CplFXpGg.mjs} +3 -3
- package/admin-dist/server/_ssr/index.mjs +2 -2
- package/admin-dist/server/_ssr/{media-AXePwPAK.mjs → media-QAkNdX54.mjs} +9 -9
- package/admin-dist/server/_ssr/{new._contentTypeId-DNWIl-Ha.mjs → new._contentTypeId-DEJyMphJ.mjs} +10 -10
- package/admin-dist/server/_ssr/{router-B_gIkxi2.mjs → router-CQXMuGMF.mjs} +10 -10
- package/admin-dist/server/_ssr/{scroll-area-Cz-9ry0J.mjs → scroll-area-B7zoNyWB.mjs} +1 -1
- package/admin-dist/server/_ssr/{settings-BjSxo5d6.mjs → settings-CNaqVa4D.mjs} +9 -9
- package/admin-dist/server/_ssr/{switch-IsC1gdb1.mjs → switch-BKZhvryc.mjs} +1 -1
- package/admin-dist/server/_ssr/{tabs-BdgLwrYe.mjs → tabs-DtIIQxiD.mjs} +1 -1
- package/admin-dist/server/_ssr/{tanstack-adapter-CFwjrqRl.mjs → tanstack-adapter-CLavdbUY.mjs} +1 -1
- package/admin-dist/server/_ssr/{taxonomies-D5Di9EgA.mjs → taxonomies-vIZYICzr.mjs} +7 -7
- package/admin-dist/server/_ssr/{trash-DokZl1yA.mjs → trash-7yGR4-dF.mjs} +7 -7
- package/admin-dist/server/_ssr/{useBreadcrumbLabel-C4TsA5z0.mjs → useBreadcrumbLabel-DR5FaAMf.mjs} +1 -1
- package/admin-dist/server/_ssr/{usePermissions-COsRlMp-.mjs → usePermissions-DKkpETj_.mjs} +1 -1
- package/admin-dist/server/index.mjs +155 -155
- package/package.json +1 -1
- package/admin-dist/public/assets/settings-DCY0s2hR.js +0 -1
- package/admin-dist/server/_ssr/_tanstack-start-manifest_v-DhspKP9e.mjs +0 -4
|
@@ -5,35 +5,27 @@
|
|
|
5
5
|
* Used by both CLI routes and embed pages.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import { useState, useCallback, useEffect } from "react";
|
|
8
|
+
import { useState, useCallback, useEffect, useMemo } from "react";
|
|
9
9
|
import { useQuery } from "convex/react";
|
|
10
10
|
import { usePermissions } from "~/hooks";
|
|
11
11
|
import { BulkActionBar } from "~/components/BulkActionBar";
|
|
12
|
-
import { CmsPageHeader } from "~/components/cmsds/CmsPageHeader";
|
|
13
|
-
import { CmsToolbar } from "~/components/cmsds/CmsToolbar";
|
|
14
|
-
import { CmsEmptyState } from "~/components/cmsds/CmsEmptyState";
|
|
15
12
|
import {
|
|
13
|
+
CmsPageHeader,
|
|
14
|
+
CmsEmptyState,
|
|
16
15
|
CmsStatusBadge,
|
|
17
16
|
type ContentStatus,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
SelectContent,
|
|
24
|
-
SelectItem,
|
|
25
|
-
SelectTrigger,
|
|
26
|
-
SelectValue,
|
|
27
|
-
} from "~/components/ui/select";
|
|
17
|
+
CmsButton,
|
|
18
|
+
CmsFilterBar,
|
|
19
|
+
CmsTable,
|
|
20
|
+
type CmsTableColumn,
|
|
21
|
+
} from "~/components/cmsds";
|
|
28
22
|
import {
|
|
29
23
|
DropdownMenu,
|
|
30
24
|
DropdownMenuContent,
|
|
31
25
|
DropdownMenuItem,
|
|
32
26
|
DropdownMenuTrigger,
|
|
33
27
|
} from "~/components/ui/dropdown-menu";
|
|
34
|
-
import {
|
|
35
|
-
import { cn } from "~/lib/cn";
|
|
36
|
-
import { Plus, Search, FileText, ChevronDown } from "lucide-react";
|
|
28
|
+
import { Plus, FileText, ChevronDown } from "lucide-react";
|
|
37
29
|
import type { AdminNavigation } from "~/lib/navigation";
|
|
38
30
|
import { CmsAdminApi } from "~/embed/contexts/ApiContext";
|
|
39
31
|
|
|
@@ -114,30 +106,72 @@ export function ContentPage({ api, navigation }: ContentPageProps) {
|
|
|
114
106
|
});
|
|
115
107
|
};
|
|
116
108
|
|
|
117
|
-
const handleSelectItem = useCallback((id: string, selected: boolean) => {
|
|
118
|
-
setSelectedIds((prev) => {
|
|
119
|
-
const next = new Set(prev);
|
|
120
|
-
if (selected) {
|
|
121
|
-
next.add(id);
|
|
122
|
-
} else {
|
|
123
|
-
next.delete(id);
|
|
124
|
-
}
|
|
125
|
-
return next;
|
|
126
|
-
});
|
|
127
|
-
}, []);
|
|
128
|
-
|
|
129
|
-
const handleSelectAll = useCallback(() => {
|
|
130
|
-
if (selectedIds.size === entries.length && entries.length > 0) {
|
|
131
|
-
setSelectedIds(new Set());
|
|
132
|
-
} else {
|
|
133
|
-
setSelectedIds(new Set(entries.map((e) => e._id)));
|
|
134
|
-
}
|
|
135
|
-
}, [selectedIds.size, entries]);
|
|
136
|
-
|
|
137
109
|
const handleClearSelection = useCallback(() => {
|
|
138
110
|
setSelectedIds(new Set());
|
|
139
111
|
}, []);
|
|
140
112
|
|
|
113
|
+
type Entry = (typeof entries)[number];
|
|
114
|
+
|
|
115
|
+
const entryColumns: CmsTableColumn<Entry>[] = useMemo(
|
|
116
|
+
() => [
|
|
117
|
+
{
|
|
118
|
+
key: "title",
|
|
119
|
+
header: "Title",
|
|
120
|
+
cell: (entry) => (
|
|
121
|
+
<button
|
|
122
|
+
type="button"
|
|
123
|
+
onClick={() => navigation.navigateToEntry(entry._id)}
|
|
124
|
+
className="block text-left"
|
|
125
|
+
>
|
|
126
|
+
<span className="font-medium text-foreground hover:text-primary">
|
|
127
|
+
{getEntryTitle(entry, entry.contentTypeName)}
|
|
128
|
+
</span>
|
|
129
|
+
<span className="block text-xs text-muted-foreground">
|
|
130
|
+
{entry.slug}
|
|
131
|
+
</span>
|
|
132
|
+
</button>
|
|
133
|
+
),
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
key: "type",
|
|
137
|
+
header: "Type",
|
|
138
|
+
cell: (entry) => (
|
|
139
|
+
<span className="text-sm text-muted-foreground">
|
|
140
|
+
{getContentTypeDisplayName(entry.contentTypeName)}
|
|
141
|
+
</span>
|
|
142
|
+
),
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
key: "status",
|
|
146
|
+
header: "Status",
|
|
147
|
+
cell: (entry) => <CmsStatusBadge status={entry.status as ContentStatus} />,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
key: "updated",
|
|
151
|
+
header: "Updated",
|
|
152
|
+
cell: (entry) => (
|
|
153
|
+
<span className="text-sm text-muted-foreground">
|
|
154
|
+
{formatDate(entry._creationTime)}
|
|
155
|
+
</span>
|
|
156
|
+
),
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
key: "actions",
|
|
160
|
+
header: "Actions",
|
|
161
|
+
cell: (entry) => (
|
|
162
|
+
<CmsButton
|
|
163
|
+
variant="outline"
|
|
164
|
+
size="sm"
|
|
165
|
+
onClick={() => navigation.navigateToEntry(entry._id)}
|
|
166
|
+
>
|
|
167
|
+
{canUpdate("contentEntries") ? "Edit" : "View"}
|
|
168
|
+
</CmsButton>
|
|
169
|
+
),
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
[navigation, contentTypes, canUpdate]
|
|
173
|
+
);
|
|
174
|
+
|
|
141
175
|
if (isLoading) {
|
|
142
176
|
return (
|
|
143
177
|
<div className="space-y-6 p-6">
|
|
@@ -162,56 +196,42 @@ export function ContentPage({ api, navigation }: ContentPageProps) {
|
|
|
162
196
|
description="Browse and manage content entries across all content types."
|
|
163
197
|
/>
|
|
164
198
|
|
|
165
|
-
<
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
<SelectTrigger className="w-36">
|
|
202
|
-
<SelectValue placeholder="All Statuses" />
|
|
203
|
-
</SelectTrigger>
|
|
204
|
-
<SelectContent>
|
|
205
|
-
<SelectItem value="all">All Statuses</SelectItem>
|
|
206
|
-
<SelectItem value="draft">Draft</SelectItem>
|
|
207
|
-
<SelectItem value="published">Published</SelectItem>
|
|
208
|
-
<SelectItem value="scheduled">Scheduled</SelectItem>
|
|
209
|
-
<SelectItem value="archived">Archived</SelectItem>
|
|
210
|
-
</SelectContent>
|
|
211
|
-
</Select>
|
|
212
|
-
</div>
|
|
213
|
-
}
|
|
214
|
-
right={
|
|
199
|
+
<CmsFilterBar
|
|
200
|
+
search={{
|
|
201
|
+
value: searchQuery,
|
|
202
|
+
onChange: setSearchQuery,
|
|
203
|
+
placeholder: "Search content...",
|
|
204
|
+
className: "w-64",
|
|
205
|
+
}}
|
|
206
|
+
filters={[
|
|
207
|
+
{
|
|
208
|
+
key: "contentType",
|
|
209
|
+
value: selectedTypeId || "all",
|
|
210
|
+
onChange: (v) => setSelectedTypeId(v === "all" ? "" : v),
|
|
211
|
+
options: [
|
|
212
|
+
{ value: "all", label: "All Content Types" },
|
|
213
|
+
...contentTypes.map((type) => ({
|
|
214
|
+
value: type._id,
|
|
215
|
+
label: type.displayName,
|
|
216
|
+
})),
|
|
217
|
+
],
|
|
218
|
+
className: "w-48",
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
key: "status",
|
|
222
|
+
value: selectedStatus || "all",
|
|
223
|
+
onChange: (v) => setSelectedStatus(v === "all" ? "" : (v as ContentStatus)),
|
|
224
|
+
options: [
|
|
225
|
+
{ value: "all", label: "All Statuses" },
|
|
226
|
+
{ value: "draft", label: "Draft" },
|
|
227
|
+
{ value: "published", label: "Published" },
|
|
228
|
+
{ value: "scheduled", label: "Scheduled" },
|
|
229
|
+
{ value: "archived", label: "Archived" },
|
|
230
|
+
],
|
|
231
|
+
className: "w-36",
|
|
232
|
+
},
|
|
233
|
+
]}
|
|
234
|
+
actions={
|
|
215
235
|
canCreate("contentEntries") && (
|
|
216
236
|
<DropdownMenu>
|
|
217
237
|
<DropdownMenuTrigger asChild>
|
|
@@ -253,91 +273,15 @@ export function ContentPage({ api, navigation }: ContentPageProps) {
|
|
|
253
273
|
}
|
|
254
274
|
/>
|
|
255
275
|
) : (
|
|
256
|
-
<
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
onCheckedChange={handleSelectAll}
|
|
266
|
-
aria-label="Select all entries"
|
|
267
|
-
/>
|
|
268
|
-
</th>
|
|
269
|
-
<th className="p-3 text-left text-sm font-medium text-muted-foreground">
|
|
270
|
-
Title
|
|
271
|
-
</th>
|
|
272
|
-
<th className="p-3 text-left text-sm font-medium text-muted-foreground">
|
|
273
|
-
Type
|
|
274
|
-
</th>
|
|
275
|
-
<th className="p-3 text-left text-sm font-medium text-muted-foreground">
|
|
276
|
-
Status
|
|
277
|
-
</th>
|
|
278
|
-
<th className="p-3 text-left text-sm font-medium text-muted-foreground">
|
|
279
|
-
Updated
|
|
280
|
-
</th>
|
|
281
|
-
<th className="p-3 text-left text-sm font-medium text-muted-foreground">
|
|
282
|
-
Actions
|
|
283
|
-
</th>
|
|
284
|
-
</tr>
|
|
285
|
-
</thead>
|
|
286
|
-
<tbody>
|
|
287
|
-
{entries.map((entry) => (
|
|
288
|
-
<tr
|
|
289
|
-
key={entry._id}
|
|
290
|
-
className={cn(
|
|
291
|
-
"border-b last:border-0 transition-colors hover:bg-muted/50",
|
|
292
|
-
selectedIds.has(entry._id) && "bg-primary/5"
|
|
293
|
-
)}
|
|
294
|
-
>
|
|
295
|
-
<td className="p-3">
|
|
296
|
-
<Checkbox
|
|
297
|
-
checked={selectedIds.has(entry._id)}
|
|
298
|
-
onCheckedChange={(checked) =>
|
|
299
|
-
handleSelectItem(entry._id, checked as boolean)
|
|
300
|
-
}
|
|
301
|
-
aria-label={`Select ${getEntryTitle(entry, entry.contentTypeName)}`}
|
|
302
|
-
/>
|
|
303
|
-
</td>
|
|
304
|
-
<td className="p-3">
|
|
305
|
-
<button
|
|
306
|
-
type="button"
|
|
307
|
-
onClick={() => navigation.navigateToEntry(entry._id)}
|
|
308
|
-
className="block text-left"
|
|
309
|
-
>
|
|
310
|
-
<span className="font-medium text-foreground hover:text-primary">
|
|
311
|
-
{getEntryTitle(entry, entry.contentTypeName)}
|
|
312
|
-
</span>
|
|
313
|
-
<span className="block text-xs text-muted-foreground">
|
|
314
|
-
{entry.slug}
|
|
315
|
-
</span>
|
|
316
|
-
</button>
|
|
317
|
-
</td>
|
|
318
|
-
<td className="p-3 text-sm text-muted-foreground">
|
|
319
|
-
{getContentTypeDisplayName(entry.contentTypeName)}
|
|
320
|
-
</td>
|
|
321
|
-
<td className="p-3">
|
|
322
|
-
<CmsStatusBadge status={entry.status as ContentStatus} />
|
|
323
|
-
</td>
|
|
324
|
-
<td className="p-3 text-sm text-muted-foreground">
|
|
325
|
-
{formatDate(entry._creationTime)}
|
|
326
|
-
</td>
|
|
327
|
-
<td className="p-3">
|
|
328
|
-
<CmsButton
|
|
329
|
-
variant="outline"
|
|
330
|
-
size="sm"
|
|
331
|
-
onClick={() => navigation.navigateToEntry(entry._id)}
|
|
332
|
-
>
|
|
333
|
-
{canUpdate("contentEntries") ? "Edit" : "View"}
|
|
334
|
-
</CmsButton>
|
|
335
|
-
</td>
|
|
336
|
-
</tr>
|
|
337
|
-
))}
|
|
338
|
-
</tbody>
|
|
339
|
-
</table>
|
|
340
|
-
</div>
|
|
276
|
+
<CmsTable
|
|
277
|
+
columns={entryColumns}
|
|
278
|
+
data={entries}
|
|
279
|
+
getRowId={(e) => e._id}
|
|
280
|
+
selectable
|
|
281
|
+
selectedIds={selectedIds}
|
|
282
|
+
onSelectionChange={setSelectedIds}
|
|
283
|
+
emptyMessage="No content entries found"
|
|
284
|
+
/>
|
|
341
285
|
)}
|
|
342
286
|
</div>
|
|
343
287
|
);
|