ЦИТК-878. Отработка примечания от 11.11.24 Часть 1

This commit is contained in:
Vladislav 2024-11-21 14:46:51 +03:00
parent c0b905fe18
commit 434504dda3
5 changed files with 205 additions and 12 deletions

View File

@ -17,6 +17,7 @@ import { FilterDialog } from "./components/filter_dialog"; //Компонент
import { TaskCardSettings } from "./components/task_card_settings.js"; //Компонент настроек карточки события import { TaskCardSettings } from "./components/task_card_settings.js"; //Компонент настроек карточки события
import { useTasks, COLORS } from "./hooks.js"; //Вспомогательные хуки import { useTasks, COLORS } from "./hooks.js"; //Вспомогательные хуки
import { APP_STYLES } from "../../../app.styles"; //Типовые стили import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { useNoteDialog } from "./components/note_dialog.js";
//--------- //---------
//Константы //Константы
@ -77,6 +78,7 @@ const ClntTaskBoard = () => {
const [ const [
tasks, tasks,
eventRoutes, eventRoutes,
eventPoints,
docLinks, docLinks,
accounts, accounts,
taskFormOpen, taskFormOpen,
@ -94,6 +96,9 @@ const ClntTaskBoard = () => {
getDocLinks getDocLinks
] = useTasks(); ] = useTasks();
//Состояние диалога примечания
const [noteDialogRender, handleNoteDialogChange] = useNoteDialog();
//Состояние доступных маршрутов события //Состояние доступных маршрутов события
const [availableRoutes, setAvailableRoutes] = useState({ sorce: "", routes: [] }); const [availableRoutes, setAvailableRoutes] = useState({ sorce: "", routes: [] });
@ -118,6 +123,7 @@ const ClntTaskBoard = () => {
//Генерация содержимого //Генерация содержимого
return ( return (
<Box sx={STYLES.CONTAINER}> <Box sx={STYLES.CONTAINER}>
<Button onClick={() => handleNoteDialogChange(true)}>Жми</Button>
{tasks.filters.isOpen ? ( {tasks.filters.isOpen ? (
<FilterDialog <FilterDialog
initial={tasks.filters.values} initial={tasks.filters.values}
@ -136,6 +142,10 @@ const ClntTaskBoard = () => {
handleOrderChanged={handleOrderChanged} handleOrderChanged={handleOrderChanged}
sx={STYLES.FILTER} sx={STYLES.FILTER}
/> />
{noteDialogRender(
v => console.log(`Примечание: ${v}`),
() => console.log("Отмена")
)}
{tasks.filters.values.type ? ( {tasks.filters.values.type ? (
<DragDropContext <DragDropContext
onDragStart={e => { onDragStart={e => {
@ -206,6 +216,7 @@ const ClntTaskBoard = () => {
index={index} index={index}
handleReload={handleReload} handleReload={handleReload}
key={item.id} key={item.id}
extraHandle={handleNoteDialogChange}
/> />
))} ))}
{provided.placeholder} {provided.placeholder}

View File

@ -60,8 +60,9 @@ const STYLES = {
const selectEventType = (value, showDictionary, callBack) => { const selectEventType = (value, showDictionary, callBack) => {
showDictionary({ showDictionary({
unitCode: "ClientEventTypes", unitCode: "ClientEventTypes",
inputParameters: [{ name: "in_EVNTYPE_CODE", value: value }], showMethod: "dictionary",
callBack: res => (res.success === true ? callBack(res.outParameters.out_EVNTYPE_CODE) : callBack(null)) inputParameters: [{ name: "pos_eventtypecode", value: value }],
callBack: res => (res.success === true ? callBack(res.outParameters.eventtypecode) : callBack(null))
}); });
}; };
@ -77,12 +78,13 @@ const selectCatalog = (value, showDictionary, callBack) => {
}); });
}; };
//Выбор производственного объекта //Выбор исполнителя
const selectSendPerson = (value, showDictionary, callBack) => { const selectSendPerson = (value, showDictionary, callBack) => {
showDictionary({ showDictionary({
unitCode: "AGNLIST", unitCode: "AGNLIST",
inputParameters: [{ name: "in_AGNABBR", value: value }], showMethod: "agents",
callBack: res => (res.success === true ? callBack(res.outParameters.out_AGNABBR) : callBack(null)) inputParameters: [{ name: "pos_agnmnemo", value: value }],
callBack: res => (res.success === true ? callBack(res.outParameters.agnmnemo) : callBack(null))
}); });
}; };
@ -99,6 +101,7 @@ const selectSendDivision = (value, showDictionary, callBack) => {
const selectSendUsrGrp = (value, showDictionary, callBack) => { const selectSendUsrGrp = (value, showDictionary, callBack) => {
showDictionary({ showDictionary({
unitCode: "CostStaffGroups", unitCode: "CostStaffGroups",
//showMethod: "dictionary",
inputParameters: [{ name: "in_CODE", value: value }], inputParameters: [{ name: "in_CODE", value: value }],
callBack: res => (res.success === true ? callBack(res.outParameters.out_CODE) : callBack(null)) callBack: res => (res.success === true ? callBack(res.outParameters.out_CODE) : callBack(null))
}); });

View File

@ -0,0 +1,141 @@
/*
Парус 8 - Панели мониторинга - УДП - Доски задач
Компонент: Диалоговое окно примечания
*/
//---------------------
//Подключение библиотек
//---------------------
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"; //Интерфейсные компоненты
//---------
//Константы
//---------
//Стили
const STYLES = {
DIALOG_ACTIONS: { justifyContent: "end", paddingRight: "24px", paddingLeft: "24px" },
CLOSE_BUTTON: {
position: "absolute",
right: 8,
top: 8,
color: theme => theme.palette.grey[500]
},
DIALOG_CONTENT: { paddingTop: 0, paddingBottom: 0 }
};
//-----------------------
//Вспомогательные функции
//-----------------------
//export const NoteDialogCtx = createContext();
//---------------
//Тело компонента
//---------------
//Диалоговое окно фильтра отбора
const useNoteDialog = () => {
//Собственное состояние
const [note, setNote] = useState();
//Состояние отображения окна
const [noteDialogOpen, setNoteDialogOpen] = useState(false);
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 (
<div>
{noteDialogOpen ? (
<Dialog open onClose={handleCancel} fullWidth maxWidth="sm">
<DialogTitle>Примечание</DialogTitle>
<IconButton aria-label="close" onClick={handleCancel} sx={STYLES.CLOSE_BUTTON}>
<Icon>close</Icon>
</IconButton>
<DialogContent sx={STYLES.DIALOG_CONTENT}>
<TextField
id="note"
label="Примечание"
variant="standard"
fullWidth
required
multiline
minRows={7}
maxRows={7}
value={note}
onChange={e => handleNoteChange(e.target.value)}
/>
</DialogContent>
<DialogActions sx={STYLES.DIALOG_ACTIONS}>
<Button disabled={!note} variant="text" onClick={handleOK}>
ОК
</Button>
<Button variant="text" onClick={handleCancel}>
Отмена
</Button>
</DialogActions>
</Dialog>
) : null}
</div>
);
};
return [noteDialogRender, handleNoteDialogChange];
};
// const NoteDialog = (onOk, onCancel) => {
// //const { noteDialogRender } = useContext(NoteDialogContext);
// const noteDialogRender = useNoteDialog()[1];
// //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 <Btn onOk={onOk} />;
// };
// //Контроль свойств компонента - Диалоговое окно фильтра отбора
// NoteDialog.propTypes = {
// onOk: PropTypes.func,
// onCancel: PropTypes.func
// };
//--------------------
//Интерфейс компонента
//--------------------
export { useNoteDialog };

View File

@ -47,7 +47,15 @@ const STYLES = {
//------------------------------------ //------------------------------------
//Действия карточки события //Действия карточки события
const DataCellCardActions = ({ taskRn, menuItems, cardActions, handleMethodsMenuButtonClick, handleMethodsMenuClose, handleReload }) => { const DataCellCardActions = ({
taskRn,
menuItems,
cardActions,
handleMethodsMenuButtonClick,
handleMethodsMenuClose,
handleReload,
extraHandle = null
}) => {
return ( return (
<Box sx={STYLES.BOX_ROW}> <Box sx={STYLES.BOX_ROW}>
<IconButton id={`${taskRn}_menu_button`} aria-haspopup="true" onClick={handleMethodsMenuButtonClick}> <IconButton id={`${taskRn}_menu_button`} aria-haspopup="true" onClick={handleMethodsMenuButtonClick}>
@ -60,7 +68,9 @@ const DataCellCardActions = ({ taskRn, menuItems, cardActions, handleMethodsMenu
<MenuItem <MenuItem
sx={action.delimiter ? STYLES.MENU_ITEM_DELIMITER : {}} sx={action.delimiter ? STYLES.MENU_ITEM_DELIMITER : {}}
key={`${taskRn}_${action.method}`} key={`${taskRn}_${action.method}`}
onClick={() => { onClick={async () => {
//one().then(two).then(three)
action.method === "TASK_STATE_CHANGE" && extraHandle ? extraHandle() : null;
//Выполняем действие //Выполняем действие
action.func(taskRn, action.needReload ? handleReload : null); action.func(taskRn, action.needReload ? handleReload : null);
//Закрываем меню //Закрываем меню
@ -84,7 +94,8 @@ DataCellCardActions.propTypes = {
cardActions: PropTypes.object.isRequired, cardActions: PropTypes.object.isRequired,
handleMethodsMenuButtonClick: PropTypes.func.isRequired, handleMethodsMenuButtonClick: PropTypes.func.isRequired,
handleMethodsMenuClose: PropTypes.func.isRequired, handleMethodsMenuClose: PropTypes.func.isRequired,
handleReload: PropTypes.func handleReload: PropTypes.func,
extraHandle: PropTypes.func
}; };
//----------- //-----------
@ -92,7 +103,7 @@ DataCellCardActions.propTypes = {
//----------- //-----------
//Карточка события //Карточка события
const TaskCard = ({ task, account, index, handleReload }) => { const TaskCard = ({ task, account, index, handleReload, extraHandle = null }) => {
//Собственное состояние //Собственное состояние
const [taskCard, setTaskCard, cardActions, handleMethodsMenuButtonClick, handleMethodsMenuClose, menuItems] = useTaskCard(); const [taskCard, setTaskCard, cardActions, handleMethodsMenuButtonClick, handleMethodsMenuClose, menuItems] = useTaskCard();
@ -124,6 +135,7 @@ const TaskCard = ({ task, account, index, handleReload }) => {
handleMethodsMenuButtonClick={handleMethodsMenuButtonClick} handleMethodsMenuButtonClick={handleMethodsMenuButtonClick}
handleMethodsMenuClose={handleMethodsMenuClose} handleMethodsMenuClose={handleMethodsMenuClose}
handleReload={handleReload} handleReload={handleReload}
extraHandle={extraHandle}
/> />
} }
/> />
@ -159,7 +171,8 @@ TaskCard.propTypes = {
task: PropTypes.object.isRequired, task: PropTypes.object.isRequired,
account: PropTypes.object, account: PropTypes.object,
index: PropTypes.number.isRequired, index: PropTypes.number.isRequired,
handleReload: PropTypes.func handleReload: PropTypes.func,
extraHandle: PropTypes.func
}; };
//---------------- //----------------

View File

@ -78,6 +78,15 @@ const hslToRgba = (h, s, l) => {
// return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ",0.2)"; // return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ",0.2)";
// }; // };
// const ColorContext = createContext("green");
// export const MyColorContextProvider = () => {
// ColorContext = "blue";
// //const [color] = useState();
// return <ColorContext.Consumer>{value => <button>{value}</button>}</ColorContext.Consumer>;
// };
//----------- //-----------
//Тело модуля //Тело модуля
//----------- //-----------
@ -93,6 +102,12 @@ const useTasks = () => {
//Состояние маршрута события //Состояние маршрута события
const [eventRoutes, setEventRoutes] = useState([]); const [eventRoutes, setEventRoutes] = useState([]);
//Состояние точек маршрута события
const [eventPoints, setEventPoints] = useState([]);
//Подключение к контексту диалога примечания
//const {noteDialog, setNoteDialog} = useContext(NoteDialogContext);
//Состояние учётных документов //Состояние учётных документов
const [docLinks, setDocLinks] = useState([]); const [docLinks, setDocLinks] = useState([]);
@ -458,6 +473,13 @@ const useTasks = () => {
newRoutes.push({ src: r.SSOURCE, dest: r.SDESTINATION }); newRoutes.push({ src: r.SSOURCE, dest: r.SDESTINATION });
}); });
} }
//Инициализируем точки событий
let newPoints = [];
if (data.XEVPOINTS) {
data.XEVPOINTS.map(p => {
newPoints.push({ point: p.SEVPOINT, addNoteOnChst: p.ADDNOTE_ONCHST, addNoteOnSend: p.ADDNOTE_ONSEND, banUpdate: p.BAN_UPDATE });
});
}
//Инициализируем пользователей //Инициализируем пользователей
let newAccounts = []; let newAccounts = [];
//Если найдены пользователи //Если найдены пользователи
@ -473,6 +495,8 @@ const useTasks = () => {
} }
//Указываем сформированные маршруты //Указываем сформированные маршруты
setEventRoutes([...newRoutes]); setEventRoutes([...newRoutes]);
//Указываем сформированные точки маршрута
setEventPoints([...newPoints]);
//Указываем сформированные аккаунты //Указываем сформированные аккаунты
setAccounts([...newAccounts]); setAccounts([...newAccounts]);
}; };
@ -544,6 +568,7 @@ const useTasks = () => {
return [ return [
tasks, tasks,
eventRoutes, eventRoutes,
eventPoints,
docLinks, docLinks,
accounts, accounts,
taskFormOpen, taskFormOpen,
@ -981,8 +1006,7 @@ const useTaskCard = () => {
if (data.NIDENT) { if (data.NIDENT) {
pOnlineShowDictionary({ pOnlineShowDictionary({
unitCode: "ClientEvents", unitCode: "ClientEvents",
showMethod: "main", inputParameters: [{ name: "in_Ident", value: data.NIDENT }]
inputParameters: [{ name: "in_IDENT", value: data.NIDENT }]
}); });
} }
}, },
@ -1120,6 +1144,7 @@ const useTaskCard = () => {
}); });
} }
}, },
// eslint-disable-next-line react-hooks/exhaustive-deps
[executeStored, pOnlineShowDictionary] [executeStored, pOnlineShowDictionary]
); );