feat: temp barcode templates

This commit is contained in:
2024-05-09 03:33:36 +03:00
parent 8ff16e687f
commit 05ef4afce8
12 changed files with 122 additions and 29 deletions

View File

@@ -9,6 +9,7 @@ export type { OpenAPIConfig } from './core/OpenAPI';
export type { AuthLoginRequest } from './models/AuthLoginRequest'; export type { AuthLoginRequest } from './models/AuthLoginRequest';
export type { AuthLoginResponse } from './models/AuthLoginResponse'; export type { AuthLoginResponse } from './models/AuthLoginResponse';
export type { BarcodeTemplateAdditionalAttributeSchema } from './models/BarcodeTemplateAdditionalAttributeSchema';
export type { BarcodeTemplateAttributeSchema } from './models/BarcodeTemplateAttributeSchema'; export type { BarcodeTemplateAttributeSchema } from './models/BarcodeTemplateAttributeSchema';
export type { BarcodeTemplateCreateRequest } from './models/BarcodeTemplateCreateRequest'; export type { BarcodeTemplateCreateRequest } from './models/BarcodeTemplateCreateRequest';
export type { BarcodeTemplateCreateResponse } from './models/BarcodeTemplateCreateResponse'; export type { BarcodeTemplateCreateResponse } from './models/BarcodeTemplateCreateResponse';

View File

@@ -0,0 +1,9 @@
/* generated using openapi-typescript-codegen -- do no edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type BarcodeTemplateAdditionalAttributeSchema = {
name: string;
value: string;
};

View File

@@ -2,11 +2,13 @@
/* istanbul ignore file */ /* istanbul ignore file */
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { BarcodeTemplateAdditionalAttributeSchema } from './BarcodeTemplateAdditionalAttributeSchema';
export type BarcodeTemplateCreateRequest = { export type BarcodeTemplateCreateRequest = {
name: string; name: string;
isDefault: boolean; isDefault: boolean;
width: number; width: number;
height: number; height: number;
additionalAttributes: Array<BarcodeTemplateAdditionalAttributeSchema>;
attributeIds: Array<number>; attributeIds: Array<number>;
}; };

View File

@@ -2,12 +2,14 @@
/* istanbul ignore file */ /* istanbul ignore file */
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { BarcodeTemplateAdditionalAttributeSchema } from './BarcodeTemplateAdditionalAttributeSchema';
import type { BarcodeTemplateAttributeSchema } from './BarcodeTemplateAttributeSchema'; import type { BarcodeTemplateAttributeSchema } from './BarcodeTemplateAttributeSchema';
export type BarcodeTemplateSchema = { export type BarcodeTemplateSchema = {
name: string; name: string;
isDefault: boolean; isDefault: boolean;
width: number; width: number;
height: number; height: number;
additionalAttributes: Array<BarcodeTemplateAdditionalAttributeSchema>;
id: number; id: number;
attributes: Array<BarcodeTemplateAttributeSchema>; attributes: Array<BarcodeTemplateAttributeSchema>;
}; };

View File

@@ -2,11 +2,13 @@
/* istanbul ignore file */ /* istanbul ignore file */
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { BarcodeTemplateAdditionalAttributeSchema } from './BarcodeTemplateAdditionalAttributeSchema';
export type BarcodeTemplateUpdateRequest = { export type BarcodeTemplateUpdateRequest = {
name: string; name: string;
isDefault: boolean; isDefault: boolean;
width: number; width: number;
height: number; height: number;
additionalAttributes: Array<BarcodeTemplateAdditionalAttributeSchema>;
id: number; id: number;
attributeIds: Array<number>; attributeIds: Array<number>;
}; };

View File

@@ -2,10 +2,12 @@
/* istanbul ignore file */ /* istanbul ignore file */
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { BarcodeTemplateSchema } from './BarcodeTemplateSchema';
export type ProductCreateRequest = { export type ProductCreateRequest = {
name: string; name: string;
article: string; article: string;
clientId: number; clientId: number;
barcodes: Array<string>; barcodes: Array<string>;
barcodeTemplate?: (BarcodeTemplateSchema | null);
}; };

View File

@@ -2,11 +2,13 @@
/* istanbul ignore file */ /* istanbul ignore file */
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { BarcodeTemplateSchema } from './BarcodeTemplateSchema';
export type ProductSchema = { export type ProductSchema = {
id: number; id: number;
name: string; name: string;
article: string; article: string;
clientId: number; clientId: number;
barcodes: Array<string>; barcodes: Array<string>;
barcodeTemplate?: (BarcodeTemplateSchema | null);
}; };

View File

@@ -1,7 +1,75 @@
import {GetInputProps} from "@mantine/form/lib/types"; import {FC, useEffect, useState} from "react";
import {FC} from "react"; import {ActionIcon, Button, Flex, rem, TextInput} from "@mantine/core";
import {BarcodeTemplateAdditionalAttributeSchema} from "../../../../client";
import {IconX} from "@tabler/icons-react";
import {isEqual} from "lodash";
type Props = GetInputProps<Array<{ name:string,value:string }>> type FieldType = BarcodeTemplateAdditionalAttributeSchema;
const BarcodeTemplateAdditionalFieldTable:FC<Props> = (props:Props) => { type Props = {
onChange: (value: FieldType[]) => void;
value?: FieldType[];
error?: string | null;
}
const BarcodeTemplateAdditionalFieldTable: FC<Props> = (props: Props) => {
const {value, onChange} = props;
const [innerValue, setInnerValue] = useState<FieldType[]>(props.value || []);
console.log(innerValue);
const onNameChange = (field: FieldType, newName: string) => {
const newField = {...field, name: newName};
const newFields = innerValue.map(f => f === field ? newField : f);
setInnerValue(newFields);
onChange(newFields);
}
const onValueChange = (field: FieldType, newValue: string) => {
const newField = {...field, value: newValue};
const newFields = innerValue.map(f => f === field ? newField : f);
setInnerValue(newFields);
onChange(newFields);
}
const onCreateField = () => {
const newField = {name: "", value: ""};
setInnerValue([...innerValue, newField]);
onChange([...innerValue, newField]);
}
const onDeleteField = (field: FieldType) => {
const newFields = innerValue.filter(f => f !== field);
setInnerValue(newFields);
onChange(newFields);
}
useEffect(() => {
if (isEqual(value, innerValue)) return;
setInnerValue(value || []);
}, [value]);
return (
<>
<Flex
direction={"column"}
gap={rem(10)}
>
{/*{innerValue.length === 0 && <Text>Дополнительных полей нет</Text>}*/}
{innerValue.map((field, idx) => (
<Flex align={"center"} gap={rem(10)} key={idx}>
<ActionIcon onClick={() => onDeleteField(field)} variant={"default"}>
<IconX/>
</ActionIcon>
<TextInput
placeholder={"Название атрибута"}
value={field.name}
onChange={event => event &&
onNameChange(field, event.target.value)}/>
<TextInput
placeholder={"Значение атрибута"}
value={field.value}
onChange={event => event &&
onValueChange(field, event.target.value)}
/>
</Flex>
))
}
<Button variant={"default"} onClick={onCreateField}>Создать дополительный атрибут</Button>
</Flex>
</>
)
}
} export default BarcodeTemplateAdditionalFieldTable;

View File

@@ -1,11 +1,17 @@
import BaseFormModal, {CreateEditFormProps} from "../../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx"; import BaseFormModal, {CreateEditFormProps} from "../../../ClientsPage/modals/BaseFormModal/BaseFormModal.tsx";
import {BarcodeTemplateAttributeSchema, BarcodeTemplateSchema} from "../../../../client"; import {
BarcodeTemplateAdditionalAttributeSchema,
BarcodeTemplateAttributeSchema,
BarcodeTemplateSchema
} from "../../../../client";
import {ContextModalProps} from "@mantine/modals"; import {ContextModalProps} from "@mantine/modals";
import {useForm} from "@mantine/form"; import {useForm} from "@mantine/form";
import {Checkbox, Fieldset, Flex, NumberInput, rem, TextInput} from "@mantine/core"; import {Checkbox, Fieldset, Flex, NumberInput, rem, TextInput} from "@mantine/core";
import {IconX} from "@tabler/icons-react"; import {IconX} from "@tabler/icons-react";
import BarcodeTemplateAttributeMultiselect import BarcodeTemplateAttributeMultiselect
from "../../components/BarcodeTemplateAttributeMultiselect/BarcodeTemplateAttributeMultiselect.tsx"; from "../../components/BarcodeTemplateAttributeMultiselect/BarcodeTemplateAttributeMultiselect.tsx";
import BarcodeTemplateAdditionalFieldTable
from "../../components/BarcodeTemplateAdditionalFieldTable/BarcodeTemplateAdditionalFieldTable.tsx";
type Props = CreateEditFormProps<BarcodeTemplateSchema> type Props = CreateEditFormProps<BarcodeTemplateSchema>
const BarcodeTemplateFormModal = ({ const BarcodeTemplateFormModal = ({
@@ -19,7 +25,8 @@ const BarcodeTemplateFormModal = ({
width: undefined, width: undefined,
height: undefined, height: undefined,
isDefault: false, isDefault: false,
attributes: [] as Array<BarcodeTemplateAttributeSchema> attributes: [] as Array<BarcodeTemplateAttributeSchema>,
additionalAttributes: [] as Array<BarcodeTemplateAdditionalAttributeSchema>
} as Partial<BarcodeTemplateSchema>; } as Partial<BarcodeTemplateSchema>;
const form = useForm<Partial<BarcodeTemplateSchema>>({ const form = useForm<Partial<BarcodeTemplateSchema>>({
initialValues: initialValues, initialValues: initialValues,
@@ -30,7 +37,7 @@ const BarcodeTemplateFormModal = ({
name: (name: string | undefined) => name && name.trim() !== '' ? null : "Необходимо ввести название шаблона", name: (name: string | undefined) => name && name.trim() !== '' ? null : "Необходимо ввести название шаблона",
} }
}) })
console.log(form.values.additionalAttributes);
return ( return (
<BaseFormModal <BaseFormModal
{...innerProps} {...innerProps}
@@ -64,10 +71,13 @@ const BarcodeTemplateFormModal = ({
/> />
</Flex> </Flex>
<BarcodeTemplateAttributeMultiselect <BarcodeTemplateAttributeMultiselect
label={"Атрибуты"} label={"Стандартные атрибуты"}
placeholder={!form.values.attributes?.length ? "Выберите атрибуты" : undefined} placeholder={!form.values.attributes?.length ? "Выберите атрибуты" : undefined}
{...form.getInputProps('attributes')} {...form.getInputProps('attributes')}
/> />
<BarcodeTemplateAdditionalFieldTable
{...form.getInputProps('additionalAttributes')}
/>
<Checkbox <Checkbox
label={"Использовать как стандартный шаблон"} label={"Использовать как стандартный шаблон"}
checked={form.getInputProps('isDefault').value as boolean} checked={form.getInputProps('isDefault').value as boolean}

View File

@@ -34,7 +34,13 @@ export const useProductsTableColumns = () => {
</List> </List>
) )
} },
enableSorting: false,
},
{
accessorKey: "barcodeTemplate.name",
header: "Шаблон штрихкода",
enableSorting: false,
} }
], []); ], []);

View File

@@ -3,6 +3,7 @@ import {Button, Flex, rem, TagsInput, TextInput} from "@mantine/core";
import {useForm} from "@mantine/form"; import {useForm} from "@mantine/form";
import {BaseProduct, CreateProductRequest} from "../../types.ts"; import {BaseProduct, CreateProductRequest} from "../../types.ts";
import {ProductSchema} from "../../../../client"; import {ProductSchema} from "../../../../client";
import BarcodeTemplateSelect from "../../../../components/Selects/BarcodeTemplateSelect/BarcodeTemplateSelect.tsx";
type CreateProps = { type CreateProps = {
clientId: number; clientId: number;
@@ -26,7 +27,8 @@ const CreateProductModal = ({
const initialValues = isEditProps ? { const initialValues = isEditProps ? {
name: innerProps.product.name, name: innerProps.product.name,
article: innerProps.product.article, article: innerProps.product.article,
barcodes: innerProps.product.barcodes barcodes: innerProps.product.barcodes,
barcodeTemplate: innerProps.product.barcodeTemplate
} : { } : {
name: '', name: '',
article: '', article: '',
@@ -69,6 +71,11 @@ const CreateProductModal = ({
label={"Штрихкоды"} label={"Штрихкоды"}
{...form.getInputProps('barcodes')} {...form.getInputProps('barcodes')}
/> />
<BarcodeTemplateSelect
placeholder={"Выберите шаблон штрихкода"}
label={"Шаблон штрихкода"}
{...form.getInputProps('barcodeTemplate')}
/>
<Flex justify={"flex-end"} mt={rem(5)} gap={rem(10)}> <Flex justify={"flex-end"} mt={rem(5)} gap={rem(10)}>
<Button onClick={() => onCancelClick()} variant={"subtle"}>Отменить</Button> <Button onClick={() => onCancelClick()} variant={"subtle"}>Отменить</Button>
{isEditProps ? {isEditProps ?

View File

@@ -1,6 +1,4 @@
import {createLazyFileRoute} from "@tanstack/react-router"; import {createLazyFileRoute} from "@tanstack/react-router";
import {Fieldset, Flex, NumberInput} from "@mantine/core";
import {IconCross, IconX} from "@tabler/icons-react";
import {useEffect} from "react"; import {useEffect} from "react";
import {openContextModal} from "@mantine/modals"; import {openContextModal} from "@mantine/modals";
@@ -22,22 +20,6 @@ function TestPage() {
}, []); }, []);
return ( return (
<> <>
<Fieldset legend={"Размеры"}>
<Flex gap={10} align={"center"}>
<NumberInput
hideControls
placeholder={"Ширина"}
/>
<IconX/>
<NumberInput
hideControls
placeholder={"Высота"}
/>
</Flex>
</Fieldset>
</> </>
); );