temp image upload
This commit is contained in:
		@@ -23,6 +23,7 @@ export type { BarcodeTemplateUpdateRequest } from './models/BarcodeTemplateUpdat
 | 
			
		||||
export type { BarcodeTemplateUpdateResponse } from './models/BarcodeTemplateUpdateResponse';
 | 
			
		||||
export type { BaseEnumListSchema } from './models/BaseEnumListSchema';
 | 
			
		||||
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 { ClientCreateResponse } from './models/ClientCreateResponse';
 | 
			
		||||
export type { ClientDeleteRequest } from './models/ClientDeleteRequest';
 | 
			
		||||
@@ -98,6 +99,7 @@ export type { ProductGetResponse } from './models/ProductGetResponse';
 | 
			
		||||
export type { ProductSchema } from './models/ProductSchema';
 | 
			
		||||
export type { ProductUpdateRequest } from './models/ProductUpdateRequest';
 | 
			
		||||
export type { ProductUpdateResponse } from './models/ProductUpdateResponse';
 | 
			
		||||
export type { ProductUploadImageResponse } from './models/ProductUploadImageResponse';
 | 
			
		||||
export type { ServiceCategorySchema } from './models/ServiceCategorySchema';
 | 
			
		||||
export type { ServiceCreateCategoryRequest } from './models/ServiceCreateCategoryRequest';
 | 
			
		||||
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 */
 | 
			
		||||
/* tslint:disable */
 | 
			
		||||
/* eslint-disable */
 | 
			
		||||
import type { Body_upload_product_image } from '../models/Body_upload_product_image';
 | 
			
		||||
import type { GetProductBarcodeRequest } from '../models/GetProductBarcodeRequest';
 | 
			
		||||
import type { GetProductBarcodeResponse } from '../models/GetProductBarcodeResponse';
 | 
			
		||||
import type { ProductAddBarcodeRequest } from '../models/ProductAddBarcodeRequest';
 | 
			
		||||
@@ -17,6 +18,7 @@ import type { ProductGetResponse } from '../models/ProductGetResponse';
 | 
			
		||||
import type { ProductSchema } from '../models/ProductSchema';
 | 
			
		||||
import type { ProductUpdateRequest } from '../models/ProductUpdateRequest';
 | 
			
		||||
import type { ProductUpdateResponse } from '../models/ProductUpdateResponse';
 | 
			
		||||
import type { ProductUploadImageResponse } from '../models/ProductUploadImageResponse';
 | 
			
		||||
import type { CancelablePromise } from '../core/CancelablePromise';
 | 
			
		||||
import { OpenAPI } from '../core/OpenAPI';
 | 
			
		||||
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 {ProductSchema} from "../../../../client";
 | 
			
		||||
import BarcodeTemplateSelect from "../../../../components/Selects/BarcodeTemplateSelect/BarcodeTemplateSelect.tsx";
 | 
			
		||||
import ImageDropzone from "../../../../components/ImageDropzone/ImageDropzone.tsx";
 | 
			
		||||
 | 
			
		||||
type CreateProps = {
 | 
			
		||||
    clientId: number;
 | 
			
		||||
@@ -72,7 +73,6 @@ const CreateProductModal = ({
 | 
			
		||||
                            {...form.getInputProps('barcodeTemplate')}
 | 
			
		||||
                        />
 | 
			
		||||
                    </Fieldset>
 | 
			
		||||
 | 
			
		||||
                    <Fieldset legend={"Дополнительные характеристики"}>
 | 
			
		||||
                        <TextInput
 | 
			
		||||
                            placeholder={"Введите бренд"}
 | 
			
		||||
@@ -99,6 +99,11 @@ const CreateProductModal = ({
 | 
			
		||||
                            label={"Доп. информация"}
 | 
			
		||||
                            {...form.getInputProps('additionalInfo')} />
 | 
			
		||||
                    </Fieldset>
 | 
			
		||||
                    <Fieldset legend={"Изображение"}>
 | 
			
		||||
 | 
			
		||||
                        <ImageDropzone onDrop={(data) => {
 | 
			
		||||
                        }}/>
 | 
			
		||||
                    </Fieldset>
 | 
			
		||||
                    <Flex justify={"flex-end"} mt={rem(5)} gap={rem(10)}>
 | 
			
		||||
                        <Button onClick={() => onCancelClick()} variant={"subtle"}>Отменить</Button>
 | 
			
		||||
                        {isEditProps ?
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,5 @@
 | 
			
		||||
import {createLazyFileRoute} from "@tanstack/react-router";
 | 
			
		||||
import ImageDropzone from "../components/ImageDropzone/ImageDropzone.tsx";
 | 
			
		||||
 | 
			
		||||
export const Route = createLazyFileRoute('/test')({
 | 
			
		||||
    component: TestPage
 | 
			
		||||
@@ -8,7 +9,9 @@ export const Route = createLazyFileRoute('/test')({
 | 
			
		||||
function TestPage() {
 | 
			
		||||
    return (
 | 
			
		||||
        <>
 | 
			
		||||
 | 
			
		||||
            <ImageDropzone
 | 
			
		||||
                onDrop={(data) => {}}
 | 
			
		||||
            />
 | 
			
		||||
        </>
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user