Skip to content

Commit 45a77c9

Browse files
committed
fix: update data fetching logic in ObjectKanban to use getObjectSchema and improve loading state management
1 parent 73209c8 commit 45a77c9

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

apps/console/src/__tests__/PluginsIntegration.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ describe('Plugins Integration Test', () => {
161161

162162
// Wait for schema fetch and rendering
163163
await waitFor(() => {
164-
expect(mockDataSource.getObject).toHaveBeenCalledWith('todo_task');
164+
expect(mockDataSource.getObjectSchema).toHaveBeenCalledWith('todo_task');
165165
});
166166

167167
// Expect columns to be generated from schema options

packages/plugin-kanban/src/ObjectKanban.tsx

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,53 +34,62 @@ export const ObjectKanban: React.FC<ObjectKanbanProps> = ({
3434

3535
// Fetch object definition for metadata (labels, options)
3636
useEffect(() => {
37+
let isMounted = true;
3738
const fetchMeta = async () => {
3839
if (!dataSource || !schema.objectName) return;
3940
try {
40-
const def = await dataSource.getObject(schema.objectName);
41-
setObjectDef(def);
41+
const def = await dataSource.getObjectSchema(schema.objectName);
42+
if (isMounted) setObjectDef(def);
4243
} catch (e) {
4344
console.warn("Failed to fetch object def", e);
4445
}
4546
};
4647
fetchMeta();
48+
return () => { isMounted = false; };
4749
}, [schema.objectName, dataSource]);
4850

4951
useEffect(() => {
52+
let isMounted = true;
5053
const fetchData = async () => {
5154
if (!dataSource || !schema.objectName) return;
52-
setLoading(true);
55+
if (isMounted) setLoading(true);
5356
try {
54-
// Simple find for now, usually we might want filters
55-
// Using a large limit or pagination would be needed for real apps,
56-
// for now, we assume a reasonable default.
5757
const results = await dataSource.find(schema.objectName, {
58-
options: { $top: 100 } // Fetch up to 100 cards
58+
options: { $top: 100 },
59+
$filter: schema.filter
5960
});
61+
6062
// Handle { value: [] } OData shape or { data: [] } shape or direct array
61-
let data = results;
62-
if ((results as any).value) {
63-
data = (results as any).value;
64-
} else if ((results as any).data) {
65-
data = (results as any).data;
63+
let data: any[] = [];
64+
if (Array.isArray(results)) {
65+
data = results;
66+
} else if (results && typeof results === 'object') {
67+
if (Array.isArray((results as any).value)) {
68+
data = (results as any).value;
69+
} else if (Array.isArray((results as any).data)) {
70+
data = (results as any).data;
71+
}
6672
}
6773

68-
if (Array.isArray(data)) {
74+
console.log(`[ObjectKanban] Extracted data (length: ${data.length})`);
75+
76+
if (isMounted) {
6977
setFetchedData(data);
7078
}
7179
} catch (e) {
72-
console.error(e);
73-
setError(e as Error);
80+
console.error('[ObjectKanban] Fetch error:', e);
81+
if (isMounted) setError(e as Error);
7482
} finally {
75-
setLoading(false);
83+
if (isMounted) setLoading(false);
7684
}
7785
};
7886

7987
// Trigger fetch if we have an objectName AND verify no inline/bound data overrides it
8088
if (schema.objectName && !boundData && !schema.data) {
8189
fetchData();
8290
}
83-
}, [schema.objectName, dataSource, boundData, schema.data]);
91+
return () => { isMounted = false; };
92+
}, [schema.objectName, dataSource, boundData, schema.data, schema.filter]);
8493

8594
// Determine which data to use: bound -> inline -> fetched
8695
const rawData = boundData || schema.data || fetchedData;

0 commit comments

Comments
 (0)