diff --git a/src/client/models/ModuleSchema.ts b/src/client/models/ModuleSchema.ts index d29dcd8..0d506ab 100644 --- a/src/client/models/ModuleSchema.ts +++ b/src/client/models/ModuleSchema.ts @@ -8,5 +8,6 @@ export type ModuleSchema = { label: string; iconName?: (string | null); isDeleted: boolean; + dependsOn?: Array; }; diff --git a/src/components/Dnd/Cards/CardGroupView/CardGroupView.tsx b/src/components/Dnd/Cards/CardGroupView/CardGroupView.tsx index cf3e540..667bc24 100644 --- a/src/components/Dnd/Cards/CardGroupView/CardGroupView.tsx +++ b/src/components/Dnd/Cards/CardGroupView/CardGroupView.tsx @@ -6,8 +6,9 @@ import { IconGripHorizontal } from "@tabler/icons-react"; import { useDebouncedValue } from "@mantine/hooks"; import { notifications } from "../../../../shared/lib/notifications.ts"; import { useProjectsContext } from "../../../../contexts/ProjectsContext.tsx"; -import isModuleInProject, { Modules } from "../../../../modules/utils/isModuleInProject.ts"; +import isModuleInProject from "../../../../modules/utils/isModuleInProject.ts"; import CardTags from "../CardTags/CardTags.tsx"; +import { ModuleNames } from "../../../../modules/modules.tsx"; type Props = { cards: CardSummary[]; @@ -19,7 +20,7 @@ export const CardGroupView: FC = ({ cards, group }) => { const [name, setName] = useState(group.name || ""); const [debouncedName] = useDebouncedValue(name, 200); const { selectedProject } = useProjectsContext(); - const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject); + const isServicesAndProductsIncluded = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedProject); const totalPrice = useMemo(() => cards.reduce((acc, card) => acc + card.totalPrice, 0), [cards]); const totalProducts = useMemo(() => cards.reduce((acc, card) => acc + card.totalProducts, 0), [cards]); diff --git a/src/components/Dnd/Cards/CardSummaryItem/CardSummaryItem.tsx b/src/components/Dnd/Cards/CardSummaryItem/CardSummaryItem.tsx index be56a3a..2055dac 100644 --- a/src/components/Dnd/Cards/CardSummaryItem/CardSummaryItem.tsx +++ b/src/components/Dnd/Cards/CardSummaryItem/CardSummaryItem.tsx @@ -9,10 +9,11 @@ import { faCheck } from "@fortawesome/free-solid-svg-icons"; import { IconCheck, IconLayoutGridRemove, IconTrash } from "@tabler/icons-react"; import { useContextMenu } from "mantine-contextmenu"; import useCardSummaryState from "./useCardSummaryState.tsx"; -import isModuleInProject, { Modules } from "../../../../modules/utils/isModuleInProject.ts"; +import isModuleInProject from "../../../../modules/utils/isModuleInProject.ts"; import { useProjectsContext } from "../../../../contexts/ProjectsContext.tsx"; import CardTags from "../CardTags/CardTags.tsx"; import CardAttributesInSummaryItem from "../CardAttributesInSummaryItem/CardAttributesInSummaryItem.tsx"; +import { ModuleNames } from "../../../../modules/modules.tsx"; type Props = { cardSummary: CardSummary; @@ -25,8 +26,8 @@ const CardSummaryItem: FC = ({ cardSummary, color }) => { const { setSelectedCard } = useCardPageContext(); const { onDelete, onComplete, onDeleteFromGroup } = useCardSummaryState(); - const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject); - const isClientIncluded = isModuleInProject(Modules.CLIENTS, selectedProject); + const isServicesAndProductsIncluded = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedProject); + const isClientIncluded = isModuleInProject(ModuleNames.CLIENTS, selectedProject); const onCardSummaryClick = () => { CardService.getCardById({ cardId: cardSummary.id }).then(card => { diff --git a/src/components/Dnd/Cards/CardsDndColumn/CardsDndColumn.tsx b/src/components/Dnd/Cards/CardsDndColumn/CardsDndColumn.tsx index e6df276..2235b67 100644 --- a/src/components/Dnd/Cards/CardsDndColumn/CardsDndColumn.tsx +++ b/src/components/Dnd/Cards/CardsDndColumn/CardsDndColumn.tsx @@ -9,8 +9,9 @@ import { groupBy, has, uniq } from "lodash"; import { CardGroupView } from "../CardGroupView/CardGroupView.tsx"; import CreateDealsFromFileButton from "../CreateCardsFromFileButton/CreateDealsFromFileButton.tsx"; import DragState from "../../../../pages/CardsPage/enums/DragState.ts"; -import isModuleInProject, { Modules } from "../../../../modules/utils/isModuleInProject.ts"; +import isModuleInProject from "../../../../modules/utils/isModuleInProject.ts"; import { useProjectsContext } from "../../../../contexts/ProjectsContext.tsx"; +import { ModuleNames } from "../../../../modules/modules.tsx"; type Props = { status: StatusSchema; @@ -28,7 +29,7 @@ export const CardsDndColumn: FC = ({ withCreateButton = false, }) => { const { selectedProject } = useProjectsContext(); - const isCreatingDealFromFileEnabled = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject); + const isCreatingDealFromFileEnabled = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedProject); const isDropDisabled = dragState !== DragState.DRAG_CARD; const droppableId = status.id.toString(); diff --git a/src/components/Dnd/Cards/CreateCardButton/CreateCardButton.tsx b/src/components/Dnd/Cards/CreateCardButton/CreateCardButton.tsx index f16487f..639066a 100644 --- a/src/components/Dnd/Cards/CreateCardButton/CreateCardButton.tsx +++ b/src/components/Dnd/Cards/CreateCardButton/CreateCardButton.tsx @@ -7,8 +7,9 @@ import { CardService, StatusSchema } from "../../../../client"; import { useQueryClient } from "@tanstack/react-query"; import { dateWithoutTimezone } from "../../../../shared/lib/date.ts"; import { usePrefillCardContext } from "../../../../pages/CardsPage/contexts/PrefillCardContext.tsx"; -import isModuleInProject, { Modules } from "../../../../modules/utils/isModuleInProject.ts"; +import isModuleInProject from "../../../../modules/utils/isModuleInProject.ts"; import { useProjectsContext } from "../../../../contexts/ProjectsContext.tsx"; +import { ModuleNames } from "../../../../modules/modules.tsx"; type Props = { status: StatusSchema; @@ -21,7 +22,7 @@ const CreateCardButton = ({ status }: Props) => { const { prefillCard, setPrefillCard } = usePrefillCardContext(); const { selectedProject } = useProjectsContext(); - const isPrefillingDealEnabled = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject); + const isPrefillingDealEnabled = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedProject); return (
void; @@ -19,11 +20,11 @@ type Props = { const CreateCardForm: FC = ({ onSubmit, onCancel }) => { const { selectedProject } = useProjectsContext(); - const isPrefillingEnabled = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject); + const isPrefillingEnabled = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedProject); const { prefillOnOpen, prefillCard } = usePrefillCardContext(); - const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject); - const isClientsIncluded = isModuleInProject(Modules.CLIENTS, selectedProject); + const isServicesAndProductsIncluded = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedProject); + const isClientsIncluded = isModuleInProject(ModuleNames.CLIENTS, selectedProject); const form = useForm({ initialValues: { diff --git a/src/components/Dnd/Statuses/Status/Status.tsx b/src/components/Dnd/Statuses/Status/Status.tsx index eea6276..76a0c5f 100644 --- a/src/components/Dnd/Statuses/Status/Status.tsx +++ b/src/components/Dnd/Statuses/Status/Status.tsx @@ -9,9 +9,10 @@ import DragState from "../../../../pages/CardsPage/enums/DragState.ts"; import { useContextMenu } from "mantine-contextmenu"; import { IconEdit, IconTrash } from "@tabler/icons-react"; import useStatus from "./hooks/useStatus.tsx"; -import isModuleInProject, { Modules } from "../../../../modules/utils/isModuleInProject.ts"; +import isModuleInProject from "../../../../modules/utils/isModuleInProject.ts"; import { useEqualHeightsContext } from "./contexts/EqualHeightContext.tsx"; import { useBoardsContext } from "../../../../contexts/BoardsContext.tsx"; +import { ModuleNames } from "../../../../modules/modules.tsx"; type Props = { @@ -27,7 +28,7 @@ const Status = ({ summaries, status, dragState, index }: Props) => { } = useBoardsContext(); const isDropDisabled = dragState !== DragState.DRAG_STATUS; - const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedBoard?.project); + const isServicesAndProductsIncluded = isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, selectedBoard?.project); const { divRefs, diff --git a/src/modules/utils/isModuleInProject.ts b/src/modules/utils/isModuleInProject.ts index 32d2ab8..0808445 100644 --- a/src/modules/utils/isModuleInProject.ts +++ b/src/modules/utils/isModuleInProject.ts @@ -1,21 +1,7 @@ import { ProjectSchema } from "../../client"; +import { ModuleNames } from "../modules.tsx"; -export enum Modules { - SERVICES_AND_PRODUCTS = "servicesAndProducts", - SHIPMENT = "shipment", - EMPLOYEES = "employees", - CLIENTS = "clients", - MANAGERS = "managers", -} - -const isModuleInProject = (module: Modules, project?: ProjectSchema | null) => { - // if servicesAndProducts included, then clients also included - if (module === Modules.CLIENTS) { - if (project?.modules.findIndex(m => m.key === Modules.SERVICES_AND_PRODUCTS.toString()) !== -1) { - return true; - } - } - +const isModuleInProject = (module: ModuleNames, project?: ProjectSchema | null) => { return project?.modules.findIndex(m => m.key === module.toString()) !== -1; }; diff --git a/src/pages/CardsPage/drawers/CardPrefillDrawer/hooks/usePrefillCard.tsx b/src/pages/CardsPage/drawers/CardPrefillDrawer/hooks/usePrefillCard.tsx index d9a0f2a..0f5c12d 100644 --- a/src/pages/CardsPage/drawers/CardPrefillDrawer/hooks/usePrefillCard.tsx +++ b/src/pages/CardsPage/drawers/CardPrefillDrawer/hooks/usePrefillCard.tsx @@ -2,7 +2,8 @@ import { useForm } from "@mantine/form"; import { useEffect, useState } from "react"; import { BaseMarketplaceSchema } from "../../../../../client"; import { useCardSummariesFull } from "../../../hooks/useCardSummaries.tsx"; -import isModuleInProject, { Modules } from "../../../../../modules/utils/isModuleInProject.ts"; +import isModuleInProject from "../../../../../modules/utils/isModuleInProject.ts"; +import { ModuleNames } from "../../../../../modules/modules.tsx"; type State = { idOrName: string | null; @@ -22,7 +23,7 @@ const usePrefillCard = () => { const applyFilters = () => { let result = objects; - result = result.filter(obj => isModuleInProject(Modules.SERVICES_AND_PRODUCTS, obj.board.project)); + result = result.filter(obj => isModuleInProject(ModuleNames.SERVICES_AND_PRODUCTS, obj.board.project)); if (form.values.idOrName) { if (isNaN(parseInt(form.values.idOrName))) { diff --git a/src/pages/CardsPage/drawers/ProjectEditDrawer/tabs/Modules/hooks/modulesTableColumns.tsx b/src/pages/CardsPage/drawers/ProjectEditDrawer/tabs/Modules/hooks/modulesTableColumns.tsx index b21a905..5109459 100644 --- a/src/pages/CardsPage/drawers/ProjectEditDrawer/tabs/Modules/hooks/modulesTableColumns.tsx +++ b/src/pages/CardsPage/drawers/ProjectEditDrawer/tabs/Modules/hooks/modulesTableColumns.tsx @@ -1,7 +1,8 @@ import { useMemo } from "react"; import { MRT_ColumnDef } from "mantine-react-table"; import { ModuleSchema } from "../../../../../../../client"; -import { Center, Checkbox } from "@mantine/core"; +import { Center, Checkbox, em, Group, Tooltip } from "@mantine/core"; +import { IconInfoCircle } from "@tabler/icons-react"; type Props = { @@ -32,7 +33,25 @@ const useModulesTableColumns = ({ selectedModules }: Props) => { { header: "Название", accessorKey: "label", + size: 200, + }, + { + header: "", + Header: ( + + <>Зависит от модулей + + + + + ), + accessorKey: "dependsOn", size: 10000, + Cell: ({ row }) => ( + <> + {row.original.dependsOn?.map(module => module.label).join(", ")} + + ), }, ], [selectedModules],