ЦИТК-823 правки по примечанию от 10.06.24

This commit is contained in:
Vladislav 2024-07-08 16:55:32 +03:00
parent faf1c9d6e7
commit 95a2578d11
6 changed files with 374 additions and 332 deletions

View File

@ -7,11 +7,12 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useContext } from "react"; //Классы React import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, Typography, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты import { Dialog, DialogTitle, IconButton, Icon, DialogContent, Typography, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты
//import { MessagingСtx } from "../../context/messaging"; //import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { IUDFormTextField } from "./iud_form_text_field"; //Кастомные строки ввода import { IUDFormTextField } from "./iud_form_text_field"; //Кастомные строки ввода
import { STATUSES } from "./layouts"; //Статусы и стили диалогового окна import { STATUSES } from "./layouts"; //Статусы и стили диалогового окна
@ -21,91 +22,20 @@ import { STATUSES } from "./layouts"; //Статусы и стили диало
//Стили //Стили
const STYLES = { const STYLES = {
DIALOG_ACTIONS: { justifyContent: "center" },
CLOSE_BUTTON: { CLOSE_BUTTON: {
position: "absolute", position: "absolute",
right: 8, right: 8,
top: 8, top: 8,
color: theme => theme.palette.grey[500] color: theme => theme.palette.grey[500]
} },
}; PADDING_DIALOG_BUTTONS_RIGHT: { paddingRight: "32px" }
//Выбор подразделения
// const selectInsDepartment = (showDictionary, callBack) => {
// showDictionary({
// unitCode: "INS_DEPARTMENT",
// callBack: res => (res.success === true ? callBack(res.outParameters.out_CODE) : callBack(null))
// });
// };
//Выбор строки
const selectRow = (showDictionary, callBack) => {
showDictionary({
unitCode: "RRPRow",
callBack: res =>
res.success === true
? callBack(res.outParameters.out_CODE, res.outParameters.out_RRPVERSION_CODE, res.outParameters.out_RRPVERSION)
: callBack(null)
});
// pOnlineShowDictionary({
// unitCode: "RRPRow",
// callBack: res =>
// res.success === true
// ? setFormData(pv => ({
// ...pv,
// rowCode: res.outParameters.out_CODE,
// rowVCode: res.outParameters.out_RRPVERSION_CODE,
// rowVRn: res.outParameters.out_RRPVERSION
// }))
// : null
// });
};
//Выбор графы
const selectColumn = (showDictionary, callBack) => {
showDictionary({
unitCode: "RRPColumn",
callBack: res =>
res.success === true
? callBack(res.outParameters.out_CODE, res.outParameters.out_RRPVERSION_CODE, res.outParameters.out_RRPVERSION)
: callBack(null)
});
// pOnlineShowDictionary({
// unitCode: "RRPColumn",
// callBack: res =>
// res.success === true
// ? setFormData(pv => ({
// ...pv,
// colCode: res.outParameters.out_CODE,
// colVCode: res.outParameters.out_RRPVERSION_CODE,
// colVRn: res.outParameters.out_RRPVERSION
// }))
// : null
// });
}; };
//--------------- //---------------
//Тело компонента //Тело компонента
//--------------- //---------------
const IUDFormDialog = ({ initial, onOk, onCancel }) => { const IUDFormDialog = ({ initial, onClose, onReload }) => {
//Свойства компонента
// const {
// formOpen,
// closeForm,
// curStatus,
// curCode,
// curName,
// curColCode,
// curRowCode,
// btnOkClick,
// codeOnChange,
// nameOnChange,
// dictColumnClick,
// dictRowClick
// } = props;
//Собственное состояние //Собственное состояние
const [formData, setFormData] = useState({ ...initial }); const [formData, setFormData] = useState({ ...initial });
@ -115,11 +45,122 @@ const IUDFormDialog = ({ initial, onOk, onCancel }) => {
//Подключение к контексту приложения //Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx); const { pOnlineShowDictionary } = useContext(ApplicationСtx);
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//При закрытии диалога без изменений //При закрытии диалога без изменений
const handleCancel = () => (onCancel ? onCancel() : null); const handleCancel = () => (onClose ? onClose() : null);
//При закрытии диалога с изменениями //При закрытии диалога с изменениями
const handleOK = () => (onOk ? onOk(formData) : null); const handleOK = () => {
if (onClose) {
changeSections();
onClose();
} else null;
};
//Отработка добавления/изсправления/удаления элемента
const handleReload = () => {
if (onReload) {
onReload(formData);
} else null;
};
//При изменении значения элемента
const handleDialogItemChange = (item, value) => setFormData(pv => ({ ...pv, [item]: value }));
//Отработка изменений в разделе или показателе раздела
const changeSections = useCallback(async () => {
switch (formData.status) {
case STATUSES.CREATE:
await insertSections();
break;
case STATUSES.EDIT:
await updateSections();
break;
case STATUSES.DELETE:
await deleteSections();
break;
case STATUSES.RRPCONFSCTNMRK_CREATE:
await addRRPCONFSCTNMRK();
break;
case STATUSES.RRPCONFSCTNMRK_EDIT:
await editRRPCONFSCTNMRK();
break;
case STATUSES.RRPCONFSCTNMRK_DELETE:
await deleteRRPCONFSCTNMRK();
break;
}
handleReload();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [formData]);
//Добавление раздела
const insertSections = useCallback(async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_INSERT",
args: {
NPRN: formData.prn,
SCODE: formData.code,
SNAME: formData.name
}
});
setFormData(pv => ({
...pv,
rn: Number(data.NRN)
}));
}, [formData.prn, formData.code, formData.name, executeStored]);
//Исправление раздела
const updateSections = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_UPDATE",
args: {
NRN: formData.rn,
SCODE: formData.code,
SNAME: formData.name
}
});
}, [formData.name, formData.code, formData.rn, executeStored]);
//Удаление раздела
const deleteSections = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_DELETE",
args: {
NRN: formData.rn
}
});
}, [formData.rn, executeStored]);
//Добавление показателя раздела
const addRRPCONFSCTNMRK = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_INSERT",
args: {
NPRN: formData.prn,
SCODE: formData.code,
SNAME: formData.name,
SCOLCODE: formData.colCode,
SCOLVER: formData.colVCode,
SROWCODE: formData.rowCode,
SROWVER: formData.rowVCode
}
});
}, [executeStored, formData.code, formData.colVCode, formData.colCode, formData.name, formData.prn, formData.rowCode, formData.rowVCode]);
//Исправление показателя раздела
const editRRPCONFSCTNMRK = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_UPDATE",
args: { NRN: formData.rn, SNAME: formData.name }
});
}, [executeStored, formData.name, formData.rn]);
//Удаление показателя раздела
const deleteRRPCONFSCTNMRK = useCallback(async () => {
await executeStored({ stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_DELETE", args: { NRN: formData.rn } });
}, [executeStored, formData.rn]);
//Формирование заголовка диалогового окна //Формирование заголовка диалогового окна
const formTitle = () => { const formTitle = () => {
@ -130,11 +171,11 @@ const IUDFormDialog = ({ initial, onOk, onCancel }) => {
return "Исправление раздела"; return "Исправление раздела";
case STATUSES.DELETE: case STATUSES.DELETE:
return "Удаление раздела"; return "Удаление раздела";
case STATUSES.COLUMNROW_CREATE: case STATUSES.RRPCONFSCTNMRK_CREATE:
return "Добавление показателя раздела"; return "Добавление показателя раздела";
case STATUSES.COLUMNROW_EDIT: case STATUSES.RRPCONFSCTNMRK_EDIT:
return "Исправление показателя раздела"; return "Исправление показателя раздела";
case STATUSES.COLUMNROW_DELETE: case STATUSES.RRPCONFSCTNMRK_DELETE:
return "Удаление показателя раздела"; return "Удаление показателя раздела";
} }
}; };
@ -144,21 +185,85 @@ const IUDFormDialog = ({ initial, onOk, onCancel }) => {
var btnText = ""; var btnText = "";
switch (formData.status) { switch (formData.status) {
case STATUSES.CREATE: case STATUSES.CREATE:
case STATUSES.COLUMNROW_CREATE: case STATUSES.RRPCONFSCTNMRK_CREATE:
btnText = "Добавить"; btnText = "Добавить";
break; break;
case STATUSES.EDIT: case STATUSES.EDIT:
case STATUSES.COLUMNROW_EDIT: case STATUSES.RRPCONFSCTNMRK_EDIT:
btnText = "Исправить"; btnText = "Исправить";
break; break;
case STATUSES.DELETE: case STATUSES.DELETE:
case STATUSES.COLUMNROW_DELETE: case STATUSES.RRPCONFSCTNMRK_DELETE:
btnText = "Удалить"; btnText = "Удалить";
break; break;
} }
return <Button onClick={handleOK}>{btnText}</Button>; return (
<Button
onClick={() => {
handleOK({ formData });
}}
>
{btnText}
</Button>
);
}; };
//Выбор строки
const selectRow = (showDictionary, callBack) => {
showDictionary({
unitCode: "RRPRow",
callBack: res => {
if (res.success === true) {
callBack(res.outParameters.out_CODE, res.outParameters.out_RRPVERSION_CODE, res.outParameters.out_RRPVERSION);
setFormData(pv => ({
...pv,
rowCode: res.outParameters.out_CODE,
rowVCode: res.outParameters.out_RRPVERSION_CODE,
rowVRn: res.outParameters.out_RRPVERSION
}));
} else callBack(null);
}
});
};
//Выбор графы
const selectColumn = (showDictionary, callBack) => {
showDictionary({
unitCode: "RRPColumn",
callBack: res => {
if (res.success === true) {
callBack(res.outParameters.out_CODE, res.outParameters.out_RRPVERSION_CODE, res.outParameters.out_RRPVERSION);
setFormData(pv => ({
...pv,
colCode: res.outParameters.out_CODE,
colVCode: res.outParameters.out_RRPVERSION_CODE,
colVRn: res.outParameters.out_RRPVERSION
}));
} else callBack(null);
}
});
};
//Получение мнемокода и наименования показателя раздела
const getSctnMrkCodeName = useCallback(async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODE_NAME",
args: { SSCTNCODE: formData.sctnCode, SROWCODE: formData.rowCode, SCOLUMNCODE: formData.colCode }
});
setFormData(pv => ({
...pv,
code: data.SCODE,
name: data.SNAME
}));
}, [executeStored, formData.colCode, formData.rowCode, formData.sctnCode]);
//Получение наименования и мнемокода показателя раздела при заполнении необходимых полей
useEffect(() => {
formData.status == STATUSES.RRPCONFSCTNMRK_CREATE && formData.sctnName && formData.sctnCode && formData.colCode && formData.rowCode
? getSctnMrkCodeName()
: null;
}, [formData.colCode, formData.rowCode, formData.sctnCode, formData.sctnName, formData.status, getSctnMrkCodeName]);
return ( return (
<Dialog open onClose={handleCancel}> <Dialog open onClose={handleCancel}>
<DialogTitle>{formTitle()}</DialogTitle> <DialogTitle>{formTitle()}</DialogTitle>
@ -166,7 +271,7 @@ const IUDFormDialog = ({ initial, onOk, onCancel }) => {
<Icon>close</Icon> <Icon>close</Icon>
</IconButton> </IconButton>
<DialogContent> <DialogContent>
{formData.status == STATUSES.DELETE || formData.status == STATUSES.COLUMNROW_DELETE ? ( {formData.status == STATUSES.DELETE || formData.status == STATUSES.RRPCONFSCTNMRK_DELETE ? (
formData.status == STATUSES.DELETE ? ( formData.status == STATUSES.DELETE ? (
<Typography>Вы хотите удалить раздел {formData.name}?</Typography> <Typography>Вы хотите удалить раздел {formData.name}?</Typography>
) : ( ) : (
@ -174,24 +279,34 @@ const IUDFormDialog = ({ initial, onOk, onCancel }) => {
) )
) : ( ) : (
<div> <div>
{formData.status != STATUSES.COLUMNROW_EDIT ? ( {formData.status != STATUSES.RRPCONFSCTNMRK_EDIT ? (
<IUDFormTextField elementCode="code" elementValue={formData.code} labelText="Мнемокод" onChange={handleOK} /> <IUDFormTextField
elementCode="code"
elementValue={formData.code}
labelText="Мнемокод"
onChange={handleDialogItemChange}
/>
) : null} ) : null}
<IUDFormTextField elementCode="name" elementValue={formData.name} labelText="Наименование" onChange={handleOK} /> <IUDFormTextField
{formData.status == STATUSES.COLUMNROW_CREATE ? ( elementCode="name"
elementValue={formData.name}
labelText="Наименование"
onChange={handleDialogItemChange}
/>
{formData.status == STATUSES.RRPCONFSCTNMRK_CREATE ? (
<div> <div>
<IUDFormTextField <IUDFormTextField
elementCode="row" elementCode="row"
elementValue={formData.rowCode} elementValue={formData.rowCode}
labelText="Строка" labelText="Строка"
onChange={handleOK} onChange={handleDialogItemChange}
dictionary={callBack => selectRow(pOnlineShowDictionary, callBack)} dictionary={callBack => selectRow(pOnlineShowDictionary, callBack)}
/> />
<IUDFormTextField <IUDFormTextField
elementCode="column" elementCode="column"
elementValue={formData.colCode} elementValue={formData.colCode}
labelText="Графа" labelText="Графа"
onChange={handleOK} onChange={handleDialogItemChange}
dictionary={callBack => selectColumn(pOnlineShowDictionary, callBack)} dictionary={callBack => selectColumn(pOnlineShowDictionary, callBack)}
/> />
</div> </div>
@ -210,8 +325,8 @@ const IUDFormDialog = ({ initial, onOk, onCancel }) => {
//Контроль свойств - Диалог //Контроль свойств - Диалог
IUDFormDialog.propTypes = { IUDFormDialog.propTypes = {
initial: PropTypes.object.isRequired, initial: PropTypes.object.isRequired,
onOk: PropTypes.func, onClose: PropTypes.func,
onCancel: PropTypes.func onReload: PropTypes.func
}; };
//-------------------- //--------------------

View File

@ -7,10 +7,18 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useCallback, useEffect } from "react"; //Классы React import React, { useState, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, FormControl, InputLabel, Input, InputAdornment, IconButton, Icon } from "@mui/material"; //Интерфейсные компоненты import { Box, FormControl, InputLabel, Input, InputAdornment, IconButton, Icon } from "@mui/material"; //Интерфейсные компоненты
import { STYLES } from "./layouts"; //Стили диалогового окна
//---------
//Константы
//---------
//Стили
export const STYLES = {
DIALOG_WINDOW_WIDTH: { width: 400 }
};
//--------------- //---------------
//Тело компонента //Тело компонента
@ -20,16 +28,6 @@ const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dict
//Значение элемента //Значение элемента
const [value, setValue] = useState(elementValue); const [value, setValue] = useState(elementValue);
//Формирование идентификатора элемента
// const generateId = useCallback(async () => {
// setElementId(`${elementCode}-input`);
// }, [elementCode]);
//При рендере поля ввода
// useEffect(() => {
// generateId();
// }, [generateId]);
//При получении нового значения из вне //При получении нового значения из вне
useEffect(() => { useEffect(() => {
setValue(elementValue); setValue(elementValue);
@ -47,12 +45,12 @@ const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dict
return ( return (
<Box sx={{ p: 1 }}> <Box sx={{ p: 1 }}>
<FormControl 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
id={elementCode} id={elementCode}
name={elementCode} name={elementCode}
value={value} value={value ? value : ""}
endAdornment={ endAdornment={
dictionary ? ( dictionary ? (
<InputAdornment position="end"> <InputAdornment position="end">
@ -62,9 +60,9 @@ const IUDFormTextField = ({ elementCode, elementValue, labelText, onChange, dict
</InputAdornment> </InputAdornment>
) : null ) : null
} }
aria-describedby={`${elementCode}-helper-text`}
label={labelText}
onChange={handleChange} onChange={handleChange}
multiline
maxRows={4}
/> />
</FormControl> </FormControl>
</Box> </Box>

View File

@ -8,19 +8,20 @@
//--------------------- //---------------------
import React from "react"; //Классы React import React from "react"; //Классы React
import { Stack, IconButton, Icon, Link } from "@mui/material"; //Интерфейсные компоненты import { Box, IconButton, Icon, Link } from "@mui/material"; //Интерфейсные компоненты
//--------- //---------
//Константы //Константы
//--------- //---------
//Стили
export const STYLES = { export const STYLES = {
DIALOG_WINDOW_WIDTH: { width: 400 }, BOX_ROW: { display: "flex", justifyContent: "center", alignItems: "center" },
PADDING_DIALOG_BUTTONS_RIGHT: { paddingRight: "32px" } LINK_STYLE: { component: "button", width: "-webkit-fill-available" }
}; };
//Статусы диалогового окна //Статусы диалогового окна
export const STATUSES = { CREATE: 0, EDIT: 1, DELETE: 2, COLUMNROW_CREATE: 3, COLUMNROW_EDIT: 4, COLUMNROW_DELETE: 5 }; export const STATUSES = { CREATE: 0, EDIT: 1, DELETE: 2, RRPCONFSCTNMRK_CREATE: 3, RRPCONFSCTNMRK_EDIT: 4, RRPCONFSCTNMRK_DELETE: 5 };
//----------- //-----------
//Тело модуля //Тело модуля
@ -29,13 +30,11 @@ export const STATUSES = { CREATE: 0, EDIT: 1, DELETE: 2, COLUMNROW_CREATE: 3, CO
//Генерация представления ячейки c данными //Генерация представления ячейки c данными
export const dataCellRender = ({ row, columnDef }, showRrpConfSctnMrk, editCR, deleteCR) => { export const dataCellRender = ({ row, columnDef }, showRrpConfSctnMrk, editCR, deleteCR) => {
let data = row[columnDef.name]; let data = row[columnDef.name];
let cellStyle = { display: "flex" };
columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true columnDef.name != "SROW_NAME" && data != undefined && columnDef.visible == true
? (data = ( ? (data = (
<Stack direction="row"> <Box sx={STYLES.BOX_ROW}>
<Link <Link
component="button" sx={STYLES.LINK_STYLE}
width="-webkit-fill-available"
onClick={() => { onClick={() => {
showRrpConfSctnMrk(row["NRN_" + columnDef.name.substring(5)]); showRrpConfSctnMrk(row["NRN_" + columnDef.name.substring(5)]);
}} }}
@ -48,7 +47,7 @@ export const dataCellRender = ({ row, columnDef }, showRrpConfSctnMrk, editCR, d
<IconButton onClick={() => deleteCR(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name])}> <IconButton onClick={() => deleteCR(row["NRN_" + columnDef.name.substring(5)], row[columnDef.name])}>
<Icon>delete</Icon> <Icon>delete</Icon>
</IconButton> </IconButton>
</Stack> </Box>
)) ))
: null; : null;
return { data }; return { data };

View File

@ -13,10 +13,23 @@ import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { TEXTS } from "../../../app.text"; //Текстовые константы
import { SectionTabPanel } from "./section_tab_panel"; //Кастомный Tab import { SectionTabPanel } from "./section_tab_panel"; //Кастомный Tab
import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { STATUSES, dataCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов import { STATUSES, dataCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
import { IUDFormDialog } from "./iud_form_dialog"; //Кастомное диалоговое окно import { IUDFormDialog } from "./iud_form_dialog"; //Кастомное диалоговое окно
import { STYLES as COMMON_STYLES } from "./layouts";
//---------
//Константы
//---------
//Стили
export const STYLES = {
TABS_BOTTOM_LINE: { borderBottom: 1, borderColor: "divider" },
TABS_PADDING: { paddingTop: 1, paddingBottom: 1 }
};
//----------- //-----------
//Тело модуля //Тело модуля
@ -55,7 +68,6 @@ const RrpConfEditor = () => {
//Состояние диалогового окна //Состояние диалогового окна
const [formData, setFormData] = useState({ const [formData, setFormData] = useState({
filled: false,
rn: "", rn: "",
prn: "", prn: "",
sctnName: "", sctnName: "",
@ -78,17 +90,24 @@ const RrpConfEditor = () => {
setForm(true); setForm(true);
}; };
//Закрытие диалогового окна
const closeForm = () => {
setForm(false);
};
//Очистка диалогового окна //Очистка диалогового окна
const clearFormData = () => { const clearFormData = () => {
setFormData({ setFormData({
rn: "", rn: "",
prn: "",
sctnName: "",
sctnCode: "",
status: "",
code: "", code: "",
name: "" name: "",
colName: "",
colCode: "",
colVCode: "",
colVRn: 0,
rowName: "",
rowCode: "",
rowVCode: "",
rowVRn: 0
}); });
}; };
@ -96,11 +115,14 @@ const RrpConfEditor = () => {
const { executeStored } = useContext(BackEndСtx); const { executeStored } = useContext(BackEndСtx);
//Подключение к контексту приложения //Подключение к контексту приложения
const { pOnlineShowDictionary, pOnlineShowUnit } = useContext(ApplicationСtx); const { pOnlineShowUnit } = useContext(ApplicationСtx);
//Подключение к контексту навигации //Подключение к контексту навигации
const { getNavigationSearch } = useContext(NavigationCtx); const { getNavigationSearch } = useContext(NavigationCtx);
//Подключение к контексту сообщений
const { showMsgErr } = useContext(MessagingСtx);
//Переключение раздела //Переключение раздела
const handleChange = (event, newValue) => { const handleChange = (event, newValue) => {
setTabValue(newValue); setTabValue(newValue);
@ -125,38 +147,23 @@ const RrpConfEditor = () => {
}; };
//Отработка нажатия на кнопку добавления показателя раздела //Отработка нажатия на кнопку добавления показателя раздела
const addColumnRowClick = (prn, sctnCode, sctnName) => { const addRRPCONFSCTNMRKClick = (prn, sctnCode, sctnName) => {
setFormData({ status: STATUSES.COLUMNROW_CREATE, prn: prn, sctnCode: sctnCode, sctnName: sctnName }); setFormData({ status: STATUSES.RRPCONFSCTNMRK_CREATE, prn: prn, sctnCode: sctnCode, sctnName: sctnName });
openForm(); openForm();
}; };
//Отработка нажатия на кнопку исправления показателя раздела //Отработка нажатия на кнопку исправления показателя раздела
const editColumnRowClick = (rn, name) => { const editRRPCONFSCTNMRKClick = (rn, name) => {
setFormData({ status: STATUSES.COLUMNROW_EDIT, rn: rn, name: name }); setFormData({ status: STATUSES.RRPCONFSCTNMRK_EDIT, rn: rn, name: name });
openForm(); openForm();
}; };
//Отработка нажатия на кнопку удаления показателя раздела //Отработка нажатия на кнопку удаления показателя раздела
const deleteColumnRowClick = (rn, name) => { const deleteRRPCONFSCTNMRKClick = (rn, name) => {
setFormData({ status: STATUSES.COLUMNROW_DELETE, rn: rn, name: name }); setFormData({ status: STATUSES.RRPCONFSCTNMRK_DELETE, rn: rn, name: name });
openForm(); openForm();
}; };
//Нажатие на кнопку подтверждения создания/исправления/удаления на форме
const formBtnOkClick = () => {
let formStateProps = {};
if (formData.status === (STATUSES.CREATE || STATUSES.EDIT || STATUSES.COLUMNROW_CREATE))
formStateProps = { ...formStateProps, code: document.querySelector("#code-outlined").value };
if (formData.status === (STATUSES.CREATE || STATUSES.EDIT || STATUSES.COLUMNROW_CREATE || STATUSES.COLUMNROW_EDIT))
formStateProps = { ...formStateProps, name: document.querySelector("#name-outlined").value };
setFormData(pv => ({
...pv,
...formStateProps,
filled: true
}));
closeForm();
};
//Формирование разделов //Формирование разделов
const a11yProps = index => { const a11yProps = index => {
return { return {
@ -165,120 +172,6 @@ const RrpConfEditor = () => {
}; };
}; };
//Отработка изменений в разделе или показателе раздела
const changeSections = useCallback(async () => {
if (formData.filled) {
switch (formData.status) {
case STATUSES.CREATE:
insertSections();
clearFormData();
break;
case STATUSES.EDIT:
updateSections();
clearFormData();
break;
case STATUSES.DELETE:
deleteSections();
clearFormData();
break;
case STATUSES.COLUMNROW_CREATE:
addColumnRow();
clearFormData();
break;
case STATUSES.COLUMNROW_EDIT:
editColumnRow();
clearFormData();
break;
case STATUSES.COLUMNROW_DELETE:
deleteColumnRow();
clearFormData();
break;
}
setRrpDoc(pv => ({ ...pv, reload: true }));
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [formData]);
//Добавление раздела
const insertSections = useCallback(async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_INSERT",
args: {
NPRN: formData.prn,
SCODE: formData.code,
SNAME: formData.name
}
});
setFormData(pv => ({
...pv,
rn: Number(data.NRN)
}));
}, [formData.prn, formData.code, formData.name, executeStored]);
//Исправление раздела
const updateSections = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_UPDATE",
args: {
NRN: formData.rn,
SCODE: formData.code,
SNAME: formData.name
}
});
}, [formData.name, formData.code, formData.rn, executeStored]);
//Удаление раздела
const deleteSections = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_DELETE",
args: {
NRN: formData.rn
}
});
}, [formData.rn, executeStored]);
//Добавление показателя раздела
const addColumnRow = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_INSERT",
args: {
NPRN: formData.prn,
SCODE: formData.code,
SNAME: formData.name,
SCOLCODE: formData.colCode,
SCOLVER: formData.colVCode,
SROWCODE: formData.rowCode,
SROWVER: formData.rowVCode
}
});
}, [executeStored, formData.code, formData.colVCode, formData.colCode, formData.name, formData.prn, formData.rowCode, formData.rowVCode]);
//Исправление показателя раздела
const editColumnRow = useCallback(async () => {
await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_UPDATE",
args: { NRN: formData.rn, SNAME: formData.name }
});
}, [executeStored, formData.name, formData.rn]);
//Удаление показателя раздела
const deleteColumnRow = useCallback(async () => {
await executeStored({ stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_DELETE", args: { NRN: formData.rn } });
}, [executeStored, formData.rn]);
//Получение мнемокода и наименования показателя раздела
const getSctnMrkCodeName = useCallback(async () => {
const data = await executeStored({
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODE_NAME",
args: { SSCTNCODE: formData.sctnCode, SROWCODE: formData.rowCode, SCOLUMNCODE: formData.colCode }
});
setFormData(pv => ({
...pv,
code: data.SCODE,
name: data.SNAME
}));
}, [executeStored, formData.colCode, formData.rowCode, formData.sctnCode]);
//Загрузка данных разделов регламентированного отчёта //Загрузка данных разделов регламентированного отчёта
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
if (rrpDoc.reload) { if (rrpDoc.reload) {
@ -296,7 +189,7 @@ const RrpConfEditor = () => {
//Копирование массива уже загруженных разделов //Копирование массива уже загруженных разделов
let cloneDGs = dataGrids.slice(); let cloneDGs = dataGrids.slice();
//Массив из нескольких разделов и из одного //Массив из нескольких разделов и из одного
const sections = data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS]; const sections = data.SECTIONS ? (data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS]) : [];
//Заполнение очередного раздела по шаблону //Заполнение очередного раздела по шаблону
sections.map(s => { sections.map(s => {
let dg = {}; let dg = {};
@ -343,7 +236,9 @@ const RrpConfEditor = () => {
//Устаревший раздел удаляем из массива данных //Устаревший раздел удаляем из массива данных
dataGrids.splice(curIndex, 1); dataGrids.splice(curIndex, 1);
//Фокус на предшествующий раздел //Фокус на предшествующий раздел
tabFocus = curIndex - 1; if (curIndex > 0) tabFocus = curIndex - 1;
//Иначе фокус на следующий, если был удалён первый раздел
else tabFocus = curIndex;
}); });
setRrpDoc(pv => ({ setRrpDoc(pv => ({
...pv, ...pv,
@ -374,74 +269,74 @@ const RrpConfEditor = () => {
loadData(); loadData();
}, [rrpDoc.reload, dataGrid.reload, loadData]); }, [rrpDoc.reload, dataGrid.reload, loadData]);
//Обновление при изменении разделов const handleDialogReload = data => {
useEffect(() => { console.log(JSON.stringify(data));
changeSections(); setRrpDoc(pv => ({ ...pv, reload: true }));
}, [changeSections]);
//Получение наименования и мнемокода показателя раздела при заполнении необходимых полей
useEffect(() => {
formData.status == STATUSES.COLUMNROW_CREATE && formData.sctnName && formData.sctnCode && formData.colCode && formData.rowCode
? getSctnMrkCodeName()
: null;
}, [formData.colCode, formData.rowCode, formData.sctnCode, formData.sctnName, formData.status, getSctnMrkCodeName]);
//При изменении фильтра в диалоге
const handleFilterOk = filter => {
setFormData(filter);
setForm(false);
}; };
//При закрытии диалога фильтра //При закрытии диалога
const handleFilterCancel = () => setForm(false); const handleDialogClose = () => {
setForm(false);
clearFormData();
};
//Генерация содержимого //Генерация содержимого
return ( return (
<Box sx={{ width: "100%" }}> <Box sx={{ width: "100%" }}>
{formOpen ? <IUDFormDialog initial={formData} onOk={handleFilterOk} onCancel={handleFilterCancel} /> : null} {formOpen ? <IUDFormDialog initial={formData} onClose={handleDialogClose} onReload={handleDialogReload} /> : null}
{rrpDoc.docLoaded ? ( {rrpDoc.docLoaded ? (
<Box sx={{ borderBottom: 1, borderColor: "divider" }}> <Box>
<Stack direction="row"> <Stack direction="row" sx={STYLES.TABS_BOTTOM_LINE}>
<Tabs value={tabValue} onChange={handleChange} aria-label="section tab"> <Tabs value={tabValue} onChange={handleChange} aria-label="section tab">
{rrpDoc.sections.map((s, i) => { {rrpDoc.sections.map((s, i) => {
return ( return (
<Tab <Tab
key={s.rn} key={s.rn}
{...a11yProps(i)} {...a11yProps(i)}
sx={{ padding: "10px" }}
label={ label={
<Stack direction="row" textAlign="center"> <Box sx={COMMON_STYLES.BOX_ROW}>
{s.name} {s.name}
<Icon onClick={() => editSectionClick(s.rn, s.code, s.name)}>edit</Icon> <IconButton component="span" onClick={() => editSectionClick(s.rn, s.code, s.name)}>
<Icon onClick={() => deleteSectionClick(s.rn, s.code, s.name)}>delete</Icon> <Icon>edit</Icon>
</Stack> </IconButton>
<IconButton component="span" onClick={() => deleteSectionClick(s.rn, s.code, s.name)}>
<Icon>delete</Icon>
</IconButton>
</Box>
} }
wrapped wrapped
/> />
); );
})} })}
</Tabs> </Tabs>
<IconButton onClick={addSectionClick}> <Box display="flex" justifyContent="center" alignItems="center">
<Icon>add</Icon> <IconButton onClick={addSectionClick}>
</IconButton> <Icon>add</Icon>
</IconButton>
</Box>
</Stack> </Stack>
{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={() => addColumnRowClick(s.rn, s.code, s.name)}>+ Добавить</Button> <Button onClick={() => addRRPCONFSCTNMRKClick(s.rn, s.code, s.name)}>Добавить</Button>
{s.dataLoaded ? ( {s.dataLoaded ? (
<P8PDataGrid <Box sx={{ ...STYLES.TABS_PADDING, ...COMMON_STYLES.BOX_ROW }}>
{...P8P_DATA_GRID_CONFIG_PROPS} <P8PDataGrid
columnsDef={s.columnsDef} {...P8P_DATA_GRID_CONFIG_PROPS}
groups={s.groups} containerComponentProps={{ elevation: 6 }}
rows={s.rows} columnsDef={s.columnsDef}
fixedHeader={s.fixedHeader} groups={s.groups}
fixedColumns={s.fixedColumns} rows={s.rows}
size={P8P_DATA_GRID_SIZE.LARGE} fixedHeader={s.fixedHeader}
reloading={s.reload} fixedColumns={s.fixedColumns}
dataCellRender={prms => size={P8P_DATA_GRID_SIZE.LARGE}
dataCellRender({ ...prms }, showRrpConfSctnMrk, editColumnRowClick, deleteColumnRowClick) reloading={s.reload}
} dataCellRender={prms =>
/> dataCellRender({ ...prms }, showRrpConfSctnMrk, editRRPCONFSCTNMRKClick, deleteRRPCONFSCTNMRKClick)
}
/>
</Box>
) : null} ) : null}
</SectionTabPanel> </SectionTabPanel>
); );

View File

@ -19,10 +19,10 @@ const SectionTabPanel = props => {
const { children, value, index, ...other } = props; const { children, value, index, ...other } = props;
return ( return (
<div role="tabpanel" hidden={value !== index} id={`simple-tabpanel-${index}`} aria-labelledby={`simple-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 sx={{ p: 3 }}>
<Typography component={"span"}>{children}</Typography> <Typography component="span">{children}</Typography>
</Box> </Box>
)} )}
</div> </div>

View File

@ -1,7 +1,7 @@
create or replace package PKG_P8PANELS_RRPCONFED as create or replace package PKG_P8PANELS_RRPCONFED as
/* Добавление раздела регламентированного отчёта */ /* Добавление раздела регламентированного отчёта */
procedure INSERT_RRPCONF_SECTIONS procedure RRPCONFSCTN_INSERT
( (
NPRN in number, -- Ид. настройки форм регламентированного отчёта NPRN in number, -- Ид. настройки форм регламентированного отчёта
SCODE in varchar2, -- Мнемокод SCODE in varchar2, -- Мнемокод
@ -10,7 +10,7 @@ create or replace package PKG_P8PANELS_RRPCONFED as
); );
/* Исправление раздела регламентированного отчёта */ /* Исправление раздела регламентированного отчёта */
procedure UPDATE_RRPCONF_SECTIONS procedure RRPCONFSCTN_UPDATE
( (
NRN in number, -- Ид. раздела NRN in number, -- Ид. раздела
SCODE in varchar2, -- Мнемокод раздела SCODE in varchar2, -- Мнемокод раздела
@ -18,13 +18,13 @@ create or replace package PKG_P8PANELS_RRPCONFED as
); );
/* Удаление раздела регламентированного отчёта */ /* Удаление раздела регламентированного отчёта */
procedure DELETE_RRPCONF_SECTIONS procedure RRPCONFSCTN_DELETE
( (
NRN in number -- Ид. раздела NRN in number -- Ид. раздела
); );
/* Добавление показателя раздела регламентированного отчёта */ /* Добавление показателя раздела регламентированного отчёта */
procedure INSERT_RRPCONF_COLUMNROW procedure RRPCONFSCTNMRK_INSERT
( (
NPRN in number, -- Ид. раздела NPRN in number, -- Ид. раздела
SCODE in varchar2, -- Мнемокод показателя раздела SCODE in varchar2, -- Мнемокод показателя раздела
@ -37,20 +37,20 @@ create or replace package PKG_P8PANELS_RRPCONFED as
); );
/* Исправление показателя раздела регламентированного отчёта */ /* Исправление показателя раздела регламентированного отчёта */
procedure UPDATE_RRPCONF_COLUMNROW procedure RRPCONFSCTNMRK_UPDATE
( (
NRN in number, -- Ид. показателя раздела NRN in number, -- Ид. показателя раздела
SNAME in varchar2 -- Новое наименование SNAME in varchar2 -- Новое наименование
); );
/* Удаление показателя раздела регламентированного отчёта */ /* Удаление показателя раздела регламентированного отчёта */
procedure DELETE_RRPCONF_COLUMNROW procedure RRPCONFSCTNMRK_DELETE
( (
NRN in number -- Ид. показателя раздела NRN in number -- Ид. показателя раздела
); );
/* Формирование кода и наименования показателя раздела регламентированного отчёта */ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
procedure GET_RRPCONFSCTNMRK_CODE_NAME procedure RRPCONFSCTNMRK_GET_CODE_NAME
( (
SSCTNCODE in varchar2, -- Мнемокод раздела SSCTNCODE in varchar2, -- Мнемокод раздела
SROWCODE in varchar2, -- Мнемокод строки SROWCODE in varchar2, -- Мнемокод строки
@ -58,6 +58,13 @@ create or replace package PKG_P8PANELS_RRPCONFED as
SCODE out varchar2, -- Мнемокод показателя раздела SCODE out varchar2, -- Мнемокод показателя раздела
SNAME out varchar2 -- Наименование показателя раздела SNAME out varchar2 -- Наименование показателя раздела
); );
/* Отбор показателя раздела по ид. */
procedure SELECT_RRPCONFSCTNMRK
(
NRN in number, -- Ид. показателя раздела
NIDENT out number -- Ид. буфера подобранных (списка отмеченных записей, null - не найдено)
);
/* Получение разделов регламентированного отчёта */ /* Получение разделов регламентированного отчёта */
procedure GET_RRPCONF_SECTIONS procedure GET_RRPCONF_SECTIONS
@ -71,7 +78,7 @@ end PKG_P8PANELS_RRPCONFED;
create or replace package body PKG_P8PANELS_RRPCONFED as create or replace package body PKG_P8PANELS_RRPCONFED as
/* Добавление раздела регламентированного отчёта */ /* Добавление раздела регламентированного отчёта */
procedure INSERT_RRPCONF_SECTIONS procedure RRPCONFSCTN_INSERT
( (
NPRN in number, -- Ид. настройки форм регламентированного отчёта NPRN in number, -- Ид. настройки форм регламентированного отчёта
SCODE in varchar2, -- Мнемокод SCODE in varchar2, -- Мнемокод
@ -95,10 +102,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
NLINKS_UPDATE => 0, NLINKS_UPDATE => 0,
NDUP_RN => null, NDUP_RN => null,
NRN => NRN); NRN => NRN);
end INSERT_RRPCONF_SECTIONS; end RRPCONFSCTN_INSERT;
/* Исправление раздела регламентированного отчёта */ /* Исправление раздела регламентированного отчёта */
procedure UPDATE_RRPCONF_SECTIONS procedure RRPCONFSCTN_UPDATE
( (
NRN in number, -- Ид. раздела NRN in number, -- Ид. раздела
SCODE in varchar2, -- Мнемокод раздела SCODE in varchar2, -- Мнемокод раздела
@ -120,10 +127,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
SCLSF_CODE => null, SCLSF_CODE => null,
NFORMULA_UPDATE => 0, NFORMULA_UPDATE => 0,
NMARK_UPDATE => 0); NMARK_UPDATE => 0);
end UPDATE_RRPCONF_SECTIONS; end RRPCONFSCTN_UPDATE;
/* Удаление раздела регламентированного отчёта */ /* Удаление раздела регламентированного отчёта */
procedure DELETE_RRPCONF_SECTIONS procedure RRPCONFSCTN_DELETE
( (
NRN in number -- Ид. раздела NRN in number -- Ид. раздела
) )
@ -131,10 +138,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
begin begin
P_RRPCONFSCTN_DELETE(NRN => NRN, NCOMPANY => NCOMPANY); P_RRPCONFSCTN_DELETE(NRN => NRN, NCOMPANY => NCOMPANY);
end DELETE_RRPCONF_SECTIONS; end RRPCONFSCTN_DELETE;
/* Добавление показателя раздела регламентированного отчёта */ /* Добавление показателя раздела регламентированного отчёта */
procedure INSERT_RRPCONF_COLUMNROW procedure RRPCONFSCTNMRK_INSERT
( (
NPRN in number, -- Ид. раздела NPRN in number, -- Ид. раздела
SCODE in varchar2, -- Мнемокод показателя раздела SCODE in varchar2, -- Мнемокод показателя раздела
@ -170,10 +177,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
SNOTE => null, SNOTE => null,
NDUP_RN => null, NDUP_RN => null,
NRN => NRN); NRN => NRN);
end INSERT_RRPCONF_COLUMNROW; end RRPCONFSCTNMRK_INSERT;
/* Исправление показателя раздела регламентированного отчёта */ /* Исправление показателя раздела регламентированного отчёта */
procedure UPDATE_RRPCONF_COLUMNROW procedure RRPCONFSCTNMRK_UPDATE
( (
NRN in number, -- Ид. показателя раздела NRN in number, -- Ид. показателя раздела
SNAME in varchar2 -- Новое наименование SNAME in varchar2 -- Новое наименование
@ -228,10 +235,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
SCLSF_CODE => null, SCLSF_CODE => null,
NFORMULA_UPDATE => 0, NFORMULA_UPDATE => 0,
SNOTE => null); SNOTE => null);
end UPDATE_RRPCONF_COLUMNROW; end RRPCONFSCTNMRK_UPDATE;
/* Удаление показателя раздела регламентированного отчёта */ /* Удаление показателя раздела регламентированного отчёта */
procedure DELETE_RRPCONF_COLUMNROW procedure RRPCONFSCTNMRK_DELETE
( (
NRN in number -- Ид. показателя раздела NRN in number -- Ид. показателя раздела
) )
@ -239,10 +246,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
begin begin
P_RRPCONFSCTNMRK_DELETE(NCOMPANY => NCOMPANY, NRN => NRN); P_RRPCONFSCTNMRK_DELETE(NCOMPANY => NCOMPANY, NRN => NRN);
end DELETE_RRPCONF_COLUMNROW; end RRPCONFSCTNMRK_DELETE;
/* Формирование кода и наименования показателя раздела регламентированного отчёта */ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
procedure GET_RRPCONFSCTNMRK_CODE_NAME procedure RRPCONFSCTNMRK_GET_CODE_NAME
( (
SSCTNCODE in varchar2, -- Мнемокод раздела SSCTNCODE in varchar2, -- Мнемокод раздела
SROWCODE in varchar2, -- Мнемокод строки SROWCODE in varchar2, -- Мнемокод строки
@ -267,7 +274,34 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
NCHANGE_NAME => 1, NCHANGE_NAME => 1,
NCHANGE_NAME_PARENT => 0, NCHANGE_NAME_PARENT => 0,
SNAME => SNAME); SNAME => SNAME);
end GET_RRPCONFSCTNMRK_CODE_NAME; end RRPCONFSCTNMRK_GET_CODE_NAME;
/* Отбор показателя раздела по ид. */
procedure SELECT_RRPCONFSCTNMRK
(
NRN in number, -- Ид. показателя раздела
NIDENT out number -- Ид. буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
begin
/* Сформируем идентификатор буфера */
if (NIDENT is null) then
NIDENT := GEN_IDENT();
end if;
/* Добавим подобранное в список отмеченных записей */
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
NCOMPANY => NCOMPANY,
NDOCUMENT => NRN,
SUNITCODE => 'RRPConfigSectionMark',
SACTIONCODE => null,
NCRN => null,
NDOCUMENT1 => null,
SUNITCODE1 => null,
SACTIONCODE1 => null,
NRN => NSELECTLIST);
end SELECT_RRPCONFSCTNMRK;
/* Получение разделов регламентированного отчёта */ /* Получение разделов регламентированного отчёта */
procedure GET_RRPCONF_SECTIONS procedure GET_RRPCONF_SECTIONS
@ -343,12 +377,13 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
and T.VERSION = NVERSION) and T.VERSION = NVERSION)
loop loop
/* Инициализируем таблицу данных */ /* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
/* Формируем структуру заголовка */ /* Формируем структуру заголовка */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SROW_NAME', SNAME => 'SROW_NAME',
SCAPTION => 'Наименование строки', SCAPTION => 'Наименование строки',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
NWIDTH => 150);
/* Цикл формирования колонок с графами */ /* Цикл формирования колонок с графами */
for CL in CN(C.NRN) for CL in CN(C.NRN)
loop loop