diff --git a/app/components/p8p_data_grid.js b/app/components/p8p_data_grid.js
index 77f8fcc..b8fc257 100644
--- a/app/components/p8p_data_grid.js
+++ b/app/components/p8p_data_grid.js
@@ -9,7 +9,6 @@
import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
-import { deepCopyObject } from "../core/utils"; //Вспомогательные процедуры и функции
import { P8PTable, P8P_TABLE_SIZE, P8P_TABLE_DATA_TYPE, P8P_TABLE_FILTER_SHAPE } from "./p8p_table"; //Таблица
//---------
@@ -55,7 +54,8 @@ const P8PDataGrid = ({
valueFormatter,
onOrderChanged,
onFilterChanged,
- onPagesCountChanged
+ onPagesCountChanged,
+ objectsCopier
}) => {
//Собственное состояние - сортировки
const [orders, setOrders] = useState([]);
@@ -65,7 +65,7 @@ const P8PDataGrid = ({
//При изменении состояния сортировки
const handleOrderChanged = ({ columnName, direction }) => {
- let newOrders = deepCopyObject(orders);
+ let newOrders = objectsCopier(orders);
const curOrder = newOrders.find(o => o.name == columnName);
if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);
if (direction != null && !curOrder) newOrders.push({ name: columnName, direction });
@@ -76,7 +76,7 @@ const P8PDataGrid = ({
//При изменении состояния фильтра
const handleFilterChanged = ({ columnName, from, to }) => {
- let newFilters = deepCopyObject(filters);
+ let newFilters = objectsCopier(filters);
let curFilter = newFilters.find(f => f.name == columnName);
if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);
if ((from != null || to != null) && !curFilter) newFilters.push({ name: columnName, from, to });
@@ -152,7 +152,8 @@ P8PDataGrid.propTypes = {
valueFormatter: PropTypes.func,
onOrderChanged: PropTypes.func,
onFilterChanged: PropTypes.func,
- onPagesCountChanged: PropTypes.func
+ onPagesCountChanged: PropTypes.func,
+ objectsCopier: PropTypes.func.isRequired
};
//----------------
diff --git a/app/context/application.js b/app/context/application.js
index 8f39821..1ace5b5 100644
--- a/app/context/application.js
+++ b/app/context/application.js
@@ -35,7 +35,7 @@ export const ApplicationСtx = createContext();
//Провайдер контекста приложения
export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, children }) => {
//Подключим редьюсер состояния
- const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE);
+ const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE(displaySizeGetter));
//Подключение к контексту взаимодействия с сервером
const { getConfig, getRespPayload } = useContext(BackEndСtx);
diff --git a/app/context/application_reducer.js b/app/context/application_reducer.js
index 54930fe..6fe80eb 100644
--- a/app/context/application_reducer.js
+++ b/app/context/application_reducer.js
@@ -3,12 +3,6 @@
Контекст: Приложение - редьюсер состояния
*/
-//---------------------
-//Подключение библиотек
-//---------------------
-
-import { getDisplaySize } from "../core/utils"; //Вспомогательные функции
-
//---------
//Константы
//---------
@@ -21,12 +15,12 @@ const APP_AT = {
};
//Состояние приложения по умолчанию
-const INITIAL_STATE = {
- displaySize: getDisplaySize(),
+const INITIAL_STATE = displaySizeGetter => ({
+ displaySize: displaySizeGetter(),
panels: [],
panelsLoaded: false,
initialized: false
-};
+});
//-----------
//Тело модуля
diff --git a/app/context/messaging.js b/app/context/messaging.js
index cde5fcd..fce41a8 100644
--- a/app/context/messaging.js
+++ b/app/context/messaging.js
@@ -12,7 +12,29 @@ import PropTypes from "prop-types"; //Контроль свойств компо
import { P8PAppProgress } from "../components/p8p_app_progress"; //Индикатор процесса
import { P8PAppMessage } from "../components/p8p_app_message"; //Диалог сообщения
import { MSG_AT, MSG_DLGT, INITIAL_STATE, messagingReducer } from "./messaging_reducer"; //Редьюсер состояния
-import { TITLES, TEXTS, BUTTONS } from "../../app.text"; //Текстовые ресурсы и константы
+
+//---------
+//Константы
+//---------
+
+//Структура объекта с описанием типовых заголовков
+const MESSAGING_CONTEXT_TITLES_SHAPE = PropTypes.shape({
+ ERR: PropTypes.string.isRequired,
+ WARN: PropTypes.string.isRequired,
+ INFO: PropTypes.string.isRequired
+});
+
+//Структура объекта с описанием типовых текстов
+const MESSAGING_CONTEXT_TEXTS_SHAPE = PropTypes.shape({
+ LOADING: PropTypes.string.isRequired
+});
+
+//Структура объекта с описанием типовых кнопок
+const MESSAGING_CONTEXT_BUTTONS_SHAPE = PropTypes.shape({
+ CLOSE: PropTypes.string.isRequired,
+ OK: PropTypes.string.isRequired,
+ CANCEL: PropTypes.string.isRequired
+});
//----------------
//Интерфейс модуля
@@ -22,7 +44,7 @@ import { TITLES, TEXTS, BUTTONS } from "../../app.text"; //Текстовые р
export const MessagingСtx = createContext();
//Провайдер контекста сообщений
-export const MessagingContext = ({ children }) => {
+export const MessagingContext = ({ titles, texts, buttons, children }) => {
//Подключим редьюсер состояния
const [state, dispatch] = useReducer(messagingReducer, INITIAL_STATE);
@@ -82,20 +104,20 @@ export const MessagingContext = ({ children }) => {
msgState: state
}}
>
- {state.loading ? : null}
+ {state.loading ? : null}
{state.msg ? (
) : null}
{children}
@@ -105,5 +127,8 @@ export const MessagingContext = ({ children }) => {
//Контроль свойств - Провайдер контекста сообщений
MessagingContext.propTypes = {
+ titles: MESSAGING_CONTEXT_TITLES_SHAPE,
+ texts: MESSAGING_CONTEXT_TEXTS_SHAPE,
+ buttons: MESSAGING_CONTEXT_BUTTONS_SHAPE,
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
};
diff --git a/app/panels/prj_fin/projects.js b/app/panels/prj_fin/projects.js
index f67c272..5b091f1 100644
--- a/app/panels/prj_fin/projects.js
+++ b/app/panels/prj_fin/projects.js
@@ -10,7 +10,7 @@
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 { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
+import { deepCopyObject, hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } from "../../../app.text"; //Тектовые ресурсы и константы
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
@@ -163,8 +163,8 @@ const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument, showProjectPa
{cardColumns.map((cardColumn, i) => (
-
- {cardColumn.caption}:
+
+ {cardColumn.caption}:
@@ -321,6 +321,7 @@ const Projects = ({ onStagesOpen }) => {
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
+ objectsCopier={deepCopyObject}
/>
) : null}
>
diff --git a/app/panels/prj_fin/stage_arts.js b/app/panels/prj_fin/stage_arts.js
index 7ef2931..bdc17d8 100644
--- a/app/panels/prj_fin/stage_arts.js
+++ b/app/panels/prj_fin/stage_arts.js
@@ -10,7 +10,7 @@
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Icon, Stack, Link } from "@mui/material"; //Интерфейсные компоненты
-import { hasValue, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
+import { deepCopyObject, hasValue, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } 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"; //Контекст взаимодействия с сервером
@@ -182,6 +182,7 @@ const StageArts = ({ stage, filters }) => {
dataCellRender={prms => dataCellRender(prms, showStageArtCostNotes, showStageArtContracts)}
valueFormatter={valueFormatter}
onFilterChanged={handleFilterChanged}
+ objectsCopier={deepCopyObject}
/>
) : null}
diff --git a/app/panels/prj_fin/stage_contracts.js b/app/panels/prj_fin/stage_contracts.js
index 48177b1..b02758d 100644
--- a/app/panels/prj_fin/stage_contracts.js
+++ b/app/panels/prj_fin/stage_contracts.js
@@ -10,7 +10,7 @@
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 { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
+import { deepCopyObject, hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } 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"; //Контекст взаимодействия с сервером
@@ -93,8 +93,8 @@ const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument) => {
{cardColumns.map((cardColumn, i) => (
-
- {cardColumn.caption}:
+
+ {cardColumn.caption}:
@@ -237,6 +237,7 @@ const StageContracts = ({ stage, filters }) => {
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
+ objectsCopier={deepCopyObject}
/>
) : null}
diff --git a/app/panels/prj_fin/stages.js b/app/panels/prj_fin/stages.js
index 5894236..6dfd9d9 100644
--- a/app/panels/prj_fin/stages.js
+++ b/app/panels/prj_fin/stages.js
@@ -10,7 +10,7 @@
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 { hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
+import { deepCopyObject, hasValue, formatDateRF, formatNumberRFCurrency, object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
import { BUTTONS, TEXTS, INPUTS } 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"; //Полноэкранный диалог
@@ -178,8 +178,8 @@ const rowExpandRender = ({ columnsDef, row }, pOnlineShowDocument, showStageArts
{cardColumns.map((cardColumn, i) => (
-
- {cardColumn.caption}:
+
+ {cardColumn.caption}:
@@ -372,6 +372,7 @@ const Stages = ({ project, projectName, filters }) => {
onOrderChanged={handleOrderChanged}
onFilterChanged={handleFilterChanged}
onPagesCountChanged={handlePagesCountChanged}
+ objectsCopier={deepCopyObject}
/>
) : null}
{stagesDataGrid.showStageContracts ? (
diff --git a/app/root.js b/app/root.js
index eaa22d3..f3c8c3e 100644
--- a/app/root.js
+++ b/app/root.js
@@ -12,7 +12,7 @@ import { MessagingContext } from "./context/messaging"; //Контекст со
import { BackEndContext } from "./context/backend"; //Контекст взаимодействия с сервером
import { ApplicationContext } from "./context/application"; //Контекст приложения
import { App } from "./app"; //Приложение
-import { ERRORS } from "../app.text"; //Текстовые ресурсы и константы
+import { ERRORS, TITLES, TEXTS, BUTTONS } from "../app.text"; //Текстовые ресурсы и константы
import { getDisplaySize, genGUID } from "./core/utils"; //Вспомогательные функции
import client from "./core/client"; //Клиент для взаимодействия с сервером
@@ -23,7 +23,7 @@ import client from "./core/client"; //Клиент для взаимодейст
//Обёртка для контекста
const Root = () => {
return (
-
+