Skip to content

Commit 86b42b8

Browse files
Fix TypeScript errors and build all view components successfully
Co-authored-by: xuyushun441-sys <255036401+xuyushun441-sys@users.noreply.github.com>
1 parent 4251ead commit 86b42b8

8 files changed

Lines changed: 190 additions & 82 deletions

File tree

packages/views/src/ObjectCalendar.tsx

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,33 @@ function getDataConfig(schema: ObjectGridSchema): ViewData | null {
6060
return null;
6161
}
6262

63+
/**
64+
* Helper to convert sort config to QueryParams format
65+
*/
66+
function convertSortToQueryParams(sort: string | any[] | undefined): Record<string, 'asc' | 'desc'> | undefined {
67+
if (!sort) return undefined;
68+
69+
// If it's a string like "name desc"
70+
if (typeof sort === 'string') {
71+
const parts = sort.split(' ');
72+
const field = parts[0];
73+
const order = (parts[1]?.toLowerCase() === 'desc' ? 'desc' : 'asc') as 'asc' | 'desc';
74+
return { [field]: order };
75+
}
76+
77+
// If it's an array of SortConfig objects
78+
if (Array.isArray(sort)) {
79+
return sort.reduce((acc, item) => {
80+
if (item.field && item.order) {
81+
acc[item.field] = item.order;
82+
}
83+
return acc;
84+
}, {} as Record<string, 'asc' | 'desc'>);
85+
}
86+
87+
return undefined;
88+
}
89+
6390
/**
6491
* Helper to get calendar configuration from schema
6592
*/
@@ -83,8 +110,6 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
83110
className,
84111
onEventClick,
85112
onDateClick,
86-
onEdit,
87-
onDelete,
88113
}) => {
89114
const [data, setData] = useState<any[]>([]);
90115
const [loading, setLoading] = useState(true);
@@ -115,11 +140,11 @@ export const ObjectCalendar: React.FC<ObjectCalendarProps> = ({
115140

116141
if (dataConfig?.provider === 'object') {
117142
const objectName = dataConfig.object;
118-
const records = await dataSource.query(objectName, {
119-
filters: schema.filter,
120-
sort: schema.sort,
143+
const result = await dataSource.find(objectName, {
144+
$filter: schema.filter,
145+
$orderby: convertSortToQueryParams(schema.sort),
121146
});
122-
setData(records || []);
147+
setData(result?.data || []);
123148
} else if (dataConfig?.provider === 'api') {
124149
console.warn('API provider not yet implemented for ObjectCalendar');
125150
setData([]);

packages/views/src/ObjectGantt.tsx

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,33 @@ function getDataConfig(schema: ObjectGridSchema): ViewData | null {
5959
return null;
6060
}
6161

62+
/**
63+
* Helper to convert sort config to QueryParams format
64+
*/
65+
function convertSortToQueryParams(sort: string | any[] | undefined): Record<string, 'asc' | 'desc'> | undefined {
66+
if (!sort) return undefined;
67+
68+
// If it's a string like "name desc"
69+
if (typeof sort === 'string') {
70+
const parts = sort.split(' ');
71+
const field = parts[0];
72+
const order = (parts[1]?.toLowerCase() === 'desc' ? 'desc' : 'asc') as 'asc' | 'desc';
73+
return { [field]: order };
74+
}
75+
76+
// If it's an array of SortConfig objects
77+
if (Array.isArray(sort)) {
78+
return sort.reduce((acc, item) => {
79+
if (item.field && item.order) {
80+
acc[item.field] = item.order;
81+
}
82+
return acc;
83+
}, {} as Record<string, 'asc' | 'desc'>);
84+
}
85+
86+
return undefined;
87+
}
88+
6289
/**
6390
* Helper to get gantt configuration from schema
6491
*/
@@ -81,8 +108,6 @@ export const ObjectGantt: React.FC<ObjectGanttProps> = ({
81108
dataSource,
82109
className,
83110
onTaskClick,
84-
onEdit,
85-
onDelete,
86111
}) => {
87112
const [data, setData] = useState<any[]>([]);
88113
const [loading, setLoading] = useState(true);
@@ -111,11 +136,11 @@ export const ObjectGantt: React.FC<ObjectGanttProps> = ({
111136

112137
if (dataConfig?.provider === 'object') {
113138
const objectName = dataConfig.object;
114-
const records = await dataSource.query(objectName, {
115-
filters: schema.filter,
116-
sort: schema.sort,
139+
const result = await dataSource.find(objectName, {
140+
$filter: schema.filter,
141+
$orderby: convertSortToQueryParams(schema.sort),
117142
});
118-
setData(records || []);
143+
setData(result?.data || []);
119144
} else if (dataConfig?.provider === 'api') {
120145
console.warn('API provider not yet implemented for ObjectGantt');
121146
setData([]);
@@ -328,7 +353,7 @@ export const ObjectGantt: React.FC<ObjectGanttProps> = ({
328353

329354
{/* Task Bars */}
330355
<div className="relative">
331-
{tasks.map((task, index) => {
356+
{tasks.map((task) => {
332357
const position = getTaskPosition(task);
333358

334359
return (

packages/views/src/ObjectKanban.tsx

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,33 @@ function getDataConfig(schema: ObjectGridSchema): ViewData | null {
5959
return null;
6060
}
6161

62+
/**
63+
* Helper to convert sort config to QueryParams format
64+
*/
65+
function convertSortToQueryParams(sort: string | any[] | undefined): Record<string, 'asc' | 'desc'> | undefined {
66+
if (!sort) return undefined;
67+
68+
// If it's a string like "name desc"
69+
if (typeof sort === 'string') {
70+
const parts = sort.split(' ');
71+
const field = parts[0];
72+
const order = (parts[1]?.toLowerCase() === 'desc' ? 'desc' : 'asc') as 'asc' | 'desc';
73+
return { [field]: order };
74+
}
75+
76+
// If it's an array of SortConfig objects
77+
if (Array.isArray(sort)) {
78+
return sort.reduce((acc, item) => {
79+
if (item.field && item.order) {
80+
acc[item.field] = item.order;
81+
}
82+
return acc;
83+
}, {} as Record<string, 'asc' | 'desc'>);
84+
}
85+
86+
return undefined;
87+
}
88+
6289
/**
6390
* Helper to get kanban configuration from schema
6491
* Extracts kanban-specific settings or provides defaults
@@ -83,8 +110,6 @@ export const ObjectKanban: React.FC<ObjectKanbanProps> = ({
83110
className,
84111
onCardClick,
85112
onCardMove,
86-
onEdit,
87-
onDelete,
88113
}) => {
89114
const [data, setData] = useState<any[]>([]);
90115
const [loading, setLoading] = useState(true);
@@ -113,11 +138,11 @@ export const ObjectKanban: React.FC<ObjectKanbanProps> = ({
113138

114139
if (dataConfig?.provider === 'object') {
115140
const objectName = dataConfig.object;
116-
const records = await dataSource.query(objectName, {
117-
filters: schema.filter,
118-
sort: schema.sort,
141+
const result = await dataSource.find(objectName, {
142+
$filter: schema.filter,
143+
$orderby: convertSortToQueryParams(schema.sort),
119144
});
120-
setData(records || []);
145+
setData(result?.data || []);
121146
} else if (dataConfig?.provider === 'api') {
122147
// For API provider, we'd need to fetch from the read endpoint
123148
// This would typically be handled by a custom hook or data fetching layer
@@ -195,7 +220,7 @@ export const ObjectKanban: React.FC<ObjectKanbanProps> = ({
195220
description: displayColumns[1] ? record[displayColumns[1]] : undefined,
196221
data: record,
197222
// Map additional fields to display
198-
fields: displayColumns.slice(2).reduce((acc, fieldName) => {
223+
fields: displayColumns.slice(2).reduce((acc: Record<string, any>, fieldName: string) => {
199224
acc[fieldName] = record[fieldName];
200225
return acc;
201226
}, {} as Record<string, any>),
@@ -231,7 +256,7 @@ export const ObjectKanban: React.FC<ObjectKanbanProps> = ({
231256
const objectName = dataConfig.object;
232257
dataSource.update(objectName, cardId, {
233258
[kanbanConfig.groupByField]: toColumnId,
234-
}).catch(err => {
259+
}).catch((err: any) => {
235260
console.error('Failed to update record:', err);
236261
// Revert the change on error
237262
setData(prevData => {

packages/views/src/ObjectMap.tsx

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,33 @@ function getDataConfig(schema: ObjectGridSchema): ViewData | null {
7878
return null;
7979
}
8080

81+
/**
82+
* Helper to convert sort config to QueryParams format
83+
*/
84+
function convertSortToQueryParams(sort: string | any[] | undefined): Record<string, 'asc' | 'desc'> | undefined {
85+
if (!sort) return undefined;
86+
87+
// If it's a string like "name desc"
88+
if (typeof sort === 'string') {
89+
const parts = sort.split(' ');
90+
const field = parts[0];
91+
const order = (parts[1]?.toLowerCase() === 'desc' ? 'desc' : 'asc') as 'asc' | 'desc';
92+
return { [field]: order };
93+
}
94+
95+
// If it's an array of SortConfig objects
96+
if (Array.isArray(sort)) {
97+
return sort.reduce((acc, item) => {
98+
if (item.field && item.order) {
99+
acc[item.field] = item.order;
100+
}
101+
return acc;
102+
}, {} as Record<string, 'asc' | 'desc'>);
103+
}
104+
105+
return undefined;
106+
}
107+
81108
/**
82109
* Helper to get map configuration from schema
83110
*/
@@ -156,8 +183,6 @@ export const ObjectMap: React.FC<ObjectMapProps> = ({
156183
dataSource,
157184
className,
158185
onMarkerClick,
159-
onEdit,
160-
onDelete,
161186
}) => {
162187
const [data, setData] = useState<any[]>([]);
163188
const [loading, setLoading] = useState(true);
@@ -187,11 +212,11 @@ export const ObjectMap: React.FC<ObjectMapProps> = ({
187212

188213
if (dataConfig?.provider === 'object') {
189214
const objectName = dataConfig.object;
190-
const records = await dataSource.query(objectName, {
191-
filters: schema.filter,
192-
sort: schema.sort,
215+
const result = await dataSource.find(objectName, {
216+
$filter: schema.filter,
217+
$orderby: convertSortToQueryParams(schema.sort),
193218
});
194-
setData(records || []);
219+
setData(result?.data || []);
195220
} else if (dataConfig?.provider === 'api') {
196221
console.warn('API provider not yet implemented for ObjectMap');
197222
setData([]);

packages/views/src/__tests__/ObjectCalendar.test.tsx

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,22 @@ describe('ObjectCalendar', () => {
1818
beforeEach(() => {
1919
// Mock data source
2020
mockDataSource = {
21-
query: vi.fn().mockResolvedValue([
22-
{
23-
_id: '1',
24-
title: 'Meeting 1',
25-
start_date: '2024-01-15T10:00:00Z',
26-
end_date: '2024-01-15T11:00:00Z',
27-
},
28-
{
29-
_id: '2',
30-
title: 'Meeting 2',
31-
start_date: '2024-01-20T14:00:00Z',
32-
end_date: '2024-01-20T15:00:00Z',
33-
},
34-
]),
21+
find: vi.fn().mockResolvedValue({
22+
data: [
23+
{
24+
_id: '1',
25+
title: 'Meeting 1',
26+
start_date: '2024-01-15T10:00:00Z',
27+
end_date: '2024-01-15T11:00:00Z',
28+
},
29+
{
30+
_id: '2',
31+
title: 'Meeting 2',
32+
start_date: '2024-01-20T14:00:00Z',
33+
end_date: '2024-01-20T15:00:00Z',
34+
},
35+
],
36+
}),
3537
getObjectSchema: vi.fn().mockResolvedValue({
3638
name: 'events',
3739
label: 'Events',
@@ -70,7 +72,7 @@ describe('ObjectCalendar', () => {
7072
render(<ObjectCalendar schema={mockSchema} dataSource={mockDataSource} />);
7173

7274
await waitFor(() => {
73-
expect(mockDataSource.query).toHaveBeenCalledWith('events', expect.any(Object));
75+
expect(mockDataSource.find).toHaveBeenCalledWith('events', expect.any(Object));
7476
});
7577

7678
await waitFor(() => {

packages/views/src/__tests__/ObjectGantt.test.tsx

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,24 @@ describe('ObjectGantt', () => {
1818
beforeEach(() => {
1919
// Mock data source
2020
mockDataSource = {
21-
query: vi.fn().mockResolvedValue([
22-
{
23-
_id: '1',
24-
title: 'Task 1',
25-
start_date: '2024-01-01T00:00:00Z',
26-
end_date: '2024-01-15T00:00:00Z',
27-
progress: 50,
28-
},
29-
{
30-
_id: '2',
31-
title: 'Task 2',
32-
start_date: '2024-01-10T00:00:00Z',
33-
end_date: '2024-01-25T00:00:00Z',
34-
progress: 75,
35-
},
36-
]),
21+
find: vi.fn().mockResolvedValue({
22+
data: [
23+
{
24+
_id: '1',
25+
title: 'Task 1',
26+
start_date: '2024-01-01T00:00:00Z',
27+
end_date: '2024-01-15T00:00:00Z',
28+
progress: 50,
29+
},
30+
{
31+
_id: '2',
32+
title: 'Task 2',
33+
start_date: '2024-01-10T00:00:00Z',
34+
end_date: '2024-01-25T00:00:00Z',
35+
progress: 75,
36+
},
37+
],
38+
}),
3739
getObjectSchema: vi.fn().mockResolvedValue({
3840
name: 'tasks',
3941
label: 'Tasks',
@@ -74,7 +76,7 @@ describe('ObjectGantt', () => {
7476
render(<ObjectGantt schema={mockSchema} dataSource={mockDataSource} />);
7577

7678
await waitFor(() => {
77-
expect(mockDataSource.query).toHaveBeenCalledWith('tasks', expect.any(Object));
79+
expect(mockDataSource.find).toHaveBeenCalledWith('tasks', expect.any(Object));
7880
});
7981

8082
await waitFor(() => {

packages/views/src/__tests__/ObjectKanban.test.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ describe('ObjectKanban', () => {
1818
beforeEach(() => {
1919
// Mock data source
2020
mockDataSource = {
21-
query: vi.fn().mockResolvedValue([
22-
{ _id: '1', title: 'Task 1', status: 'todo', priority: 'high' },
23-
{ _id: '2', title: 'Task 2', status: 'in-progress', priority: 'medium' },
24-
{ _id: '3', title: 'Task 3', status: 'done', priority: 'low' },
25-
]),
21+
find: vi.fn().mockResolvedValue({
22+
data: [
23+
{ _id: '1', title: 'Task 1', status: 'todo', priority: 'high' },
24+
{ _id: '2', title: 'Task 2', status: 'in-progress', priority: 'medium' },
25+
{ _id: '3', title: 'Task 3', status: 'done', priority: 'low' },
26+
],
27+
}),
2628
getObjectSchema: vi.fn().mockResolvedValue({
2729
name: 'tasks',
2830
label: 'Tasks',
@@ -61,7 +63,7 @@ describe('ObjectKanban', () => {
6163
render(<ObjectKanban schema={mockSchema} dataSource={mockDataSource} />);
6264

6365
await waitFor(() => {
64-
expect(mockDataSource.query).toHaveBeenCalledWith('tasks', expect.any(Object));
66+
expect(mockDataSource.find).toHaveBeenCalledWith('tasks', expect.any(Object));
6567
});
6668

6769
await waitFor(() => {

0 commit comments

Comments
 (0)