feat: barcode templates page
This commit is contained in:
@ -0,0 +1,19 @@
|
||||
import { FC } from "react";
|
||||
import { Group } from "@mantine/core";
|
||||
import InlineButton from "@/components/ui/InlineButton/InlineButton";
|
||||
|
||||
type Props = {
|
||||
onCreateClick: () => void;
|
||||
};
|
||||
|
||||
const BarcodeTemplatesDesktopHeader: FC<Props> = ({ onCreateClick }) => {
|
||||
return (
|
||||
<Group>
|
||||
<InlineButton onClick={onCreateClick}>
|
||||
Создать шаблон
|
||||
</InlineButton>
|
||||
</Group>
|
||||
);
|
||||
};
|
||||
|
||||
export default BarcodeTemplatesDesktopHeader;
|
||||
@ -0,0 +1,23 @@
|
||||
import { FC } from "react";
|
||||
import { Box } from "@mantine/core";
|
||||
import InlineButton from "@/components/ui/InlineButton/InlineButton";
|
||||
|
||||
type Props = {
|
||||
onCreateClick: () => void;
|
||||
};
|
||||
|
||||
const BarcodeTemplatesMobileHeader: FC<Props> = ({ onCreateClick }) => {
|
||||
return (
|
||||
<Box
|
||||
px={"xs"}
|
||||
pt={"xs"}>
|
||||
<InlineButton
|
||||
onClick={onCreateClick}
|
||||
w={"100%"}>
|
||||
Создать шаблон
|
||||
</InlineButton>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
export default BarcodeTemplatesMobileHeader;
|
||||
@ -0,0 +1,26 @@
|
||||
"use client";
|
||||
|
||||
import { FC } from "react";
|
||||
import useBarcodeTemplateAttributesList from "@/app/barcode-templates/hooks/useBarcodeTemplateAttributesList";
|
||||
import ObjectMultiSelect, {
|
||||
ObjectMultiSelectProps,
|
||||
} from "@/components/selects/ObjectMultiSelect/ObjectMultiSelect";
|
||||
import { BarcodeTemplateAttributeSchema } from "@/lib/client";
|
||||
|
||||
type Props = Omit<
|
||||
ObjectMultiSelectProps<BarcodeTemplateAttributeSchema>,
|
||||
"data" | "getLabelFn" | "getValueFn"
|
||||
>;
|
||||
|
||||
const BarcodeTemplateAttributeMultiselect: FC<Props> = (props: Props) => {
|
||||
const { barcodeTemplateAttributes } = useBarcodeTemplateAttributesList();
|
||||
|
||||
return (
|
||||
<ObjectMultiSelect
|
||||
data={barcodeTemplateAttributes}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default BarcodeTemplateAttributeMultiselect;
|
||||
@ -0,0 +1,22 @@
|
||||
"use client";
|
||||
|
||||
import useBarcodeTemplateSizesList from "@/app/barcode-templates/hooks/useBarcodeTemplateSizesList";
|
||||
import ObjectSelect, {
|
||||
ObjectSelectProps,
|
||||
} from "@/components/selects/ObjectSelect/ObjectSelect";
|
||||
import { BarcodeTemplateSizeSchema } from "@/lib/client";
|
||||
|
||||
type Props = Omit<ObjectSelectProps<BarcodeTemplateSizeSchema>, "data">;
|
||||
|
||||
const BarcodeTemplateSizeSelect = (props: Props) => {
|
||||
const { barcodeTemplateSizes } = useBarcodeTemplateSizesList();
|
||||
|
||||
return (
|
||||
<ObjectSelect
|
||||
data={barcodeTemplateSizes}
|
||||
getLabelFn={size => `${size.name} (${size.width}x${size.height})`}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
export default BarcodeTemplateSizeSelect;
|
||||
@ -0,0 +1,30 @@
|
||||
import { FC } from "react";
|
||||
import { useBarcodeTemplatesTableColumns } from "@/app/barcode-templates/components/shared/BarcodeTemplatesTable/columns";
|
||||
import BaseTable from "@/components/ui/BaseTable/BaseTable";
|
||||
import useIsMobile from "@/hooks/utils/useIsMobile";
|
||||
import { BarcodeTemplateSchema } from "@/lib/client";
|
||||
|
||||
type Props = {
|
||||
items: BarcodeTemplateSchema[];
|
||||
onDelete: (template: BarcodeTemplateSchema) => void;
|
||||
onChange: (template: BarcodeTemplateSchema) => void;
|
||||
};
|
||||
|
||||
const BarcodeTemplatesTable: FC<Props> = ({ items, ...props }) => {
|
||||
const isMobile = useIsMobile();
|
||||
const columns = useBarcodeTemplatesTableColumns(props);
|
||||
|
||||
return (
|
||||
<BaseTable
|
||||
striped
|
||||
withTableBorder
|
||||
records={items}
|
||||
columns={columns}
|
||||
groups={undefined}
|
||||
verticalSpacing={"md"}
|
||||
mx={isMobile ? "xs" : ""}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default BarcodeTemplatesTable;
|
||||
@ -0,0 +1,60 @@
|
||||
import { useMemo } from "react";
|
||||
import { IconCheck, IconX } from "@tabler/icons-react";
|
||||
import { DataTableColumn } from "mantine-datatable";
|
||||
import { Center } from "@mantine/core";
|
||||
import UpdateDeleteTableActions from "@/components/ui/BaseTable/components/UpdateDeleteTableActions";
|
||||
import { BarcodeTemplateSchema } from "@/lib/client";
|
||||
|
||||
type Props = {
|
||||
onDelete: (template: BarcodeTemplateSchema) => void;
|
||||
onChange: (template: BarcodeTemplateSchema) => void;
|
||||
};
|
||||
|
||||
export const useBarcodeTemplatesTableColumns = ({
|
||||
onDelete,
|
||||
onChange,
|
||||
}: Props) => {
|
||||
return useMemo(
|
||||
() =>
|
||||
[
|
||||
{
|
||||
accessor: "actions",
|
||||
title: <Center>Действия</Center>,
|
||||
width: "0%",
|
||||
render: template => (
|
||||
<UpdateDeleteTableActions
|
||||
onDelete={() => onDelete(template)}
|
||||
onChange={() => onChange(template)}
|
||||
/>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessor: "name",
|
||||
title: "Название",
|
||||
},
|
||||
{
|
||||
accessor: "attributes",
|
||||
title: "Атрибуты",
|
||||
render: template => (
|
||||
<>
|
||||
{template.attributes
|
||||
.map(attr => attr.name)
|
||||
.join(", ")}
|
||||
</>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessor: "size.name",
|
||||
title: "Размер",
|
||||
render: template => `${template.size.name} (${template.size.width}x${template.size.height})`
|
||||
},
|
||||
{
|
||||
accessor: "isDefault",
|
||||
title: "По умолчанию",
|
||||
render: template =>
|
||||
template.isDefault ? <IconCheck /> : <IconX />,
|
||||
},
|
||||
] as DataTableColumn<BarcodeTemplateSchema>[],
|
||||
[]
|
||||
);
|
||||
};
|
||||
@ -0,0 +1,51 @@
|
||||
"use client";
|
||||
|
||||
import { Stack } from "@mantine/core";
|
||||
import BarcodeTemplatesDesktopHeader from "@/app/barcode-templates/components/desktop/BarcodeTemplatesDesktopHeader/BarcodeTemplatesDesktopHeader";
|
||||
import BarcodeTemplatesMobileHeader from "@/app/barcode-templates/components/mobile/BarcodeTemplatesMobileHeader/BarcodeTemplatesMobileHeader";
|
||||
import BarcodeTemplatesTable from "@/app/barcode-templates/components/shared/BarcodeTemplatesTable/BarcodeTemplatesTable";
|
||||
import useBarcodeTemplateActions from "@/app/barcode-templates/hooks/useBarcodeTemplateActions";
|
||||
import { useBarcodeTemplatesCrud } from "@/app/barcode-templates/hooks/useBarcodeTemplatesCrud";
|
||||
import useBarcodeTemplatesList from "@/app/barcode-templates/hooks/useBarcodeTemplatesList";
|
||||
import PageBlock from "@/components/layout/PageBlock/PageBlock";
|
||||
import useIsMobile from "@/hooks/utils/useIsMobile";
|
||||
|
||||
const PageBody = () => {
|
||||
const isMobile = useIsMobile();
|
||||
const { barcodeTemplates, queryKey } = useBarcodeTemplatesList();
|
||||
const barcodeTemplatesCrud = useBarcodeTemplatesCrud({ queryKey });
|
||||
|
||||
const { onCreate, onChange } = useBarcodeTemplateActions();
|
||||
|
||||
return (
|
||||
<Stack h={"100%"}>
|
||||
{!isMobile && (
|
||||
<PageBlock>
|
||||
<BarcodeTemplatesDesktopHeader onCreateClick={onCreate} />
|
||||
</PageBlock>
|
||||
)}
|
||||
<PageBlock
|
||||
style={{ flex: 1, minHeight: 0 }}
|
||||
fullScreenMobile>
|
||||
<Stack
|
||||
gap={"xs"}
|
||||
h={"100%"}>
|
||||
{isMobile && (
|
||||
<BarcodeTemplatesMobileHeader
|
||||
onCreateClick={onCreate}
|
||||
/>
|
||||
)}
|
||||
<div style={{ flex: 1, overflow: "auto" }}>
|
||||
<BarcodeTemplatesTable
|
||||
items={barcodeTemplates}
|
||||
onChange={onChange}
|
||||
onDelete={barcodeTemplatesCrud.onDelete}
|
||||
/>
|
||||
</div>
|
||||
</Stack>
|
||||
</PageBlock>
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
|
||||
export default PageBody;
|
||||
Reference in New Issue
Block a user