From d871ba926348b655d03e72959941ab47d9ae2e31 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 14:29:45 +0530 Subject: [PATCH 01/58] add overflow properties to Main for better layout control --- app/[locale]/dashboard/components/styles.module.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/[locale]/dashboard/components/styles.module.scss b/app/[locale]/dashboard/components/styles.module.scss index ad660b82..357be593 100644 --- a/app/[locale]/dashboard/components/styles.module.scss +++ b/app/[locale]/dashboard/components/styles.module.scss @@ -58,6 +58,9 @@ padding-top: var(--space-5); flex-grow: 1; transition: transform var(--duration-400) ease 0s; + overflow-x: auto; + overflow-y: hidden; + max-width: 100%; @media screen and (min-width: 768px) { padding-left: 0; From a7ca87eb85886cf3e3088bf5fb9b35f1e7d48549 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 14:30:11 +0530 Subject: [PATCH 02/58] add clear functionality to search input in ResourceListView --- .../dataset/[id]/edit/resources/components/ResourceListView.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx index b79dab3d..7a443f1f 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx @@ -247,6 +247,7 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { label="Search" name="Search" onChange={(e) => handleSearchChange(e)} + onClear={() => handleSearchChange('')} /> From 30a5f22e14770a4539ba6e55fc5ca3836c369e3a Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 14:30:58 +0530 Subject: [PATCH 03/58] add hidefooter in preview table --- .../components/Resources/index.tsx | 93 ++++++++++--------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx index 9657b9f7..1f944c9f 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx @@ -164,7 +164,11 @@ const Resources = () => { {previewData && ( - +
)} @@ -196,7 +200,7 @@ const Resources = () => {
Files in this Dataset - + All files associated with this Dataset which can be downloaded{' '}
@@ -217,48 +221,51 @@ const Resources = () => { {item.name}
- - -
- - - {' '} - View Details - - -
- + +
+ + + {' '} + View Details + + +
+ + + +
+
+ - - -
-
- -
- - - +
+ + + From 4d6c50c19d435155b2adac372140c58885231111 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 14:31:06 +0530 Subject: [PATCH 04/58] refactor: move chart rendering logic to a new position in Details component --- .../components/Details/index.tsx | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Details/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Details/index.tsx index a5c24209..bc15c06b 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Details/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Details/index.tsx @@ -98,21 +98,6 @@ const Details: React.FC = ({ setShowcharts }) => { {data?.getChartData.map((item: any, index: any) => (
-
- {item.__typename === 'TypeResourceChart' && - item?.chart?.options ? ( - renderChart(item) - ) : ( - - )} - {/* Call the renderChart function */} -
{item.name} @@ -133,13 +118,6 @@ const Details: React.FC = ({ setShowcharts }) => {
- = ({ setShowcharts }) => {
+
+ {item.__typename === 'TypeResourceChart' && + item?.chart?.options ? ( + renderChart(item) + ) : ( + + )} + {/* Call the renderChart function */} +
+
))} From 4b220aeea6819f3e462f52acf469917dfa7a319f Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 14:38:21 +0530 Subject: [PATCH 05/58] fix: remove unnecessary semicolon in SimilarDatasets component --- .../[datasetIdentifier]/components/SimilarDatasets/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx index 3093629f..ef6d653e 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx @@ -174,7 +174,6 @@ const SimilarDatasets: React.FC = ({ showCharts }) => { - ; )} From e8d6240e12a541189d231649d38f67fc265b0a1f Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 15:10:21 +0530 Subject: [PATCH 06/58] refactor: remove EditDistribution component and associated logic --- .../[id]/edit/components/EditDistribution.tsx | 263 ------------------ 1 file changed, 263 deletions(-) delete mode 100644 app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditDistribution.tsx diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditDistribution.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditDistribution.tsx deleted file mode 100644 index 58ea0a73..00000000 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditDistribution.tsx +++ /dev/null @@ -1,263 +0,0 @@ -import React from 'react'; -import { graphql } from '@/gql'; -// import { FileInputType, ResourceInput } from '@/gql/generated/graphql'; -import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { - Button, - Divider, - DropZone, - FormLayout, - Icon, - Input, - Select, - Text, -} from 'opub-ui'; - -import { GraphQL } from '@/lib/api'; -import { bytesToSize } from '@/lib/utils'; -import { Icons } from '@/components/icons'; -import { DatasetForm } from '../../../components/dataset-form'; - -// const createResourceMutationDoc: any = graphql(` -// mutation createResourceMutation($resource_data: ResourceInput) { -// create_resource(resource_data: $resource_data) { -// success -// errors -// resource { -// id -// title -// description -// file_details { -// resource { -// id -// title -// description -// } -// format -// file -// remote_url -// source_file_name -// } -// } -// } -// } -// `); - -interface Props { - id: string; - defaultVal: { - id: string; - resources: { - title: string; - description: string; - file_details?: any; - }[]; - }; - submitRef: React.RefObject; - setPage: (page: 'list' | 'create') => void; -} - -export function EditDistribution({ - id, - defaultVal, - submitRef, - setPage, -}: Props) { - // const [val, setVal] = React.useState(defaultVal); - const [fileSelected, setFileSelected] = React.useState(false); - - const queryClient = useQueryClient(); - // const { mutate, isLoading } = useMutation( - // (data: { resource_data: ResourceInput }) => - // GraphQL(createResourceMutationDoc, data), - // { - // onSuccess: () => { - // queryClient.invalidateQueries({ - // queryKey: [`dataset_distribution_${id}`], - // }); - // }, - // } - // ); - - return ( - <> - { - // mutate({ - // resource_data: { - // dataset: defaultVal.id, - // status: 'DRAFT', - // title: data.title, - // description: data.description, - // file_details: { - // file: data.file_details[0], - // }, - // }, - // }); - }} - formOptions={{ defaultValues: defaultVal }} - submitRef={submitRef} - // onChange={setVal} - > - <>Test - {/* <> - Add Distribution -
- -
- -
- - - } - error="This field is required" - readOnly={isLoading} - disabled={fileSelected} - /> - - - - - - -
-
- -
-
- -
- - -
-
- */} -
- - ); -} - -const FileUpload = ({ - required, - error, - disabled, - setFileSelected, -}: { - required?: boolean; - error?: string; - disabled?: boolean; - setFileSelected: (val: boolean) => void; -}) => { - const [file, setFile] = React.useState(); - - const handleDropZoneDrop = React.useCallback( - (_dropFiles: File[], acceptedFiles: File[]) => { - setFile(acceptedFiles[0]); - setFileSelected(true); - }, - [setFileSelected] - ); - - function handleFileDelete(props: React.MouseEvent) { - props.stopPropagation(); - setFileSelected(false); - setFile(undefined); - } - - const hint = ( - - Supported file type: .pdf, .csv, .xls
- The file size should not be more than 5 MB -
- ); - - const fileUpload = !file && ; - const uploadedFile = file && ( -
-
- - -
-
- - {file.name} - -
- - {bytesToSize(file.size)} - -
-
-
- ); - - return ( - - {uploadedFile} - {fileUpload} - - ); -}; From 6a5881546fdf9c8356030d3a263ea88a0a8f9a2d Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 15:10:33 +0530 Subject: [PATCH 07/58] refactor: update file types and increase maximum file size limit in ResourceDropzone component --- .../edit/resources/components/ResourceDropzone.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx index 8cb0bee4..628cb8a6 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx @@ -1,15 +1,15 @@ +import React from 'react'; +import { useParams } from 'next/navigation'; import { CreateFileResourceInput } from '@/gql/generated/graphql'; import { useMutation } from '@tanstack/react-query'; import { parseAsString, useQueryState } from 'next-usequerystate'; -import { useParams } from 'next/navigation'; import { Button, DropZone, Text, toast } from 'opub-ui'; -import React from 'react'; import { GraphQL } from '@/lib/api'; import { createResourceFilesDoc } from './query'; export const ResourceDropzone = ({ reload }: { reload: () => void }) => { - const fileTypes = ['PDF', 'CSV', 'XLS', 'XLSX', 'TXT', 'ZIP']; + const fileTypes = ['CSV', 'JSON', 'PDF', 'XLS', 'XLSX', 'XML', 'ZIP']; const params = useParams<{ entityType: string; entitySlug: string; @@ -58,7 +58,7 @@ export const ResourceDropzone = ({ reload }: { reload: () => void }) => { - Maximum File Size Limit : 5 MB + Maximum File Size Limit : 25 MB Supported File Types :{' '} {fileTypes.map((type, index) => { @@ -79,7 +79,7 @@ export const ResourceDropzone = ({ reload }: { reload: () => void }) => { return ( <> Date: Thu, 12 Jun 2025 15:11:12 +0530 Subject: [PATCH 08/58] feat: add PDF preview functionality and conditionally render resource fields based on file format --- .../resources/components/EditResource.tsx | 172 ++++++++++-------- 1 file changed, 97 insertions(+), 75 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx index 686dcdca..db8837b9 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx @@ -25,6 +25,7 @@ import { Icons } from '@/components/icons'; import { Loading } from '@/components/loading'; import { useDatasetEditStatus } from '../../context'; import { TListItem } from '../page-layout'; +import PdfPreview from './PdfPreview'; import PreviewData from './PreviewData'; import { createResourceFilesDoc, @@ -72,6 +73,7 @@ const resourceDetails: any = graphql(` resource { pk } + format file { name path @@ -377,6 +379,17 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { ); // update based on mutation state }, [updateResourceMutation.isLoading, updateSchemaMutation.isLoading]); + const isPdf = + resourceDetailsQuery.data?.resourceById.fileDetails.format?.toLowerCase() === + 'pdf'; + + const isZIP = + resourceDetailsQuery.data?.resourceById.fileDetails.format?.toLowerCase() === + 'zip'; + + const pdfUrl = `${process.env.NEXT_PUBLIC_BACKEND_URL}/api/download/resource/${resourceId}`; + + return (
{resourceDetailsQuery.data?.resourceById ? ( @@ -446,42 +459,43 @@ export const EditResource = ({ refetch, allResources }: EditProps) => {
-
- { - const newValue = !previewEnable; - setPreviewEnable(newValue); - updateResourceMutation.mutate({ - fileResourceInput: { - id: resourceId, - name: resourceName || '', - previewEnabled: newValue, // use new value here - previewDetails: { - startEntry: 1, - endEntry: 5, - isAllEntries: previewDetails.isAllEntries, + {!isZIP && ( +
+ { + const newValue = !previewEnable; + setPreviewEnable(newValue); + updateResourceMutation.mutate({ + fileResourceInput: { + id: resourceId, + name: resourceName || '', + previewEnabled: newValue, // use new value here + previewDetails: { + startEntry: 1, + endEntry: 5, + isAllEntries: previewDetails.isAllEntries, + }, }, - }, - isResetSchema: false, - }); - }} - > - Preview Enabled - -
- -
- {/* {previewEnable && ( + Preview Enabled + +
+ +
+ {/* {previewEnable && ( <> { )} )} */} -
- {showPreview && previewEnable && previewData && ( - - )} -
-
- Fields in the Resource -
- - The Field settings apply to the Resource on a master level and can - not be changed in Access Models. - - {schemaMutation.isLoading ? ( -
- -
- ) : resourceId && schema?.length > 0 ? ( - + )} + {showPreview && + previewEnable && + (isPdf ? ( + ) : ( -
- {' '} - Click on Reset Format{' '} + previewData && + ))} + + {!isPdf && !isZIP && ( +
+
+ Fields in the Resource +
- )} -
+ + The Field settings apply to the Resource on a master level and + can not be changed in Access Models. + + {schemaMutation.isLoading ? ( +
+ +
+ ) : resourceId && schema?.length > 0 ? ( + + ) : ( +
+ {' '} + Click on Reset Format{' '} +
+ )} +
+ )}
) : ( From 44a4ef38953b908b585d686b0d325e68f65eca4c Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 15:11:17 +0530 Subject: [PATCH 09/58] refactor: remove unused isPreview prop and simplify PreviewData component structure --- .../edit/resources/components/PreviewData.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/PreviewData.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/PreviewData.tsx index ba4c9856..5e0e7ebb 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/PreviewData.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/PreviewData.tsx @@ -1,14 +1,13 @@ import { DataTable } from 'opub-ui'; interface EditProps { - isPreview: boolean; previewData: { columns: string[]; rows: any[]; }; } -const PreviewData = ({ isPreview, previewData }: EditProps) => { +const PreviewData = ({ previewData }: EditProps) => { const previewColumns = previewData?.columns?.map((column: string) => ({ accessorKey: column, @@ -16,6 +15,7 @@ const PreviewData = ({ isPreview, previewData }: EditProps) => { cell: ({ cell }: any) => { const value = cell.getValue(); return {value !== null ? value?.toString() : 'N/A'}; + ``; }, })) || []; @@ -29,14 +29,12 @@ const PreviewData = ({ isPreview, previewData }: EditProps) => { return rowData; }) || []; return ( -
- -
+ ); }; From f81b2b8f9397b5f5216acb136ec7605e1f8eb8bc Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 15:19:31 +0530 Subject: [PATCH 10/58] feat: add PDF preview functionality and conditionally render preview based on file format --- .../components/Resources/index.tsx | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx index 1f944c9f..12d80d3b 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx @@ -2,6 +2,7 @@ import Link from 'next/link'; import { useParams } from 'next/navigation'; +import PdfPreview from '@/app/[locale]/(user)/components/PdfPreview'; import { graphql } from '@/gql'; import { useQuery } from '@tanstack/react-query'; import { @@ -156,19 +157,25 @@ const Resources = () => { - {previewData && ( -
+ ) : ( + previewData && ( +
+ ) )} @@ -186,6 +193,7 @@ const Resources = () => { format: data?.fileDetails?.format || 'Na', size: Math.round(data?.fileDetails?.size / 1024).toFixed(2) + 'KB', preview: data?.previewData, + id: data?.id, }, ]; }; From f842b9bf6e1ad054a629827d034c47ddb08e9728 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 15:19:38 +0530 Subject: [PATCH 11/58] fix: update import path for PdfPreview component to correct location --- .../dataset/[id]/edit/resources/components/EditResource.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx index db8837b9..c347235c 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx @@ -25,7 +25,7 @@ import { Icons } from '@/components/icons'; import { Loading } from '@/components/loading'; import { useDatasetEditStatus } from '../../context'; import { TListItem } from '../page-layout'; -import PdfPreview from './PdfPreview'; +import PdfPreview from '../../../../../../../../(user)/components/PdfPreview'; import PreviewData from './PreviewData'; import { createResourceFilesDoc, From b7b752d7f5407910179bd84d467064f1e36b86bc Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 12 Jun 2025 15:19:59 +0530 Subject: [PATCH 12/58] feat: add PdfPreview component to display PDF previews from a given URL --- app/[locale]/(user)/components/PdfPreview.tsx | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/[locale]/(user)/components/PdfPreview.tsx diff --git a/app/[locale]/(user)/components/PdfPreview.tsx b/app/[locale]/(user)/components/PdfPreview.tsx new file mode 100644 index 00000000..e28ae0c6 --- /dev/null +++ b/app/[locale]/(user)/components/PdfPreview.tsx @@ -0,0 +1,48 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +interface PdfPreviewProps { + url: string; +} + +export default function PdfPreview({ url }: PdfPreviewProps) { + const [previewUrl, setPreviewUrl] = useState(null); + + useEffect(() => { + const fetchPdf = async () => { + try { + const response = await fetch(url); + const blobData = await response.blob(); + + // Manually set MIME type to PDF (in case it's sent as octet-stream) + const pdfBlob = new Blob([blobData], { type: 'application/pdf' }); + const objectUrl = URL.createObjectURL(pdfBlob); + setPreviewUrl(objectUrl); + } catch (error) { + console.error('Failed to load PDF:', error); + } + }; + + fetchPdf(); + + return () => { + if (previewUrl) { + URL.revokeObjectURL(previewUrl); + } + }; + }, [url]); + + if (!previewUrl) return

Loading PDF preview...

; + + return ( + +

PDF preview not available

+
+ ); +} From 6f66a578f5bce57db3531c9abddb06897739daf3 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Fri, 13 Jun 2025 12:01:57 +0530 Subject: [PATCH 13/58] fix preview --- .../resources/components/EditResource.tsx | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx index c347235c..9b4f6115 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx @@ -23,9 +23,9 @@ import { import { GraphQL } from '@/lib/api'; import { Icons } from '@/components/icons'; import { Loading } from '@/components/loading'; +import PdfPreview from '../../../../../../../../(user)/components/PdfPreview'; import { useDatasetEditStatus } from '../../context'; import { TListItem } from '../page-layout'; -import PdfPreview from '../../../../../../../../(user)/components/PdfPreview'; import PreviewData from './PreviewData'; import { createResourceFilesDoc, @@ -379,17 +379,9 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { ); // update based on mutation state }, [updateResourceMutation.isLoading, updateSchemaMutation.isLoading]); - const isPdf = - resourceDetailsQuery.data?.resourceById.fileDetails.format?.toLowerCase() === - 'pdf'; - - const isZIP = - resourceDetailsQuery.data?.resourceById.fileDetails.format?.toLowerCase() === - 'zip'; - + const resourceFormat = + resourceDetailsQuery.data?.resourceById.fileDetails.format?.toLowerCase(); const pdfUrl = `${process.env.NEXT_PUBLIC_BACKEND_URL}/api/download/resource/${resourceId}`; - - return (
{resourceDetailsQuery.data?.resourceById ? ( @@ -459,11 +451,17 @@ export const EditResource = ({ refetch, allResources }: EditProps) => {
- {!isZIP && ( + {resourceFormat !== 'zip' && (
{ const newValue = !previewEnable; setPreviewEnable(newValue); @@ -537,13 +535,13 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { )} {showPreview && previewEnable && - (isPdf ? ( + (resourceFormat === 'pdf' ? ( ) : ( previewData && ))} - {!isPdf && !isZIP && ( + {resourceFormat !== 'pdf' && resourceFormat !== 'zip' && (
Fields in the Resource From 0c1222d0ad59736fb113d0510517354880766aed Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Fri, 13 Jun 2025 14:10:17 +0530 Subject: [PATCH 14/58] fix gap --- app/[locale]/dashboard/[entityType]/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/dashboard/[entityType]/page.tsx b/app/[locale]/dashboard/[entityType]/page.tsx index a099130f..649fc0d2 100644 --- a/app/[locale]/dashboard/[entityType]/page.tsx +++ b/app/[locale]/dashboard/[entityType]/page.tsx @@ -132,7 +132,7 @@ const Page = () => {
-
+
{allEntityDetails?.organizations?.map((entityItem: any) => { return (
From 3439ffa00c133d48e9d8fc2a6ef2f5701e313c84 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 16 Jun 2025 15:00:11 +0530 Subject: [PATCH 15/58] feat: enhance UseCaseDetailPage layout and add Dashboards component --- .../(user)/usecases/[useCaseSlug]/page.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx b/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx index f0fca2b5..98d8aa7d 100644 --- a/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx +++ b/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx @@ -13,6 +13,7 @@ import BreadCrumbs from '@/components/BreadCrumbs'; import { Icons } from '@/components/icons'; import { Loading } from '@/components/loading'; import PrimaryDetails from '../components/Details'; +import Dashboards from './Dashboards'; import Metadata from '../components/Metadata'; const UseCasedetails: any = graphql(` @@ -188,8 +189,8 @@ const UseCaseDetailPage = () => {
- Datasets in this Use Case - + Datasets in this Use Case + All Datasets related to this Use Case
@@ -245,6 +246,7 @@ const UseCaseDetailPage = () => {
+ {(hasSupportingOrganizations || hasPartnerOrganizations || hasContributors) && ( @@ -252,7 +254,7 @@ const UseCaseDetailPage = () => {
{hasSupportingOrganizations && (
- + Supported by
@@ -277,7 +279,7 @@ const UseCaseDetailPage = () => { )} {hasPartnerOrganizations && (
- + Partnered by
@@ -303,11 +305,11 @@ const UseCaseDetailPage = () => {
{hasContributors && (
-
- +
+ Contributors{' '} - + Publisher and Contributors who have added to the Use Case
From 23de1ea440c97c3578cf06ab1bafaa70b41d5362 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 16 Jun 2025 15:00:33 +0530 Subject: [PATCH 16/58] feat: add Dashboards component to display linked dashboards for use cases --- .../usecases/[useCaseSlug]/Dashboards.tsx | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx diff --git a/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx b/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx new file mode 100644 index 00000000..b8525066 --- /dev/null +++ b/app/[locale]/(user)/usecases/[useCaseSlug]/Dashboards.tsx @@ -0,0 +1,67 @@ +import Link from 'next/link'; +import { useParams } from 'next/navigation'; +import { graphql } from '@/gql'; +import { useQuery } from '@tanstack/react-query'; +import { Text } from 'opub-ui'; + +import { GraphQL } from '@/lib/api'; +import { Loading } from '@/components/loading'; + +const DashboardsList: any = graphql(` + query usecaseDashboards($usecaseId: Int!) { + usecaseDashboards(usecaseId: $usecaseId) { + id + name + link + } + } +`); + +const Dashboards = () => { + const params = useParams(); + const { data, isLoading } = useQuery<{ usecaseDashboards: any }>( + ['fetch_dashboardData', params.useCaseSlug], + () => GraphQL(DashboardsList, {}, { usecaseId: +params.useCaseSlug }), + { + refetchOnMount: true, + refetchOnReconnect: true, + } + ); + + return ( +
+ {isLoading ? ( + + ) : ( + data?.usecaseDashboards?.length > 0 && ( +
+
+ + Dashboards Linked to this Use Case + + + Analytical dashboards to explore the data further{' '} + +
+
+ {data?.usecaseDashboards?.map((dashboard: any) => ( + + + {dashboard.name} + + + ))} +
+
+ ) + )} +
+ ); +}; + +export default Dashboards; From fb0ce16cb1ab1026adbc71bba282023f6a161cc6 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 16 Jun 2025 15:00:40 +0530 Subject: [PATCH 17/58] fix: update heading styles for GEOGRAPHIES and Summary sections --- app/[locale]/(user)/usecases/components/Details.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/[locale]/(user)/usecases/components/Details.tsx b/app/[locale]/(user)/usecases/components/Details.tsx index 8ed2b916..33c156d0 100644 --- a/app/[locale]/(user)/usecases/components/Details.tsx +++ b/app/[locale]/(user)/usecases/components/Details.tsx @@ -65,7 +65,7 @@ const PrimaryDetails = ({ data, isLoading }: { data: any; isLoading: any }) => {
- GEOGRAPHIES + GEOGRAPHIES
{ @@ -77,7 +77,7 @@ const PrimaryDetails = ({ data, isLoading }: { data: any; isLoading: any }) => {
- Summary + Summary
{data.useCase.summary} From 988f2ec898e0598232380d74418fd75ce7b4be65 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 16 Jun 2025 15:00:46 +0530 Subject: [PATCH 18/58] feat: add Dashboards tab to Use Case editing layout --- .../[entitySlug]/usecases/edit/layout.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx index f889c0d8..a61be2e9 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx @@ -35,7 +35,13 @@ const TabsAndChildren = ({ children }: { children: React.ReactNode }) => { const pathName = usePathname(); const params = useParams(); - const layoutList = ['details', 'contributors', 'assign', 'publish']; + const layoutList = [ + 'details', + 'contributors', + 'assign', + 'dashboards', + 'publish', + ]; const pathItem = layoutList.find(function (v) { return pathName.indexOf(v) >= 0; @@ -90,6 +96,11 @@ const TabsAndChildren = ({ children }: { children: React.ReactNode }) => { url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/contributors`, selected: pathItem === 'contributors', }, + { + label: 'Dashboards', + url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/dashboards`, + selected: pathItem === 'dashboards', + }, { label: 'Publish', url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/publish`, @@ -140,9 +151,9 @@ const TabsAndChildren = ({ children }: { children: React.ReactNode }) => {
{children}
-
+
From 7abd1b536d8bf696b04c2ee06713a584f2761ff7 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 16 Jun 2025 15:01:04 +0530 Subject: [PATCH 19/58] feat: implement Dashboard management with add, update, and delete functionalities --- .../usecases/edit/[id]/dashboards/page.tsx | 240 ++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx new file mode 100644 index 00000000..07a20865 --- /dev/null +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx @@ -0,0 +1,240 @@ +'use client'; + +import { useCallback, useEffect, useState } from 'react'; +import Link from 'next/link'; +import { graphql } from '@/gql'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { Button, Icon, Text, TextField, toast } from 'opub-ui'; + +import { GraphQL } from '@/lib/api'; +import { Icons } from '@/components/icons'; +import { useEditStatus } from '../../context'; + +const dashboardList: any = graphql(` + query dashboardList($usecaseId: Int!) { + usecaseDashboards(usecaseId: $usecaseId) { + id + name + link + created + } + } +`); + +const AddDashboard: any = graphql(` + mutation addDashboard($usecaseId: Int!, $name: String, $link: String) { + addUsecaseDashboard(usecaseId: $usecaseId, name: $name, link: $link) { + success + errors { + fieldErrors { + field + messages + } + } + data { + id + name + link + } + } + } +`); + +const updateDashboard: any = graphql(` + mutation updateDashboard($id: String!, $name: String, $link: String) { + updateUsecaseDashboard(id: $id, name: $name, link: $link) { + success + errors { + fieldErrors { + field + messages + } + } + data { + id + name + link + } + } + } +`); + +const deleteDashboard: any = graphql(` + mutation deleteUsecaseDashboard($id: Int!) { + deleteUsecaseDashboard(id: $id) { + success + errors { + fieldErrors { + field + messages + } + } + } + } +`); + +const Dashboard = ({ params }: { params: { id: string } }) => { + const usecaseId = parseInt(params.id); + + const [dashboards, setDashboards] = useState< + Array<{ id: string; name: string; link: string }> + >([]); + const [previousState, setPreviousState] = useState({}); + + const { data, isLoading } = useQuery( + ['fetch_dashboardData', usecaseId], + () => GraphQL(dashboardList, {}, { usecaseId }), + { + refetchOnMount: true, + refetchOnReconnect: true, + onSuccess: (res: any) => { + setDashboards(res.usecaseDashboards || []); + setPreviousState( + Object.fromEntries( + res.usecaseDashboards.map((item: any) => [item.id, { ...item }]) + ) + ); + }, + } + ); + + const { mutate: addDashboard, isLoading: addLoading } = useMutation( + ({ usecaseId }: { usecaseId: number }) => + GraphQL(AddDashboard, {}, { usecaseId }), + { + onSuccess: (res: any) => { + const newDashboard = res.addUsecaseDashboard.data; + + setDashboards((prev: any) => [...prev, newDashboard]); + setPreviousState((prev: any) => ({ + ...prev, + [newDashboard.id]: { ...newDashboard }, + })); + toast.success('Dashboard added'); + }, + } + ); + const { mutate: saveDashboard, isLoading: saveLoading } = useMutation( + ({ id, name, link }: { id: string; name: string; link: string }) => + GraphQL(updateDashboard, {}, { id, name, link }), + { + onSuccess: ({ updateUsecaseDashboard }: any) => { + toast.success('Changes saved'); + setPreviousState((prev: any) => ({ + ...prev, + [updateUsecaseDashboard.data.id]: { ...updateUsecaseDashboard.data }, + })); + }, + onError: (error: any) => { + toast(`Error: ${error.message}`); + }, + } + ); + + const { mutate: removeDashboard, isLoading: deleteLoading } = useMutation( + (id: number) => GraphQL(deleteDashboard, {}, { id }), + { + onSuccess: (_, id) => { + setDashboards((prev) => prev.filter((d) => d.id !== id.toString())); + toast.success('Dashboard deleted'); + }, + onError: (error: any) => { + toast(`Error: ${error.message}`); + }, + } + ); + + const handleChange = (id: string, field: 'name' | 'link', value: string) => { + setDashboards((prev) => + prev.map((d) => (d.id === id ? { ...d, [field]: value } : d)) + ); + }; + + const handleSave = (dashboard: { + id: string; + name: string; + link: string; + }) => { + const prev = previousState[dashboard.id]; + if (dashboard.name !== prev?.name || dashboard.link !== prev?.link) { + saveDashboard({ + id: dashboard.id, + name: dashboard.name, + link: dashboard.link, + }); + } + }; + + const handleAdd = () => { + addDashboard({ usecaseId }); + }; + + const handleDelete = (id: string) => { + removeDashboard(Number(id)); + }; + + const { setStatus } = useEditStatus(); + + useEffect(() => { + setStatus( + saveLoading || addLoading || deleteLoading ? 'loading' : 'success' + ); // update based on mutation state + }, [saveLoading, addLoading, deleteLoading]); + + return ( +
+ Dashboard + + Link external analytical dashboards to your use case. To create a new + dashboard, go to{' '} + + CivicDataSpace Analytics + + . + + + {dashboards?.map((item) => ( +
+
+ handleChange(item.id, 'name', e)} + onBlur={() => handleSave(item)} + /> +
+
+ handleChange(item.id, 'link', e)} + onBlur={() => handleSave(item)} + /> +
+ +
+ ))} + +
+ ); +}; + +export default Dashboard; From 28de114bdace196a7c663229d7565144693aed30 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 18 Jun 2025 12:24:45 +0530 Subject: [PATCH 20/58] feat: add refetch capability for tags list on metadata update --- .../[id]/edit/components/EditMetadata.tsx | 56 +++++++++++-------- .../usecases/edit/[id]/metadata/page.tsx | 33 +++++++---- 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditMetadata.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditMetadata.tsx index 10639f6a..ab466482 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditMetadata.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/components/EditMetadata.tsx @@ -172,16 +172,19 @@ export function EditMetadata({ id }: { id: string }) { ) ); - const getTagsList: { data: any; isLoading: boolean; error: any } = useQuery( - [`tags_list_query`], - () => - GraphQL( - tagsListQueryDoc, - { - [params.entityType]: params.entitySlug, - }, - [] - ) + const getTagsList: { + data: any; + isLoading: boolean; + error: any; + refetch: any; + } = useQuery([`tags_list_query`], () => + GraphQL( + tagsListQueryDoc, + { + [params.entityType]: params.entitySlug, + }, + [] + ) ); const getMetaDataListQuery: { @@ -203,6 +206,8 @@ export function EditMetadata({ id }: { id: string }) { ) ); + const [isTagsListUpdated, setIsTagsListUpdated] = useState(false); + const updateMetadataMutation = useMutation( (data: { UpdateMetadataInput: UpdateMetadataInput }) => GraphQL( @@ -225,9 +230,12 @@ export function EditMetadata({ id }: { id: string }) { const updatedData = defaultValuesPrepFn( res.addUpdateDatasetMetadata.data ); + if (isTagsListUpdated) { + getTagsList.refetch(); + setIsTagsListUpdated(false); + } setFormData(updatedData); setPreviousFormData(updatedData); - // getDatasetMetadata.refetch(); } else { toast( 'Error: ' + @@ -316,7 +324,9 @@ export function EditMetadata({ id }: { id: string }) { const transformedValues = Object.keys(updatedData)?.reduce( (acc: any, key) => { acc[key] = Array.isArray(updatedData[key]) - ? updatedData[key].map((item: any) => item.value || item).join(', ') + ? updatedData[key] + .map((item: any) => item?.value || item) + .join(', ') : updatedData[key]; return acc; }, @@ -531,17 +541,17 @@ export function EditMetadata({ id }: { id: string }) { { - return { - label: item.value, - value: item.id, - }; - })} + list={getTagsList.data?.tags?.map((item: TypeTag) => ({ + label: item.value, + value: item.id, + }))} + key={`tags-${getTagsList.data?.tags?.length}`} // forces remount on change label="Tags *" creatable onChange={(value) => { + setIsTagsListUpdated(true); handleChange('tags', value); - handleSave({ ...formData, tags: value }); // Save on change + handleSave({ ...formData, tags: value }); }} />
@@ -582,9 +592,11 @@ export function EditMetadata({ id }: { id: string }) { defaultChecked={false} disabled > -
- Restricted Access - +
+ + Restricted Access + + Users would require to request access to the dataset to view and download it. Recommended for sensitive data. diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx index c559de5b..3c2d72dc 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx @@ -201,17 +201,22 @@ const Metadata = () => { ) ); - const getTagsList: { data: any; isLoading: boolean; error: any } = useQuery( - [`tags_list_query`], - () => - GraphQL( - tagsListQueryDoc, - { - [params.entityType]: params.entitySlug, - }, - [] - ) + const getTagsList: { + data: any; + isLoading: boolean; + error: any; + refetch: any; + } = useQuery([`tags_list_query`], () => + GraphQL( + tagsListQueryDoc, + { + [params.entityType]: params.entitySlug, + }, + [] + ) ); + const [isTagsListUpdated, setIsTagsListUpdated] = useState(false); + // Update mutation const updateUseCase = useMutation( (data: { updateMetadataInput: UpdateUseCaseMetadataInput }) => @@ -220,6 +225,10 @@ const Metadata = () => { onSuccess: (res: any) => { toast('Use case updated successfully'); const updatedData = defaultValuesPrepFn(res.addUpdateUsecaseMetadata); + if (isTagsListUpdated) { + getTagsList.refetch(); + setIsTagsListUpdated(false); + } setFormData(updatedData); setPreviousFormData(updatedData); }, @@ -319,7 +328,7 @@ const Metadata = () => { value: option, })) || []), ]} - label={metadataFormItem.label+ ' *'} + label={metadataFormItem.label + ' *'} selectedValue={formData[metadataFormItem.id]} displaySelected onChange={(value) => { @@ -348,8 +357,10 @@ const Metadata = () => { value: item.id, })) || [] } + key={`tags-${getTagsList.data?.tags?.length}`} // forces remount on change selectedValue={formData.tags} onChange={(value) => { + setIsTagsListUpdated(true); handleChange('tags', value); handleSave({ ...formData, tags: value }); }} From d893fdb93fb0cbc709fe06a68ad94a50f1e06e84 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 18 Jun 2025 16:23:40 +0530 Subject: [PATCH 21/58] feat: disable email field in organization and user profile forms --- .../dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx | 1 + .../dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx index a73343d0..0f015abe 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx @@ -168,6 +168,7 @@ const OrgProfile = () => { setFormData({ ...formData, contactEmail: e })} /> diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx index 8ca80e9a..1761e7b5 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx @@ -107,7 +107,6 @@ const UserProfile = () => { formData.bio && formData.profilePicture; - if (!formValidation) { toast('Please fill all the required fields'); return; @@ -161,6 +160,7 @@ const UserProfile = () => {
setFormData({ ...formData, email: e })} From 2d1af3c061a607760c4c37beb369f1fa04c93e1a Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 18 Jun 2025 16:36:07 +0530 Subject: [PATCH 22/58] feat: reorder Contributors tab in Use Case editing layout --- .../[entitySlug]/usecases/edit/layout.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx index a61be2e9..cf250e0d 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx @@ -91,16 +91,16 @@ const TabsAndChildren = ({ children }: { children: React.ReactNode }) => { url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/assign`, selected: pathItem === 'assign', }, - { - label: 'Contributors', - url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/contributors`, - selected: pathItem === 'contributors', - }, { label: 'Dashboards', url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/dashboards`, selected: pathItem === 'dashboards', }, + { + label: 'Contributors', + url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/contributors`, + selected: pathItem === 'contributors', + }, { label: 'Publish', url: `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/publish`, @@ -153,7 +153,7 @@ const TabsAndChildren = ({ children }: { children: React.ReactNode }) => {
{children}
From aa2a5e0c975cf5463b44056b29a74a5997091bef Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 18 Jun 2025 17:03:59 +0530 Subject: [PATCH 23/58] feat: refactor Publish component to integrate new Assign, Contributors, Dashboards, and Details components --- .../usecases/edit/[id]/publish/page.tsx | 217 ++---------------- 1 file changed, 18 insertions(+), 199 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx index 456f7de5..bda766ee 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx @@ -1,6 +1,5 @@ 'use client'; -import Image from 'next/image'; import { useParams, useRouter } from 'next/navigation'; import { graphql } from '@/gql'; import { useMutation, useQuery } from '@tanstack/react-query'; @@ -12,14 +11,16 @@ import { Button, Icon, Spinner, - Table, Text, toast, } from 'opub-ui'; import { GraphQL } from '@/lib/api'; -import { formatDate } from '@/lib/utils'; import { Icons } from '@/components/icons'; +import Assign from './Assign'; +import Contributors from './Contributors'; +import Dashboards from './Dashboards'; +import Details from './Details'; const UseCaseDetails: any = graphql(` query UseCasedata($filters: UseCaseFilter) { @@ -88,6 +89,11 @@ const UseCaseDetails: any = graphql(` name } } + usecaseDashboard { + id + name + link + } } } `); @@ -162,85 +168,17 @@ const Publish = () => { : '', }, { - name: 'Contributors', + name: 'Dashboards', data: UseCaseData?.data?.useCases[0]?.length > 0, error: '', }, - ]; - - const columns = [ - { accessorKey: 'title', header: 'Title' }, - { accessorKey: 'sector', header: 'Sector' }, - { accessorKey: 'modified', header: 'Last Modified' }, - ]; - - const PrimaryDetails = [ - { label: 'Use Case Name', value: UseCaseData.data?.useCases[0]?.title }, - { label: 'Summary', value: UseCaseData.data?.useCases[0]?.summary }, - { - label: 'Running Status', - value: UseCaseData.data?.useCases[0]?.runningStatus, - }, - { label: 'Started On', value: UseCaseData.data?.useCases[0]?.startedOn }, - { - label: 'Completed On', - value: UseCaseData.data?.useCases[0]?.completedOn, - }, - { label: 'Sector', value: UseCaseData.data?.useCases[0]?.sectors[0]?.name }, - { label: 'Tags', value: UseCaseData.data?.useCases[0]?.tags[0]?.value }, - ...(UseCaseData.data?.useCases[0]?.metadata?.map((meta: any) => ({ - label: meta.metadataItem?.label, - value: meta.value, - })) || []), - ]; - - const ContributorDetails = [ - { - label: 'Contributors', - value: - UseCaseData.data?.useCases[0]?.contributors.length > 0 - ? UseCaseData.data?.useCases[0]?.contributors - .map((item: any) => item.fullName) - .join(', ') - : 'No Contributors', - image: UseCaseData.data?.useCases[0]?.contributors, - }, - ]; - - const OrgDetails = [ { - label: 'Supporters', - value: - UseCaseData.data?.useCases[0]?.supportingOrganizations.length > 0 - ? UseCaseData.data?.useCases[0]?.supportingOrganizations - .map((item: any) => item.name) - .join(', ') - : 'No Supporting Organizations', - image: UseCaseData.data?.useCases[0]?.supportingOrganizations, - }, - { - label: 'Partners', - value: - UseCaseData.data?.useCases[0]?.partnerOrganizations.length > 0 - ? UseCaseData.data?.useCases[0]?.partnerOrganizations - .map((item: any) => item.name) - .join(', ') - : 'No Partner Organizations', - image: UseCaseData.data?.useCases[0]?.partnerOrganizations, + name: 'Contributors', + data: UseCaseData?.data?.useCases[0]?.length > 0, + error: '', }, ]; - const generateTableData = (list: Array) => { - return list?.map((item) => { - return { - title: item.title, - id: item.id, - sector: item.sectors[0]?.name, - modified: formatDate(item.modified), - }; - }); - }; - const isPublishDisabled = (useCase: any) => { if (!useCase) return true; @@ -309,132 +247,13 @@ const Publish = () => { >
{item.name === 'Assign' ? ( -
+ ) : item.name === 'Details' ? ( -
- <> - {PrimaryDetails.map( - (item, index) => - item.value && ( -
-
- - {item.label}: - -
-
- - {item.value} - -
-
- ) - )} - {UseCaseData.data?.useCases[0]?.logo && ( -
-
- - Image: - -
- -
- )} - -
+
+ ) : item.name === 'Dashboards' ? ( + ) : ( -
- {ContributorDetails.map( - (item: any, index: number) => ( -
-
- {item.label}: -
-
- {item.image.map( - (data: any, index: number) => ( -
- - - - {data.fullName} - -
- ) - )} -
-
- ) - )} - {OrgDetails.map((item: any, index: number) => ( -
-
- {item.label}: -
-
- {item.image.map( - (data: any, index: number) => ( -
-
- -
- - {data.name} - -
- ) - )} -
-
- ))} -
+ )} From 7df41368f51121aa927d5471755179e57c23134d Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 18 Jun 2025 17:04:11 +0530 Subject: [PATCH 24/58] feat: add Assign, Contributors, Dashboards, and Details components for enhanced use case management --- .../usecases/edit/[id]/publish/Assign.tsx | 28 +++++ .../edit/[id]/publish/Contributors.tsx | 109 ++++++++++++++++++ .../usecases/edit/[id]/publish/Dashboards.tsx | 28 +++++ .../usecases/edit/[id]/publish/Details.tsx | 62 ++++++++++ 4 files changed, 227 insertions(+) create mode 100644 app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx create mode 100644 app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Contributors.tsx create mode 100644 app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Dashboards.tsx create mode 100644 app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Details.tsx diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx new file mode 100644 index 00000000..fd66a8c9 --- /dev/null +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx @@ -0,0 +1,28 @@ +import { Table } from 'opub-ui'; + +import { formatDate } from '@/lib/utils'; + +const Assign = ({ data }: { data: any }) => { + const columns = [ + { accessorKey: 'title', header: 'Title' }, + { accessorKey: 'sector', header: 'Sector' }, + { accessorKey: 'modified', header: 'Last Modified' }, + ]; + + const generateTableData = (list: Array) => { + return list?.map((item) => { + return { + title: item.title, + id: item.id, + sector: item.sectors[0]?.name, + modified: formatDate(item.modified), + }; + }); + }; + return ( +
+
+ + ); +}; +export default Assign; diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Contributors.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Contributors.tsx new file mode 100644 index 00000000..8fced4f5 --- /dev/null +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Contributors.tsx @@ -0,0 +1,109 @@ +import Image from 'next/image'; +import { Text } from 'opub-ui'; + +const Contributors = ({ data }: { data: any }) => { + const ContributorDetails = [ + { + label: 'Contributors', + value: + data?.useCases[0]?.contributors.length > 0 + ? data?.useCases[0]?.contributors + .map((item: any) => item.fullName) + .join(', ') + : 'No Contributors', + image: data?.useCases[0]?.contributors, + }, + ]; + + const OrgDetails = [ + { + label: 'Supporters', + value: + data?.useCases[0]?.supportingOrganizations.length > 0 + ? data?.useCases[0]?.supportingOrganizations + .map((item: any) => item.name) + .join(', ') + : 'No Supporting Organizations', + image: data?.useCases[0]?.supportingOrganizations, + }, + { + label: 'Partners', + value: + data?.useCases[0]?.partnerOrganizations.length > 0 + ? data?.useCases[0]?.partnerOrganizations + .map((item: any) => item.name) + .join(', ') + : 'No Partner Organizations', + image: data?.useCases[0]?.partnerOrganizations, + }, + ]; + return ( +
+ {ContributorDetails.map((item: any, index: number) => ( +
+
+ {item.label}: +
+
+ {item?.image.map((data: any, index: number) => ( +
+ + + + {data.fullName} + +
+ ))} +
+
+ ))} + {OrgDetails.map((item: any, index: number) => ( +
+
+ {item.label}: +
+
+ {item.image.map((data: any, index: number) => ( +
+
+ +
+ + {data.name} + +
+ ))} +
+
+ ))} +
+ ); +}; + +export default Contributors; \ No newline at end of file diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Dashboards.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Dashboards.tsx new file mode 100644 index 00000000..5f2e167e --- /dev/null +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Dashboards.tsx @@ -0,0 +1,28 @@ +import { Table } from 'opub-ui'; + + +const Dashboards = ({ data }: { data: any }) => { + const dashboardColumns = [ + { accessorKey: 'name', header: 'Name' }, + { accessorKey: 'link', header: 'Link' }, + ]; + + const generatePublisherData = (list: Array) => { + return list?.map((item) => { + return { + name: item.name, + link: item.link, + }; + }); + }; + return ( +
+
+ + ); +}; +export default Dashboards; diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Details.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Details.tsx new file mode 100644 index 00000000..b847c1e4 --- /dev/null +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Details.tsx @@ -0,0 +1,62 @@ +import Image from 'next/image'; +import { Text } from 'opub-ui'; + +const Details = ({ data }: { data: any }) => { + const PrimaryDetails = [ + { label: 'Use Case Name', value: data?.useCases[0]?.title }, + { label: 'Summary', value: data?.useCases[0]?.summary }, + { + label: 'Running Status', + value: data?.useCases[0]?.runningStatus, + }, + { label: 'Started On', value: data?.useCases[0]?.startedOn }, + { + label: 'Completed On', + value: data?.useCases[0]?.completedOn, + }, + { label: 'Sector', value: data?.useCases[0]?.sectors[0]?.name }, + { label: 'Tags', value: data?.useCases[0]?.tags[0]?.value }, + ...(data?.useCases[0]?.metadata?.map((meta: any) => ({ + label: meta.metadataItem?.label, + value: meta.value, + })) || []), + ]; + return ( +
+
+ <> + {PrimaryDetails.map( + (item, index) => + item.value && ( +
+
+ {item.label}: +
+
+ {item.value} +
+
+ ) + )} + {data?.useCases[0]?.logo && ( +
+
+ + Image: + +
+ +
+ )} + +
+
+ ); +}; + +export default Details; From 48ee9bc1e61856c4a23b5e0bbee761b8e4d10528 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 12:36:29 +0530 Subject: [PATCH 25/58] fix tooltip and truncation --- app/[locale]/(user)/publishers/PublisherCard.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/[locale]/(user)/publishers/PublisherCard.tsx b/app/[locale]/(user)/publishers/PublisherCard.tsx index 675231d1..5a9124d0 100644 --- a/app/[locale]/(user)/publishers/PublisherCard.tsx +++ b/app/[locale]/(user)/publishers/PublisherCard.tsx @@ -76,10 +76,14 @@ const PublisherCard: React.FC = ({ data }) => { : item?.description } > - + {item.__typename === 'TypeUser' - ? item.bio.slice(0, 100) + '...' - : item.description.slice(0, 100) + '...'} + ? item?.bio?.length > 220 + ? item.bio.slice(0, 220) + '...' + : item.bio + : item?.description?.length > 220 + ? item.description.slice(0, 220) + '...' + : item.description} From 0b257ffa7ed639a228b504581a6db82d993aeacd Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 12:45:04 +0530 Subject: [PATCH 26/58] add tooltips for sectors and sdgs --- .../components/Metadata/index.tsx | 32 +++++++++-------- .../(user)/usecases/components/Metadata.tsx | 36 ++++++++++--------- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx index 0a08167a..df6e1794 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import Image from 'next/image'; import Link from 'next/link'; -import { Button, Divider, Icon, Text } from 'opub-ui'; +import { Button, Divider, Icon, Text, Tooltip } from 'opub-ui'; import { getWebsiteTitle } from '@/lib/utils'; import { Icons } from '@/components/icons'; @@ -130,20 +130,22 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { Sector
- {data.sectors.length > 0 ? ( - data.sectors.map((sector: any, index: number) => ( - - )) - ) : ( - N/A - )} + {data.sectors.length > 0 ? ( + data.sectors.map((sector: any, index: number) => ( + + + + )) + ) : ( + N/A + )}
{Metadata.map((item: any, index: any) => ( diff --git a/app/[locale]/(user)/usecases/components/Metadata.tsx b/app/[locale]/(user)/usecases/components/Metadata.tsx index 502ab8de..63099b46 100644 --- a/app/[locale]/(user)/usecases/components/Metadata.tsx +++ b/app/[locale]/(user)/usecases/components/Metadata.tsx @@ -1,6 +1,6 @@ import Image from 'next/image'; import Link from 'next/link'; -import { Button, Divider, Icon, Text } from 'opub-ui'; +import { Button, Divider, Icon, Text, Tooltip } from 'opub-ui'; import { formatDate } from '@/lib/utils'; import { Icons } from '@/components/icons'; @@ -43,14 +43,15 @@ const Metadata = ({ data, setOpen }: { data: any; setOpen?: any }) => {
{data.useCase.sectors.length > 0 ? ( data.useCase.sectors.map((sector: any, index: number) => ( - + + + )) ) : ( N/A // Fallback if no sectors are available @@ -67,14 +68,15 @@ const Metadata = ({ data, setOpen }: { data: any; setOpen?: any }) => { ?.find((meta: any) => meta.metadataItem?.label === 'SDG Goal') ?.value.split(', ') .map((item: any, index: number) => ( - + + + )) ) : ( N/A From ff4dceb20ea3534c9db7299f5e5354ef28237888 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 14:13:08 +0530 Subject: [PATCH 27/58] add tooltip and update date format --- .../components/Metadata/index.tsx | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx index df6e1794..4f6bbbef 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx @@ -3,7 +3,7 @@ import Image from 'next/image'; import Link from 'next/link'; import { Button, Divider, Icon, Text, Tooltip } from 'opub-ui'; -import { getWebsiteTitle } from '@/lib/utils'; +import { formatDate, getWebsiteTitle } from '@/lib/utils'; import { Icons } from '@/components/icons'; interface MetadataProps { @@ -17,6 +17,7 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { value: item.value, type: item.metadataItem.dataType, })); + const [isexpanded, setIsexpanded] = useState(false); const toggleDescription = () => setIsexpanded(!isexpanded); @@ -115,15 +116,23 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { {data.isIndividualDataset ? 'Publisher' : 'Organization'} - - {data.isIndividualDataset - ? data.user.fullName - : data.organization.name} - + + {data.isIndividualDataset + ? data.user.fullName + : data.organization.name} + +
@@ -156,16 +165,20 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { > {item.label} - {item.type !== 'URL' ? ( - - {item.value} - - ) : ( + {item.type === 'URL' ? ( - + {sourceTitle?.trim() ? sourceTitle : 'Visit Website'} + ) : item.type === 'DATE' ? ( + + {formatDate(item.value)} + + ) : ( + + {item.value} + )}
))} @@ -191,8 +204,10 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { )}
- Description - + + Description + + {data.description?.length > 260 && !isexpanded ? `${data.description.slice(0, 260)}...` : data.description} From 6114dd9ac92583935fc53f89a6341443c1a86eab Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 14:13:20 +0530 Subject: [PATCH 28/58] add tooltip --- app/[locale]/(user)/usecases/components/Metadata.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/[locale]/(user)/usecases/components/Metadata.tsx b/app/[locale]/(user)/usecases/components/Metadata.tsx index 63099b46..9004541f 100644 --- a/app/[locale]/(user)/usecases/components/Metadata.tsx +++ b/app/[locale]/(user)/usecases/components/Metadata.tsx @@ -12,6 +12,9 @@ const Metadata = ({ data, setOpen }: { data: any; setOpen?: any }) => { value: data.useCase.isIndividualUsecase ? data.useCase.user.fullName : data?.useCase.organization?.name, + tooltipContent: data.useCase.isIndividualUsecase + ? data.useCase.user.fullName + : data?.useCase.organization?.name, }, { label: 'Contact', @@ -138,13 +141,16 @@ const Metadata = ({ data, setOpen }: { data: any; setOpen?: any }) => { > {item.label} + {typeof item.value === 'string' ? item.value : item.value} +
))} From 7cda1100bbbc8644e201fb0f2974a7cf1a0946f8 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 14:20:45 +0530 Subject: [PATCH 29/58] Add accepted file types --- .../[id]/edit/resources/components/ResourceHeader.tsx | 11 ++++++++--- .../edit/resources/components/ResourceListView.tsx | 7 ++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceHeader.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceHeader.tsx index df1c371d..98ca9216 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceHeader.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceHeader.tsx @@ -7,7 +7,7 @@ interface ResourceHeaderProps { listViewFunction: () => void; isSheetOpen: boolean; setIsSheetOpen: (open: boolean) => void; - dropZone:any; + dropZone: any; uploadedFile: React.ReactNode; file: File[]; list: { value: string; label: string }[]; @@ -25,7 +25,7 @@ const ResourceHeader = ({ list, resourceId, handleResourceChange, -}:ResourceHeaderProps) => { +}: ResourceHeaderProps) => { return (
@@ -59,11 +59,16 @@ const ResourceHeader = ({ {uploadedFile} - {file.length === 0 && } + {file.length === 0 && ( + + )} diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx index 7a443f1f..c9d1f1dd 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceListView.tsx @@ -259,12 +259,17 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { ) : ( {uploadedFile} - {file.length === 0 && } + {file.length === 0 && ( + + )} )} From 28d2f74daf8cd94b1032dc9e77b0ff24a5af2740 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 15:02:32 +0530 Subject: [PATCH 30/58] add search feature --- .../[entityType]/[entitySlug]/admin/page.tsx | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/page.tsx index afe31bb0..1bb5e3ee 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/page.tsx @@ -45,14 +45,19 @@ const Admin = () => { const params = useParams<{ entityType: string; entitySlug: string }>(); const usersList: { data: any; isLoading: boolean; refetch: any } = useQuery( [`fetch_users_list_admin_members`], - () => GraphQL(usersListDoc, { - [params.entityType]: params.entitySlug, - }, []) + () => + GraphQL( + usersListDoc, + { + [params.entityType]: params.entitySlug, + }, + [] + ) ); const [isOpen, setIsOpen] = useState(false); const [isEdit, setIsEdit] = useState(false); const [selectedUser, setSelectedUser] = useState({}); - const [refetch,setRefetch]=useState(false) + const [refetch, setRefetch] = useState(false); const { mutate, isLoading: removeUserLoading } = useMutation( (input: { input: AddRemoveUserToOrganizationInput }) => @@ -140,7 +145,20 @@ const Admin = () => { id: item.id, })) || [], }; - + + useEffect(() => { + const updatedRows = + usersList.data?.userByOrganization.map((item: any) => ({ + name: item.fullName, + role: item.organizationMemberships[0]?.role?.name || 'N/A', + roleId: item.organizationMemberships[0]?.role?.id || '', + modified: + formatDate(item.organizationMemberships[0]?.updatedAt) || 'N/A', + id: item.id, + })) || []; + + setFilteredRows(updatedRows); + }, [usersList.data]); const [filteredRows, setFilteredRows] = React.useState(table.rows); const handleSearchChange = (e: string) => { @@ -151,6 +169,10 @@ const Admin = () => { setFilteredRows(filtered); }; + const filteredColumns = table.columns.filter( + (column) => column.accessorKey !== 'id' + ); + useEffect(() => { usersList.refetch(); setRefetch(false); @@ -201,13 +223,13 @@ const Admin = () => {
{usersList.data?.userByOrganization?.length > 0 ? ( ) : ( - + )}
From 09e758d8666f8765b34f2b3dfd80a6f15464bc9c Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 15:21:09 +0530 Subject: [PATCH 31/58] add pagination --- .../[entitySlug]/usecases/edit/[id]/publish/Assign.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx index fd66a8c9..2866668f 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/Assign.tsx @@ -21,7 +21,11 @@ const Assign = ({ data }: { data: any }) => { }; return (
-
+
); }; From a4d04450c5cc6a6cd225bc1b34cf8e067e4276a2 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 15:21:20 +0530 Subject: [PATCH 32/58] update completedOn field logic based on runningStatus values --- .../[entitySlug]/usecases/edit/[id]/details/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx index 3253c56e..c2746db2 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx @@ -262,8 +262,8 @@ const Details = () => { max={new Date().toISOString().split('T')[0]} min={formData.startedOn || ''} disabled={ - formData.runningStatus === 'COMPLETED' || - formData.runningStatus === 'CANCELLED' + formData.runningStatus === 'ON_GOING' || + formData.runningStatus === 'INITIATED' } value={formData.completedOn || ''} onChange={(e) => { From ed572756d95077e26a9b532141248a90dbaf7192 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 15:58:59 +0530 Subject: [PATCH 33/58] add organization details to orgPublishedUseCases query --- app/[locale]/(user)/publishers/components/UseCases.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/[locale]/(user)/publishers/components/UseCases.tsx b/app/[locale]/(user)/publishers/components/UseCases.tsx index 2f5f33a1..4329b07e 100644 --- a/app/[locale]/(user)/publishers/components/UseCases.tsx +++ b/app/[locale]/(user)/publishers/components/UseCases.tsx @@ -60,6 +60,13 @@ const orgPublishedUseCasesDoc: any = graphql(` title summary slug + isIndividualUsecase + organization { + name + logo { + url + } + } metadata { metadataItem { id From 93cd5440a84cc22ad99141e74d7fa3fcc4823f33 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 16:35:16 +0530 Subject: [PATCH 34/58] fix: update layout for tags display in PrimaryData component --- .../[datasetIdentifier]/components/PrimaryData/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/PrimaryData/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/PrimaryData/index.tsx index 7b332576..67207df5 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/PrimaryData/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/PrimaryData/index.tsx @@ -18,7 +18,7 @@ const PrimaryData: React.FC = ({ data, isLoading }) => {
{data?.title} -
+
{data?.tags.map((item: any, index: any) => ( Date: Mon, 23 Jun 2025 16:35:24 +0530 Subject: [PATCH 35/58] add user details to orgPublishedUseCases query --- app/[locale]/(user)/publishers/components/UseCases.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/[locale]/(user)/publishers/components/UseCases.tsx b/app/[locale]/(user)/publishers/components/UseCases.tsx index 4329b07e..be612051 100644 --- a/app/[locale]/(user)/publishers/components/UseCases.tsx +++ b/app/[locale]/(user)/publishers/components/UseCases.tsx @@ -60,6 +60,12 @@ const orgPublishedUseCasesDoc: any = graphql(` title summary slug + user { + fullName + profilePicture { + url + } + } isIndividualUsecase organization { name From 82d29f3fb247f9bf89334361543cdc2c121c8da4 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 17:05:17 +0530 Subject: [PATCH 36/58] add a conditional link in drafts --- .../[entitySlug]/dataset/page.tsx | 23 ++++++++++-------- .../[entitySlug]/usecases/page.tsx | 24 ++++++++++--------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx index 51f99900..34b36484 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/navigation'; import { graphql } from '@/gql'; import { useMutation, useQuery } from '@tanstack/react-query'; import { parseAsString, useQueryState } from 'next-usequerystate'; -import { Button, DataTable, IconButton, toast } from 'opub-ui'; +import { Button, DataTable, IconButton, Text, toast } from 'opub-ui'; import { GraphQL } from '@/lib/api'; import { Icons } from '@/components/icons'; @@ -186,15 +186,18 @@ export default function DatasetPage({ { accessorKey: 'title', header: 'Title', - cell: ({ row }: any) => ( - - {row.original.title} - - ), + cell: ({ row }: any) => + navigationTab === 'published' ? ( + {row.original.title} + ) : ( + + {row.original.title} + + ), }, { accessorKey: 'created', header: 'Date Created' }, { accessorKey: 'modified', header: 'Date Modified' }, diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx index 72a9b0a1..c390c926 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx @@ -93,8 +93,7 @@ export default function DatasetPage({ }, order: { modified: 'DESC' }, } - ), - + ) ); useEffect(() => { @@ -183,15 +182,18 @@ export default function DatasetPage({ { accessorKey: 'title', header: 'Title', - cell: ({ row }: any) => ( - - {row.original.title} - - ), + cell: ({ row }: any) => + navigationTab === 'published' ? ( + {row.original.title} + ) : ( + + {row.original.title} + + ), }, { accessorKey: 'created', header: 'Date Created' }, { accessorKey: 'modified', header: 'Date Modified' }, From 205c46c3779cf4a250ddaa5a530064fb0fbfac79 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 17:09:15 +0530 Subject: [PATCH 37/58] add allorg query --- .../usecases/edit/[id]/contributors/query.ts | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/query.ts b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/query.ts index f9ba6794..4d613d73 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/query.ts +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/query.ts @@ -10,8 +10,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const FetchUsecaseInfo: any = graphql(` + +export const FetchUsecaseInfo: any = graphql(` query useCaseinfo($filters: UseCaseFilter) { useCases(filters: $filters) { id @@ -43,8 +43,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const AddContributors: any = graphql(` + +export const AddContributors: any = graphql(` mutation addContributorToUseCase($useCaseId: String!, $userId: ID!) { addContributorToUseCase(useCaseId: $useCaseId, userId: $userId) { __typename @@ -60,8 +60,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const RemoveContributor: any = graphql(` + +export const RemoveContributor: any = graphql(` mutation removeContributorFromUseCase($useCaseId: String!, $userId: ID!) { removeContributorFromUseCase(useCaseId: $useCaseId, userId: $userId) { __typename @@ -77,8 +77,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const AddSupporters: any = graphql(` + +export const AddSupporters: any = graphql(` mutation addSupportingOrganizationToUseCase( $useCaseId: String! $organizationId: ID! @@ -101,8 +101,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const RemoveSupporters: any = graphql(` + +export const RemoveSupporters: any = graphql(` mutation removeSupportingOrganizationFromUseCase( $useCaseId: String! $organizationId: ID! @@ -125,8 +125,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const AddPartners: any = graphql(` + +export const AddPartners: any = graphql(` mutation addPartnerOrganizationToUseCase( $useCaseId: String! $organizationId: ID! @@ -149,8 +149,8 @@ export const FetchUsers: any = graphql(` } } `); - - export const RemovePartners: any = graphql(` + +export const RemovePartners: any = graphql(` mutation removePartnerOrganizationFromUseCase( $useCaseId: String! $organizationId: ID! @@ -172,4 +172,18 @@ export const FetchUsers: any = graphql(` } } } - `); \ No newline at end of file + `); + + +export const OrgList: any = graphql(` + query allOrgs { + allOrganizations { + id + name + logo { + path + url + } + } + } +`); \ No newline at end of file From e7d081d962343c9bc464232eb0ba537917df2740 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 17:10:11 +0530 Subject: [PATCH 38/58] update org query --- .../usecases/edit/[id]/contributors/page.tsx | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx index f668168e..f2a3d9c0 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx @@ -1,16 +1,14 @@ 'use client'; -import { useEffect, useState } from 'react'; +import { useMutation, useQuery } from '@tanstack/react-query'; import Image from 'next/image'; import { useParams } from 'next/navigation'; -import { graphql } from '@/gql'; -import { useMutation, useQuery } from '@tanstack/react-query'; import { Button, Icon, Text, toast } from 'opub-ui'; +import { useEffect, useState } from 'react'; -import { useDashboardStore } from '@/config/store'; -import { GraphQL } from '@/lib/api'; import { Icons } from '@/components/icons'; import { Loading } from '@/components/loading'; +import { GraphQL } from '@/lib/api'; import { useEditStatus } from '../../context'; import CustomCombobox from './CustomCombobox'; import EntitySection from './EntitySelection'; @@ -20,6 +18,7 @@ import { AddSupporters, FetchUsecaseInfo, FetchUsers, + OrgList, RemoveContributor, RemovePartners, RemoveSupporters, @@ -27,7 +26,6 @@ import { const Details = () => { const params = useParams<{ id: string }>(); - const { allEntityDetails } = useDashboardStore(); const [searchValue, setSearchValue] = useState(''); const [formData, setFormData] = useState({ contributors: [] as { label: string; value: string }[], @@ -52,6 +50,10 @@ const Details = () => { } ); + const Organizations: { data: any; isLoading: boolean; refetch: any } = + useQuery([`fetch_orgs`], () => GraphQL(OrgList, {}, [])); + + const UseCaseData: { data: any; isLoading: boolean; refetch: any } = useQuery( [`fetch_usecase_${params.id}`], () => @@ -209,7 +211,8 @@ const Details = () => { return (
- {Users?.isLoading || allEntityDetails?.organizations?.length === 0 ? ( + {Users?.isLoading || + Organizations?.data?.allOrganizations?.length === 0 ? ( ) : (
@@ -305,7 +308,7 @@ const Details = () => { label="Add Supporters" placeholder="Add Supporters" data={UseCaseData?.data?.useCases[0]?.supportingOrganizations} - options={(allEntityDetails?.organizations || [])?.map( + options={(Organizations?.data?.allOrganizations || [])?.map( (org: any) => ({ label: org.name, value: org.id, @@ -346,7 +349,7 @@ const Details = () => { label="Add Partners" placeholder="Add Partners" data={UseCaseData?.data?.useCases[0]?.partnerOrganizations} - options={(allEntityDetails?.organizations || [])?.map( + options={(Organizations?.data?.allOrganizations || [])?.map( (org: any) => ({ label: org.name, value: org.id, From 5e0a6cd511ced37bd785ea11409e47f94089dbb8 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Mon, 23 Jun 2025 18:28:37 +0530 Subject: [PATCH 39/58] fix ui --- .../resources/components/ResourceDropzone.tsx | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx index 628cb8a6..84af7726 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceDropzone.tsx @@ -3,7 +3,7 @@ import { useParams } from 'next/navigation'; import { CreateFileResourceInput } from '@/gql/generated/graphql'; import { useMutation } from '@tanstack/react-query'; import { parseAsString, useQueryState } from 'next-usequerystate'; -import { Button, DropZone, Text, toast } from 'opub-ui'; +import { Button, DropZone, Tag, Text, toast } from 'opub-ui'; import { GraphQL } from '@/lib/api'; import { createResourceFilesDoc } from './query'; @@ -59,16 +59,20 @@ export const ResourceDropzone = ({ reload }: { reload: () => void }) => { Choose Files to Upload Maximum File Size Limit : 25 MB - - Supported File Types :{' '} - {fileTypes.map((type, index) => { - return ( -
- {type} -
- ); - })} -
+
+ + Supported File Types: + +
+ {fileTypes.map((type, index) => { + return ( + + {type} + + ); + })} +
+
); From 80728c7b7761d20a61381a561182e7acf9e6e0ae Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Tue, 24 Jun 2025 21:56:01 +0530 Subject: [PATCH 40/58] update mutation to show proper errors --- .../[entitySlug]/admin/addUser.tsx | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx index 5bdb395d..f111a098 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx @@ -17,8 +17,14 @@ import { FetchUsers } from '../usecases/edit/[id]/contributors/query'; const addUserDoc: any = graphql(` mutation addUserToOrganization($input: AddRemoveUserToOrganizationInput!) { addUserToOrganization(input: $input) { - __typename - ... on TypeOrganizationMembership { + success + errors { + nonFieldErrors + fieldErrors { + messages + } + } + data { role { name id @@ -118,18 +124,24 @@ const AddUser = ({ input ), { - onSuccess: (res: any) => { - toast('User added successfully'); - // Optionally, reset form or perform other actions - setIsOpen(false); - setFormData({ - userId: '', - roleId: '', - }); - setRefetch(true); - }, - onError: (err: any) => { - toast('Failed to add user'); + onSuccess: (data: any) => { + if (data.addUserToOrganization.success) { + toast('User added successfully'); + setIsOpen(false); + setFormData({ + userId: '', + roleId: '', + }); + setRefetch(true); + } else { + toast( + 'Error: ' + + (data.addUserToOrganization?.errors?.fieldErrors + ? data.addUserToOrganization?.errors?.fieldErrors[0] + ?.messages[0] + : data.addUserToOrganization?.errors?.nonFieldErrors[0]) + ); + } }, } ); @@ -146,7 +158,6 @@ const AddUser = ({ { onSuccess: (res: any) => { toast('User updated successfully'); - // Optionally, reset form or perform other actions setIsOpen(false); setFormData({ userId: '', From 3c4bb3f14df03345f86368aaa8da7c6abb3fb492 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Tue, 24 Jun 2025 22:34:42 +0530 Subject: [PATCH 41/58] remove empty values --- .../[entitySlug]/usecases/edit/[id]/metadata/page.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx index 3c2d72dc..9fd0b32b 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx @@ -268,7 +268,11 @@ const Metadata = () => { id: params.id, metadata: [ ...Object.keys(transformedValues) - .filter((valueItem) => !['sectors', 'tags'].includes(valueItem)) + .filter( + (valueItem) => + !['sectors', 'tags'].includes(valueItem) && + transformedValues[valueItem] !== '' + ) .map((key) => { return { id: key, From 2d8fff6811d7a5a0889b25966d6bb46f00cab5c9 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 25 Jun 2025 11:45:12 +0530 Subject: [PATCH 42/58] add entity headers in every graphql call on provider side --- .../[entitySlug]/admin/addUser.tsx | 4 +- .../charts/components/ChartsImage.tsx | 4 +- .../resources/components/EditResource.tsx | 12 +++--- .../[entityType]/[entitySlug]/layout.tsx | 4 +- .../[entitySlug]/profile/orgProfile.tsx | 4 +- .../[entitySlug]/profile/userProfile.tsx | 6 ++- .../usecases/edit/[id]/assign/page.tsx | 21 ++++++---- .../usecases/edit/[id]/contributors/page.tsx | 38 ++++++++++++++----- .../usecases/edit/[id]/dashboards/page.tsx | 10 ++--- .../usecases/edit/[id]/details/page.tsx | 8 +++- .../usecases/edit/[id]/metadata/page.tsx | 13 ++++++- .../usecases/edit/[id]/publish/page.tsx | 21 +++++++--- .../[entitySlug]/usecases/edit/layout.tsx | 10 ++++- 13 files changed, 110 insertions(+), 45 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx index f111a098..7cc4f207 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx @@ -77,7 +77,9 @@ const AddUser = ({ () => GraphQL( FetchUsers, - {}, + { + [params.entityType]: params.entitySlug, + }, { limit: 10, searchTerm: searchValue, diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/charts/components/ChartsImage.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/charts/components/ChartsImage.tsx index 6ca33f25..fcfe63b1 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/charts/components/ChartsImage.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/charts/components/ChartsImage.tsx @@ -183,7 +183,9 @@ const ChartsImage: React.FC = ({ const { mutate, isLoading: editMutationLoading } = useMutation( (data: { data: ResourceChartImageInputPartial }) => - GraphQL(UpdateChartImageMutation, {}, data), + GraphQL(UpdateChartImageMutation, { + [params.entityType]: params.entitySlug, + }, data), { onSuccess: () => { toast('ChartImage updated successfully'); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx index 9b4f6115..f8ebf31a 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/EditResource.tsx @@ -88,7 +88,7 @@ const resourceDetails: any = graphql(` `); export const EditResource = ({ refetch, allResources }: EditProps) => { - const params = useParams(); + const params = useParams<{ entityType: string; entitySlug: string; id: string }>(); const [resourceId, setResourceId] = useQueryState('id', parseAsString); const [schema, setSchema] = React.useState([]); @@ -99,7 +99,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { GraphQL( resourceDetails, { - // Entity Headers if present + [params.entityType]: params.entitySlug, }, { resourceId: resourceId } ), @@ -112,7 +112,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { GraphQL( resetSchema, { - // Entity Headers if present + [params.entityType]: params.entitySlug, }, data ), @@ -134,7 +134,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { GraphQL( updateResourceDoc, { - // Entity Headers if present + [params.entityType]: params.entitySlug, }, data ), @@ -165,7 +165,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { GraphQL( updateSchema, { - // Entity Headers if present + [params.entityType]: params.entitySlug, }, data ), @@ -189,7 +189,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { GraphQL( createResourceFilesDoc, { - // Entity Headers if present + [params.entityType]: params.entitySlug, }, data ), diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/layout.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/layout.tsx index 8987de09..d2927978 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/layout.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/layout.tsx @@ -28,7 +28,9 @@ export default function OrgDashboardLayout({ children }: DashboardLayoutProps) { useQuery([`entity_details_${params.entityType}`], () => GraphQL( params.entityType === 'organization' && getOrgDetailsQryDoc, - {}, + { + [params.entityType]: params.entitySlug, + }, { slug: params.entitySlug } ) ); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx index 0f015abe..ffac12e1 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/orgProfile.tsx @@ -81,7 +81,9 @@ const OrgProfile = () => { const { mutate, isLoading: editMutationLoading } = useMutation( (input: { input: OrganizationInputPartial }) => - GraphQL(organizationUpdateMutation, {}, input), + GraphQL(organizationUpdateMutation, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Organization updated successfully'); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx index 1761e7b5..570ecc1c 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/profile/userProfile.tsx @@ -36,7 +36,7 @@ const updateUserMutation: any = graphql(` `); const UserProfile = () => { - const params = useParams<{ entitySlug: string }>(); + const params = useParams<{ entityType: string; entitySlug: string }>(); const { setUserDetails, userDetails } = useDashboardStore(); @@ -70,7 +70,9 @@ const UserProfile = () => { const { mutate, isLoading: editMutationLoading } = useMutation( (input: { input: UpdateUserInput }) => - GraphQL(updateUserMutation, {}, input), + GraphQL(updateUserMutation, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('User details updated successfully'); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/assign/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/assign/page.tsx index 3c325145..402245b0 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/assign/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/assign/page.tsx @@ -42,7 +42,11 @@ const AssignUsecaseDatasets: any = graphql(` } `); const Assign = () => { - const params = useParams(); + const params = useParams<{ + entityType: string; + entitySlug: string; + id: string; + }>(); const router = useRouter(); const [data, setData] = useState([]); // Ensure `data` is an array @@ -54,7 +58,9 @@ const Assign = () => { () => GraphQL( FetchUseCaseDetails, - {}, + { + [params.entityType]: params.entitySlug, + }, { filters: { id: params.id, @@ -87,15 +93,12 @@ const Assign = () => { }); }, []); - - const columns = [ { accessorKey: 'title', header: 'Title' }, { accessorKey: 'category', header: 'Sector' }, { accessorKey: 'modified', header: 'Last Modified' }, ]; - const generateTableData = (list: Array) => { return list.map((item) => { return { @@ -111,7 +114,9 @@ const Assign = () => { () => GraphQL( AssignUsecaseDatasets, - {}, + { + [params.entityType]: params.entitySlug, + }, { useCaseId: params.id, datasetIds: Array.isArray(selectedRow) @@ -123,7 +128,9 @@ const Assign = () => { onSuccess: (data: any) => { toast('Dataset Assigned Successfully'); UseCaseDetails.refetch(); - router.push(`/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/contributors`); + router.push( + `/dashboard/${params.entityType}/${params.entitySlug}/usecases/edit/${params.id}/contributors` + ); }, onError: (err: any) => { toast(`Received ${err} on dataset publish `); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx index f2a3d9c0..0b058ec0 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx @@ -25,7 +25,7 @@ import { } from './query'; const Details = () => { - const params = useParams<{ id: string }>(); + const params = useParams<{ entityType: string; entitySlug: string; id: string }>(); const [searchValue, setSearchValue] = useState(''); const [formData, setFormData] = useState({ contributors: [] as { label: string; value: string }[], @@ -38,7 +38,9 @@ const Details = () => { () => GraphQL( FetchUsers, - {}, + { + [params.entityType]: params.entitySlug, + }, { limit: 10, searchTerm: searchValue, @@ -51,7 +53,9 @@ const Details = () => { ); const Organizations: { data: any; isLoading: boolean; refetch: any } = - useQuery([`fetch_orgs`], () => GraphQL(OrgList, {}, [])); + useQuery([`fetch_orgs`], () => GraphQL(OrgList, { + [params.entityType]: params.entitySlug, + }, [])); const UseCaseData: { data: any; isLoading: boolean; refetch: any } = useQuery( @@ -59,7 +63,9 @@ const Details = () => { () => GraphQL( FetchUsecaseInfo, - {}, + { + [params.entityType]: params.entitySlug, + }, { filters: { id: params.id, @@ -100,7 +106,9 @@ const Details = () => { const { mutate: addContributor, isLoading: addContributorLoading } = useMutation( (input: { useCaseId: string; userId: string }) => - GraphQL(AddContributors, {}, input), + GraphQL(AddContributors, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Contributor added successfully'); @@ -115,7 +123,9 @@ const Details = () => { const { mutate: removeContributor, isLoading: removeContributorLoading } = useMutation( (input: { useCaseId: string; userId: string }) => - GraphQL(RemoveContributor, {}, input), + GraphQL(RemoveContributor, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Contributor removed successfully'); @@ -128,7 +138,9 @@ const Details = () => { const { mutate: addSupporter, isLoading: addSupporterLoading } = useMutation( (input: { useCaseId: string; organizationId: string }) => - GraphQL(AddSupporters, {}, input), + GraphQL(AddSupporters, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Supporter added successfully'); @@ -143,7 +155,9 @@ const Details = () => { const { mutate: removeSupporter, isLoading: removeSupporterLoading } = useMutation( (input: { useCaseId: string; organizationId: string }) => - GraphQL(RemoveSupporters, {}, input), + GraphQL(RemoveSupporters, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Supporter removed successfully'); @@ -156,7 +170,9 @@ const Details = () => { const { mutate: addPartner, isLoading: addPartnerLoading } = useMutation( (input: { useCaseId: string; organizationId: string }) => - GraphQL(AddPartners, {}, input), + GraphQL(AddPartners, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Partner added successfully'); @@ -171,7 +187,9 @@ const Details = () => { const { mutate: removePartner, isLoading: removePartnerLoading } = useMutation( (input: { useCaseId: string; organizationId: string }) => - GraphQL(RemovePartners, {}, input), + GraphQL(RemovePartners, { + [params.entityType]: params.entitySlug, + }, input), { onSuccess: (res: any) => { toast('Partner removed successfully'); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx index 07a20865..ead1ff1f 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/dashboards/page.tsx @@ -73,7 +73,7 @@ const deleteDashboard: any = graphql(` } `); -const Dashboard = ({ params }: { params: { id: string } }) => { +const Dashboard = ({ params }: { params: { entityType: string; entitySlug: string; id: string } }) => { const usecaseId = parseInt(params.id); const [dashboards, setDashboards] = useState< @@ -83,7 +83,7 @@ const Dashboard = ({ params }: { params: { id: string } }) => { const { data, isLoading } = useQuery( ['fetch_dashboardData', usecaseId], - () => GraphQL(dashboardList, {}, { usecaseId }), + () => GraphQL(dashboardList, { [params.entityType]: params.entitySlug }, { usecaseId }), { refetchOnMount: true, refetchOnReconnect: true, @@ -100,7 +100,7 @@ const Dashboard = ({ params }: { params: { id: string } }) => { const { mutate: addDashboard, isLoading: addLoading } = useMutation( ({ usecaseId }: { usecaseId: number }) => - GraphQL(AddDashboard, {}, { usecaseId }), + GraphQL(AddDashboard, { [params.entityType]: params.entitySlug }, { usecaseId }), { onSuccess: (res: any) => { const newDashboard = res.addUsecaseDashboard.data; @@ -116,7 +116,7 @@ const Dashboard = ({ params }: { params: { id: string } }) => { ); const { mutate: saveDashboard, isLoading: saveLoading } = useMutation( ({ id, name, link }: { id: string; name: string; link: string }) => - GraphQL(updateDashboard, {}, { id, name, link }), + GraphQL(updateDashboard, { [params.entityType]: params.entitySlug }, { id, name, link }), { onSuccess: ({ updateUsecaseDashboard }: any) => { toast.success('Changes saved'); @@ -132,7 +132,7 @@ const Dashboard = ({ params }: { params: { id: string } }) => { ); const { mutate: removeDashboard, isLoading: deleteLoading } = useMutation( - (id: number) => GraphQL(deleteDashboard, {}, { id }), + (id: number) => GraphQL(deleteDashboard, { [params.entityType]: params.entitySlug }, { id }), { onSuccess: (_, id) => { setDashboards((prev) => prev.filter((d) => d.id !== id.toString())); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx index c2746db2..4ad871f0 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/details/page.tsx @@ -73,7 +73,9 @@ const Details = () => { () => GraphQL( FetchUseCase, - {}, + { + [params.entityType]: params.entitySlug, + }, { filters: { id: params.id, @@ -147,7 +149,9 @@ const Details = () => { const { mutate, isLoading: editMutationLoading } = useMutation( (data: { data: UseCaseInputPartial }) => - GraphQL(UpdateUseCaseMutation, {}, data), + GraphQL(UpdateUseCaseMutation, { + [params.entityType]: params.entitySlug, + }, data), { onSuccess: (res: any) => { toast('Use case updated successfully'); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx index 9fd0b32b..7c0bfc0f 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/metadata/page.tsx @@ -115,7 +115,14 @@ const Metadata = () => { const useCaseData: { data: any; isLoading: boolean } = useQuery( [`fetch_UseCaseData_Metadata`], - () => GraphQL(FetchUseCasedetails, {}, { filters: { id: params.id } }), + () => + GraphQL( + FetchUseCasedetails, + { + [params.entityType]: params.entitySlug, + }, + { filters: { id: params.id } } + ), { refetchOnMount: true, refetchOnReconnect: true, @@ -220,7 +227,9 @@ const Metadata = () => { // Update mutation const updateUseCase = useMutation( (data: { updateMetadataInput: UpdateUseCaseMetadataInput }) => - GraphQL(UpdateUseCaseMetadataMutation, {}, data), + GraphQL(UpdateUseCaseMetadataMutation, { + [params.entityType]: params.entitySlug, + }, data), { onSuccess: (res: any) => { toast('Use case updated successfully'); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx index bda766ee..93389977 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/publish/page.tsx @@ -110,14 +110,19 @@ const publishUseCaseMutation: any = graphql(` `); const Publish = () => { - const params = useParams(); - + const params = useParams<{ + entityType: string; + entitySlug: string; + id: string; + }>(); const UseCaseData: { data: any; isLoading: boolean; refetch: any } = useQuery( [`fetch_UsecaseDetails`], () => GraphQL( UseCaseDetails, - {}, + { + [params.entityType]: params.entitySlug, + }, { filters: { id: params.id, @@ -132,7 +137,9 @@ const Publish = () => { const router = useRouter(); const { mutate, isLoading: mutationLoading } = useMutation( - () => GraphQL(publishUseCaseMutation, {}, { useCaseId: params.id }), + () => GraphQL(publishUseCaseMutation, { + [params.entityType]: params.entitySlug, + }, { useCaseId: params.id }), { onSuccess: (data: any) => { toast('UseCase Published Successfully'); @@ -251,7 +258,11 @@ const Publish = () => { ) : item.name === 'Details' ? (
) : item.name === 'Dashboards' ? ( - + ) : ( )} diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx index cf250e0d..5250347c 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/layout.tsx @@ -33,7 +33,11 @@ const FetchUseCaseTitle: any = graphql(` const TabsAndChildren = ({ children }: { children: React.ReactNode }) => { const router = useRouter(); const pathName = usePathname(); - const params = useParams(); + const params = useParams<{ + entityType: string; + entitySlug: string; + id: string; + }>(); const layoutList = [ 'details', @@ -52,7 +56,9 @@ const TabsAndChildren = ({ children }: { children: React.ReactNode }) => { () => GraphQL( FetchUseCaseTitle, - {}, + { + [params.entityType]: params.entitySlug, + }, { filters: { id: params.id, From 75c654ad9d642d4878bddde5d76442cc9c33d8d6 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 25 Jun 2025 15:12:18 +0530 Subject: [PATCH 43/58] add description in schema preview --- .../[datasetIdentifier]/components/Resources/index.tsx | 5 +++++ .../[entitySlug]/dataset/[id]/edit/publish/page.tsx | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx index 12d80d3b..b7171683 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx @@ -89,6 +89,10 @@ const Resources = () => { accessorKey: 'name', header: 'Name of the Field', }, + { + accessorKey: 'description', + header: 'Description', + }, { accessorKey: 'format', header: 'Format', @@ -97,6 +101,7 @@ const Resources = () => { rows={row.original.schema.map((item: any) => ({ name: item.fieldName, format: item.format, + description: item.description, }))} /> diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/publish/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/publish/page.tsx index 1635c064..83d8c317 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/publish/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/publish/page.tsx @@ -130,6 +130,10 @@ const generateColumnData = (name: any) => { accessorKey: 'name', header: 'Name of the Field', }, + { + accessorKey: 'description', + header: 'Description', + }, { accessorKey: 'format', header: 'Format', @@ -137,6 +141,7 @@ const generateColumnData = (name: any) => { ]} rows={row.original.dialog.map((item: any) => ({ name: item.fieldName, + description: item.description, format: item.format, }))} hideFooter From 360cc6610e074c767969558cb5ee86ced68038f5 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 25 Jun 2025 15:26:48 +0530 Subject: [PATCH 44/58] refactor ResourceSchema: clean up unused format cell and improve error message --- .../resources/components/ResourceSchema.tsx | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceSchema.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceSchema.tsx index 55aad4f4..62743e49 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceSchema.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/[id]/edit/resources/components/ResourceSchema.tsx @@ -53,7 +53,7 @@ export const ResourceSchema = ({ ...newData[rowIndex], [field]: newValue, }; - + setUpdatedData(newData); setSchema(newData); handleSave(newData); @@ -109,29 +109,15 @@ export const ResourceSchema = ({ { accessorKey: 'format', header: 'FORMAT', - cell: (info: any) => { - const rowIndex = info.row.index; - const format = updatedData[rowIndex]?.format || ''; - return ( -
+ {data?.length > 0 ? ( +
+ ) : ( + No Dashboards Found + )} ); }; From 0c7148a1bb4c7a9697bf6798df697742b3d0ee44 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Wed, 25 Jun 2025 18:46:59 +0530 Subject: [PATCH 51/58] refactor(ListingComponent): implement fetch call optimization using useRef for latest fetch tracking refactor(Sectors): update sector link query parameters for consistent pagination and sorting --- app/[locale]/(user)/components/ListingComponent.tsx | 10 ++++++++-- app/[locale]/(user)/components/Sectors.tsx | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/[locale]/(user)/components/ListingComponent.tsx b/app/[locale]/(user)/components/ListingComponent.tsx index 307f99a3..b7b18426 100644 --- a/app/[locale]/(user)/components/ListingComponent.tsx +++ b/app/[locale]/(user)/components/ListingComponent.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useReducer, useState } from 'react'; +import React, { useEffect, useReducer, useRef, useState } from 'react'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; import GraphqlPagination from '@/app/[locale]/dashboard/components/GraphqlPagination/graphqlPagination'; @@ -219,12 +219,18 @@ const ListingComponent: React.FC = ({ const datasetDetails = facets?.results ?? []; useUrlParams(queryParams, setQueryParams, setVariables); + const latestFetchId = useRef(0); useEffect(() => { if (variables) { + const currentFetchId = ++latestFetchId.current; + fetchDatasets(variables) .then((res) => { - setFacets(res); + // Only set if this is the latest call + if (currentFetchId === latestFetchId.current) { + setFacets(res); + } }) .catch((err) => { console.error(err); diff --git a/app/[locale]/(user)/components/Sectors.tsx b/app/[locale]/(user)/components/Sectors.tsx index 193a7a06..45ef45cb 100644 --- a/app/[locale]/(user)/components/Sectors.tsx +++ b/app/[locale]/(user)/components/Sectors.tsx @@ -63,7 +63,7 @@ const Sectors = () => {
{data?.sectors.map((sectors: any) => (
From bad8f406099f07b99899be8c01e3332814413608 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 26 Jun 2025 13:49:49 +0530 Subject: [PATCH 52/58] chore: update opub-ui dependency to version 0.3.88 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ed8cfc5..ad31f68f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "next-auth": "^4.24.7", "next-intl": "^3.4.0", "next-usequerystate": "^1.17.2", - "opub-ui": "0.3.86", + "opub-ui": "0.3.88", "react": "^18.2.0", "react-aria": "3.22.0", "react-dom": "^18.2.0", @@ -16423,9 +16423,9 @@ } }, "node_modules/opub-ui": { - "version": "0.3.86", - "resolved": "https://registry.npmjs.org/opub-ui/-/opub-ui-0.3.86.tgz", - "integrity": "sha512-MrEC3YxCM9ZThNk4B6xKvGWPmJ5GwCkQhUmY3sQorzw4lO2/ut7r0mxroJ04OSZsaPaansssfH35DHPboOseWA==", + "version": "0.3.88", + "resolved": "https://registry.npmjs.org/opub-ui/-/opub-ui-0.3.88.tgz", + "integrity": "sha512-Xpzfq8azOm1A/U7qqbRnJeWH9+XkpwzwTOpNIDEZ5N7E/efW8xZpR/fMC8kFWX0xxHpsAi6fe5zZJ8iM0V/cFA==", "dependencies": { "@ariakit/react": "^0.3.14", "@hookform/resolvers": "^3.3.4", diff --git a/package.json b/package.json index 5be0db08..9939f9ee 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "next-auth": "^4.24.7", "next-intl": "^3.4.0", "next-usequerystate": "^1.17.2", - "opub-ui": "0.3.86", + "opub-ui": "0.3.88", "react": "^18.2.0", "react-aria": "3.22.0", "react-dom": "^18.2.0", From 2a3827583eac8a3673b496a342be15d981f067e9 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 26 Jun 2025 13:50:20 +0530 Subject: [PATCH 53/58] refactor(ListingComponent): streamline metadata and footer content structure for improved readability --- .../(user)/components/ListingComponent.tsx | 78 +++++++++++++------ public/chart-bar.svg | 13 ++++ 2 files changed, 67 insertions(+), 24 deletions(-) create mode 100644 public/chart-bar.svg diff --git a/app/[locale]/(user)/components/ListingComponent.tsx b/app/[locale]/(user)/components/ListingComponent.tsx index b7b18426..362decf1 100644 --- a/app/[locale]/(user)/components/ListingComponent.tsx +++ b/app/[locale]/(user)/components/ListingComponent.tsx @@ -478,35 +478,65 @@ const ListingComponent: React.FC = ({ ? `${process.env.NEXT_PUBLIC_BACKEND_URL}/${item.organization.logo}` : '/org.png'; + const MetadataContent = [ + { + icon: Icons.calendar, + label: 'Date', + value: formatDate(item.modified), + tooltip: 'Date', + }, + { + icon: Icons.download, + label: 'Download', + value: item.download_count.toString(), + tooltip: 'Download', + }, + { + icon: Icons.globe, + label: 'Geography', + value: 'India', + tooltip: 'Geography', + }, + ]; + + if (item.has_charts && view === 'expanded') { + MetadataContent.push({ + icon: Icons.chart, + label: '', + value: 'With Charts', + tooltip: 'Charts', + }); + } + + const FooterContent = [ + { + icon: `/Sectors/${item.sectors[0]}.svg`, + label: 'Sectors', + tooltip: `${item.sectors[0]}`, + }, + ...(item.has_charts && view !== 'expanded' + ? [ + { + icon: `/chart-bar.svg`, + label: 'Charts', + tooltip: 'Charts', + }, + ] + : []), + { + icon: image, + label: 'Published by', + tooltip: `${item.is_individual_dataset ? item.user?.name : item.organization?.name}`, + }, + ]; + const commonProps = { title: item.title, description: item.description, - metadataContent: [ - { - icon: Icons.calendar, - label: 'Date', - value: formatDate(item.modified), - }, - { - icon: Icons.download, - label: 'Download', - value: item.download_count.toString(), - }, - { - icon: Icons.globe, - label: 'Geography', - value: 'India', - }, - ], + metadataContent: MetadataContent, tag: item.tags, formats: item.formats, - footerContent: [ - { - icon: `/Sectors/${item.sectors[0]}.svg`, - label: 'Sectors', - }, - { icon: image, label: 'Published by' }, - ], + footerContent: FooterContent, }; return ( diff --git a/public/chart-bar.svg b/public/chart-bar.svg new file mode 100644 index 00000000..0597dcc3 --- /dev/null +++ b/public/chart-bar.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From 0edbf2bad13fdd2f1ac62ffbfcb959a51eb237a3 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 26 Jun 2025 13:50:40 +0530 Subject: [PATCH 54/58] refactor(TitleBar): reorganize imports and enhance title display for better readability --- .../[entityType]/[entitySlug]/components/title-bar.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/components/title-bar.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/components/title-bar.tsx index a58ac924..0989e81b 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/components/title-bar.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/components/title-bar.tsx @@ -1,6 +1,6 @@ +import { useEffect, useState } from 'react'; import Link from 'next/link'; import { Button, Icon, Spinner, Text, TextField } from 'opub-ui'; -import { useEffect, useState } from 'react'; import { Icons } from '@/components/icons'; @@ -11,7 +11,8 @@ interface TitleBarProps { onSave: (data: any) => void; loading: boolean; status: 'loading' | 'success'; - setStatus: (s: 'loading' | 'success') => void;} + setStatus: (s: 'loading' | 'success') => void; +} const TitleBar = ({ label, @@ -43,7 +44,9 @@ const TitleBar = ({ }} /> ) : ( - {title} + + {title} + )}
{edit && ( From f8b16ae8715589ca41f6e58b58173367ba8bf3f3 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 26 Jun 2025 15:49:42 +0530 Subject: [PATCH 55/58] add truncate to breadcrumbs --- components/BreadCrumbs/index.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/components/BreadCrumbs/index.tsx b/components/BreadCrumbs/index.tsx index 4d0613ca..3d06767a 100644 --- a/components/BreadCrumbs/index.tsx +++ b/components/BreadCrumbs/index.tsx @@ -14,18 +14,29 @@ interface BreadCrumbsProps { const BreadCrumbs: React.FC = ({ data }) => { return ( -
+
- + {data.map((item, index) => ( {index === data.length - 1 ? ( - {item.label} + + {item.label} + ) : ( - {item.label} + + {item.label} + )} {index < data.length - 1 && } From 37119c3a3a43d6bceb258435c2772eb8273e7274 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 26 Jun 2025 16:33:38 +0530 Subject: [PATCH 56/58] refactor(ListingComponent): add Geography metadata to MetadataContent for improved dataset information --- .../(user)/components/ListingComponent.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/[locale]/(user)/components/ListingComponent.tsx b/app/[locale]/(user)/components/ListingComponent.tsx index 362decf1..2898fc68 100644 --- a/app/[locale]/(user)/components/ListingComponent.tsx +++ b/app/[locale]/(user)/components/ListingComponent.tsx @@ -477,6 +477,9 @@ const ListingComponent: React.FC = ({ : item?.organization?.logo ? `${process.env.NEXT_PUBLIC_BACKEND_URL}/${item.organization.logo}` : '/org.png'; + const Geography = item.metadata.filter( + (item: any) => item.metadata_item.label === 'Geography' + )[0]?.value; const MetadataContent = [ { @@ -491,13 +494,15 @@ const ListingComponent: React.FC = ({ value: item.download_count.toString(), tooltip: 'Download', }, - { + ]; + if (Geography) { + MetadataContent.push({ icon: Icons.globe, label: 'Geography', - value: 'India', + value: Geography, tooltip: 'Geography', - }, - ]; + }); + } if (item.has_charts && view === 'expanded') { MetadataContent.push({ @@ -508,7 +513,7 @@ const ListingComponent: React.FC = ({ }); } - const FooterContent = [ + const FooterContent = [ { icon: `/Sectors/${item.sectors[0]}.svg`, label: 'Sectors', From 78d9613f84d490e742cb8103ba051d8993d16ce6 Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Thu, 26 Jun 2025 17:06:09 +0530 Subject: [PATCH 57/58] add truncate --- .../[datasetIdentifier]/components/Metadata/index.tsx | 2 +- .../dashboard/[entityType]/[entitySlug]/usecases/page.tsx | 4 ++-- components/BreadCrumbs/index.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx index 4f6bbbef..0865284d 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx @@ -124,7 +124,7 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { } > diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx index c390c926..9fdcb2b3 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/page.tsx @@ -184,14 +184,14 @@ export default function DatasetPage({ header: 'Title', cell: ({ row }: any) => navigationTab === 'published' ? ( - {row.original.title} + {row.original.title} ) : ( - {row.original.title} + {row.original.title} ), }, diff --git a/components/BreadCrumbs/index.tsx b/components/BreadCrumbs/index.tsx index 3d06767a..bce9c6e2 100644 --- a/components/BreadCrumbs/index.tsx +++ b/components/BreadCrumbs/index.tsx @@ -23,7 +23,7 @@ const BreadCrumbs: React.FC = ({ data }) => { {item.label} @@ -33,7 +33,7 @@ const BreadCrumbs: React.FC = ({ data }) => { {item.label} From 281a87ab20f2bc5645e4ee19fd29c1a1a566458e Mon Sep 17 00:00:00 2001 From: sanjaypinna Date: Fri, 27 Jun 2025 16:10:53 +0530 Subject: [PATCH 58/58] update mutation response --- .../dashboard/[entityType]/[entitySlug]/admin/addUser.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx index 94878124..7cc4f207 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/admin/addUser.tsx @@ -29,7 +29,6 @@ const addUserDoc: any = graphql(` name id } - success } } }