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

View File

@ -60,8 +60,9 @@ const STYLES = {
const selectEventType = (value, showDictionary, callBack) => {
showDictionary({
unitCode: "ClientEventTypes",
inputParameters: [{ name: "in_EVNTYPE_CODE", value: value }],
callBack: res => (res.success === true ? callBack(res.outParameters.out_EVNTYPE_CODE) : callBack(null))
showMethod: "dictionary",
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) => {
showDictionary({
unitCode: "AGNLIST",
inputParameters: [{ name: "in_AGNABBR", value: value }],
callBack: res => (res.success === true ? callBack(res.outParameters.out_AGNABBR) : callBack(null))
showMethod: "agents",
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) => {
showDictionary({
unitCode: "CostStaffGroups",
//showMethod: "dictionary",
inputParameters: [{ name: "in_CODE", value: value }],
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 (
<Box sx={STYLES.BOX_ROW}>
<IconButton id={`${taskRn}_menu_button`} aria-haspopup="true" onClick={handleMethodsMenuButtonClick}>
@ -60,7 +68,9 @@ const DataCellCardActions = ({ taskRn, menuItems, cardActions, handleMethodsMenu
<MenuItem
sx={action.delimiter ? STYLES.MENU_ITEM_DELIMITER : {}}
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);
//Закрываем меню
@ -84,7 +94,8 @@ DataCellCardActions.propTypes = {
cardActions: PropTypes.object.isRequired,
handleMethodsMenuButtonClick: 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();
@ -124,6 +135,7 @@ const TaskCard = ({ task, account, index, handleReload }) => {
handleMethodsMenuButtonClick={handleMethodsMenuButtonClick}
handleMethodsMenuClose={handleMethodsMenuClose}
handleReload={handleReload}
extraHandle={extraHandle}
/>
}
/>
@ -159,7 +171,8 @@ TaskCard.propTypes = {
task: PropTypes.object.isRequired,
account: PropTypes.object,
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)";
// };
// 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 [eventPoints, setEventPoints] = useState([]);
//Подключение к контексту диалога примечания
//const {noteDialog, setNoteDialog} = useContext(NoteDialogContext);
//Состояние учётных документов
const [docLinks, setDocLinks] = useState([]);
@ -458,6 +473,13 @@ const useTasks = () => {
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 = [];
//Если найдены пользователи
@ -473,6 +495,8 @@ const useTasks = () => {
}
//Указываем сформированные маршруты
setEventRoutes([...newRoutes]);
//Указываем сформированные точки маршрута
setEventPoints([...newPoints]);
//Указываем сформированные аккаунты
setAccounts([...newAccounts]);
};
@ -544,6 +568,7 @@ const useTasks = () => {
return [
tasks,
eventRoutes,
eventPoints,
docLinks,
accounts,
taskFormOpen,
@ -981,8 +1006,7 @@ const useTaskCard = () => {
if (data.NIDENT) {
pOnlineShowDictionary({
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]
);