Skip to content

Commit 6523e68

Browse files
authored
Merge pull request #245 from CivicDataLab/243-revamp-resource-page-in-dataset-creation
243 revamp resource page in dataset creation
2 parents 82a7a1c + 77a976a commit 6523e68

File tree

8 files changed

+413
-280
lines changed

8 files changed

+413
-280
lines changed

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx

Lines changed: 302 additions & 202 deletions
Large diffs are not rendered by default.
Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,43 @@
1-
import React from 'react'
1+
import { DataTable } from 'opub-ui';
22

3-
interface EditProps{
4-
isPreview:boolean
3+
interface EditProps {
4+
isPreview: boolean;
5+
previewData: {
6+
columns: string[];
7+
rows: any[];
8+
};
59
}
610

7-
const PreviewData=({isPreview}: EditProps)=> {
11+
const PreviewData = ({ isPreview, previewData }: EditProps) => {
12+
const previewColumns =
13+
previewData?.columns?.map((column: string) => ({
14+
accessorKey: column,
15+
header: column,
16+
cell: ({ cell }: any) => {
17+
const value = cell.getValue();
18+
return <span>{value !== null ? value.toString() : 'N/A'}</span>;
19+
},
20+
})) || [];
21+
22+
// Transform rows data to match column structure
23+
const previewRows =
24+
previewData?.rows?.map((row: any[]) => {
25+
const rowData: Record<string, any> = {};
26+
previewData.columns.forEach((column: string, index: number) => {
27+
rowData[column] = row[index];
28+
});
29+
return rowData;
30+
}) || [];
831
return (
9-
<div>PreviewData</div>
10-
)
11-
}
32+
<div className="md:max-w-[75vh] lg:max-w-[96vh]">
33+
<DataTable
34+
columns={previewColumns}
35+
hideFooter
36+
hideSelection
37+
rows={previewRows}
38+
/>
39+
</div>
40+
);
41+
};
1242

13-
export default PreviewData
43+
export default PreviewData;

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
import React from 'react';
2-
import { useParams, useSearchParams } from 'next/navigation';
3-
import { graphql } from '@/gql';
41
import { CreateFileResourceInput } from '@/gql/generated/graphql';
5-
import { useMutation, useQuery } from '@tanstack/react-query';
2+
import { useMutation } from '@tanstack/react-query';
63
import { parseAsString, useQueryState } from 'next-usequerystate';
7-
import { Button, DropZone, Text } from 'opub-ui';
4+
import { useParams } from 'next/navigation';
5+
import { Button, DropZone, Text, toast } from 'opub-ui';
6+
import React from 'react';
87

98
import { GraphQL } from '@/lib/api';
10-
import { bytesToSize } from '@/lib/utils';
119
import { createResourceFilesDoc } from './query';
1210

1311
export const ResourceDropzone = ({ reload }: { reload: () => void }) => {
@@ -36,7 +34,8 @@ export const ResourceDropzone = ({ reload }: { reload: () => void }) => {
3634
setResourceId(data.createFileResources[0].id);
3735
},
3836
onError: (err: any) => {
39-
console.log('Error ::: ', err);
37+
toast(err.message);
38+
setFile([]);
4039
},
4140
}
4241
);

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ const ResourceHeader = ({
7272
</Button>
7373
</div>
7474
</div>
75-
{list.map((item, index) => (
75+
{list?.map((item, index) => (
7676
<div
7777
key={index}
7878
className={`rounded-1 border-1 border-solid border-baseGraySlateSolid6 px-6 py-3 ${resourceId === item.value ? ' bg-baseGraySlateSolid5' : ''}`}

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useEffect } from 'react';
22
import { useParams, useRouter } from 'next/navigation';
33
import { CreateFileResourceInput } from '@/gql/generated/graphql';
44
import { useMutation } from '@tanstack/react-query';
@@ -43,6 +43,11 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => {
4343
id: string;
4444
}>();
4545

46+
47+
useEffect(() => {
48+
refetch();
49+
}, [resourceId]);
50+
4651
const updateResourceMutation = useMutation(
4752
(data: { resourceId: string }) =>
4853
GraphQL(
@@ -67,11 +72,12 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => {
6772
});
6873
},
6974
onError: (err: any) => {
70-
console.log('Error ::: ', err);
75+
toast(err);
7176
},
7277
}
7378
);
7479

80+
7581
const createResourceMutation = useMutation(
7682
(data: { fileResourceInput: CreateFileResourceInput }) =>
7783
GraphQL(
@@ -109,10 +115,9 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => {
109115
);
110116
},
111117
onError: (err: any) => {
112-
toast(err.message || String(err));
113-
setFile([])
114-
}
115-
118+
toast(err);
119+
setFile([]);
120+
},
116121
}
117122
);
118123

@@ -182,6 +187,20 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => {
182187
table.rows
183188
);
184189

190+
191+
useEffect(() => {
192+
const updatedRows =
193+
data.map((item: any) => ({
194+
name_of_resource: item.name,
195+
type: item.type,
196+
date_added: formatDate(item.created),
197+
id: item.id,
198+
})) || [];
199+
200+
setFilteredRows(updatedRows);
201+
}, [data]);
202+
203+
185204
const handleSearchChange = (e: string) => {
186205
const searchTerm = e.toLowerCase();
187206
const filtered = table.rows.filter((row: any) =>

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceSchema.tsx

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
import {
2-
DataTable,
3-
Select,
4-
TextField
5-
} from 'opub-ui';
61
import React from 'react';
7-
2+
import { DataTable, Select, TextField } from 'opub-ui';
83

94
const DescriptionCell = ({
105
value,
@@ -17,7 +12,7 @@ const DescriptionCell = ({
1712
}) => {
1813
const [description, setDescription] = React.useState(value || '');
1914

20-
const handleChange = (e:any) => {
15+
const handleChange = (e: any) => {
2116
setDescription(e?.target?.value);
2217
handleFieldChange('description', e?.target?.value, rowIndex);
2318
};
@@ -34,8 +29,12 @@ const DescriptionCell = ({
3429
);
3530
};
3631

37-
export const ResourceSchema = ({ setSchema, data }: any) => {
38-
32+
export const ResourceSchema = ({
33+
setSchema,
34+
data,
35+
mutate,
36+
resourceId,
37+
}: any) => {
3938
const [updatedData, setUpdatedData] = React.useState<any>(data);
4039

4140
React.useEffect(() => {
@@ -49,17 +48,32 @@ export const ResourceSchema = ({ setSchema, data }: any) => {
4948
newValue: string,
5049
rowIndex: any
5150
) => {
52-
setUpdatedData((prev: any) => {
53-
const newData = [...prev];
54-
newData[rowIndex] = {
55-
...newData[rowIndex],
56-
[field]: newValue,
57-
};
58-
return newData;
59-
});
51+
const newData = [...updatedData];
52+
newData[rowIndex] = {
53+
...newData[rowIndex],
54+
[field]: newValue,
55+
};
56+
57+
setUpdatedData(newData);
58+
setSchema(newData);
59+
handleSave(newData);
60+
};
61+
62+
const handleSave = (newdata: any) => {
63+
const isSchemaChanged = JSON.stringify(newdata) !== JSON.stringify(data);
64+
if (isSchemaChanged) {
65+
mutate({
66+
schemaUpdateInput: {
67+
resource: resourceId,
68+
updates: newdata?.map((item: any) => {
69+
const { fieldName, ...rest } = item;
70+
return rest;
71+
}),
72+
},
73+
});
74+
}
6075
};
6176

62-
setSchema(updatedData);
6377
const options = [
6478
{
6579
label: 'Integer',
@@ -127,11 +141,13 @@ export const ResourceSchema = ({ setSchema, data }: any) => {
127141
{data && data.length > 0 ? (
128142
<DataTable
129143
columns={generateColumnData()}
130-
rows={generateTableData(data)}
144+
rows={generateTableData(updatedData)}
131145
hideFooter={false}
132146
hideSelection
133147
/>
134-
):<div className="mt-8 flex justify-center">Click on Reset Fields</div>}
148+
) : (
149+
<div className="mt-8 flex justify-center">Click on Reset Fields</div>
150+
)}
135151
</div>
136152
</>
137153
);

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/page-layout.tsx

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,14 @@ import { GraphQL } from '@/lib/api';
99
import { EditResource } from './components/EditResource';
1010
import { ResourceDropzone } from './components/ResourceDropzone';
1111
import { ResourceListView } from './components/ResourceListView';
12-
import { getReourceDoc } from './query';
12+
import { getResourceDoc } from './query';
1313

1414
export interface TListItem {
1515
label: string;
1616
value: string;
1717
description: string;
1818
dataset: any;
1919
fileDetails: any;
20-
previewEnabled: boolean
21-
previewDetails: {
22-
startEntry: 0,
23-
endEntry: 0,
24-
isAllEntries: boolean
25-
}
2620
}
2721

2822
export function DistibutionPage({
@@ -34,16 +28,12 @@ export function DistibutionPage({
3428
[`fetch_resources_${params.id}`],
3529
() =>
3630
GraphQL(
37-
getReourceDoc,
31+
getResourceDoc,
3832
{
3933
[params.entityType]: params.entitySlug,
4034
},
4135
{ filters: { id: params.id } }
4236
),
43-
{
44-
refetchOnMount: true,
45-
refetchOnReconnect: true,
46-
}
4737
);
4838

4939
const ResourceList: TListItem[] =
@@ -54,12 +44,7 @@ export function DistibutionPage({
5444
description: item.description,
5545
dataset: item.dataset?.pk,
5646
fileDetails: item.fileDetails,
57-
previewEnabled: item.previewEnabled,
58-
previewDetails: {
59-
startEntry: item.previewDetails?.startEntry,
60-
endEntry: item.previewDetails?.endEntry,
61-
isAllEntries: item.previewDetails?.isAllEntries
62-
}
47+
6348
}))) ||
6449
[];
6550

@@ -78,7 +63,7 @@ export function DistibutionPage({
7863
{data && ResourceList.length > 0 ? (
7964
<>
8065
{resourceId ? (
81-
<EditResource refetch={refetch} list={ResourceList} />
66+
<EditResource refetch={refetch} allResources={ResourceList}/>
8267
) : (
8368
<ResourceListView
8469
refetch={refetch}

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/query.ts

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,13 @@
11
import { graphql } from '@/gql';
22

3-
export const getReourceDoc = graphql(`
3+
export const getResourceDoc = graphql(`
44
query getResources($filters: DatasetFilter) {
55
datasets(filters: $filters) {
66
resources {
77
id
88
dataset {
99
pk
1010
}
11-
previewData {
12-
columns
13-
rows
14-
}
15-
previewDetails {
16-
endEntry
17-
isAllEntries
18-
startEntry
19-
}
20-
previewEnabled
21-
schema {
22-
id
23-
fieldName
24-
format
25-
description
26-
}
2711
type
2812
name
2913
description

0 commit comments

Comments
 (0)