diff --git a/src/api/barcode/useGetAllBarcodeTemplates.tsx b/src/api/barcode/useGetAllBarcodeTemplates.tsx new file mode 100644 index 0000000..c4ec26b --- /dev/null +++ b/src/api/barcode/useGetAllBarcodeTemplates.tsx @@ -0,0 +1,14 @@ +import {useQuery} from "@tanstack/react-query"; +import {BarcodeService} from "../../client"; + +const useGetAllBarcodeTemplates = () => { + const {data, error, isLoading, refetch} = useQuery({ + queryKey: ['getAllBarcodeTemplates'], + queryFn: () => BarcodeService.getAllBarcodeTemplates(), + select: (data) => data.templates + }); + const barcodeTemplates = isLoading || error || !data ? [] : data; + return {barcodeTemplates, refetch} +} + +export default useGetAllBarcodeTemplates; \ No newline at end of file diff --git a/src/client/index.ts b/src/client/index.ts index 310107f..46bbaeb 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -9,6 +9,12 @@ export type { OpenAPIConfig } from './core/OpenAPI'; export type { AuthLoginRequest } from './models/AuthLoginRequest'; export type { AuthLoginResponse } from './models/AuthLoginResponse'; +export type { BarcodeTemplateAttributeSchema } from './models/BarcodeTemplateAttributeSchema'; +export type { BarcodeTemplateCreateRequest } from './models/BarcodeTemplateCreateRequest'; +export type { BarcodeTemplateCreateResponse } from './models/BarcodeTemplateCreateResponse'; +export type { BarcodeTemplateSchema } from './models/BarcodeTemplateSchema'; +export type { BarcodeTemplateUpdateRequest } from './models/BarcodeTemplateUpdateRequest'; +export type { BarcodeTemplateUpdateResponse } from './models/BarcodeTemplateUpdateResponse'; export type { ClientCreateRequest } from './models/ClientCreateRequest'; export type { ClientCreateResponse } from './models/ClientCreateResponse'; export type { ClientDeleteRequest } from './models/ClientDeleteRequest'; @@ -19,6 +25,8 @@ export type { ClientSchema } from './models/ClientSchema'; export type { ClientUpdateDetailsRequest } from './models/ClientUpdateDetailsRequest'; export type { ClientUpdateRequest } from './models/ClientUpdateRequest'; export type { ClientUpdateResponse } from './models/ClientUpdateResponse'; +export type { CreateBarcodeTemplateAttributeRequest } from './models/CreateBarcodeTemplateAttributeRequest'; +export type { CreateBarcodeTemplateAttributeResponse } from './models/CreateBarcodeTemplateAttributeResponse'; export type { DealAddProductRequest } from './models/DealAddProductRequest'; export type { DealAddProductResponse } from './models/DealAddProductResponse'; export type { DealAddServiceRequest } from './models/DealAddServiceRequest'; @@ -55,6 +63,10 @@ export type { DealUpdateProductQuantityRequest } from './models/DealUpdateProduc export type { DealUpdateProductQuantityResponse } from './models/DealUpdateProductQuantityResponse'; export type { DealUpdateServiceQuantityRequest } from './models/DealUpdateServiceQuantityRequest'; export type { DealUpdateServiceQuantityResponse } from './models/DealUpdateServiceQuantityResponse'; +export type { GetAllBarcodeTemplateAttributesResponse } from './models/GetAllBarcodeTemplateAttributesResponse'; +export type { GetAllBarcodeTemplatesResponse } from './models/GetAllBarcodeTemplatesResponse'; +export type { GetBarcodeTemplateByIdRequest } from './models/GetBarcodeTemplateByIdRequest'; +export type { GetBarcodeTemplateByIdResponse } from './models/GetBarcodeTemplateByIdResponse'; export type { HTTPValidationError } from './models/HTTPValidationError'; export type { PaginationInfoSchema } from './models/PaginationInfoSchema'; export type { ProductAddBarcodeRequest } from './models/ProductAddBarcodeRequest'; @@ -86,6 +98,7 @@ export type { UserSchema } from './models/UserSchema'; export type { ValidationError } from './models/ValidationError'; export { AuthService } from './services/AuthService'; +export { BarcodeService } from './services/BarcodeService'; export { ClientService } from './services/ClientService'; export { DealService } from './services/DealService'; export { ProductService } from './services/ProductService'; diff --git a/src/client/models/BarcodeTemplateAttributeSchema.ts b/src/client/models/BarcodeTemplateAttributeSchema.ts new file mode 100644 index 0000000..32484a8 --- /dev/null +++ b/src/client/models/BarcodeTemplateAttributeSchema.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BarcodeTemplateAttributeSchema = { + id: number; + key: string; + name: string; +}; + diff --git a/src/client/models/BarcodeTemplateCreateRequest.ts b/src/client/models/BarcodeTemplateCreateRequest.ts new file mode 100644 index 0000000..1da5081 --- /dev/null +++ b/src/client/models/BarcodeTemplateCreateRequest.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BarcodeTemplateCreateRequest = { + name: string; + isDefault: boolean; + width: number; + height: number; + attributeIds: Array; +}; + diff --git a/src/client/models/BarcodeTemplateCreateResponse.ts b/src/client/models/BarcodeTemplateCreateResponse.ts new file mode 100644 index 0000000..58f4d38 --- /dev/null +++ b/src/client/models/BarcodeTemplateCreateResponse.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BarcodeTemplateCreateResponse = { + ok: boolean; + message: string; + id: number; +}; + diff --git a/src/client/models/BarcodeTemplateSchema.ts b/src/client/models/BarcodeTemplateSchema.ts new file mode 100644 index 0000000..87069a3 --- /dev/null +++ b/src/client/models/BarcodeTemplateSchema.ts @@ -0,0 +1,14 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BarcodeTemplateAttributeSchema } from './BarcodeTemplateAttributeSchema'; +export type BarcodeTemplateSchema = { + name: string; + isDefault: boolean; + width: number; + height: number; + id: number; + attributes: Array; +}; + diff --git a/src/client/models/BarcodeTemplateUpdateRequest.ts b/src/client/models/BarcodeTemplateUpdateRequest.ts new file mode 100644 index 0000000..86bf32f --- /dev/null +++ b/src/client/models/BarcodeTemplateUpdateRequest.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BarcodeTemplateUpdateRequest = { + name: string; + isDefault: boolean; + width: number; + height: number; + id: number; + attributeIds: Array; +}; + diff --git a/src/client/models/BarcodeTemplateUpdateResponse.ts b/src/client/models/BarcodeTemplateUpdateResponse.ts new file mode 100644 index 0000000..14f6d35 --- /dev/null +++ b/src/client/models/BarcodeTemplateUpdateResponse.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BarcodeTemplateUpdateResponse = { + ok: boolean; + message: string; +}; + diff --git a/src/client/models/CreateBarcodeTemplateAttributeRequest.ts b/src/client/models/CreateBarcodeTemplateAttributeRequest.ts new file mode 100644 index 0000000..8ee49da --- /dev/null +++ b/src/client/models/CreateBarcodeTemplateAttributeRequest.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type CreateBarcodeTemplateAttributeRequest = { + name: string; + label: string; +}; + diff --git a/src/client/models/CreateBarcodeTemplateAttributeResponse.ts b/src/client/models/CreateBarcodeTemplateAttributeResponse.ts new file mode 100644 index 0000000..e1d66bb --- /dev/null +++ b/src/client/models/CreateBarcodeTemplateAttributeResponse.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type CreateBarcodeTemplateAttributeResponse = { + ok: boolean; + message: string; + id: number; +}; + diff --git a/src/client/models/GetAllBarcodeTemplateAttributesResponse.ts b/src/client/models/GetAllBarcodeTemplateAttributesResponse.ts new file mode 100644 index 0000000..32cd0fa --- /dev/null +++ b/src/client/models/GetAllBarcodeTemplateAttributesResponse.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BarcodeTemplateAttributeSchema } from './BarcodeTemplateAttributeSchema'; +export type GetAllBarcodeTemplateAttributesResponse = { + attributes: Array; +}; + diff --git a/src/client/models/GetAllBarcodeTemplatesResponse.ts b/src/client/models/GetAllBarcodeTemplatesResponse.ts new file mode 100644 index 0000000..b9b3820 --- /dev/null +++ b/src/client/models/GetAllBarcodeTemplatesResponse.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BarcodeTemplateSchema } from './BarcodeTemplateSchema'; +export type GetAllBarcodeTemplatesResponse = { + templates: Array; +}; + diff --git a/src/client/models/GetBarcodeTemplateByIdRequest.ts b/src/client/models/GetBarcodeTemplateByIdRequest.ts new file mode 100644 index 0000000..44a3f1a --- /dev/null +++ b/src/client/models/GetBarcodeTemplateByIdRequest.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type GetBarcodeTemplateByIdRequest = { + id: number; +}; + diff --git a/src/client/models/GetBarcodeTemplateByIdResponse.ts b/src/client/models/GetBarcodeTemplateByIdResponse.ts new file mode 100644 index 0000000..dc6d496 --- /dev/null +++ b/src/client/models/GetBarcodeTemplateByIdResponse.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BarcodeTemplateSchema } from './BarcodeTemplateSchema'; +export type GetBarcodeTemplateByIdResponse = { + barcodeTemplate: BarcodeTemplateSchema; +}; + diff --git a/src/client/services/BarcodeService.ts b/src/client/services/BarcodeService.ts new file mode 100644 index 0000000..525d1fe --- /dev/null +++ b/src/client/services/BarcodeService.ts @@ -0,0 +1,121 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BarcodeTemplateCreateRequest } from '../models/BarcodeTemplateCreateRequest'; +import type { BarcodeTemplateCreateResponse } from '../models/BarcodeTemplateCreateResponse'; +import type { BarcodeTemplateUpdateRequest } from '../models/BarcodeTemplateUpdateRequest'; +import type { BarcodeTemplateUpdateResponse } from '../models/BarcodeTemplateUpdateResponse'; +import type { CreateBarcodeTemplateAttributeRequest } from '../models/CreateBarcodeTemplateAttributeRequest'; +import type { CreateBarcodeTemplateAttributeResponse } from '../models/CreateBarcodeTemplateAttributeResponse'; +import type { GetAllBarcodeTemplateAttributesResponse } from '../models/GetAllBarcodeTemplateAttributesResponse'; +import type { GetAllBarcodeTemplatesResponse } from '../models/GetAllBarcodeTemplatesResponse'; +import type { GetBarcodeTemplateByIdRequest } from '../models/GetBarcodeTemplateByIdRequest'; +import type { GetBarcodeTemplateByIdResponse } from '../models/GetBarcodeTemplateByIdResponse'; +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +export class BarcodeService { + /** + * Get Barcode Template By Id + * @returns GetBarcodeTemplateByIdResponse Successful Response + * @throws ApiError + */ + public static getBarcodeTemplateById({ + requestBody, + }: { + requestBody: GetBarcodeTemplateByIdRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/barcode/template/get', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + /** + * Get All Barcode Templates + * @returns GetAllBarcodeTemplatesResponse Successful Response + * @throws ApiError + */ + public static getAllBarcodeTemplates(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/barcode/template/get-all', + }); + } + /** + * Create Barcode Template + * @returns BarcodeTemplateCreateResponse Successful Response + * @throws ApiError + */ + public static createBarcodeTemplate({ + requestBody, + }: { + requestBody: BarcodeTemplateCreateRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/barcode/template/create', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + /** + * Update Barcode Template + * @returns BarcodeTemplateUpdateResponse Successful Response + * @throws ApiError + */ + public static updateBarcodeTemplate({ + requestBody, + }: { + requestBody: BarcodeTemplateUpdateRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/barcode/template/update', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } + /** + * Get All Barcode Template Attributes + * @returns GetAllBarcodeTemplateAttributesResponse Successful Response + * @throws ApiError + */ + public static getAllBarcodeTemplateAttributes(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/barcode/template/attribute/get-all', + }); + } + /** + * Create Barcode Template Attribute + * @returns CreateBarcodeTemplateAttributeResponse Successful Response + * @throws ApiError + */ + public static createBarcodeTemplateAttribute({ + requestBody, + }: { + requestBody: CreateBarcodeTemplateAttributeRequest, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/barcode/template/attribute/create', + body: requestBody, + mediaType: 'application/json', + errors: { + 422: `Validation Error`, + }, + }); + } +} diff --git a/src/components/ObjectMultiSelect/ObjectMultiSelect.tsx b/src/components/ObjectMultiSelect/ObjectMultiSelect.tsx new file mode 100644 index 0000000..f72034b --- /dev/null +++ b/src/components/ObjectMultiSelect/ObjectMultiSelect.tsx @@ -0,0 +1,61 @@ +import {MultiSelect, MultiSelectProps} from "@mantine/core"; +import {useEffect, useMemo, useState} from "react"; +import {ObjectWithNameAndId} from "../../types/utils.ts"; + + +export type MultiselectObjectType = T; + +type ControlledValueProps = { + value: MultiselectObjectType[], + onChange: (value: MultiselectObjectType[]) => void; +} + +type RestProps = { + defaultValue?: MultiselectObjectType[] + onChange: (value: MultiselectObjectType[]) => void; + data: MultiselectObjectType[]; +} + +export type ObjectMultiSelectProps = + (RestProps & Partial>) + & Omit; + +const ObjectMultiSelect = (props: ObjectMultiSelectProps) => { + + const isControlled = 'value' in props; + const [internalValue, setInternalValue] = useState[] | undefined>(props.defaultValue); + + const value = (isControlled ? props.value : internalValue) || []; + + const data = useMemo(() => props.data.reduce((acc, item) => { + acc.push({ + label: item.name, + value: item.id.toString() + }); + return acc; + }, [] as { label: string, value: string }[]), [props.data]); + + const handleOnChange = (event: string[]) => { + const objects = props.data.filter(item => event.includes(item.id.toString())); + if (isControlled) { + props.onChange(objects); + return; + } + setInternalValue(objects); + } + useEffect(() => { + if (isControlled || !internalValue) return; + props.onChange(internalValue); + }, [internalValue]); + + return ( + item.id.toString())} + onChange={handleOnChange} + data={data} + /> + ) +} + +export default ObjectMultiSelect; \ No newline at end of file diff --git a/src/components/ObjectSelect/ObjectSelect.tsx b/src/components/ObjectSelect/ObjectSelect.tsx new file mode 100644 index 0000000..db99248 --- /dev/null +++ b/src/components/ObjectSelect/ObjectSelect.tsx @@ -0,0 +1,65 @@ +import {Select, SelectProps} from "@mantine/core"; +import {useEffect, useMemo, useState} from "react"; +import {ObjectWithNameAndId} from "../../types/utils.ts"; + + +export type SelectObjectType = T; + +type ControlledValueProps = { + value: SelectObjectType, + onChange: (value: SelectObjectType) => void; +} + +type RestProps = { + defaultValue?: SelectObjectType + onChange: (value: SelectObjectType) => void; + data: SelectObjectType[]; +} + +export type ObjectSelectProps = + (RestProps & Partial>) + & Omit; + +const ObjectSelect = (props: ObjectSelectProps) => { + + const isControlled = 'value' in props; + const [internalValue, setInternalValue] = useState | undefined>(props.defaultValue); + + const value = isControlled ? props.value : internalValue; + + const data = useMemo(() => props.data.reduce((acc, item) => { + acc.push({ + label: item.name, + value: item.id.toString() + }); + return acc; + }, [] as { label: string, value: string }[]), [props.data]); + + + const handleOnChange = (event: string | null) => { + if (!event) return; + const object = props.data.find(item => parseInt(event) == item.id); + if (!object) return; + if (isControlled) { + props.onChange(object); + return; + } + setInternalValue(object); + } + + useEffect(() => { + if (isControlled || !internalValue) return; + props.onChange(internalValue); + }, [internalValue]); + + return ( +