WEB APP: Реализована обёртка для передачи настроечных свойств в компоненты, размер страницы данных вынесен в настройки приложения

This commit is contained in:
Mikhail Chechnev 2023-09-27 19:03:47 +03:00
parent 746f8a1e23
commit 38d940682e
9 changed files with 108 additions and 82 deletions

View File

@ -10,11 +10,13 @@
//Системеые параметры
const SYSTEM = {
//Адрес сервера приложений "ПАРУС 8 Онлайн"
SERVER: "../../DicAcc/"
SERVER: "../../DicAcc/",
//Количество записей на странице
PAGE_SIZE: 50
};
//----------------
//Интерфейс модуля
//----------------
export { SYSTEM };
export default { SYSTEM };

65
app/config_wrapper.js Normal file
View File

@ -0,0 +1,65 @@
/*
Парус 8 - Панели мониторинга
Обёртки для компонент, обеспечивающие подключение их к настройкам приложения
*/
//---------------------
//Подключение библиотек
//---------------------
import React from "react"; //Классы React
import { deepCopyObject } from "./core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } from "../app.text"; //Текстовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "./components/p8p_data_grid"; //Таблица данных
//---------
//Константы
//---------
//Конфигурируемые свойства "Таблицы данных" (P8PDataGrid)
const P8P_DATA_GRID_CONFIG_PROPS = {
orderAscMenuItemCaption: BUTTONS.ORDER_ASC,
orderDescMenuItemCaption: BUTTONS.ORDER_DESC,
filterMenuItemCaption: BUTTONS.FILTER,
valueFilterCaption: INPUTS.VALUE,
valueFromFilterCaption: INPUTS.VALUE_FROM,
valueToFilterCaption: INPUTS.VALUE_TO,
okFilterBtnCaption: BUTTONS.OK,
clearFilterBtnCaption: BUTTONS.CLEAR,
cancelFilterBtnCaption: BUTTONS.CANCEL,
morePagesBtnCaption: BUTTONS.MORE,
noDataFoundText: TEXTS.NO_DATA_FOUND,
objectsCopier: deepCopyObject
};
//-----------------------
//Вспомогательные функции
//-----------------------
//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов
const addConfigChildProps = children =>
React.Children.map(children, child => {
if (!React.isValidElement(child)) return child;
const { children, ...restProps } = child.props;
let configProps = {};
if (child.type.name === "P8PDataGrid") configProps = P8P_DATA_GRID_CONFIG_PROPS;
return React.createElement(child.type, { ...configProps, ...restProps }, addConfigChildProps(children));
});
//-----------
//Тело модуля
//-----------
//Обёртка для компонента "Таблица данных" (P8PDataGrid)
const P8PDataGridConfigWrapped = (props = {}) => {
return <P8PDataGrid {...P8P_DATA_GRID_CONFIG_PROPS} {...props} />;
};
//Универсальный элемент-обёртка в параметры конфигурации
const ConfigWrapper = ({ children }) => addConfigChildProps(children);
//----------------
//Интерфейс модуля
//----------------
export { P8P_DATA_GRID_CONFIG_PROPS, P8P_DATA_GRID_SIZE, P8PDataGridConfigWrapped, ConfigWrapper };

View File

@ -7,7 +7,7 @@
//Подключение библиотек
//---------------------
import React, { useReducer, createContext, useEffect, useContext, useCallback } from "react"; //ReactJS
import React, { useReducer, createContext, useEffect, useContext, useCallback, useMemo } from "react"; //ReactJS
import PropTypes from "prop-types"; //Контроль свойств компонента
import { APP_AT, INITIAL_STATE, applicationReducer } from "./application_reducer"; //Редьюсер состояния
import { MessagingСtx } from "./messaging"; //Контекст отображения сообщений
@ -33,7 +33,7 @@ const APPLICATION_CONTEXT_ERRORS_SHAPE = PropTypes.shape({
export const ApplicationСtx = createContext();
//Провайдер контекста приложения
export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, children }) => {
export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, config, children }) => {
//Подключим редьюсер состояния
const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE(displaySizeGetter));
@ -114,6 +114,9 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
[showMsgErr, errors.P8O_API_UNAVAILABLE]
);
//Получение количества записей на странице
const configSystemPageSize = useMemo(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);
//Инициализация приложения
const initApp = useCallback(async () => {
//Читаем конфигурацию с сервера
@ -147,6 +150,7 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
pOnlineShowDictionary,
pOnlineUserProcedure,
pOnlineUserReport,
configSystemPageSize,
appState: state
}}
>
@ -160,5 +164,6 @@ ApplicationContext.propTypes = {
errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,
displaySizeGetter: PropTypes.func,
guidGenerator: PropTypes.func.isRequired,
config: PropTypes.object.isRequired,
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
};

View File

@ -9,7 +9,7 @@
import { XMLParser, XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML
import dayjs from "dayjs"; //Работа с датами
import { SYSTEM } from "../../app.config"; //Настройки приложения
import config from "../../app.config"; //Настройки приложения
//---------
//Константы
@ -165,7 +165,7 @@ const executeStored = async ({ stored, args, respArg, throwError = true, spreadO
serverArgs.push({ XARGUMENT: { SNAME: arg, VALUE: value, SDATA_TYPE: dataType } });
}
res = await executeAction({
serverURL: `${SYSTEM.SERVER}${!SYSTEM.SERVER.endsWith("/") ? "/" : ""}Process`,
serverURL: `${config.SYSTEM.SERVER}${!config.SYSTEM.SERVER.endsWith("/") ? "/" : ""}Process`,
action: SRV_FN_CODE_EXEC_STORED,
payload: { SSTORED: stored, XARGUMENTS: serverArgs, SRESP_ARG: respArg },
isArray: (name, jPath) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX)
@ -189,7 +189,7 @@ const getConfig = async ({ throwError = true } = {}) => {
let res = null;
try {
res = await executeAction({
serverURL: `${SYSTEM.SERVER}${!SYSTEM.SERVER.endsWith("/") ? "/" : ""}GetConfig`
serverURL: `${config.SYSTEM.SERVER}${!config.SYSTEM.SERVER.endsWith("/") ? "/" : ""}GetConfig`
});
} catch (e) {
if (throwError) throw e;

View File

@ -10,20 +10,18 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Grid, Icon, Stack, Link, Button, Table, TableBody, TableRow, TableCell, Typography, Box, Paper, IconButton } from "@mui/material"; //Интерфейсные компоненты
import { deepCopyObject, hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
//-----------------------
//Вспомогательные функции
//-----------------------
//Количество записей на странице
const PAGE_SIZE = 50;
//Формирование значения для колонки "Состояние проекта"
const formatPrjStateValue = (value, addText = false) => {
const [text, icon] =
@ -227,7 +225,7 @@ const Projects = ({ onStagesOpen }) => {
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineShowDocument, pOnlineShowUnit } = useContext(ApplicationСtx);
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationСtx);
//Подключение к контексту сообщений
const { showMsgErr } = useContext(MessagingСtx);
@ -241,7 +239,7 @@ const Projects = ({ onStagesOpen }) => {
CFILTERS: { VALUE: object2Base64XML(projectsDataGrid.filters, { arrayNodeName: "filters" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
CORDERS: { VALUE: object2Base64XML(projectsDataGrid.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: projectsDataGrid.pageNumber,
NPAGE_SIZE: PAGE_SIZE,
NPAGE_SIZE: configSystemPageSize,
NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1
},
respArg: "COUT"
@ -252,7 +250,7 @@ const Projects = ({ onStagesOpen }) => {
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
dataLoaded: true,
reload: false,
morePages: (data.XROWS || []).length >= PAGE_SIZE
morePages: (data.XROWS || []).length >= configSystemPageSize
}));
}
}, [
@ -262,6 +260,7 @@ const Projects = ({ onStagesOpen }) => {
projectsDataGrid.dataLoaded,
projectsDataGrid.pageNumber,
executeStored,
configSystemPageSize,
SERV_DATA_TYPE_CLOB
]);
@ -297,23 +296,13 @@ const Projects = ({ onStagesOpen }) => {
<>
{projectsDataGrid.dataLoaded ? (
<P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={projectsDataGrid.columnsDef}
rows={projectsDataGrid.rows}
size={P8P_DATA_GRID_SIZE.SMALL}
morePages={projectsDataGrid.morePages}
reloading={projectsDataGrid.reload}
expandable={true}
orderAscMenuItemCaption={BUTTONS.ORDER_ASC}
orderDescMenuItemCaption={BUTTONS.ORDER_DESC}
filterMenuItemCaption={BUTTONS.FILTER}
valueFilterCaption={INPUTS.VALUE}
valueFromFilterCaption={INPUTS.VALUE_FROM}
valueToFilterCaption={INPUTS.VALUE_TO}
okFilterBtnCaption={BUTTONS.OK}
clearFilterBtnCaption={BUTTONS.CLEAR}
cancelFilterBtnCaption={BUTTONS.CANCEL}
morePagesBtnCaption={BUTTONS.MORE}
noDataFoundText={TEXTS.NO_DATA_FOUND}
headCellRender={headCellRender}
dataCellRender={prms => dataCellRender(prms, handleStagesOpen)}
rowExpandRender={prms => rowExpandRender(prms, pOnlineShowDocument, showProjectPayNotes, handleStagesOpen)}
@ -321,7 +310,6 @@ const Projects = ({ onStagesOpen }) => {
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
objectsCopier={deepCopyObject}
/>
) : null}
</>

View File

@ -10,12 +10,13 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Icon, Stack, Link } from "@mui/material"; //Интерфейсные компоненты
import { deepCopyObject, hasValue, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { hasValue, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
//-----------------------
//Вспомогательные функции
@ -162,27 +163,16 @@ const StageArts = ({ stage, filters }) => {
<Box pt={2}>
{stageArtsDataGrid.dataLoaded ? (
<P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={stageArtsDataGrid.columnsDef}
filtersInitial={filters}
rows={stageArtsDataGrid.rows}
size={P8P_DATA_GRID_SIZE.SMALL}
morePages={false}
reloading={stageArtsDataGrid.reload}
orderAscMenuItemCaption={BUTTONS.ORDER_ASC}
orderDescMenuItemCaption={BUTTONS.ORDER_DESC}
filterMenuItemCaption={BUTTONS.FILTER}
valueFilterCaption={INPUTS.VALUE}
valueFromFilterCaption={INPUTS.VALUE_FROM}
valueToFilterCaption={INPUTS.VALUE_TO}
okFilterBtnCaption={BUTTONS.OK}
clearFilterBtnCaption={BUTTONS.CLEAR}
cancelFilterBtnCaption={BUTTONS.CANCEL}
morePagesBtnCaption={BUTTONS.MORE}
noDataFoundText={TEXTS.NO_DATA_FOUND}
dataCellRender={prms => dataCellRender(prms, showStageArtCostNotes, showStageArtContracts)}
valueFormatter={valueFormatter}
onFilterChanged={handleFilterChanged}
objectsCopier={deepCopyObject}
/>
) : null}
</Box>

View File

@ -10,19 +10,16 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Stack, Grid, Paper, Table, TableBody, TableRow, TableCell, Typography, Button, Link } from "@mui/material"; //Интерфейсные компоненты
import { deepCopyObject, hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
//-----------------------
//Вспомогательные функции
//-----------------------
//Количество записей на странице
const PAGE_SIZE = 50;
//Форматирование значений колонок
const valueFormatter = ({ value, columnDef }) => {
switch (columnDef.name) {
@ -154,7 +151,7 @@ const StageContracts = ({ stage, filters }) => {
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineShowDocument } = useContext(ApplicationСtx);
const { pOnlineShowDocument, configSystemPageSize } = useContext(ApplicationСtx);
//Загрузка данных этапов с сервера
const loadStageContracts = useCallback(async () => {
@ -169,7 +166,7 @@ const StageContracts = ({ stage, filters }) => {
},
CORDERS: { VALUE: object2Base64XML(stageContractsDataGrid.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: stageContractsDataGrid.pageNumber,
NPAGE_SIZE: PAGE_SIZE,
NPAGE_SIZE: configSystemPageSize,
NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1
},
respArg: "COUT"
@ -180,7 +177,7 @@ const StageContracts = ({ stage, filters }) => {
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
dataLoaded: true,
reload: false,
morePages: (data.XROWS || []).length >= PAGE_SIZE
morePages: (data.XROWS || []).length >= configSystemPageSize
}));
}
}, [
@ -191,6 +188,7 @@ const StageContracts = ({ stage, filters }) => {
stageContractsDataGrid.dataLoaded,
stageContractsDataGrid.pageNumber,
executeStored,
configSystemPageSize,
SERV_DATA_TYPE_CLOB
]);
@ -213,6 +211,7 @@ const StageContracts = ({ stage, filters }) => {
<Box pt={2}>
{stageContractsDataGrid.dataLoaded ? (
<P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={stageContractsDataGrid.columnsDef}
filtersInitial={filters}
rows={stageContractsDataGrid.rows}
@ -220,24 +219,12 @@ const StageContracts = ({ stage, filters }) => {
morePages={stageContractsDataGrid.morePages}
reloading={stageContractsDataGrid.reload}
expandable={true}
orderAscMenuItemCaption={BUTTONS.ORDER_ASC}
orderDescMenuItemCaption={BUTTONS.ORDER_DESC}
filterMenuItemCaption={BUTTONS.FILTER}
valueFilterCaption={INPUTS.VALUE}
valueFromFilterCaption={INPUTS.VALUE_FROM}
valueToFilterCaption={INPUTS.VALUE_TO}
okFilterBtnCaption={BUTTONS.OK}
clearFilterBtnCaption={BUTTONS.CLEAR}
cancelFilterBtnCaption={BUTTONS.CANCEL}
morePagesBtnCaption={BUTTONS.MORE}
noDataFoundText={TEXTS.NO_DATA_FOUND}
dataCellRender={prms => dataCellRender(prms, pOnlineShowDocument)}
rowExpandRender={prms => rowExpandRender(prms, pOnlineShowDocument)}
valueFormatter={valueFormatter}
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
objectsCopier={deepCopyObject}
/>
) : null}
</Box>

View File

@ -10,8 +10,8 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Icon, Stack, Grid, Paper, Table, TableBody, TableRow, TableCell, Typography, Button, IconButton, Link } from "@mui/material"; //Интерфейсные компоненты
import { deepCopyObject, hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
import { StageArts } from "./stage_arts"; //Калькуляция этапа проекта
@ -19,14 +19,12 @@ import { StageContracts } from "./stage_contracts"; //Договоры с сои
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
//-----------------------
//Вспомогательные функции
//-----------------------
//Количество записей на странице
const PAGE_SIZE = 50;
//Формирование значения для колонки "Состояние"
const formatStageStatusValue = (value, addText = false) => {
const [text, icon] =
@ -250,7 +248,7 @@ const Stages = ({ project, projectName, filters }) => {
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineShowDocument, pOnlineShowUnit } = useContext(ApplicationСtx);
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationСtx);
//Подключение к контексту сообщений
const { showMsgErr } = useContext(MessagingСtx);
@ -265,7 +263,7 @@ const Stages = ({ project, projectName, filters }) => {
CFILTERS: { VALUE: object2Base64XML(stagesDataGrid.filters, { arrayNodeName: "filters" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
CORDERS: { VALUE: object2Base64XML(stagesDataGrid.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: stagesDataGrid.pageNumber,
NPAGE_SIZE: PAGE_SIZE,
NPAGE_SIZE: configSystemPageSize,
NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1
},
respArg: "COUT"
@ -276,7 +274,7 @@ const Stages = ({ project, projectName, filters }) => {
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
dataLoaded: true,
reload: false,
morePages: (data.XROWS || []).length >= PAGE_SIZE
morePages: (data.XROWS || []).length >= configSystemPageSize
}));
}
}, [
@ -287,6 +285,7 @@ const Stages = ({ project, projectName, filters }) => {
stagesDataGrid.dataLoaded,
stagesDataGrid.pageNumber,
executeStored,
configSystemPageSize,
SERV_DATA_TYPE_CLOB
]);
@ -345,6 +344,7 @@ const Stages = ({ project, projectName, filters }) => {
<Box pt={2}>
{stagesDataGrid.dataLoaded ? (
<P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={stagesDataGrid.columnsDef}
filtersInitial={filters}
rows={stagesDataGrid.rows}
@ -352,17 +352,6 @@ const Stages = ({ project, projectName, filters }) => {
morePages={stagesDataGrid.morePages}
reloading={stagesDataGrid.reload}
expandable={true}
orderAscMenuItemCaption={BUTTONS.ORDER_ASC}
orderDescMenuItemCaption={BUTTONS.ORDER_DESC}
filterMenuItemCaption={BUTTONS.FILTER}
valueFilterCaption={INPUTS.VALUE}
valueFromFilterCaption={INPUTS.VALUE_FROM}
valueToFilterCaption={INPUTS.VALUE_TO}
okFilterBtnCaption={BUTTONS.OK}
clearFilterBtnCaption={BUTTONS.CLEAR}
cancelFilterBtnCaption={BUTTONS.CANCEL}
morePagesBtnCaption={BUTTONS.MORE}
noDataFoundText={TEXTS.NO_DATA_FOUND}
headCellRender={headCellRender}
dataCellRender={prms => dataCellRender(prms, showStageArts)}
rowExpandRender={prms =>
@ -372,7 +361,6 @@ const Stages = ({ project, projectName, filters }) => {
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
objectsCopier={deepCopyObject}
/>
) : null}
{stagesDataGrid.showStageContracts ? (

View File

@ -14,6 +14,7 @@ import { ApplicationContext } from "./context/application"; //Контекст
import { App } from "./app"; //Приложение
import { ERRORS, TITLES, TEXTS, BUTTONS } from "../app.text"; //Текстовые ресурсы и константы
import { getDisplaySize, genGUID } from "./core/utils"; //Вспомогательные функции
import config from "../app.config"; //Настройки приложения
import client from "./core/client"; //Клиент для взаимодействия с сервером
//-----------
@ -25,7 +26,7 @@ const Root = () => {
return (
<MessagingContext titles={TITLES} texts={TEXTS} buttons={BUTTONS}>
<BackEndContext client={client}>
<ApplicationContext errors={ERRORS} displaySizeGetter={getDisplaySize} guidGenerator={genGUID}>
<ApplicationContext errors={ERRORS} displaySizeGetter={getDisplaySize} guidGenerator={genGUID} config={config}>
<App />
</ApplicationContext>
</BackEndContext>