feat: complete deal
This commit is contained in:
@@ -71,6 +71,8 @@ export type { DealAddServicesResponse } from './models/DealAddServicesResponse';
|
|||||||
export type { DealBillRequestSchema } from './models/DealBillRequestSchema';
|
export type { DealBillRequestSchema } from './models/DealBillRequestSchema';
|
||||||
export type { DealChangeStatusRequest } from './models/DealChangeStatusRequest';
|
export type { DealChangeStatusRequest } from './models/DealChangeStatusRequest';
|
||||||
export type { DealChangeStatusResponse } from './models/DealChangeStatusResponse';
|
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 { DealCreateGuestUrlRequest } from './models/DealCreateGuestUrlRequest';
|
||||||
export type { DealCreateGuestUrlResponse } from './models/DealCreateGuestUrlResponse';
|
export type { DealCreateGuestUrlResponse } from './models/DealCreateGuestUrlResponse';
|
||||||
export type { DealCreateRequest } from './models/DealCreateRequest';
|
export type { DealCreateRequest } from './models/DealCreateRequest';
|
||||||
|
|||||||
8
src/client/models/DealCompleteRequest.ts
Normal file
8
src/client/models/DealCompleteRequest.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type DealCompleteRequest = {
|
||||||
|
dealId: number;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/DealCompleteResponse.ts
Normal file
9
src/client/models/DealCompleteResponse.ts
Normal file
@@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
@@ -12,6 +12,8 @@ import type { DealAddServicesRequest } from '../models/DealAddServicesRequest';
|
|||||||
import type { DealAddServicesResponse } from '../models/DealAddServicesResponse';
|
import type { DealAddServicesResponse } from '../models/DealAddServicesResponse';
|
||||||
import type { DealChangeStatusRequest } from '../models/DealChangeStatusRequest';
|
import type { DealChangeStatusRequest } from '../models/DealChangeStatusRequest';
|
||||||
import type { DealChangeStatusResponse } from '../models/DealChangeStatusResponse';
|
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 { DealCreateGuestUrlRequest } from '../models/DealCreateGuestUrlRequest';
|
||||||
import type { DealCreateGuestUrlResponse } from '../models/DealCreateGuestUrlResponse';
|
import type { DealCreateGuestUrlResponse } from '../models/DealCreateGuestUrlResponse';
|
||||||
import type { DealCreateRequest } from '../models/DealCreateRequest';
|
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<DealCompleteResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'POST',
|
||||||
|
url: '/deal/complete',
|
||||||
|
body: requestBody,
|
||||||
|
mediaType: 'application/json',
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Quick Create
|
* Quick Create
|
||||||
* @returns DealQuickCreateResponse Successful Response
|
* @returns DealQuickCreateResponse Successful Response
|
||||||
|
|||||||
@@ -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:
|
||||||
|
<Flex>
|
||||||
|
Вы действительно хотите завершить сделку {summary.name}?
|
||||||
|
</Flex>,
|
||||||
|
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) => {
|
const onDragEnd = async (result: DropResult) => {
|
||||||
setIsDragEnded(true);
|
setIsDragEnded(true);
|
||||||
// If there is no changes
|
// If there is no changes
|
||||||
@@ -78,6 +101,10 @@ export const LeadsPage: FC = () => {
|
|||||||
onDelete(dealId);
|
onDelete(dealId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (droppableId === 'SUCCESS') {
|
||||||
|
onSuccess(dealId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const status = getDealStatusByName(droppableId);
|
const status = getDealStatusByName(droppableId);
|
||||||
const request: Partial<DealSummaryReorderRequest> = {
|
const request: Partial<DealSummaryReorderRequest> = {
|
||||||
dealId: dealId,
|
dealId: dealId,
|
||||||
@@ -122,7 +149,13 @@ export const LeadsPage: FC = () => {
|
|||||||
}
|
}
|
||||||
const getBoardBody = () => {
|
const getBoardBody = () => {
|
||||||
return (
|
return (
|
||||||
|
|
||||||
<motion.div
|
<motion.div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
height: "100%",
|
||||||
|
flex: 1
|
||||||
|
}}
|
||||||
key={displayMode}
|
key={displayMode}
|
||||||
initial={{opacity: 0}}
|
initial={{opacity: 0}}
|
||||||
animate={{opacity: 1}}
|
animate={{opacity: 1}}
|
||||||
@@ -134,78 +167,120 @@ export const LeadsPage: FC = () => {
|
|||||||
setIsDragEnded(false);
|
setIsDragEnded(false);
|
||||||
}}
|
}}
|
||||||
onDragEnd={onDragEnd}>
|
onDragEnd={onDragEnd}>
|
||||||
<div className={styles['boards']}>
|
<Flex
|
||||||
<Board
|
justify={"space-between"}
|
||||||
withCreateButton
|
direction={"column"}
|
||||||
summaries={summaries
|
style={{flex: 1}}
|
||||||
.filter(summary => summary.status == DealStatus.AWAITING_ACCEPTANCE)}
|
>
|
||||||
title={"Ожидает приемки"}
|
|
||||||
droppableId={"AWAITING_ACCEPTANCE"}
|
|
||||||
color={'#4A90E2'}
|
|
||||||
/>
|
|
||||||
<Board
|
|
||||||
summaries={summaries
|
|
||||||
.filter(summary => summary.status == DealStatus.PACKAGING)}
|
|
||||||
title={"Упаковка"}
|
|
||||||
droppableId={"PACKAGING"}
|
|
||||||
color={'#F5A623'}
|
|
||||||
|
|
||||||
/>
|
<div className={styles['boards']}>
|
||||||
<Board
|
<Board
|
||||||
summaries={summaries
|
withCreateButton
|
||||||
.filter(summary => summary.status == DealStatus.AWAITING_SHIPMENT)}
|
summaries={summaries
|
||||||
title={"Ожидает отгрузки"}
|
.filter(summary => summary.status == DealStatus.AWAITING_ACCEPTANCE)}
|
||||||
droppableId={"AWAITING_SHIPMENT"}
|
title={"Ожидает приемки"}
|
||||||
color={'#7ED321'}
|
droppableId={"AWAITING_ACCEPTANCE"}
|
||||||
|
color={'#4A90E2'}
|
||||||
|
/>
|
||||||
|
<Board
|
||||||
|
summaries={summaries
|
||||||
|
.filter(summary => summary.status == DealStatus.PACKAGING)}
|
||||||
|
title={"Упаковка"}
|
||||||
|
droppableId={"PACKAGING"}
|
||||||
|
color={'#F5A623'}
|
||||||
|
|
||||||
/>
|
/>
|
||||||
<Board
|
<Board
|
||||||
summaries={summaries
|
summaries={summaries
|
||||||
.filter(summary => summary.status == DealStatus.AWAITING_PAYMENT)}
|
.filter(summary => summary.status == DealStatus.AWAITING_SHIPMENT)}
|
||||||
title={"Ожидает оплаты"}
|
title={"Ожидает отгрузки"}
|
||||||
droppableId={"AWAITING_PAYMENT"}
|
droppableId={"AWAITING_SHIPMENT"}
|
||||||
color={'#D0021B'}
|
color={'#7ED321'}
|
||||||
|
|
||||||
/>
|
/>
|
||||||
<Board
|
<Board
|
||||||
summaries={summaries
|
summaries={summaries
|
||||||
.filter(summary => summary.status == DealStatus.COMPLETED)}
|
.filter(summary => summary.status == DealStatus.AWAITING_PAYMENT)}
|
||||||
title={"Завершена"}
|
title={"Ожидает оплаты"}
|
||||||
droppableId={"COMPLETED"}
|
droppableId={"AWAITING_PAYMENT"}
|
||||||
color={'#417505'}
|
color={'#D0021B'}
|
||||||
/>
|
|
||||||
</div>
|
/>
|
||||||
<Flex justify={"flex-end"}>
|
<Board
|
||||||
<div
|
summaries={summaries
|
||||||
className={
|
.filter(summary => summary.status == DealStatus.COMPLETED)}
|
||||||
classNames(
|
title={"Завершена"}
|
||||||
styles['delete'],
|
droppableId={"COMPLETED"}
|
||||||
isDragEnded && styles['delete-hidden']
|
color={'#417505'}
|
||||||
)
|
/>
|
||||||
}
|
</div>
|
||||||
>
|
<Flex justify={"space-between"} gap={rem(10)}>
|
||||||
<Droppable droppableId={"DELETE"}>
|
<div
|
||||||
{(provided) => (
|
className={
|
||||||
<>
|
classNames(
|
||||||
<div
|
styles['delete'],
|
||||||
{...provided.droppableProps}
|
isDragEnded && styles['delete-hidden']
|
||||||
ref={provided.innerRef}
|
)
|
||||||
>
|
}
|
||||||
{!isDragEnded &&
|
>
|
||||||
<span>
|
<Droppable droppableId={"DELETE"}>
|
||||||
|
{(provided, snapshot) => (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
{...provided.droppableProps}
|
||||||
|
ref={provided.innerRef}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
!isDragEnded
|
||||||
|
&&
|
||||||
|
!snapshot.isDraggingOver &&
|
||||||
|
<span>
|
||||||
Удалить
|
Удалить
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{provided.placeholder}
|
{provided.placeholder}
|
||||||
</>
|
</>
|
||||||
|
|
||||||
)}
|
)}
|
||||||
</Droppable>
|
</Droppable>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
className={
|
||||||
|
classNames(
|
||||||
|
styles['delete'],
|
||||||
|
isDragEnded && styles['delete-hidden']
|
||||||
|
)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Droppable droppableId={"SUCCESS"}>
|
||||||
|
{(provided, snapshot) => (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
{...provided.droppableProps}
|
||||||
|
ref={provided.innerRef}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
!isDragEnded
|
||||||
|
&&
|
||||||
|
!snapshot.isDraggingOver &&
|
||||||
|
<span>
|
||||||
|
Успешно завершена
|
||||||
|
</span>
|
||||||
|
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
{provided.placeholder}
|
||||||
|
</>
|
||||||
|
|
||||||
|
)}
|
||||||
|
</Droppable>
|
||||||
|
</div>
|
||||||
|
</Flex>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
</DragDropContext>
|
</DragDropContext>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user