Skip to content

Commit 63a3e85

Browse files
authored
Merge pull request #283 from CivicDataLab/282-fix-bugs
282 fix bugs
2 parents e995dea + 1b265ac commit 63a3e85

File tree

8 files changed

+133
-90
lines changed

8 files changed

+133
-90
lines changed

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

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ export function EditMetadata({ id }: { id: string }) {
238238
setFormData(updatedData);
239239
setPreviousFormData(updatedData);
240240
} else {
241-
toast(
241+
toast(
242242
'Error: ' +
243243
(res.addUpdateDatasetMetadata?.errors?.fieldErrors
244244
? res.addUpdateDatasetMetadata?.errors?.fieldErrors[0]
@@ -322,51 +322,79 @@ export function EditMetadata({ id }: { id: string }) {
322322
};
323323

324324
const handleSave = (updatedData: any) => {
325-
if (JSON.stringify(updatedData) !== JSON.stringify(previousFormData)) {
326-
setPreviousFormData(updatedData);
325+
const changedFields: any = {};
327326

328-
const transformedValues = Object.keys(updatedData)?.reduce(
329-
(acc: any, key) => {
330-
acc[key] = Array.isArray(updatedData[key])
331-
? updatedData[key]
332-
.map((item: any) => item?.value || item)
333-
.join(', ')
334-
: updatedData[key];
335-
return acc;
336-
},
337-
{}
338-
);
327+
for (const key in updatedData) {
328+
const newValue = updatedData[key];
329+
const prevValue = previousFormData[key];
339330

340-
updateMetadataMutation.mutate({
341-
UpdateMetadataInput: {
342-
dataset: id,
343-
metadata: [
344-
...Object.keys(transformedValues)
345-
.filter(
346-
(valueItem) =>
347-
![
348-
'sectors',
349-
'description',
350-
'tags',
351-
'isPublic',
352-
'license',
353-
].includes(valueItem) && transformedValues[valueItem] !== ''
354-
)
355-
.map((key) => {
356-
return {
357-
id: key,
358-
value: transformedValues[key],
359-
};
360-
}),
361-
],
362-
...(updatedData.license && { license: updatedData.license }),
363-
accessType: updatedData.accessType || 'PUBLIC',
364-
description: updatedData.description || '',
365-
tags: updatedData.tags?.map((item: any) => item.label) || [],
366-
sectors: updatedData.sectors?.map((item: any) => item.value) || [],
367-
},
368-
});
331+
const isArray = Array.isArray(newValue);
332+
333+
const normalize = (val: any) =>
334+
isArray ? val?.map((item: any) => item?.value || item) : val;
335+
336+
const newNormalized = normalize(newValue);
337+
const prevNormalized = normalize(prevValue);
338+
339+
const hasChanged = isArray
340+
? JSON.stringify(newNormalized) !== JSON.stringify(prevNormalized)
341+
: newNormalized !== prevNormalized;
342+
343+
if (hasChanged) {
344+
changedFields[key] = newValue;
345+
}
369346
}
347+
348+
// Exit early if nothing changed
349+
if (Object.keys(changedFields).length === 0) return;
350+
351+
setPreviousFormData(updatedData); // Update local copy
352+
353+
const transformedValues = Object.keys(changedFields).reduce(
354+
(acc: any, key) => {
355+
acc[key] = Array.isArray(changedFields[key])
356+
? changedFields[key]
357+
.map((item: any) => item?.value || item)
358+
.join(', ')
359+
: changedFields[key];
360+
return acc;
361+
},
362+
{}
363+
);
364+
365+
updateMetadataMutation.mutate({
366+
UpdateMetadataInput: {
367+
dataset: id,
368+
metadata: Object.keys(transformedValues)
369+
.filter(
370+
(key) =>
371+
![
372+
'sectors',
373+
'description',
374+
'tags',
375+
'isPublic',
376+
'license',
377+
].includes(key) && transformedValues[key] !== ''
378+
)
379+
.map((key) => ({
380+
id: key,
381+
value: transformedValues[key],
382+
})),
383+
...(changedFields.license && { license: changedFields.license }),
384+
...(changedFields.accessType && {
385+
accessType: changedFields.accessType,
386+
}),
387+
...(changedFields.description !== undefined && {
388+
description: changedFields.description,
389+
}),
390+
...(changedFields.tags && {
391+
tags: changedFields.tags.map((item: any) => item.label),
392+
}),
393+
...(changedFields.sectors && {
394+
sectors: changedFields.sectors.map((item: any) => item.value),
395+
}),
396+
},
397+
});
370398
};
371399

372400
function renderInputField(metadataFormItem: any) {
@@ -522,7 +550,7 @@ export function EditMetadata({ id }: { id: string }) {
522550
name="description"
523551
label="Description *"
524552
value={formData.description}
525-
helpText="Character limit: 1000"
553+
helpText={`Character limit: ${formData?.description?.length}/1000`}
526554
onChange={(e) => handleChange('description', e)}
527555
onBlur={() => handleSave(formData)} // Save on blur
528556
/>

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

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,29 @@ export const EditResource = ({ refetch, allResources }: EditProps) => {
9494
const [schema, setSchema] = React.useState<any>([]);
9595

9696
const resourceDetailsQuery = useQuery<any>(
97-
[`fetch_resource_details_${resourceId}`],
98-
() =>
99-
GraphQL(
97+
// Use a stable key when resourceId is empty/invalid
98+
resourceId && resourceId.trim()
99+
? [`fetch_resource_details_${resourceId}`]
100+
: ['fetch_resource_details_disabled'],
101+
() => {
102+
if (!resourceId || !resourceId.trim()) {
103+
// Return a rejected promise or throw an error to prevent execution
104+
return Promise.reject(new Error('No resource ID provided'));
105+
}
106+
return GraphQL(
100107
resourceDetails,
101108
{
102109
[params.entityType]: params.entitySlug,
103110
},
104111
{ resourceId: resourceId }
105-
),
112+
);
113+
},
106114
{
107-
enabled: !!resourceId,
115+
enabled: !!(resourceId && resourceId.trim()),
116+
// Prevent retries when there's no resourceId
117+
retry: false,
118+
// Don't refetch when resourceId is empty
119+
refetchOnWindowFocus: !!(resourceId && resourceId.trim()),
108120
}
109121
);
110122

@@ -213,9 +225,9 @@ export const EditResource = ({ refetch, allResources }: EditProps) => {
213225
columns: [],
214226
});
215227

216-
// useEffect(() => {
217-
// resourceDetailsQuery.refetch();
218-
// }, []);
228+
useEffect(() => {
229+
resourceDetailsQuery.refetch();
230+
}, []);
219231

220232
React.useEffect(() => {
221233
const ResourceData = resourceDetailsQuery.data?.resourceById;
@@ -232,14 +244,12 @@ export const EditResource = ({ refetch, allResources }: EditProps) => {
232244
});
233245
}, [resourceDetailsQuery.data]);
234246

235-
236247
useEffect(() => {
237248
const schemaData = resourceDetailsQuery.data?.resourceById?.schema;
238249
if (schemaData && Array.isArray(schemaData)) {
239250
setSchema(schemaData);
240251
}
241252
}, [resourceDetailsQuery.data]);
242-
243253

244254
const handleResourceChange = (e: any) => {
245255
setResourceId(e, { shallow: false });
@@ -378,6 +388,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => {
378388
<TextField
379389
value={resourceName}
380390
onChange={(text) => setResourceName(text)}
391+
helpText={`Character limit: ${resourceName?.length}/200`}
381392
onBlur={saveResource}
382393
multiline={2}
383394
label="Data File Name"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export const ResourceDropzone = ({ reload }: { reload: () => void }) => {
5858
<Button kind="secondary" variant="interactive">
5959
Choose Files to Upload
6060
</Button>
61-
<Text>Maximum File Size Limit : 25 MB</Text>
61+
<Text>Maximum File Size Limit : 50 MB</Text>
6262
<div className="flex flex-wrap flex-row items-center gap-2">
6363
<Text variant="bodyMd" color="subdued">
6464
Supported File Types:

app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { Loading } from '@/components/loading';
1414
import { ActionBar } from './components/action-bar';
1515
import { Content } from './components/content';
1616
import { Navigation } from './components/navigate-org-datasets';
17+
import { formatDate } from '@/lib/utils';
1718

1819
const allDatasetsQueryDoc: any = graphql(`
1920
query allDatasetsQuery($filters: DatasetFilter, $order: DatasetOrder) {
@@ -239,16 +240,8 @@ export default function DatasetPage({
239240
return {
240241
title: item.title,
241242
id: item.id,
242-
created: new Date(item.created).toLocaleString('en-GB', {
243-
day: '2-digit',
244-
month: '2-digit',
245-
year: 'numeric',
246-
}),
247-
modified: new Date(item.modified).toLocaleString('en-GB', {
248-
day: '2-digit',
249-
month: '2-digit',
250-
year: 'numeric',
251-
}),
243+
created: formatDate(item.created),
244+
modified: formatDate(item.modified),
252245
};
253246
});
254247
};

app/[locale]/dashboard/[entityType]/[entitySlug]/layout.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,26 @@ export default function OrgDashboardLayout({ children }: DashboardLayoutProps) {
2424
const params = useParams<{ entityType: string; entitySlug: string }>();
2525
const { setEntityDetails, entityDetails, userDetails } = useDashboardStore();
2626

27-
const EntityDetailsQryRes: { data: any; isLoading: boolean; error: any } =
28-
useQuery([`entity_details_${params.entityType}`], () =>
29-
GraphQL(
30-
params.entityType === 'organization' && getOrgDetailsQryDoc,
31-
{
32-
[params.entityType]: params.entitySlug,
33-
},
34-
{ slug: params.entitySlug }
35-
)
36-
);
27+
const EntityDetailsQryRes: {
28+
data: any;
29+
isLoading: boolean;
30+
error: any;
31+
refetch: any;
32+
} = useQuery([`entity_details_${params.entityType}`], () =>
33+
GraphQL(
34+
params.entityType === 'organization' && getOrgDetailsQryDoc,
35+
{
36+
[params.entityType]: params.entitySlug,
37+
},
38+
{ slug: params.entitySlug }
39+
)
40+
);
41+
42+
43+
useEffect(() => {
44+
EntityDetailsQryRes.refetch();
45+
}, []);
46+
3747

3848
useEffect(() => {
3949
if (EntityDetailsQryRes.data) {

app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ const Details = () => {
109109

110110
const runningStatus = [
111111
{
112-
label: 'Intitated',
112+
label: 'Initiated',
113113
value: 'INITIATED',
114114
},
115115
{
@@ -230,7 +230,7 @@ const Details = () => {
230230
name="summary"
231231
value={formData.summary}
232232
multiline={7}
233-
helpText="Character limit: 10000"
233+
helpText={`Character limit: ${formData?.summary?.length}/10000`}
234234
onChange={(e) => handleChange('summary', e)}
235235
onBlur={() => handleSave(formData)}
236236
/>

app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Button, DataTable, Icon, IconButton, Text, toast } from 'opub-ui';
99
import { twMerge } from 'tailwind-merge';
1010

1111
import { GraphQL } from '@/lib/api';
12+
import { formatDate } from '@/lib/utils';
1213
import { Icons } from '@/components/icons';
1314
import { LinkButton } from '@/components/Link';
1415
import { Loading } from '@/components/loading';
@@ -184,14 +185,21 @@ export default function DatasetPage({
184185
header: 'Title',
185186
cell: ({ row }: any) =>
186187
navigationTab === 'published' ? (
187-
<Text className="line-clamp-1 max-w-[280px]" title={row.original.title}>{row.original.title}</Text>
188+
<Text
189+
className="line-clamp-1 max-w-[280px]"
190+
title={row.original.title}
191+
>
192+
{row.original.title}
193+
</Text>
188194
) : (
189195
<LinkButton
190196
kind="tertiary"
191197
size="medium"
192198
href={`/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${row.original.id}/details`}
193199
>
194-
<span className="line-clamp-1 max-w-[280px]">{row.original.title}</span>
200+
<span className="line-clamp-1 max-w-[280px]">
201+
{row.original.title}
202+
</span>
195203
</LinkButton>
196204
),
197205
},
@@ -235,16 +243,8 @@ export default function DatasetPage({
235243
return {
236244
title: item.title,
237245
id: item.id,
238-
created: new Date(item.created).toLocaleString('en-GB', {
239-
day: '2-digit',
240-
month: '2-digit',
241-
year: 'numeric',
242-
}),
243-
modified: new Date(item.modified).toLocaleString('en-GB', {
244-
day: '2-digit',
245-
month: '2-digit',
246-
year: 'numeric',
247-
}),
246+
created: formatDate(item.created),
247+
modified: formatDate(item.modified),
248248
};
249249
});
250250
};

app/[locale]/dashboard/[entityType]/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const Page = () => {
169169
<div>
170170
<TextField
171171
label="Organization Name *"
172+
helpText={`Character limit: ${formData?.name?.length}/200`}
172173
name="name"
173174
value={formData.name}
174175
onChange={(e) =>
@@ -328,7 +329,7 @@ const EntityCard = ({ entityItem, params }: any) => {
328329
</Link>
329330
</div>
330331
<div>
331-
<Text variant="headingMd" className="text-center">
332+
<Text variant="headingMd" className="text-center line-clamp-3" title={entityItem.name}>
332333
{entityItem.name}
333334
</Text>
334335
</div>

0 commit comments

Comments
 (0)