From 6acb34271d9db9507f7fc8eaf30d28dff3f5c32b Mon Sep 17 00:00:00 2001 From: fakz9 Date: Mon, 13 May 2024 07:46:24 +0300 Subject: [PATCH] feat: deal product services --- src/client/index.ts | 4 + src/client/models/BaseEnumListSchema.ts | 9 ++ src/client/models/BaseEnumSchema.ts | 9 ++ src/client/models/DealProductSchema.ts | 2 + src/client/models/DealServiceSchema.ts | 1 + src/client/models/ServicePriceRangeSchema.ts | 11 ++ src/client/models/ServiceSchema.ts | 3 + src/client/services/ServiceService.ts | 12 +++ .../Selects/BaseEnumSelect/BaseEnumSelect.tsx | 68 ++++++++++++ .../ServiceSelectNew/ServiceSelectNew.tsx | 25 +++++ .../DealProductServiceTable.tsx | 30 ++++++ .../ServicePriceInput/RangePriceInput.tsx | 100 ++++++++++++++++++ .../ServicePriceInput/ServicePriceInput.tsx | 38 +++++++ .../ServicePriceInput/SinglePriceInput.tsx | 14 +++ .../ServiceTypeSelect/ServiceTypeSelect.tsx | 15 +++ .../modals/CreateServiceModal.tsx | 49 ++++++--- src/routes/test.lazy.tsx | 31 +++--- src/shared/enums/ServiceType.ts | 4 + src/types/utils.ts | 6 ++ 19 files changed, 401 insertions(+), 30 deletions(-) create mode 100644 src/client/models/BaseEnumListSchema.ts create mode 100644 src/client/models/BaseEnumSchema.ts create mode 100644 src/client/models/ServicePriceRangeSchema.ts create mode 100644 src/components/Selects/BaseEnumSelect/BaseEnumSelect.tsx create mode 100644 src/components/Selects/ServiceSelectNew/ServiceSelectNew.tsx create mode 100644 src/pages/LeadsPage/components/DealProductsTable/DealProductServiceTable.tsx create mode 100644 src/pages/ServicesPage/components/ServicePriceInput/RangePriceInput.tsx create mode 100644 src/pages/ServicesPage/components/ServicePriceInput/ServicePriceInput.tsx create mode 100644 src/pages/ServicesPage/components/ServicePriceInput/SinglePriceInput.tsx create mode 100644 src/pages/ServicesPage/components/ServiceTypeSelect/ServiceTypeSelect.tsx create mode 100644 src/shared/enums/ServiceType.ts diff --git a/src/client/index.ts b/src/client/index.ts index dd66a79..1bb8ce0 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -21,6 +21,8 @@ export type { BarcodeTemplateSchema } from './models/BarcodeTemplateSchema'; export type { BarcodeTemplateSizeSchema } from './models/BarcodeTemplateSizeSchema'; export type { BarcodeTemplateUpdateRequest } from './models/BarcodeTemplateUpdateRequest'; export type { BarcodeTemplateUpdateResponse } from './models/BarcodeTemplateUpdateResponse'; +export type { BaseEnumListSchema } from './models/BaseEnumListSchema'; +export type { BaseEnumSchema } from './models/BaseEnumSchema'; export type { ClientCreateRequest } from './models/ClientCreateRequest'; export type { ClientCreateResponse } from './models/ClientCreateResponse'; export type { ClientDeleteRequest } from './models/ClientDeleteRequest'; @@ -55,6 +57,7 @@ export type { DealDeleteServicesResponse } from './models/DealDeleteServicesResp export type { DealGeneralInfoSchema } from './models/DealGeneralInfoSchema'; export type { DealGetAllResponse } from './models/DealGetAllResponse'; export type { DealProductSchema } from './models/DealProductSchema'; +export type { DealProductServiceSchema } from './models/DealProductServiceSchema'; export type { DealQuickCreateRequest } from './models/DealQuickCreateRequest'; export type { DealQuickCreateResponse } from './models/DealQuickCreateResponse'; export type { DealSchema } from './models/DealSchema'; @@ -100,6 +103,7 @@ export type { ServiceDeleteRequest } from './models/ServiceDeleteRequest'; export type { ServiceDeleteResponse } from './models/ServiceDeleteResponse'; export type { ServiceGetAllCategoriesResponse } from './models/ServiceGetAllCategoriesResponse'; export type { ServiceGetAllResponse } from './models/ServiceGetAllResponse'; +export type { ServicePriceRangeSchema } from './models/ServicePriceRangeSchema'; export type { ServiceSchema } from './models/ServiceSchema'; export type { ServiceUpdateRequest } from './models/ServiceUpdateRequest'; export type { ServiceUpdateResponse } from './models/ServiceUpdateResponse'; diff --git a/src/client/models/BaseEnumListSchema.ts b/src/client/models/BaseEnumListSchema.ts new file mode 100644 index 0000000..52732a2 --- /dev/null +++ b/src/client/models/BaseEnumListSchema.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseEnumSchema } from './BaseEnumSchema'; +export type BaseEnumListSchema = { + items: Array; +}; + diff --git a/src/client/models/BaseEnumSchema.ts b/src/client/models/BaseEnumSchema.ts new file mode 100644 index 0000000..89b0fcc --- /dev/null +++ b/src/client/models/BaseEnumSchema.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BaseEnumSchema = { + id: number; + name: string; +}; + diff --git a/src/client/models/DealProductSchema.ts b/src/client/models/DealProductSchema.ts index c9ec006..44fecce 100644 --- a/src/client/models/DealProductSchema.ts +++ b/src/client/models/DealProductSchema.ts @@ -2,9 +2,11 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { DealProductServiceSchema } from './DealProductServiceSchema'; import type { ProductSchema } from './ProductSchema'; export type DealProductSchema = { product: ProductSchema; + services: Array; quantity: number; }; diff --git a/src/client/models/DealServiceSchema.ts b/src/client/models/DealServiceSchema.ts index de738f9..ec6cabd 100644 --- a/src/client/models/DealServiceSchema.ts +++ b/src/client/models/DealServiceSchema.ts @@ -6,5 +6,6 @@ import type { ServiceSchema } from './ServiceSchema'; export type DealServiceSchema = { service: ServiceSchema; quantity: number; + price: number; }; diff --git a/src/client/models/ServicePriceRangeSchema.ts b/src/client/models/ServicePriceRangeSchema.ts new file mode 100644 index 0000000..a73e3ea --- /dev/null +++ b/src/client/models/ServicePriceRangeSchema.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ServicePriceRangeSchema = { + id: (number | null); + fromQuantity: number; + toQuantity: number; + price: number; +}; + diff --git a/src/client/models/ServiceSchema.ts b/src/client/models/ServiceSchema.ts index 5d78fa3..61b45dc 100644 --- a/src/client/models/ServiceSchema.ts +++ b/src/client/models/ServiceSchema.ts @@ -3,10 +3,13 @@ /* tslint:disable */ /* eslint-disable */ import type { ServiceCategorySchema } from './ServiceCategorySchema'; +import type { ServicePriceRangeSchema } from './ServicePriceRangeSchema'; export type ServiceSchema = { id: number; name: string; category: ServiceCategorySchema; price: number; + serviceType: number; + priceRanges: Array; }; diff --git a/src/client/services/ServiceService.ts b/src/client/services/ServiceService.ts index 02c7955..cdd3aef 100644 --- a/src/client/services/ServiceService.ts +++ b/src/client/services/ServiceService.ts @@ -2,6 +2,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { BaseEnumListSchema } from '../models/BaseEnumListSchema'; import type { ServiceCreateCategoryRequest } from '../models/ServiceCreateCategoryRequest'; import type { ServiceCreateCategoryResponse } from '../models/ServiceCreateCategoryResponse'; import type { ServiceCreateRequest } from '../models/ServiceCreateRequest'; @@ -118,4 +119,15 @@ export class ServiceService { }, }); } + /** + * Get All Service Types + * @returns BaseEnumListSchema Successful Response + * @throws ApiError + */ + public static getAllServiceTypes(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/service/types/get-all', + }); + } } diff --git a/src/components/Selects/BaseEnumSelect/BaseEnumSelect.tsx b/src/components/Selects/BaseEnumSelect/BaseEnumSelect.tsx new file mode 100644 index 0000000..8df7af4 --- /dev/null +++ b/src/components/Selects/BaseEnumSelect/BaseEnumSelect.tsx @@ -0,0 +1,68 @@ +import {BaseEnumListSchema, type CancelablePromise} from "../../../client"; +import {FC, useEffect, useMemo, useState} from "react"; +import {useQuery} from "@tanstack/react-query"; +import {Select, SelectProps} from "@mantine/core"; +import {omit} from "lodash"; + +type ControlledValueProps = { + value: number, + onChange: (value: number) => void; +} + + +type RestProps = { + defaultValue?: number; + onChange: (value: number) => void; + fetchFn: () => CancelablePromise; + queryKey: string; +} +export type BaseEnumSelectProps = + (RestProps & Partial) + & Omit; + +export type EnumSelectProps = Omit; + +const BaseEnumSelect: FC = (props: BaseEnumSelectProps) => { + const {data: queryData = []} = useQuery({ + queryKey: [props.queryKey], + queryFn: props.fetchFn, + select: data => data.items || [] + }) + const isControlled = 'value' in props; + const [internalValue, setInternalValue] = useState(props.defaultValue); + const value = isControlled ? props.value : internalValue; + const selectData = useMemo(() => queryData.reduce((acc, item) => { + acc.push({ + label: item.name, + value: item.id.toString() + }); + return acc; + }, [] as { label: string, value: string }[]), [queryData]); + const handleOnChange = (event: string | null) => { + if (typeof event === 'undefined' || event === null) return; + const object = queryData.find(item => event == item.id.toString()); + if (!object) return; + if (isControlled) { + props.onChange(parseInt(event)); + return; + } + setInternalValue(parseInt(event)); + } + const restProps = omit(props, ['fetchFn', 'queryKey']) + useEffect(() => { + if (isControlled || typeof internalValue === 'undefined') return; + props.onChange(internalValue); + }, [internalValue]); + return ( +