feat: modules page and module editor page for mobiles
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { RefObject, useMemo, useRef } from "react";
|
import { RefObject, useMemo, useRef } from "react";
|
||||||
import { IconList, IconTag } from "@tabler/icons-react";
|
import { IconApps, IconList, IconTag } from "@tabler/icons-react";
|
||||||
import { SimpleGrid, Stack } from "@mantine/core";
|
import { SimpleGrid, Stack } from "@mantine/core";
|
||||||
import Action from "@/app/actions/components/Action/Action";
|
import Action from "@/app/actions/components/Action/Action";
|
||||||
import mobileButtonsData from "@/app/actions/data/mobileButtonsData";
|
import mobileButtonsData from "@/app/actions/data/mobileButtonsData";
|
||||||
@ -28,6 +28,11 @@ const PageBody = () => {
|
|||||||
label: "Атрибуты",
|
label: "Атрибуты",
|
||||||
href: "/attributes",
|
href: "/attributes",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
icon: IconApps,
|
||||||
|
label: "Модули",
|
||||||
|
href: "/modules",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: IconTag,
|
icon: IconTag,
|
||||||
label: "Теги",
|
label: "Теги",
|
||||||
|
|||||||
@ -28,7 +28,7 @@ const mobileButtonsData: LinkData[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: IconFileBarcode,
|
icon: IconFileBarcode,
|
||||||
label: "Шаблоны штрихкодов",
|
label: "Шаблоны ШК",
|
||||||
href: "/barcode-templates",
|
href: "/barcode-templates",
|
||||||
moduleName: ModuleNames.FULFILLMENT_BASE,
|
moduleName: ModuleNames.FULFILLMENT_BASE,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { FC, useMemo } from "react";
|
||||||
|
import useAttributesList from "@/app/module-editor/[moduleId]/hooks/useAttributesList";
|
||||||
|
import ObjectSelect, {
|
||||||
|
ObjectSelectProps,
|
||||||
|
} from "@/components/selects/ObjectSelect/ObjectSelect";
|
||||||
|
import { AttributeSchema } from "@/lib/client";
|
||||||
|
|
||||||
|
type Props = Omit<
|
||||||
|
ObjectSelectProps<AttributeSchema | null>,
|
||||||
|
"data" | "getLabelFn" | "getValueFn"
|
||||||
|
> & {
|
||||||
|
attributesToExclude?: AttributeSchema[];
|
||||||
|
};
|
||||||
|
|
||||||
|
const AttributeSelect: FC<Props> = ({ attributesToExclude, ...props }) => {
|
||||||
|
const { attributes } = useAttributesList();
|
||||||
|
|
||||||
|
const availableAttributes = useMemo(() => {
|
||||||
|
const attrIdsToExcludeSet = new Set(
|
||||||
|
attributesToExclude?.map(a => a.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
return attributes.filter(a => !attrIdsToExcludeSet.has(a.id));
|
||||||
|
}, [attributes, attributesToExclude]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ObjectSelect
|
||||||
|
searchable
|
||||||
|
placeholder={"Выберите статус"}
|
||||||
|
onClear={() => props.onChange(null)}
|
||||||
|
getLabelFn={(option: AttributeSchema) => option.label}
|
||||||
|
data={availableAttributes}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AttributeSelect;
|
||||||
@ -24,7 +24,7 @@ const useAttributesTableColumns = () => {
|
|||||||
accessor: "type.name",
|
accessor: "type.name",
|
||||||
render: attr =>
|
render: attr =>
|
||||||
attr.type.type === "select"
|
attr.type.type === "select"
|
||||||
? `Выбор "${attr.select?.label}"`
|
? `Выбор "${attr.select?.name}"`
|
||||||
: attr.type.name,
|
: attr.type.name,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -42,7 +42,7 @@ const ModuleAttribute: FC<Props> = ({ attribute }) => {
|
|||||||
<>{getAttrLabelText()}</>
|
<>{getAttrLabelText()}</>
|
||||||
<Text>
|
<Text>
|
||||||
Тип: {attribute.type.name}{" "}
|
Тип: {attribute.type.name}{" "}
|
||||||
{attribute.select && `"${attribute.select.label}"`}
|
{attribute.select && `"${attribute.select.name}"`}
|
||||||
</Text>
|
</Text>
|
||||||
</Stack>
|
</Stack>
|
||||||
<Group
|
<Group
|
||||||
|
|||||||
@ -1,11 +1,18 @@
|
|||||||
import React, { ReactNode } from "react";
|
import React, { ReactNode } from "react";
|
||||||
import { Flex } from "@mantine/core";
|
import { Flex } from "@mantine/core";
|
||||||
|
import { modals } from "@mantine/modals";
|
||||||
import ModuleAttribute from "@/app/module-editor/[moduleId]/components/shared/ModuleAttribute/ModuleAttribute";
|
import ModuleAttribute from "@/app/module-editor/[moduleId]/components/shared/ModuleAttribute/ModuleAttribute";
|
||||||
import { useModuleEditorContext } from "@/app/module-editor/[moduleId]/contexts/ModuleEditorContext";
|
import { useModuleEditorContext } from "@/app/module-editor/[moduleId]/contexts/ModuleEditorContext";
|
||||||
import FormFlexRow from "@/components/ui/FormFlexRow/FormFlexRow";
|
import FormFlexRow from "@/components/ui/FormFlexRow/FormFlexRow";
|
||||||
|
import InlineButton from "@/components/ui/InlineButton/InlineButton";
|
||||||
|
import useIsMobile from "@/hooks/utils/useIsMobile";
|
||||||
|
|
||||||
const ModuleAttributesEditor = () => {
|
const ModuleAttributesEditor = () => {
|
||||||
const { module } = useModuleEditorContext();
|
const {
|
||||||
|
module,
|
||||||
|
attributeActions: { addAttributeToModule },
|
||||||
|
} = useModuleEditorContext();
|
||||||
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
const getAttributesRows = () => {
|
const getAttributesRows = () => {
|
||||||
if (!module?.attributes) return [];
|
if (!module?.attributes) return [];
|
||||||
@ -29,10 +36,27 @@ const ModuleAttributesEditor = () => {
|
|||||||
return rows;
|
return rows;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onAddAttributeClick = () => {
|
||||||
|
modals.openContextModal({
|
||||||
|
modal: "addAttributeModal",
|
||||||
|
title: "Добавление атрибута",
|
||||||
|
withCloseButton: true,
|
||||||
|
innerProps: {
|
||||||
|
onSubmit: addAttributeToModule,
|
||||||
|
usedAttributes: module?.attributes ?? [],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex
|
<Flex
|
||||||
gap={"xs"}
|
gap={isMobile ? "md" : "xs"}
|
||||||
direction={"column"}>
|
direction={"column"}>
|
||||||
|
{isMobile && (
|
||||||
|
<InlineButton onClick={onAddAttributeClick}>
|
||||||
|
Добавить атрибут
|
||||||
|
</InlineButton>
|
||||||
|
)}
|
||||||
{getAttributesRows()}
|
{getAttributesRows()}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { Button, Flex, Group, Textarea, TextInput } from "@mantine/core";
|
import { Button, Flex, Group, Textarea, TextInput } from "@mantine/core";
|
||||||
import { useForm } from "@mantine/form";
|
import { useForm } from "@mantine/form";
|
||||||
import { useModuleEditorContext } from "@/app/module-editor/[moduleId]/contexts/ModuleEditorContext";
|
import { useModuleEditorContext } from "@/app/module-editor/[moduleId]/contexts/ModuleEditorContext";
|
||||||
|
import useIsMobile from "@/hooks/utils/useIsMobile";
|
||||||
import { ModuleInfo } from "../../../hooks/useModulesActions";
|
import { ModuleInfo } from "../../../hooks/useModulesActions";
|
||||||
|
|
||||||
const ModuleCommonInfoEditor = () => {
|
const ModuleCommonInfoEditor = () => {
|
||||||
@ -8,6 +9,7 @@ const ModuleCommonInfoEditor = () => {
|
|||||||
module,
|
module,
|
||||||
moduleActions: { updateCommonInfo },
|
moduleActions: { updateCommonInfo },
|
||||||
} = useModuleEditorContext();
|
} = useModuleEditorContext();
|
||||||
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
const form = useForm<ModuleInfo>({
|
const form = useForm<ModuleInfo>({
|
||||||
initialValues: module ?? {
|
initialValues: module ?? {
|
||||||
@ -39,6 +41,7 @@ const ModuleCommonInfoEditor = () => {
|
|||||||
<Group>
|
<Group>
|
||||||
<Button
|
<Button
|
||||||
variant={"default"}
|
variant={"default"}
|
||||||
|
w={isMobile ? "100%" : "auto"}
|
||||||
disabled={!form.isDirty()}
|
disabled={!form.isDirty()}
|
||||||
type={"submit"}>
|
type={"submit"}>
|
||||||
Сохранить
|
Сохранить
|
||||||
|
|||||||
@ -7,52 +7,77 @@ import ModuleAttributesEditor from "@/app/module-editor/[moduleId]/components/sh
|
|||||||
import ModuleCommonInfoEditor from "@/app/module-editor/[moduleId]/components/shared/ModuleCommonInfoEditor/ModuleCommonInfoEditor";
|
import ModuleCommonInfoEditor from "@/app/module-editor/[moduleId]/components/shared/ModuleCommonInfoEditor/ModuleCommonInfoEditor";
|
||||||
import { useModuleEditorContext } from "@/app/module-editor/[moduleId]/contexts/ModuleEditorContext";
|
import { useModuleEditorContext } from "@/app/module-editor/[moduleId]/contexts/ModuleEditorContext";
|
||||||
import PageBlock from "@/components/layout/PageBlock/PageBlock";
|
import PageBlock from "@/components/layout/PageBlock/PageBlock";
|
||||||
|
import useIsMobile from "@/hooks/utils/useIsMobile";
|
||||||
|
|
||||||
const PageBody = () => {
|
const PageBody = () => {
|
||||||
const { module } = useModuleEditorContext();
|
const { module } = useModuleEditorContext();
|
||||||
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
if (!module) return;
|
if (!module) return;
|
||||||
|
|
||||||
|
const renderMobile = () => (
|
||||||
|
<Flex
|
||||||
|
m={"xs"}
|
||||||
|
gap={"xs"}
|
||||||
|
flex={2}
|
||||||
|
direction={"column"}>
|
||||||
|
<Fieldset
|
||||||
|
flex={1}
|
||||||
|
legend={"Общие данные модуля"}>
|
||||||
|
{module && <ModuleCommonInfoEditor />}
|
||||||
|
</Fieldset>
|
||||||
|
<Fieldset
|
||||||
|
flex={3}
|
||||||
|
legend={"Атрибуты модуля"}>
|
||||||
|
<ModuleAttributesEditor />
|
||||||
|
</Fieldset>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
|
||||||
|
const renderDesktop = () => (
|
||||||
|
<Flex
|
||||||
|
w={"100%"}
|
||||||
|
h={"100%"}
|
||||||
|
flex={3}
|
||||||
|
style={{ overflow: "auto" }}
|
||||||
|
gap={"md"}>
|
||||||
|
<Fieldset
|
||||||
|
flex={1}
|
||||||
|
legend={"Атрибуты"}>
|
||||||
|
<Flex
|
||||||
|
direction={"column"}
|
||||||
|
h={"100%"}
|
||||||
|
gap={"xs"}>
|
||||||
|
<Box style={{ flex: 1, minHeight: 0 }}>
|
||||||
|
<AttributesTable />
|
||||||
|
</Box>
|
||||||
|
<CreateAttributeButton />
|
||||||
|
</Flex>
|
||||||
|
</Fieldset>
|
||||||
|
<Flex
|
||||||
|
gap={"xs"}
|
||||||
|
flex={2}
|
||||||
|
direction={"column"}>
|
||||||
|
<Fieldset
|
||||||
|
flex={1}
|
||||||
|
legend={"Общие данные модуля"}>
|
||||||
|
{module && <ModuleCommonInfoEditor />}
|
||||||
|
</Fieldset>
|
||||||
|
<Fieldset
|
||||||
|
flex={3}
|
||||||
|
legend={"Атрибуты модуля"}>
|
||||||
|
<ModuleAttributesEditor />
|
||||||
|
</Fieldset>
|
||||||
|
</Flex>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack h={"100%"}>
|
<Stack h={"100%"}>
|
||||||
<PageBlock
|
<PageBlock
|
||||||
style={{ flex: 1, minHeight: 0 }}
|
style={{ flex: 1, minHeight: 0 }}
|
||||||
fullScreenMobile>
|
fullScreenMobile>
|
||||||
<Flex
|
{isMobile ? renderMobile() : renderDesktop()}
|
||||||
w={"100%"}
|
|
||||||
h={"100%"}
|
|
||||||
flex={3}
|
|
||||||
style={{ overflow: "auto" }}
|
|
||||||
gap={"md"}>
|
|
||||||
<Fieldset
|
|
||||||
flex={1}
|
|
||||||
legend={"Атрибуты"}>
|
|
||||||
<Flex
|
|
||||||
direction={"column"}
|
|
||||||
h={"100%"}
|
|
||||||
gap={"xs"}>
|
|
||||||
<Box style={{ flex: 1, minHeight: 0 }}>
|
|
||||||
<AttributesTable />
|
|
||||||
</Box>
|
|
||||||
<CreateAttributeButton />
|
|
||||||
</Flex>
|
|
||||||
</Fieldset>
|
|
||||||
<Flex
|
|
||||||
gap={"xs"}
|
|
||||||
flex={2}
|
|
||||||
direction={"column"}>
|
|
||||||
<Fieldset
|
|
||||||
flex={1}
|
|
||||||
legend={"Общие данные модуля"}>
|
|
||||||
{module && <ModuleCommonInfoEditor />}
|
|
||||||
</Fieldset>
|
|
||||||
<Fieldset
|
|
||||||
flex={3}
|
|
||||||
legend={"Атрибуты модуля"}>
|
|
||||||
<ModuleAttributesEditor />
|
|
||||||
</Fieldset>
|
|
||||||
</Flex>
|
|
||||||
</Flex>
|
|
||||||
</PageBlock>
|
</PageBlock>
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -5,7 +5,10 @@ import useAttributesCrud from "@/app/module-editor/[moduleId]/hooks/useAttribute
|
|||||||
import { AttributeSchema, ModuleSchemaOutput } from "@/lib/client";
|
import { AttributeSchema, ModuleSchemaOutput } from "@/lib/client";
|
||||||
|
|
||||||
export type AttributesActions = {
|
export type AttributesActions = {
|
||||||
addAttributeToModule: (attribute: AttributeSchema) => void;
|
addAttributeToModule: (
|
||||||
|
attribute: AttributeSchema,
|
||||||
|
onSuccess?: () => void
|
||||||
|
) => void;
|
||||||
removeAttributeFromModule: (attribute: AttributeSchema) => void;
|
removeAttributeFromModule: (attribute: AttributeSchema) => void;
|
||||||
onEditAttributeLabel: (attribute: AttributeSchema) => void;
|
onEditAttributeLabel: (attribute: AttributeSchema) => void;
|
||||||
onCreate: () => void;
|
onCreate: () => void;
|
||||||
@ -22,8 +25,10 @@ type Props = {
|
|||||||
const useAttributesActions = (props: Props): AttributesActions => {
|
const useAttributesActions = (props: Props): AttributesActions => {
|
||||||
const crud = useAttributesCrud(props);
|
const crud = useAttributesCrud(props);
|
||||||
|
|
||||||
const addAttributeToModule = (attribute: AttributeSchema) =>
|
const addAttributeToModule = (
|
||||||
crud.onToggleAttributeInModule(attribute, true);
|
attribute: AttributeSchema,
|
||||||
|
onSuccess?: () => void
|
||||||
|
) => crud.onToggleAttributeInModule(attribute, true, onSuccess);
|
||||||
|
|
||||||
const removeAttributeFromModule = (attribute: AttributeSchema) => {
|
const removeAttributeFromModule = (attribute: AttributeSchema) => {
|
||||||
modals.openConfirmModal({
|
modals.openConfirmModal({
|
||||||
|
|||||||
@ -26,7 +26,8 @@ type Props = {
|
|||||||
type AttributesCrud = {
|
type AttributesCrud = {
|
||||||
onToggleAttributeInModule: (
|
onToggleAttributeInModule: (
|
||||||
attribute: AttributeSchema,
|
attribute: AttributeSchema,
|
||||||
isAdding: boolean
|
isAdding: boolean,
|
||||||
|
onSuccess?: () => void,
|
||||||
) => void;
|
) => void;
|
||||||
onUpdateLabel: (attributeId: number, name: string) => void;
|
onUpdateLabel: (attributeId: number, name: string) => void;
|
||||||
onCreate: (attribute: CreateAttributeSchema) => void;
|
onCreate: (attribute: CreateAttributeSchema) => void;
|
||||||
@ -77,7 +78,8 @@ const useAttributesCrud = ({
|
|||||||
|
|
||||||
const onToggleAttributeInModule = (
|
const onToggleAttributeInModule = (
|
||||||
attribute: AttributeSchema,
|
attribute: AttributeSchema,
|
||||||
isAdding: boolean
|
isAdding: boolean,
|
||||||
|
onSuccess?: () => void,
|
||||||
) => {
|
) => {
|
||||||
if (!module) return;
|
if (!module) return;
|
||||||
const mutation = isAdding
|
const mutation = isAdding
|
||||||
@ -97,6 +99,7 @@ const useAttributesCrud = ({
|
|||||||
refetchModule && refetchModule();
|
refetchModule && refetchModule();
|
||||||
refetchAttributes();
|
refetchAttributes();
|
||||||
removeGetDealModuleAttrQuery();
|
removeGetDealModuleAttrQuery();
|
||||||
|
onSuccess && onSuccess();
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@ -0,0 +1,51 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { Button, Stack } from "@mantine/core";
|
||||||
|
import { useForm } from "@mantine/form";
|
||||||
|
import { ContextModalProps } from "@mantine/modals";
|
||||||
|
import AttributeSelect from "@/app/module-editor/[moduleId]/components/mobile/AttributeSelect/AttributeSelect";
|
||||||
|
import { AttributeSchema } from "@/lib/client";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
onSubmit: (attribute: AttributeSchema, onSuccess?: () => void) => void;
|
||||||
|
usedAttributes: AttributeSchema[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type AddAttrForm = {
|
||||||
|
attribute?: AttributeSchema;
|
||||||
|
};
|
||||||
|
|
||||||
|
const AddAttributeModal = ({
|
||||||
|
context,
|
||||||
|
id,
|
||||||
|
innerProps,
|
||||||
|
}: ContextModalProps<Props>) => {
|
||||||
|
const form = useForm<AddAttrForm>({
|
||||||
|
validate: {
|
||||||
|
attribute: attribute => !attribute && "Атрибут не выбран",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const onClose = () => context.closeContextModal(id);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form
|
||||||
|
onSubmit={form.onSubmit(values =>
|
||||||
|
innerProps.onSubmit(values.attribute!, onClose)
|
||||||
|
)}>
|
||||||
|
<Stack gap={"md"}>
|
||||||
|
<AttributeSelect
|
||||||
|
attributesToExclude={innerProps.usedAttributes}
|
||||||
|
{...form.getInputProps("attribute")}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
type={"submit"}
|
||||||
|
variant={"default"}>
|
||||||
|
Добавить
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AddAttributeModal;
|
||||||
@ -25,23 +25,26 @@ const useAttributesInnerTableColumns = () => {
|
|||||||
accessor: "type.name",
|
accessor: "type.name",
|
||||||
render: attr =>
|
render: attr =>
|
||||||
attr.type.type === "select"
|
attr.type.type === "select"
|
||||||
? `Выбор "${attr.select?.label}"`
|
? `Выбор "${attr.select?.name}"`
|
||||||
: attr.type.name,
|
: attr.type.name,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Значение по умолчанию",
|
title: "Значение по умолчанию",
|
||||||
accessor: "defaultValue",
|
accessor: "defaultValue",
|
||||||
render: attr => <AttributeDefaultValue attribute={attr} />,
|
render: attr => <AttributeDefaultValue attribute={attr} />,
|
||||||
|
hidden: isMobile,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Синхронизировано в группе",
|
title: "Синхронизировано в группе",
|
||||||
accessor: "isApplicableToGroup",
|
accessor: "isApplicableToGroup",
|
||||||
render: attr => renderCheck(attr.isApplicableToGroup),
|
render: attr => renderCheck(attr.isApplicableToGroup),
|
||||||
|
hidden: isMobile,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Может быть пустым",
|
title: "Может быть пустым",
|
||||||
accessor: "isNullable",
|
accessor: "isNullable",
|
||||||
render: attr => renderCheck(attr.isNullable),
|
render: attr => renderCheck(attr.isNullable),
|
||||||
|
hidden: isMobile,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Описаниие",
|
title: "Описаниие",
|
||||||
|
|||||||
@ -74,6 +74,7 @@ const useModulesTableColumns = ({
|
|||||||
{
|
{
|
||||||
title: "Описание",
|
title: "Описание",
|
||||||
accessor: "description",
|
accessor: "description",
|
||||||
|
hidden: isMobile,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Зависит от модулей",
|
title: "Зависит от модулей",
|
||||||
@ -83,6 +84,7 @@ const useModulesTableColumns = ({
|
|||||||
{module.dependsOn?.map(m => m.label).join(", ")}
|
{module.dependsOn?.map(m => m.label).join(", ")}
|
||||||
</Text>
|
</Text>
|
||||||
),
|
),
|
||||||
|
hidden: isMobile,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessor: "actions",
|
accessor: "actions",
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import ColorPickerModal from "@/app/deals/modals/ColorPickerModal/ColorPickerMod
|
|||||||
import DealsBoardFiltersModal from "@/app/deals/modals/DealsBoardFiltersModal/DealsBoardFiltersModal";
|
import DealsBoardFiltersModal from "@/app/deals/modals/DealsBoardFiltersModal/DealsBoardFiltersModal";
|
||||||
import DealsScheduleFiltersModal from "@/app/deals/modals/DealsScheduleFiltersModal/DealsScheduleFiltersModal";
|
import DealsScheduleFiltersModal from "@/app/deals/modals/DealsScheduleFiltersModal/DealsScheduleFiltersModal";
|
||||||
import DealsTableFiltersModal from "@/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal";
|
import DealsTableFiltersModal from "@/app/deals/modals/DealsTableFiltersModal/DealsTableFiltersModal";
|
||||||
|
import AddAttributeModal from "@/app/module-editor/[moduleId]/modals/AddAttributeModal";
|
||||||
import AttributeEditorModal from "@/app/module-editor/[moduleId]/modals/AttributeEditorModal";
|
import AttributeEditorModal from "@/app/module-editor/[moduleId]/modals/AttributeEditorModal";
|
||||||
import ModuleCreatorModal from "@/app/modules/modals/ModuleCreatorModal";
|
import ModuleCreatorModal from "@/app/modules/modals/ModuleCreatorModal";
|
||||||
import {
|
import {
|
||||||
@ -46,4 +47,5 @@ export const modals = {
|
|||||||
dealTagModal: DealTagModal,
|
dealTagModal: DealTagModal,
|
||||||
attributeEditorModal: AttributeEditorModal,
|
attributeEditorModal: AttributeEditorModal,
|
||||||
moduleCreatorModal: ModuleCreatorModal,
|
moduleCreatorModal: ModuleCreatorModal,
|
||||||
|
addAttributeModal: AddAttributeModal,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user