This commit is contained in:
2024-03-29 21:40:57 +03:00
parent 806e73bb5a
commit 98a6dee996
11 changed files with 124 additions and 44 deletions

View File

@@ -24,6 +24,7 @@ export type { DealServiceSchema } from './models/DealServiceSchema';
export type { DealSummary } from './models/DealSummary'; export type { DealSummary } from './models/DealSummary';
export type { DealSummaryResponse } from './models/DealSummaryResponse'; export type { DealSummaryResponse } from './models/DealSummaryResponse';
export type { HTTPValidationError } from './models/HTTPValidationError'; export type { HTTPValidationError } from './models/HTTPValidationError';
export type { PaginationInfoSchema } from './models/PaginationInfoSchema';
export type { ProductCreateRequest } from './models/ProductCreateRequest'; export type { ProductCreateRequest } from './models/ProductCreateRequest';
export type { ProductCreateResponse } from './models/ProductCreateResponse'; export type { ProductCreateResponse } from './models/ProductCreateResponse';
export type { ProductGetResponse } from './models/ProductGetResponse'; export type { ProductGetResponse } from './models/ProductGetResponse';

View File

@@ -0,0 +1,9 @@
/* generated using openapi-typescript-codegen -- do no edit */
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export type PaginationInfoSchema = {
total_pages: number;
total_items: number;
};

View File

@@ -2,8 +2,10 @@
/* istanbul ignore file */ /* istanbul ignore file */
/* tslint:disable */ /* tslint:disable */
/* eslint-disable */ /* eslint-disable */
import type { PaginationInfoSchema } from './PaginationInfoSchema';
import type { ProductSchema } from './ProductSchema'; import type { ProductSchema } from './ProductSchema';
export type ProductGetResponse = { export type ProductGetResponse = {
products: Array<ProductSchema>; products: Array<ProductSchema>;
pagination_info: PaginationInfoSchema;
}; };

View File

@@ -0,0 +1,26 @@
import {ContextModalProps} from "@mantine/modals";
import {Button, Text} from "@mantine/core";
import {useForm} from "@mantine/form";
const CreateProductModal = ({
context,
id,
innerProps,
}: ContextModalProps<{ clientId: number }>) => {
const form = useForm({
initialValues: {
name: '',
article: '',
barcode: ''
}
})
return (
<>
<Button fullWidth mt="md" onClick={() => context.closeModal(id)}>
Close modal
</Button>
</>
)
};
export default CreateProductModal;

View File

@@ -1,9 +1,11 @@
import EnterDeadlineModal from "./EnterDeadlineModal/EnterDeadlineModal.tsx"; import EnterDeadlineModal from "./EnterDeadlineModal/EnterDeadlineModal.tsx";
import CreateServiceCategoryModal from "../pages/ServicesPage/modals/CreateServiceCategoryModal.tsx"; import CreateServiceCategoryModal from "../pages/ServicesPage/modals/CreateServiceCategoryModal.tsx";
import CreateServiceModal from "../pages/ServicesPage/modals/CreateServiceModal.tsx"; import CreateServiceModal from "../pages/ServicesPage/modals/CreateServiceModal.tsx";
import createProductModal from "./CreateProductModal/CreateProductModal.tsx";
export const modals = { export const modals = {
enterDeadline: EnterDeadlineModal, enterDeadline: EnterDeadlineModal,
createServiceCategory: CreateServiceCategoryModal, createServiceCategory: CreateServiceCategoryModal,
createService: CreateServiceModal createService: CreateServiceModal,
createProduct: createProductModal
} }

View File

@@ -1,7 +1,7 @@
import {FC} from "react"; import {FC} from "react";
import {BaseTable} from "../../../../components/BaseTable/BaseTable.tsx"; import {BaseTable} from "../../../../components/BaseTable/BaseTable.tsx";
import {useClientsTableColumns} from "./columns.tsx"; import {useClientsTableColumns} from "./columns.tsx";
import {MantineReactTable, MRT_Table, MRT_TableOptions, useMantineReactTable} from "mantine-react-table"; import {MRT_TableOptions} from "mantine-react-table";
import {ClientSchema} from "../../../../client"; import {ClientSchema} from "../../../../client";
type Props = { type Props = {
@@ -11,18 +11,21 @@ type Props = {
const ClientsTable: FC<Props> = ({data}) => { const ClientsTable: FC<Props> = ({data}) => {
const columns = useClientsTableColumns(); const columns = useClientsTableColumns();
return ( return (
<BaseTable <>
striped <BaseTable
data={data} striped
columns={columns} data={data}
restProps={{ columns={columns}
enableSorting: false, restProps={{
enableColumnActions: false, enableSorting: false,
enableRowSelection: true, enableColumnActions: false,
enableColumnResizing: true, enableRowSelection: true,
layoutMode: "grid" enableColumnResizing: true,
} as MRT_TableOptions<ClientSchema>} layoutMode: "grid"
/> } as MRT_TableOptions<ClientSchema>}
/>
</>
) )
} }

View File

@@ -0,0 +1,9 @@
.container {
display: flex;
gap: rem(10);
flex-direction: column;
}
.pagination {
align-self: flex-end;
}

View File

@@ -11,18 +11,14 @@ type Props = {
const ProductsTable: FC<Props> = ({products, tableRef}) => { const ProductsTable: FC<Props> = ({products, tableRef}) => {
const columns = useProductsTableColumns(); const columns = useProductsTableColumns();
return ( return (
<BaseTable <BaseTable
ref={tableRef} ref={tableRef}
data={products} data={products}
columns={columns} columns={columns}
restProps={{ restProps={{
enableColumnActions: false, enableColumnActions: false,
manualPagination: true, } as MRT_TableOptions<ProductSchema>}
enableBottomToolbar: true, />
enablePagination: true
} as MRT_TableOptions<ProductSchema>}
/>
) )
} }

View File

@@ -13,7 +13,7 @@ const useServicesList = (props: Props) => {
queryFn: () => ProductService.getProductsByClientId({clientId, page, itemsPerPage}) queryFn: () => ProductService.getProductsByClientId({clientId, page, itemsPerPage})
}); });
const products = isPending || error || !data ? [] : data.products; const products = isPending || error || !data ? [] : data.products;
const paginationInfo = data?.pagination_info;
return {products, refetch} return {products, paginationInfo, refetch}
} }
export default useServicesList; export default useServicesList;

View File

@@ -14,4 +14,15 @@
padding: rem(5); padding: rem(5);
gap: rem(10); gap: rem(10);
display: flex; display: flex;
}
.table-container {
display: flex;
gap: rem(10);
flex-direction: column;
}
.table-pagination {
align-self: flex-end;
} }

View File

@@ -1,40 +1,61 @@
import PageBlock from "../../../components/PageBlock/PageBlock.tsx"; import PageBlock from "../../../components/PageBlock/PageBlock.tsx";
import {FC, useState} from "react"; import {FC, useEffect, useState} from "react";
import styles from './ProductsPage.module.css'; import styles from './ProductsPage.module.css';
import {Drawer} from "@mantine/core"; import {Button, Drawer, Pagination} from "@mantine/core";
import {useDisclosure} from "@mantine/hooks"; import {useDisclosure, usePagination} from "@mantine/hooks";
import ClientSelect from "../../../components/Selects/ClientSelect/ClientSelect.tsx"; import ClientSelect from "../../../components/Selects/ClientSelect/ClientSelect.tsx";
import ProductsTable from "../components/ProductsTable/ProductsTable.tsx"; import ProductsTable from "../components/ProductsTable/ProductsTable.tsx";
import useProductsList from "../hooks/useProductsList.tsx"; import useProductsList from "../hooks/useProductsList.tsx";
import {notifications} from "../../../shared/lib/notifications.ts";
import {modals} from "@mantine/modals";
export const ProductsPage: FC = () => { export const ProductsPage: FC = () => {
const [opened, {open, close}] = useDisclosure(false); // const [opened, {open, close}] = useDisclosure(false);
const [clientId, setClientId] = useState(-1); const [clientId, setClientId] = useState(-1);
const {products} = useProductsList({clientId, page: 0, itemsPerPage: 10}); const [totalPages, setTotalPages] = useState(1);
const pagination = usePagination({total: totalPages});
const {products, paginationInfo} = useProductsList({
clientId,
page: pagination.active - 1,
itemsPerPage: 10
});
const onCreateProductClick = () => {
modals.openContextModal({
modal: "createProduct",
title: 'Создание категории',
withCloseButton: false,
innerProps: {
clientId
}
})
}
useEffect(() => {
if (!paginationInfo) return;
setTotalPages(paginationInfo.total_pages);
}, [paginationInfo]);
return ( return (
<> <>
<Drawer
opened={opened}
onClose={close}
position={"right"}
size={"100%"}
/>
<div className={styles['container']}> <div className={styles['container']}>
<PageBlock> <PageBlock>
<div className={styles['top-panel']}> <div className={styles['top-panel']}>
<ClientSelect onChange={event => setClientId(event.id)}/> <ClientSelect onChange={event => setClientId(event.id)}/>
<Button
onClick={() => onCreateProductClick()}
variant={"default"}
>Создать</Button>
</div> </div>
</PageBlock> </PageBlock>
<PageBlock> <PageBlock>
<div className={styles['body-container']}> <div className={styles['body-container']}>
<ProductsTable products={products}/> <div className={styles['table-container']}>
<ProductsTable products={products}/>
<Pagination className={styles['table-pagination']} total={100}/>
</div>
</div> </div>
</PageBlock> </PageBlock>
</div> </div>
</> </>
) )
} }