temp image upload
This commit is contained in:
		@@ -14,7 +14,7 @@
 | 
				
			|||||||
    "@hello-pangea/dnd": "^16.5.0",
 | 
					    "@hello-pangea/dnd": "^16.5.0",
 | 
				
			||||||
    "@mantine/core": "^7.6.1",
 | 
					    "@mantine/core": "^7.6.1",
 | 
				
			||||||
    "@mantine/dates": "^7.6.1",
 | 
					    "@mantine/dates": "^7.6.1",
 | 
				
			||||||
    "@mantine/dropzone": "^7.6.1",
 | 
					    "@mantine/dropzone": "^7.9.2",
 | 
				
			||||||
    "@mantine/form": "^7.6.1",
 | 
					    "@mantine/form": "^7.6.1",
 | 
				
			||||||
    "@mantine/hooks": "^7.6.1",
 | 
					    "@mantine/hooks": "^7.6.1",
 | 
				
			||||||
    "@mantine/modals": "^7.6.1",
 | 
					    "@mantine/modals": "^7.6.1",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@ export type { BarcodeTemplateUpdateRequest } from './models/BarcodeTemplateUpdat
 | 
				
			|||||||
export type { BarcodeTemplateUpdateResponse } from './models/BarcodeTemplateUpdateResponse';
 | 
					export type { BarcodeTemplateUpdateResponse } from './models/BarcodeTemplateUpdateResponse';
 | 
				
			||||||
export type { BaseEnumListSchema } from './models/BaseEnumListSchema';
 | 
					export type { BaseEnumListSchema } from './models/BaseEnumListSchema';
 | 
				
			||||||
export type { BaseEnumSchema } from './models/BaseEnumSchema';
 | 
					export type { BaseEnumSchema } from './models/BaseEnumSchema';
 | 
				
			||||||
 | 
					export type { Body_upload_product_image } from './models/Body_upload_product_image';
 | 
				
			||||||
export type { ClientCreateRequest } from './models/ClientCreateRequest';
 | 
					export type { ClientCreateRequest } from './models/ClientCreateRequest';
 | 
				
			||||||
export type { ClientCreateResponse } from './models/ClientCreateResponse';
 | 
					export type { ClientCreateResponse } from './models/ClientCreateResponse';
 | 
				
			||||||
export type { ClientDeleteRequest } from './models/ClientDeleteRequest';
 | 
					export type { ClientDeleteRequest } from './models/ClientDeleteRequest';
 | 
				
			||||||
@@ -98,6 +99,7 @@ export type { ProductGetResponse } from './models/ProductGetResponse';
 | 
				
			|||||||
export type { ProductSchema } from './models/ProductSchema';
 | 
					export type { ProductSchema } from './models/ProductSchema';
 | 
				
			||||||
export type { ProductUpdateRequest } from './models/ProductUpdateRequest';
 | 
					export type { ProductUpdateRequest } from './models/ProductUpdateRequest';
 | 
				
			||||||
export type { ProductUpdateResponse } from './models/ProductUpdateResponse';
 | 
					export type { ProductUpdateResponse } from './models/ProductUpdateResponse';
 | 
				
			||||||
 | 
					export type { ProductUploadImageResponse } from './models/ProductUploadImageResponse';
 | 
				
			||||||
export type { ServiceCategorySchema } from './models/ServiceCategorySchema';
 | 
					export type { ServiceCategorySchema } from './models/ServiceCategorySchema';
 | 
				
			||||||
export type { ServiceCreateCategoryRequest } from './models/ServiceCreateCategoryRequest';
 | 
					export type { ServiceCreateCategoryRequest } from './models/ServiceCreateCategoryRequest';
 | 
				
			||||||
export type { ServiceCreateCategoryResponse } from './models/ServiceCreateCategoryResponse';
 | 
					export type { ServiceCreateCategoryResponse } from './models/ServiceCreateCategoryResponse';
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								src/client/models/Body_upload_product_image.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/client/models/Body_upload_product_image.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do no edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type Body_upload_product_image = {
 | 
				
			||||||
 | 
					    upload_file: Blob;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/client/models/ProductUploadImageResponse.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/client/models/ProductUploadImageResponse.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					/* generated using openapi-typescript-codegen -- do no edit */
 | 
				
			||||||
 | 
					/* istanbul ignore file */
 | 
				
			||||||
 | 
					/* tslint:disable */
 | 
				
			||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					export type ProductUploadImageResponse = {
 | 
				
			||||||
 | 
					    ok: boolean;
 | 
				
			||||||
 | 
					    message: string;
 | 
				
			||||||
 | 
					    imageUrl?: (string | null);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2,6 +2,7 @@
 | 
				
			|||||||
/* istanbul ignore file */
 | 
					/* istanbul ignore file */
 | 
				
			||||||
/* tslint:disable */
 | 
					/* tslint:disable */
 | 
				
			||||||
/* eslint-disable */
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					import type { Body_upload_product_image } from '../models/Body_upload_product_image';
 | 
				
			||||||
import type { GetProductBarcodeRequest } from '../models/GetProductBarcodeRequest';
 | 
					import type { GetProductBarcodeRequest } from '../models/GetProductBarcodeRequest';
 | 
				
			||||||
import type { GetProductBarcodeResponse } from '../models/GetProductBarcodeResponse';
 | 
					import type { GetProductBarcodeResponse } from '../models/GetProductBarcodeResponse';
 | 
				
			||||||
import type { ProductAddBarcodeRequest } from '../models/ProductAddBarcodeRequest';
 | 
					import type { ProductAddBarcodeRequest } from '../models/ProductAddBarcodeRequest';
 | 
				
			||||||
@@ -17,6 +18,7 @@ import type { ProductGetResponse } from '../models/ProductGetResponse';
 | 
				
			|||||||
import type { ProductSchema } from '../models/ProductSchema';
 | 
					import type { ProductSchema } from '../models/ProductSchema';
 | 
				
			||||||
import type { ProductUpdateRequest } from '../models/ProductUpdateRequest';
 | 
					import type { ProductUpdateRequest } from '../models/ProductUpdateRequest';
 | 
				
			||||||
import type { ProductUpdateResponse } from '../models/ProductUpdateResponse';
 | 
					import type { ProductUpdateResponse } from '../models/ProductUpdateResponse';
 | 
				
			||||||
 | 
					import type { ProductUploadImageResponse } from '../models/ProductUploadImageResponse';
 | 
				
			||||||
import type { CancelablePromise } from '../core/CancelablePromise';
 | 
					import type { CancelablePromise } from '../core/CancelablePromise';
 | 
				
			||||||
import { OpenAPI } from '../core/OpenAPI';
 | 
					import { OpenAPI } from '../core/OpenAPI';
 | 
				
			||||||
import { request as __request } from '../core/request';
 | 
					import { request as __request } from '../core/request';
 | 
				
			||||||
@@ -213,4 +215,29 @@ export class ProductService {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Upload Product Image
 | 
				
			||||||
 | 
					     * @returns ProductUploadImageResponse Successful Response
 | 
				
			||||||
 | 
					     * @throws ApiError
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static uploadProductImage({
 | 
				
			||||||
 | 
					        productId,
 | 
				
			||||||
 | 
					        formData,
 | 
				
			||||||
 | 
					    }: {
 | 
				
			||||||
 | 
					        productId: number,
 | 
				
			||||||
 | 
					        formData: Body_upload_product_image,
 | 
				
			||||||
 | 
					    }): CancelablePromise<ProductUploadImageResponse> {
 | 
				
			||||||
 | 
					        return __request(OpenAPI, {
 | 
				
			||||||
 | 
					            method: 'POST',
 | 
				
			||||||
 | 
					            url: '/product/images/upload/{product_id}',
 | 
				
			||||||
 | 
					            path: {
 | 
				
			||||||
 | 
					                'product_id': productId,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            formData: formData,
 | 
				
			||||||
 | 
					            mediaType: 'multipart/form-data',
 | 
				
			||||||
 | 
					            errors: {
 | 
				
			||||||
 | 
					                422: `Validation Error`,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								src/components/ImageDropzone/ImageDropzone.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/components/ImageDropzone/ImageDropzone.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					import {Dropzone, DropzoneProps} from "@mantine/dropzone";
 | 
				
			||||||
 | 
					import {FC} from "react";
 | 
				
			||||||
 | 
					import {Group, rem, Text} from "@mantine/core";
 | 
				
			||||||
 | 
					import {IconPhoto, IconUpload, IconX} from "@tabler/icons-react";
 | 
				
			||||||
 | 
					import {omit} from "lodash";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RestProps = {
 | 
				
			||||||
 | 
					    imageUrl?: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const ALL_PROPERTIES = Object.keys(colDefProperties) as (keyof ColDef)[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Props = DropzoneProps & RestProps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ImageDropzone: FC<Props> = (props: Props) => {
 | 
				
			||||||
 | 
					    const restProps = omit()
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        <Dropzone
 | 
				
			||||||
 | 
					            {...props}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					            <Group justify="center" gap="xl" style={{pointerEvents: 'none'}}>
 | 
				
			||||||
 | 
					                <Dropzone.Accept>
 | 
				
			||||||
 | 
					                    <IconUpload
 | 
				
			||||||
 | 
					                        style={{width: rem(52), height: rem(52), color: 'var(--mantine-color-blue-6)'}}
 | 
				
			||||||
 | 
					                        stroke={1.5}
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
 | 
					                </Dropzone.Accept>
 | 
				
			||||||
 | 
					                <Dropzone.Reject>
 | 
				
			||||||
 | 
					                    <IconX
 | 
				
			||||||
 | 
					                        style={{width: rem(52), height: rem(52), color: 'var(--mantine-color-red-6)'}}
 | 
				
			||||||
 | 
					                        stroke={1.5}
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
 | 
					                </Dropzone.Reject>
 | 
				
			||||||
 | 
					                <Dropzone.Idle>
 | 
				
			||||||
 | 
					                    <IconPhoto
 | 
				
			||||||
 | 
					                        style={{width: rem(52), height: rem(52), color: 'var(--mantine-color-dimmed)'}}
 | 
				
			||||||
 | 
					                        stroke={1.5}
 | 
				
			||||||
 | 
					                    />
 | 
				
			||||||
 | 
					                </Dropzone.Idle>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div>
 | 
				
			||||||
 | 
					                    <Text size="xl" inline>
 | 
				
			||||||
 | 
					                        Drag images here or click to select files
 | 
				
			||||||
 | 
					                    </Text>
 | 
				
			||||||
 | 
					                    <Text size="sm" c="dimmed" inline mt={7}>
 | 
				
			||||||
 | 
					                        Attach as many files as you like, each file should not exceed 5mb
 | 
				
			||||||
 | 
					                    </Text>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </Group>
 | 
				
			||||||
 | 
					        </Dropzone>
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default ImageDropzone;
 | 
				
			||||||
@@ -4,6 +4,7 @@ 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";
 | 
					import BarcodeTemplateSelect from "../../../../components/Selects/BarcodeTemplateSelect/BarcodeTemplateSelect.tsx";
 | 
				
			||||||
 | 
					import ImageDropzone from "../../../../components/ImageDropzone/ImageDropzone.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CreateProps = {
 | 
					type CreateProps = {
 | 
				
			||||||
    clientId: number;
 | 
					    clientId: number;
 | 
				
			||||||
@@ -72,7 +73,6 @@ const CreateProductModal = ({
 | 
				
			|||||||
                            {...form.getInputProps('barcodeTemplate')}
 | 
					                            {...form.getInputProps('barcodeTemplate')}
 | 
				
			||||||
                        />
 | 
					                        />
 | 
				
			||||||
                    </Fieldset>
 | 
					                    </Fieldset>
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    <Fieldset legend={"Дополнительные характеристики"}>
 | 
					                    <Fieldset legend={"Дополнительные характеристики"}>
 | 
				
			||||||
                        <TextInput
 | 
					                        <TextInput
 | 
				
			||||||
                            placeholder={"Введите бренд"}
 | 
					                            placeholder={"Введите бренд"}
 | 
				
			||||||
@@ -99,6 +99,11 @@ const CreateProductModal = ({
 | 
				
			|||||||
                            label={"Доп. информация"}
 | 
					                            label={"Доп. информация"}
 | 
				
			||||||
                            {...form.getInputProps('additionalInfo')} />
 | 
					                            {...form.getInputProps('additionalInfo')} />
 | 
				
			||||||
                    </Fieldset>
 | 
					                    </Fieldset>
 | 
				
			||||||
 | 
					                    <Fieldset legend={"Изображение"}>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        <ImageDropzone onDrop={(data) => {
 | 
				
			||||||
 | 
					                        }}/>
 | 
				
			||||||
 | 
					                    </Fieldset>
 | 
				
			||||||
                    <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 ?
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
import {createLazyFileRoute} from "@tanstack/react-router";
 | 
					import {createLazyFileRoute} from "@tanstack/react-router";
 | 
				
			||||||
 | 
					import ImageDropzone from "../components/ImageDropzone/ImageDropzone.tsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const Route = createLazyFileRoute('/test')({
 | 
					export const Route = createLazyFileRoute('/test')({
 | 
				
			||||||
    component: TestPage
 | 
					    component: TestPage
 | 
				
			||||||
@@ -8,7 +9,9 @@ export const Route = createLazyFileRoute('/test')({
 | 
				
			|||||||
function TestPage() {
 | 
					function TestPage() {
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        <>
 | 
					        <>
 | 
				
			||||||
 | 
					            <ImageDropzone
 | 
				
			||||||
 | 
					                onDrop={(data) => {}}
 | 
				
			||||||
 | 
					            />
 | 
				
			||||||
        </>
 | 
					        </>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user