diff --git a/README.md b/README.md
index 2163ed8..c076574 100644
--- a/README.md
+++ b/README.md
@@ -647,8 +647,8 @@ const MyPanel = () => {
В состав API входят:
- `pOnlineShowTab` - функция, отображение типовой закладки "ПАРУС 8 Онлайн"
-- `pOnlineShowUnit` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме
-- `pOnlineShowDocument` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме с позиционированием/отбором по документу
+- `pOnlineShowUnit` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме или на закладке
+- `pOnlineShowDocument` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме (или на закладке) с позиционированием/отбором по документу
- `pOnlineShowDictionary` - функция, отображение раздела "ПАРУС 8 Онлайн" в режиме словаря
- `pOnlineUserProcedure` - функция, исполнение "Пользовательской процедуры"
- `pOnlineUserReport` - функция, печать "Пользовательского отчёта"
@@ -684,13 +684,15 @@ const MyPanel = () => {
{
unitCode,
showMethod = "main",
- inputParameters
+ inputParameters,
+ modal = true
}
```
`unitCode` - обязательный, строка, код раздела Системы\
`showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\
-`inputParameters` - необязательный, массив объектов вида `[{name: ИМЯ_ПАРАМЕТРА, value: ЗНАЧЕНИЕ_ПАРАМЕТРА},...]`, параметры метода вызова раздела Системы
+`inputParameters` - необязательный, массив объектов вида `[{name: ИМЯ_ПАРАМЕТРА, value: ЗНАЧЕНИЕ_ПАРАМЕТРА},...]`, параметры метода вызова раздела Системы\
+`modal` - необязательный, логический, true (по умолчанию) - открыть в модальном окне, false - открыть в закладке (если закладка ранее была открыта с таким же набором параметров - она будет активирована), поддерживается для "ПАРУС 8 Онлайн" с версии 26.12.2024
**Результат:** функция не возвращает значимого результата
@@ -705,14 +707,16 @@ const MyPanel = () => {
unitCode,
document,
showMethod = "main",
- inRnParameter = "in_RN"
+ inRnParameter = "in_RN",
+ modal = true
}
```
`unitCode` - обязательный, строка, код раздела Системы\
`document` - обязательный, число, регистрационный номер документа или иной его идентификатор
`showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\
-`inRnParameter` - необязательный, строка, имя параметра метода вызова для позиционирования/отбора (если не указан, будет применён параметр метода вызова с именем "in_RN")
+`inRnParameter` - необязательный, строка, имя параметра метода вызова для позиционирования/отбора (если не указан, будет применён параметр метода вызова с именем "in_RN")\
+`modal` - необязательный, логический, true (по умолчанию) - открыть в модальном окне, false - открыть в закладке (если закладка ранее была открыта с таким же набором параметров - она будет активирована), поддерживается для "ПАРУС 8 Онлайн" с версии 26.12.2024
**Результат:** функция не возвращает значимого результата
@@ -1351,7 +1355,7 @@ const MyPanel = () => {
`PKG_P8PANELS_VISUAL.TDG_TO_XML` - функция, производит сериализацию объекта, описывающего таблицу данных, в специальный XML-формат, корректно интерпретируемый клиентским компонентом `P8PDataGrid` при передаче в WEB-приложение\
`PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния сортировок в коллекцию формата `TORDERS`, на вход принимает `CLOB` с сериализованным состоянием сортировок таблицы в виде `BASE64(ИМЯASC|DESC...)` (клиентское приложение должно обеспечить передачу состояния сортировок в этом формате, см. пример ниже)\
`PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY` - процедура, вспомогательная утилита, производит в тексте SQL-запроса, поданного на вход, замену указанного шаблона на конструкцию `order by`, сформированную с учётом переданной коллекции `RORDERS`\
-`PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния фильтров в коллекцию формата `TFILTERS`, на вход принимает `CLOB` с сериализованным состоянием фильтров таблицы в виде `BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)` (клиентское приложение должно обеспечить передачу состояния фильтров в этом формате, см. пример ниже)\
+`PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния фильтров в коллекцию формата `TDG_FILTERS`, на вход принимает `CLOB` с сериализованным состоянием фильтров таблицы в виде `BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)` (клиентское приложение должно обеспечить передачу состояния фильтров в этом формате, см. пример ниже)\
`PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY` - процедура, вспомогательная утилита, производит вызов указанной серверной процедуры отбора с учётом переданных переменных окружения и значений в `RFILTERS`\
`PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC` - процедура, вспомогательная утилита, служит для конвертации номера страницы данных и размера страницы данных в границы диапазона строк выборки (как правило, клиентскому приложению удобнее прислать на сервер текущий номер страницы и её размер, в то время к в запросах, для выборки, удобнее применять границы диапазонов строк)
diff --git a/app.text.js b/app.text.js
index 131baf9..f6e8b7c 100644
--- a/app.text.js
+++ b/app.text.js
@@ -53,6 +53,7 @@ export const CAPTIONS = {
export const ERRORS = {
UNDER_CONSTRUCTION: "Панель в разработке",
P8O_API_UNAVAILABLE: '"ПАРУС 8 Онлайн" недоступен',
+ P8O_API_UNSUPPORTED: 'Функция "ПАРУС 8 Онлайн" не поддерживается',
DEFAULT: "Неожиданная ошибка"
};
diff --git a/app/components/p8p_app_workspace.js b/app/components/p8p_app_workspace.js
index 88a37fd..334ad76 100644
--- a/app/components/p8p_app_workspace.js
+++ b/app/components/p8p_app_workspace.js
@@ -23,7 +23,8 @@ import {
ListItemIcon,
ListItemText
} from "@mui/material"; //Интерфейсные компоненты
-import { P8PPanelsMenuDrawer, P8P_PANELS_MENU_PANEL_SHAPE } from "./p8p_panels_menu";
+import { P8PPanelsMenuDrawer, P8P_PANELS_MENU_PANEL_SHAPE } from "./p8p_panels_menu"; //Меню
+import { APP_STYLES } from "../../app.styles"; //Типовые стили
//---------
//Константы
@@ -34,6 +35,7 @@ const APP_BAR_HEIGHT = "64px";
//Стили
const STYLES = {
+ DRAWER: { [`& .MuiDrawer-paper`]: { ...APP_STYLES.SCROLL } },
ROOT_BOX: { display: "flex" },
APP_BAR: { position: "fixed" },
APP_BAR_BUTTON: { mr: 2 },
@@ -88,7 +90,7 @@ const P8PAppWorkspace = ({ children, panels = [], selectedPanel, closeCaption, h
-
+
diff --git a/app/components/p8p_fullscreen_dialog.js b/app/components/p8p_fullscreen_dialog.js
index c51a4ff..b37fd3a 100644
--- a/app/components/p8p_fullscreen_dialog.js
+++ b/app/components/p8p_fullscreen_dialog.js
@@ -27,7 +27,7 @@ const STYLES = {
//-----------
//Полноэкранный диалог
-const P8PFullScreenDialog = ({ title, onClose, children }) => {
+const P8PFullScreenDialog = ({ title, onClose, contentProps, children }) => {
const handleClose = () => {
onClose ? onClose() : null;
};
@@ -46,7 +46,7 @@ const P8PFullScreenDialog = ({ title, onClose, children }) => {
- {children}
+ {children}
);
};
@@ -55,7 +55,8 @@ const P8PFullScreenDialog = ({ title, onClose, children }) => {
P8PFullScreenDialog.propTypes = {
title: PropTypes.string.isRequired,
onClose: PropTypes.func,
- children: PropTypes.element
+ children: PropTypes.element,
+ contentProps: PropTypes.object
};
//----------------
diff --git a/app/context/application.js b/app/context/application.js
index d613fcc..6ff8919 100644
--- a/app/context/application.js
+++ b/app/context/application.js
@@ -22,7 +22,8 @@ const P8O_API = window.top?.parus?.clientApi;
//Структура объекта с описанием ошибок
const APPLICATION_CONTEXT_ERRORS_SHAPE = PropTypes.shape({
- P8O_API_UNAVAILABLE: PropTypes.string.isRequired
+ P8O_API_UNAVAILABLE: PropTypes.string.isRequired,
+ P8O_API_UNSUPPORTED: PropTypes.string.isRequired
});
//----------------
@@ -72,21 +73,38 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
//Отображение раздела "ПАРУС 8 Онлайн"
const pOnlineShowUnit = useCallback(
- ({ unitCode, showMethod = "main", inputParameters }) => {
- if (P8O_API) P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters });
+ ({ unitCode, showMethod = "main", inputParameters, modal = true }) => {
+ if (P8O_API)
+ modal
+ ? P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters })
+ : P8O_API.fn.openDocument
+ ? P8O_API.fn.openDocument({ unitcode: unitCode, method: showMethod, inputParameters })
+ : showMsgErr(errors.P8O_API_UNSUPPORTED);
else showMsgErr(errors.P8O_API_UNAVAILABLE);
},
- [showMsgErr, errors.P8O_API_UNAVAILABLE]
+ [showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED]
);
//Отображение документа "ПАРУС 8 Онлайн"
const pOnlineShowDocument = useCallback(
- ({ unitCode, document, showMethod = "main", inRnParameter = "in_RN" }) => {
+ ({ unitCode, document, showMethod = "main", inRnParameter = "in_RN", modal = true }) => {
if (P8O_API)
- P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters: [{ name: inRnParameter, value: document }] });
+ modal
+ ? P8O_API.fn.openDocumentModal({
+ unitcode: unitCode,
+ method: showMethod,
+ inputParameters: [{ name: inRnParameter, value: document }]
+ })
+ : P8O_API.fn.openDocument
+ ? P8O_API.fn.openDocument({
+ unitcode: unitCode,
+ method: showMethod,
+ inputParameters: [{ name: inRnParameter, value: document }]
+ })
+ : showMsgErr(errors.P8O_API_UNSUPPORTED);
else showMsgErr(errors.P8O_API_UNAVAILABLE);
},
- [showMsgErr, errors.P8O_API_UNAVAILABLE]
+ [showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED]
);
//Отображение словаря "ПАРУС 8 Онлайн"
diff --git a/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js b/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js
index 46225a3..90fcf63 100644
--- a/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js
+++ b/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js
@@ -27,6 +27,7 @@ import {
Icon
} from "@mui/material"; //Интерфейсные элементы
import { ThemeProvider } from "@mui/material/styles"; //Подключение темы
+import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { PlanSpecsList } from "./components/plans_list"; //Список планов
import { PlanSpecDetail } from "./components/plan_detail"; //Детали плана
import { lightTheme, darkTheme } from "./styles/themes"; //Стиль темы
@@ -63,7 +64,8 @@ const STYLES = {
display: "inline-block",
boxSizing: "border-box",
backgroundColor: "background.plans_drawer_paper",
- color: "text.plans_finder.fontColor"
+ color: "text.plans_finder.fontColor",
+ ...APP_STYLES.SCROLL
}
},
PLANS_LIST_BOX: { paddingTop: "20px" },
diff --git a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js
index 5d97e7d..ae7643b 100644
--- a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js
+++ b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js
@@ -10,6 +10,7 @@
import React, { useContext, useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField } from "@mui/material"; //Интерфейсные элементы
+import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { CostJobsSpecsDataGrid } from "./fcjobssp"; //Собственные хуки таблиц
import { useCostJobs, useFilteredFcjobs } from "./hooks"; //Вспомогательные хуки
@@ -35,7 +36,7 @@ const STYLES = {
width: "350px",
display: "inline-block",
flexShrink: 0,
- [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
+ [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL }
},
CONTAINER: { textAlign: "center" }
};
diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
index ea989a4..8c009b2 100644
--- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
+++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
@@ -43,11 +43,12 @@ import { MessagingСtx } from "../../context/messaging"; //Контекст со
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
+import { APP_STYLES } from "../../../app.styles"; //Типовые стили
import { P8PGantt, taskLegendDesc } from "../../components/p8p_gantt"; //Диаграмма Ганта
import { xml2JSON, formatDateJSONDateOnly, formatDateRF, hasValue } from "../../core/utils"; //Вспомогательные функции
import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки
-import { CostRouteListsDataGrid } from "./datagrids/fcroutlst";
-import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps";
+import { CostRouteListsDataGrid } from "./datagrids/fcroutlst"; //Таблица "Маршрутные листы"
+import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps"; //Таблица "Приходы из подразделений"
//---------
//Константы
@@ -72,7 +73,7 @@ const STYLES = {
width: "350px",
display: "inline-block",
flexShrink: 0,
- [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
+ [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL }
},
GANTT_CONTAINER: { height: `calc(100vh - ${APP_BAR_HEIGHT})`, width: "100vw", paddingTop: "24px" },
GANTT_TITLE: { paddingLeft: "250px", paddingRight: "250px" },
diff --git a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js
index 4dbde82..f037bb1 100644
--- a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js
+++ b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js
@@ -41,7 +41,7 @@ const STYLES = {
width: "350px",
display: "inline-block",
flexShrink: 0,
- [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
+ [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL }
},
CONTAINER: { textAlign: "center" },
TITLE: { height: TITLE_HEIGHT, overflow: "hidden", paddingTop: TITLE_PADDING_TOP, paddingBottom: TITLE_PADDING_BOTTOM, display: "inline-table" },
diff --git a/app/panels/prj_fin/layouts.js b/app/panels/prj_fin/layouts.js
index 0984959..d3488d7 100644
--- a/app/panels/prj_fin/layouts.js
+++ b/app/panels/prj_fin/layouts.js
@@ -23,6 +23,13 @@ export const PANEL_UNITS = {
PROJECT_STAGE_ARTS: "PROJECT_STAGE_ARTS"
};
+//Общие стили
+export const COMMON_PROJECTS_STYLES = {
+ FULL_SCREEN_DIALOG_CONTENT: {
+ padding: 0
+ }
+};
+
//-----------
//Тело модуля
//-----------
@@ -250,6 +257,7 @@ export const rowExpandRender = ({
columnsDef,
row,
pOnlineShowDocument,
+ pOnlineShowUnit,
showStages,
showPayNotes,
showCostNotes,
@@ -275,42 +283,55 @@ export const rowExpandRender = ({
const linkButtons = () =>
panelUnit === PANEL_UNITS.PROJECTS ? (
<>
-