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", "")}
/>