test-task-sws
131 строка · 4.1 Кб
1import { useCallback, useState } from "react";
2import { CiwCreateData, CiwUpdateData } from "../../ts/ApiData";
3import DefaultRow from "../defaultrow/DefaultRow";
4import EditableRow from "../editablerow/EditableRow";
5import LvlButtonsTemplate from "../lvlbuttonstemplate/LvlButtonsTemplate";
6import { IRow } from "./Row.types";
7
8/**
9* Row component
10*/
11export function Row({ qRowsWithLessNesting, node, onCreateNewRow, onAddChildRow, onUpdateRow, onDeleteRow }: IRow) {
12const [visible, setVisible] = useState(false);
13const [editMode, setEditMode] = useState(node.editMode);
14
15const menuButtonVisible = visible && !node.editMode;
16const nestingLvl = node.key.split("-").length - 1;
17const linesClassName = nestingLvl === 0 ? "" : node.key.at(-1) === "0" ? "lines" : "lines-long";
18
19const convertToNumber = useCallback((string: string) => {
20return Number(string.split(" ").join("").split(",").join("."));
21}, []);
22
23const onSendCreatedRow = useCallback(
24(formData: { rowName: string; salary: string; equipmentCosts: string; overheads: string; estimatedProfit: string }) => {
25const data: CiwCreateData = {
26equipmentCosts: formData.equipmentCosts ? convertToNumber(formData.equipmentCosts) : 0,
27estimatedProfit: formData.estimatedProfit ? convertToNumber(formData.estimatedProfit) : 0,
28machineOperatorSalary: 0,
29mainCosts: 0,
30materials: 0,
31mimExploitation: 0,
32overheads: formData.overheads ? convertToNumber(formData.overheads) : 0,
33parentId: node.parentId,
34rowName: formData.rowName,
35salary: formData.salary ? convertToNumber(formData.salary) : 0,
36supportCosts: 0,
37};
38
39onCreateNewRow(data, node.key);
40},
41[onCreateNewRow, convertToNumber],
42);
43
44const onSendEditedRow = useCallback(
45(formData: { rowName: string; salary: string; equipmentCosts: string; overheads: string; estimatedProfit: string }) => {
46const data: CiwUpdateData = {
47id: node.data.id,
48equipmentCosts: formData.equipmentCosts ? convertToNumber(formData.equipmentCosts) : 0,
49estimatedProfit: formData.estimatedProfit ? convertToNumber(formData.estimatedProfit) : 0,
50machineOperatorSalary: 0,
51mainCosts: 0,
52materials: 0,
53mimExploitation: 0,
54overheads: formData.overheads ? convertToNumber(formData.overheads) : 0,
55parentId: node.parentId,
56rowName: formData.rowName,
57salary: formData.salary ? convertToNumber(formData.salary) : 0,
58supportCosts: 0,
59};
60
61setEditMode(false);
62
63onUpdateRow(data, node.key);
64},
65[onCreateNewRow, convertToNumber],
66);
67
68const onShowButtonMenu = useCallback(() => {
69if (!menuButtonVisible) setVisible(true);
70}, []);
71
72const onHideButtonMenu = useCallback(() => {
73setVisible(false);
74}, []);
75
76const onDoubleRowClick = () => setEditMode(!editMode);
77
78return (
79<>
80{!editMode && (
81<>
82<DefaultRow
83qRowsWithLessNesting={qRowsWithLessNesting}
84linesClassName={linesClassName}
85nestingLvl={nestingLvl}
86rowName={node.data.rowName}
87salary={node.data.salary}
88equipmentCosts={node.data.equipmentCosts}
89overheads={node.data.overheads}
90estimatedProfit={node.data.estimatedProfit}
91onDoubleRowClick={onDoubleRowClick}
92>
93<LvlButtonsTemplate
94idRow={node.data.id}
95nestingLvl={nestingLvl}
96editMode={editMode}
97menuButtonVisible={menuButtonVisible}
98onShowButtonMenu={onShowButtonMenu}
99onHideButtonMenu={onHideButtonMenu}
100onAddChildRow={onAddChildRow}
101onDeleteRow={onDeleteRow}
102/>
103</DefaultRow>
104</>
105)}
106{editMode && (
107<>
108<EditableRow
109qRowsWithLessNesting={qRowsWithLessNesting}
110linesClassName={linesClassName}
111nestingLvl={nestingLvl}
112node={node}
113onSendCreatedRow={onSendCreatedRow}
114onSendEditedRow={onSendEditedRow}
115>
116<LvlButtonsTemplate
117idRow={node.data.id}
118nestingLvl={nestingLvl}
119editMode={editMode}
120menuButtonVisible={menuButtonVisible}
121onShowButtonMenu={onShowButtonMenu}
122onHideButtonMenu={onHideButtonMenu}
123onAddChildRow={onAddChildRow}
124onDeleteRow={onDeleteRow}
125/>
126</EditableRow>
127</>
128)}
129</>
130);
131}
132