From 2178f25af5ad2f00d32ec58417f4f798a02ed7c2 Mon Sep 17 00:00:00 2001 From: AmirReza Jamali Date: Wed, 13 May 2026 08:55:40 +0330 Subject: [PATCH] feat(tender-details): enhance document handling and navigation in tender details - Added a new documents section to the tender details page, improving organization and visibility of related documents. - Updated the tender navigation items to conditionally include the documents section based on the loading state and document availability. - Refactored the TenderDetailsContent component to manage document loading states and conditionally render the documents section. - Enhanced the getTenderNavItems utility to accept options for showing the documents section, improving flexibility in navigation rendering. --- .env.production | 2 +- .../components/tender-details-content.tsx | 15 +++++++++----- src/app/tenders/[details]/page.tsx | 20 ++++++++++++++----- src/app/tenders/[details]/tender-nav-utils.ts | 12 ++++++++--- .../Tables/admins/useAdminsPresenter.ts | 5 ++++- .../Tables/tenders/TenderListFilters.tsx | 12 +++++++++-- 6 files changed, 49 insertions(+), 17 deletions(-) diff --git a/.env.production b/.env.production index 7ba8c83..a081354 100644 --- a/.env.production +++ b/.env.production @@ -1,4 +1,4 @@ -NEXT_PUBLIC_APP_VERSION=2.0.3 +NEXT_PUBLIC_APP_VERSION=2.1.0 NEXT_PUBLIC_TOAST_AUTO_CLOSE_DURATION=2500 NEXT_PUBLIC_FIREBASE_API_KEY=AIzaSyCTjdsk2jE34IfnvSKP1JMTIf_Abd7tbt0 NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=opplens-270d1.firebaseapp.com diff --git a/src/app/tenders/[details]/components/tender-details-content.tsx b/src/app/tenders/[details]/components/tender-details-content.tsx index 9605e0d..d54b431 100644 --- a/src/app/tenders/[details]/components/tender-details-content.tsx +++ b/src/app/tenders/[details]/components/tender-details-content.tsx @@ -21,6 +21,8 @@ type TenderDetailsContentProps = { tenderId: string; documents: TTenderDocumentsResponse[]; documentsLoading: boolean; + /** False once documents have loaded and the list is empty — section and nav are omitted. */ + showDocumentsSection: boolean; }; export function TenderDetailsContent({ @@ -30,6 +32,7 @@ export function TenderDetailsContent({ tenderId, documents, documentsLoading, + showDocumentsSection, }: TenderDetailsContentProps) { const showLocation = shouldShowLocationSection(tender); @@ -54,11 +57,13 @@ export function TenderDetailsContent({ {showLocation && } - + {showDocumentsSection && ( + + )} diff --git a/src/app/tenders/[details]/page.tsx b/src/app/tenders/[details]/page.tsx index ac11fb3..dfe4e7f 100644 --- a/src/app/tenders/[details]/page.tsx +++ b/src/app/tenders/[details]/page.tsx @@ -41,9 +41,20 @@ const TenderDetails = ({ params }: IProps) => { ]; const tenderForNav = data?.data; + const { data: documentsResponse, isPending: isDocumentsLoading } = + useGetTenderDocumentsQuery(details); + const documents = documentsResponse?.data ?? []; + const showDocumentsSection = + isDocumentsLoading || documents.length > 0; + const tenderNavItems = useMemo( - () => (tenderForNav ? getTenderNavItems(tenderForNav) : []), - [tenderForNav], + () => + tenderForNav + ? getTenderNavItems(tenderForNav, { + showDocuments: showDocumentsSection, + }) + : [], + [tenderForNav, showDocumentsSection], ); const sectionIds = useMemo( @@ -51,8 +62,6 @@ const TenderDetails = ({ params }: IProps) => { [tenderNavItems], ); const activeSectionId = useTenderSectionScrollSpy(sectionIds); - const { data: documentsResponse, isPending: isDocumentsLoading } = - useGetTenderDocumentsQuery(details); const handleLanguageChange = useCallback( (event: React.ChangeEvent) => { const nextParams = new URLSearchParams(searchParams.toString()); @@ -108,8 +117,9 @@ const TenderDetails = ({ params }: IProps) => { tenderNavItems={tenderNavItems} activeSectionId={activeSectionId} tenderId={details} - documents={documentsResponse?.data ?? []} + documents={documents} documentsLoading={isDocumentsLoading} + showDocumentsSection={showDocumentsSection} /> diff --git a/src/app/tenders/[details]/tender-nav-utils.ts b/src/app/tenders/[details]/tender-nav-utils.ts index 9330f44..97a92ad 100644 --- a/src/app/tenders/[details]/tender-nav-utils.ts +++ b/src/app/tenders/[details]/tender-nav-utils.ts @@ -18,8 +18,12 @@ function analyzeLocationVisibility(tender: TTenderDetails) { return { showLocation }; } -export function getTenderNavItems(tender: TTenderDetails): TenderNavItem[] { +export function getTenderNavItems( + tender: TTenderDetails, + options?: { showDocuments?: boolean }, +): TenderNavItem[] { const { showLocation } = analyzeLocationVisibility(tender); + const showDocuments = options?.showDocuments ?? true; const items: TenderNavItem[] = [ { id: TENDER_SECTION_IDS.procurement, label: "Procurement" }, @@ -31,9 +35,11 @@ export function getTenderNavItems(tender: TTenderDetails): TenderNavItem[] { label: "Location & currency", }); } + items.push({ id: TENDER_SECTION_IDS.translation, label: "Translation" }); + if (showDocuments) { + items.push({ id: TENDER_SECTION_IDS.documents, label: "Documents" }); + } items.push( - { id: TENDER_SECTION_IDS.translation, label: "Translation" }, - { id: TENDER_SECTION_IDS.documents, label: "Documents" }, { id: TENDER_SECTION_IDS.description, label: "Description" }, { id: TENDER_SECTION_IDS.aiSummary, label: "AI summary" }, ); diff --git a/src/components/Tables/admins/useAdminsPresenter.ts b/src/components/Tables/admins/useAdminsPresenter.ts index 2d8e006..1d9666f 100644 --- a/src/components/Tables/admins/useAdminsPresenter.ts +++ b/src/components/Tables/admins/useAdminsPresenter.ts @@ -58,7 +58,10 @@ export const useAdminsPresenter = () => { setParams(newParams); filterFormReset(newParams); }, [searchParams, filterFormReset]); - const { data, isPending } = useGetAdminListQuery({ ...params, ...apiDefaultParams }); + const { data, isPending } = useGetAdminListQuery({ + ...apiDefaultParams, + ...params, + }); const shouldShowPagination = !isPending && (data?.meta?.pages ?? 1) * (data?.meta?.limit ?? 10) > 10; const { mutate: deleteAdmin } = useDeleteAdmin(() => { diff --git a/src/components/Tables/tenders/TenderListFilters.tsx b/src/components/Tables/tenders/TenderListFilters.tsx index 74f08a1..832bc3c 100644 --- a/src/components/Tables/tenders/TenderListFilters.tsx +++ b/src/components/Tables/tenders/TenderListFilters.tsx @@ -1,6 +1,9 @@ +import { GlobeIcon } from "@/assets/icons"; import DatePicker from "@/components/FormElements/DatePicker/DatePicker"; import InputGroup from "@/components/FormElements/InputGroup"; +import { Select } from "@/components/FormElements/select"; import { Button } from "@/components/ui-elements/button"; +import { Countries } from "@/constants/countries"; import { Control, FieldValues, @@ -55,11 +58,16 @@ const TenderListFilters = ({ type="text" /> - {...filterRegister("country")} name="country" label="country" - type="text" + items={Countries} + placeholder="Country" + clearable + prefixIcon={} + value={watch("country")} + onClear={() => setValue("country", "")} />