diff --git a/apps/web-dashboard/src/components/CollectionTable.jsx b/apps/web-dashboard/src/components/CollectionTable.jsx
index d90c09757..03db79fd1 100644
--- a/apps/web-dashboard/src/components/CollectionTable.jsx
+++ b/apps/web-dashboard/src/components/CollectionTable.jsx
@@ -77,7 +77,31 @@ const DraggableColumnHeader = ({ header, children, style: propStyle, className }
export default function CollectionTable({ data, activeCollection, onDelete, onView, onEdit }) {
// 1. Column Definitions
const columns = useMemo(() => {
- if (!activeCollection?.model) return [];
+ if (!activeCollection) return [];
+
+ const SYSTEM_FIELDS = ['_id', '__v', 'createdAt', 'updatedAt'];
+
+ const inferType = (value) => {
+ if (typeof value === 'boolean') return 'BOOLEAN';
+ if (typeof value === 'number') return 'NUMBER';
+ if (Array.isArray(value)) return 'ARRAY';
+ return 'STRING';
+ };
+
+ const baseColumns = activeCollection.model?.length > 0
+ ? activeCollection.model.map(field => ({
+ key: field.key,
+ type: field.type
+ }))
+ : data?.length > 0
+ ? Object.entries(data[0])
+ .filter(([key]) => !SYSTEM_FIELDS.includes(key))
+ .map(([key, value]) => ({
+ key,
+ type: inferType(value)
+ }))
+ : [];
+
return [
{
id: "rowNumber",
@@ -87,11 +111,10 @@ export default function CollectionTable({ data, activeCollection, onDelete, onVi
enableResizing: false,
enableHiding: false,
},
- ...activeCollection.model.map((field) => ({
- id: field.key, // Explicit ID matches accessorKey usually
+ ...baseColumns.map((field) => ({
+ id: field.key,
header: () => (
- {/* Drag Handle Indicator (Visual only, whole header is draggable) */}
{field.key}
{field.type}
@@ -103,6 +126,7 @@ export default function CollectionTable({ data, activeCollection, onDelete, onVi
maxSize: 500,
cell: (info) => {
const value = info.getValue();
+ if (value === null || value === undefined) return
—;
if (typeof value === "boolean") {
return (
@@ -110,8 +134,7 @@ export default function CollectionTable({ data, activeCollection, onDelete, onVi
);
}
- // Object type — show preview
- if (value !== null && typeof value === "object" && !Array.isArray(value)) {
+ if (typeof value === "object" && !Array.isArray(value)) {
const keys = Object.keys(value).filter(k => !k.startsWith('_'));
return (
);
}
- // Array type — show count
if (Array.isArray(value)) {
return (
- {String(value ?? '')}
+
+ {String(value)}
);
},
@@ -183,7 +205,7 @@ export default function CollectionTable({ data, activeCollection, onDelete, onVi
),
},
];
- }, [activeCollection, onDelete, onView, onEdit]);
+ }, [activeCollection, data, onDelete, onView, onEdit]);
// 2. Load Persisted State
const storageKey = `table-settings-${activeCollection?._id}`;
diff --git a/apps/web-dashboard/src/pages/Database.jsx b/apps/web-dashboard/src/pages/Database.jsx
index 051c5eb77..04a5cd06b 100644
--- a/apps/web-dashboard/src/pages/Database.jsx
+++ b/apps/web-dashboard/src/pages/Database.jsx
@@ -413,32 +413,34 @@ export default function Database() {
{data.length} Records
-
-
-
-
-
+ {(activeCollection?.model?.length > 0 || data?.length > 0) && (
+
+
+
+
+
+ )}