diff --git a/app/[locale]/(user)/components/ListingComponent.tsx b/app/[locale]/(user)/components/ListingComponent.tsx index 07934725..9d54a9c0 100644 --- a/app/[locale]/(user)/components/ListingComponent.tsx +++ b/app/[locale]/(user)/components/ListingComponent.tsx @@ -232,6 +232,14 @@ const ListingComponent: React.FC = ({ } }, [variables, fetchDatasets]); + const [hasMounted, setHasMounted] = useState(false); + + useEffect(() => { + setHasMounted(true); + }, []); + + if (!hasMounted) return ; + const handlePageChange = (newPage: number) => { setQueryParams({ type: 'SET_CURRENT_PAGE', payload: newPage }); }; @@ -301,7 +309,11 @@ const ListingComponent: React.FC = ({ )} - + {categoryDescription ? categoryDescription : 'No Description Provided'} @@ -440,7 +452,9 @@ const ListingComponent: React.FC = ({ )} - {facets && datasetDetails?.length > 0 ? ( + {facets === null ? ( + + ) : facets.results.length > 0 ? ( = ({ })} ) : ( - +
+ No datasets found +
)} diff --git a/app/[locale]/(user)/components/UseCases.tsx b/app/[locale]/(user)/components/UseCases.tsx index c29ed7cf..9741d5ff 100644 --- a/app/[locale]/(user)/components/UseCases.tsx +++ b/app/[locale]/(user)/components/UseCases.tsx @@ -25,7 +25,7 @@ const useCasesListDoc: any = graphql(` $filters: UseCaseFilter $pagination: OffsetPaginationInput ) { - useCases(filters: $filters, pagination: $pagination) { + publishedUseCases(filters: $filters, pagination: $pagination) { id title summary @@ -123,8 +123,8 @@ const UseCasesListingPage = () => { ) : ( {getUseCasesList && - getUseCasesList?.data?.useCases.length > 0 && - getUseCasesList?.data?.useCases.map((item: any, index: any) => ( + getUseCasesList?.data?.publishedUseCases.length > 0 && + getUseCasesList?.data?.publishedUseCases.map((item: any, index: any) => ( = ({ data, setOpen }) => { : data.organization.name}
-
+
Sector - - {data.sectors[0].name} - +
+ {data.sectors.length > 0 ? ( + data.sectors.map((sector: any, index: number) => ( + {sector.name + )) + ) : ( + N/A + )} +
{Metadata.map((item: any, index: any) => (
@@ -152,7 +161,7 @@ const MetadataComponent: React.FC = ({ data, setOpen }) => { ) : ( - {sourceTitle?.trim() ? sourceTitle : 'Source'} + {sourceTitle?.trim() ? sourceTitle : 'Visit Website'} )} diff --git a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx index 40e38638..3093629f 100644 --- a/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx +++ b/app/[locale]/(user)/datasets/[datasetIdentifier]/components/SimilarDatasets/index.tsx @@ -149,7 +149,7 @@ const SimilarDatasets: React.FC = ({ showCharts }) => { formats={item.formats} footerContent={[ { - icon: `/Sectors/${item.sectors[0].name}.svg`, + icon: `/Sectors/${item.sectors[0]?.name}.svg`, label: 'Sectors', }, { diff --git a/app/[locale]/(user)/publishers/components/Datasets.tsx b/app/[locale]/(user)/publishers/components/Datasets.tsx index 6452edc9..392a1208 100644 --- a/app/[locale]/(user)/publishers/components/Datasets.tsx +++ b/app/[locale]/(user)/publishers/components/Datasets.tsx @@ -174,7 +174,7 @@ const Datasets = ({ type }: { type: 'organization' | 'Publisher' }) => { formats={item.formats} footerContent={[ { - icon: `/Sectors/${item.sectors[0].name}.svg`, + icon: `/Sectors/${item.sectors[0]?.name}.svg`, label: 'Sectors', }, { diff --git a/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx b/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx index cea54652..f0fca2b5 100644 --- a/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx +++ b/app/[locale]/(user)/usecases/[useCaseSlug]/page.tsx @@ -225,7 +225,7 @@ const UseCaseDetailPage = () => { href={`/datasets/${dataset.id}`} footerContent={[ { - icon: `/Sectors/${dataset.sectors[0].name}.svg`, + icon: `/Sectors/${dataset.sectors[0]?.name}.svg`, label: 'Sectors', }, { diff --git a/app/[locale]/(user)/usecases/components/Details.tsx b/app/[locale]/(user)/usecases/components/Details.tsx index a8a55fbc..8ed2b916 100644 --- a/app/[locale]/(user)/usecases/components/Details.tsx +++ b/app/[locale]/(user)/usecases/components/Details.tsx @@ -79,7 +79,7 @@ const PrimaryDetails = ({ data, isLoading }: { data: any; isLoading: any }) => {
Summary
- + {data.useCase.summary}
diff --git a/app/[locale]/(user)/usecases/page.tsx b/app/[locale]/(user)/usecases/page.tsx index 0dc7698f..6d7bf1b8 100644 --- a/app/[locale]/(user)/usecases/page.tsx +++ b/app/[locale]/(user)/usecases/page.tsx @@ -14,7 +14,7 @@ import Styles from '../page.module.scss'; const useCasesListQueryDoc: any = graphql(` query UseCasesList($filters: UseCaseFilter) { - useCases(filters: $filters) { + publishedUseCases(filters: $filters) { id title summary @@ -129,8 +129,8 @@ const UseCasesListingPage = () => { )} > {getUseCasesList && - getUseCasesList?.data?.useCases.length > 0 && - getUseCasesList?.data?.useCases.map((item: any, index: any) => ( + getUseCasesList?.data?.publishedUseCases.length > 0 && + getUseCasesList?.data?.publishedUseCases.map((item: any, index: any) => ( - GraphQL(updateUser, { - [params.entityType]: params.entitySlug, - }, input), + GraphQL( + updateUser, + { + [params.entityType]: params.entitySlug, + }, + input + ), { onSuccess: (res: any) => { toast('User updated successfully'); @@ -172,6 +176,12 @@ const AddUser = ({ const filteredOptions = Users.data?.searchUsers; const handleInputChange = (e: React.ChangeEvent) => { const value = e.target.value; + if (value === '') { + setFormData({ + userId: '', + roleId: formData.roleId, + }); + } setSearchValue(value); setIsDropdownOpen(true); // Keep dropdown open while typing Users.refetch(); // Refetch when search term changes @@ -193,13 +203,13 @@ const AddUser = ({ >
- + role.id === formData.roleId) .map((role: any) => role.description)} @@ -239,9 +249,12 @@ const AddUser = ({ @@ -560,7 +560,7 @@ export const EditResource = ({ refetch, allResources }: EditProps) => { ) : (
{' '} - Click on Reset Fields{' '} + Click on Reset Format{' '}
)}
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 13223149..b79dab3d 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 @@ -43,7 +43,6 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { id: string; }>(); - useEffect(() => { refetch(); }, [resourceId]); @@ -77,7 +76,6 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { } ); - const createResourceMutation = useMutation( (data: { fileResourceInput: CreateFileResourceInput }) => GraphQL( @@ -115,7 +113,12 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { ); }, onError: (err: any) => { - toast(err); + toast(err.message, { + action: { + label: 'Dismiss', + onClick: () => {}, + }, + }); setFile([]); }, } @@ -187,7 +190,6 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { table.rows ); - useEffect(() => { const updatedRows = data.map((item: any) => ({ @@ -196,10 +198,9 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { date_added: formatDate(item.created), id: item.id, })) || []; - + setFilteredRows(updatedRows); }, [data]); - const handleSearchChange = (e: string) => { const searchTerm = e.toLowerCase(); @@ -242,7 +243,7 @@ export const ResourceListView = ({ data, refetch }: ResourceListProps) => { Showing {filteredRows.length} of {filteredRows.length} Data Files handleSearchChange(e)} diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/components/content.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/components/content.tsx index d357c16b..8b949079 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/components/content.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/components/content.tsx @@ -3,26 +3,26 @@ import { useRouter } from 'next/navigation'; import { graphql } from '@/gql'; import { useMutation } from '@tanstack/react-query'; -import { Button, Icon, Text } from 'opub-ui'; +import { Button, Icon, Text, toast } from 'opub-ui'; import { twMerge } from 'tailwind-merge'; import { GraphQL } from '@/lib/api'; import { Icons } from '@/components/icons'; const createDatasetMutationDoc: any = graphql(` - mutation GenerateDatasetName { + mutation Generate_Dataset_Name { addDataset { - __typename - ... on TypeDataset { + success + errors { + fieldErrors { + messages + } + } + data { id + title created } - ... on OperationInfo { - messages { - kind - message - } - } } } `); @@ -45,12 +45,16 @@ export const Content = ({ ), { onSuccess: (data: any) => { - router.push( - `/dashboard/${params.entityType}/${params.entitySlug}/dataset/${data?.addDataset?.id}/edit/metadata` - ); - }, - onError: (err: any) => { - console.log('Error ::: ', err); + if (data.addDataset.success) { + toast('Dataset created successfully!'); + router.push( + `/dashboard/${params.entityType}/${params.entitySlug}/dataset/${data?.addDataset?.data?.id}/edit/metadata` + ); + } else { + toast( + 'Error: ' + data.addDataset.errors.fieldErrors[0].messages[0] + ); + } }, } ); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page-layout.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page-layout.tsx index f5a5a84a..87139153 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page-layout.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page-layout.tsx @@ -3,25 +3,26 @@ import { useParams, useRouter } from 'next/navigation'; import { graphql } from '@/gql'; import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { toast } from 'opub-ui'; import { GraphQL } from '@/lib/api'; import { ActionBar } from './components/action-bar'; import { Content } from './components/content'; const createDatasetMutationDoc: any = graphql(` - mutation GenerateDatasetName { + mutation GenerateDatasetname { addDataset { - __typename - ... on TypeDataset { + success + errors { + fieldErrors { + messages + } + } + data { id + title created } - ... on OperationInfo { - messages { - kind - message - } - } } } `); @@ -46,16 +47,18 @@ export const Page = () => { ), { onSuccess: (data: any) => { - queryClient.invalidateQueries({ - queryKey: [`create_dataset_${'52'}`], - }); + if (data.addDataset.success) { + toast('Dataset created successfully!'); + queryClient.invalidateQueries({ + queryKey: [`create_dataset_${params.entityType}`], + }); - router.push( - `/dashboard/${params.entityType}/${params.entitySlug}/dataset/${data?.addDataset?.id}/edit/metadata` - ); - }, - onError: (err: any) => { - console.log('Error ::: ', err); + router.push( + `/dashboard/${params.entityType}/${params.entitySlug}/dataset/${data?.addDataset?.data?.id}/edit/metadata` + ); + } else { + toast('Error: ' + data.addDataset.errors.fieldErrors[0].messages[0]); + } }, } ); diff --git a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx index e4948519..51f99900 100644 --- a/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx +++ b/app/[locale]/dashboard/[entityType]/[entitySlug]/dataset/page.tsx @@ -29,17 +29,17 @@ const allDatasetsQueryDoc: any = graphql(` const createDatasetMutationDoc: any = graphql(` mutation GenerateDatasetName { addDataset { - __typename - ... on TypeDataset { + success + errors { + fieldErrors { + messages + } + } + data { id + title created } - ... on OperationInfo { - messages { - kind - message - } - } } } `); @@ -86,25 +86,19 @@ export default function DatasetPage({ ]; const AllDatasetsQuery: { data: any; isLoading: boolean; refetch: any } = - useQuery( - [`fetch_datasets_org_dashboard`], - () => - GraphQL( - allDatasetsQueryDoc, - { - [params.entityType]: params.entitySlug, + useQuery([`fetch_datasets_org_dashboard`], () => + GraphQL( + allDatasetsQueryDoc, + { + [params.entityType]: params.entitySlug, + }, + { + filters: { + status: navigationTab === 'published' ? 'PUBLISHED' : 'DRAFT', }, - { - filters: { - status: navigationTab === 'published' ? 'PUBLISHED' : 'DRAFT', - }, - order: { modified: 'DESC' }, - } - ), - { - refetchOnMount: true, - refetchOnReconnect: true, - } + order: { modified: 'DESC' }, + } + ) ); useEffect(() => { @@ -149,12 +143,17 @@ export default function DatasetPage({ ), { onSuccess: (data: any) => { - router.push( - `/dashboard/${params.entityType}/${params.entitySlug}/dataset/${data?.addDataset?.id}/edit/metadata` - ); - }, - onError: (err: any) => { - toast('Error: ' + err.message.split(':')[0]); + if (data.addDataset.success) { + toast('Dataset created successfully!'); + + router.push( + `/dashboard/${params.entityType}/${params.entitySlug}/dataset/${data?.addDataset?.data?.id}/edit/metadata` + ); + } else { + toast( + 'Error: ' + data.addDataset.errors.fieldErrors[0].messages[0] + ); + } }, } ); 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 acb707a3..3c325145 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 @@ -91,7 +91,7 @@ const Assign = () => { const columns = [ { accessorKey: 'title', header: 'Title' }, - { accessorKey: 'category', header: 'Category' }, + { accessorKey: 'category', header: 'Sector' }, { accessorKey: 'modified', header: 'Last Modified' }, ]; 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 c49b41ce..3253c56e 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 @@ -210,83 +210,86 @@ const Details = () => { }, [editMutationLoading]); return ( -
-
+
+
+ handleChange('summary', e)} + onBlur={() => handleSave(formData)} + /> +
+ + +
+
handleChange('summary', e)} + label="Started On" + name="startedOn" + type="date" + max={new Date().toISOString().split('T')[0]} + value={formData.startedOn || ''} + onChange={(e) => { + handleChange('startedOn', e); + }} onBlur={() => handleSave(formData)} />
- -
-
- { - handleChange('startedOn', e); - }} - onBlur={() => handleSave(formData)} - /> -
- -
- ({ + label: item.label, + value: item.value, + }))} + label="Running Status" + value={formData?.runningStatus ? formData.runningStatus : ''} + onChange={(value: any) => { + handleChange('runningStatus', value); + handleSave({ ...formData, runningStatus: value }); + }} + />
-
- - - +
+ { + handleChange('completedOn', e); + }} + onBlur={() => handleSave(formData)} + />
- {/*
+
+
+ + + +
+ {/*
{ onBlur={() => handleSave(formData)} />
*/} -
+
); }; 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 cdd2d314..c559de5b 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 @@ -217,8 +217,11 @@ const Metadata = () => { (data: { updateMetadataInput: UpdateUseCaseMetadataInput }) => GraphQL(UpdateUseCaseMetadataMutation, {}, data), { - onSuccess: () => { + onSuccess: (res: any) => { toast('Use case updated successfully'); + const updatedData = defaultValuesPrepFn(res.addUpdateUsecaseMetadata); + setFormData(updatedData); + setPreviousFormData(updatedData); }, onError: (error: any) => { toast(`Error: ${error.message}`); @@ -306,7 +309,6 @@ const Metadata = () => { } if (metadataFormItem.dataType === 'MULTISELECT') { - return (
{ value: option, })) || []), ]} - label={metadataFormItem.label} + label={metadataFormItem.label+ ' *'} selectedValue={formData[metadataFormItem.id]} displaySelected onChange={(value) => { @@ -356,7 +358,7 @@ const Metadata = () => {
({ 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 c456753e..456f7de5 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 @@ -145,8 +145,11 @@ const Publish = () => { name: 'Details', data: UseCaseData.data?.useCases, error: - UseCaseData.data && UseCaseData.data?.useCases[0]?.length > 0 - ? 'No Details found. Please add to continue.' + UseCaseData.data?.useCases[0]?.sectors.length === 0 || + UseCaseData.data?.useCases[0]?.summary.length === 0 || + UseCaseData.data?.useCases[0]?.metadata.length === 0 || + UseCaseData.data?.useCases[0]?.logo === null + ? 'Summary or SDG or Sectors or Logo is missing. Please add to continue.' : '', errorType: 'critical', }, @@ -238,6 +241,23 @@ const Publish = () => { }); }; + const isPublishDisabled = (useCase: any) => { + if (!useCase) return true; + + const hasDatasets = useCase?.datasets.length > 0; + const hasRequiredMetadata = + useCase.sectors.length > 0 && + useCase?.summary.length > 0 && + useCase?.metadata.length > 0 && + useCase?.logo !== null; + + // No datasets assigned + if (!hasDatasets) return true; + + // Required metadata check + if (!hasRequiredMetadata) return true; + }; + return ( <>
@@ -424,7 +444,7 @@ const Publish = () => { diff --git a/app/[locale]/dashboard/components/main-footer.tsx b/app/[locale]/dashboard/components/main-footer.tsx index a78e284e..9e7e37a0 100644 --- a/app/[locale]/dashboard/components/main-footer.tsx +++ b/app/[locale]/dashboard/components/main-footer.tsx @@ -29,17 +29,38 @@ const MainFooter = () => {
{' '} -
- logo - - CivicDataSpace - -
+ +
+
+ {/* Static Logo */} +
+ Logo +
+ + {/* Globe GIF on Hover */} +
+ Globe +
+
+ + CivicDataSpace + +
+
{' '} @@ -70,12 +91,10 @@ const MainFooter = () => { About Us - {/* - Sitemap - - + Contact Us - */} + +
made by diff --git a/app/[locale]/dashboard/components/main-nav.tsx b/app/[locale]/dashboard/components/main-nav.tsx index d0dd87ab..950cf1d7 100644 --- a/app/[locale]/dashboard/components/main-nav.tsx +++ b/app/[locale]/dashboard/components/main-nav.tsx @@ -1,31 +1,26 @@ 'use client'; -import React, { useEffect, useState } from 'react'; -import Image from 'next/image'; -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; -import { useMetaKeyPress } from '@/hooks/use-meta-key-press'; import { Session } from 'next-auth'; import { signIn, signOut, useSession } from 'next-auth/react'; +import Image from 'next/image'; +import Link from 'next/link'; +import { usePathname, useRouter } from 'next/navigation'; import { Avatar, Button, - CommandDialog, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, + Dialog, Divider, IconButton, Popover, + SearchInput, Spinner, Text, } from 'opub-ui'; +import React, { useEffect, useState } from 'react'; +import { Icons } from '@/components/icons'; import { useDashboardStore } from '@/config/store'; import { GraphQL } from '@/lib/api'; -import { Icons } from '@/components/icons'; import { UserDetailsQryDoc } from '../[entityType]/[entitySlug]/schema'; import { allOrganizationsListingDoc } from '../[entityType]/schema'; import Sidebar from './sidebar'; @@ -39,15 +34,13 @@ const profileLinks = [ export function MainNav({ hideSearch = false }) { const pathname = usePathname(); + const router = useRouter(); + const [isOpen, setIsOpen] = useState(false); const [isLoggingOut, setIsLoggingOut] = React.useState(false); - const searchRef = React.useRef(null); const { data: session, status } = useSession(); - const [commandOpen, setCommandOpen] = React.useState(false); - const { setUserDetails, setAllEntityDetails, userDetails, allEntityDetails } = - useDashboardStore(); + const { setUserDetails, setAllEntityDetails } = useDashboardStore(); - useMetaKeyPress('k', () => setCommandOpen((e) => !e)); async function keycloakSessionLogOut() { try { @@ -125,6 +118,13 @@ export function MainNav({ hideSearch = false }) { }, ]; + const handleSearch = (value: string) => { + if (value) { + setIsOpen(false); + + router.push(`/datasets?query=${encodeURIComponent(value)}`); + } + }; return (