ЦИТК-878. Отработка примечания от 11.11.24 Часть 1
This commit is contained in:
parent
c0b905fe18
commit
434504dda3
@ -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}
|
||||||
|
@ -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))
|
||||||
});
|
});
|
||||||
|
141
app/panels/clnt_task_board/components/note_dialog.js
Normal file
141
app/panels/clnt_task_board/components/note_dialog.js
Normal 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 };
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
@ -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]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user