Merge pull request 'main' (#7) from CITKParus/P8-Panels:main into main
Reviewed-on: Dollerok/P8-Panels#7
This commit is contained in:
commit
49c28750f6
18
README.md
18
README.md
@ -647,8 +647,8 @@ const MyPanel = () => {
|
|||||||
В состав API входят:
|
В состав API входят:
|
||||||
|
|
||||||
- `pOnlineShowTab` - функция, отображение типовой закладки "ПАРУС 8 Онлайн"
|
- `pOnlineShowTab` - функция, отображение типовой закладки "ПАРУС 8 Онлайн"
|
||||||
- `pOnlineShowUnit` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме
|
- `pOnlineShowUnit` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме или на закладке
|
||||||
- `pOnlineShowDocument` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме с позиционированием/отбором по документу
|
- `pOnlineShowDocument` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме (или на закладке) с позиционированием/отбором по документу
|
||||||
- `pOnlineShowDictionary` - функция, отображение раздела "ПАРУС 8 Онлайн" в режиме словаря
|
- `pOnlineShowDictionary` - функция, отображение раздела "ПАРУС 8 Онлайн" в режиме словаря
|
||||||
- `pOnlineUserProcedure` - функция, исполнение "Пользовательской процедуры"
|
- `pOnlineUserProcedure` - функция, исполнение "Пользовательской процедуры"
|
||||||
- `pOnlineUserReport` - функция, печать "Пользовательского отчёта"
|
- `pOnlineUserReport` - функция, печать "Пользовательского отчёта"
|
||||||
@ -684,13 +684,15 @@ const MyPanel = () => {
|
|||||||
{
|
{
|
||||||
unitCode,
|
unitCode,
|
||||||
showMethod = "main",
|
showMethod = "main",
|
||||||
inputParameters
|
inputParameters,
|
||||||
|
modal = true
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`unitCode` - обязательный, строка, код раздела Системы\
|
`unitCode` - обязательный, строка, код раздела Системы\
|
||||||
`showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\
|
`showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\
|
||||||
`inputParameters` - необязательный, массив объектов вида `[{name: ИМЯ_ПАРАМЕТРА, value: ЗНАЧЕНИЕ_ПАРАМЕТРА},...]`, параметры метода вызова раздела Системы
|
`inputParameters` - необязательный, массив объектов вида `[{name: ИМЯ_ПАРАМЕТРА, value: ЗНАЧЕНИЕ_ПАРАМЕТРА},...]`, параметры метода вызова раздела Системы\
|
||||||
|
`modal` - необязательный, логический, true (по умолчанию) - открыть в модальном окне, false - открыть в закладке (если закладка ранее была открыта с таким же набором параметров - она будет активирована), поддерживается для "ПАРУС 8 Онлайн" с версии 26.12.2024
|
||||||
|
|
||||||
**Результат:** функция не возвращает значимого результата
|
**Результат:** функция не возвращает значимого результата
|
||||||
|
|
||||||
@ -705,14 +707,16 @@ const MyPanel = () => {
|
|||||||
unitCode,
|
unitCode,
|
||||||
document,
|
document,
|
||||||
showMethod = "main",
|
showMethod = "main",
|
||||||
inRnParameter = "in_RN"
|
inRnParameter = "in_RN",
|
||||||
|
modal = true
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
`unitCode` - обязательный, строка, код раздела Системы\
|
`unitCode` - обязательный, строка, код раздела Системы\
|
||||||
`document` - обязательный, число, регистрационный номер документа или иной его идентификатор
|
`document` - обязательный, число, регистрационный номер документа или иной его идентификатор
|
||||||
`showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\
|
`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_TO_XML` - функция, производит сериализацию объекта, описывающего таблицу данных, в специальный XML-формат, корректно интерпретируемый клиентским компонентом `P8PDataGrid` при передаче в WEB-приложение\
|
||||||
`PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния сортировок в коллекцию формата `TORDERS`, на вход принимает `CLOB` с сериализованным состоянием сортировок таблицы в виде `BASE64(<orders><name>ИМЯ</name><direction>ASC|DESC</direction></orders>...)` (клиентское приложение должно обеспечить передачу состояния сортировок в этом формате, см. пример ниже)\
|
`PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния сортировок в коллекцию формата `TORDERS`, на вход принимает `CLOB` с сериализованным состоянием сортировок таблицы в виде `BASE64(<orders><name>ИМЯ</name><direction>ASC|DESC</direction></orders>...)` (клиентское приложение должно обеспечить передачу состояния сортировок в этом формате, см. пример ниже)\
|
||||||
`PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY` - процедура, вспомогательная утилита, производит в тексте SQL-запроса, поданного на вход, замену указанного шаблона на конструкцию `order by`, сформированную с учётом переданной коллекции `RORDERS`\
|
`PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY` - процедура, вспомогательная утилита, производит в тексте SQL-запроса, поданного на вход, замену указанного шаблона на конструкцию `order by`, сформированную с учётом переданной коллекции `RORDERS`\
|
||||||
`PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния фильтров в коллекцию формата `TFILTERS`, на вход принимает `CLOB` с сериализованным состоянием фильтров таблицы в виде `BASE64(<filters><name>ИМЯ</name><from>ЗНАЧЕНИЕ</from><to>ЗНАЧЕНИЕ</to></filters>...)` (клиентское приложение должно обеспечить передачу состояния фильтров в этом формате, см. пример ниже)\
|
`PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния фильтров в коллекцию формата `TDG_FILTERS`, на вход принимает `CLOB` с сериализованным состоянием фильтров таблицы в виде `BASE64(<filters><name>ИМЯ</name><from>ЗНАЧЕНИЕ</from><to>ЗНАЧЕНИЕ</to></filters>...)` (клиентское приложение должно обеспечить передачу состояния фильтров в этом формате, см. пример ниже)\
|
||||||
`PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY` - процедура, вспомогательная утилита, производит вызов указанной серверной процедуры отбора с учётом переданных переменных окружения и значений в `RFILTERS`\
|
`PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY` - процедура, вспомогательная утилита, производит вызов указанной серверной процедуры отбора с учётом переданных переменных окружения и значений в `RFILTERS`\
|
||||||
`PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC` - процедура, вспомогательная утилита, служит для конвертации номера страницы данных и размера страницы данных в границы диапазона строк выборки (как правило, клиентскому приложению удобнее прислать на сервер текущий номер страницы и её размер, в то время к в запросах, для выборки, удобнее применять границы диапазонов строк)
|
`PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC` - процедура, вспомогательная утилита, служит для конвертации номера страницы данных и размера страницы данных в границы диапазона строк выборки (как правило, клиентскому приложению удобнее прислать на сервер текущий номер страницы и её размер, в то время к в запросах, для выборки, удобнее применять границы диапазонов строк)
|
||||||
|
|
||||||
|
@ -53,6 +53,7 @@ export const CAPTIONS = {
|
|||||||
export const ERRORS = {
|
export const ERRORS = {
|
||||||
UNDER_CONSTRUCTION: "Панель в разработке",
|
UNDER_CONSTRUCTION: "Панель в разработке",
|
||||||
P8O_API_UNAVAILABLE: '"ПАРУС 8 Онлайн" недоступен',
|
P8O_API_UNAVAILABLE: '"ПАРУС 8 Онлайн" недоступен',
|
||||||
|
P8O_API_UNSUPPORTED: 'Функция "ПАРУС 8 Онлайн" не поддерживается',
|
||||||
DEFAULT: "Неожиданная ошибка"
|
DEFAULT: "Неожиданная ошибка"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ import {
|
|||||||
ListItemIcon,
|
ListItemIcon,
|
||||||
ListItemText
|
ListItemText
|
||||||
} from "@mui/material"; //Интерфейсные компоненты
|
} 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 = {
|
const STYLES = {
|
||||||
|
DRAWER: { [`& .MuiDrawer-paper`]: { ...APP_STYLES.SCROLL } },
|
||||||
ROOT_BOX: { display: "flex" },
|
ROOT_BOX: { display: "flex" },
|
||||||
APP_BAR: { position: "fixed" },
|
APP_BAR: { position: "fixed" },
|
||||||
APP_BAR_BUTTON: { mr: 2 },
|
APP_BAR_BUTTON: { mr: 2 },
|
||||||
@ -88,7 +90,7 @@ const P8PAppWorkspace = ({ children, panels = [], selectedPanel, closeCaption, h
|
|||||||
</Typography>
|
</Typography>
|
||||||
</Toolbar>
|
</Toolbar>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
<Drawer anchor="left" open={open} onClose={handleDrawerClose}>
|
<Drawer anchor="left" open={open} onClose={handleDrawerClose} sx={STYLES.DRAWER}>
|
||||||
<List>
|
<List>
|
||||||
<ListItemButton onClick={handleDrawerClose}>
|
<ListItemButton onClick={handleDrawerClose}>
|
||||||
<ListItemIcon>
|
<ListItemIcon>
|
||||||
|
@ -27,7 +27,7 @@ const STYLES = {
|
|||||||
//-----------
|
//-----------
|
||||||
|
|
||||||
//Полноэкранный диалог
|
//Полноэкранный диалог
|
||||||
const P8PFullScreenDialog = ({ title, onClose, children }) => {
|
const P8PFullScreenDialog = ({ title, onClose, contentProps, children }) => {
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
onClose ? onClose() : null;
|
onClose ? onClose() : null;
|
||||||
};
|
};
|
||||||
@ -46,7 +46,7 @@ const P8PFullScreenDialog = ({ title, onClose, children }) => {
|
|||||||
</Toolbar>
|
</Toolbar>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
<DialogContent>{children}</DialogContent>
|
<DialogContent {...(contentProps ? contentProps : {})}>{children}</DialogContent>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@ -55,7 +55,8 @@ const P8PFullScreenDialog = ({ title, onClose, children }) => {
|
|||||||
P8PFullScreenDialog.propTypes = {
|
P8PFullScreenDialog.propTypes = {
|
||||||
title: PropTypes.string.isRequired,
|
title: PropTypes.string.isRequired,
|
||||||
onClose: PropTypes.func,
|
onClose: PropTypes.func,
|
||||||
children: PropTypes.element
|
children: PropTypes.element,
|
||||||
|
contentProps: PropTypes.object
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
@ -22,7 +22,8 @@ const P8O_API = window.top?.parus?.clientApi;
|
|||||||
|
|
||||||
//Структура объекта с описанием ошибок
|
//Структура объекта с описанием ошибок
|
||||||
const APPLICATION_CONTEXT_ERRORS_SHAPE = PropTypes.shape({
|
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 Онлайн"
|
//Отображение раздела "ПАРУС 8 Онлайн"
|
||||||
const pOnlineShowUnit = useCallback(
|
const pOnlineShowUnit = useCallback(
|
||||||
({ unitCode, showMethod = "main", inputParameters }) => {
|
({ unitCode, showMethod = "main", inputParameters, modal = true }) => {
|
||||||
if (P8O_API) P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters });
|
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);
|
else showMsgErr(errors.P8O_API_UNAVAILABLE);
|
||||||
},
|
},
|
||||||
[showMsgErr, errors.P8O_API_UNAVAILABLE]
|
[showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED]
|
||||||
);
|
);
|
||||||
|
|
||||||
//Отображение документа "ПАРУС 8 Онлайн"
|
//Отображение документа "ПАРУС 8 Онлайн"
|
||||||
const pOnlineShowDocument = useCallback(
|
const pOnlineShowDocument = useCallback(
|
||||||
({ unitCode, document, showMethod = "main", inRnParameter = "in_RN" }) => {
|
({ unitCode, document, showMethod = "main", inRnParameter = "in_RN", modal = true }) => {
|
||||||
if (P8O_API)
|
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);
|
else showMsgErr(errors.P8O_API_UNAVAILABLE);
|
||||||
},
|
},
|
||||||
[showMsgErr, errors.P8O_API_UNAVAILABLE]
|
[showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED]
|
||||||
);
|
);
|
||||||
|
|
||||||
//Отображение словаря "ПАРУС 8 Онлайн"
|
//Отображение словаря "ПАРУС 8 Онлайн"
|
||||||
|
@ -27,6 +27,7 @@ import {
|
|||||||
Icon
|
Icon
|
||||||
} from "@mui/material"; //Интерфейсные элементы
|
} from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ThemeProvider } from "@mui/material/styles"; //Подключение темы
|
import { ThemeProvider } from "@mui/material/styles"; //Подключение темы
|
||||||
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { PlanSpecsList } from "./components/plans_list"; //Список планов
|
import { PlanSpecsList } from "./components/plans_list"; //Список планов
|
||||||
import { PlanSpecDetail } from "./components/plan_detail"; //Детали плана
|
import { PlanSpecDetail } from "./components/plan_detail"; //Детали плана
|
||||||
import { lightTheme, darkTheme } from "./styles/themes"; //Стиль темы
|
import { lightTheme, darkTheme } from "./styles/themes"; //Стиль темы
|
||||||
@ -63,7 +64,8 @@ const STYLES = {
|
|||||||
display: "inline-block",
|
display: "inline-block",
|
||||||
boxSizing: "border-box",
|
boxSizing: "border-box",
|
||||||
backgroundColor: "background.plans_drawer_paper",
|
backgroundColor: "background.plans_drawer_paper",
|
||||||
color: "text.plans_finder.fontColor"
|
color: "text.plans_finder.fontColor",
|
||||||
|
...APP_STYLES.SCROLL
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
PLANS_LIST_BOX: { paddingTop: "20px" },
|
PLANS_LIST_BOX: { paddingTop: "20px" },
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
import React, { useContext, useState } from "react"; //Классы React
|
import React, { useContext, useState } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField } from "@mui/material"; //Интерфейсные элементы
|
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 { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { CostJobsSpecsDataGrid } from "./fcjobssp"; //Собственные хуки таблиц
|
import { CostJobsSpecsDataGrid } from "./fcjobssp"; //Собственные хуки таблиц
|
||||||
import { useCostJobs, useFilteredFcjobs } from "./hooks"; //Вспомогательные хуки
|
import { useCostJobs, useFilteredFcjobs } from "./hooks"; //Вспомогательные хуки
|
||||||
@ -35,7 +36,7 @@ const STYLES = {
|
|||||||
width: "350px",
|
width: "350px",
|
||||||
display: "inline-block",
|
display: "inline-block",
|
||||||
flexShrink: 0,
|
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" }
|
CONTAINER: { textAlign: "center" }
|
||||||
};
|
};
|
||||||
|
@ -43,11 +43,12 @@ import { MessagingСtx } from "../../context/messaging"; //Контекст со
|
|||||||
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
||||||
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { P8PGantt, taskLegendDesc } from "../../components/p8p_gantt"; //Диаграмма Ганта
|
import { P8PGantt, taskLegendDesc } from "../../components/p8p_gantt"; //Диаграмма Ганта
|
||||||
import { xml2JSON, formatDateJSONDateOnly, formatDateRF, hasValue } from "../../core/utils"; //Вспомогательные функции
|
import { xml2JSON, formatDateJSONDateOnly, formatDateRF, hasValue } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки
|
import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки
|
||||||
import { CostRouteListsDataGrid } from "./datagrids/fcroutlst";
|
import { CostRouteListsDataGrid } from "./datagrids/fcroutlst"; //Таблица "Маршрутные листы"
|
||||||
import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps";
|
import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps"; //Таблица "Приходы из подразделений"
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -72,7 +73,7 @@ const STYLES = {
|
|||||||
width: "350px",
|
width: "350px",
|
||||||
display: "inline-block",
|
display: "inline-block",
|
||||||
flexShrink: 0,
|
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_CONTAINER: { height: `calc(100vh - ${APP_BAR_HEIGHT})`, width: "100vw", paddingTop: "24px" },
|
||||||
GANTT_TITLE: { paddingLeft: "250px", paddingRight: "250px" },
|
GANTT_TITLE: { paddingLeft: "250px", paddingRight: "250px" },
|
||||||
|
@ -41,7 +41,7 @@ const STYLES = {
|
|||||||
width: "350px",
|
width: "350px",
|
||||||
display: "inline-block",
|
display: "inline-block",
|
||||||
flexShrink: 0,
|
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" },
|
CONTAINER: { textAlign: "center" },
|
||||||
TITLE: { height: TITLE_HEIGHT, overflow: "hidden", paddingTop: TITLE_PADDING_TOP, paddingBottom: TITLE_PADDING_BOTTOM, display: "inline-table" },
|
TITLE: { height: TITLE_HEIGHT, overflow: "hidden", paddingTop: TITLE_PADDING_TOP, paddingBottom: TITLE_PADDING_BOTTOM, display: "inline-table" },
|
||||||
|
@ -23,6 +23,13 @@ export const PANEL_UNITS = {
|
|||||||
PROJECT_STAGE_ARTS: "PROJECT_STAGE_ARTS"
|
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,
|
columnsDef,
|
||||||
row,
|
row,
|
||||||
pOnlineShowDocument,
|
pOnlineShowDocument,
|
||||||
|
pOnlineShowUnit,
|
||||||
showStages,
|
showStages,
|
||||||
showPayNotes,
|
showPayNotes,
|
||||||
showCostNotes,
|
showCostNotes,
|
||||||
@ -275,42 +283,55 @@ export const rowExpandRender = ({
|
|||||||
const linkButtons = () =>
|
const linkButtons = () =>
|
||||||
panelUnit === PANEL_UNITS.PROJECTS ? (
|
panelUnit === PANEL_UNITS.PROJECTS ? (
|
||||||
<>
|
<>
|
||||||
<Button fullWidth variant="contained" onClick={() => showStages({ sender: row })}>
|
<Button variant="outlined" onClick={() => showStages({ sender: row })}>
|
||||||
Этапы
|
Этапы
|
||||||
</Button>
|
</Button>
|
||||||
<Button fullWidth variant="contained" onClick={() => pOnlineShowDocument({ unitCode: "Projects", document: row.NRN })}>
|
<Button variant="outlined" onClick={() => pOnlineShowDocument({ unitCode: "Projects", document: row.NRN, modal: false })}>
|
||||||
В раздел
|
К проекту
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
</>
|
||||||
) : panelUnit === PANEL_UNITS.PROJECT_STAGES ? (
|
) : panelUnit === PANEL_UNITS.PROJECT_STAGES ? (
|
||||||
<>
|
<>
|
||||||
<Button fullWidth variant="contained" onClick={() => showStageArts({ sender: row })}>
|
<Button variant="outlined" onClick={() => showStageArts({ sender: row })}>
|
||||||
Статьи
|
Статьи
|
||||||
</Button>
|
</Button>
|
||||||
<Button fullWidth variant="contained" onClick={() => showContracts({ sender: row })}>
|
<Button variant="outlined" onClick={() => showContracts({ sender: row })}>
|
||||||
Сисполнители
|
Сисполнители
|
||||||
</Button>
|
</Button>
|
||||||
<Button fullWidth variant="contained" onClick={() => pOnlineShowDocument({ unitCode: "ProjectsStages", document: row.NRN })}>
|
<Button
|
||||||
В раздел
|
variant="outlined"
|
||||||
|
onClick={() =>
|
||||||
|
pOnlineShowUnit({
|
||||||
|
unitCode: "Projects",
|
||||||
|
inputParameters: [
|
||||||
|
{ name: "in_RN", value: row.NPROJECT },
|
||||||
|
{ name: "in_STAGE_RN", value: row.NRN }
|
||||||
|
],
|
||||||
|
modal: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
>
|
||||||
|
К этапу
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
</>
|
||||||
) : panelUnit === PANEL_UNITS.PROJECT_STAGE_CONTRACTS ? (
|
) : panelUnit === PANEL_UNITS.PROJECT_STAGE_CONTRACTS ? (
|
||||||
<Button
|
<Button
|
||||||
fullWidth
|
variant="outlined"
|
||||||
variant="contained"
|
onClick={() => pOnlineShowDocument({ unitCode: row.SLNK_UNIT_SDOC_PREF, document: row.NLNK_DOCUMENT_SDOC_PREF, modal: false })}
|
||||||
onClick={() => pOnlineShowDocument({ unitCode: row.SLNK_UNIT_SDOC_PREF, document: row.NLNK_DOCUMENT_SDOC_PREF })}
|
|
||||||
>
|
>
|
||||||
В раздел
|
К договору
|
||||||
</Button>
|
</Button>
|
||||||
) : null;
|
) : null;
|
||||||
//Сборка содержимого
|
//Сборка содержимого
|
||||||
return (
|
return (
|
||||||
<Box p={2}>
|
<Box p={2}>
|
||||||
<Grid container spacing={2}>
|
<Grid container spacing={2}>
|
||||||
<Grid item xs={12} md={1}>
|
<Grid item xs={12} md={12}>
|
||||||
<Stack spacing={2}>{linkButtons()}</Stack>
|
<Stack spacing={2} direction="row">
|
||||||
|
{linkButtons()}
|
||||||
|
</Stack>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item xs={12} md={11}>
|
<Grid item xs={12} md={12}>
|
||||||
<Paper elevation={5}>
|
<Paper elevation={5}>
|
||||||
<Table sx={{ width: "100%" }} size="small">
|
<Table sx={{ width: "100%" }} size="small">
|
||||||
<TableBody>
|
<TableBody>
|
||||||
|
@ -11,23 +11,34 @@ import React, { useState, useCallback, useEffect, useContext } from "react"; //
|
|||||||
import { Box, Grid, Paper, Fab, Icon } from "@mui/material"; //Интерфейсные компоненты
|
import { Box, Grid, Paper, Fab, Icon } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
||||||
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
|
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_MORE_HEIGHT, P8P_DATA_GRID_FILTERS_HEIGHT } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
|
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
|
||||||
import { P8PChart } from "../../components/p8p_chart"; //График
|
import { P8PChart } from "../../components/p8p_chart"; //График
|
||||||
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { COMMON_PROJECTS_STYLES, PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
import { Stages } from "./stages"; //Список этапов проекта
|
import { Stages } from "./stages"; //Список этапов проекта
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
//---------
|
//---------
|
||||||
|
|
||||||
|
//Высота графиков
|
||||||
|
const CHART_HEIGHT = "300px";
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
CHART: { maxHeight: "300px", display: "flex", justifyContent: "center" },
|
TABLE_PROJECTS: (showCharts, morePages, filters) => ({
|
||||||
|
height: `calc(100vh - ${APP_BAR_HEIGHT} - ${showCharts ? CHART_HEIGHT : "0px"} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${
|
||||||
|
filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px"
|
||||||
|
} - 25px)`,
|
||||||
|
...APP_STYLES.SCROLL
|
||||||
|
}),
|
||||||
|
CHART: { maxHeight: CHART_HEIGHT, display: "flex", justifyContent: "center" },
|
||||||
CHART_PAPER: { height: "100%" },
|
CHART_PAPER: { height: "100%" },
|
||||||
CHART_FAB: { position: "absolute", top: 80, left: 16 }
|
CHART_FAB: { position: "absolute", top: 80, left: 16 }
|
||||||
};
|
};
|
||||||
@ -220,12 +231,16 @@ const Projects = () => {
|
|||||||
{projectsDataGrid.dataLoaded ? (
|
{projectsDataGrid.dataLoaded ? (
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...P8P_DATA_GRID_CONFIG_PROPS}
|
{...P8P_DATA_GRID_CONFIG_PROPS}
|
||||||
|
containerComponentProps={{
|
||||||
|
sx: STYLES.TABLE_PROJECTS(showCharts, projectsDataGrid.morePages, (projectsDataGrid.filters || []).length > 0)
|
||||||
|
}}
|
||||||
columnsDef={projectsDataGrid.columnsDef}
|
columnsDef={projectsDataGrid.columnsDef}
|
||||||
rows={projectsDataGrid.rows}
|
rows={projectsDataGrid.rows}
|
||||||
size={P8P_DATA_GRID_SIZE.SMALL}
|
size={P8P_DATA_GRID_SIZE.SMALL}
|
||||||
filtersInitial={projectsDataGrid.filters}
|
filtersInitial={projectsDataGrid.filters}
|
||||||
morePages={projectsDataGrid.morePages}
|
morePages={projectsDataGrid.morePages}
|
||||||
reloading={projectsDataGrid.reload}
|
reloading={projectsDataGrid.reload}
|
||||||
|
fixedHeader={true}
|
||||||
expandable={true}
|
expandable={true}
|
||||||
headCellRender={headCellRender}
|
headCellRender={headCellRender}
|
||||||
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECTS, showStages })}
|
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECTS, showStages })}
|
||||||
@ -245,7 +260,11 @@ const Projects = () => {
|
|||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
{projectsDataGrid.selectedProject ? (
|
{projectsDataGrid.selectedProject ? (
|
||||||
<P8PFullScreenDialog title={`Этапы проекта "${projectsDataGrid.selectedProject.SNAME_USL}"`} onClose={handleStagesClose}>
|
<P8PFullScreenDialog
|
||||||
|
title={`Этапы проекта "${projectsDataGrid.selectedProject.SNAME_USL}"`}
|
||||||
|
onClose={handleStagesClose}
|
||||||
|
contentProps={{ sx: COMMON_PROJECTS_STYLES.FULL_SCREEN_DIALOG_CONTENT }}
|
||||||
|
>
|
||||||
<Stages
|
<Stages
|
||||||
project={projectsDataGrid.selectedProject.NRN}
|
project={projectsDataGrid.selectedProject.NRN}
|
||||||
projectName={projectsDataGrid.selectedProject.SNAME_USL}
|
projectName={projectsDataGrid.selectedProject.SNAME_USL}
|
||||||
|
@ -12,13 +12,27 @@ import PropTypes from "prop-types"; //Контроль свойств компо
|
|||||||
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
||||||
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
|
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE, P8P_DATA_GRID_FILTERS_HEIGHT } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { PANEL_UNITS, dataCellRender, valueFormatter } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { PANEL_UNITS, dataCellRender, valueFormatter } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Стили
|
||||||
|
const STYLES = {
|
||||||
|
TABLE_ARTS: filters => ({
|
||||||
|
height: `calc(100vh - ${APP_BAR_HEIGHT} - ${filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px"} - 16px)`,
|
||||||
|
...APP_STYLES.SCROLL
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
//-----------
|
//-----------
|
||||||
@ -100,10 +114,12 @@ const StageArts = ({ stage, filters }) => {
|
|||||||
{stageArtsDataGrid.dataLoaded ? (
|
{stageArtsDataGrid.dataLoaded ? (
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...P8P_DATA_GRID_CONFIG_PROPS}
|
{...P8P_DATA_GRID_CONFIG_PROPS}
|
||||||
|
containerComponentProps={{ sx: STYLES.TABLE_ARTS((stageArtsDataGrid.filters || []).length > 0), elevation: 0 }}
|
||||||
columnsDef={stageArtsDataGrid.columnsDef}
|
columnsDef={stageArtsDataGrid.columnsDef}
|
||||||
filtersInitial={filters}
|
filtersInitial={filters}
|
||||||
rows={stageArtsDataGrid.rows}
|
rows={stageArtsDataGrid.rows}
|
||||||
size={P8P_DATA_GRID_SIZE.SMALL}
|
size={P8P_DATA_GRID_SIZE.SMALL}
|
||||||
|
fixedHeader={true}
|
||||||
morePages={false}
|
morePages={false}
|
||||||
reloading={stageArtsDataGrid.reload}
|
reloading={stageArtsDataGrid.reload}
|
||||||
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGE_ARTS, showCostNotes, showContracts })}
|
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGE_ARTS, showCostNotes, showContracts })}
|
||||||
|
@ -12,13 +12,35 @@ import PropTypes from "prop-types"; //Контроль свойств компо
|
|||||||
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
||||||
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
|
import {
|
||||||
|
P8PDataGrid,
|
||||||
|
P8P_DATA_GRID_SIZE,
|
||||||
|
P8P_DATA_GRID_FILTER_SHAPE,
|
||||||
|
P8P_DATA_GRID_MORE_HEIGHT,
|
||||||
|
P8P_DATA_GRID_FILTERS_HEIGHT
|
||||||
|
} from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { PANEL_UNITS, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { PANEL_UNITS, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Стили
|
||||||
|
const STYLES = {
|
||||||
|
TABLE_CONTRACTS: (morePages, filters) => ({
|
||||||
|
height: `calc(100vh - ${APP_BAR_HEIGHT} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${
|
||||||
|
filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px"
|
||||||
|
} - 16px)`,
|
||||||
|
...APP_STYLES.SCROLL
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
//-----------
|
//-----------
|
||||||
@ -137,12 +159,17 @@ const StageContracts = ({ stage, filters }) => {
|
|||||||
{stageContractsDataGrid.dataLoaded ? (
|
{stageContractsDataGrid.dataLoaded ? (
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...P8P_DATA_GRID_CONFIG_PROPS}
|
{...P8P_DATA_GRID_CONFIG_PROPS}
|
||||||
|
containerComponentProps={{
|
||||||
|
sx: STYLES.TABLE_CONTRACTS(stageContractsDataGrid.morePages, (stageContractsDataGrid.filters || []).length > 0),
|
||||||
|
elevation: 0
|
||||||
|
}}
|
||||||
columnsDef={stageContractsDataGrid.columnsDef}
|
columnsDef={stageContractsDataGrid.columnsDef}
|
||||||
filtersInitial={filters}
|
filtersInitial={filters}
|
||||||
rows={stageContractsDataGrid.rows}
|
rows={stageContractsDataGrid.rows}
|
||||||
size={P8P_DATA_GRID_SIZE.SMALL}
|
size={P8P_DATA_GRID_SIZE.SMALL}
|
||||||
morePages={stageContractsDataGrid.morePages}
|
morePages={stageContractsDataGrid.morePages}
|
||||||
reloading={stageContractsDataGrid.reload}
|
reloading={stageContractsDataGrid.reload}
|
||||||
|
fixedHeader={true}
|
||||||
expandable={true}
|
expandable={true}
|
||||||
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGE_CONTRACTS, pOnlineShowDocument })}
|
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGE_CONTRACTS, pOnlineShowDocument })}
|
||||||
rowExpandRender={prms =>
|
rowExpandRender={prms =>
|
||||||
|
@ -12,7 +12,15 @@ import PropTypes from "prop-types"; //Контроль свойств компо
|
|||||||
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
||||||
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
|
import {
|
||||||
|
P8PDataGrid,
|
||||||
|
P8P_DATA_GRID_SIZE,
|
||||||
|
P8P_DATA_GRID_FILTER_SHAPE,
|
||||||
|
P8P_DATA_GRID_MORE_HEIGHT,
|
||||||
|
P8P_DATA_GRID_FILTERS_HEIGHT
|
||||||
|
} from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
|
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
|
||||||
import { StageArts } from "./stage_arts"; //Калькуляция этапа проекта
|
import { StageArts } from "./stage_arts"; //Калькуляция этапа проекта
|
||||||
import { StageContracts } from "./stage_contracts"; //Договоры с соисполнителями этапа проекта
|
import { StageContracts } from "./stage_contracts"; //Договоры с соисполнителями этапа проекта
|
||||||
@ -20,7 +28,21 @@ import { BackEndСtx } from "../../context/backend"; //Контекст взаи
|
|||||||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { COMMON_PROJECTS_STYLES, PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Стили
|
||||||
|
const STYLES = {
|
||||||
|
TABLE_STAGES: (morePages, filters) => ({
|
||||||
|
height: `calc(100vh - ${APP_BAR_HEIGHT} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${
|
||||||
|
filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px"
|
||||||
|
} - 16px)`,
|
||||||
|
...APP_STYLES.SCROLL
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -155,12 +177,17 @@ const Stages = ({ project, projectName, filters }) => {
|
|||||||
{stagesDataGrid.dataLoaded ? (
|
{stagesDataGrid.dataLoaded ? (
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...P8P_DATA_GRID_CONFIG_PROPS}
|
{...P8P_DATA_GRID_CONFIG_PROPS}
|
||||||
|
containerComponentProps={{
|
||||||
|
sx: STYLES.TABLE_STAGES(stagesDataGrid.morePages, (stagesDataGrid.filters || []).length > 0),
|
||||||
|
elevation: 0
|
||||||
|
}}
|
||||||
columnsDef={stagesDataGrid.columnsDef}
|
columnsDef={stagesDataGrid.columnsDef}
|
||||||
filtersInitial={filters}
|
filtersInitial={filters}
|
||||||
rows={stagesDataGrid.rows}
|
rows={stagesDataGrid.rows}
|
||||||
size={P8P_DATA_GRID_SIZE.SMALL}
|
size={P8P_DATA_GRID_SIZE.SMALL}
|
||||||
morePages={stagesDataGrid.morePages}
|
morePages={stagesDataGrid.morePages}
|
||||||
reloading={stagesDataGrid.reload}
|
reloading={stagesDataGrid.reload}
|
||||||
|
fixedHeader={true}
|
||||||
expandable={true}
|
expandable={true}
|
||||||
headCellRender={headCellRender}
|
headCellRender={headCellRender}
|
||||||
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGES, showStageArts, showContracts })}
|
dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGES, showStageArts, showContracts })}
|
||||||
@ -169,6 +196,7 @@ const Stages = ({ project, projectName, filters }) => {
|
|||||||
...prms,
|
...prms,
|
||||||
panelUnit: PANEL_UNITS.PROJECT_STAGES,
|
panelUnit: PANEL_UNITS.PROJECT_STAGES,
|
||||||
pOnlineShowDocument,
|
pOnlineShowDocument,
|
||||||
|
pOnlineShowUnit,
|
||||||
showStageArts,
|
showStageArts,
|
||||||
showContracts,
|
showContracts,
|
||||||
showPayNotes,
|
showPayNotes,
|
||||||
@ -186,6 +214,7 @@ const Stages = ({ project, projectName, filters }) => {
|
|||||||
<P8PFullScreenDialog
|
<P8PFullScreenDialog
|
||||||
title={`Договоры этапа "${stagesDataGrid.selectedStageNumb}" проекта "${projectName}"`}
|
title={`Договоры этапа "${stagesDataGrid.selectedStageNumb}" проекта "${projectName}"`}
|
||||||
onClose={handleStageContractsClose}
|
onClose={handleStageContractsClose}
|
||||||
|
contentProps={{ sx: COMMON_PROJECTS_STYLES.FULL_SCREEN_DIALOG_CONTENT }}
|
||||||
>
|
>
|
||||||
<StageContracts stage={stagesDataGrid.showStageContracts} filters={stagesDataGrid.stageContractsFilters} />
|
<StageContracts stage={stagesDataGrid.showStageContracts} filters={stagesDataGrid.stageContractsFilters} />
|
||||||
</P8PFullScreenDialog>
|
</P8PFullScreenDialog>
|
||||||
@ -194,6 +223,7 @@ const Stages = ({ project, projectName, filters }) => {
|
|||||||
<P8PFullScreenDialog
|
<P8PFullScreenDialog
|
||||||
title={`Калькуляция этапа "${stagesDataGrid.selectedStageNumb}" проекта "${projectName}"`}
|
title={`Калькуляция этапа "${stagesDataGrid.selectedStageNumb}" проекта "${projectName}"`}
|
||||||
onClose={handleStageArtsClose}
|
onClose={handleStageArtsClose}
|
||||||
|
contentProps={{ sx: COMMON_PROJECTS_STYLES.FULL_SCREEN_DIALOG_CONTENT }}
|
||||||
>
|
>
|
||||||
<StageArts stage={stagesDataGrid.showStageArts} filters={stagesDataGrid.stageArtsFilters} />
|
<StageArts stage={stagesDataGrid.showStageArts} filters={stagesDataGrid.stageArtsFilters} />
|
||||||
</P8PFullScreenDialog>
|
</P8PFullScreenDialog>
|
||||||
|
@ -15,6 +15,7 @@ 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 { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -27,7 +28,7 @@ const DATA_GRID_PAGE_SIZE = 5;
|
|||||||
const STYLES = {
|
const STYLES = {
|
||||||
CONTAINER: { textAlign: "center", paddingTop: "20px" },
|
CONTAINER: { textAlign: "center", paddingTop: "20px" },
|
||||||
TITLE: { paddingBottom: "15px" },
|
TITLE: { paddingBottom: "15px" },
|
||||||
DATA_GRID_CONTAINER: { maxWidth: 700, maxHeight: 500, minHeight: 500 }
|
DATA_GRID_CONTAINER: { maxWidth: 700, maxHeight: 500, minHeight: 500, ...APP_STYLES.SCROLL }
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------
|
//---------------------------------------------
|
||||||
@ -166,7 +167,7 @@ const DataGrid = ({ title }) => {
|
|||||||
{dataGrid.dataLoaded ? (
|
{dataGrid.dataLoaded ? (
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...P8P_DATA_GRID_CONFIG_PROPS}
|
{...P8P_DATA_GRID_CONFIG_PROPS}
|
||||||
containerComponentProps={{ elevation: 6, style: STYLES.DATA_GRID_CONTAINER }}
|
containerComponentProps={{ elevation: 6, sx: STYLES.DATA_GRID_CONTAINER }}
|
||||||
{...dataGrid}
|
{...dataGrid}
|
||||||
size={P8P_DATA_GRID_SIZE.LARGE}
|
size={P8P_DATA_GRID_SIZE.LARGE}
|
||||||
valueFormatter={valueFormatter}
|
valueFormatter={valueFormatter}
|
||||||
|
@ -2823,6 +2823,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as
|
|||||||
SCOND_TO => 'EDCOST_READYTo',
|
SCOND_TO => 'EDCOST_READYTo',
|
||||||
BORDER => true,
|
BORDER => true,
|
||||||
BFILTER => true);
|
BFILTER => true);
|
||||||
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
|
SNAME => 'NPROJECT',
|
||||||
|
SCAPTION => 'Рег. номер проекта',
|
||||||
|
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||||||
|
BVISIBLE => false);
|
||||||
/* Обходим данные */
|
/* Обходим данные */
|
||||||
begin
|
begin
|
||||||
/* Добавляем подсказку совместимости */
|
/* Добавляем подсказку совместимости */
|
||||||
@ -2860,7 +2865,8 @@ create or replace package body PKG_P8PANELS_PROJECTS as
|
|||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NSUMM_REALIZ,');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NSUMM_REALIZ,');
|
||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST') || '(PS.RN) NCTRL_COST,');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST') || '(PS.RN) NCTRL_COST,');
|
||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT') || '(PS.RN) NCTRL_ACT,');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT') || '(PS.RN) NCTRL_ACT,');
|
||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(PS.RN) NCOST_READY');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(PS.RN) NCOST_READY,');
|
||||||
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.PRN NPROJECT');
|
||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PROJECTSTAGE PS');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PROJECTSTAGE PS');
|
||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC FAC on PS.FACEACC = FAC.RN,');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC FAC on PS.FACEACC = FAC.RN,');
|
||||||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,');
|
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,');
|
||||||
@ -2924,6 +2930,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as
|
|||||||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29);
|
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29);
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
|
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31);
|
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31);
|
||||||
|
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 32);
|
||||||
/* Делаем выборку */
|
/* Делаем выборку */
|
||||||
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
|
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
|
||||||
null;
|
null;
|
||||||
@ -3052,6 +3059,10 @@ create or replace package body PKG_P8PANELS_PROJECTS as
|
|||||||
SNAME => 'NCOST_READY',
|
SNAME => 'NCOST_READY',
|
||||||
ICURSOR => ICURSOR,
|
ICURSOR => ICURSOR,
|
||||||
NPOSITION => 30);
|
NPOSITION => 30);
|
||||||
|
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||||||
|
SNAME => 'NPROJECT',
|
||||||
|
ICURSOR => ICURSOR,
|
||||||
|
NPOSITION => 31);
|
||||||
/* Добавляем строку в таблицу */
|
/* Добавляем строку в таблицу */
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
||||||
end loop;
|
end loop;
|
||||||
|
60
dist/p8-panels.js
vendored
60
dist/p8-panels.js
vendored
File diff suppressed because one or more lines are too long
@ -16,7 +16,7 @@
|
|||||||
<script src="./libs/frappe-gantt/frappe-gantt.js"></script>
|
<script src="./libs/frappe-gantt/frappe-gantt.js"></script>
|
||||||
<link rel="stylesheet" href="./libs/frappe-gantt/frappe-gantt.css" />
|
<link rel="stylesheet" href="./libs/frappe-gantt/frappe-gantt.css" />
|
||||||
</head>
|
</head>
|
||||||
<body style="display: block; margin: 0px">
|
<body style="display: block; margin: 0px" class="scroll">
|
||||||
<div id="app-content"></div>
|
<div id="app-content"></div>
|
||||||
<script src="dist/p8-panels.js"></script>
|
<script src="dist/p8-panels.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user