From d0a32b938ce6ebfeb156f6722ed1646b3c902e0d Mon Sep 17 00:00:00 2001 From: fakz9 Date: Sun, 28 Apr 2024 04:55:19 +0300 Subject: [PATCH] v0.1 --- src/client/index.ts | 3 +- src/client/models/DealDeleteRequest.ts | 8 ++ ...orderResponse.ts => DealDeleteResponse.ts} | 2 +- src/client/models/DealStatusHistorySchema.ts | 3 +- src/client/models/DealSummary.ts | 1 + .../models/DealSummaryReorderRequest.ts | 6 +- src/client/services/DealService.ts | 27 +++- src/components/Dnd/Board/Board.tsx | 14 ++- .../Dnd/CreateDealButton/CreateDealButton.tsx | 6 + .../Dnd/DealSummaryCard/DealSummaryCard.tsx | 22 +++- src/components/Navbar/Navbar.tsx | 12 +- src/components/PageBlock/PageBlock.module.css | 7 +- src/components/PageBlock/PageBlock.tsx | 9 +- .../EnterDeadlineModal/EnterDeadlineModal.tsx | 27 ++-- .../DealStatusChangeTable.tsx | 1 + .../DealStatusChangeTable/columns.tsx | 12 ++ .../LeadsPage/hooks/useDealSummaries.tsx | 8 +- src/pages/LeadsPage/ui/LeadsPage.module.css | 19 +++ src/pages/LeadsPage/ui/LeadsPage.tsx | 118 ++++++++++++++++-- src/pages/LoginPage/LoginPage.tsx | 2 +- src/pages/MainPage/MainPage.tsx | 4 +- src/pages/PageWrapper/PageWrapper.module.css | 1 - src/pages/PageWrapper/PageWrapper.tsx | 4 +- .../ProductsPage/ui/ProductsPage.module.css | 1 - src/shared/lib/utils.ts | 15 +++ 25 files changed, 274 insertions(+), 58 deletions(-) create mode 100644 src/client/models/DealDeleteRequest.ts rename src/client/models/{DealSummaryReorderResponse.ts => DealDeleteResponse.ts} (80%) diff --git a/src/client/index.ts b/src/client/index.ts index 6053fac..907ca4e 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -32,6 +32,8 @@ export type { DealDeleteProductRequest } from './models/DealDeleteProductRequest export type { DealDeleteProductResponse } from './models/DealDeleteProductResponse'; export type { DealDeleteProductsRequest } from './models/DealDeleteProductsRequest'; export type { DealDeleteProductsResponse } from './models/DealDeleteProductsResponse'; +export type { DealDeleteRequest } from './models/DealDeleteRequest'; +export type { DealDeleteResponse } from './models/DealDeleteResponse'; export type { DealDeleteServiceRequest } from './models/DealDeleteServiceRequest'; export type { DealDeleteServiceResponse } from './models/DealDeleteServiceResponse'; export type { DealDeleteServicesRequest } from './models/DealDeleteServicesRequest'; @@ -46,7 +48,6 @@ export type { DealServiceSchema } from './models/DealServiceSchema'; export type { DealStatusHistorySchema } from './models/DealStatusHistorySchema'; export type { DealSummary } from './models/DealSummary'; export type { DealSummaryReorderRequest } from './models/DealSummaryReorderRequest'; -export type { DealSummaryReorderResponse } from './models/DealSummaryReorderResponse'; export type { DealSummaryResponse } from './models/DealSummaryResponse'; export type { DealUpdateGeneralInfoRequest } from './models/DealUpdateGeneralInfoRequest'; export type { DealUpdateGeneralInfoResponse } from './models/DealUpdateGeneralInfoResponse'; diff --git a/src/client/models/DealDeleteRequest.ts b/src/client/models/DealDeleteRequest.ts new file mode 100644 index 0000000..480c649 --- /dev/null +++ b/src/client/models/DealDeleteRequest.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DealDeleteRequest = { + dealId: number; +}; + diff --git a/src/client/models/DealSummaryReorderResponse.ts b/src/client/models/DealDeleteResponse.ts similarity index 80% rename from src/client/models/DealSummaryReorderResponse.ts rename to src/client/models/DealDeleteResponse.ts index f3a090b..e6b98c6 100644 --- a/src/client/models/DealSummaryReorderResponse.ts +++ b/src/client/models/DealDeleteResponse.ts @@ -2,7 +2,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type DealSummaryReorderResponse = { +export type DealDeleteResponse = { ok: boolean; message: string; }; diff --git a/src/client/models/DealStatusHistorySchema.ts b/src/client/models/DealStatusHistorySchema.ts index 6fe5349..ba090a0 100644 --- a/src/client/models/DealStatusHistorySchema.ts +++ b/src/client/models/DealStatusHistorySchema.ts @@ -8,6 +8,7 @@ export type DealStatusHistorySchema = { changedAt: string; fromStatus: number; toStatus: number; - nextStatusDeadline: string; + nextStatusDeadline: (string | null); + comment?: (string | null); }; diff --git a/src/client/models/DealSummary.ts b/src/client/models/DealSummary.ts index 1d690f4..ecf8788 100644 --- a/src/client/models/DealSummary.ts +++ b/src/client/models/DealSummary.ts @@ -7,6 +7,7 @@ export type DealSummary = { name: string; clientName: string; changedAt: string; + deadline: string; status: number; totalPrice: number; rank: number; diff --git a/src/client/models/DealSummaryReorderRequest.ts b/src/client/models/DealSummaryReorderRequest.ts index f2125fb..4846b70 100644 --- a/src/client/models/DealSummaryReorderRequest.ts +++ b/src/client/models/DealSummaryReorderRequest.ts @@ -4,9 +4,9 @@ /* eslint-disable */ export type DealSummaryReorderRequest = { dealId: number; - newStatus: number; - rank: number; - nextStatusDeadline: string; + status: number; + index: number; + deadline: string; comment: string; }; diff --git a/src/client/services/DealService.ts b/src/client/services/DealService.ts index 879f499..6febd3f 100644 --- a/src/client/services/DealService.ts +++ b/src/client/services/DealService.ts @@ -15,6 +15,8 @@ import type { DealDeleteProductRequest } from '../models/DealDeleteProductReques import type { DealDeleteProductResponse } from '../models/DealDeleteProductResponse'; import type { DealDeleteProductsRequest } from '../models/DealDeleteProductsRequest'; import type { DealDeleteProductsResponse } from '../models/DealDeleteProductsResponse'; +import type { DealDeleteRequest } from '../models/DealDeleteRequest'; +import type { DealDeleteResponse } from '../models/DealDeleteResponse'; import type { DealDeleteServiceRequest } from '../models/DealDeleteServiceRequest'; import type { DealDeleteServiceResponse } from '../models/DealDeleteServiceResponse'; import type { DealDeleteServicesRequest } from '../models/DealDeleteServicesRequest'; @@ -24,7 +26,6 @@ import type { DealQuickCreateRequest } from '../models/DealQuickCreateRequest'; import type { DealQuickCreateResponse } from '../models/DealQuickCreateResponse'; import type { DealSchema } from '../models/DealSchema'; import type { DealSummaryReorderRequest } from '../models/DealSummaryReorderRequest'; -import type { DealSummaryReorderResponse } from '../models/DealSummaryReorderResponse'; import type { DealSummaryResponse } from '../models/DealSummaryResponse'; import type { DealUpdateGeneralInfoRequest } from '../models/DealUpdateGeneralInfoRequest'; import type { DealUpdateGeneralInfoResponse } from '../models/DealUpdateGeneralInfoResponse'; @@ -56,6 +57,26 @@ export class DealService { }, }); } + /** + * Delete + * @returns DealDeleteResponse Successful Response + * @throws ApiError + */ + public static deleteDeal({ + requestBody, + }: { + requestBody: DealDeleteRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/deal/delete', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } /** * Quick Create * @returns DealQuickCreateResponse Successful Response @@ -109,14 +130,14 @@ export class DealService { } /** * Reorder - * @returns DealSummaryReorderResponse Successful Response + * @returns DealSummaryResponse Successful Response * @throws ApiError */ public static reorderDealSummaries({ requestBody, }: { requestBody: DealSummaryReorderRequest, - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/deal/summaries/reorder', diff --git a/src/components/Dnd/Board/Board.tsx b/src/components/Dnd/Board/Board.tsx index 419cd81..6c8872e 100644 --- a/src/components/Dnd/Board/Board.tsx +++ b/src/components/Dnd/Board/Board.tsx @@ -6,23 +6,29 @@ import CreateDealButton from "../CreateDealButton/CreateDealButton.tsx"; import {DealSummary} from "../../../client"; import DealSummaryCard from "../DealSummaryCard/DealSummaryCard.tsx"; import classNames from "classnames"; +import {getPluralForm} from "../../../shared/lib/utils.ts"; +import {sum} from "lodash"; type Props = { droppableId: string; title: string; withCreateButton?: boolean; summaries: DealSummary[]; + color: string; } -export const Board: FC = ({droppableId, title, summaries, withCreateButton = false}) => { - +export const Board: FC = ({droppableId, title, summaries, color, withCreateButton = false}) => { + const getDealsText = () => { + const pluralForm = getPluralForm(summaries.length, 'сделка', 'сделки', 'сделок'); + return `${summaries.length} ${pluralForm}: ${sum(summaries.map(summary => summary.totalPrice))}₽`; + } return (
{title} - 12 сделок: 500р - + {getDealsText()} +
void; @@ -12,6 +13,8 @@ type Props = { const CreateDealButton: FC = () => { const [isCreating, setIsCreating] = useState(false); const [isTransitionEnded, setIsTransitionEnded] = useState(true); + const queryClient = useQueryClient(); + return (
{ @@ -41,6 +44,9 @@ const CreateDealButton: FC = () => { ...quickDeal, acceptanceDate: dateWithoutTimezone(quickDeal.acceptanceDate) } + }).then(async () => { + await queryClient.invalidateQueries({queryKey: ['getDealSummaries']}); + setIsCreating(false); }) }} /> diff --git a/src/components/Dnd/DealSummaryCard/DealSummaryCard.tsx b/src/components/Dnd/DealSummaryCard/DealSummaryCard.tsx index 3890482..253e573 100644 --- a/src/components/Dnd/DealSummaryCard/DealSummaryCard.tsx +++ b/src/components/Dnd/DealSummaryCard/DealSummaryCard.tsx @@ -18,12 +18,26 @@ const DealSummaryCard: FC = ({dealSummary}) => { setSelectedDeal(deal); }) } + const getDeadlineTextColor = (deadline: string) => { + // generate three colors, yellow for 1 day, red for 0 days, green for more than 1 day + const deadlineDate = new Date(deadline); + const currentDate = new Date(); + const diff = deadlineDate.getTime() - currentDate.getTime(); + const diffDays = Math.ceil(diff / (1000 * 3600 * 24)); + if (diffDays === 1) { + return 'yellow.8'; + } + if (diffDays === 0) { + return 'red.8'; + } + return 'green.8'; + } return (
onDealSummaryClick()} className={styles['container']}>
- {dealSummary.clientName} + Клиент: {dealSummary.clientName}
@@ -38,12 +52,12 @@ const DealSummaryCard: FC = ({dealSummary}) => {
- {new Date(dealSummary.changedAt).toLocaleString('ru-RU')} + {/*Создана: {new Date(dealSummary.changedAt).toLocaleString('ru-RU')}*/}
- - Нет задач + + {new Date(dealSummary.deadline).toLocaleString('ru-RU').slice(0, -3)}
diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index b4f33f4..8d4ca4c 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -30,11 +30,11 @@ function NavbarLink(props: NavbarLinkProps) { } const mockdata = [ - { - icon: IconHome2, - label: 'Главная', - href: '/' - }, + // { + // icon: IconHome2, + // label: 'Главная', + // href: '/' + // }, { icon: IconCash, label: 'Сделки', @@ -83,7 +83,7 @@ export function Navbar() {