diff --git a/app/panels/clnt_task_board/clnt_task_board.js b/app/panels/clnt_task_board/clnt_task_board.js index 4d4dbf8..1cf1d9e 100644 --- a/app/panels/clnt_task_board/clnt_task_board.js +++ b/app/panels/clnt_task_board/clnt_task_board.js @@ -17,7 +17,7 @@ import { FilterDialog } from "./components/filter_dialog"; //Компонент import { TaskCardSettings } from "./components/task_card_settings.js"; //Компонент настроек карточки события import { useTasks, COLORS } from "./hooks.js"; //Вспомогательные хуки import { APP_STYLES } from "../../../app.styles"; //Типовые стили -import { useNoteDialog } from "./components/note_dialog.js"; +import { NoteDialog } from "./components/note_dialog.js"; //Диалог примечания //--------- //Константы @@ -79,6 +79,7 @@ const ClntTaskBoard = () => { tasks, eventRoutes, eventPoints, + noteTypes, docLinks, accounts, taskFormOpen, @@ -97,7 +98,13 @@ const ClntTaskBoard = () => { ] = useTasks(); //Состояние диалога примечания - const [noteDialogRender, handleNoteDialogChange] = useNoteDialog(); + const [noteDialog, setNoteDialog] = useState({ visible: false, callback: null }); + + //Открытие диалога примечания + const handleNoteDialogOpen = f => setNoteDialog({ visible: true, callback: v => f(v) }); + + //Закрытие диалога примечания + const handleNoteDialogClose = () => setNoteDialog({ visible: false, callback: null }); //Состояние доступных маршрутов события const [availableRoutes, setAvailableRoutes] = useState({ sorce: "", routes: [] }); @@ -123,7 +130,6 @@ const ClntTaskBoard = () => { //Генерация содержимого return ( - {tasks.filters.isOpen ? ( { handleOrderChanged={handleOrderChanged} sx={STYLES.FILTER} /> - {noteDialogRender( - v => console.log(`Примечание: ${v}`), - () => console.log("Отмена") - )} + {noteDialog.visible ? noteDialog.callback(n)} onCancel={handleNoteDialogClose} /> : null} {tasks.filters.values.type ? ( { @@ -153,7 +156,7 @@ const ClntTaskBoard = () => { setAvailableRoutes({ sorce: srcCode, routes: [...eventRoutes.filter(r => r.src === srcCode)] }); }} onDragEnd={e => { - onDragEnd(e); + onDragEnd(e, eventPoints, handleNoteDialogOpen); clearARState(); }} > @@ -216,7 +219,9 @@ const ClntTaskBoard = () => { index={index} handleReload={handleReload} key={item.id} - extraHandle={handleNoteDialogChange} + eventPoints={eventPoints} + pointSettings={eventPoints.find(p => p.point === status.code)} + openNoteDialog={handleNoteDialogOpen} /> ))} {provided.placeholder} diff --git a/app/panels/clnt_task_board/components/filter_dialog.js b/app/panels/clnt_task_board/components/filter_dialog.js index 5ee65fc..4814990 100644 --- a/app/panels/clnt_task_board/components/filter_dialog.js +++ b/app/panels/clnt_task_board/components/filter_dialog.js @@ -116,21 +116,18 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { //Собственное состояние const [filter, setFilter] = useState({ ...initial }); + //Состояние текущего типа события const [curType, setCurType] = useState(initial.type); + //Состояние учётных документов const [curDocLinks, setCurDocLinks] = useState([...docs]); + //Состояние изменения типа события const [typeDif, setTypeDif] = useState(false); - //const [catalogs, setCatalogs] = useState(initial.wSubcatalogs ? initial.crn : initial.crn.split(";")[0]); - - //const [curDocLink, setCurDocLink] = useState(initial.docLink ? initial.docLink : ""); - //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); - //const promisedSetCrn = crn => new Promise(resolve => setFilter(pv => ({ ...pv, crn: crn }), resolve)); - //Получение субкаталогов const getSubCatalogs = useCallback(async () => { const data = await executeStored({ @@ -140,11 +137,7 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { NSUBCAT: filter.wSubcatalogs ? 1 : 0 } }); - //Заполняем субкаталоги - //setCatalogs(data.SRESULT); - //setFilter(pv => ({ ...pv, crn: data.SRESULT })); return data.SRESULT; - //await promisedSetCrn(data.SRESULT); }, [executeStored, filter.catalog, filter.wSubcatalogs]); //Подключение к контексту приложения @@ -177,13 +170,6 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { crns ? (filterCopy.crn = crns) : null; onOk(filterCopy); } else onOk(filter); - - // if (filter.catalog && filter.wSubcatalogs) { - // const crns = await getSubCatalogs(filter.crn); - // let filterCopy = { ...filter }; - // crns ? (filterCopy.crn = crns) : null; - // onOk(filterCopy); - // } else onOk(filter); } }; @@ -193,12 +179,6 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { //Очистка учётного документа const clearDocLink = () => setFilter(pv => ({ ...pv, docLink: "" })); - //Очистка галочки "Включая подкаталоги" - //const clearWSubcatalogs = () => setFilter(pv => ({ ...pv, wSubcatalogs: false })); - - //Очистка сотстояния подкаталогов - //const clearCatalogs = () => setCatalogs(""); - //При изменении типа события useEffect(() => { if (curType) { @@ -210,14 +190,6 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { } }, [curType, filter.type]); - //При очистке каталога - // useEffect(() => { - // if (!filter.catalog && filter.wSubcatalogs) { - // clearWSubcatalogs(); - // //clearCatalogs(); - // } - // }, [filter.catalog, filter.wSubcatalogs]); - //Обработка изменений с каталогами useEffect(() => { if (!filter.catalog && filter.wSubcatalogs) setFilter(pv => ({ ...pv, wSubcatalogs: false })); @@ -230,10 +202,6 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { setFilter(pv => ({ ...pv, crn: "" })); }, [filter.catalog, filter.crn, filter.wSubcatalogs, initial.catalog, initial.crn, initial.wSubcatalogs]); - // useEffect(() => { - // console.log(`State changed: ${filter.crn}`); - // }, [filter.crn]); - //Генерация содержимого return (
@@ -331,7 +299,6 @@ const FilterDialog = ({ initial, docs, onCancel, onOk, getDocLinks }) => { { setCurType(filter.type); diff --git a/app/panels/clnt_task_board/components/filter_input_field.js b/app/panels/clnt_task_board/components/filter_input_field.js index ac923d0..187aaf7 100644 --- a/app/panels/clnt_task_board/components/filter_input_field.js +++ b/app/panels/clnt_task_board/components/filter_input_field.js @@ -10,6 +10,7 @@ import React, { useEffect, useState } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { FormControl, InputLabel, Input, InputAdornment, IconButton, Icon, FormHelperText, Select, MenuItem } from "@mui/material"; //Интерфейсные компоненты +import { APP_STYLES } from "../../../../app.styles"; //Типовые стили //--------- //Константы @@ -17,7 +18,8 @@ import { FormControl, InputLabel, Input, InputAdornment, IconButton, Icon, FormH //Стили const STYLES = { - HELPER_TEXT: { color: "red" } + HELPER_TEXT: { color: "red" }, + SELECT_MENU: { overflowY: "auto", ...APP_STYLES.SCROLL } }; //--------------- @@ -80,6 +82,7 @@ const FilterInputField = ({ elementCode, elementValue, labelText, onChange, requ value={value} aria-describedby={`${elementCode}-helper-text`} label={labelText} + MenuProps={{ slotProps: { paper: { sx: STYLES.SELECT_MENU } } }} onChange={handleChange} {...other} > diff --git a/app/panels/clnt_task_board/components/note_dialog.js b/app/panels/clnt_task_board/components/note_dialog.js index ff0e60a..57f1ab6 100644 --- a/app/panels/clnt_task_board/components/note_dialog.js +++ b/app/panels/clnt_task_board/components/note_dialog.js @@ -7,14 +7,24 @@ //Подключение библиотек //--------------------- -import React, { useEffect, useState } from "react"; //Классы React -//import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером -//import PropTypes from "prop-types"; //Контроль свойств компонента -import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, TextField } from "@mui/material"; //Интерфейсные компоненты - -//--------- -//Константы -//--------- +import React, { useState } from "react"; //Классы React +import PropTypes from "prop-types"; //Контроль свойств компонента +import { + Dialog, + DialogTitle, + IconButton, + Icon, + DialogContent, + DialogActions, + Button, + TextField, + FormControl, + InputLabel, + Select, + MenuItem +} from "@mui/material"; //Интерфейсные компоненты +import { APP_STYLES } from "../../../../app.styles"; //Типовые стили +import { arrayFormer } from "../hooks"; //Формировщик массива //Стили const STYLES = { @@ -25,117 +35,105 @@ const STYLES = { top: 8, color: theme => theme.palette.grey[500] }, - DIALOG_CONTENT: { paddingTop: 0, paddingBottom: 0 } + DIALOG_CONTENT: { paddingTop: 0, paddingBottom: 0 }, + TEXT_FIELD: { + overflowY: "auto", + ...APP_STYLES.SCROLL + } }; -//----------------------- -//Вспомогательные функции -//----------------------- - -//export const NoteDialogCtx = createContext(); - //--------------- //Тело компонента //--------------- -//Диалоговое окно фильтра отбора -const useNoteDialog = () => { +const NoteDialog = ({ noteTypes, onOk, onCancel }) => { //Собственное состояние - const [note, setNote] = useState(); + const [note, setNote] = useState({ headerV: 0, text: "" }); - //Состояние отображения окна - const [noteDialogOpen, setNoteDialogOpen] = useState(false); + //При изменении примечания + const handleNoteChange = value => setNote(pv => ({ ...pv, text: value })); - useEffect(() => { - if (noteDialogOpen) console.log(`Сейчас: ${noteDialogOpen}`); - }, [noteDialogOpen]); - - const handleNoteDialogChange = (value = null) => (value ? setNoteDialogOpen(value) : setNoteDialogOpen(!noteDialogOpen)); - - const noteDialogRender = (onOk, onCancel) => { - //При изменении примечания - const handleNoteChange = value => setNote(value); - - //При закрытии диалога с изменением фильтра - const handleOK = () => { - setNoteDialogOpen(false); - onOk(note); - setNote(); - }; - - //При закрытии диалога без изменения фильтра - const handleCancel = () => { - setNoteDialogOpen(false); - setNote(); - onCancel(); - }; - - //Генерация содержимого - return ( -
- {noteDialogOpen ? ( - - Примечание - - close - - - handleNoteChange(e.target.value)} - /> - - - - - - - ) : null} -
- ); + //При изменении заголовка примечания + const handleNoteHeaderChange = h => { + setNote(pv => ({ ...pv, headerV: h })); }; - return [noteDialogRender, handleNoteDialogChange]; + //При закрытии диалога с изменением фильтра + const handleOK = () => { + //setNoteDialogOpen(false); + onOk({ header: noteTypes[note.headerV], text: note.text }); + onCancel(); + }; + + //При закрытии диалога без изменения фильтра + const handleCancel = () => { + onCancel(); + }; + + //Генерация содержимого + return ( + + Примечание + + close + + + + Заголовок примечания + + + handleNoteChange(e.target.value)} + /> + + + + + + + ); }; -// const NoteDialog = (onOk, onCancel) => { -// //const { noteDialogRender } = useContext(NoteDialogContext); -// const noteDialogRender = useNoteDialog()[1]; +//Контроль свойств - Диалоговое окно примечания +NoteDialog.propTypes = { + noteTypes: PropTypes.array, + onOk: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired +}; -// //const [noteDialog] = useState(); +//---------------- +//Интерфейс модуля +//---------------- -// // useEffect(() => { -// // setNoteDialog(noteDialogRender(onOk, onCancel)); -// // }, [noteDialogRender, onCancel, onOk]); - -// //const onCancel1 = () => console.log("Cancel"); - -// return noteDialogRender(onOk, onCancel); -// //const { Btn, handleChange } = useComp(); - -// //return ; -// }; - -// //Контроль свойств компонента - Диалоговое окно фильтра отбора -// NoteDialog.propTypes = { -// onOk: PropTypes.func, -// onCancel: PropTypes.func -// }; - -//-------------------- -//Интерфейс компонента -//-------------------- - -export { useNoteDialog }; +export { NoteDialog }; diff --git a/app/panels/clnt_task_board/components/task_card.js b/app/panels/clnt_task_board/components/task_card.js index 015c462..5b0cbf8 100644 --- a/app/panels/clnt_task_board/components/task_card.js +++ b/app/panels/clnt_task_board/components/task_card.js @@ -54,7 +54,9 @@ const DataCellCardActions = ({ handleMethodsMenuButtonClick, handleMethodsMenuClose, handleReload, - extraHandle = null + eventPoints, + pointSettings, + openNoteDialog }) => { return ( @@ -68,11 +70,15 @@ const DataCellCardActions = ({ { - //one().then(two).then(three) - action.method === "TASK_STATE_CHANGE" && extraHandle ? extraHandle() : null; - //Выполняем действие - action.func(taskRn, action.needReload ? handleReload : null); + onClick={() => { + if (openNoteDialog && action.method === "TASK_STATE_CHANGE") { + action.func(taskRn, action.needReload ? handleReload : null, eventPoints, openNoteDialog); + } else if (openNoteDialog && action.method === "TASK_SEND" && pointSettings.addNoteOnSend) { + openNoteDialog(n => action.func(taskRn, action.needReload ? handleReload : null, n)); + } else { + //Выполняем действие + action.func(taskRn, action.needReload ? handleReload : null); + } //Закрываем меню handleMethodsMenuClose(); }} @@ -95,7 +101,9 @@ DataCellCardActions.propTypes = { handleMethodsMenuButtonClick: PropTypes.func.isRequired, handleMethodsMenuClose: PropTypes.func.isRequired, handleReload: PropTypes.func, - extraHandle: PropTypes.func + eventPoints: PropTypes.array, + pointSettings: PropTypes.object, + openNoteDialog: PropTypes.func }; //----------- @@ -103,7 +111,7 @@ DataCellCardActions.propTypes = { //----------- //Карточка события -const TaskCard = ({ task, account, index, handleReload, extraHandle = null }) => { +const TaskCard = ({ task, account, index, handleReload, eventPoints, pointSettings, openNoteDialog }) => { //Собственное состояние const [taskCard, setTaskCard, cardActions, handleMethodsMenuButtonClick, handleMethodsMenuClose, menuItems] = useTaskCard(); @@ -135,7 +143,9 @@ const TaskCard = ({ task, account, index, handleReload, extraHandle = null }) => handleMethodsMenuButtonClick={handleMethodsMenuButtonClick} handleMethodsMenuClose={handleMethodsMenuClose} handleReload={handleReload} - extraHandle={extraHandle} + eventPoints={eventPoints} + pointSettings={pointSettings} + openNoteDialog={openNoteDialog} /> } /> @@ -157,6 +167,7 @@ const TaskCard = ({ task, account, index, handleReload, extraHandle = null }) => {taskCard.openEdit ? ( { setTaskCard(pv => ({ ...pv, openEdit: false })); }} @@ -172,7 +183,9 @@ TaskCard.propTypes = { account: PropTypes.object, index: PropTypes.number.isRequired, handleReload: PropTypes.func, - extraHandle: PropTypes.func + eventPoints: PropTypes.array, + pointSettings: PropTypes.object, + openNoteDialog: PropTypes.func }; //---------------- diff --git a/app/panels/clnt_task_board/components/task_form.js b/app/panels/clnt_task_board/components/task_form.js index 2e38a7a..f04f289 100644 --- a/app/panels/clnt_task_board/components/task_form.js +++ b/app/panels/clnt_task_board/components/task_form.js @@ -92,7 +92,15 @@ CustomTabPanel.propTypes = { }; //Вкладка основной информации -const MainEventInfoTab = ({ task, handleFieldEdit, handleClientClientsOpen, handleClientPersonOpen, handleCrnOpen, handleEventNextNumbGet }) => { +const MainEventInfoTab = ({ + task, + editable, + handleFieldEdit, + handleClientClientsOpen, + handleClientPersonOpen, + handleCrnOpen, + handleEventNextNumbGet +}) => { return ( @@ -159,7 +167,7 @@ const MainEventInfoTab = ({ task, handleFieldEdit, handleClientClientsOpen, hand value={task.sdescription} variant="standard" onChange={handleFieldEdit} - disabled={!task.stype} + disabled={!task.stype || !editable} required multiline minRows={7} @@ -197,6 +205,7 @@ const MainEventInfoTab = ({ task, handleFieldEdit, handleClientClientsOpen, hand //Контроль свойств - Вкладка основной информации MainEventInfoTab.propTypes = { task: PropTypes.object.isRequired, + editable: PropTypes.bool, handleFieldEdit: PropTypes.func.isRequired, handleClientClientsOpen: PropTypes.func.isRequired, handleClientPersonOpen: PropTypes.func.isRequired, @@ -332,7 +341,7 @@ ExecutorEventInfoTab.propTypes = { //----------- //Форма события -const TaskForm = ({ task, setTask, handleClientClientsOpen, handleClientPersonOpen, handleCrnOpen, handleEventNextNumbGet }) => { +const TaskForm = ({ task, setTask, editable, handleClientClientsOpen, handleClientPersonOpen, handleCrnOpen, handleEventNextNumbGet }) => { //Состояние вкладки const [value, setValue] = useState(0); @@ -365,6 +374,7 @@ const TaskForm = ({ task, setTask, handleClientClientsOpen, handleClientPersonOp { +const TaskFormDialog = ({ taskRn, taskType, taskStatus, editable, onClose }) => { //Собственное состояние const [task, setTask, insertEvent, updateEvent, handleClientClientsOpen, handleClientPersonOpen, handleCrnOpen, handleEventNextNumbGet] = useClientEvent(taskRn, taskType, taskStatus); @@ -401,6 +412,7 @@ const TaskFormDialog = ({ taskRn, taskType, taskStatus, onClose }) => { { {onClose ? ( {taskRn ? ( - ) : ( @@ -430,6 +442,7 @@ TaskFormDialog.propTypes = { taskRn: PropTypes.number, taskType: PropTypes.string, taskStatus: PropTypes.string, + editable: PropTypes.bool, onClose: PropTypes.func.isRequired }; diff --git a/app/panels/clnt_task_board/hooks.js b/app/panels/clnt_task_board/hooks.js index d507a53..93e2ba7 100644 --- a/app/panels/clnt_task_board/hooks.js +++ b/app/panels/clnt_task_board/hooks.js @@ -45,6 +45,7 @@ const randomColor = index => { return hslToRgba(hue, 50, 70); }; +//Цвет из hsl формата в rgba формат const hslToRgba = (h, s, l) => { s /= 100; l /= 100; @@ -54,38 +55,10 @@ const hslToRgba = (h, s, l) => { return `rgba(${Math.floor(255 * f(0))},${Math.floor(255 * f(8))},${Math.floor(255 * f(4))},0.3)`; }; -//Формирование случайного цвета rgba -// const randomColorRgba = index => { -// const s = [255, 204, 153, 102, 51, 0]; -// function rValue() { -// return s[Math.floor(Math.random() * s.length)]; -// } -// let t = 3; -// let rgb = [0, 0, 0]; -// function howMuchToLearnJS(x) { -// if (t === 0) return; -// rgb[3 - t] = x % 6; -// t--; -// howMuchToLearnJS(Math.floor(x / 6)); -// } - -// //let r = rValue(); -// //let g = rValue(); -// //let b = rValue(); -// let r, g, b; -// howMuchToLearnJS(index); -// //while ((r === 0 && g === 0 && b === 0) || b === 255) b = rValue(); -// return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ",0.2)"; -// }; - -// const ColorContext = createContext("green"); - -// export const MyColorContextProvider = () => { -// ColorContext = "blue"; -// //const [color] = useState(); - -// return {value => }; -// }; +//Формирование массива из 0, 1 и 1< элементов +export const arrayFormer = arr => { + return arr ? (arr.length ? arr : [arr]) : []; +}; //----------- //Тело модуля @@ -105,8 +78,8 @@ const useTasks = () => { //Состояние точек маршрута события const [eventPoints, setEventPoints] = useState([]); - //Подключение к контексту диалога примечания - //const {noteDialog, setNoteDialog} = useContext(NoteDialogContext); + //Состояние типов заголовков событий + const [noteTypes, setNoteTypes] = useState([]); //Состояние учётных документов const [docLinks, setDocLinks] = useState([]); @@ -320,7 +293,7 @@ const useTasks = () => { //Изменение статуса события (переносом) const handleStateChange = useCallback( - async (nEvent, sNextStat) => { + async (nEvent, sNextStat, note = null) => { try { //Выполняем инициализацию параметров const firstStep = await executeStored({ @@ -355,6 +328,7 @@ const useTasks = () => { args: { NIDENT: firstStep.NIDENT, NSTEP: 3, + NEVENT: nEvent, SEVENT_STAT: firstStep.SEVENT_STAT, SSEND_CLIENT: send.outParameters.out_CLIENT_CODE, SSEND_DIVISION: send.outParameters.out_DIVISION_CODE, @@ -365,7 +339,9 @@ const useTasks = () => { SSEND_USER_GROUP: send.outParameters.out_USER_GROUP_CODE, SSEND_USER_NAME: send.outParameters.out_USER_NAME, NSEND_PREDEFINED_EXEC: send.outParameters.out_PREDEFINED_EXEC, - NSEND_PREDEFINED_PROC: send.outParameters.out_PREDEFINED_PROC + NSEND_PREDEFINED_PROC: send.outParameters.out_PREDEFINED_PROC, + SNOTE_HEADER: note.text ? note.header : null, + SNOTE: note.text ? note.text : null } }); //Необходимо обновить данные @@ -379,7 +355,10 @@ const useTasks = () => { args: { NIDENT: firstStep.NIDENT, NSTEP: 3, - SEVENT_STAT: firstStep.SEVENT_STAT + NEVENT: nEvent, + SEVENT_STAT: firstStep.SEVENT_STAT, + SNOTE_HEADER: note.header ? note.header : null, + SNOTE: note.text ? note.text : null } }); //Необходимо обновить данные @@ -401,7 +380,7 @@ const useTasks = () => { //Взаимодействие с событием (через перенос) const onDragEnd = useCallback( - result => { + (result, eventPoints, openNoteDialog) => { //Определяем нужные параметры const { source, destination } = result; //Если путь не указан @@ -421,10 +400,24 @@ const useTasks = () => { } : task ); - //Переинициализируем строки с учетом изменений (для визуального отображения) - setTasks(pv => ({ ...pv, rows: [...rows] })); + //Мнемокод точки назначения + const destCode = tasks.statuses.find(s => s.id == destination.droppableId).code; + //Получение настройки точки назначения + const pointSettings = eventPoints.find(ep => ep.point === destCode); + //Если необходимо примечание при переходе + if (pointSettings.addNoteOnChst) { + //Изменяем статус события с добавлением примечания + openNoteDialog(n => { + setTasks(pv => ({ ...pv, rows: [...rows] })); + handleStateChange(row.nrn, destCode, n); + }); + } //Изменяем статус события - handleStateChange(row.nrn, tasks.statuses.find(s => s.id == destination.droppableId).code); + else { + //Переинициализируем строки с учетом изменений (для визуального отображения) + setTasks(pv => ({ ...pv, rows: [...rows] })); + handleStateChange(row.nrn, tasks.statuses.find(s => s.id == destination.droppableId).code); + } } }, [handleStateChange, tasks.rows, tasks.statuses] @@ -444,7 +437,7 @@ const useTasks = () => { let newDocLinks = []; //Если найдены учётные документы if (data.XDOCLINKS) { - data.XDOCLINKS.map(d => { + arrayFormer(data.XDOCLINKS).map(d => { newDocLinks.push({ id: d.NRN, descr: d.SDESCR }); }); } @@ -469,23 +462,29 @@ const useTasks = () => { let newRoutes = []; //Если найдены маршруты if (data.XEVROUTES) { - data.XEVROUTES.map(r => { + arrayFormer(data.XEVROUTES).map(r => { newRoutes.push({ src: r.SSOURCE, dest: r.SDESTINATION }); }); } //Инициализируем точки событий let newPoints = []; if (data.XEVPOINTS) { - data.XEVPOINTS.map(p => { + arrayFormer(data.XEVPOINTS).map(p => { newPoints.push({ point: p.SEVPOINT, addNoteOnChst: p.ADDNOTE_ONCHST, addNoteOnSend: p.ADDNOTE_ONSEND, banUpdate: p.BAN_UPDATE }); }); } + //Инициализируем типы заголовков примечаний + let newNoteTypes = []; + if (data.XNOTETYPES) { + arrayFormer(data.XNOTETYPES).map(nt => { + newNoteTypes.push(nt.SNAME); + }); + } //Инициализируем пользователей let newAccounts = []; //Если найдены пользователи if (data.XACCOUNTS) { - data.XACCOUNTS.map(a => { - //console.log(a.SEVRN_LIST.toString().includes(";")); + arrayFormer(data.XACCOUNTS).map(a => { newAccounts.push({ agnAbbr: a.SAGNABBR, image: a.BIMAGE, @@ -497,6 +496,8 @@ const useTasks = () => { setEventRoutes([...newRoutes]); //Указываем сформированные точки маршрута setEventPoints([...newPoints]); + //Указываем типы заголовков примечаний + setNoteTypes([...newNoteTypes]); //Указываем сформированные аккаунты setAccounts([...newAccounts]); }; @@ -527,13 +528,13 @@ const useTasks = () => { //Если статусы есть if (data.XGROUPS) { //Формируем структуру статусов - data.XGROUPS.map((group, i) => { + arrayFormer(data.XGROUPS).map((group, i) => { newGroups.push({ id: i, code: group.name, caption: group.caption, color: randomColor(i + 1) }); }); //Если есть события if (data.XROWS) { //Формируем структуру событий - data.XROWS.map((task, i) => { + arrayFormer(data.XROWS).map((task, i) => { newRows.push(initTask(i, newGroups.find(x => x.caption === task.groupName).id, task)); }); } @@ -569,6 +570,7 @@ const useTasks = () => { tasks, eventRoutes, eventPoints, + noteTypes, docLinks, accounts, taskFormOpen, @@ -644,57 +646,6 @@ const useClientEvent = (taskRn, taskType = "", taskStatus = "") => { } }, [task.sprefix, task.stype, executeStored]); - //Отображение раздела "Типы событий" - // const handleTypeOpen = useCallback(async () => { - // pOnlineShowDictionary({ - // unitCode: "ClientEventTypes", - // showMethod: "main", - // inputParameters: [{ name: "in_EVNTYPE_NAME", value: task.stype }], - // callBack: async res => { - // if (res.success) { - // //Считываем параметры исходя из типа события - // const data = await executeStored({ - // stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVNTYPES_INIT", - // args: { - // SEVENT_TYPE: res.outParameters.out_EVNTYPE_CODE, - // SCURRENT_PREF: task.sprefix - // }, - // tagValueProcessor: () => undefined - // }); - // if (data) { - // setTask(pv => ({ - // ...pv, - // stype: res.outParameters.out_EVNTYPE_CODE, - // sprefix: data.SPREF, - // snumber: data.SNUMB, - // sstatus: data.SDEFAULT_STATUS - // })); - // } - // } - // } - // }); - // }, [executeStored, pOnlineShowDictionary, task.sprefix, task.stype]); - - //Отображение раздела "Статусы типового события" - // const handleStatusOpen = useCallback(async () => { - // pOnlineShowDictionary({ - // unitCode: "ClientEventTypesStates", - // showMethod: "main", - // inputParameters: [ - // { name: "in_SEVNTYPE_CODE", value: task.stype }, - // { name: "in_EVENT_STATUS_EVNSTAT_CODE", value: task.sstatus } - // ], - // callBack: res => { - // res.success - // ? setTask(pv => ({ - // ...pv, - // sstatus: res.outParameters.out_EVENT_STATUS_EVNSTAT_CODE - // })) - // : null; - // } - // }); - // }, [pOnlineShowDictionary, task.sstatus, task.stype]); - //Отображение раздела "Клиенты" const handleClientClientsOpen = useCallback(async () => { pOnlineShowDictionary({ @@ -918,18 +869,7 @@ const useClientEvent = (taskRn, taskType = "", taskStatus = "") => { })); }, [task.scrn, task.sdescription, task.sinit_clnperson, task.sinit_user, task.snumber, task.sprefix, task.sstatus, task.stype]); - return [ - task, - setTask, - insertEvent, - updateEvent, - //handleTypeOpen, - //handleStatusOpen, - handleClientClientsOpen, - handleClientPersonOpen, - handleCrnOpen, - getEventNextNumb - ]; + return [task, setTask, insertEvent, updateEvent, handleClientClientsOpen, handleClientPersonOpen, handleCrnOpen, getEventNextNumb]; }; //Карточка события @@ -1052,7 +992,7 @@ const useTaskCard = () => { //По нажатию действия "Перейти" const handleStateChange = useCallback( - async (nEvent, handleReload) => { + async (nEvent, handleReload, evPoints, handleNote) => { //Выполняем инициализацию параметров const firstStep = await executeStored({ stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", @@ -1081,6 +1021,7 @@ const useTaskCard = () => { NPASS: point.outParameters.out_RN } }); + const pointSettings = evPoints.find(ep => ep.point === point.outParameters.out_NEXT_POINT); if (secondStep) { //Если требуется выбрать получателя if (secondStep.NSELECT_EXEC === 1) { @@ -1099,43 +1040,79 @@ const useTaskCard = () => { { name: "in_CLIENT_PERSON", value: firstStep.SCLIENT_PERSON } ], callBack: async send => { + //Общие аргументы + const mainArgs = { + NIDENT: firstStep.NIDENT, + NSTEP: 3, + NEVENT: nEvent, + SEVENT_STAT: point.outParameters.out_NEXT_POINT, + SSEND_CLIENT: send.outParameters.out_CLIENT_CODE, + SSEND_DIVISION: send.outParameters.out_DIVISION_CODE, + SSEND_POST: send.outParameters.out_POST_CODE, + SSEND_PERFORM: send.outParameters.out_POST_IN_DIV_CODE, + SSEND_PERSON: send.outParameters.out_PERSON_CODE, + SSEND_STAFFGRP: send.outParameters.out_STAFFGRP_CODE, + SSEND_USER_GROUP: send.outParameters.out_USER_GROUP_CODE, + SSEND_USER_NAME: send.outParameters.out_USER_NAME, + NSEND_PREDEFINED_EXEC: send.outParameters.out_PREDEFINED_EXEC, + NSEND_PREDEFINED_PROC: send.outParameters.out_PREDEFINED_PROC + }; //Выполняем переход к выбранной точке с исполнителем - await executeStored({ - stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", - args: { - NIDENT: firstStep.NIDENT, - NSTEP: 3, - SEVENT_STAT: point.outParameters.out_NEXT_POINT, - SSEND_CLIENT: send.outParameters.out_CLIENT_CODE, - SSEND_DIVISION: send.outParameters.out_DIVISION_CODE, - SSEND_POST: send.outParameters.out_POST_CODE, - SSEND_PERFORM: send.outParameters.out_POST_IN_DIV_CODE, - SSEND_PERSON: send.outParameters.out_PERSON_CODE, - SSEND_STAFFGRP: send.outParameters.out_STAFFGRP_CODE, - SSEND_USER_GROUP: send.outParameters.out_USER_GROUP_CODE, - SSEND_USER_NAME: send.outParameters.out_USER_NAME, - NSEND_PREDEFINED_EXEC: send.outParameters.out_PREDEFINED_EXEC, - NSEND_PREDEFINED_PROC: send.outParameters.out_PREDEFINED_PROC - } - }); + pointSettings.addNoteOnChst + ? handleNote(async n => { + //Если требуется примечание + await executeStored({ + stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", + args: { + ...mainArgs, + ...{ SNOTE_HEADER: n.header ? n.header : null, SNOTE: n.text ? n.text : null } + } + }); + //Если требуется перезагрузить данные + if (handleReload) { + handleReload(); + } + }) + : await executeStored({ + stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", + args: mainArgs + }); //Если требуется перезагрузить данные - if (handleReload) { + if (handleReload && !pointSettings.addNoteOnChst) { handleReload(); } } }); } else { + //Общие аргументы + const mainArgs = { + NIDENT: firstStep.NIDENT, + NSTEP: 3, + NEVENT: nEvent, + SEVENT_STAT: point.outParameters.out_NEXT_POINT + }; //Выполняем переход к выбранной точке с предопределенным исполнителем - await executeStored({ - stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", - args: { - NIDENT: firstStep.NIDENT, - NSTEP: 3, - SEVENT_STAT: point.outParameters.out_NEXT_POINT - } - }); + pointSettings.addNoteOnChst + ? handleNote(async n => { + //Если требуется примечание + await executeStored({ + stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", + args: { + ...mainArgs, + ...{ SNOTE_HEADER: n.header ? n.header : null, SNOTE: n.text ? n.text : null } + } + }); + //Если требуется перезагрузить данные + if (handleReload) { + handleReload(); + } + }) + : await executeStored({ + stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_STATE_CHANGE", + args: mainArgs + }); //Если требуется перезагрузить данные - if (handleReload) { + if (handleReload && !pointSettings.addNoteOnChst) { handleReload(); } } @@ -1150,7 +1127,7 @@ const useTaskCard = () => { //Изменение статуса события const handleSend = useCallback( - async (nEvent, handleReload) => { + async (nEvent, handleReload, note = null) => { //Выполняем инициализацию параметров const firstStep = await executeStored({ stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_SEND", @@ -1183,6 +1160,7 @@ const useTaskCard = () => { args: { NIDENT: firstStep.NIDENT, NSTEP: 2, + NEVENT: nEvent, SSEND_CLIENT: send.outParameters.out_CLIENT_CODE, SSEND_DIVISION: send.outParameters.out_DIVISION_CODE, SSEND_POST: send.outParameters.out_POST_CODE, @@ -1192,7 +1170,9 @@ const useTaskCard = () => { SSEND_USER_GROUP: send.outParameters.out_USER_GROUP_CODE, SSEND_USER_NAME: send.outParameters.out_USER_NAME, NSEND_PREDEFINED_EXEC: send.outParameters.out_PREDEFINED_EXEC, - NSEND_PREDEFINED_PROC: send.outParameters.out_PREDEFINED_PROC + NSEND_PREDEFINED_PROC: send.outParameters.out_PREDEFINED_PROC, + SNOTE_HEADER: note.text ? note.header : null, + SNOTE: note.text ? note.text : null } }); //Если требуется перезагрузить данные