= z.lazy(() =>
z.object({
title: z.string(),
@@ -36,10 +35,16 @@ export const NAV_DATA: NavData = [
items: [],
},
{
- title: "Companies",
- url: "/companies",
+ title: "Manage Companies",
icon: Icons.Building,
- items: [],
+ items: [
+ { Icons: Icons.Building, url: "/companies", title: "Companies" },
+ {
+ Icons: Icons.Building,
+ url: "/companies/categories",
+ title: "Company Categories",
+ },
+ ],
},
{
title: "Customers",
diff --git a/src/components/Tables/companies/company-categories/index.tsx b/src/components/Tables/companies/company-categories/index.tsx
new file mode 100644
index 0000000..6f2129d
--- /dev/null
+++ b/src/components/Tables/companies/company-categories/index.tsx
@@ -0,0 +1,135 @@
+"use client";
+import { PencilSquareIcon, TrashIcon } from "@/assets/icons";
+import { Switch } from "@/components/FormElements/switch";
+import ConfirmationModal from "@/components/ui/ConfirmationModal";
+import IsVisible from "@/components/ui/IsVisible";
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/components/ui/table";
+import TableSkeleton from "@/components/ui/TableSkeleton";
+import { unixToDate } from "@/utils/shared";
+import Link from "next/link";
+import { Skeleton } from "../../../ui/skeleton";
+import useCompanyCategoriesPresenter from "./useCompanyCategoriesPresenter";
+
+const CompanyCategoriesTable = () => {
+ const {
+ categories,
+ isLoading,
+ pathName,
+ router,
+ currentCategory,
+ isToggling,
+ togglePublished,
+ onConfirmDelete,
+ setCurrentCategory,
+ isModalOpen,
+ setIsModalOpen,
+ } = useCompanyCategoriesPresenter();
+
+ return (
+
+
+
+
+
+ Row
+ Title
+ Description
+ Created at
+ Published
+ Actions
+
+
+ {isLoading && }
+
+
+
+
+ No category found
+
+
+
+
+ {categories?.map((category, index) => {
+ return (
+
+ {index + 1}
+ {category.name}
+ {category.description}
+
+ {unixToDate(category.created_at)}
+
+
+
+
+
+
+ {
+ togglePublished(category.id);
+ }}
+ checked={category.published}
+ onToggle={(e) => {
+ console.log(e);
+ }}
+ />
+
+
+
+
+
+
+
+
+
+ );
+ })}
+
+
+
+ {isModalOpen && (
+
{
+ onConfirmDelete();
+ }}
+ onCancel={() => setIsModalOpen(false)}
+ />
+ )}
+
+ );
+};
+
+export default CompanyCategoriesTable;
diff --git a/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts b/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts
new file mode 100644
index 0000000..472ac58
--- /dev/null
+++ b/src/components/Tables/companies/company-categories/useCompanyCategoriesPresenter.ts
@@ -0,0 +1,47 @@
+"use client";
+import { apiDefaultParams } from "@/constants/Api_Params";
+import {
+ useCompanyCategoriesQuery,
+ useDeleteCompanyCategoryQuery,
+ useToggleCompanyCategoryPublished,
+} from "@/hooks/queries";
+import { TCompanyCategory } from "@/lib/api";
+import { usePathname, useRouter } from "next/navigation";
+import { useState } from "react";
+
+const useCompanyCategoriesPresenter = () => {
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const [currentCategory, setCurrentCategory] = useState
();
+ const [params, setParams] = useState>({
+ ...apiDefaultParams,
+ });
+ const router = useRouter();
+ const pathName = usePathname();
+ const { data, isLoading, isError } = useCompanyCategoriesQuery(params);
+ const { mutate: deleteCategory } = useDeleteCompanyCategoryQuery(() =>
+ setIsModalOpen(false),
+ );
+ const {mutate:togglePublished,isPending:isToggling} = useToggleCompanyCategoryPublished()
+ const onConfirmDelete = () => {
+ if (!currentCategory) return;
+ deleteCategory(currentCategory?.id);
+ };
+ return {
+ categories: data?.data.categories,
+ isModalOpen,
+ setIsModalOpen,
+ isLoading,
+ isError,
+ pathName,
+ router,
+ params,
+ setParams,
+ currentCategory,
+ togglePublished,
+ isToggling,
+ setCurrentCategory,
+ onConfirmDelete,
+ };
+};
+
+export default useCompanyCategoriesPresenter;
diff --git a/src/components/Tables/tenders/index.tsx b/src/components/Tables/tenders/index.tsx
index bcc84da..aa43cff 100644
--- a/src/components/Tables/tenders/index.tsx
+++ b/src/components/Tables/tenders/index.tsx
@@ -1,6 +1,5 @@
"use client";
-import useTenderListPresenter from "./useTenderListPresenter";
import Status from "@/components/ui/Status";
import {
Table,
@@ -10,13 +9,12 @@ import {
TableHeader,
TableRow,
} from "@/components/ui/table";
+import useTenderListPresenter from "./useTenderListPresenter";
-import { TendersSkeleton } from "./Skeleton";
-import { cn } from "@/lib/utils";
-import { getStatusColor } from "@/utils/shared";
import { ExclamationIcon } from "@/assets/icons";
import Pagination from "@/components/ui/pagination";
-import Page from "../../../app/forms/form-layout/page";
+import TableSkeleton from "@/components/ui/TableSkeleton";
+import { cn } from "@/lib/utils";
import Link from "next/link";
const TendersTable = () => {
const { allTenders, isPending, router, pathName, setParams } =
@@ -27,9 +25,9 @@ const TendersTable = () => {
- {/*
+
Row
- */}
+
Title
@@ -49,7 +47,7 @@ const TendersTable = () => {
- {isPending && }
+ {isPending && }
{allTenders?.data.tenders?.map((item, index) =>
!item ? (
@@ -59,9 +57,9 @@ const TendersTable = () => {
key={item.id}
className="odd:bg-gray-2 dark:odd:bg-gray-7"
>
- {/*
+
{index + 1}
- */}
+
{item.title}
diff --git a/src/components/Tables/tenders/useTenderListPresenter.ts b/src/components/Tables/tenders/useTenderListPresenter.ts
index b5b071e..9c43feb 100644
--- a/src/components/Tables/tenders/useTenderListPresenter.ts
+++ b/src/components/Tables/tenders/useTenderListPresenter.ts
@@ -1,11 +1,11 @@
"use client";
import { ConfirmationModalProps } from "@/components/ui/ConfirmationModal";
+import { apiDefaultParams } from "@/constants/Api_Params";
import { useTendersQuery } from "@/hooks/queries";
import useDebounce from "@/hooks/useDebounce";
import { TCustomer } from "@/lib/api";
import { usePathname, useRouter } from "next/navigation";
-import { useEffect, useRef, useState } from "react";
-import { useInView } from "react-intersection-observer";
+import { useEffect, useState } from "react";
import { z } from "zod";
const useTenderListPresenter = () => {
const [isModalOpen, setIsModalOpen] = useState(false);
@@ -15,15 +15,13 @@ const useTenderListPresenter = () => {
Partial
>({});
const [params, setParams] = useState>({
- sort: "created_at",
+ ...apiDefaultParams,
});
const router = useRouter();
const debouncedSearch = useDebounce(search, 1000);
const pathName = usePathname();
const { data, error, isPending } = useTendersQuery(params);
- const { ref, inView } = useInView({ threshold: 0.5 });
-
useEffect(() => {
const result = z.string().safeParse(debouncedSearch);
if (result.success) {
@@ -36,14 +34,8 @@ const useTenderListPresenter = () => {
const handleFilterChange = (e: React.ChangeEvent) => {
setSearch(e.target.value);
};
- // const onConfirmDelete = () => {
- // if (currentTender) {
- // deleteTender(currentTender.id);
- // }
- // };
return {
- ref,
currentTender,
setCurrentTender,
search,
diff --git a/src/components/forms/companies/CreateCompany.tsx b/src/components/forms/companies/CreateCompany.tsx
index 834a7e5..69ac8e1 100644
--- a/src/components/forms/companies/CreateCompany.tsx
+++ b/src/components/forms/companies/CreateCompany.tsx
@@ -1,15 +1,14 @@
"use client";
+import { GlobeIcon, MoneyIcon } from "@/assets/icons";
+import InputGroup from "@/components/FormElements/InputGroup";
+import { TextAreaGroup } from "@/components/FormElements/InputGroup/text-area";
+import { Select } from "@/components/FormElements/select";
+import { ShowcaseSection } from "@/components/Layouts/showcase-section";
+import FormFooter from "@/components/ui/FormFooter";
+import { PHONE_REGEX } from "@/constants/regex";
+import { FormErrorMessages } from "@/constants/Texts";
import { ICreateCompanyCredentials } from "@/lib/api/types/Company";
import useCreateCompanyPresenter from "./useCreateCompanyPresenter";
-import { ShowcaseSection } from "@/components/Layouts/showcase-section";
-import { title } from "process";
-import InputGroup from "@/components/FormElements/InputGroup";
-import { FormErrorMessages } from "@/constants/Texts";
-import { Select } from "@/components/FormElements/select";
-import { CurrencyIcon, GlobeIcon, MoneyIcon } from "@/assets/icons";
-import MultiSelect from "@/components/FormElements/MultiSelect";
-import { TextAreaGroup } from "@/components/FormElements/InputGroup/text-area";
-import { PHONE_REGEX } from "@/constants/regex";
interface IProps {
editMode?: boolean;
@@ -18,21 +17,12 @@ interface IProps {
}
const CreateCompany = ({ defaultValues, editMode, id }: IProps) => {
- const {
- errors,
- handleCancel,
- handleSubmit,
- isCreating,
- isMutating,
- isUpdating,
- onSubmit,
- router,
- register,
- } = useCreateCompanyPresenter({
- editMode,
- defaultValues,
- id,
- });
+ const { errors, handleSubmit, onSubmit, register } =
+ useCreateCompanyPresenter({
+ editMode,
+ defaultValues,
+ id,
+ });
return (
);
};
diff --git a/src/components/forms/companies/company-categories/CreateCompanyCategory.tsx b/src/components/forms/companies/company-categories/CreateCompanyCategory.tsx
new file mode 100644
index 0000000..6cd7c5d
--- /dev/null
+++ b/src/components/forms/companies/company-categories/CreateCompanyCategory.tsx
@@ -0,0 +1,78 @@
+"use client";
+import InputGroup from "@/components/FormElements/InputGroup";
+import { TextAreaGroup } from "@/components/FormElements/InputGroup/text-area";
+import { ShowcaseSection } from "@/components/Layouts/showcase-section";
+import FormFooter from "@/components/ui/FormFooter";
+import { FormErrorMessages } from "@/constants/Texts";
+import { TCreateCompanyCategoryCredentials } from "@/lib/api";
+import useCreateCompanyCategoryPresenter from "./useCreateCompanyCategoryPresenter";
+
+interface IProps {
+ editMode?: boolean;
+ defaultValues?: TCreateCompanyCategoryCredentials;
+ id?: string;
+}
+
+const CreateCompanyCategoryForm = ({ defaultValues, editMode, id }: IProps) => {
+ const { errors, handleSubmit, onSubmit, register } =
+ useCreateCompanyCategoryPresenter({ defaultValues, editMode, id });
+ return (
+
+ );
+};
+
+export default CreateCompanyCategoryForm;
diff --git a/src/components/forms/companies/company-categories/useCreateCompanyCategoryPresenter.ts b/src/components/forms/companies/company-categories/useCreateCompanyCategoryPresenter.ts
new file mode 100644
index 0000000..9da5c7a
--- /dev/null
+++ b/src/components/forms/companies/company-categories/useCreateCompanyCategoryPresenter.ts
@@ -0,0 +1,48 @@
+"use client";
+import {
+ useCreateCompanyCategory,
+ useUpdateCompanyCategories,
+} from "@/hooks/queries";
+import { TCreateCompanyCategoryCredentials } from "@/lib/api";
+import { useRouter } from "next/navigation";
+import { SubmitHandler, useForm } from "react-hook-form";
+
+interface IProps {
+ editMode?: boolean;
+ defaultValues?: TCreateCompanyCategoryCredentials;
+ id?: string;
+}
+
+const useCreateCompanyCategoryPresenter = ({
+ defaultValues,
+ editMode,
+ id,
+}: IProps) => {
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ } = useForm({
+ mode: "onChange",
+ defaultValues,
+ });
+ const router = useRouter();
+ const { mutate } = useCreateCompanyCategory();
+ const { mutate: editCategory } = useUpdateCompanyCategories(id as string);
+ const onSubmit: SubmitHandler = (data) => {
+ if (editMode) {
+ editCategory({ id: id as string, credentials: data });
+ } else {
+ mutate(data);
+ }
+ };
+ return {
+ register,
+ onSubmit,
+ handleSubmit,
+ errors,
+ router,
+ };
+};
+
+export default useCreateCompanyCategoryPresenter;
diff --git a/src/components/ui/ConfirmationModal.tsx b/src/components/ui/ConfirmationModal.tsx
index 6617134..38a0f15 100644
--- a/src/components/ui/ConfirmationModal.tsx
+++ b/src/components/ui/ConfirmationModal.tsx
@@ -1,4 +1,5 @@
"use client";
+import { useIsMutating } from "@tanstack/react-query";
import React, { useEffect, useState } from "react";
import { createPortal } from "react-dom";
import { z } from "zod";
@@ -23,6 +24,7 @@ export type ConfirmationModalProps = z.infer<
>;
const ConfirmationModal: React.FC = (props) => {
+ const isMutating = useIsMutating();
const validatedProps = ConfirmationModalPropsSchema.parse(props);
const {
isOpen,
@@ -107,7 +109,7 @@ const ConfirmationModal: React.FC = (props) => {
-
+
-
+