forked from CITKParus/P8-Panels
188 lines
7.5 KiB
JavaScript
188 lines
7.5 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга - ПУП - Экономика проектов
|
||
Дополнительная разметка и вёрстка клиентских элементов
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
import React from "react"; //Классы React
|
||
import { Icon, Stack, Link } from "@mui/material"; //Интерфейсные компоненты
|
||
import { formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Формирование значения для колонки "Состояние" этапа
|
||
const formatStageStatusValue = value => {
|
||
const [text, icon] =
|
||
value == 0
|
||
? ["Зарегистрирован", "app_registration"]
|
||
: value == 1
|
||
? ["Открыт", "lock_open"]
|
||
: value == 2
|
||
? ["Закрыт", "lock_outline"]
|
||
: value == 3
|
||
? ["Согласован", "thumb_up_alt"]
|
||
: value == 4
|
||
? ["Исполнение прекращено", "block"]
|
||
: ["Остановлен", "do_not_disturb_on"];
|
||
return (
|
||
<Stack direction="row" gap={0.5} alignItems="center">
|
||
<Icon title={text}>{icon}</Icon>
|
||
{text}
|
||
</Stack>
|
||
);
|
||
};
|
||
|
||
//Формирование значения для колонки "Состояние" работы
|
||
const formatJobStatusValue = (value, addText = false, justifyContent = null) => {
|
||
const [text, icon] =
|
||
value == 0
|
||
? ["Не начата", "not_started"]
|
||
: value == 1
|
||
? ["Выполняется", "loop"]
|
||
: value == 2
|
||
? ["Выполнена", "task_alt"]
|
||
: value == 3
|
||
? ["Остановлена", "do_not_disturb_on"]
|
||
: ["Отменена", "cancel"];
|
||
return (
|
||
<Stack direction="row" gap={0.5} alignItems="center" {...(justifyContent ? { justifyContent } : {})}>
|
||
<Icon title={text}>{icon}</Icon>
|
||
{addText == true ? text : null}
|
||
</Stack>
|
||
);
|
||
};
|
||
|
||
//Генерация кастомных представлений атрибутов задачи в редакторе
|
||
export const taskAttributeRenderer = ({ task, attribute }) => {
|
||
switch (attribute.name) {
|
||
case "type":
|
||
return task.type === 1 ? "Этап проекта" : "Работа проекта";
|
||
case "state":
|
||
return task.type === 1 ? formatStageStatusValue(task[attribute.name]) : formatJobStatusValue(task[attribute.name], true);
|
||
default:
|
||
return null;
|
||
}
|
||
};
|
||
|
||
//Форматирование значений колонок в таблице детализации трудоёмкости по графику
|
||
export const planJobsDtlValueFormatter = ({ value, columnDef }) => {
|
||
switch (columnDef.name) {
|
||
case "NJOB_STATE":
|
||
return formatJobStatusValue(value, false, "center");
|
||
case "DJOB_BEG":
|
||
case "DJOB_END":
|
||
return formatDateRF(value);
|
||
}
|
||
return value;
|
||
};
|
||
|
||
//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по графику
|
||
export const planJobsDtlHeadCellRender = ({ columnDef }) => {
|
||
switch (columnDef.name) {
|
||
case "NJOB_STATE":
|
||
return {
|
||
stackProps: { justifyContent: "center" },
|
||
cellProps: { align: "center" }
|
||
};
|
||
}
|
||
};
|
||
|
||
//Генерация представления ячейки c данными в таблице детализации трудоёмкости по графику
|
||
export const planJobsDtlDataCellRender = ({ row, columnDef, onProjectClick }) => {
|
||
switch (columnDef.name) {
|
||
case "SPRJ":
|
||
return {
|
||
data: row[columnDef.name] ? (
|
||
<Link
|
||
component="button"
|
||
variant="body2"
|
||
align="left"
|
||
underline="hover"
|
||
onClick={() => (onProjectClick ? onProjectClick({ sender: row }) : null)}
|
||
>
|
||
{row[columnDef.name]}
|
||
</Link>
|
||
) : (
|
||
row[columnDef.name]
|
||
)
|
||
};
|
||
}
|
||
};
|
||
|
||
//Форматирование значений колонок в таблице детализации трудоёмкости по отчетам
|
||
export const factRptDtlValueFormatter = ({ value, columnDef }) => {
|
||
switch (columnDef.name) {
|
||
case "NJOB_STATE":
|
||
return formatJobStatusValue(value, false, "center");
|
||
case "DJOB_BEG":
|
||
case "DJOB_END":
|
||
return formatDateRF(value);
|
||
}
|
||
return value;
|
||
};
|
||
|
||
//Генерация представления ячейки заголовка в таблице детализации трудоёмкости по отчетам
|
||
export const factRptDtlHeadCellRender = ({ columnDef }) => {
|
||
switch (columnDef.name) {
|
||
case "NJOB_STATE":
|
||
return {
|
||
stackProps: { justifyContent: "center" },
|
||
cellProps: { align: "center" }
|
||
};
|
||
}
|
||
};
|
||
|
||
//Генерация представления ячейки c данными в таблице периодов балансировки
|
||
export const periodsDataCellRender = ({ row, columnDef, onLabPlanFOTClick, onLabFactRptClick, onLabPlanJobsClick }) => {
|
||
switch (columnDef.name) {
|
||
case "NLAB_PLAN_FOT":
|
||
case "NLAB_FACT_RPT":
|
||
case "NLAB_PLAN_JOBS":
|
||
return {
|
||
data: row[columnDef.name] ? (
|
||
<Link
|
||
component="button"
|
||
variant="body2"
|
||
align="left"
|
||
underline="hover"
|
||
onClick={() =>
|
||
columnDef.name === "NLAB_PLAN_FOT"
|
||
? onLabPlanFOTClick
|
||
? onLabPlanFOTClick({ sender: row })
|
||
: null
|
||
: columnDef.name === "NLAB_FACT_RPT"
|
||
? onLabFactRptClick
|
||
? onLabFactRptClick({ sender: row })
|
||
: null
|
||
: columnDef.name === "NLAB_PLAN_JOBS"
|
||
? onLabPlanJobsClick
|
||
? onLabPlanJobsClick({ sender: row })
|
||
: null
|
||
: null
|
||
}
|
||
>
|
||
{row[columnDef.name]}
|
||
</Link>
|
||
) : (
|
||
row[columnDef.name]
|
||
)
|
||
};
|
||
case "NLAB_DIFF_RPT_FOT":
|
||
return { data: <div style={{ color: row[columnDef.name] <= 0 ? "green" : "red" }}>{row[columnDef.name]}</div> };
|
||
case "NLAB_DIFF_JOBS_FOT":
|
||
return {
|
||
data: (
|
||
<Stack direction="row" gap={0.5} alignItems="center" justifyContent="right">
|
||
<div style={{ color: row[columnDef.name] <= 0 ? "green" : "red" }}>{row[columnDef.name]}</div>
|
||
<Icon sx={{ color: row[columnDef.name] <= 0 ? "green" : "red" }}>{row[columnDef.name] <= 0 ? "done" : "error"}</Icon>
|
||
</Stack>
|
||
)
|
||
};
|
||
}
|
||
};
|