feat: setting parent for department section
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
import { DepartmentCrud } from "../hooks/useDepartmentCrud.tsx";
|
||||
import { DepartmentSchema } from "../../../../../client";
|
||||
import { DepartmentModalForm } from "../types/DepartmentModalForm.tsx";
|
||||
import { useForm } from "@mantine/form";
|
||||
import { Button, Flex, rem, TextInput } from "@mantine/core";
|
||||
|
||||
|
||||
type Props = {
|
||||
departmentsCrud: DepartmentCrud;
|
||||
department?: DepartmentSchema;
|
||||
closeModal: () => void;
|
||||
}
|
||||
|
||||
const DepartmentForm = ({
|
||||
departmentsCrud,
|
||||
department,
|
||||
closeModal,
|
||||
}: Props) => {
|
||||
const initialValues: Partial<DepartmentModalForm> = {
|
||||
name: department?.name ?? "",
|
||||
};
|
||||
const form = useForm<Partial<DepartmentModalForm>>({
|
||||
initialValues,
|
||||
validate: {
|
||||
name: name => !name && "Необходимо указать название",
|
||||
},
|
||||
});
|
||||
|
||||
const isChanged = (): boolean => {
|
||||
return initialValues.name !== form.values.name;
|
||||
};
|
||||
|
||||
const onSubmit = () => {
|
||||
if (department) {
|
||||
if (isChanged()) {
|
||||
departmentsCrud.onChange({ name: form.values.name ?? "", id: department?.id });
|
||||
}
|
||||
} else {
|
||||
departmentsCrud.onCreate({ name: form.values.name ?? "" });
|
||||
}
|
||||
closeModal();
|
||||
};
|
||||
|
||||
return (
|
||||
<form onSubmit={form.onSubmit(() => onSubmit())}>
|
||||
<Flex
|
||||
direction={"column"}
|
||||
gap={rem(10)}
|
||||
>
|
||||
<TextInput
|
||||
label={"Название"}
|
||||
{...form.getInputProps("name")}
|
||||
/>
|
||||
|
||||
<Button
|
||||
variant={"default"}
|
||||
type={"submit"}
|
||||
>
|
||||
Сохранить
|
||||
</Button>
|
||||
</Flex>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
export default DepartmentForm;
|
||||
@@ -0,0 +1,90 @@
|
||||
import { DepartmentSchema, DepartmentSectionSchema } from "../../../../../client";
|
||||
import { DepartmentSectionCrud } from "../hooks/useDepartmentSectionCrud.tsx";
|
||||
import { DepartmentSectionModalForm } from "../types/DepartmentModalForm.tsx";
|
||||
import { useForm } from "@mantine/form";
|
||||
import { Button, Flex, rem, TextInput } from "@mantine/core";
|
||||
import DepartmentSelect from "./DepartmentSelect.tsx";
|
||||
|
||||
type Props = {
|
||||
departmentSectionsCrud: DepartmentSectionCrud;
|
||||
departmentSection?: DepartmentSectionSchema;
|
||||
allDepartments: DepartmentSchema[];
|
||||
closeModal: () => void;
|
||||
}
|
||||
|
||||
const DepartmentSectionForm = ({
|
||||
departmentSectionsCrud,
|
||||
departmentSection,
|
||||
allDepartments,
|
||||
closeModal,
|
||||
}: Props) => {
|
||||
const initialValues: DepartmentSectionModalForm = {
|
||||
name: departmentSection?.name ?? "",
|
||||
departmentId: departmentSection?.departmentId ?? null,
|
||||
parentDepartmentSectionId: departmentSection?.parentDepartmentSectionId ?? null,
|
||||
};
|
||||
|
||||
const form = useForm<DepartmentSectionModalForm>({
|
||||
initialValues,
|
||||
validate: {
|
||||
name: name => !name && "Необходимо указать название",
|
||||
},
|
||||
});
|
||||
|
||||
const isChanged = (): boolean => {
|
||||
return (
|
||||
initialValues.name !== form.values.name ||
|
||||
initialValues.departmentId !== form.values.departmentId ||
|
||||
initialValues.parentDepartmentSectionId !== form.values.parentDepartmentSectionId
|
||||
);
|
||||
};
|
||||
|
||||
const onSubmit = () => {
|
||||
const sectionData = { ...departmentSection, ...form.values };
|
||||
const sectionName = form.values.name;
|
||||
if (!sectionName) return;
|
||||
if (departmentSection?.id) {
|
||||
if (isChanged()) {
|
||||
departmentSectionsCrud.onChange({
|
||||
id: departmentSection.id,
|
||||
name: form.values.name ?? "",
|
||||
departmentId: form.values.departmentId,
|
||||
parentDepartmentSectionId: form.values.parentDepartmentSectionId,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
console.log(sectionData);
|
||||
departmentSectionsCrud.onCreate(sectionData);
|
||||
}
|
||||
closeModal();
|
||||
};
|
||||
|
||||
return (
|
||||
<form onSubmit={form.onSubmit(() => onSubmit())}>
|
||||
<Flex
|
||||
direction={"column"}
|
||||
gap={rem(10)}
|
||||
>
|
||||
<TextInput
|
||||
label={"Название"}
|
||||
{...form.getInputProps("name")}
|
||||
/>
|
||||
|
||||
<DepartmentSelect
|
||||
allDepartments={allDepartments}
|
||||
form={form}
|
||||
parentDepartmentSectionId={departmentSection?.id}
|
||||
/>
|
||||
|
||||
<Button
|
||||
variant={"default"}
|
||||
type={"submit"}
|
||||
>
|
||||
Сохранить
|
||||
</Button>
|
||||
</Flex>
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
export default DepartmentSectionForm;
|
||||
@@ -0,0 +1,80 @@
|
||||
import { DepartmentSchema, DepartmentSectionSchema } from "../../../../../client";
|
||||
import { Select } from "@mantine/core";
|
||||
import { DepartmentSectionModalForm } from "../types/DepartmentModalForm.tsx";
|
||||
import { UseFormReturnType } from "@mantine/form";
|
||||
|
||||
|
||||
type Props = {
|
||||
allDepartments: DepartmentSchema[];
|
||||
form: UseFormReturnType<DepartmentSectionModalForm>;
|
||||
parentDepartmentSectionId?: number;
|
||||
}
|
||||
|
||||
const DepartmentSelect = ({
|
||||
allDepartments,
|
||||
form,
|
||||
parentDepartmentSectionId,
|
||||
}: Props) => {
|
||||
const getDepartmentValue = () => {
|
||||
if (form.values.departmentId) {
|
||||
return "D" + form.values.departmentId;
|
||||
}
|
||||
return "O" + form.values.parentDepartmentSectionId;
|
||||
};
|
||||
|
||||
const setDepartmentValue = (value: string | null) => {
|
||||
if (!value) {
|
||||
form.setFieldValue("departmentId", null);
|
||||
form.setFieldValue("parentDepartmentSectionId", null);
|
||||
return;
|
||||
}
|
||||
const isDepartmentSection = value && value[0] === "O";
|
||||
const id = Number.parseInt(value.substring(1));
|
||||
if (isDepartmentSection) {
|
||||
form.setFieldValue("departmentId", null);
|
||||
form.setFieldValue("parentDepartmentSectionId", id);
|
||||
} else {
|
||||
form.setFieldValue("departmentId", id);
|
||||
form.setFieldValue("parentDepartmentSectionId", null);
|
||||
}
|
||||
};
|
||||
|
||||
const getDepartmentSections = (section: DepartmentSectionSchema | DepartmentSchema): DepartmentSectionSchema[] => {
|
||||
const sections: DepartmentSectionSchema[] = [];
|
||||
|
||||
section.sections?.forEach((section) => {
|
||||
sections.push(section);
|
||||
sections.push(...getDepartmentSections(section));
|
||||
});
|
||||
return sections;
|
||||
};
|
||||
|
||||
let departmentSections: DepartmentSectionSchema[] = [];
|
||||
allDepartments.forEach(department => {
|
||||
departmentSections.push(...getDepartmentSections(department));
|
||||
});
|
||||
|
||||
if (parentDepartmentSectionId) {
|
||||
departmentSections = departmentSections.filter(section => section.id !== parentDepartmentSectionId);
|
||||
}
|
||||
|
||||
return (
|
||||
<Select
|
||||
data={[
|
||||
{
|
||||
group: "Департаменты",
|
||||
items: allDepartments.map(d => ({ label: d.name, value: "D" + d.id.toString() })),
|
||||
},
|
||||
{
|
||||
group: "Отделы",
|
||||
items: departmentSections.map(d => ({ label: d.name, value: "O" + d.id.toString() })),
|
||||
},
|
||||
]}
|
||||
value={getDepartmentValue()}
|
||||
onChange={setDepartmentValue}
|
||||
label={"Родительский департамент/отдел"}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default DepartmentSelect;
|
||||
@@ -4,7 +4,7 @@ import { UserSchema } from "../../../../../client";
|
||||
import useAvailableUsersList from "../hooks/useAvailableUsersList.tsx";
|
||||
|
||||
type SectionData = {
|
||||
sectionId: number;
|
||||
sectionid: number;
|
||||
}
|
||||
|
||||
type Props = SectionData & Omit<
|
||||
@@ -13,7 +13,7 @@ type Props = SectionData & Omit<
|
||||
>;
|
||||
|
||||
const UserForDepartmentSelect: FC<Props> = props => {
|
||||
const { objects: users } = useAvailableUsersList({ sectionId: props.sectionId });
|
||||
const { objects: users } = useAvailableUsersList({ sectionId: props.sectionid });
|
||||
|
||||
return (
|
||||
<ObjectSelect
|
||||
|
||||
@@ -55,6 +55,7 @@ const useDepartmentContextState = () => {
|
||||
departmentSectionsCrud,
|
||||
isDepartmentSection,
|
||||
element,
|
||||
allDepartments: departments,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
@@ -53,7 +53,7 @@ const AddUserToDepartmentModal = ({
|
||||
<UserForDepartmentSelect
|
||||
label={"Пользователь"}
|
||||
{...form.getInputProps("user")}
|
||||
sectionId={innerProps.departmentSection.id}
|
||||
sectionid={innerProps.departmentSection.id}
|
||||
/>
|
||||
<Checkbox
|
||||
label={"Является руководителем"}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { useForm } from "@mantine/form";
|
||||
import { ContextModalProps } from "@mantine/modals";
|
||||
import { Button, Flex, rem, TextInput } from "@mantine/core";
|
||||
import { DepartmentModalForm } from "../types/DepartmentModalForm.tsx";
|
||||
import { DepartmentSchema, DepartmentSectionBaseSchema, DepartmentSectionSchema } from "../../../../../client";
|
||||
import { DepartmentCrud } from "../hooks/useDepartmentCrud.tsx";
|
||||
import { DepartmentSectionCrud } from "../hooks/useDepartmentSectionCrud.tsx";
|
||||
import DepartmentForm from "../components/DepartmentForm.tsx";
|
||||
import DepartmentSectionForm from "../components/DepartmentSectionForm.tsx";
|
||||
|
||||
type Props = {
|
||||
departmentsCrud: DepartmentCrud;
|
||||
departmentSectionsCrud: DepartmentSectionCrud;
|
||||
element?: DepartmentSchema | DepartmentSectionSchema | DepartmentSectionBaseSchema;
|
||||
isDepartmentSection: boolean;
|
||||
allDepartments: DepartmentSchema[];
|
||||
}
|
||||
|
||||
const DepartmentModal = ({
|
||||
@@ -18,61 +18,27 @@ const DepartmentModal = ({
|
||||
id,
|
||||
innerProps,
|
||||
}: ContextModalProps<Props>) => {
|
||||
const {
|
||||
departmentsCrud,
|
||||
departmentSectionsCrud,
|
||||
element,
|
||||
isDepartmentSection,
|
||||
} = innerProps;
|
||||
|
||||
const initialValues: DepartmentModalForm = {
|
||||
name: element?.name ?? "",
|
||||
};
|
||||
const form = useForm<DepartmentModalForm>({
|
||||
initialValues,
|
||||
validate: {
|
||||
name: name => !name && "Необходимо указать название",
|
||||
},
|
||||
});
|
||||
|
||||
const onSubmit = () => {
|
||||
if (isDepartmentSection) {
|
||||
const sectionData = { ...element as DepartmentSectionSchema, ...form.values };
|
||||
if (sectionData.id) {
|
||||
departmentSectionsCrud.onChange(sectionData);
|
||||
} else {
|
||||
departmentSectionsCrud.onCreate(sectionData);
|
||||
}
|
||||
} else {
|
||||
const departmentData = element as DepartmentSchema;
|
||||
if (element) {
|
||||
departmentsCrud.onChange({ ...form.values, id: departmentData.id });
|
||||
} else {
|
||||
departmentsCrud.onCreate(form.values);
|
||||
}
|
||||
}
|
||||
const closeModal = () => {
|
||||
context.closeContextModal(id);
|
||||
};
|
||||
|
||||
return (
|
||||
<form onSubmit={form.onSubmit(() => onSubmit())}>
|
||||
<Flex
|
||||
direction={"column"}
|
||||
gap={rem(10)}
|
||||
>
|
||||
<TextInput
|
||||
label={"Название"}
|
||||
{...form.getInputProps("name")}
|
||||
/>
|
||||
if (innerProps.isDepartmentSection) {
|
||||
return (
|
||||
<DepartmentSectionForm
|
||||
departmentSectionsCrud={innerProps.departmentSectionsCrud}
|
||||
allDepartments={innerProps.allDepartments}
|
||||
departmentSection={innerProps.element as DepartmentSectionSchema}
|
||||
closeModal={closeModal}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
<Button
|
||||
variant={"default"}
|
||||
type={"submit"}
|
||||
>
|
||||
Сохранить
|
||||
</Button>
|
||||
</Flex>
|
||||
</form>
|
||||
return (
|
||||
<DepartmentForm
|
||||
departmentsCrud={innerProps.departmentsCrud}
|
||||
department={innerProps.element as DepartmentSchema}
|
||||
closeModal={closeModal}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
export type DepartmentModalForm = {
|
||||
name: string;
|
||||
}
|
||||
|
||||
export type DepartmentSectionModalForm = {
|
||||
name: string;
|
||||
parentDepartmentSectionId: number | null;
|
||||
departmentId: number | null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user