WEB APP: Панель "Редактор настроек РО" - ЦИТК-823 - правки пул-реквеста по примечанию от 10.07.2024

This commit is contained in:
Mikhail Chechnev 2024-07-23 19:53:43 +03:00
parent 51fd2eeec0
commit fcd913c8ba
5 changed files with 60 additions and 56 deletions

View File

@ -17,15 +17,18 @@ import { useState, useLayoutEffect } from "react"; //Классы React
const useWindowResize = () => { const useWindowResize = () => {
//Состояние размера рабочей области //Состояние размера рабочей области
const [size, setSize] = useState([0, 0]); const [size, setSize] = useState([0, 0]);
//При изменении размера //При изменении размера
useLayoutEffect(() => { useLayoutEffect(() => {
function updateSize() { const updateSize = () => {
setSize([document.documentElement.clientWidth, document.documentElement.clientHeight]); setSize([document.documentElement.clientWidth, document.documentElement.clientHeight]);
} };
window.addEventListener("resize", updateSize); window.addEventListener("resize", updateSize);
updateSize(); updateSize();
return () => window.removeEventListener("resize", updateSize); return () => window.removeEventListener("resize", updateSize);
}, []); }, []);
//Вернём размеры
return size; return size;
}; };

View File

@ -16,7 +16,7 @@ import { Box, FormControl, InputLabel, Input, InputAdornment, IconButton, Icon }
//--------- //---------
//Стили //Стили
export const STYLES = { const STYLES = {
DIALOG_WINDOW_WIDTH: { width: 400 } DIALOG_WINDOW_WIDTH: { width: 400 }
}; };
@ -24,6 +24,7 @@ export const STYLES = {
//Тело компонента //Тело компонента
//--------------- //---------------
//Поле ввода
const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dictionary, ...other }) => { const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dictionary, ...other }) => {
//Значение элемента //Значение элемента
const [value, setValue] = useState(elementValue); const [value, setValue] = useState(elementValue);
@ -45,7 +46,7 @@ const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dict
//Генерация содержимого //Генерация содержимого
return ( return (
<Box sx={{ p: 1 }}> <Box p={1}>
<FormControl variant="standard" sx={STYLES.DIALOG_WINDOW_WIDTH} {...other}> <FormControl variant="standard" sx={STYLES.DIALOG_WINDOW_WIDTH} {...other}>
<InputLabel htmlFor={elementCode}>{labelText}</InputLabel> <InputLabel htmlFor={elementCode}>{labelText}</InputLabel>
<Input <Input

View File

@ -24,24 +24,19 @@ export const STYLES = {
//Тело модуля //Тело модуля
//----------- //-----------
//Генерация представления ячейки c данными //Генерация представления ячейки c данными показателя раздела регламентированного отчета
export const dataCellRender = ({ row, columnDef }, showRrpConfSctnMrk, editCR, deleteCR) => { export const confSctnMrkCellRender = ({ row, columnDef, onLinkClick, onEditClick, onDeleteClick }) => {
let data = row[columnDef.name]; let data = row[columnDef.name];
columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true
? (data = ( ? (data = (
<Box sx={STYLES.BOX_ROW}> <Box sx={STYLES.BOX_ROW}>
<Link <Link sx={STYLES.LINK_STYLE} onClick={() => (onLinkClick ? onLinkClick(row["NRN_" + columnDef.name.substring(5)]) : null)}>
sx={STYLES.LINK_STYLE}
onClick={() => {
showRrpConfSctnMrk(row["NRN_" + columnDef.name.substring(5)]);
}}
>
{row[columnDef.name]} {row[columnDef.name]}
</Link> </Link>
<IconButton onClick={() => editCR(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name])}> <IconButton onClick={() => (onEditClick ? onEditClick(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name]) : null)}>
<Icon>edit</Icon> <Icon>edit</Icon>
</IconButton> </IconButton>
<IconButton onClick={() => deleteCR(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name])}> <IconButton onClick={() => (onDeleteClick ? onDeleteClick(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name]) : null)}>
<Icon>delete</Icon> <Icon>delete</Icon>
</IconButton> </IconButton>
</Box> </Box>

View File

@ -17,11 +17,11 @@ import { NavigationCtx } from "../../context/navigation"; //Контекст н
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { SectionTabPanel } from "./section_tab_panel"; //Компонент вкладки раздела import { SectionTabPanel } from "./section_tab_panel"; //Компонент вкладки раздела
import { IUDFormDialog } from "./iud_form_dialog"; //Диалог добавления/исправления/удаления компонентов настройки регламентированного отчёта import { IUDFormDialog } from "./iud_form_dialog"; //Диалог добавления/исправления/удаления компонентов настройки регламентированного отчёта
import { dataCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов import { confSctnMrkCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
import { STATUSES } from "./iud_form_dialog"; //Статусы диалогового окна import { STATUSES } from "./iud_form_dialog"; //Статусы диалогового окна
import { TEXTS } from "../../../app.text"; //Текстовые константы import { TEXTS } from "../../../app.text"; //Текстовые константы
import { STYLES as COMMON_STYLES } from "./layouts"; //Общие стили import { STYLES as COMMON_STYLES } from "./layouts"; //Общие стили
import { useWindowResize } from "./hooks"; import { useWindowResize } from "./hooks"; //Пользовательские хуки
//--------- //---------
//Константы //Константы
@ -35,18 +35,21 @@ const pxPanelHeaderH = 64;
const pxSectionAddButtonW = 40; const pxSectionAddButtonW = 40;
//Стили //Стили
export const STYLES = { const STYLES = {
CONTAINER: { width: "100%" },
PANELS_MAIN_COLOR: { backgroundColor: "#1976d2" }, PANELS_MAIN_COLOR: { backgroundColor: "#1976d2" },
ICON_WHITE: { color: "white" }, ICON_WHITE: { color: "white" },
TABS_BOTTOM_LINE: { borderBottom: 1, borderColor: "divider" }, TABS_BOTTOM_LINE: { borderBottom: 1, borderColor: "divider" },
TABS_PADDING: { padding: "5px" }, TABS_PADDING: { padding: "5px" },
TABS_SIZES: { maxHeight: 150 }, TABS_SIZES: (width, pxSectionAddButtonW) => ({ maxHeight: 150, maxWidth: width - pxSectionAddButtonW }),
GRID_PADDING: { paddingTop: 1, paddingBottom: 1 }, GRID_PADDING: { paddingTop: 1, paddingBottom: 1 },
GRID_SIZES: { GRID_SIZES: (width, height, pxOuterMenuH, pxPanelHeaderH, pxTabsH) => ({
padding: 0, padding: 0,
minWidth: 400, minWidth: width * 0.95,
minHeight: 300 minHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.88,
} maxWidth: width * 0.95,
maxHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.88
})
}; };
//----------- //-----------
@ -165,23 +168,45 @@ const RrpConfEditor = () => {
}; };
//Отработка нажатия на кнопку добавления показателя раздела //Отработка нажатия на кнопку добавления показателя раздела
const addRRPCONFSCTNMRKClick = (prn, sctnCode, sctnName) => { const addSectionMarkClick = (prn, sctnCode, sctnName) => {
setFormData({ status: STATUSES.RRPCONFSCTNMRK_CREATE, prn: prn, sctnCode: sctnCode, sctnName: sctnName }); setFormData({ status: STATUSES.RRPCONFSCTNMRK_CREATE, prn: prn, sctnCode: sctnCode, sctnName: sctnName });
openForm(); openForm();
}; };
//Отработка нажатия на кнопку исправления показателя раздела //Отработка нажатия на кнопку исправления показателя раздела
const editRRPCONFSCTNMRKClick = (rn, name) => { const editSectionMarkClick = (rn, name) => {
setFormData({ status: STATUSES.RRPCONFSCTNMRK_EDIT, rn: rn, name: name }); setFormData({ status: STATUSES.RRPCONFSCTNMRK_EDIT, rn: rn, name: name });
openForm(); openForm();
}; };
//Отработка нажатия на кнопку удаления показателя раздела //Отработка нажатия на кнопку удаления показателя раздела
const deleteRRPCONFSCTNMRKClick = (rn, name) => { const deleteSectionMarkClick = (rn, name) => {
setFormData({ status: STATUSES.RRPCONFSCTNMRK_DELETE, rn: rn, name: name }); setFormData({ status: STATUSES.RRPCONFSCTNMRK_DELETE, rn: rn, name: name });
openForm(); openForm();
}; };
//Отображение показателя раздела
const showSectionMark = async rn => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODES",
args: {
NRN: rn
},
tagValueProcessor: () => undefined
});
if (data) {
pOnlineShowUnit({
unitCode: "RRPConfig",
showMethod: "main_mrk_settings",
inputParameters: [
{ name: "in_CODE", value: data.SRRPCONF },
{ name: "in_SCTN_CODE", value: data.SRRPCONFSCTN },
{ name: "in_MRK_CODE", value: data.SRRPCONFSCTNMRK }
]
});
} else showMsgErr(TEXTS.NO_DATA_FOUND);
};
//Формирование разделов //Формирование разделов
const a11yProps = index => { const a11yProps = index => {
return { return {
@ -269,27 +294,6 @@ const RrpConfEditor = () => {
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [rrpDoc.reload, rrpDoc.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]); }, [rrpDoc.reload, rrpDoc.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);
//Отбор показателя раздела по ид.
const showRrpConfSctnMrk = async rn => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODES",
args: {
NRN: rn
}
});
if (data) {
pOnlineShowUnit({
unitCode: "RRPConfig",
showMethod: "main_mrk_settings",
inputParameters: [
{ name: "in_CODE", value: data.SRRPCONF },
{ name: "in_SCTN_CODE", value: data.SRRPCONFSCTN },
{ name: "in_MRK_CODE", value: data.SRRPCONFSCTNMRK }
]
});
} else showMsgErr(TEXTS.NO_DATA_FOUND);
};
//При необходимости обновить данные таблицы //При необходимости обновить данные таблицы
useEffect(() => { useEffect(() => {
loadData(); loadData();
@ -319,7 +323,7 @@ const RrpConfEditor = () => {
//Генерация содержимого //Генерация содержимого
return ( return (
<Box sx={{ width: "100%" }}> <Box sx={STYLES.CONTAINER}>
{formOpen ? <IUDFormDialog initial={formData} onClose={handleDialogClose} onReload={handleDialogReload} /> : null} {formOpen ? <IUDFormDialog initial={formData} onClose={handleDialogClose} onReload={handleDialogReload} /> : null}
{rrpDoc.docLoaded ? ( {rrpDoc.docLoaded ? (
<Box> <Box>
@ -332,7 +336,7 @@ const RrpConfEditor = () => {
scrollButtons={false} scrollButtons={false}
visibleScrollbar visibleScrollbar
aria-label="section tab" aria-label="section tab"
sx={{ ...STYLES.TABS_SIZES, maxWidth: width - pxSectionAddButtonW }} sx={STYLES.TABS_SIZES(width, pxSectionAddButtonW)}
> >
{rrpDoc.sections.map((s, i) => { {rrpDoc.sections.map((s, i) => {
return ( return (
@ -365,18 +369,14 @@ const RrpConfEditor = () => {
{rrpDoc.sections.map((s, i) => { {rrpDoc.sections.map((s, i) => {
return ( return (
<SectionTabPanel key={s.rn} value={tabValue} index={i}> <SectionTabPanel key={s.rn} value={tabValue} index={i}>
<Button onClick={() => addRRPCONFSCTNMRKClick(s.rn, s.code, s.name)}>Добавить</Button> <Button onClick={() => addSectionMarkClick(s.rn, s.code, s.name)}>Добавить</Button>
{s.dataLoaded && s.columnsDef.length > 1 ? ( {s.dataLoaded && s.columnsDef.length > 1 ? (
<Box sx={{ ...STYLES.GRID_PADDING, ...COMMON_STYLES.BOX_ROW }}> <Box sx={{ ...STYLES.GRID_PADDING, ...COMMON_STYLES.BOX_ROW }}>
<P8PDataGrid <P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS} {...P8P_DATA_GRID_CONFIG_PROPS}
containerComponentProps={{ containerComponentProps={{
elevation: 6, elevation: 6,
style: { style: STYLES.GRID_SIZES(width, height, pxOuterMenuH, pxPanelHeaderH, pxTabsH)
...STYLES.GRID_SIZES,
maxWidth: width * 0.95,
maxHeight: (height - pxOuterMenuH - pxPanelHeaderH - pxTabsH) * 0.88
}
}} }}
columnsDef={s.columnsDef} columnsDef={s.columnsDef}
groups={s.groups} groups={s.groups}
@ -386,7 +386,12 @@ const RrpConfEditor = () => {
size={P8P_DATA_GRID_SIZE.LARGE} size={P8P_DATA_GRID_SIZE.LARGE}
reloading={s.reload} reloading={s.reload}
dataCellRender={prms => dataCellRender={prms =>
dataCellRender({ ...prms }, showRrpConfSctnMrk, editRRPCONFSCTNMRKClick, deleteRRPCONFSCTNMRKClick) confSctnMrkCellRender({
...prms,
onLinkClick: showSectionMark,
onEditClick: editSectionMarkClick,
onDeleteClick: deleteSectionMarkClick
})
} }
/> />
</Box> </Box>

View File

@ -22,7 +22,7 @@ const SectionTabPanel = props => {
return ( return (
<div role="tabpanel" hidden={value !== index} id={`tabpanel-${index}`} aria-labelledby={`tab-${index}`} {...other}> <div role="tabpanel" hidden={value !== index} id={`tabpanel-${index}`} aria-labelledby={`tab-${index}`} {...other}>
{value === index && ( {value === index && (
<Box sx={{ p: 3 }}> <Box p={3}>
<Typography component="span">{children}</Typography> <Typography component="span">{children}</Typography>
</Box> </Box>
)} )}