diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js index 696d436..f414caa 100644 --- a/app/panels/prj_jobs/prj_jobs.js +++ b/app/panels/prj_jobs/prj_jobs.js @@ -9,13 +9,34 @@ import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента -import { Drawer, Fab, Box, Grid, List, ListItemButton, ListItemText, ListItemIcon, Icon, Typography } from "@mui/material"; //Интерфейсные элементы +import { + Drawer, + Fab, + Box, + Grid, + List, + ListItemButton, + ListItemText, + ListItemIcon, + Icon, + Typography, + Divider, + ListItem, + Button, + Dialog, + DialogContent, + DialogActions, + TextField, + DialogTitle +} from "@mui/material"; //Интерфейсные элементы import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта +import { formatDateRF } from "../../core/utils"; //Вспомогательные функции +import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы import { ResMon } from "./res_mon"; //Монитор ресурсов import { taskAttributeRenderer } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов @@ -31,7 +52,6 @@ const GANTT_WIDTH = "98vw"; //Стили const STYLES = { - PROJECTS_LIST_SAVE_BUTTON: { backgroundColor: "orange" }, PROJECTS_LIST_ITEM_NOJOBS: { backgroundColor: "#ff000045" }, PROJECTS_LIST_ITEM_PRIMARY: { wordWrap: "break-word" }, PROJECTS_LIST_ITEM_SECONDARY: { wordWrap: "break-word", fontSize: "0.5rem", textTransform: "uppercase" }, @@ -46,10 +66,77 @@ const STYLES = { PERIODS_DRAWER: { width: "1200px", flexShrink: 0, [`& .MuiDrawer-paper`]: { width: "1200px", boxSizing: "border-box" } } }; +//Единицы измерения длительности +const DURATION_MEAS = { + 0: "День", + 1: "Неделя", + 2: "Декада", + 3: "Месяц", + 4: "Квартал", + 5: "Год" +}; + //------------------------------------ //Вспомогательные функции и компоненты //------------------------------------ +//Диалог параметров инициализации панели +const InitDialog = ({ dateBegin, dateFact, onOk, onCancel }) => { + //Собственное состояние - значения с-по + const [values, setValues] = useState({ dateBegin: formatDateJSONDateOnly(dateBegin), dateFact: formatDateJSONDateOnly(dateFact) }); + + //Отработка воода значения в фильтр + const handleValueTextFieldChanged = e => setValues(prev => ({ ...prev, [e.target.name]: e.target.value })); + + //Генерация содержимого + return ( + (onCancel ? onCancel() : null)} + > + Параметры инициализации + + + + + + + + + + ); +}; + +//Контроль свойств - Диалог параметров инициализации панели +InitDialog.propTypes = { + dateBegin: PropTypes.instanceOf(Date).isRequired, + dateFact: PropTypes.instanceOf(Date).isRequired, + onOk: PropTypes.func, + onCancel: PropTypes.func +}; + //Список проектов const ProjectsList = ({ projects = [], selectedProject, onClick } = {}) => { //Подключение к контексту сообщений @@ -132,7 +219,8 @@ const PrjJobs = () => { selectedProject: null, selectedProjectDocRn: null, selectedProjectGanttDef: {}, - selectedProjectTasks: [] + selectedProjectTasks: [], + showInitDialog: false }); //Подключение к контексту приложения @@ -216,8 +304,8 @@ const PrjJobs = () => { const data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.JB_INIT", args: { - DBEGIN: state.dateBegin ? new Date(state.dateBegin) : null, - DFACT: state.dateFact ? new Date(state.dateFact) : null, + DBEGIN: state.dateBegin ? state.dateBegin : null, + DFACT: state.dateFact ? state.dateFact : null, NDURATION_MEAS: state.durationMeas, SLAB_MEAS: state.labMeas, NIDENT: state.ident @@ -226,8 +314,9 @@ const PrjJobs = () => { setState(pv => ({ ...pv, init: true, - dateBegin: data.DBEGIN, - dateFact: data.DFACT, + reInit: false, + dateBegin: new Date(data.DBEGIN), + dateFact: new Date(data.DFACT), durationMeas: data.NDURATION_MEAS, labMeas: data.SLAB_MEAS, resourceStatus: data.NRESOURCE_STATUS, @@ -246,11 +335,10 @@ const PrjJobs = () => { if (state.selectedProject) loadProjectJobs(false); }, [state.selectedProject, loadProjectJobs]); - //При подключении компонента к странице + //При изменении флага инициализации useEffect(() => { initJobs(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + }, [state.init, initJobs]); //Выбор проекта const selectPoject = (project, projectDocRn) => { @@ -292,6 +380,16 @@ const PrjJobs = () => { if (isMain) modifyJob(task.rn, new Date(start), new Date(end), new Date(state.dateBegin), new Date(state.dateFact), state.durationMeas); }; + //Отработка нажатия на отображения диалога параметров инициализации панели + const handleShowInitDialogClick = () => setState(pv => ({ ...pv, showInitDialog: true })); + + //Отработка нажатия на "ОК" в диалоге параметров инициализации панели + const handleOKInitDialogClick = values => + setState(pv => ({ ...pv, dateBegin: values.dateBegin, dateFact: values.dateFact, showInitDialog: false, init: false })); + + //Отработка нажатия на "Отмена" в диалоге параметров инициализации панели + const handleCancelInitDialogClick = () => setState(pv => ({ ...pv, showInitDialog: false })); + //Обработка нажатия на сохранение данных в проект const handleSaveToProjectsClick = () => saveProjects(); @@ -304,6 +402,14 @@ const PrjJobs = () => { //Генерация содержимого return ( + {state.showInitDialog ? ( + + ) : null} setState(pv => ({ ...pv, showProjectsList: !pv.showProjectsList }))}> Проекты {state.needSave ? ( @@ -321,15 +427,50 @@ const PrjJobs = () => { > {state.projectsLoaded ? ( <> + + + + Начало: + {formatDateRF(state.dateBegin)} +
+ Факт на: + {formatDateRF(state.dateFact)} +
+ Длительность: + {DURATION_MEAS[state.durationMeas]} +
+ Трудоёмкость: + {state.labMeas} + + } + /> +
+ + + +
+ {state.needSave ? ( - - - - save - - - - + <> + + + + + + + ) : null}