Compare commits

..

No commits in common. "0d03edbd17ef410da8d2fd5f3d894dd28b51e701" and "c6d21c83b5f00d77786676164db78c1934164023" have entirely different histories.

11 changed files with 120 additions and 105 deletions

View File

@ -59,7 +59,7 @@ const useUserProcDesc = ({ code, refresh }) => {
try { try {
setLoading(true); setLoading(true);
const data = await executeStored({ const data = await executeStored({
stored: "PKG_P8PANELS_PE.USERPROCS_DESC", stored: "PKG_P8PANELS_EDITOR.USERPROCS_DESC",
args: { SCODE: code }, args: { SCODE: code },
respArg: "COUT", respArg: "COUT",
isArray: name => name === "arguments", isArray: name => name === "arguments",

View File

@ -17,6 +17,10 @@ import {
Typography, Typography,
Divider, Divider,
Chip, Chip,
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button, Button,
TextField, TextField,
InputAdornment, InputAdornment,
@ -30,7 +34,6 @@ import {
import client from "../../../core/client"; //Клиент БД import client from "../../../core/client"; //Клиент БД
import { ApplicationСtx } from "../../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
import { BUTTONS } from "../../../../app.text"; //Общие текстовые ресурсы import { BUTTONS } from "../../../../app.text"; //Общие текстовые ресурсы
import { P8PDialog } from "../../../components/p8p_dialog"; //Типовой диалог
import { useUserProcDesc } from "./components_hooks"; //Общие хуки компонентов import { useUserProcDesc } from "./components_hooks"; //Общие хуки компонентов
import "../panels_editor.css"; //Стили редактора import "../panels_editor.css"; //Стили редактора
@ -165,9 +168,14 @@ EditorSubHeader.propTypes = {
const ConfigDialog = ({ title, children, onOk, onCancel }) => { const ConfigDialog = ({ title, children, onOk, onCancel }) => {
//Формирование представления //Формирование представления
return ( return (
<P8PDialog title={title} onOk={onOk} onCancel={onCancel}> <Dialog onClose={onCancel} open>
{children} <DialogTitle>{title}</DialogTitle>
</P8PDialog> <DialogContent>{children}</DialogContent>
<DialogActions>
<Button onClick={() => onOk && onOk()}>{BUTTONS.OK}</Button>
<Button onClick={() => onCancel && onCancel()}>{BUTTONS.CANCEL}</Button>
</DialogActions>
</Dialog>
); );
}; };

View File

@ -10,7 +10,7 @@
import React from "react"; //Классы React import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Typography, List, ListItem } from "@mui/material"; //Интерфейсные элементы import { Typography, List, ListItem } from "@mui/material"; //Интерфейсные элементы
import { P8PDialog } from "../../../components/p8p_dialog"; //Типовой диалог import { Form } from "./form"; //Типовая форма
//--------- //---------
//Константы //Константы
@ -53,7 +53,7 @@ const DialogHelp = ({ onClose }) => {
//Генерация содержимого //Генерация содержимого
return ( return (
<P8PDialog title={"Информация"} onClose={handleClose}> <Form title={"Информация"} onClose={handleClose}>
<Typography>Карточки показателей содержат сокращенную информацию о типе состава показателя. Список сокращений:</Typography> <Typography>Карточки показателей содержат сокращенную информацию о типе состава показателя. Список сокращений:</Typography>
<List disablePadding={true}> <List disablePadding={true}>
<HelpListItem name={"fx"} desc={"формула"} /> <HelpListItem name={"fx"} desc={"формула"} />
@ -71,7 +71,7 @@ const DialogHelp = ({ onClose }) => {
<HelpListItem name={"ДПНП"} desc={"декларация по налогу на прибыль"} /> <HelpListItem name={"ДПНП"} desc={"декларация по налогу на прибыль"} />
<HelpListItem name={"РО"} desc={"регламентированный отчет"} /> <HelpListItem name={"РО"} desc={"регламентированный отчет"} />
</List> </List>
</P8PDialog> </Form>
); );
}; };

View File

@ -10,7 +10,7 @@
import React from "react"; //Классы React import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { useDictionary } from "../hooks"; //Кастомные хуки import { useDictionary } from "../hooks"; //Кастомные хуки
import { P8PDialog } from "../../../components/p8p_dialog"; //Типовой диалог import { Form } from "./form"; //Типовая форма
//----------- //-----------
//Тело модуля //Тело модуля
@ -67,15 +67,15 @@ const DialogMarkIU = ({
//Генерация содержимого //Генерация содержимого
return ( return (
<P8PDialog <Form
title={`${insert === true ? "Добавление" : "Исправление"} показателя`} title={`${insert === true ? "Добавление" : "Исправление"} показателя`}
inputs={[ fields={[
{ name: "code", value: code, label: "Мнемокод" }, { elementCode: "code", elementValue: code, labelText: "Мнемокод" },
{ name: "name", value: name, label: "Наименование" }, { elementCode: "name", elementValue: name, labelText: "Наименование" },
{ name: "rowCode", value: rowCode, label: "Строка", dictionary: selectRow }, { elementCode: "rowCode", elementValue: rowCode, labelText: "Строка", dictionary: selectRow },
{ name: "rowVersion", value: rowVersion, label: "Редакция строки", disabled: true }, { elementCode: "rowVersion", elementValue: rowVersion, labelText: "Редакция строки", disabled: true },
{ name: "columnCode", value: columnCode, label: "Графа", dictionary: selectColumn }, { elementCode: "columnCode", elementValue: columnCode, labelText: "Графа", dictionary: selectColumn },
{ name: "columnVersion", value: columnVersion, label: "Редакция графы", disabled: true } { elementCode: "columnVersion", elementValue: columnVersion, labelText: "Редакция графы", disabled: true }
]} ]}
onOk={handleOk} onOk={handleOk}
onCancel={handleCancel} onCancel={handleCancel}

View File

@ -9,7 +9,7 @@
import React from "react"; //Классы React import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { P8PDialog } from "../../../components/p8p_dialog"; //Типовой диалог import { Form } from "./form"; //Типовая форма
import { COL_ROW_ORDER } from "../common"; //Обще стили и константы import { COL_ROW_ORDER } from "../common"; //Обще стили и константы
//----------- //-----------
@ -26,11 +26,11 @@ const DialogOrder = ({ rowOrder = 0, columnOrder = 0, onOk, onCancel }) => {
//Генерация содержимого //Генерация содержимого
return ( return (
<P8PDialog <Form
title={"Сортировка"} title={"Сортировка"}
inputs={[ fields={[
{ name: "rowOrder", value: rowOrder, label: "Строки", list: COL_ROW_ORDER }, { elementCode: "rowOrder", elementValue: rowOrder, labelText: "Строки", list: COL_ROW_ORDER },
{ name: "columnOrder", value: columnOrder, label: "Графы", list: COL_ROW_ORDER } { elementCode: "columnOrder", elementValue: columnOrder, labelText: "Графы", list: COL_ROW_ORDER }
]} ]}
onOk={handleOk} onOk={handleOk}
onCancel={handleCancel} onCancel={handleCancel}

View File

@ -9,7 +9,7 @@
import React from "react"; //Классы React import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { P8PDialog } from "../../../components/p8p_dialog"; //Типовой диалог import { Form } from "./form"; //Типовая форма
//----------- //-----------
//Тело модуля //Тело модуля
@ -25,11 +25,11 @@ const DialogSectionIU = ({ code = "", name = "", insert = true, onOk, onCancel }
//Генерация содержимого //Генерация содержимого
return ( return (
<P8PDialog <Form
title={`${insert === true ? "Добавление" : "Исправление"} раздела`} title={`${insert === true ? "Добавление" : "Исправление"} раздела`}
inputs={[ fields={[
{ name: "code", value: code, label: "Мнемокод" }, { elementCode: "code", elementValue: code, labelText: "Мнемокод" },
{ name: "name", value: name, label: "Наименование" } { elementCode: "name", elementValue: name, labelText: "Наименование" }
]} ]}
onOk={handleOk} onOk={handleOk}
onCancel={handleCancel} onCancel={handleCancel}

View File

@ -1,6 +1,6 @@
/* /*
Парус 8 - Панели мониторинга Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
Компонент: Диалог Компонент панели: Форма
*/ */
//--------------------- //---------------------
@ -10,33 +10,33 @@
import React, { useEffect, useState } from "react"; //Классы React import React, { useEffect, useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Dialog, DialogTitle, DialogContent, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты import { Dialog, DialogTitle, DialogContent, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты
import { BUTTONS } from "../../app.text"; //Общие текстовые ресурсы import { BUTTONS } from "../../../../app.text"; //Общие текстовые ресурсы
import { P8P_INPUT, P8PInput } from "./p8p_input"; //Поле ввода import { FORM_FILED, FormField } from "./form_field"; //Элемент формы
//----------- //-----------
//Тело модуля //Тело модуля
//----------- //-----------
//Диалог //Форма
const P8PDialog = ({ title, inputs = [], children, onOk, onCancel, onClose }) => { const Form = ({ title, fields = [], children, onOk, onCancel, onClose }) => {
//Состояние диалога //Состояние формы
const [state, setState] = useState({}); const [state, setState] = useState({});
//При изменении элемента ввода //При изменении элемента формы
const handleInputChange = (name, value) => setState(pv => ({ ...pv, [name]: value })); const handleFieldChange = (name, value) => setState(pv => ({ ...pv, [name]: value }));
//При нажатии на "ОК" диалога //При нажатии на "ОК" формы
const handleOk = () => onOk && onOk(state); const handleOk = () => onOk && onOk(state);
//При нажатии на "Отмена" диалога //При нажатии на "Отмена" формы
const handleCancel = () => onCancel && onCancel(); const handleCancel = () => onCancel && onCancel();
//При нажатии на "Закрыть" диалога //При нажатии на "Закрыть" формы
const handleClose = () => (onClose ? onClose() : onCancel ? onCancel() : null); const handleClose = () => (onClose ? onClose() : onCancel ? onCancel() : null);
//При подключении к старнице //При подключении к старнице
useEffect(() => { useEffect(() => {
setState(inputs.reduce((res, input) => ({ ...res, [input.name]: input.value == undefined ? null : input.value }), {})); setState(fields.reduce((res, f) => ({ ...res, [f.elementCode]: f.elementValue == undefined ? null : f.elementValue }), {}));
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, []); }, []);
@ -45,8 +45,8 @@ const P8PDialog = ({ title, inputs = [], children, onOk, onCancel, onClose }) =>
<Dialog onClose={handleClose} open> <Dialog onClose={handleClose} open>
<DialogTitle>{title}</DialogTitle> <DialogTitle>{title}</DialogTitle>
<DialogContent> <DialogContent>
{inputs.map((input, i) => ( {fields.map((f, i) => (
<P8PInput key={i} {...input} value={state[input.name]} formValues={state} onChange={handleInputChange} /> <FormField key={i} {...f} elementValue={state[f.elementCode]} formValues={state} onChange={handleFieldChange} />
))} ))}
{children} {children}
</DialogContent> </DialogContent>
@ -59,10 +59,10 @@ const P8PDialog = ({ title, inputs = [], children, onOk, onCancel, onClose }) =>
); );
}; };
//Контроль свойств - Диалог //Контроль свойств - Форма
P8PDialog.propTypes = { Form.propTypes = {
title: PropTypes.string.isRequired, title: PropTypes.string.isRequired,
inputs: PropTypes.arrayOf(PropTypes.shape(P8P_INPUT)), fields: PropTypes.arrayOf(PropTypes.shape(FORM_FILED)),
children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]), children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]),
onOk: PropTypes.func, onOk: PropTypes.func,
onCancel: PropTypes.func, onCancel: PropTypes.func,
@ -73,4 +73,4 @@ P8PDialog.propTypes = {
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { P8PDialog }; export { Form };

View File

@ -1,6 +1,6 @@
/* /*
Парус 8 - Панели мониторинга Парус 8 - Панели мониторинга - РО - Редактор настройки регламентированного отчёта
Компонент: Поле ввода Компонент панели: Поле ввода формы
*/ */
//--------------------- //---------------------
@ -15,11 +15,11 @@ import { Box, Icon, Input, InputAdornment, FormControl, Select, InputLabel, Menu
//Константы //Константы
//--------- //---------
//Формат свойств поля ввода //Формат свойств поля формы
const P8P_INPUT = { const FORM_FILED = {
name: PropTypes.string.isRequired, elementCode: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.instanceOf(Date)]), elementValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.instanceOf(Date)]),
label: PropTypes.string.isRequired, labelText: PropTypes.string.isRequired,
onChange: PropTypes.func, onChange: PropTypes.func,
dictionary: PropTypes.func, dictionary: PropTypes.func,
list: PropTypes.array, list: PropTypes.array,
@ -33,59 +33,71 @@ const P8P_INPUT = {
//Тело модуля //Тело модуля
//----------- //-----------
//Поле ввода //Поле ввода формы
const P8PInput = ({ name, value, label, onChange, dictionary, list, type, freeSolo = false, disabled = false, formValues, ...other }) => { const FormField = ({
elementCode,
elementValue,
labelText,
onChange,
dictionary,
list,
type,
freeSolo = false,
disabled = false,
formValues,
...other
}) => {
//Значение элемента //Значение элемента
const [currentValue, setCurrentValue] = useState(value); const [value, setValue] = useState(elementValue);
//При получении нового значения из вне //При получении нового значения из вне
useEffect(() => { useEffect(() => {
setCurrentValue(value); setValue(elementValue);
}, [value]); }, [elementValue]);
//Выбор значения из словаря //Выбор значения из словаря
const handleDictionaryClick = () => dictionary && dictionary(formValues, res => (res ? res.map(i => handleChangeByName(i.name, i.value)) : null)); const handleDictionaryClick = () => dictionary && dictionary(formValues, res => (res ? res.map(i => handleChangeByName(i.name, i.value)) : null));
//Изменение значения элемента (по событию) //Изменение значения элемента (по событию)
const handleChange = e => { const handleChange = e => {
setCurrentValue(e.target.value); setValue(e.target.value);
if (onChange) onChange(e.target.name, e.target.value); if (onChange) onChange(e.target.name, e.target.value);
}; };
//Изменение значения элемента (по имени и значению) //Изменение значения элемента (по имени и значению)
const handleChangeByName = (targetName, value) => { const handleChangeByName = (name, value) => {
if (targetName === name) setCurrentValue(value); if (name === elementCode) setValue(value);
if (onChange) onChange(targetName, value); if (onChange) onChange(name, value);
}; };
//Генерация содержимого //Генерация содержимого
return ( return (
<Box p={1}> <Box p={1}>
<FormControl variant={"standard"} fullWidth {...other}> <FormControl variant="standard" fullWidth {...other}>
{list ? ( {list ? (
freeSolo ? ( freeSolo ? (
<Autocomplete <Autocomplete
id={name} id={elementCode}
name={name} name={elementCode}
freeSolo freeSolo
disabled={disabled} disabled={disabled}
inputValue={currentValue ? currentValue : ""} inputValue={value ? value : ""}
onChange={(event, newValue) => handleChangeByName(name, newValue)} onChange={(event, newValue) => handleChangeByName(elementCode, newValue)}
onInputChange={(event, newInputValue) => handleChangeByName(name, newInputValue)} onInputChange={(event, newInputValue) => handleChangeByName(elementCode, newInputValue)}
options={list} options={list}
renderInput={params => <TextField {...params} label={label} name={name} variant={"standard"} />} renderInput={params => <TextField {...params} label={labelText} name={elementCode} variant={"standard"} />}
/> />
) : ( ) : (
<> <>
<InputLabel id={`${name}Lable`} shrink> <InputLabel id={`${elementCode}Lable`} shrink>
{label} {labelText}
</InputLabel> </InputLabel>
<Select <Select
labelId={`${name}Lable`} labelId={`${elementCode}Lable`}
id={name} id={elementCode}
name={name} name={elementCode}
label={label} label={labelText}
value={[undefined, null].includes(currentValue) ? "" : currentValue} value={[undefined, null].includes(value) ? "" : value}
onChange={handleChange} onChange={handleChange}
disabled={disabled} disabled={disabled}
displayEmpty displayEmpty
@ -100,17 +112,17 @@ const P8PInput = ({ name, value, label, onChange, dictionary, list, type, freeSo
) )
) : ( ) : (
<> <>
<InputLabel {...(type == "date" ? { shrink: true } : {})} htmlFor={name}> <InputLabel {...(type == "date" ? { shrink: true } : {})} htmlFor={elementCode}>
{label} {labelText}
</InputLabel> </InputLabel>
<Input <Input
id={name} id={elementCode}
name={name} name={elementCode}
value={currentValue ? currentValue : ""} value={value ? value : ""}
endAdornment={ endAdornment={
dictionary ? ( dictionary ? (
<InputAdornment position="end"> <InputAdornment position="end">
<IconButton aria-label={`${name} select`} onClick={handleDictionaryClick} edge="end"> <IconButton aria-label={`${elementCode} select`} onClick={handleDictionaryClick} edge="end">
<Icon>list</Icon> <Icon>list</Icon>
</IconButton> </IconButton>
</InputAdornment> </InputAdornment>
@ -127,11 +139,11 @@ const P8PInput = ({ name, value, label, onChange, dictionary, list, type, freeSo
); );
}; };
//Контроль свойств - Поле ввода //Контроль свойств - Поле ввода формы
P8PInput.propTypes = P8P_INPUT; FormField.propTypes = FORM_FILED;
//---------------- //----------------
//Интерфейс модуля //Интерфейс модуля
//---------------- //----------------
export { P8P_INPUT, P8PInput }; export { FORM_FILED, FormField };

View File

@ -103,14 +103,14 @@ const Marks = ({ marks, order, marksLoading, marksInit, onRefresh, onMarkInsert,
//При переходе к составу показателя //При переходе к составу показателя
const handleMarkCnOpen = (mark, constitution) => showMarkCn(mark, constitution, res => res.success && handleRefresh()); const handleMarkCnOpen = (mark, constitution) => showMarkCn(mark, constitution, res => res.success && handleRefresh());
//При закрытии диалога добавления/исправления по "ОК" //При закрытии формы добавления/исправления по "ОК"
const handleIUDialogOk = values => { const handleIUFormOk = values => {
if (modMark === true) onMarkInsert && onMarkInsert(values, res => res && setModMark(null)); if (modMark === true) onMarkInsert && onMarkInsert(values, res => res && setModMark(null));
else onMarkUpdate && onMarkUpdate({ ...modMark, ...values }, res => res && setModMark(null)); else onMarkUpdate && onMarkUpdate({ ...modMark, ...values }, res => res && setModMark(null));
}; };
//При закрытии диалога добавления/исправления по "Отмена" //При закрытии формы добавления/исправления по "Отмена"
const handleIUDialogCancel = () => setModMark(null); const handleIUFormCancel = () => setModMark(null);
//Формирование представления //Формирование представления
return ( return (
@ -118,12 +118,7 @@ const Marks = ({ marks, order, marksLoading, marksInit, onRefresh, onMarkInsert,
{dialogOrder && <DialogOrder {...order} onOk={handleOrderChange} onCancel={toggleOrderDialog} />} {dialogOrder && <DialogOrder {...order} onOk={handleOrderChange} onCancel={toggleOrderDialog} />}
{dialogHelp && <DialogHelp onClose={toggleHelpDialog} />} {dialogHelp && <DialogHelp onClose={toggleHelpDialog} />}
{modMark && ( {modMark && (
<DialogMarkIU <DialogMarkIU {...(modMark === true ? {} : modMark)} insert={modMark === true} onOk={handleIUFormOk} onCancel={handleIUFormCancel} />
{...(modMark === true ? {} : modMark)}
insert={modMark === true}
onOk={handleIUDialogOk}
onCancel={handleIUDialogCancel}
/>
)} )}
{marksInit && {marksInit &&
(marks ? ( (marks ? (

View File

@ -118,15 +118,15 @@ const Sections = ({ conf, onSectionChange, onSectionCountChange }) => {
//При удалении раздела настройки //При удалении раздела настройки
const handleSectionDelete = section => showMsgWarn("Удалить раздел?", () => deleteSection(section)); const handleSectionDelete = section => showMsgWarn("Удалить раздел?", () => deleteSection(section));
//При закрытии диалога добавления/исправления по "ОК" //При закрытии формы добавления/исправления по "ОК"
const handleIUDialogOk = async values => { const handleIUFormOk = async values => {
if (modSection === true) await insertSection({ conf, ...values }); if (modSection === true) await insertSection({ conf, ...values });
else await updateSection({ rn: modSection.NRN, ...values }); else await updateSection({ rn: modSection.NRN, ...values });
setModSection(null); setModSection(null);
}; };
//При закрытии диалога добавления/исправления по "Отмена" //При закрытии формы добавления/исправления по "Отмена"
const handleIUDialogCancel = () => setModSection(null); const handleIUFormCancel = () => setModSection(null);
//При изменении состава разделов //При изменении состава разделов
useEffect(() => { useEffect(() => {
@ -155,8 +155,8 @@ const Sections = ({ conf, onSectionChange, onSectionCountChange }) => {
code={modSection?.SCODE} code={modSection?.SCODE}
name={modSection?.SNAME} name={modSection?.SNAME}
insert={modSection === true} insert={modSection === true}
onOk={handleIUDialogOk} onOk={handleIUFormOk}
onCancel={handleIUDialogCancel} onCancel={handleIUFormCancel}
/> />
)} )}
{sections.length > 0 ? ( {sections.length > 0 ? (

View File

@ -1,4 +1,4 @@
create or replace package PKG_P8PANELS_PE as create or replace package PKG_P8PANELS_EDITOR as
/* Список аргументов пользовательской процедуры */ /* Список аргументов пользовательской процедуры */
procedure USERPROCS_DESC procedure USERPROCS_DESC
@ -7,9 +7,9 @@ create or replace package PKG_P8PANELS_PE as
COUT out clob -- Сериализованный список аргументов COUT out clob -- Сериализованный список аргументов
); );
end PKG_P8PANELS_PE; end PKG_P8PANELS_EDITOR;
/ /
create or replace package body PKG_P8PANELS_PE as create or replace package body PKG_P8PANELS_EDITOR as
/* Описание пользовательской процедуры */ /* Описание пользовательской процедуры */
procedure USERPROCS_DESC procedure USERPROCS_DESC
@ -123,5 +123,5 @@ create or replace package body PKG_P8PANELS_PE as
end if; end if;
end USERPROCS_DESC; end USERPROCS_DESC;
end PKG_P8PANELS_PE; end PKG_P8PANELS_EDITOR;
/ /