From 6fc6443e893b4a5bfb957038442f229d6fb0ec55 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 10 Sep 2024 18:32:52 +0300 Subject: [PATCH] feat: complete deal --- src/client/index.ts | 2 + src/client/models/DealCompleteRequest.ts | 8 + src/client/models/DealCompleteResponse.ts | 9 + src/client/services/DealService.ts | 22 +++ src/pages/LeadsPage/ui/LeadsPage.tsx | 201 +++++++++++++++------- 5 files changed, 179 insertions(+), 63 deletions(-) create mode 100644 src/client/models/DealCompleteRequest.ts create mode 100644 src/client/models/DealCompleteResponse.ts diff --git a/src/client/index.ts b/src/client/index.ts index a576cd2..069d6a1 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -71,6 +71,8 @@ export type { DealAddServicesResponse } from './models/DealAddServicesResponse'; export type { DealBillRequestSchema } from './models/DealBillRequestSchema'; export type { DealChangeStatusRequest } from './models/DealChangeStatusRequest'; export type { DealChangeStatusResponse } from './models/DealChangeStatusResponse'; +export type { DealCompleteRequest } from './models/DealCompleteRequest'; +export type { DealCompleteResponse } from './models/DealCompleteResponse'; export type { DealCreateGuestUrlRequest } from './models/DealCreateGuestUrlRequest'; export type { DealCreateGuestUrlResponse } from './models/DealCreateGuestUrlResponse'; export type { DealCreateRequest } from './models/DealCreateRequest'; diff --git a/src/client/models/DealCompleteRequest.ts b/src/client/models/DealCompleteRequest.ts new file mode 100644 index 0000000..ac500b6 --- /dev/null +++ b/src/client/models/DealCompleteRequest.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DealCompleteRequest = { + dealId: number; +}; + diff --git a/src/client/models/DealCompleteResponse.ts b/src/client/models/DealCompleteResponse.ts new file mode 100644 index 0000000..d82206e --- /dev/null +++ b/src/client/models/DealCompleteResponse.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DealCompleteResponse = { + ok: boolean; + message: string; +}; + diff --git a/src/client/services/DealService.ts b/src/client/services/DealService.ts index 6560d47..455dfc3 100644 --- a/src/client/services/DealService.ts +++ b/src/client/services/DealService.ts @@ -12,6 +12,8 @@ import type { DealAddServicesRequest } from '../models/DealAddServicesRequest'; import type { DealAddServicesResponse } from '../models/DealAddServicesResponse'; import type { DealChangeStatusRequest } from '../models/DealChangeStatusRequest'; import type { DealChangeStatusResponse } from '../models/DealChangeStatusResponse'; +import type { DealCompleteRequest } from '../models/DealCompleteRequest'; +import type { DealCompleteResponse } from '../models/DealCompleteResponse'; import type { DealCreateGuestUrlRequest } from '../models/DealCreateGuestUrlRequest'; import type { DealCreateGuestUrlResponse } from '../models/DealCreateGuestUrlResponse'; import type { DealCreateRequest } from '../models/DealCreateRequest'; @@ -89,6 +91,26 @@ export class DealService { }, }); } + /** + * Complete + * @returns DealCompleteResponse Successful Response + * @throws ApiError + */ + public static completeDeal({ + requestBody, + }: { + requestBody: DealCompleteRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/deal/complete', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } /** * Quick Create * @returns DealQuickCreateResponse Successful Response diff --git a/src/pages/LeadsPage/ui/LeadsPage.tsx b/src/pages/LeadsPage/ui/LeadsPage.tsx index 28f0453..adfe72b 100644 --- a/src/pages/LeadsPage/ui/LeadsPage.tsx +++ b/src/pages/LeadsPage/ui/LeadsPage.tsx @@ -59,6 +59,29 @@ export const LeadsPage: FC = () => { } }); } + const onSuccess = (dealId: number) => { + const summary = summaries.find(summary => summary.id == dealId); + if (!summary) return; + modals.openConfirmModal({ + title: "Завершение сделки", + children: + + Вы действительно хотите завершить сделку {summary.name}? + , + onConfirm: () => { + DealService.completeDeal({requestBody: {dealId: dealId}}) + .then(async ({ok, message}) => { + notifications.guess(ok, {message}); + if (!ok) return; + await refetch(); + }) + }, + labels: { + confirm: "Завершить", + cancel: "Отмена" + } + }); + } const onDragEnd = async (result: DropResult) => { setIsDragEnded(true); // If there is no changes @@ -78,6 +101,10 @@ export const LeadsPage: FC = () => { onDelete(dealId); return; } + if (droppableId === 'SUCCESS') { + onSuccess(dealId); + return; + } const status = getDealStatusByName(droppableId); const request: Partial = { dealId: dealId, @@ -122,7 +149,13 @@ export const LeadsPage: FC = () => { } const getBoardBody = () => { return ( + { setIsDragEnded(false); }} onDragEnd={onDragEnd}> -
- summary.status == DealStatus.AWAITING_ACCEPTANCE)} - title={"Ожидает приемки"} - droppableId={"AWAITING_ACCEPTANCE"} - color={'#4A90E2'} - /> - summary.status == DealStatus.PACKAGING)} - title={"Упаковка"} - droppableId={"PACKAGING"} - color={'#F5A623'} + - /> - summary.status == DealStatus.AWAITING_SHIPMENT)} - title={"Ожидает отгрузки"} - droppableId={"AWAITING_SHIPMENT"} - color={'#7ED321'} +
+ summary.status == DealStatus.AWAITING_ACCEPTANCE)} + title={"Ожидает приемки"} + droppableId={"AWAITING_ACCEPTANCE"} + color={'#4A90E2'} + /> + summary.status == DealStatus.PACKAGING)} + title={"Упаковка"} + droppableId={"PACKAGING"} + color={'#F5A623'} - /> - summary.status == DealStatus.AWAITING_PAYMENT)} - title={"Ожидает оплаты"} - droppableId={"AWAITING_PAYMENT"} - color={'#D0021B'} + /> + summary.status == DealStatus.AWAITING_SHIPMENT)} + title={"Ожидает отгрузки"} + droppableId={"AWAITING_SHIPMENT"} + color={'#7ED321'} - /> - summary.status == DealStatus.COMPLETED)} - title={"Завершена"} - droppableId={"COMPLETED"} - color={'#417505'} - /> -
- -
- - {(provided) => ( - <> -
- {!isDragEnded && - + /> + summary.status == DealStatus.AWAITING_PAYMENT)} + title={"Ожидает оплаты"} + droppableId={"AWAITING_PAYMENT"} + color={'#D0021B'} + + /> + summary.status == DealStatus.COMPLETED)} + title={"Завершена"} + droppableId={"COMPLETED"} + color={'#417505'} + /> +
+ +
+ + {(provided, snapshot) => ( + <> +
+ { + !isDragEnded + && + !snapshot.isDraggingOver && + Удалить - } + } -
- {provided.placeholder} - +
+ {provided.placeholder} + - )} -
-
+ )} + +
+
+ + {(provided, snapshot) => ( + <> +
+ { + !isDragEnded + && + !snapshot.isDraggingOver && + + Успешно завершена + + + } +
+ {provided.placeholder} + + + )} +
+
+ +