From b09479302b3856674e739ad6f1858535a9e4f883 Mon Sep 17 00:00:00 2001 From: AlexSserb Date: Tue, 13 May 2025 15:54:33 +0400 Subject: [PATCH] feat: warehouse place number editing --- src/client/index.ts | 1 + src/client/models/EditPlaceRequest.ts | 4 +- src/client/models/EditPlaceSchema.ts | 11 ++++ .../place/components/PlaceActions.tsx | 9 ++- .../place/components/PlaceTypeSelect.tsx | 4 +- .../place/hooks/usePlacesCrud.tsx | 10 ++-- .../place/modals/PlaceModal.tsx | 56 ++++++++++++++----- .../WarehouseManagementTabContext.tsx | 16 +++++- 8 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 src/client/models/EditPlaceSchema.ts diff --git a/src/client/index.ts b/src/client/index.ts index 4b2720f..679a199 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -232,6 +232,7 @@ export type { EditMessageResponse } from './models/EditMessageResponse'; export type { EditMessageSchema } from './models/EditMessageSchema'; export type { EditPlaceRequest } from './models/EditPlaceRequest'; export type { EditPlaceResponse } from './models/EditPlaceResponse'; +export type { EditPlaceSchema } from './models/EditPlaceSchema'; export type { EditPlaceTypeRequest } from './models/EditPlaceTypeRequest'; export type { EditPlaceTypeResponse } from './models/EditPlaceTypeResponse'; export type { FinishPauseByShiftIdResponse } from './models/FinishPauseByShiftIdResponse'; diff --git a/src/client/models/EditPlaceRequest.ts b/src/client/models/EditPlaceRequest.ts index 6af5ebe..d936a8e 100644 --- a/src/client/models/EditPlaceRequest.ts +++ b/src/client/models/EditPlaceRequest.ts @@ -2,8 +2,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { PlaceSchema } from './PlaceSchema'; +import type { EditPlaceSchema } from './EditPlaceSchema'; export type EditPlaceRequest = { - place: PlaceSchema; + place: EditPlaceSchema; }; diff --git a/src/client/models/EditPlaceSchema.ts b/src/client/models/EditPlaceSchema.ts new file mode 100644 index 0000000..10712f7 --- /dev/null +++ b/src/client/models/EditPlaceSchema.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type EditPlaceSchema = { + parentId: (number | null); + placeTypeId: number; + id: number; + number: number; +}; + diff --git a/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceActions.tsx b/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceActions.tsx index 3ac0dac..f910d4e 100644 --- a/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceActions.tsx +++ b/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceActions.tsx @@ -1,5 +1,5 @@ import { PlaceSchema } from "../../../../../../client"; -import { IconPlaylistAdd, IconQrcode, IconTrash } from "@tabler/icons-react"; +import { IconEdit, IconPlaylistAdd, IconQrcode, IconTrash } from "@tabler/icons-react"; import { ActionIcon, Flex, Tooltip } from "@mantine/core"; import React, { ReactNode } from "react"; import { useWarehouseManagementTabContext } from "../../placeType/contexts/WarehouseManagementTabContext.tsx"; @@ -10,7 +10,7 @@ type Props = { } const PlaceActions = ({ place }: Props) => { - const { placeCrud, onCreatePlace, generateQrCode } = useWarehouseManagementTabContext(); + const { placeCrud, onCreatePlace, onEditPlace, generateQrCode } = useWarehouseManagementTabContext(); const getAction = ( label: string, @@ -46,6 +46,11 @@ const PlaceActions = ({ place }: Props) => { , place.placeType.childCount === 0, ), + getAction( + "Редактировать", + () => onEditPlace(place), + , + ), getAction( "Удалить", () => placeCrud.onDelete && placeCrud.onDelete(place), diff --git a/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceTypeSelect.tsx b/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceTypeSelect.tsx index fe57cbc..4156275 100644 --- a/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceTypeSelect.tsx +++ b/src/pages/AdminPage/tabs/WarehouseManagement/place/components/PlaceTypeSelect.tsx @@ -1,9 +1,9 @@ import { FC } from "react"; -import { FlatPlaceTypeSchema } from "../../../../../../client"; +import { FlatPlaceTypeSchema, PlaceTypeSchema } from "../../../../../../client"; import ObjectSelect, { ObjectSelectProps } from "../../../../../../components/ObjectSelect/ObjectSelect.tsx"; type Props = Omit< - ObjectSelectProps, + ObjectSelectProps, "getValueFn" | "getLabelFn" >; diff --git a/src/pages/AdminPage/tabs/WarehouseManagement/place/hooks/usePlacesCrud.tsx b/src/pages/AdminPage/tabs/WarehouseManagement/place/hooks/usePlacesCrud.tsx index 61f52fc..0889f10 100644 --- a/src/pages/AdminPage/tabs/WarehouseManagement/place/hooks/usePlacesCrud.tsx +++ b/src/pages/AdminPage/tabs/WarehouseManagement/place/hooks/usePlacesCrud.tsx @@ -1,12 +1,12 @@ import { useCRUD } from "../../../../../../hooks/useCRUD.tsx"; -import { BasePlaceSchema, PlaceSchema, WmsService } from "../../../../../../client"; +import { BasePlaceSchema, EditPlaceSchema, PlaceSchema, WmsService } from "../../../../../../client"; import { notifications } from "../../../../../../shared/lib/notifications.ts"; export type PlaceCrud = { onCreate: (element: BasePlaceSchema) => void, onDelete: (element: PlaceSchema) => void, - onChange: (element: PlaceSchema) => void + onChange: (element: EditPlaceSchema) => void } type Props = { @@ -14,8 +14,8 @@ type Props = { } const usePlacesCrud = ({ fetchPlaces }: Props): PlaceCrud => { - return useCRUD({ - onChange: (place: PlaceSchema) => { + return useCRUD({ + onChange: (place: EditPlaceSchema) => { WmsService.editPlace({ requestBody: { place }, }) @@ -26,7 +26,7 @@ const usePlacesCrud = ({ fetchPlaces }: Props): PlaceCrud => { }) .catch(err => console.log(err)); }, - onDelete: (place: PlaceSchema) => { + onDelete: (place: EditPlaceSchema) => { WmsService.deletePlace({ placeId: place.id, }) diff --git a/src/pages/AdminPage/tabs/WarehouseManagement/place/modals/PlaceModal.tsx b/src/pages/AdminPage/tabs/WarehouseManagement/place/modals/PlaceModal.tsx index 792362a..9521cd3 100644 --- a/src/pages/AdminPage/tabs/WarehouseManagement/place/modals/PlaceModal.tsx +++ b/src/pages/AdminPage/tabs/WarehouseManagement/place/modals/PlaceModal.tsx @@ -1,6 +1,6 @@ import { ContextModalProps } from "@mantine/modals"; -import { FlatPlaceTypeSchema, PlaceSchema } from "../../../../../../client"; -import { Button, Stack } from "@mantine/core"; +import { EditPlaceSchema, FlatPlaceTypeSchema, PlaceSchema, PlaceTypeSchema } from "../../../../../../client"; +import { Button, NumberInput, Stack } from "@mantine/core"; import { useForm } from "@mantine/form"; import { PlaceCrud } from "../hooks/usePlacesCrud.tsx"; import PlaceTypeSelect from "../components/PlaceTypeSelect.tsx"; @@ -8,11 +8,13 @@ import PlaceTypeSelect from "../components/PlaceTypeSelect.tsx"; type Props = { placeCrud: PlaceCrud; parent?: PlaceSchema; - placeTypes: FlatPlaceTypeSchema[]; + placeTypes?: FlatPlaceTypeSchema[]; + element?: EditPlaceSchema; } type PlaceModalForm = { - placeType: PlaceSchema | null; + placeType: PlaceTypeSchema | null; + placeNumber: number | null; } const PlaceModal = ({ @@ -20,6 +22,7 @@ const PlaceModal = ({ id, innerProps, }: ContextModalProps) => { + const isEditing = "element" in innerProps; const { parent, placeCrud, placeTypes } = innerProps; const closeModal = () => { @@ -28,31 +31,54 @@ const PlaceModal = ({ const initialValues: PlaceModalForm = { placeType: null, + placeNumber: innerProps.element?.number ?? null, }; const form = useForm({ initialValues, validate: { - placeType: placeType => !placeType && "Необходимо указать тип", + placeType: placeType => !isEditing && !placeType && "Необходимо указать тип", + placeNumber: placeNumber => isEditing && !placeNumber && "Необходимо ввести номер", }, }); const onSubmit = (values: PlaceModalForm) => { - if (!values.placeType) return; - placeCrud.onCreate({ - placeTypeId: values.placeType.id, - parentId: parent?.id || null, - }); + if (isEditing) { + const place = innerProps.element!; + placeCrud.onChange({ + id: place.id, + placeTypeId: place.placeTypeId, + number: values.placeNumber!, + parentId: place.parentId, + }); + } else { + if (!values.placeType) return; + placeCrud.onCreate({ + placeTypeId: values.placeType.id, + parentId: parent?.id || null, + }); + } closeModal(); }; return (
onSubmit(values))}> - + {!isEditing && ( + + )} + + {isEditing && ( + + )}