feat: processing of modules in card, renaming
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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" }}
|
||||
|
||||
Reference in New Issue
Block a user