feat: processing of modules in card, renaming

This commit is contained in:
2025-02-20 20:21:08 +04:00
parent dc9455966e
commit 8083bdf3d0
29 changed files with 240 additions and 768 deletions

View File

@@ -1,4 +1,4 @@
import { ProjectSchema } from "../../client";
import { AttributeSchema, ProjectSchema } from "../../client";
import { UseFormReturnType } from "@mantine/form";
import { rem, Stack } from "@mantine/core";
import { ReactNode } from "react";
@@ -11,7 +11,17 @@ type Props = {
}
const CardAttributeFields = ({ project, form }: Props) => {
const fields: ReactNode[] = project.attributes.map(attribute => {
const attributes: AttributeSchema[] = [];
project.attributes.forEach(attribute => {
if (attribute.type.type === "boolean") {
attributes.push(attribute);
} else {
attributes.unshift(attribute);
}
});
const fields: ReactNode[] = attributes.map(attribute => {
return (
<CardAttributeField
key={attribute.id}

View File

@@ -22,6 +22,7 @@ const CardSummaryItem: FC<Props> = ({ cardSummary, color }) => {
const { onDelete, onComplete, onDeleteFromGroup } = useCardSummaryState();
const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject);
const isClientIncluded = isModuleInProject(Modules.CLIENTS, selectedProject);
const onDealSummaryClick = () => {
CardService.getCardById({ cardId: cardSummary.id }).then(card => {
@@ -61,16 +62,13 @@ const CardSummaryItem: FC<Props> = ({ cardSummary, color }) => {
style={{ backgroundColor: color }}
>
<Flex direction={"column"} flex={1} gap={rem(3)}>
<Flex justify={"space-between"}>
<Text
c={"gray.6"}
size={"xs"}
>
{cardSummary.clientName}
</Text>
</Flex>
{isClientIncluded && (
<Flex justify={"space-between"}>
<Text c={"gray.6"} size={"xs"}>
{cardSummary.clientName}
</Text>
</Flex>
)}
<Text
c={"blue.5"}

View File

@@ -36,15 +36,14 @@ export const CardsDndColumn: FC<Props> = ({
return has(obj, "cards");
};
const getDealGroups = (): GroupWithCards[] => {
const getCardGroups = (): GroupWithCards[] => {
const groups = uniq<CardGroupSchema>(summaries.filter(s => s.group).map(summary => summary.group) as CardGroupSchema[]);
if (groups.length === 0) return [];
const groupedSummaries = groupBy(summaries, "group.id");
const groupDict = groups.reduce((acc, group) => {
acc[group.id] = group;
return acc;
}
, {} as { [key: number]: CardGroupSchema });
acc[group.id] = group;
return acc;
}, {} as { [key: number]: CardGroupSchema });
return Object.entries(groupedSummaries).reduce((acc, [groupId, cards]) => {
if (!groupId) return acc;
const group = groupDict[parseInt(groupId)];
@@ -57,8 +56,8 @@ export const CardsDndColumn: FC<Props> = ({
}, [] as { group: CardGroupSchema; cards: CardSummary[] }[]);
};
const getDealsAndGroups = (): (GroupWithCards | CardSummary)[] => {
const groups = getDealGroups();
const getCardsAndGroups = (): (GroupWithCards | CardSummary)[] => {
const groups = getCardGroups();
const cards = summaries.filter(s => !s.group).sort((a, b) => {
return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
});
@@ -144,7 +143,7 @@ export const CardsDndColumn: FC<Props> = ({
}
</>
)}
{getDealsAndGroups().map(obj => {
{getCardsAndGroups().map(obj => {
if (isGroup(obj)) {
return renderGroup(obj);
}

View File

@@ -2,7 +2,7 @@ import { Button, rem, Textarea, TextInput } from "@mantine/core";
import { QuickCard } from "../../../../types/QuickCard.ts";
import { FC } from "react";
import { useForm } from "@mantine/form";
import styles from "./CreateDealForm.module.css";
import styles from "./CreateCardForm.module.css";
import ClientAutocomplete from "../../../Selects/ClientAutocomplete/ClientAutocomplete.tsx";
import { DateTimePicker } from "@mantine/dates";
import ShippingWarehouseAutocomplete
@@ -19,22 +19,28 @@ type Props = {
const CreateCardForm: FC<Props> = ({ onSubmit, onCancel }) => {
const { selectedProject } = useCardPageContext();
const isPrefillingDealEnabled = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject);
const isPrefillingEnabled = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject);
const { prefillOnOpen, prefillCard } = usePrefillCardContext();
const isServicesAndProductsIncluded = isModuleInProject(Modules.SERVICES_AND_PRODUCTS, selectedProject);
const isClientsIncluded = isModuleInProject(Modules.CLIENTS, selectedProject);
const form = useForm<QuickCard>({
initialValues: {
name: "",
clientName: "",
clientAddress: "",
clientName: null,
comment: "",
acceptanceDate: new Date(),
shippingWarehouse: "",
baseMarketplace: {
key: "",
iconUrl: "",
name: "",
},
shippingWarehouse: null,
baseMarketplace: null,
},
validate: {
baseMarketplace: baseMarketplace =>
isServicesAndProductsIncluded && !baseMarketplace && "МП не выбран",
shippingWarehouse: shippingWarehouse =>
isServicesAndProductsIncluded && !shippingWarehouse && "Склад отгрузки не выбран",
clientName: clientName =>
isClientsIncluded && !clientName && "Клиент не выбран",
},
});
@@ -54,26 +60,34 @@ const CreateCardForm: FC<Props> = ({ onSubmit, onCancel }) => {
}}>
<div className={styles["inputs"]}>
<TextInput
placeholder={"Название сделки"}
placeholder={"Название"}
{...form.getInputProps("name")}
/>
</div>
<div className={styles["inputs"]}>
<ClientAutocomplete
nameRestProps={form.getInputProps("clientName")}
/>
</div>
<div className={styles["inputs"]}>
<BaseMarketplaceSelect
rightSection={<></>}
placeholder={"Базовый маркетплейс"}
{...form.getInputProps("baseMarketplace")}
/>
<ShippingWarehouseAutocomplete
{...form.getInputProps("shippingWarehouse")}
placeholder={"Склад отгрузки"}
/>
</div>
{isClientsIncluded && (
<div className={styles["inputs"]}>
<ClientAutocomplete
nameRestProps={form.getInputProps("clientName")}
/>
</div>
)}
{isServicesAndProductsIncluded && (
<>
<div className={styles["inputs"]}>
<BaseMarketplaceSelect
rightSection={<></>}
placeholder={"Базовый маркетплейс"}
{...form.getInputProps("baseMarketplace")}
/>
</div>
<div className={styles["inputs"]}>
<ShippingWarehouseAutocomplete
{...form.getInputProps("shippingWarehouse")}
placeholder={"Склад отгрузки"}
/>
</div>
</>
)}
<div className={styles["inputs"]}>
<Textarea
autosize
@@ -89,7 +103,7 @@ const CreateCardForm: FC<Props> = ({ onSubmit, onCancel }) => {
{...form.getInputProps("acceptanceDate")}
/>
</div>
{isPrefillingDealEnabled && (
{isPrefillingEnabled && (
<div className={styles["button-prefill"]}>
<Button
style={{ whiteSpace: "wrap" }}