diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx index e5d0bfd7..d136b72f 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Metadata/index.tsx @@ -10,7 +10,7 @@ interface MetadataProps { } const MetadataComponent: React.FC = ({ data, setOpen }) => { - const filteredMetadataArray = data.metadata.filter( + const filteredMetadataArray = data?.metadata.filter( (item: any) => item.metadataItem.label !== 'Source Website' && item.metadataItem.label !== 'Github Repo Link' && @@ -31,7 +31,7 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { )}
- {filteredMetadataArray.map((item: any, index: any) => ( + {filteredMetadataArray?.map((item: any, index: any) => (
= ({ data, isLoading }) => { - const sourceMetadata = data.metadata.find( + const sourceMetadata = data?.metadata.find( (item: any) => item.metadataItem.label === 'Source' ); - const sourceLink = data.metadata.find( + const sourceLink = data?.metadata.find( (item: any) => item.metadataItem.label === 'Source Website' ); - const githubLink = data.metadata.find( + const githubLink = data?.metadata.find( (item: any) => item.metadataItem.label === 'Github Repo Link' ); diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx index 135b540c..e6fad1e5 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/Resources/index.tsx @@ -5,7 +5,18 @@ import Link from 'next/link'; import { useParams } from 'next/navigation'; import { graphql } from '@/gql'; import { useQuery } from '@tanstack/react-query'; -import { Button, Spinner, Tag, Text } from 'opub-ui'; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, + Button, + Dialog, + Spinner, + Table, + Tag, + Text, +} from 'opub-ui'; import { GraphQL } from '@/lib/api'; import { formatDate } from '@/lib/utils'; @@ -19,7 +30,11 @@ const datasetResourceQuery: any = graphql(` type name description - + previewData { + columns + rows + } + previewEnabled schema { fieldName id @@ -28,6 +43,7 @@ const datasetResourceQuery: any = graphql(` } fileDetails { format + size } } } @@ -78,6 +94,118 @@ const Resources = () => { }); }, [getResourceDetails.data]); + const generateColumnData = () => { + return [ + { + accessorKey: 'schema', + header: 'Columns', + cell: ({ row }: any) => { + return ( + + + + + + ({ + name: item.fieldName, + format: item.format, + }))} + /> + + + ); + }, + }, + { + accessorKey: 'rowsLength', + header: 'No.of Rows', + cell: ({ row }: any) => { + return ( +

+ {row.original.rowsLength === 0 + ? 'NA' + : `${row.original.rowsLength}`} +

+ ); + }, + }, + { + accessorKey: 'format', + header: 'Format', + }, + { + accessorKey: 'size', + header: 'Size', + }, + { + accessorKey: 'preview', + header: 'Preview', + cell: ({ row }: any) => { + const previewData = row.original.preview; + + // Generate columns dynamically from previewData.columns + const previewColumns = + previewData?.columns?.map((column: string) => ({ + accessorKey: column, + header: column, + cell: ({ cell }: any) => { + const value = cell.getValue(); + return {value !== null ? value.toString() : 'N/A'}; + }, + })) || []; + + // Transform rows data to match column structure + const previewRows = + previewData?.rows?.map((row: any[]) => { + const rowData: Record = {}; + previewData.columns.forEach((column: string, index: number) => { + rowData[column] = row[index]; + }); + return rowData; + }) || []; + + return ( + + + + + + {previewData && ( +
+ )} + + + ); + }, + }, + ]; + }; + + const generateTableData = (data: any) => { + return [ + { + schema: data?.schema, + rowsLength: data?.previewData?.rows?.length || 'Na', + format: data?.fileDetails?.format || 'Na', + size: Math.round(data?.fileDetails?.size / 1024).toFixed(2) + 'KB', + preview: data?.previewData, + }, + ]; + }; + return (
{getResourceDetails.isLoading ? ( @@ -90,51 +218,77 @@ const Resources = () => { Downloadable Resources -
+
{getResourceDetails.data?.datasetResources.map( (item: any, index: number) => (
-
-
- {item.name} - {item.fileDetails.format} +
+
+
+ {item.name} + {item.fileDetails?.format && ( + {item.fileDetails?.format} + )} +
+
+ Updated: + {formatDate(item.modified)} +
- Updated: - {formatDate(item.modified)} -
-
-
(descriptionRefs.current[index] = el)} - className={!showMore[index] ? 'line-clamp-2' : ''} + - {item.description} -
- {isDescriptionLong[index] && ( - - )} + +
-
- - - -
+ + +
+
+
(descriptionRefs.current[index] = el)} + className={!showMore[index] ? 'line-clamp-2' : ''} + > + {item.description} +
+ {isDescriptionLong[index] && ( + + )} +
+ + View Details + +
+ +
+ + + ) )} 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 6594a5eb..ecc3e476 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 @@ -1,29 +1,20 @@ -import React from 'react'; +import React, { useState } from 'react'; import { useParams } from 'next/navigation'; -import { graphql } from '@/gql'; import { CreateFileResourceInput, SchemaUpdateInput, UpdateFileResourceInput, } from '@/gql/generated/graphql'; -import { IconTrash } from '@tabler/icons-react'; -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; -import { - parseAsBoolean, - parseAsString, - useQueryState, -} from 'next-usequerystate'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { parseAsString, useQueryState } from 'next-usequerystate'; import { Button, - ButtonGroup, Checkbox, Combobox, - DataTable, Dialog, Divider, DropZone, Icon, - IconButton, Select, Spinner, Text, @@ -178,10 +169,24 @@ export const EditResource = ({ refetch, list }: EditProps) => { const [resourceDesc, setResourceDesc] = React.useState( getResourceObject(resourceId)?.description ); + const [previewEnable, setPreviewEnable] = useState(true); + + const [previewDetails, setPreviewDetails] = useState({ + startEntry: 0, + endEntry: 0, + isAllEntries: true, + }); React.useEffect(() => { setResourceName(getResourceObject(resourceId)?.label); setResourceDesc(getResourceObject(resourceId)?.description); + setPreviewEnable(getResourceObject(resourceId)?.previewEnabled ?? true); + setPreviewDetails({ + startEntry: getResourceObject(resourceId)?.previewDetails.startEntry ?? 0, + endEntry: getResourceObject(resourceId)?.previewDetails.endEntry ?? 0, + isAllEntries: + getResourceObject(resourceId)?.previewDetails.isAllEntries ?? true, + }); //fix this later }, [JSON.stringify(list), resourceId]); @@ -230,7 +235,7 @@ export const EditResource = ({ refetch, list }: EditProps) => { const fileInput = (
- {getResourceObject(resourceId)?.fileDetails.file.name.replace( + {getResourceObject(resourceId)?.fileDetails?.file.name.replace( 'resources/', '' )}{' '} @@ -242,12 +247,35 @@ export const EditResource = ({ refetch, list }: EditProps) => { setResourceId(''); }; + const handlePreviewDetailsChange = ( + field: string, + value: string | boolean + ) => { + if (field === 'isAllEntries' && value) { + setPreviewDetails({ + startEntry: 0, + endEntry: 0, + isAllEntries: true, + }); + } else { + setPreviewDetails((prev) => ({ + ...prev, + [field]: value, + })); + } + }; const saveResource = () => { updateResourceMutation.mutate({ fileResourceInput: { id: resourceId, description: resourceDesc || '', name: resourceName || '', + previewEnabled: previewEnable, + previewDetails: { + startEntry: +previewDetails.startEntry || 0, + endEntry: +previewDetails.endEntry || 0, + isAllEntries: previewDetails.isAllEntries, + }, }, isResetSchema: false, }); @@ -357,6 +385,7 @@ export const EditResource = ({ refetch, list }: EditProps) => { multiline={4} />
+
{fileInput} @@ -371,71 +400,55 @@ export const EditResource = ({ refetch, list }: EditProps) => {
- {/*
-
- console.log('hi')}> - Enabel Preview - - -
- -
+
+ setPreviewEnable(!previewEnable)} + > + Preview Enabled + -
- - Select Rows to be
shown in the Preview -
- - -
-
-
- See Preview -
-
*/} -
+ {previewEnable && ( + <> + + handlePreviewDetailsChange( + 'isAllEntries', + !previewDetails.isAllEntries + ) + } + > + Show all entries + + {!previewDetails.isAllEntries && ( + <> + + handlePreviewDetailsChange('startEntry', value) + } + type="number" + /> + + handlePreviewDetailsChange('endEntry', value) + } + type="number" + /> + + )} + + )} +
+
Fields in the Resource