diff --git a/.env.example b/.env.example index 9cace29..8f59e4e 100644 --- a/.env.example +++ b/.env.example @@ -1 +1 @@ -NEXT_PUBLIC_API_URL=http://your.api/api \ No newline at end of file +NEXT_PUBLIC_API_URL=http://test.crm.logidex.ru/api diff --git a/src/app/clients/components/desktop/ClientDesktopHeader/ClientDesktopHeader.tsx b/src/app/clients/components/desktop/ClientDesktopHeader/ClientDesktopHeader.tsx index d495c33..e329183 100644 --- a/src/app/clients/components/desktop/ClientDesktopHeader/ClientDesktopHeader.tsx +++ b/src/app/clients/components/desktop/ClientDesktopHeader/ClientDesktopHeader.tsx @@ -1,7 +1,7 @@ import { FC } from "react"; import { Group, TextInput } from "@mantine/core"; import { useClientsContext } from "@/app/clients/contexts/ClientsContext"; -import useClientsActions from "@/app/clients/hooks/useClientsActions"; +import useClientsActions from "@/app/clients/hooks/utils/useClientsActions"; import InlineButton from "@/components/ui/InlineButton/InlineButton"; const ClientDesktopHeader: FC = () => { diff --git a/src/app/clients/components/mobile/ClientMobileHeader/ClientMobileHeader.tsx b/src/app/clients/components/mobile/ClientMobileHeader/ClientMobileHeader.tsx index c2f9db3..8038e28 100644 --- a/src/app/clients/components/mobile/ClientMobileHeader/ClientMobileHeader.tsx +++ b/src/app/clients/components/mobile/ClientMobileHeader/ClientMobileHeader.tsx @@ -1,7 +1,7 @@ import { FC } from "react"; import { Flex, TextInput } from "@mantine/core"; import { useClientsContext } from "@/app/clients/contexts/ClientsContext"; -import useClientsActions from "@/app/clients/hooks/useClientsActions"; +import useClientsActions from "@/app/clients/hooks/utils/useClientsActions"; import InlineButton from "@/components/ui/InlineButton/InlineButton"; const ClientMobileHeader: FC = () => { diff --git a/src/app/clients/components/shared/ClientsTable/ClientsTable.tsx b/src/app/clients/components/shared/ClientsTable/ClientsTable.tsx index b73437f..83da9c8 100644 --- a/src/app/clients/components/shared/ClientsTable/ClientsTable.tsx +++ b/src/app/clients/components/shared/ClientsTable/ClientsTable.tsx @@ -3,18 +3,32 @@ import { FC } from "react"; import { useClientsTableColumns } from "@/app/clients/components/shared/ClientsTable/columns"; import { useClientsContext } from "@/app/clients/contexts/ClientsContext"; -import useClientsActions from "@/app/clients/hooks/useClientsActions"; +import useClientsActions from "@/app/clients/hooks/utils/useClientsActions"; +import { useProjectsContext } from "@/app/deals/contexts/ProjectsContext"; import BaseTable from "@/components/ui/BaseTable/BaseTable"; +import { useDrawersContext } from "@/drawers/DrawersContext"; import useIsMobile from "@/hooks/utils/useIsMobile"; +import { ClientSchema } from "@/lib/client"; const ClientsTable: FC = () => { const isMobile = useIsMobile(); + const { modulesSet } = useProjectsContext(); const { clientsCrud, clients } = useClientsContext(); const { onUpdateClick } = useClientsActions(); + const { openDrawer } = useDrawersContext(); + + const onOpenMarketplacesList = (client: ClientSchema) => { + openDrawer({ + key: "clientMarketplaceDrawer", + props: { client }, + }); + }; const columns = useClientsTableColumns({ onDelete: clientsCrud.onDelete, onChange: onUpdateClick, + onOpenMarketplacesList, + modulesSet, }); return ( diff --git a/src/app/clients/components/shared/ClientsTable/columns.tsx b/src/app/clients/components/shared/ClientsTable/columns.tsx index 368c121..0bc2d59 100644 --- a/src/app/clients/components/shared/ClientsTable/columns.tsx +++ b/src/app/clients/components/shared/ClientsTable/columns.tsx @@ -1,15 +1,24 @@ import { useMemo } from "react"; +import { IconBasket } from "@tabler/icons-react"; import { DataTableColumn } from "mantine-datatable"; import { Center } from "@mantine/core"; import UpdateDeleteTableActions from "@/components/ui/BaseTable/components/UpdateDeleteTableActions"; import { ClientSchema } from "@/lib/client"; +import { ModuleNames } from "@/modules/modules"; type Props = { onChange: (client: ClientSchema) => void; onDelete: (client: ClientSchema) => void; + onOpenMarketplacesList: (client: ClientSchema) => void; + modulesSet: Set; }; -export const useClientsTableColumns = ({ onChange, onDelete }: Props) => { +export const useClientsTableColumns = ({ + onChange, + onDelete, + onOpenMarketplacesList, + modulesSet, +}: Props) => { return useMemo( () => [ @@ -21,6 +30,17 @@ export const useClientsTableColumns = ({ onChange, onDelete }: Props) => { onDelete(client)} onChange={() => onChange(client)} + otherActions={[ + { + label: "Маркетплейсы", + icon: , + onClick: () => + onOpenMarketplacesList(client), + hidden: !modulesSet.has( + ModuleNames.FULFILLMENT_BASE + ), + }, + ]} /> ), }, diff --git a/src/app/clients/contexts/ClientsContext.tsx b/src/app/clients/contexts/ClientsContext.tsx index 4b74d14..fed7c9e 100644 --- a/src/app/clients/contexts/ClientsContext.tsx +++ b/src/app/clients/contexts/ClientsContext.tsx @@ -4,11 +4,11 @@ import { Dispatch, SetStateAction } from "react"; import { ClientsCrud, useClientsCrud, -} from "@/app/clients/hooks/useClientsCrud"; -import useClientsFilter from "@/app/clients/hooks/useClientsFilter"; -import useClientsList from "@/app/clients/hooks/useClientsList"; +} from "@/app/clients/hooks/cruds/useClientsCrud"; +import useClientsFilter from "@/app/clients/hooks/utils/useClientsFilter"; import { ClientSchema } from "@/lib/client"; import makeContext from "@/lib/contextFactory/contextFactory"; +import useClientsList from "../hooks/lists/useClientsList"; type ClientsContextState = { clients: ClientSchema[]; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/ClientMarketplacesDrawer.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/ClientMarketplacesDrawer.tsx new file mode 100644 index 0000000..5ecfc62 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/ClientMarketplacesDrawer.tsx @@ -0,0 +1,50 @@ +"use client"; + +import React, { FC } from "react"; +import { Drawer } from "@mantine/core"; +import DrawerBody from "@/app/clients/drawers/ClientMarketplacesDrawer/components/DrawerBody"; +import { MarketplacesContextProvider } from "@/app/clients/drawers/ClientMarketplacesDrawer/contexts/MarketplacesContext"; +import { DrawerProps } from "@/drawers/types"; +import useIsMobile from "@/hooks/utils/useIsMobile"; +import { ClientSchema } from "@/lib/client"; + +type Props = { + client: ClientSchema; +}; + +const ClientMarketplaceDrawer: FC> = ({ + opened, + onClose, + props, +}) => { + const isMobile = useIsMobile(); + + return ( + + + + + + ); +}; + +export default ClientMarketplaceDrawer; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/BaseMarketplaceSelect.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/BaseMarketplaceSelect.tsx new file mode 100644 index 0000000..8d928ea --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/BaseMarketplaceSelect.tsx @@ -0,0 +1,53 @@ +import { FC } from "react"; +import { + ActionIcon, + ComboboxItem, + ComboboxLikeRenderOptionInput, + Image, +} from "@mantine/core"; +import useBaseMarketplacesList from "@/app/clients/hooks/lists/useBaseMarketplacesList"; +import ObjectSelect, { + ObjectSelectProps, +} from "@/components/selects/ObjectSelect/ObjectSelect"; +import { BaseMarketplaceSchema } from "@/lib/client"; + +type Props = Omit< + ObjectSelectProps, + "data" | "getValueFn" | "getLabelFn" +>; + +const BaseMarketplaceSelect: FC = props => { + const { baseMarketplaces } = useBaseMarketplacesList(); + + const renderOption = ( + baseMarketplace: ComboboxLikeRenderOptionInput + ) => ( + <> + + + baseMarketplace.option.value === + el.id.toString() + )?.iconUrl || "" + } + /> + + {baseMarketplace.option.label} + + ); + + return ( + baseMarketplace.id.toString()} + getLabelFn={baseMarketplace => baseMarketplace.name} + data={baseMarketplaces} + {...props} + /> + ); +}; +export default BaseMarketplaceSelect; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/DrawerBody.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/DrawerBody.tsx new file mode 100644 index 0000000..3ae72c9 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/DrawerBody.tsx @@ -0,0 +1,18 @@ +import React from "react"; +import { Flex } from "@mantine/core"; +import MarketplacesHeader from "@/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesHeader"; +import MarketplacesTable from "@/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesTable"; + +const DrawerBody = () => { + return ( + + + + + ); +}; + +export default DrawerBody; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/MarketplaceAuthDataInput.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/MarketplaceAuthDataInput.tsx new file mode 100644 index 0000000..6b91c0d --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/MarketplaceAuthDataInput.tsx @@ -0,0 +1,21 @@ +import { FC } from "react"; +import BaseMarketplaceType from "@/modules/dealModularEditorTabs/FulfillmentBase/shared/types/baseMarketplaceType"; +import OzonInputs from "./components/OzonInputs"; +import WildberriesInputs from "./components/WildberriesInputs"; +import YandexMarketInputs from "./components/YandexMarketInputs"; +import MpAuthDataInputProps from "./types/MpAuthDataInputProps"; + +const MarketplaceAuthDataInput: FC = props => { + switch (props.baseMarketplace.id) { + case BaseMarketplaceType.WILDBERRIES: + return ; + case BaseMarketplaceType.OZON: + return ; + case BaseMarketplaceType.YANDEX_MARKET: + return ; + default: + return <>; + } +}; + +export default MarketplaceAuthDataInput; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/OzonInputs.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/OzonInputs.tsx new file mode 100644 index 0000000..d240277 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/OzonInputs.tsx @@ -0,0 +1,39 @@ +import { FC } from "react"; +import { omit } from "lodash"; +import { NumberInput, TextInput } from "@mantine/core"; +import MpAuthDataInputProps from "../types/MpAuthDataInputProps"; + +const OzonInputs: FC = props => { + const restProps = omit(props, ["baseMarketplace"]); + + return ( + <> + + props.onChange({ + ...props.value, + "Client-Id": value.toString(), + }) + } + /> + + props.onChange({ + ...props.value, + "Api-Key": value.target.value, + }) + } + /> + + ); +}; + +export default OzonInputs; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/WildberriesInputs.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/WildberriesInputs.tsx new file mode 100644 index 0000000..53b5780 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/WildberriesInputs.tsx @@ -0,0 +1,25 @@ +import { FC } from "react"; +import { omit } from "lodash"; +import { TextInput } from "@mantine/core"; +import MpAuthDataInputProps from "../types/MpAuthDataInputProps"; + +const WildberriesInputs: FC = props => { + const restProps = omit(props, ["baseMarketplace"]); + + return ( + + props.onChange({ + ...props.value, + Authorization: value.target.value, + }) + } + /> + ); +}; + +export default WildberriesInputs; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/YandexMarketInputs.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/YandexMarketInputs.tsx new file mode 100644 index 0000000..aac64b1 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/components/YandexMarketInputs.tsx @@ -0,0 +1,25 @@ +import { FC } from "react"; +import { omit } from "lodash"; +import { TextInput } from "@mantine/core"; +import MpAuthDataInputProps from "../types/MpAuthDataInputProps"; + +const YandexMarketInputs: FC = props => { + const restProps = omit(props, ["baseMarketplace"]); + + return ( + { + props.onChange({ + ...props.value, + "Api-Key": value.target.value, + }); + }} + /> + ); +}; + +export default YandexMarketInputs; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/types/MpAuthDataInputProps.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/types/MpAuthDataInputProps.tsx new file mode 100644 index 0000000..6595680 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/types/MpAuthDataInputProps.tsx @@ -0,0 +1,12 @@ +import BaseFormInputProps from "@/utils/baseFormInputProps"; +import { BaseMarketplaceSchema } from "@/lib/client"; + +type RestProps = { + baseMarketplace: BaseMarketplaceSchema; +}; + +type MarketplaceAuthData = Record; + +type MpAuthDataInputProps = BaseFormInputProps & RestProps; + +export default MpAuthDataInputProps; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesHeader.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesHeader.tsx new file mode 100644 index 0000000..615cee0 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesHeader.tsx @@ -0,0 +1,26 @@ +"use client"; + +import { IconPlus } from "@tabler/icons-react"; +import { Group } from "@mantine/core"; +import useMarketplacesActions from "@/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplaceActions"; +import InlineButton from "@/components/ui/InlineButton/InlineButton"; +import useIsMobile from "@/hooks/utils/useIsMobile"; + +const MarketplacesHeader = () => { + const { onCreateClick } = useMarketplacesActions(); + const isMobile = useIsMobile(); + + return ( + + + + Создать + + + ); +}; + +export default MarketplacesHeader; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesTable.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesTable.tsx new file mode 100644 index 0000000..31580ca --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplacesTable.tsx @@ -0,0 +1,44 @@ +"use client"; + +import { IconMoodSad } from "@tabler/icons-react"; +import { Group, Text } from "@mantine/core"; +import { useMarketplacesContext } from "@/app/clients/drawers/ClientMarketplacesDrawer/contexts/MarketplacesContext"; +import useMarketplacesActions from "@/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplaceActions"; +import { useMarketplacesTableColumns } from "@/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplacesTableColumns"; +import BaseTable from "@/components/ui/BaseTable/BaseTable"; +import useIsMobile from "@/hooks/utils/useIsMobile"; + +const MarketplacesTable = () => { + const isMobile = useIsMobile(); + const { onUpdateClick } = useMarketplacesActions(); + const { marketplaces, marketplacesCrud } = useMarketplacesContext(); + + const columns = useMarketplacesTableColumns({ + onChange: onUpdateClick, + onDelete: marketplacesCrud.onDelete, + }); + + return ( + + Нет маркетплейсов + + + } + /> + ); +}; + +export default MarketplacesTable; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/contexts/MarketplacesContext.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/contexts/MarketplacesContext.tsx new file mode 100644 index 0000000..34be913 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/contexts/MarketplacesContext.tsx @@ -0,0 +1,41 @@ +"use client"; + +import { + MarketplacesCrud, + useMarketplacesCrud, +} from "@/app/clients/hooks/cruds/useMarketplacesCrud"; +import useMarketplacesList from "@/app/clients/hooks/lists/useMarketplacesList"; +import { ClientSchema, MarketplaceSchema } from "@/lib/client"; +import makeContext from "@/lib/contextFactory/contextFactory"; + +type MarketplacesContextState = { + client: ClientSchema; + marketplaces: MarketplaceSchema[]; + refetchMarketplaces: () => void; + marketplacesCrud: MarketplacesCrud; +}; + +type Props = { + client: ClientSchema; +}; + +const useMarketplacesContextState = ({ + client, +}: Props): MarketplacesContextState => { + const marketplacesList = useMarketplacesList({ clientId: client.id }); + + const marketplacesCrud = useMarketplacesCrud(marketplacesList); + + return { + client, + marketplaces: marketplacesList.marketplaces, + refetchMarketplaces: marketplacesList.refetch, + marketplacesCrud, + }; +}; + +export const [MarketplacesContextProvider, useMarketplacesContext] = + makeContext( + useMarketplacesContextState, + "Marketplaces" + ); diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplaceActions.ts b/src/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplaceActions.ts new file mode 100644 index 0000000..5e63792 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplaceActions.ts @@ -0,0 +1,39 @@ +import { modals } from "@mantine/modals"; +import { useMarketplacesContext } from "@/app/clients/drawers/ClientMarketplacesDrawer/contexts/MarketplacesContext"; +import { MarketplaceSchema } from "@/lib/client"; + +const useMarketplacesActions = () => { + const { marketplacesCrud, client } = useMarketplacesContext(); + + const onCreateClick = () => { + modals.openContextModal({ + modal: "marketplaceEditorModal", + title: "Создание маркетплейса", + innerProps: { + onCreate: values => + marketplacesCrud.onCreate({ ...values, client }), + isEditing: false, + }, + }); + }; + + const onUpdateClick = (marketplace: MarketplaceSchema) => { + modals.openContextModal({ + modal: "marketplaceEditorModal", + title: "Редактирование маркетплейса", + innerProps: { + onChange: updates => + marketplacesCrud.onUpdate(marketplace.id, updates), + entity: marketplace, + isEditing: true, + }, + }); + }; + + return { + onCreateClick, + onUpdateClick, + }; +}; + +export default useMarketplacesActions; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplacesTableColumns.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplacesTableColumns.tsx new file mode 100644 index 0000000..2beb42b --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/hooks/useMarketplacesTableColumns.tsx @@ -0,0 +1,48 @@ +import { useMemo } from "react"; +import { DataTableColumn } from "mantine-datatable"; +import { ActionIcon, Center, Flex, Image } from "@mantine/core"; +import UpdateDeleteTableActions from "@/components/ui/BaseTable/components/UpdateDeleteTableActions"; +import { MarketplaceSchema } from "@/lib/client"; + +type Props = { + onDelete: (mp: MarketplaceSchema) => void; + onChange: (mp: MarketplaceSchema) => void; +}; + +export const useMarketplacesTableColumns = ({ onDelete, onChange }: Props) => { + return useMemo( + () => + [ + { + accessor: "actions", + title:
Действия
, + width: "0%", + render: mp => ( + onDelete(mp)} + onChange={() => onChange(mp)} + /> + ), + }, + { + title: "Маркетплейс", + accessor: "baseMarketplace", + cellsStyle: () => ({}), + render: mp => ( + + + + + + ), + }, + { + accessor: "name", + title: "Название", + }, + ] as DataTableColumn[], + [] + ); +}; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/index.ts b/src/app/clients/drawers/ClientMarketplacesDrawer/index.ts new file mode 100644 index 0000000..c270dd0 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/index.ts @@ -0,0 +1,3 @@ +import ClientMarketplaceDrawer from "./ClientMarketplacesDrawer"; + +export default ClientMarketplaceDrawer; diff --git a/src/app/clients/drawers/ClientMarketplacesDrawer/modals/MarketplaceEditorModal.tsx b/src/app/clients/drawers/ClientMarketplacesDrawer/modals/MarketplaceEditorModal.tsx new file mode 100644 index 0000000..a65ab96 --- /dev/null +++ b/src/app/clients/drawers/ClientMarketplacesDrawer/modals/MarketplaceEditorModal.tsx @@ -0,0 +1,87 @@ +"use client"; + +import { Stack, TextInput } from "@mantine/core"; +import { useForm } from "@mantine/form"; +import { ContextModalProps } from "@mantine/modals"; +import BaseMarketplaceSelect from "@/app/clients/drawers/ClientMarketplacesDrawer/components/BaseMarketplaceSelect"; +import MarketplaceAuthDataInput from "@/app/clients/drawers/ClientMarketplacesDrawer/components/MarketplaceAuthDataInput/MarketplaceAuthDataInput"; +import { + CreateMarketplaceSchema, + MarketplaceSchema, + UpdateMarketplaceSchema, +} from "@/lib/client"; +import BaseFormModal, { + CreateEditFormProps, +} from "@/modals/base/BaseFormModal/BaseFormModal"; + +type Props = CreateEditFormProps< + MarketplaceSchema, + CreateMarketplaceSchema, + UpdateMarketplaceSchema +>; + +const MarketplaceEditorModal = ({ + context, + id, + innerProps, +}: ContextModalProps) => { + const initialValues: UpdateMarketplaceSchema | CreateMarketplaceSchema = + innerProps.isEditing + ? innerProps.entity + : { + name: "", + authData: { + "Authorization": "", + "Client-Id": "", + "Api-Key": "", + "CampaignId": "", + }, + }; + + const form = useForm({ + initialValues, + validate: { + name: name => + (!name || name.trim() === "") && + "Необходимо ввести название маркетплейса", + baseMarketplace: baseMarketplace => + !baseMarketplace && "Необходимо указать базовый маркетплейс", + authData: authData => + !authData && "Необходимо указать данные авторизации", + }, + }); + + return ( + context.closeContextModal(id)}> + + + + + {form.values.baseMarketplace && ( + } + onChange={value => + form.setFieldValue("authData", value) + } + error={form.getInputProps("authData").error} + /> + )} + + + ); +}; + +export default MarketplaceEditorModal; diff --git a/src/app/clients/hooks/useClientsCrud.tsx b/src/app/clients/hooks/cruds/useClientsCrud.tsx similarity index 100% rename from src/app/clients/hooks/useClientsCrud.tsx rename to src/app/clients/hooks/cruds/useClientsCrud.tsx diff --git a/src/app/clients/hooks/cruds/useMarketplacesCrud.tsx b/src/app/clients/hooks/cruds/useMarketplacesCrud.tsx new file mode 100644 index 0000000..8657573 --- /dev/null +++ b/src/app/clients/hooks/cruds/useMarketplacesCrud.tsx @@ -0,0 +1,50 @@ +import { useCrudOperations } from "@/hooks/cruds/baseCrud"; +import { + CreateMarketplaceSchema, + MarketplaceSchema, + UpdateMarketplaceSchema, +} from "@/lib/client"; +import { + createMarketplaceMutation, + deleteMarketplaceMutation, + updateMarketplaceMutation, +} from "@/lib/client/@tanstack/react-query.gen"; + +type UseMarketplacesProps = { + queryKey: any[]; +}; + +export type MarketplacesCrud = { + onCreate: (mp: CreateMarketplaceSchema) => void; + onUpdate: ( + mpId: number, + mp: UpdateMarketplaceSchema, + onSuccess?: () => void + ) => void; + onDelete: (mp: MarketplaceSchema) => void; +}; + +export const useMarketplacesCrud = ({ + queryKey, +}: UseMarketplacesProps): MarketplacesCrud => { + return useCrudOperations< + MarketplaceSchema, + UpdateMarketplaceSchema, + CreateMarketplaceSchema + >({ + key: "getMarketplaces", + queryKey, + mutations: { + create: createMarketplaceMutation(), + update: updateMarketplaceMutation(), + delete: deleteMarketplaceMutation(), + }, + getUpdateEntity: (old, update) => ({ + ...old, + baseMarketplace: update.baseMarketplace ?? old.baseMarketplace, + name: update.name ?? old.name, + authData: update.authData ?? old.authData, + }), + getDeleteConfirmTitle: () => "Удаление маркетплейса", + }); +}; diff --git a/src/app/clients/hooks/lists/useBaseMarketplacesList.tsx b/src/app/clients/hooks/lists/useBaseMarketplacesList.tsx new file mode 100644 index 0000000..2092837 --- /dev/null +++ b/src/app/clients/hooks/lists/useBaseMarketplacesList.tsx @@ -0,0 +1,15 @@ +import { useQuery } from "@tanstack/react-query"; +import { + getBaseMarketplacesOptions, + getBaseMarketplacesQueryKey, +} from "@/lib/client/@tanstack/react-query.gen"; + +const useBaseMarketplacesList = () => { + const { data, refetch } = useQuery(getBaseMarketplacesOptions()); + + const queryKey = getBaseMarketplacesQueryKey(); + + return { baseMarketplaces: data?.items ?? [], refetch, queryKey }; +}; + +export default useBaseMarketplacesList; diff --git a/src/app/clients/hooks/useClientsList.tsx b/src/app/clients/hooks/lists/useClientsList.tsx similarity index 100% rename from src/app/clients/hooks/useClientsList.tsx rename to src/app/clients/hooks/lists/useClientsList.tsx diff --git a/src/app/clients/hooks/lists/useMarketplacesList.tsx b/src/app/clients/hooks/lists/useMarketplacesList.tsx new file mode 100644 index 0000000..96df55f --- /dev/null +++ b/src/app/clients/hooks/lists/useMarketplacesList.tsx @@ -0,0 +1,21 @@ +import { useQuery } from "@tanstack/react-query"; +import { + getMarketplacesOptions, + getMarketplacesQueryKey, +} from "@/lib/client/@tanstack/react-query.gen"; + +type Props = { + clientId: number; +}; + +const useMarketplacesList = ({ clientId }: Props) => { + const { data, refetch } = useQuery( + getMarketplacesOptions({ path: { clientId } }) + ); + + const queryKey = getMarketplacesQueryKey({ path: { clientId } }); + + return { marketplaces: data?.items ?? [], refetch, queryKey }; +}; + +export default useMarketplacesList; diff --git a/src/app/clients/hooks/useClientsActions.tsx b/src/app/clients/hooks/utils/useClientsActions.tsx similarity index 100% rename from src/app/clients/hooks/useClientsActions.tsx rename to src/app/clients/hooks/utils/useClientsActions.tsx diff --git a/src/app/clients/hooks/useClientsFilter.tsx b/src/app/clients/hooks/utils/useClientsFilter.tsx similarity index 100% rename from src/app/clients/hooks/useClientsFilter.tsx rename to src/app/clients/hooks/utils/useClientsFilter.tsx diff --git a/src/components/ui/BaseTable/components/UpdateDeleteTableActions.tsx b/src/components/ui/BaseTable/components/UpdateDeleteTableActions.tsx index c53f10c..3762a98 100644 --- a/src/components/ui/BaseTable/components/UpdateDeleteTableActions.tsx +++ b/src/components/ui/BaseTable/components/UpdateDeleteTableActions.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, FC } from "react"; +import React, { CSSProperties, FC, ReactNode } from "react"; import { IconDotsVertical, IconEdit, IconTrash } from "@tabler/icons-react"; import { Box, Flex, Menu } from "@mantine/core"; import ActionIconWithTip from "@/components/ui/ActionIconWithTip/ActionIconWithTip"; @@ -6,9 +6,17 @@ import DropdownMenuItem from "@/components/ui/DropdownMenuItem/DropdownMenuItem" import ThemeIcon from "@/components/ui/ThemeIcon/ThemeIcon"; import useIsMobile from "@/hooks/utils/useIsMobile"; +export type ActionData = { + icon: ReactNode; + onClick: () => void; + label: string; + hidden?: boolean; +}; + type Props = { onChange: () => void; onDelete: () => void; + otherActions?: ActionData[]; dotsForMobile?: boolean; style?: CSSProperties; }; @@ -16,6 +24,7 @@ type Props = { const UpdateDeleteTableActions: FC = ({ onChange, onDelete, + otherActions, style, dotsForMobile = false, }) => { @@ -37,6 +46,17 @@ const UpdateDeleteTableActions: FC = ({ icon={} label={"Редактировать"} /> + {otherActions?.map( + action => + !action.hidden && ( + + ) + )} } @@ -59,6 +79,20 @@ const UpdateDeleteTableActions: FC = ({ tipLabel={"Редактировать"}> + {otherActions?.map( + action => + !action.hidden && ( + { + e.stopPropagation(); + action.onClick(); + }} + key={action.label} + tipLabel={action.label}> + {action.icon} + + ) + )} { diff --git a/src/drawers/drawersRegistry.tsx b/src/drawers/drawersRegistry.tsx index 1c1cbe5..1cccb3a 100644 --- a/src/drawers/drawersRegistry.tsx +++ b/src/drawers/drawersRegistry.tsx @@ -1,8 +1,9 @@ +import ClientMarketplaceDrawer from "@/app/clients/drawers/ClientMarketplacesDrawer"; import BoardsMobileEditorDrawer from "@/app/deals/drawers/BoardsMobileEditorDrawer"; -import StatusesMobileEditorDrawer from "../app/deals/drawers/StatusesMobileEditorDrawer"; import DealEditorDrawer from "@/app/deals/drawers/DealEditorDrawer"; import ProjectEditorDrawer from "@/app/deals/drawers/ProjectEditorDrawer"; import ProjectsMobileEditorDrawer from "@/app/deals/drawers/ProjectsMobileEditorDrawer"; +import StatusesMobileEditorDrawer from "../app/deals/drawers/StatusesMobileEditorDrawer"; const drawerRegistry = { projectsMobileEditorDrawer: ProjectsMobileEditorDrawer, @@ -10,6 +11,7 @@ const drawerRegistry = { boardsMobileEditorDrawer: BoardsMobileEditorDrawer, dealEditorDrawer: DealEditorDrawer, projectEditorDrawer: ProjectEditorDrawer, + clientMarketplaceDrawer: ClientMarketplaceDrawer, }; export default drawerRegistry; diff --git a/src/lib/client/@tanstack/react-query.gen.ts b/src/lib/client/@tanstack/react-query.gen.ts index 0fba938..807996b 100644 --- a/src/lib/client/@tanstack/react-query.gen.ts +++ b/src/lib/client/@tanstack/react-query.gen.ts @@ -18,6 +18,7 @@ import { createDealProduct, createDealProductService, createDealService, + createMarketplace, createProduct, createProject, createService, @@ -31,6 +32,7 @@ import { deleteDealProduct, deleteDealProductService, deleteDealService, + deleteMarketplace, deleteProduct, deleteProject, deleteService, @@ -41,12 +43,14 @@ import { getBarcodeTemplateAttributes, getBarcodeTemplates, getBarcodeTemplateSizes, + getBaseMarketplaces, getBoards, getBuiltInModules, getClients, getDealProducts, getDeals, getDealServices, + getMarketplaces, getProductBarcodePdf, getProducts, getProjects, @@ -62,6 +66,7 @@ import { updateDealProduct, updateDealProductService, updateDealService, + updateMarketplace, updateProduct, updateProject, updateService, @@ -98,6 +103,9 @@ import type { CreateDealServiceData, CreateDealServiceError, CreateDealServiceResponse2, + CreateMarketplaceData, + CreateMarketplaceError, + CreateMarketplaceResponse2, CreateProductData, CreateProductError, CreateProductResponse2, @@ -137,6 +145,9 @@ import type { DeleteDealServiceData, DeleteDealServiceError, DeleteDealServiceResponse2, + DeleteMarketplaceData, + DeleteMarketplaceError, + DeleteMarketplaceResponse2, DeleteProductData, DeleteProductError, DeleteProductResponse2, @@ -161,6 +172,7 @@ import type { GetBarcodeTemplateAttributesData, GetBarcodeTemplatesData, GetBarcodeTemplateSizesData, + GetBaseMarketplacesData, GetBoardsData, GetBuiltInModulesData, GetClientsData, @@ -169,6 +181,7 @@ import type { GetDealsError, GetDealServicesData, GetDealsResponse2, + GetMarketplacesData, GetProductBarcodePdfData, GetProductBarcodePdfError, GetProductBarcodePdfResponse2, @@ -202,6 +215,9 @@ import type { UpdateDealServiceData, UpdateDealServiceError, UpdateDealServiceResponse2, + UpdateMarketplaceData, + UpdateMarketplaceError, + UpdateMarketplaceResponse2, UpdateProductData, UpdateProductError, UpdateProductResponse2, @@ -1696,6 +1712,159 @@ export const addKitToDealMutation = ( return mutationOptions; }; +export const getBaseMarketplacesQueryKey = ( + options?: Options +) => createQueryKey("getBaseMarketplaces", options); + +/** + * Get Base Marketplaces + */ +export const getBaseMarketplacesOptions = ( + options?: Options +) => { + return queryOptions({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getBaseMarketplaces({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getBaseMarketplacesQueryKey(options), + }); +}; + +export const getMarketplacesQueryKey = ( + options: Options +) => createQueryKey("getMarketplaces", options); + +/** + * Get Marketplaces + */ +export const getMarketplacesOptions = ( + options: Options +) => { + return queryOptions({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await getMarketplaces({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: getMarketplacesQueryKey(options), + }); +}; + +export const createMarketplaceQueryKey = ( + options: Options +) => createQueryKey("createMarketplace", options); + +/** + * Create Product + */ +export const createMarketplaceOptions = ( + options: Options +) => { + return queryOptions({ + queryFn: async ({ queryKey, signal }) => { + const { data } = await createMarketplace({ + ...options, + ...queryKey[0], + signal, + throwOnError: true, + }); + return data; + }, + queryKey: createMarketplaceQueryKey(options), + }); +}; + +/** + * Create Product + */ +export const createMarketplaceMutation = ( + options?: Partial> +): UseMutationOptions< + CreateMarketplaceResponse2, + AxiosError, + Options +> => { + const mutationOptions: UseMutationOptions< + CreateMarketplaceResponse2, + AxiosError, + Options + > = { + mutationFn: async localOptions => { + const { data } = await createMarketplace({ + ...options, + ...localOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + +/** + * Delete Marketplace + */ +export const deleteMarketplaceMutation = ( + options?: Partial> +): UseMutationOptions< + DeleteMarketplaceResponse2, + AxiosError, + Options +> => { + const mutationOptions: UseMutationOptions< + DeleteMarketplaceResponse2, + AxiosError, + Options + > = { + mutationFn: async localOptions => { + const { data } = await deleteMarketplace({ + ...options, + ...localOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + +/** + * Update Marketplace + */ +export const updateMarketplaceMutation = ( + options?: Partial> +): UseMutationOptions< + UpdateMarketplaceResponse2, + AxiosError, + Options +> => { + const mutationOptions: UseMutationOptions< + UpdateMarketplaceResponse2, + AxiosError, + Options + > = { + mutationFn: async localOptions => { + const { data } = await updateMarketplace({ + ...options, + ...localOptions, + throwOnError: true, + }); + return data; + }, + }; + return mutationOptions; +}; + export const getProductsQueryKey = (options?: Options) => createQueryKey("getProducts", options); diff --git a/src/lib/client/sdk.gen.ts b/src/lib/client/sdk.gen.ts index a6caa99..cb11ef2 100644 --- a/src/lib/client/sdk.gen.ts +++ b/src/lib/client/sdk.gen.ts @@ -30,6 +30,9 @@ import type { CreateDealServiceData, CreateDealServiceErrors, CreateDealServiceResponses, + CreateMarketplaceData, + CreateMarketplaceErrors, + CreateMarketplaceResponses, CreateProductData, CreateProductErrors, CreateProductResponses, @@ -69,6 +72,9 @@ import type { DeleteDealServiceData, DeleteDealServiceErrors, DeleteDealServiceResponses, + DeleteMarketplaceData, + DeleteMarketplaceErrors, + DeleteMarketplaceResponses, DeleteProductData, DeleteProductErrors, DeleteProductResponses, @@ -96,6 +102,8 @@ import type { GetBarcodeTemplateSizesData, GetBarcodeTemplateSizesResponses, GetBarcodeTemplatesResponses, + GetBaseMarketplacesData, + GetBaseMarketplacesResponses, GetBoardsData, GetBoardsErrors, GetBoardsResponses, @@ -113,6 +121,9 @@ import type { GetDealServicesErrors, GetDealServicesResponses, GetDealsResponses, + GetMarketplacesData, + GetMarketplacesErrors, + GetMarketplacesResponses, GetProductBarcodePdfData, GetProductBarcodePdfErrors, GetProductBarcodePdfResponses, @@ -154,6 +165,9 @@ import type { UpdateDealServiceData, UpdateDealServiceErrors, UpdateDealServiceResponses, + UpdateMarketplaceData, + UpdateMarketplaceErrors, + UpdateMarketplaceResponses, UpdateProductData, UpdateProductErrors, UpdateProductResponses, @@ -192,6 +206,8 @@ import { zCreateDealResponse2, zCreateDealServiceData, zCreateDealServiceResponse2, + zCreateMarketplaceData, + zCreateMarketplaceResponse2, zCreateProductData, zCreateProductResponse2, zCreateProjectData, @@ -218,6 +234,8 @@ import { zDeleteDealResponse2, zDeleteDealServiceData, zDeleteDealServiceResponse2, + zDeleteMarketplaceData, + zDeleteMarketplaceResponse2, zDeleteProductData, zDeleteProductResponse2, zDeleteProjectData, @@ -238,6 +256,8 @@ import { zGetBarcodeTemplateSizesData, zGetBarcodeTemplateSizesResponse2, zGetBarcodeTemplatesResponse2, + zGetBaseMarketplacesData, + zGetBaseMarketplacesResponse2, zGetBoardsData, zGetBoardsResponse2, zGetBuiltInModulesData, @@ -250,6 +270,8 @@ import { zGetDealServicesData, zGetDealServicesResponse2, zGetDealsResponse2, + zGetMarketplacesData, + zGetMarketplacesResponse2, zGetProductBarcodePdfData, zGetProductBarcodePdfResponse2, zGetProductsData, @@ -280,6 +302,8 @@ import { zUpdateDealResponse2, zUpdateDealServiceData, zUpdateDealServiceResponse2, + zUpdateMarketplaceData, + zUpdateMarketplaceResponse2, zUpdateProductData, zUpdateProductResponse2, zUpdateProjectData, @@ -1363,6 +1387,129 @@ export const addKitToDeal = ( }); }; +/** + * Get Base Marketplaces + */ +export const getBaseMarketplaces = ( + options?: Options +) => { + return (options?.client ?? _heyApiClient).get< + GetBaseMarketplacesResponses, + unknown, + ThrowOnError + >({ + requestValidator: async data => { + return await zGetBaseMarketplacesData.parseAsync(data); + }, + responseType: "json", + responseValidator: async data => { + return await zGetBaseMarketplacesResponse2.parseAsync(data); + }, + url: "/modules/fulfillment-base/marketplace/base", + ...options, + }); +}; + +/** + * Get Marketplaces + */ +export const getMarketplaces = ( + options: Options +) => { + return (options.client ?? _heyApiClient).get< + GetMarketplacesResponses, + GetMarketplacesErrors, + ThrowOnError + >({ + requestValidator: async data => { + return await zGetMarketplacesData.parseAsync(data); + }, + responseType: "json", + responseValidator: async data => { + return await zGetMarketplacesResponse2.parseAsync(data); + }, + url: "/modules/fulfillment-base/marketplace/{clientId}", + ...options, + }); +}; + +/** + * Create Product + */ +export const createMarketplace = ( + options: Options +) => { + return (options.client ?? _heyApiClient).post< + CreateMarketplaceResponses, + CreateMarketplaceErrors, + ThrowOnError + >({ + requestValidator: async data => { + return await zCreateMarketplaceData.parseAsync(data); + }, + responseType: "json", + responseValidator: async data => { + return await zCreateMarketplaceResponse2.parseAsync(data); + }, + url: "/modules/fulfillment-base/marketplace/", + ...options, + headers: { + "Content-Type": "application/json", + ...options.headers, + }, + }); +}; + +/** + * Delete Marketplace + */ +export const deleteMarketplace = ( + options: Options +) => { + return (options.client ?? _heyApiClient).delete< + DeleteMarketplaceResponses, + DeleteMarketplaceErrors, + ThrowOnError + >({ + requestValidator: async data => { + return await zDeleteMarketplaceData.parseAsync(data); + }, + responseType: "json", + responseValidator: async data => { + return await zDeleteMarketplaceResponse2.parseAsync(data); + }, + url: "/modules/fulfillment-base/marketplace/{pk}", + ...options, + }); +}; + +/** + * Update Marketplace + */ +export const updateMarketplace = ( + options: Options +) => { + return (options.client ?? _heyApiClient).patch< + UpdateMarketplaceResponses, + UpdateMarketplaceErrors, + ThrowOnError + >({ + requestValidator: async data => { + return await zUpdateMarketplaceData.parseAsync(data); + }, + responseType: "json", + responseValidator: async data => { + return await zUpdateMarketplaceResponse2.parseAsync(data); + }, + url: "/modules/fulfillment-base/marketplace/{pk}", + ...options, + headers: { + "Content-Type": "application/json", + ...options.headers, + }, + }); +}; + /** * Get Products */ diff --git a/src/lib/client/types.gen.ts b/src/lib/client/types.gen.ts index 27bcd3a..7ed56e0 100644 --- a/src/lib/client/types.gen.ts +++ b/src/lib/client/types.gen.ts @@ -63,6 +63,24 @@ export type BarcodeTemplateSizeSchema = { height: number; }; +/** + * BaseMarketplaceSchema + */ +export type BaseMarketplaceSchema = { + /** + * Id + */ + id: number; + /** + * Name + */ + name: string; + /** + * Iconurl + */ + iconUrl: string; +}; + /** * BoardSchema */ @@ -453,6 +471,42 @@ export type CreateDealServiceSchema = { price: number; }; +/** + * CreateMarketplaceRequest + */ +export type CreateMarketplaceRequest = { + entity: CreateMarketplaceSchema; +}; + +/** + * CreateMarketplaceResponse + */ +export type CreateMarketplaceResponse = { + /** + * Message + */ + message: string; + entity: MarketplaceSchema; +}; + +/** + * CreateMarketplaceSchema + */ +export type CreateMarketplaceSchema = { + baseMarketplace: BaseMarketplaceSchema; + client: ClientSchema; + /** + * Name + */ + name: string; + /** + * Authdata + */ + authData: { + [key: string]: unknown; + }; +}; + /** * CreateProductRequest */ @@ -953,6 +1007,16 @@ export type DeleteDealServiceResponse = { message: string; }; +/** + * DeleteMarketplaceResponse + */ +export type DeleteMarketplaceResponse = { + /** + * Message + */ + message: string; +}; + /** * DeleteProductResponse */ @@ -1063,6 +1127,16 @@ export type GetBarcodeTemplatesResponse = { items: Array; }; +/** + * GetBaseMarketplacesResponse + */ +export type GetBaseMarketplacesResponse = { + /** + * Items + */ + items: Array; +}; + /** * GetBoardsResponse */ @@ -1114,6 +1188,16 @@ export type GetDealsResponse = { paginationInfo: PaginationInfoSchema; }; +/** + * GetMarketplacesResponse + */ +export type GetMarketplacesResponse = { + /** + * Items + */ + items: Array; +}; + /** * GetProductBarcodePdfRequest */ @@ -1231,6 +1315,32 @@ export type HttpValidationError = { detail?: Array; }; +/** + * MarketplaceSchema + */ +export type MarketplaceSchema = { + /** + * Id + */ + id: number; + /** + * Basemarketplaceid + */ + baseMarketplaceId: number; + baseMarketplace: BaseMarketplaceSchema; + client: ClientSchema; + /** + * Name + */ + name: string; + /** + * Authdata + */ + authData: { + [key: string]: unknown; + }; +}; + /** * PaginationInfoSchema */ @@ -1749,6 +1859,41 @@ export type UpdateDealServiceSchema = { isFixedPrice: boolean; }; +/** + * UpdateMarketplaceRequest + */ +export type UpdateMarketplaceRequest = { + entity: UpdateMarketplaceSchema; +}; + +/** + * UpdateMarketplaceResponse + */ +export type UpdateMarketplaceResponse = { + /** + * Message + */ + message: string; +}; + +/** + * UpdateMarketplaceSchema + */ +export type UpdateMarketplaceSchema = { + baseMarketplace?: BaseMarketplaceSchema | null; + client?: ClientSchema | null; + /** + * Name + */ + name?: string | null; + /** + * Authdata + */ + authData?: { + [key: string]: unknown; + } | null; +}; + /** * UpdateProductRequest */ @@ -3304,6 +3449,146 @@ export type AddKitToDealResponses = { export type AddKitToDealResponse = AddKitToDealResponses[keyof AddKitToDealResponses]; +export type GetBaseMarketplacesData = { + body?: never; + path?: never; + query?: never; + url: "/modules/fulfillment-base/marketplace/base"; +}; + +export type GetBaseMarketplacesResponses = { + /** + * Successful Response + */ + 200: GetBaseMarketplacesResponse; +}; + +export type GetBaseMarketplacesResponse2 = + GetBaseMarketplacesResponses[keyof GetBaseMarketplacesResponses]; + +export type GetMarketplacesData = { + body?: never; + path: { + /** + * Clientid + */ + clientId: number; + }; + query?: never; + url: "/modules/fulfillment-base/marketplace/{clientId}"; +}; + +export type GetMarketplacesErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type GetMarketplacesError = + GetMarketplacesErrors[keyof GetMarketplacesErrors]; + +export type GetMarketplacesResponses = { + /** + * Successful Response + */ + 200: GetMarketplacesResponse; +}; + +export type GetMarketplacesResponse2 = + GetMarketplacesResponses[keyof GetMarketplacesResponses]; + +export type CreateMarketplaceData = { + body: CreateMarketplaceRequest; + path?: never; + query?: never; + url: "/modules/fulfillment-base/marketplace/"; +}; + +export type CreateMarketplaceErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type CreateMarketplaceError = + CreateMarketplaceErrors[keyof CreateMarketplaceErrors]; + +export type CreateMarketplaceResponses = { + /** + * Successful Response + */ + 200: CreateMarketplaceResponse; +}; + +export type CreateMarketplaceResponse2 = + CreateMarketplaceResponses[keyof CreateMarketplaceResponses]; + +export type DeleteMarketplaceData = { + body?: never; + path: { + /** + * Pk + */ + pk: number; + }; + query?: never; + url: "/modules/fulfillment-base/marketplace/{pk}"; +}; + +export type DeleteMarketplaceErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type DeleteMarketplaceError = + DeleteMarketplaceErrors[keyof DeleteMarketplaceErrors]; + +export type DeleteMarketplaceResponses = { + /** + * Successful Response + */ + 200: DeleteMarketplaceResponse; +}; + +export type DeleteMarketplaceResponse2 = + DeleteMarketplaceResponses[keyof DeleteMarketplaceResponses]; + +export type UpdateMarketplaceData = { + body: UpdateMarketplaceRequest; + path: { + /** + * Pk + */ + pk: number; + }; + query?: never; + url: "/modules/fulfillment-base/marketplace/{pk}"; +}; + +export type UpdateMarketplaceErrors = { + /** + * Validation Error + */ + 422: HttpValidationError; +}; + +export type UpdateMarketplaceError = + UpdateMarketplaceErrors[keyof UpdateMarketplaceErrors]; + +export type UpdateMarketplaceResponses = { + /** + * Successful Response + */ + 200: UpdateMarketplaceResponse; +}; + +export type UpdateMarketplaceResponse2 = + UpdateMarketplaceResponses[keyof UpdateMarketplaceResponses]; + export type GetProductsData = { body?: never; path?: never; diff --git a/src/lib/client/zod.gen.ts b/src/lib/client/zod.gen.ts index ae32d91..008eecd 100644 --- a/src/lib/client/zod.gen.ts +++ b/src/lib/client/zod.gen.ts @@ -32,6 +32,15 @@ export const zBarcodeTemplateSchema = z.object({ id: z.int(), }); +/** + * BaseMarketplaceSchema + */ +export const zBaseMarketplaceSchema = z.object({ + id: z.int(), + name: z.string(), + iconUrl: z.string(), +}); + /** * BoardSchema */ @@ -377,6 +386,43 @@ export const zCreateDealServiceResponse = z.object({ entity: zDealServiceSchema, }); +/** + * CreateMarketplaceSchema + */ +export const zCreateMarketplaceSchema = z.object({ + baseMarketplace: zBaseMarketplaceSchema, + client: zClientSchema, + name: z.string(), + authData: z.object({}), +}); + +/** + * CreateMarketplaceRequest + */ +export const zCreateMarketplaceRequest = z.object({ + entity: zCreateMarketplaceSchema, +}); + +/** + * MarketplaceSchema + */ +export const zMarketplaceSchema = z.object({ + id: z.int(), + baseMarketplaceId: z.int(), + baseMarketplace: zBaseMarketplaceSchema, + client: zClientSchema, + name: z.string(), + authData: z.object({}), +}); + +/** + * CreateMarketplaceResponse + */ +export const zCreateMarketplaceResponse = z.object({ + message: z.string(), + entity: zMarketplaceSchema, +}); + /** * CreateProductSchema */ @@ -650,6 +696,13 @@ export const zDeleteDealServiceResponse = z.object({ message: z.string(), }); +/** + * DeleteMarketplaceResponse + */ +export const zDeleteMarketplaceResponse = z.object({ + message: z.string(), +}); + /** * DeleteProductResponse */ @@ -727,6 +780,13 @@ export const zGetBarcodeTemplatesResponse = z.object({ items: z.array(zBarcodeTemplateSchema), }); +/** + * GetBaseMarketplacesResponse + */ +export const zGetBaseMarketplacesResponse = z.object({ + items: z.array(zBaseMarketplaceSchema), +}); + /** * GetBoardsResponse */ @@ -771,6 +831,13 @@ export const zGetDealsResponse = z.object({ paginationInfo: zPaginationInfoSchema, }); +/** + * GetMarketplacesResponse + */ +export const zGetMarketplacesResponse = z.object({ + items: z.array(zMarketplaceSchema), +}); + /** * GetProductBarcodePdfRequest */ @@ -1037,6 +1104,30 @@ export const zUpdateDealServiceResponse = z.object({ message: z.string(), }); +/** + * UpdateMarketplaceSchema + */ +export const zUpdateMarketplaceSchema = z.object({ + baseMarketplace: z.optional(z.union([zBaseMarketplaceSchema, z.null()])), + client: z.optional(z.union([zClientSchema, z.null()])), + name: z.optional(z.union([z.string(), z.null()])), + authData: z.optional(z.union([z.object({}), z.null()])), +}); + +/** + * UpdateMarketplaceRequest + */ +export const zUpdateMarketplaceRequest = z.object({ + entity: zUpdateMarketplaceSchema, +}); + +/** + * UpdateMarketplaceResponse + */ +export const zUpdateMarketplaceResponse = z.object({ + message: z.string(), +}); + /** * UpdateProductSchema */ @@ -1746,6 +1837,67 @@ export const zAddKitToDealData = z.object({ */ export const zAddKitToDealResponse = zDealAddKitResponse; +export const zGetBaseMarketplacesData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()), +}); + +/** + * Successful Response + */ +export const zGetBaseMarketplacesResponse2 = zGetBaseMarketplacesResponse; + +export const zGetMarketplacesData = z.object({ + body: z.optional(z.never()), + path: z.object({ + clientId: z.int(), + }), + query: z.optional(z.never()), +}); + +/** + * Successful Response + */ +export const zGetMarketplacesResponse2 = zGetMarketplacesResponse; + +export const zCreateMarketplaceData = z.object({ + body: zCreateMarketplaceRequest, + path: z.optional(z.never()), + query: z.optional(z.never()), +}); + +/** + * Successful Response + */ +export const zCreateMarketplaceResponse2 = zCreateMarketplaceResponse; + +export const zDeleteMarketplaceData = z.object({ + body: z.optional(z.never()), + path: z.object({ + pk: z.int(), + }), + query: z.optional(z.never()), +}); + +/** + * Successful Response + */ +export const zDeleteMarketplaceResponse2 = zDeleteMarketplaceResponse; + +export const zUpdateMarketplaceData = z.object({ + body: zUpdateMarketplaceRequest, + path: z.object({ + pk: z.int(), + }), + query: z.optional(z.never()), +}); + +/** + * Successful Response + */ +export const zUpdateMarketplaceResponse2 = zUpdateMarketplaceResponse; + export const zGetProductsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), diff --git a/src/modals/modals.ts b/src/modals/modals.ts index 25ce659..e4293ee 100644 --- a/src/modals/modals.ts +++ b/src/modals/modals.ts @@ -1,4 +1,5 @@ import BarcodeTemplateEditorModal from "@/app/barcode-templates/modals/BarcodeTemplateFormModal/BarcodeTemplateEditorModal"; +import MarketplaceEditorModal from "@/app/clients/drawers/ClientMarketplacesDrawer/modals/MarketplaceEditorModal"; import ClientEditorModal from "@/app/clients/modals/ClientFormModal/ClientFormModal"; import ColorPickerModal from "@/app/deals/modals/ColorPickerModal/ColorPickerModal"; import DealsBoardFiltersModal from "@/app/deals/modals/DealsBoardFiltersModal/DealsBoardFiltersModal"; @@ -38,4 +39,5 @@ export const modals = { clientEditorModal: ClientEditorModal, printBarcodeModal: PrintBarcodeModal, statusColorPickerModal: ColorPickerModal, + marketplaceEditorModal: MarketplaceEditorModal, }; diff --git a/src/modules/dealModularEditorTabs/Clients/components/ClientDataForm.tsx b/src/modules/dealModularEditorTabs/Clients/components/ClientDataForm.tsx index a1a3144..319c926 100644 --- a/src/modules/dealModularEditorTabs/Clients/components/ClientDataForm.tsx +++ b/src/modules/dealModularEditorTabs/Clients/components/ClientDataForm.tsx @@ -11,7 +11,7 @@ import { Textarea, TextInput, } from "@mantine/core"; -import { useClientsCrud } from "@/app/clients/hooks/useClientsCrud"; +import { useClientsCrud } from "@/app/clients/hooks/cruds/useClientsCrud"; import FormFlexRow from "@/components/ui/FormFlexRow/FormFlexRow"; import useIsMobile from "@/hooks/utils/useIsMobile"; import { ClientSchema } from "@/lib/client"; diff --git a/src/modules/dealModularEditorTabs/Clients/components/ClientSelect.tsx b/src/modules/dealModularEditorTabs/Clients/components/ClientSelect.tsx index ac33de1..c024f29 100644 --- a/src/modules/dealModularEditorTabs/Clients/components/ClientSelect.tsx +++ b/src/modules/dealModularEditorTabs/Clients/components/ClientSelect.tsx @@ -2,7 +2,7 @@ import { FC, useEffect, useMemo, useState } from "react"; import { Text } from "@mantine/core"; -import useClientsList from "@/app/clients/hooks/useClientsList"; +import useClientsList from "@/app/clients/hooks/lists/useClientsList"; import ObjectSelect, { ObjectSelectProps, } from "@/components/selects/ObjectSelect/ObjectSelect"; diff --git a/src/modules/dealModularEditorTabs/FulfillmentBase/shared/types/baseMarketplaceType.ts b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/types/baseMarketplaceType.ts new file mode 100644 index 0000000..0e14a32 --- /dev/null +++ b/src/modules/dealModularEditorTabs/FulfillmentBase/shared/types/baseMarketplaceType.ts @@ -0,0 +1,7 @@ +enum BaseMarketplaceType { + WILDBERRIES = 1, + OZON, + YANDEX_MARKET, +} + +export default BaseMarketplaceType;