Compare commits
No commits in common. "e1c77731be40552e1500046694bced1819af9cc9" and "81d22b126c416f72e0972e6acb10c406c832e416" have entirely different histories.
e1c77731be
...
81d22b126c
249
README.md
@ -41,7 +41,7 @@
|
|||||||
- API для высокоуровневого взаимодействия с сервером БД Системы
|
- API для высокоуровневого взаимодействия с сервером БД Системы
|
||||||
- API для взаимодействия разрабатываемых панелей с WEB-приложением "ПАРУС 8 Онлайн"
|
- API для взаимодействия разрабатываемых панелей с WEB-приложением "ПАРУС 8 Онлайн"
|
||||||
- WEB-приложение "Парус 8 - Панели мониторинга", являющееся "точкой входа" для подключения реализуемых панелей, включающее в себя:
|
- WEB-приложение "Парус 8 - Панели мониторинга", являющееся "точкой входа" для подключения реализуемых панелей, включающее в себя:
|
||||||
- Подключенные и настроенные библиотеки ["React"](https://react.dev/), ["React-Router"](https://reactrouter.com/), ["MUI5"](https://v5.mui.com/)
|
- Подключенные и настроенные библиотеки ["React"](https://react.dev/), ["React-Router"](https://reactrouter.com/), ["MUI"](https://mui.com/)
|
||||||
- Настроенный транспайлер ["Babel"](https://babeljs.io/)
|
- Настроенный транспайлер ["Babel"](https://babeljs.io/)
|
||||||
- Настроенный сборщик WEB-приложений ["WebPack"](https://webpack.js.org/)
|
- Настроенный сборщик WEB-приложений ["WebPack"](https://webpack.js.org/)
|
||||||
- Настроенный статический анализатор кода ["ESLint"]()
|
- Настроенный статический анализатор кода ["ESLint"]()
|
||||||
@ -124,11 +124,16 @@ git clone https://git.citpb.ru/CITKParus/P8-Panels.git
|
|||||||
> **Внимание:** при установке учитывайте следующее:
|
> **Внимание:** при установке учитывайте следующее:
|
||||||
>
|
>
|
||||||
> - **Для Linux/Unix**
|
> - **Для Linux/Unix**
|
||||||
|
>
|
||||||
> - Чувствительность к регистру - обращайте внимание на регистр в именах каталогов и файлов операционной системы и регистр в котором упоминаете их в конфигурационных файлах, несовпадение приводит к неработоспособности настроек
|
> - Чувствительность к регистру - обращайте внимание на регистр в именах каталогов и файлов операционной системы и регистр в котором упоминаете их в конфигурационных файлах, несовпадение приводит к неработоспособности настроек
|
||||||
> - Права доступа - файлы конфигурации и файлы дистрибутива фреймворка должны быть доступны процессу WEB-сервера
|
> - Права доступа - файлы конфигурации и файлы дистрибутива фреймворка должны быть доступны процессу WEB-сервера
|
||||||
|
>
|
||||||
> - **Для Windows 7 и прочих устаревших версий Windows**
|
> - **Для Windows 7 и прочих устаревших версий Windows**
|
||||||
|
>
|
||||||
> - Версия IIS, доступная для этих ОС, зачастую не имеет автоматической поддержки шрифтов в формате "WOFF2", применяемых фреймворком. Это может вызывать некорректное отображение панелей, иконок, некоторых элементов пользовательского интерфейса. Добавте в файл "web.config", сервера приложений "ПАРУС 8 Онлайн", строку для определения формата: `<mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />`. Путь для добавления данной настройки в файл "web.config": `configuration/system.webServer/staticContent/<mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />`
|
> - Версия IIS, доступная для этих ОС, зачастую не имеет автоматической поддержки шрифтов в формате "WOFF2", применяемых фреймворком. Это может вызывать некорректное отображение панелей, иконок, некоторых элементов пользовательского интерфейса. Добавте в файл "web.config", сервера приложений "ПАРУС 8 Онлайн", строку для определения формата: `<mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />`. Путь для добавления данной настройки в файл "web.config": `configuration/system.webServer/staticContent/<mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />`
|
||||||
|
>
|
||||||
> - **Для всех**
|
> - **Для всех**
|
||||||
|
>
|
||||||
> - Если после установки фреймворка, при открытии панелей появляется ошибка `Internal server error` (HTTP-статус ответа сервера - 500), и Вы уверены, что перепроверили всё описанное выше в интрукции и не нашли ошибок установки, то: остановите сервер приложений "ПАРУС 8 Онлайн", сделайте резервную копию его каталога "bin" и удалите каталог, затем скачайте "web.zip" из дистрибутива Вашего релиза "ПАРУС 8 Онлайн" и восстановите удалённый каталог "bin", распаковав его из архива. Затем - запустите сервер приложений "ПАРУС 8 Онлайн".
|
> - Если после установки фреймворка, при открытии панелей появляется ошибка `Internal server error` (HTTP-статус ответа сервера - 500), и Вы уверены, что перепроверили всё описанное выше в интрукции и не нашли ошибок установки, то: остановите сервер приложений "ПАРУС 8 Онлайн", сделайте резервную копию его каталога "bin" и удалите каталог, затем скачайте "web.zip" из дистрибутива Вашего релиза "ПАРУС 8 Онлайн" и восстановите удалённый каталог "bin", распаковав его из архива. Затем - запустите сервер приложений "ПАРУС 8 Онлайн".
|
||||||
|
|
||||||
## V. Подключение панелей
|
## V. Подключение панелей
|
||||||
@ -191,12 +196,12 @@ git clone https://git.citpb.ru/CITKParus/P8-Panels.git
|
|||||||
|
|
||||||
- `name` - обязательный, строка, указывается латиницей, определяет уникальное имя панели
|
- `name` - обязательный, строка, указывается латиницей, определяет уникальное имя панели
|
||||||
- `group` - необязательный, строка, указывается кириллицей, определяет имя группы, в которую входит панель (применяется при формировании галереи панелей, главного меню панелей и ссылок на рабочем столе)
|
- `group` - необязательный, строка, указывается кириллицей, определяет имя группы, в которую входит панель (применяется при формировании галереи панелей, главного меню панелей и ссылок на рабочем столе)
|
||||||
- `caption` - обязательный, строка, видимое наименование панели (применяется в галерее панелей, главном меню панелей, ссылках на рабочем столе, заголовках закладок)
|
- `caption` - обязательный, строка, видимое наименование панели (применяется в галереи панелей, главном меню панелей, ссылках на рабочем столе, заголовках закладок)
|
||||||
- `desc` - необязательный, строка,
|
- `desc` - необязательный, строка,
|
||||||
- `url` - обязательный, строка, указывается латиницей, относительй URL панели (по адресу `Panel.urlBase` + `Panel.Panels.url` сервер приложений "ПАРУС 8 Онлайн" будет выдавать HTML-страницу панели), для простоты навигации может повторять значение атрибута `path`
|
- `url` - обязательный, строка, указывается латиницей, относительй URL панели (по адресу `Panel.urlBase` + `Panel.Panels.url` сервер приложений "ПАРУС 8 Онлайн" будет выдавать HTML-страницу панели), для простоты навигации может повторять значение атрибута `path`
|
||||||
- `path` - обязательный, строка, путь к исходному коду панели в структуре каталогов WEB-приложения "Парус 8 - Панели мониторинга" (панели должны размещаться в "app/panels", в данном атрибуте указыватся только имя каталога, созданного для панели в "app/panels")
|
- `path` - обязательный, строка, путь к исходному коду панели в структуре каталогов WEB-приложения "Парус 8 - Панели мониторинга" (панели должны размещаться в "app/panels", в данном атрибуте указыватся только имя каталога, созданного для панели в "app/panels")
|
||||||
- `icon` - обязательный, строка, код иконки панели из символов шрифта [Google Material Icons](https://fonts.google.com/icons?icon.set=Material+Icons) (применяется при формировании галереи панелей, главного меню панелей и ссылок на рабочем столе)
|
- `icon` - обязательный, строка, код иконки панели из символов шрифта [Google Material Icons](https://fonts.google.com/icons?icon.set=Material+Icons) (применяется при формировании галереи панелей, главного меню панелей и ссылок на рабочем столе)
|
||||||
- `showInPanelsList` - обязательный, принимает значения "true" или "false", определяет отображение ссылки на панель в галерее панелей, главном меню панелей, виджете рабочего стола
|
- `showInPanelsList` - обязательный, принимает значения "true" или "false", определяет отображение ссылки на панель в галереи панелей, главном меню панелей, виджете рабочего стола
|
||||||
- `preview` - полный путь и имя файла из каталога "img" WEB-приложения "Парус 8 - Панели мониторинга" (в каталог могут быть добавлены пользовательские изображения), служит в качестве изображения панели в галерее панелей
|
- `preview` - полный путь и имя файла из каталога "img" WEB-приложения "Парус 8 - Панели мониторинга" (в каталог могут быть добавлены пользовательские изображения), служит в качестве изображения панели в галерее панелей
|
||||||
|
|
||||||
На рисунках ниже проиллюстрировано применение атрибутов элемента `Panel`.
|
На рисунках ниже проиллюстрировано применение атрибутов элемента `Panel`.
|
||||||
@ -515,7 +520,7 @@ c:\inetpub\p8web20\WebClient\Modules\P8-Panels>npm run build
|
|||||||
|
|
||||||
> **Обратите внимание:** Здесь и далее - описываемый API (как клиентский, так и серверный) не является финальным и может быть изменён с целью развития фреймворка. В этой связи, необходимо закладывать дополнительное время на обновления расширения "Панели", связанное с возможной необходимостью приведения разработанных самостоятельно интерфейсов (их клиентских и серверных частей) к доработанному API.
|
> **Обратите внимание:** Здесь и далее - описываемый API (как клиентский, так и серверный) не является финальным и может быть изменён с целью развития фреймворка. В этой связи, необходимо закладывать дополнительное время на обновления расширения "Панели", связанное с возможной необходимостью приведения разработанных самостоятельно интерфейсов (их клиентских и серверных частей) к доработанному API.
|
||||||
|
|
||||||
Для исполнения хранимых процедур/функций БД Системы в составе расширения предусмотрен специальный API. Его подключение к компоненте панели осуществляется через контекст `BackEndCtx` ("app/context/backend.js").
|
Для исполнения хранимых процедур/функций БД Системы в составе расширения предусмотрен специальный API. Его подключение к компоненте панели осуществляется через контекст `BackEndСtx` ("app/context/backend.js").
|
||||||
|
|
||||||
В состав API входят:
|
В состав API входят:
|
||||||
|
|
||||||
@ -617,7 +622,7 @@ c:\inetpub\p8web20\WebClient\Modules\P8-Panels>npm run build
|
|||||||
|
|
||||||
```
|
```
|
||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//Функциональный компонент панели (или её части)
|
//Функциональный компонент панели (или её части)
|
||||||
const MyPanel = () => {
|
const MyPanel = () => {
|
||||||
@ -625,7 +630,7 @@ const MyPanel = () => {
|
|||||||
const [state, setState] = useState({ dataLoaded: false, data: [], filters: null, orders: null });
|
const [state, setState] = useState({ dataLoaded: false, data: [], filters: null, orders: null });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных проектов с сервера
|
//Загрузка данных проектов с сервера
|
||||||
const loadProjects = async (agentName) => {
|
const loadProjects = async (agentName) => {
|
||||||
@ -708,9 +713,9 @@ const MyPanel = () => {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### API для взаимодействия с WEB-приложением "ПАРУС 8 Онлайн" и ядром фреймворка
|
### API для взаимодействия с WEB-приложением "ПАРУС 8 Онлайн"
|
||||||
|
|
||||||
Для взаимодействия панелей с пользовательским интерфейсом "ПАРУС 8 Онлайн" в составе расширения предусмотрен специальный API. Его подключение к компоненте панели осуществляется через контекст `ApplicationCtx` ("app/context/application.js"). Данный контекст так же позволяет управлять некоторыми базовыми функциями приложения фреймворка и получать сведения о зарегистрированных панелях.
|
Для взаимодействия панелей с пользовательским интерфейсом "ПАРУС 8 Онлайн" в составе расширения предусмотрен специальный API. Его подключение к компоненте панели осуществляется через контекст `ApplicationСtx` ("app/context/application.js").
|
||||||
|
|
||||||
В состав API входят:
|
В состав API входят:
|
||||||
|
|
||||||
@ -720,9 +725,6 @@ const MyPanel = () => {
|
|||||||
- `pOnlineShowDictionary` - функция, отображение раздела "ПАРУС 8 Онлайн" в режиме словаря
|
- `pOnlineShowDictionary` - функция, отображение раздела "ПАРУС 8 Онлайн" в режиме словаря
|
||||||
- `pOnlineUserProcedure` - функция, исполнение "Пользовательской процедуры"
|
- `pOnlineUserProcedure` - функция, исполнение "Пользовательской процедуры"
|
||||||
- `pOnlineUserReport` - функция, печать "Пользовательского отчёта"
|
- `pOnlineUserReport` - функция, печать "Пользовательского отчёта"
|
||||||
- `setAppBarTitle` - функция, установка текста заголовка панели
|
|
||||||
- `setAppBarShow` - функция, установка флага отображения системного заголовка панели
|
|
||||||
- `findPanelByName` - функция, поиск зарегистрированной в файле конфигурации фреймвора (`p8panels.config`) панели по уникальному имени
|
|
||||||
|
|
||||||
#### `String pOnlineShowTab(Object)`
|
#### `String pOnlineShowTab(Object)`
|
||||||
|
|
||||||
@ -851,42 +853,12 @@ const MyPanel = () => {
|
|||||||
|
|
||||||
**Результат:** функция не возвращает значимого результата
|
**Результат:** функция не возвращает значимого результата
|
||||||
|
|
||||||
#### `undefined setAppBarTitle(appBarTitle)`
|
|
||||||
|
|
||||||
Изменяет текст заголовка панели.
|
|
||||||
|
|
||||||
**Входные параметры:**
|
|
||||||
|
|
||||||
`appBarTitle` - необязательный, строка, текст заголовка панели (если не указан - используется заголовок панели `Panels\Panel\caption` из файла конфигурации `p8panels.config`)
|
|
||||||
|
|
||||||
**Результат:** функция не возвращает значимого результата
|
|
||||||
|
|
||||||
#### `undefined setAppBarShow(appBarShow)`
|
|
||||||
|
|
||||||
Скрывает/отображает заголовок панели.
|
|
||||||
|
|
||||||
**Входные параметры:**
|
|
||||||
|
|
||||||
`appBarShow` - обязательный, логический, флаг отображения заголовка панели (`false` - скрыть заголовок, `true` - отобразить заголовок)
|
|
||||||
|
|
||||||
**Результат:** функция не возвращает значимого результата
|
|
||||||
|
|
||||||
#### `object findPanelByName(name)`
|
|
||||||
|
|
||||||
Возвращает сведения (XML элемент `Panels\Panel` в JSON-интерпретации) о панели из файла конфигурации фреймворка (`p8panels.config`) по её уникальному наименованию (`Panels\Panel\name`).
|
|
||||||
|
|
||||||
**Входные параметры:**
|
|
||||||
|
|
||||||
`name` - обязательный, строка, уникальное имя панели (указывается в атрибуте `name` XML-элемента `Panels\Panel` файла конфигурации фреймворка `p8panels.config`)
|
|
||||||
|
|
||||||
**Результат:** функция возвращает объект, содержащий JSON-интерпретацию XML-элемента `Panel` файла конфигурации `p8panels.config`, соответствующего переданному имени панели (`undefined` - если сведения о панели не были найдены)
|
|
||||||
|
|
||||||
Примеры (см. "app/panels/samples/p8online.js"):
|
Примеры (см. "app/panels/samples/p8online.js"):
|
||||||
|
|
||||||
```
|
```
|
||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import { Typography, Button, Divider } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Button, Divider } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
@ -895,20 +867,13 @@ const STYLES = {
|
|||||||
DIVIDER: { margin: "15px" }
|
DIVIDER: { margin: "15px" }
|
||||||
};
|
};
|
||||||
|
|
||||||
//Пример: API для взаимодействия с "ПАРУС 8 Онлайн" и ядром фреймворка
|
//Пример: API для взаимодействия с "ПАРУС 8 Онлайн"
|
||||||
const P8Online = ({ title }) => {
|
const P8Online = ({ title }) => {
|
||||||
//Собственное состояние - флаг отображения пользовательского текста заголовка
|
//Собственное состояние
|
||||||
const [titleCustom, setTitleCustom] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - отображение заголовка
|
|
||||||
const [titleVisible, setTitleVisible] = useState(true);
|
|
||||||
|
|
||||||
//Собственное состояние - выбранный контрагент
|
|
||||||
const [agent, setAgent] = useState("");
|
const [agent, setAgent] = useState("");
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit, pOnlineShowTab, pOnlineShowDocument, pOnlineShowDictionary, setAppBarTitle, setAppBarShow, findPanelByName } =
|
const { pOnlineShowUnit, pOnlineShowTab, pOnlineShowDocument, pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
useContext(ApplicationCtx);
|
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
@ -916,44 +881,20 @@ const P8Online = ({ title }) => {
|
|||||||
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
||||||
{title}
|
{title}
|
||||||
</Typography>
|
</Typography>
|
||||||
{/* Изменение текста заголовка */}
|
|
||||||
{titleVisible && (
|
|
||||||
<>
|
|
||||||
<Button
|
|
||||||
variant="contained"
|
|
||||||
onClick={() => {
|
|
||||||
setAppBarTitle(titleCustom ? "" : "Пользовательский текст");
|
|
||||||
setTitleCustom(!titleCustom);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`${titleCustom ? "Восстановить" : "Изменить"} текст заголовка`}
|
|
||||||
</Button>
|
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
{/* Сокрытие/отображение заголовка */}
|
|
||||||
<Button
|
|
||||||
variant="contained"
|
|
||||||
onClick={() => {
|
|
||||||
setAppBarShow(!titleVisible);
|
|
||||||
setTitleVisible(!titleVisible);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`${titleVisible ? "Скрыть" : "Отобразить"} заголовок`}
|
|
||||||
</Button>
|
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
|
||||||
{/* Поиск панели */}
|
|
||||||
<Button variant="contained" onClick={() => console.log(findPanelByName("Samples"))}>
|
|
||||||
Вывести в консоль сведения о данной панели
|
|
||||||
</Button>
|
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
|
||||||
{/* Открыть новую закладку */}
|
{/* Открыть новую закладку */}
|
||||||
<Button variant="contained" onClick={() => pOnlineShowTab({ caption: "PARUS.COM", url: "https://www.parus.com" })}>
|
<Button variant="contained" onClick={() => pOnlineShowTab({ caption: "PARUS.COM", url: "https://www.parus.com" })}>
|
||||||
Открыть закладку
|
Открыть закладку
|
||||||
</Button>
|
</Button>
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
<Divider sx={STYLES.DIVIDER} />
|
||||||
{/* Открыть раздел */}
|
{/* Открыть раздел */}
|
||||||
<Button variant="contained" onClick={() => pOnlineShowUnit({ unitCode: "Contracts" })}>
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
onClick={() => {
|
||||||
|
pOnlineShowUnit({
|
||||||
|
unitCode: "Contracts"
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
Открыть раздел Договоры
|
Открыть раздел Договоры
|
||||||
</Button>
|
</Button>
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
<Divider sx={STYLES.DIVIDER} />
|
||||||
@ -963,7 +904,12 @@ const P8Online = ({ title }) => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
pOnlineShowDictionary({
|
pOnlineShowDictionary({
|
||||||
unitCode: "AGNLIST",
|
unitCode: "AGNLIST",
|
||||||
inputParameters: [{ name: "in_AGNABBR", value: agent }],
|
inputParameters: [
|
||||||
|
{
|
||||||
|
name: "in_AGNABBR",
|
||||||
|
value: agent
|
||||||
|
}
|
||||||
|
],
|
||||||
callBack: res => (res.success === true ? setAgent(res.outParameters.out_AGNABBR) : null)
|
callBack: res => (res.success === true ? setAgent(res.outParameters.out_AGNABBR) : null)
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@ -976,7 +922,13 @@ const P8Online = ({ title }) => {
|
|||||||
<Divider sx={STYLES.DIVIDER} />
|
<Divider sx={STYLES.DIVIDER} />
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
onClick={() => pOnlineShowDocument({ unitCode: "AGNLIST", document: agent, inRnParameter: "in_AGNABBR" })}
|
onClick={() => {
|
||||||
|
pOnlineShowDocument({
|
||||||
|
unitCode: "AGNLIST",
|
||||||
|
document: agent,
|
||||||
|
inRnParameter: "in_AGNABBR"
|
||||||
|
});
|
||||||
|
}}
|
||||||
>{`Показать контрагента "${agent}"`}</Button>
|
>{`Показать контрагента "${agent}"`}</Button>
|
||||||
</>
|
</>
|
||||||
) : null}
|
) : null}
|
||||||
@ -992,11 +944,11 @@ const P8Online = ({ title }) => {
|
|||||||
|
|
||||||
##### Компоненты MUI
|
##### Компоненты MUI
|
||||||
|
|
||||||
В состав фреймворка включена библиотека [MUI](https://v5.mui.com/) версии 5 (далее - `MUI5`). При разработке панелей могут быть использованы интерфейсные компоненты и разметка, поставляемые с ней.
|
В состав фреймворка включена библиотека [MUI](https://mui.com/) версии 5. При разработке панелей могут быть использованы интерфейсные компоненты и разметка, поставляемые с ней.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Сочетая компоненты библиотеки [MUI5](https://v5.mui.com/) и описанный выше API для взаимодействия с Системой можно реализовать пользовательский интерфейс любой сложности. Для подключения компонента к панели достаточно импортировать его из модуля `"@mui/material"`.
|
Сочетая компоненты библиотеки [MUI](https://mui.com/) и описанный выше API для взаимодействия с Системой можно реализовать пользовательский интерфейс любой сложности. Для подключения компонента к панели достаточно импортировать его из модуля `"@mui/material"`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -1005,9 +957,9 @@ const P8Online = ({ title }) => {
|
|||||||
```
|
```
|
||||||
import React, { useEffect, useContext, useCallback, useState } from "react"; //Классы React
|
import React, { useEffect, useContext, useCallback, useState } from "react"; //Классы React
|
||||||
import { Typography, Grid, List, ListItemButton, ListItem, ListItemText, IconButton, Icon, Button, TextField, Box } from "@mui/material"; //Интерфейсные элементы MUI
|
import { Typography, Grid, List, ListItemButton, ListItem, ListItemText, IconButton, Icon, Button, TextField, Box } from "@mui/material"; //Интерфейсные элементы MUI
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
@ -1025,13 +977,13 @@ const Mui = ({ title }) => {
|
|||||||
const [agentForm, setAgentForm] = useState({ agnAbbr: "", agnName: "" });
|
const [agentForm, setAgentForm] = useState({ agnAbbr: "", agnName: "" });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Загрузка списка контрагентов
|
//Загрузка списка контрагентов
|
||||||
const agentsGet = useCallback(async () => {
|
const agentsGet = useCallback(async () => {
|
||||||
@ -1144,7 +1096,7 @@ const Mui = ({ title }) => {
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Более подробно ознакомиться с исходным кодом примера можно в "app/panels/samples/mui.js". Документация по интерфейсным компонентам, включённым в [MUI5](https://v5.mui.com/) доступна на официальном сайте библиотеки.
|
Более подробно ознакомиться с исходным кодом примера можно в "app/panels/samples/mui.js". Документация по интерфейсным компонентам, включённым в [MUI](https://mui.com/) доступна на официальном сайте библиотеки.
|
||||||
|
|
||||||
> **Обратите внимание:** описываемые далее высокоуровневые компоненты фреймворка "Панели" построены, в том числе, с применением интерфейсных примитивов MUI. Как правило, они имеют префикс `P8P*` в имени: `P8PAppMessage`, `P8PAppInlineMessage`, `P8PAppProgress`, `P8PDataGrid` и т.д.
|
> **Обратите внимание:** описываемые далее высокоуровневые компоненты фреймворка "Панели" построены, в том числе, с применением интерфейсных примитивов MUI. Как правило, они имеют префикс `P8P*` в имени: `P8PAppMessage`, `P8PAppInlineMessage`, `P8PAppProgress`, `P8PDataGrid` и т.д.
|
||||||
|
|
||||||
@ -1152,7 +1104,7 @@ const Mui = ({ title }) => {
|
|||||||
|
|
||||||
При необходимости отображения сообщения пользователю панель может использовать компоненты `P8PAppMessage<TYPE>`, `P8PAppInlineMessage<TYPE>`, где `<TYPE> in ["Err", "Info", "Warn"]`, для сообщения об ошибке, информации или предупреждения соответственно. Их исходный код расположен в "app/components/p8p_app_message". Для подключения компонент к панели достаточно импортировать этот модуль.
|
При необходимости отображения сообщения пользователю панель может использовать компоненты `P8PAppMessage<TYPE>`, `P8PAppInlineMessage<TYPE>`, где `<TYPE> in ["Err", "Info", "Warn"]`, для сообщения об ошибке, информации или предупреждения соответственно. Их исходный код расположен в "app/components/p8p_app_message". Для подключения компонент к панели достаточно импортировать этот модуль.
|
||||||
|
|
||||||
Для удобства применения компонент реализованы функции-обёртки и компоненты-обёртки (декораторы), доступные через специальный контекст приложения - `MessagingCtx` ("app/context/messaging"). Их описание дано ниже.
|
Для удобства применения компонент реализованы функции-обёртки и компоненты-обёртки (декораторы), доступные через специальный контекст приложения - `MessagingСtx` ("app/context/messaging"). Их описание дано ниже.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -1238,7 +1190,7 @@ const Mui = ({ title }) => {
|
|||||||
```
|
```
|
||||||
import React, { useContext, useState } from "react"; //Классы React
|
import React, { useContext, useState } from "react"; //Классы React
|
||||||
import { Typography, Divider, Button } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Divider, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
@ -1253,7 +1205,7 @@ const Messages = ({ title }) => {
|
|||||||
const [state, setState] = useState({ inlineErr: true, inlineWarn: true, inlineInfo: true });
|
const [state, setState] = useState({ inlineErr: true, inlineWarn: true, inlineInfo: true });
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr, showMsgWarn, showMsgInfo, InlineMsgErr, InlineMsgInfo, InlineMsgWarn } = useContext(MessagingCtx);
|
const { showMsgErr, showMsgWarn, showMsgInfo, InlineMsgErr, InlineMsgInfo, InlineMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
@ -1326,7 +1278,7 @@ const Messages = ({ title }) => {
|
|||||||
|
|
||||||
Для информирования пользователя о выполнении панелью асинхронных действий (например, обращений к серверу Системы), как правило, используются различные индикаторы выполнения процессов. Для этих целей в фреймворк "Панели" включен типовой индикатор процесса `P8PAppProgress` (исходный код компонента доступен в "app/components/p8p_app_progress").
|
Для информирования пользователя о выполнении панелью асинхронных действий (например, обращений к серверу Системы), как правило, используются различные индикаторы выполнения процессов. Для этих целей в фреймворк "Панели" включен типовой индикатор процесса `P8PAppProgress` (исходный код компонента доступен в "app/components/p8p_app_progress").
|
||||||
|
|
||||||
Для удобства использования компонента в контексте приложения `MessagingCtx` ("app/context/messaging") реализованы декораторы `showLoader` и `hideLoader` (отображение и сокрытие индикатора процесса соответственно).
|
Для удобства использования компонента в контексте приложения `MessagingСtx` ("app/context/messaging") реализованы декораторы `showLoader` и `hideLoader` (отображение и сокрытие индикатора процесса соответственно).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -1353,7 +1305,7 @@ const Messages = ({ title }) => {
|
|||||||
```
|
```
|
||||||
import React, { useContext } from "react"; //Классы React
|
import React, { useContext } from "react"; //Классы React
|
||||||
import { Typography, Button } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
@ -1364,7 +1316,7 @@ const STYLES = {
|
|||||||
//Функциональный компонент с примером использования индикатора процесса
|
//Функциональный компонент с примером использования индикатора процесса
|
||||||
const Loader = ({ title }) => {
|
const Loader = ({ title }) => {
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showLoader, hideLoader } = useContext(MessagingCtx);
|
const { showLoader, hideLoader } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
@ -1526,28 +1478,25 @@ const MyPanel = () => {
|
|||||||
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
||||||
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
||||||
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о таблице, по умолчанию `XDATA_GRID`\
|
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о таблице, по умолчанию `XDATA_GRID`\
|
||||||
`filtersNodeName` - необязательный, строка, имя узла, содержащего информацию о фильтрах, отправляемых на сервер, по умолчанию `filters`, при использовании в хранимом объекте стандартной функции `PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` для десериализации данных важно, чтобы данный параметр имел значение `filters`\
|
`filtersNodeName` - необязательный, строка, имя узла, содержащего информацию о фильтрах, отправляемых на сервер, по умолчанию `filters`. При использовании в хранимом объекте стандартной функции `PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` для десериализации данных важно, чтобы данный параметр имел значение `filters`\
|
||||||
`ordersNodeName` - необязательный, строка, имя узла, содержащего информацию о сортировках, отправляемых на сервер, по умолчанию `orders`, при использовании в хранимом объекте стандартной функции `PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML` для десериализации данных важно, чтобы данный параметр имел значение `orders`\
|
`ordersNodeName` - необязательный, строка, имя узла, содержащего информацию о сортировках, отправляемых на сервер, по умолчанию `orders`. При использовании в хранимом объекте стандартной функции `PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML` для десериализации данных важно, чтобы данный параметр имел значение `orders`\
|
||||||
`pageSize` - необязательный, число, объем выборки данных на страницу или на догрузку, по умолчанию `10`, передается в параметр `NPAGE_SIZE` хранимого объекта из переданного свойства `stored`\
|
`pageSize` - необязательный, число, объем выборки данных на страницу или на догрузку, по умолчанию `10`. Передается в параметр `NPAGE_SIZE` хранимого объекта из переданного свойства `stored`\
|
||||||
`reloadDef` - необязательный, логический, определяет необходимость включения описания колонок таблицы в ответ, по умолчанию `false`, передается в параметр `NINCLUDE_DEF` хранимого объекта из переданного свойства `stored`, при значении `true` соответствующий параметр `NINCLUDE_DEF` будет всегда равен `1`, в ином случае при первом обращении к хранимому объекту передается `1`, а в последующих `0`\
|
`reloadDef` - необязательный, булево, определяет необходимость включения описания колонок таблицы в ответ, по умолчанию `false`. Передается в параметр `NINCLUDE_DEF` хранимого объекта из переданного свойства `stored`. При значении `true` соответствующий параметр `NINCLUDE_DEF` будет всегда равен `1`, в ином случае при первом обращении к хранимому объекту передается `1`, а в последующих `0`\
|
||||||
`initFilters` - необязательный, массив, начальное состояние фильтров таблицы, содержит объекты вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, from: <НАЧАЛО_ДИАПАЗОНА_ЗНАЧЕНИЙ_ФИЛЬТРА>, to: <ОКОНЧАНИЕ_ДИАПАЗОНА_ЗНАЧЕНИЙ_ФИЛЬТРА>}`\
|
`initFilters` - необязательный, массив, начальное состояние фильтров таблицы, содержит объекты вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, from: <НАЧАЛО_ДИАПАЗОНА_ЗНАЧЕНИЙ_ФИЛЬТРА>, to: <ОКОНЧАНИЕ_ДИАПАЗОНА_ЗНАЧЕНИЙ_ФИЛЬТРА>}`\
|
||||||
`initOrders` - необязательный, массив, начальное состояние сортировок таблицы, содержит объекты вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, direction: <ASC|DESC>}`\
|
`initOrders` - необязательный, массив, начальное состояние сортировок таблицы, содержит объекты вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, direction: <ASC|DESC>}`\
|
||||||
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, для CLOB-параметров явное указание типа обязательно)\
|
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, с CLOB-параметрами это не всегда может произойти корректно)\
|
||||||
`resetPageNumberOnStoredArgsChange` - необязательный, логический, по умолчанию - `true`, признак сброса номера страницы при изменении значений параметров хранимого объекта\
|
|
||||||
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
||||||
`resetPageNumberOnExecuteStoredArgsChange` - необязательный, логический, по умолчанию - `true`, признак сброса номера страницы при изменении значений параметров параметров функции `executeStored` (исполняющей хранимый объект)\
|
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры. Должна возвращать булево. Если возвращает `false`, то исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется
|
||||||
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры, должна возвращать логическое значение (`false` - исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется)
|
|
||||||
|
|
||||||
**Результат:** объект для работы с компонентом `P8PDataGrid`. Возвращаемый объект имеет следующие свойства:\
|
**Результат:** объект для работы с компонентом `P8PDataGrid`. Возвращаемый объект имеет следующие свойства:\
|
||||||
`dataGrid` - объект, хранит информацию о таблице, загруженной с помощью хранимой процедуры\
|
`dataGrid` - объект, хранит информацию о таблице, загруженной с помощью хранимой процедуры\
|
||||||
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
|
`isDataLoaded` - булево, признак успешной загрузки и обработки данных из хранимой процедуры\
|
||||||
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
|
`isLoading` - булево, признак выполнения загрузки данных из хранимой процедуры\
|
||||||
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
|
|
||||||
`handleFilterChanged` - функция, изменение состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется\
|
`handleFilterChanged` - функция, изменение состояния фильтров таблицы. Сигнатура функции `f({filters})`, результат функции не интерпретируется\
|
||||||
`handleOrderChanged` - функция, изменение состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется\
|
`handleOrderChanged` - функция, изменение состояния сортировок таблицы. Сигнатура функции `f({orders})`, результат функции не интерпретируется\
|
||||||
`handlePagesCountChanged` - функция, изменение количества отображаемых страниц данных таблицы. Сигнатура функции `f()`, результат функции не интерпретируется\
|
`handlePagesCountChanged` - функция, изменение количества отображаемых страниц данных таблицы. Сигнатура функции `f()`, результат функции не интерпретируется\
|
||||||
`handlePageChange` - функция, изменение номера отображаемой страницы таблицы. Сигнатура функции `f({page})`, результат функции не интерпретируется\
|
`handlePageChange` - функция, изменение номера отображаемой страницы таблицы. Сигнатура функции `f({page})`, результат функции не интерпретируется\
|
||||||
`doReload` - функция, принудительное обновление данных таблицы, сигнатура функции `f()`, результат функции не интерпретируется
|
`doReload` - функция, принудительное обновление данных таблицы. Сигнатура функции `f()`, результат функции не интерпретируется
|
||||||
|
|
||||||
**Особенности хранимых объектов**\
|
**Особенности хранимых объектов**\
|
||||||
При использовании универсального хука для хранимой процедуры существуют параметры "по умолчанию", в которые отправляются соответствующие данные:\
|
При использовании универсального хука для хранимой процедуры существуют параметры "по умолчанию", в которые отправляются соответствующие данные:\
|
||||||
@ -1772,8 +1721,8 @@ import { Typography, Grid, Stack, Icon, Box, Button } from "@mui/material"; //И
|
|||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
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 { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//Размер страницы данных
|
//Размер страницы данных
|
||||||
const DATA_GRID_PAGE_SIZE = 5;
|
const DATA_GRID_PAGE_SIZE = 5;
|
||||||
@ -1844,10 +1793,10 @@ const DataGrid = ({ title }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
@ -1964,7 +1913,7 @@ const MyPanel = () => {
|
|||||||
`options` - необязательный, объект, дополнительные параметры графика, формат и допустимый состав атрибутов определены в документации к библиотеке [ChartJS](https://www.chartjs.org/docs/latest/), будет объединён с параметрами графика уже зафиксированными в компоненте `P8PChart` (см. `useEffect` при подключении компонента к старице в его исходном коде, параметры графика, зафиксированные в компоненте, имеют более высокий приоритет по сравнению с данным свойством)
|
`options` - необязательный, объект, дополнительные параметры графика, формат и допустимый состав атрибутов определены в документации к библиотеке [ChartJS](https://www.chartjs.org/docs/latest/), будет объединён с параметрами графика уже зафиксированными в компоненте `P8PChart` (см. `useEffect` при подключении компонента к старице в его исходном коде, параметры графика, зафиксированные в компоненте, имеют более высокий приоритет по сравнению с данным свойством)
|
||||||
`labels` - необязательный, массив строк, список меток для значений графика\
|
`labels` - необязательный, массив строк, список меток для значений графика\
|
||||||
`datasets` - необязательный, массив объектов, данные для отображения на диаграмме, каждый элемент массива - серия данных для отображения, содержит объекты вида `{label: <ЗАГОЛОВОК_СЕРИИ>, borderColor: <ЦВЕТ_ГРАНИЦЫ_СЕРИИ_НА_ГРАФИКЕ>, backgroundColor: <ЦВЕТ_ЗАЛИВКИ_СЕРИИ_НА_ГРАФИКЕ>, data: <МАССИВ_ЗНАЧЕНИЙ_СЕРИИ_ДАННЫХ>, items: <МАССИВ_ОБЪЕКТОВ_ПРОИЗВОЛЬНОЙ_СТРУКТУРЫ_ДЛЯ_ОПИСАНИЯ_СЕРИИ_ДАННЫХ>}`\
|
`datasets` - необязательный, массив объектов, данные для отображения на диаграмме, каждый элемент массива - серия данных для отображения, содержит объекты вида `{label: <ЗАГОЛОВОК_СЕРИИ>, borderColor: <ЦВЕТ_ГРАНИЦЫ_СЕРИИ_НА_ГРАФИКЕ>, backgroundColor: <ЦВЕТ_ЗАЛИВКИ_СЕРИИ_НА_ГРАФИКЕ>, data: <МАССИВ_ЗНАЧЕНИЙ_СЕРИИ_ДАННЫХ>, items: <МАССИВ_ОБЪЕКТОВ_ПРОИЗВОЛЬНОЙ_СТРУКТУРЫ_ДЛЯ_ОПИСАНИЯ_СЕРИИ_ДАННЫХ>}`\
|
||||||
`onClick` - необязательный, функция, будет вызвана при нажатии на элемент графика, сигнатура функции `f({datasetIndex, itemIndex, item})`, результат функции не интерпретируется. Функции будет передан объект, поле `datasetIndex` которого, будет содержать индекс серии данных, `itemIndex` - индекс элемента серии данных, а `item` - описание элмента данных серии, на котором было зафиксировано нажатие\
|
`onClick` - необязательный, функция, будет вызвана при нажатии на элемент графика, сигнатура функции `f({datasetIndex, itemIndex, item})`, результат функции не интерпретируется. Функции будет передан объект, поле `datasetIndex` которого, будет содержать индекс серии данных, `itemIndex` - индекс элемента серии данных, а `item` - описание элмента данных серии, на котором было зафиксировано нажатие.\
|
||||||
`style` - необязательный, объект, стили, которые будут применены к контейнеру `div` графика
|
`style` - необязательный, объект, стили, которые будут применены к контейнеру `div` графика
|
||||||
|
|
||||||
**API на сервере БД**
|
**API на сервере БД**
|
||||||
@ -1999,16 +1948,15 @@ const MyPanel = () => {
|
|||||||
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
||||||
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
||||||
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о графике, по умолчанию `XCHART`\
|
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о графике, по умолчанию `XCHART`\
|
||||||
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, для CLOB-параметров явное указание типа обязательно)\
|
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, с CLOB-параметрами это не всегда может произойти корректно)\
|
||||||
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
||||||
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры, должна возвращать логическое значение (`false` - исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется)
|
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры. Должна возвращать булево. Если возвращает `false`, то исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется
|
||||||
|
|
||||||
**Результат:** объект для работы с компонентом `P8PChart`. Возвращаемый объект имеет следующие свойства:\
|
**Результат:** объект для работы с компонентом `P8PChart`. Возвращаемый объект имеет следующие свойства:\
|
||||||
`chart` - объект, хранит информацию о графике, загруженном с помощью хранимой процедуры\
|
`chart` - объект, хранит информацию о графике, загруженном с помощью хранимой процедуры\
|
||||||
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
|
`isDataLoaded` - булево, признак успешной загрузки и обработки данных из хранимой процедуры\
|
||||||
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
|
`isLoading` - булево, признак выполнения загрузки данных из хранимой процедуры\
|
||||||
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
|
`doReload` - функция, принудительное обновление данных графика. Сигнатура функции `f()`, результат функции не интерпретируется
|
||||||
`doReload` - функция, принудительное обновление данных графика, сигнатура функции `f()`, результат функции не интерпретируется
|
|
||||||
|
|
||||||
**Пример**
|
**Пример**
|
||||||
|
|
||||||
@ -2071,7 +2019,7 @@ import React, { useContext } from "react"; //Классы React
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Grid, Paper } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Grid, Paper } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { P8PChart, useP8PChart } from "../../components/p8p_chart"; //График
|
import { P8PChart, useP8PChart } from "../../components/p8p_chart"; //График
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -2095,7 +2043,7 @@ const Chart = ({ title }) => {
|
|||||||
const { chart, isDataLoaded } = useP8PChart({ stored: "PKG_P8PANELS_SAMPLES.CHART" });
|
const { chart, isDataLoaded } = useP8PChart({ stored: "PKG_P8PANELS_SAMPLES.CHART" });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Отработка нажатия на график
|
//Отработка нажатия на график
|
||||||
const handleChartClick = ({ item }) => {
|
const handleChartClick = ({ item }) => {
|
||||||
@ -2235,16 +2183,15 @@ const MyPanel = () => {
|
|||||||
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
||||||
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
||||||
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о диаграмме Ганта, по умолчанию `XGANTT`\
|
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о диаграмме Ганта, по умолчанию `XGANTT`\
|
||||||
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, для CLOB-параметров явное указание типа обязательно)\
|
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, с CLOB-параметрами это не всегда может произойти корректно)\
|
||||||
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
||||||
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры, должна возвращать логическое значение (`false` - исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется)
|
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры. Должна возвращать булево. Если возвращает `false`, то исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется
|
||||||
|
|
||||||
**Результат:** объект для работы с компонентом `P8PGantt`. Возвращаемый объект имеет следующие свойства:\
|
**Результат:** объект для работы с компонентом `P8PGantt`. Возвращаемый объект имеет следующие свойства:\
|
||||||
`gantt` - объект, хранит информацию о диаграмме Ганта, загруженной с помощью хранимой процедуры\
|
`gantt` - объект, хранит информацию о диаграмме Ганта, загруженной с помощью хранимой процедуры\
|
||||||
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
|
`isDataLoaded` - булево, признак успешной загрузки и обработки данных из хранимой процедуры\
|
||||||
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
|
`isLoading` - булево, признак выполнения загрузки данных из хранимой процедуры\
|
||||||
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
|
`doReload` - функция, принудительное обновление данных диаграммы Ганта. Сигнатура функции `f()`, результат функции не интерпретируется
|
||||||
`doReload` - функция, принудительное обновление данных диаграммы Ганта, сигнатура функции `f()`, результат функции не интерпретируется
|
|
||||||
|
|
||||||
**Пример**
|
**Пример**
|
||||||
|
|
||||||
@ -2322,7 +2269,7 @@ import { formatDateRF, hasValue } from "../../core/utils"; //Вспомогат
|
|||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
import { P8PGantt, useP8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
|
import { P8PGantt, useP8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
|
||||||
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -2418,7 +2365,7 @@ const Gantt = ({ title }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Изменение данных диаграммы
|
//Изменение данных диаграммы
|
||||||
const modifyData = useCallback(
|
const modifyData = useCallback(
|
||||||
@ -2729,14 +2676,13 @@ const MyPanel = () => {
|
|||||||
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о циклограмме, по умолчанию `XCYCLOGRAM`\
|
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию о циклограмме, по умолчанию `XCYCLOGRAM`\
|
||||||
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, с CLOB-параметрами это не всегда может произойти корректно)\
|
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, с CLOB-параметрами это не всегда может произойти корректно)\
|
||||||
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
||||||
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры, должна возвращать логическое значение (`false` - исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется)
|
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры. Должна возвращать булево. Если возвращает `false`, то исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется
|
||||||
|
|
||||||
**Результат:** объект для работы с компонентом `P8PCyclogram`. Возвращаемый объект имеет следующие свойства:\
|
**Результат:** объект для работы с компонентом `P8PCyclogram`. Возвращаемый объект имеет следующие свойства:\
|
||||||
`cyclogram` - объект, хранит информацию о циклограмме, загруженной с помощью хранимой процедуры\
|
`cyclogram` - объект, хранит информацию о циклограмме, загруженной с помощью хранимой процедуры\
|
||||||
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
|
`isDataLoaded` - булево, признак успешной загрузки и обработки данных из хранимой процедуры\
|
||||||
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
|
`isLoading` - булево, признак выполнения загрузки данных из хранимой процедуры\
|
||||||
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
|
`doReload` - функция, принудительное обновление данных циклограммы. Сигнатура функции `f()`, результат функции не интерпретируется
|
||||||
`doReload` - функция, принудительное обновление данных циклограммы, сигнатура функции `f()`, результат функции не интерпретируется
|
|
||||||
|
|
||||||
**Пример**
|
**Пример**
|
||||||
|
|
||||||
@ -2990,7 +2936,7 @@ import { formatDateJSONDateOnly, formatDateRF } from "../../core/utils"; //Вс
|
|||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
import { P8PCyclogram } from "../../components/p8p_cyclogram"; //Циклограмма
|
import { P8PCyclogram } from "../../components/p8p_cyclogram"; //Циклограмма
|
||||||
import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -3076,7 +3022,7 @@ const Cyclogram = ({ title }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При подключении компонента к странице
|
//При подключении компонента к странице
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -3139,7 +3085,7 @@ export { Cyclogram };
|
|||||||
- Цветовая индикация пользовательскими цветами
|
- Цветовая индикация пользовательскими цветами
|
||||||
- Обработка нажатий
|
- Обработка нажатий
|
||||||
- Отображение иконки
|
- Отображение иконки
|
||||||
- Управление внешним видом (парение, рамка)
|
- Упрвление внешним видом (парение, рамка)
|
||||||
- Интерактивные подсказки
|
- Интерактивные подсказки
|
||||||
|
|
||||||

|

|
||||||
@ -3201,16 +3147,15 @@ const MyPanel = () => {
|
|||||||
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
`stored` - обязательный, строка, имя исполняемого хранимого объекта (для пакетных - "ПАКЕТ.ОБЪЕКТ")\
|
||||||
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
`respArg` - необязательный, строка, имя выходного параметра исполняемого объекта, значение которого необходимо вернуть как данные ответа, по умолчанию - `COUT`\
|
||||||
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию об индикаторе, по умолчанию `XINDICATOR`\
|
`contentNodeName` - необязательный, строка, имя узла, содержащего информацию об индикаторе, по умолчанию `XINDICATOR`\
|
||||||
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, для CLOB-параметров явное указание типа обязательно)\
|
`storedArgs` - необязательный, объект, описание параметров исполняемого хранимого объекта вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"|{VALUE: "ЗНАЧЕНИЕ", SDATA_TYPE: SERV_DATA_TYPE_*}}` (если тип данных параметров не указан явно - произойдёт попытка их автоматического определения, с CLOB-параметрами это не всегда может произойти корректно)\
|
||||||
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
`executeStoredArgs` - необязательный, объект, описание параметров функции `executeStored` (исполняющей хранимый объект) вида `{"ПАРАМЕТР": "ЗНАЧЕНИЕ"}`\
|
||||||
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры, должна возвращать логическое значение (`false` - исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется)
|
`allowDataLoad` - необязательный, функция, определяет игнорирование исполнения хранимой процедуры. Должна возвращать булево. Если возвращает `false`, то исполнение хранимой процедуры, независимо от необходимости, полностью игнорируется
|
||||||
|
|
||||||
**Результат:** объект для работы с компонентом `P8PIndicator`. Возвращаемый объект имеет следующие свойства:\
|
**Результат:** объект для работы с компонентом `P8PIndicator`. Возвращаемый объект имеет следующие свойства:\
|
||||||
`indicator` - объект, хранит информацию об индикаторе, загруженном с помощью хранимой процедуры\
|
`indicator` - объект, хранит информацию об индикаторе, загруженном с помощью хранимой процедуры\
|
||||||
`isDataLoaded` - логический, признак успешной загрузки и обработки данных из хранимой процедуры\
|
`isDataLoaded` - булево, признак успешной загрузки и обработки данных из хранимой процедуры\
|
||||||
`isDataFound` - логический, признак наличия значимых сведений (бизнес-даных) в данных, полученных из хранимой процедуры\
|
`isLoading` - булево, признак выполнения загрузки данных из хранимой процедуры\
|
||||||
`isLoading` - логический, признак выполнения загрузки данных из хранимой процедуры\
|
`doReload` - функция, принудительное обновление данных индикатора. Сигнатура функции `f()`, результат функции не интерпретируется
|
||||||
`doReload` - функция, принудительное обновление данных индикатора, сигнатура функции `f()`, результат функции не интерпретируется
|
|
||||||
|
|
||||||
**Пример**
|
**Пример**
|
||||||
|
|
||||||
@ -3221,8 +3166,8 @@ const MyPanel = () => {
|
|||||||
Фреймворк позволяет реализовать любые пользовательские интерфейсы, вёрстка которых не противоречит возможностям современного HTML. Тем не менее, при разработке пользовательских интерфейсов панелей важно придерживаться предложенных ниже правил. Это позволит создавать их в едином ключе и упростит работу конечного пользователя при их освоении.
|
Фреймворк позволяет реализовать любые пользовательские интерфейсы, вёрстка которых не противоречит возможностям современного HTML. Тем не менее, при разработке пользовательских интерфейсов панелей важно придерживаться предложенных ниже правил. Это позволит создавать их в едином ключе и упростит работу конечного пользователя при их освоении.
|
||||||
|
|
||||||
- Избегайте нестандартных реакций элементов пользовательского интерфейса на действия пользователя. Например, выпадающий список, при активации, должен отображать состав своих элементов, а не вызывать бизнес-функцию отработки документа.
|
- Избегайте нестандартных реакций элементов пользовательского интерфейса на действия пользователя. Например, выпадающий список, при активации, должен отображать состав своих элементов, а не вызывать бизнес-функцию отработки документа.
|
||||||
- Избегайте прямого применения HTML-тэгов. В библиотеке [MUI5](https://v5.mui.com/), включенной в состав фреймворка, есть всё необходимое для сборки интерфейса.
|
- Избегайте прямого применения HTML-тэгов. В библиотеке [MUI](https://mui.com/), включенной в состав фреймворка, есть всё необходимое для сборки интерфейса.
|
||||||
- Старайтесь не применять `<div>` для всёрстки - для этого в [MUI5](https://v5.mui.com/) есть группа компонентов разметки ("Layout"), используйте их (`Grid`, `Box`, `Container`, `Stack`, `Paper` и пр.).
|
- Старайтесь не применять `<div>` для всёрстки - для этого в [MUI](https://mui.com/) есть группа компонентов разметки ("Layout"), используйте их (`Grid`, `Box`, `Container`, `Stack`, `Paper` и пр.).
|
||||||
- Старайтесь не использовать, без острой необходимости, атрибуты `sx` и `style` - всё необходимое для стилизации как правило есть в типовых атрибутах компонента [MUI5](https://v5.mui.com/), изучите его документацию. Если применение собственного стиля неизбежно - старайтесь выносить стили в единое место в коде, переиспользовать их, и импортировать там, где это необходимо.
|
- Старайтесь не использовать, без острой необходимости, атрибуты `sx` и `style` - всё необходимое для стилизации как правило есть в типовых атрибутах компонента [MUI](https://mui.com/), изучите его документацию. Если применение собственного стиля неизбежно - старайтесь выносить стили в единое место в коде, переиспользовать их, и импортировать там, где это необходимо.
|
||||||
- Придерживайтесь единой цветовой гаммы при реализации всех панелей (в идеале) или, если не удаётся, панелей, отнесённых к одному прикладному участку (ПУДП, УЗСР, БУ, ПУП и т.п.).
|
- Придерживайтесь единой цветовой гаммы при реализации всех панелей (в идеале) или, если не удаётся, панелей, отнесённых к одному прикладному участку (ПУДП, УЗСР, БУ, ПУП и т.п.).
|
||||||
- Изучите и применяйте `ThemeProvider` из состава инструментов стилизации библиотеки [MUI5](https://v5.mui.com/) для придания индивидуальности панелям и их компонентам.
|
- Изучите и применяйте `ThemeProvider` из состава инструментов стилизации библиотеки [MUI](https://mui.com/) для придания индивидуальности панелям и их компонентам.
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { createHashRouter, RouterProvider, useRouteError } from "react-router-dom"; //Роутер
|
import { createHashRouter, RouterProvider, useRouteError } from "react-router-dom"; //Роутер
|
||||||
import { ApplicationCtx } from "./context/application"; //Контекст приложения
|
import { ApplicationСtx } from "./context/application"; //Контекст приложения
|
||||||
import { NavigationContext, NavigationCtx, getRootLocation } from "./context/navigation"; //Контекст навигации
|
import { NavigationContext, NavigationCtx, getRootLocation } from "./context/navigation"; //Контекст навигации
|
||||||
import { P8PAppErrorPage } from "./components/p8p_app_error_page"; //Страница с ошибкой
|
import { P8PAppErrorPage } from "./components/p8p_app_error_page"; //Страница с ошибкой
|
||||||
import { P8PAppWorkspace } from "./components/p8p_app_workspace"; //Рабочее пространство панели
|
import { P8PAppWorkspace } from "./components/p8p_app_workspace"; //Рабочее пространство панели
|
||||||
@ -54,7 +54,7 @@ const MainMenu = ({ panels = [] } = {}) => {
|
|||||||
const { navigatePanel, isNavigationSearch, getNavigationSearch } = useContext(NavigationCtx);
|
const { navigatePanel, isNavigationSearch, getNavigationSearch } = useContext(NavigationCtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configUrlBase, pOnlineShowTab } = useContext(ApplicationCtx);
|
const { configUrlBase, pOnlineShowTab } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Получим параметры запроса из адресной строки
|
//Получим параметры запроса из адресной строки
|
||||||
const qS = isNavigationSearch() ? getNavigationSearch() : null;
|
const qS = isNavigationSearch() ? getNavigationSearch() : null;
|
||||||
@ -87,7 +87,7 @@ const Workspace = ({ panels = [], selectedPanel, children } = {}) => {
|
|||||||
const { navigateRoot, navigatePanel } = useContext(NavigationCtx);
|
const { navigateRoot, navigatePanel } = useContext(NavigationCtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { appState } = useContext(ApplicationCtx);
|
const { appState } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Отработка действия навигации домой
|
//Отработка действия навигации домой
|
||||||
const handleHomeNavigate = () => navigateRoot();
|
const handleHomeNavigate = () => navigateRoot();
|
||||||
@ -102,7 +102,6 @@ const Workspace = ({ panels = [], selectedPanel, children } = {}) => {
|
|||||||
panels={panels}
|
panels={panels}
|
||||||
selectedPanel={selectedPanel}
|
selectedPanel={selectedPanel}
|
||||||
caption={appState.appBarTitle}
|
caption={appState.appBarTitle}
|
||||||
showAppBar={appState.appBarShow}
|
|
||||||
onHomeNavigate={handleHomeNavigate}
|
onHomeNavigate={handleHomeNavigate}
|
||||||
onItemNavigate={handleItemNavigate}
|
onItemNavigate={handleItemNavigate}
|
||||||
>
|
>
|
||||||
@ -131,7 +130,7 @@ const App = () => {
|
|||||||
const [routes, setRoutes] = useState([]);
|
const [routes, setRoutes] = useState([]);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { appState } = useContext(ApplicationCtx);
|
const { appState } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Инициализация роутера
|
//Инициализация роутера
|
||||||
const content = routes.length > 0 ? <RouterProvider router={createHashRouter(routes)}></RouterProvider> : null;
|
const content = routes.length > 0 ? <RouterProvider router={createHashRouter(routes)}></RouterProvider> : null;
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useContext } from "react"; //Классы React
|
import React, { useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { TextField, Box, InputAdornment, IconButton, Icon, FormControlLabel, Checkbox } from "@mui/material"; //Интерфейсные элементы
|
import { TextField, Box, InputAdornment, IconButton, Icon, FormControlLabel, Checkbox } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
|
||||||
import { P8P_CA_OPEN_UNIT_PARAMS_SHAPE, P8P_CA_INPUT_PARAM_INITIAL, P8P_CA_DEF_TYPE_VALUE } from "./common"; //Общие ресурсы действий
|
import { P8P_CA_OPEN_UNIT_PARAMS_SHAPE, P8P_CA_INPUT_PARAM_INITIAL, P8P_CA_DEF_TYPE_VALUE } from "./common"; //Общие ресурсы действий
|
||||||
import { P8PCAFieldWithType } from "./field_with_type"; //Поле с выбором типа значения
|
import { P8PCAFieldWithType } from "./field_with_type"; //Поле с выбором типа значения
|
||||||
import { P8PCATablePropValues } from "./table_prop_values"; //Таблица значений свойств действия
|
import { P8PCATablePropValues } from "./table_prop_values"; //Таблица значений свойств действия
|
||||||
@ -31,7 +31,7 @@ const STYLES = {
|
|||||||
//Редактор действия "Открыть раздел"
|
//Редактор действия "Открыть раздел"
|
||||||
const P8PCAUnitOpenOptions = ({ unit, valueTypes, isValues, onStateChange, onValueSourceMenuClick }) => {
|
const P8PCAUnitOpenOptions = ({ unit, valueTypes, isValues, onStateChange, onValueSourceMenuClick }) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При изменении параметра открытия
|
//При изменении параметра открытия
|
||||||
const handleModalChange = () => onStateChange({ modal: !unit.modal });
|
const handleModalChange = () => onStateChange({ modal: !unit.modal });
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useEffect, useContext } from "react"; //Классы React
|
import React, { useState, useEffect, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Stack, IconButton, Icon, TextField, InputAdornment, MenuItem, Menu } from "@mui/material"; //Интерфейсные элементы
|
import { Stack, IconButton, Icon, TextField, InputAdornment, MenuItem, Menu } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { TITLES, CAPTIONS } from "../../../app.text"; //Общие текстовые ресурсы
|
import { TITLES, CAPTIONS } from "../../../app.text"; //Общие текстовые ресурсы
|
||||||
import { P8PConfigDialog } from "./p8p_config_dialog"; //Типовой диалог настройки
|
import { P8PConfigDialog } from "./p8p_config_dialog"; //Типовой диалог настройки
|
||||||
import { P8P_DATA_SOURCE_TYPE, P8P_DATA_SOURCE_SHAPE, P8P_DATA_SOURCE_ARGUMENT_INITIAL, P8P_DATA_SOURCE_INITIAL } from "./p8p_data_source_common"; //Общие ресурсы компонента "Источник данных"
|
import { P8P_DATA_SOURCE_TYPE, P8P_DATA_SOURCE_SHAPE, P8P_DATA_SOURCE_ARGUMENT_INITIAL, P8P_DATA_SOURCE_INITIAL } from "./p8p_data_source_common"; //Общие ресурсы компонента "Источник данных"
|
||||||
@ -43,7 +43,7 @@ const P8PDataSourceConfigDialog = ({ dataSource = null, valueProviders = {}, onO
|
|||||||
const [disabledFields, setDisabledFields] = useState({ query: false, userProc: false });
|
const [disabledFields, setDisabledFields] = useState({ query: false, userProc: false });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Установка значения/привязки аргумента
|
//Установка значения/привязки аргумента
|
||||||
const setArgumentValueSource = (index, value, valueSource) =>
|
const setArgumentValueSource = (index, value, valueSource) =>
|
||||||
|
|||||||
@ -11,11 +11,11 @@ import { useState, useContext, useEffect, useRef } from "react"; //Классы
|
|||||||
import client from "../../core/client"; //Клиент взаимодействия с сервером приложений
|
import client from "../../core/client"; //Клиент взаимодействия с сервером приложений
|
||||||
import { ERRORS } from "../../../app.text"; //Общие текстовые ресурсы
|
import { ERRORS } from "../../../app.text"; //Общие текстовые ресурсы
|
||||||
import { formatErrorMessage } from "../../core/utils"; //Общие вспомогательные функции
|
import { formatErrorMessage } from "../../core/utils"; //Общие вспомогательные функции
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { P8P_DATA_SOURCE_TYPE, P8P_DATA_SOURCE_ARGUMENT_DATA_TYPE } from "./p8p_data_source_common"; //Общие ресурсы источника данных
|
import { P8P_DATA_SOURCE_TYPE, P8P_DATA_SOURCE_ARGUMENT_DATA_TYPE } from "./p8p_data_source_common"; //Общие ресурсы источника данных
|
||||||
import { getConditionsValues } from "./p8p_component_condition/util"; //Вспомогательные ресурсы условий
|
import { getConditionsValues } from "./p8p_component_condition/util"; //Вспомогательные ресурсы условий
|
||||||
import { getHandlersByActions } from "./p8p_component_action/util"; //Вспомогательные ресурсы действий
|
import { getHandlersByActions } from "./p8p_component_action/util"; //Вспомогательные ресурсы действий
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -30,7 +30,7 @@ const useUserProcDesc = ({ code, refresh }) => {
|
|||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные компонента
|
//При необходимости обновить данные компонента
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -84,7 +84,7 @@ const useDataSource = ({ dataSource, values, componentRespArg = "" }) => {
|
|||||||
const [haveData, setHaveData] = useState(false);
|
const [haveData, setHaveData] = useState(false);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновление информации о наличии данных
|
//При необходимости обновление информации о наличии данных
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -204,7 +204,7 @@ const useComponentHandlers = ({ actions = [], onValuesChange = null, getCustomTy
|
|||||||
const [handlers, setHandlers] = useState({});
|
const [handlers, setHandlers] = useState({});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configUrlBase, pOnlineShowTab, pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { configUrlBase, pOnlineShowTab, pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При необходимости обновления информации об обработчиках
|
//При необходимости обновления информации об обработчиках
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -47,17 +47,7 @@ const STYLES = {
|
|||||||
//-----------
|
//-----------
|
||||||
|
|
||||||
//Рабочее пространство
|
//Рабочее пространство
|
||||||
const P8PAppWorkspace = ({
|
const P8PAppWorkspace = ({ children, panels = [], selectedPanel, caption, closeCaption, homeCaption, onHomeNavigate, onItemNavigate } = {}) => {
|
||||||
children,
|
|
||||||
panels = [],
|
|
||||||
selectedPanel,
|
|
||||||
caption,
|
|
||||||
showAppBar = true,
|
|
||||||
closeCaption,
|
|
||||||
homeCaption,
|
|
||||||
onHomeNavigate,
|
|
||||||
onItemNavigate
|
|
||||||
} = {}) => {
|
|
||||||
//Собственное состояния
|
//Собственное состояния
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
@ -83,8 +73,6 @@ const P8PAppWorkspace = ({
|
|||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
<Box sx={STYLES.ROOT_BOX}>
|
<Box sx={STYLES.ROOT_BOX}>
|
||||||
{showAppBar && (
|
|
||||||
<>
|
|
||||||
<CssBaseline />
|
<CssBaseline />
|
||||||
<AppBar sx={STYLES.APP_BAR}>
|
<AppBar sx={STYLES.APP_BAR}>
|
||||||
<Toolbar>
|
<Toolbar>
|
||||||
@ -119,10 +107,8 @@ const P8PAppWorkspace = ({
|
|||||||
</List>
|
</List>
|
||||||
<P8PPanelsMenuDrawer panels={panels} selectedPanel={selectedPanel} onItemNavigate={handleItemNavigate} />
|
<P8PPanelsMenuDrawer panels={panels} selectedPanel={selectedPanel} onItemNavigate={handleItemNavigate} />
|
||||||
</Drawer>
|
</Drawer>
|
||||||
</>
|
|
||||||
)}
|
|
||||||
<main style={STYLES.MAIN}>
|
<main style={STYLES.MAIN}>
|
||||||
{showAppBar && <Toolbar />}
|
<Toolbar />
|
||||||
{children}
|
{children}
|
||||||
</main>
|
</main>
|
||||||
</Box>
|
</Box>
|
||||||
@ -135,7 +121,6 @@ P8PAppWorkspace.propTypes = {
|
|||||||
panels: PropTypes.arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,
|
panels: PropTypes.arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,
|
||||||
selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE,
|
selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE,
|
||||||
caption: PropTypes.string,
|
caption: PropTypes.string,
|
||||||
showAppBar: PropTypes.bool,
|
|
||||||
closeCaption: PropTypes.string.isRequired,
|
closeCaption: PropTypes.string.isRequired,
|
||||||
homeCaption: PropTypes.string.isRequired,
|
homeCaption: PropTypes.string.isRequired,
|
||||||
onHomeNavigate: PropTypes.func,
|
onHomeNavigate: PropTypes.func,
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -43,9 +43,6 @@ const useP8PChart = ({
|
|||||||
//Собственное состояние - признак загрузки данных
|
//Собственное состояние - признак загрузки данных
|
||||||
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
||||||
|
|
||||||
//Собственное состояние - признак наличия бизнес-данных в загруженных
|
|
||||||
const [isDataFound, setIsDataFound] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - флаг загрузки
|
//Собственное состояние - флаг загрузки
|
||||||
const [isLoading, setLoading] = useState(false);
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
|
||||||
@ -64,18 +61,13 @@ const useP8PChart = ({
|
|||||||
}, [allowDataLoad]);
|
}, [allowDataLoad]);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, isRespErr } = useContext(BackEndCtx);
|
const { executeStored, isRespErr } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных графика с сервера
|
//Загрузка данных графика с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
//Поднимаем флаг начала загрузки данных
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
//Получаем данные с сервера БД
|
|
||||||
const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current });
|
const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current });
|
||||||
//Устанавливаем флаг наличия бизнес-данных
|
|
||||||
setIsDataFound(data[contentNodeName]?.datasets?.[0]?.data?.length > 0);
|
|
||||||
//Устанавливаем бизнес-данные
|
|
||||||
setChart(pv => ({ ...pv, ...data[contentNodeName] }));
|
setChart(pv => ({ ...pv, ...data[contentNodeName] }));
|
||||||
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
||||||
setIsDataLoaded(!isRespErr(data));
|
setIsDataLoaded(!isRespErr(data));
|
||||||
@ -134,7 +126,7 @@ const useP8PChart = ({
|
|||||||
}, [isAllowDataLoad, reload, loadData]);
|
}, [isAllowDataLoad, reload, loadData]);
|
||||||
|
|
||||||
//Возвращаем данные графика
|
//Возвращаем данные графика
|
||||||
return { chart, isDataLoaded, isDataFound, isLoading, doReload };
|
return { chart, isDataLoaded, isLoading, doReload };
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { formatDateJSONDateOnly } from "../core/utils"; //Вспомогательные функции
|
import { formatDateJSONDateOnly } from "../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -47,9 +47,6 @@ const useP8PCyclogram = ({
|
|||||||
//Собственное состояние - признак загрузки данных
|
//Собственное состояние - признак загрузки данных
|
||||||
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
||||||
|
|
||||||
//Собственное состояние - признак наличия бизнес-данных в загруженных
|
|
||||||
const [isDataFound, setIsDataFound] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - флаг загрузки
|
//Собственное состояние - флаг загрузки
|
||||||
const [isLoading, setLoading] = useState(false);
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
|
||||||
@ -68,14 +65,12 @@ const useP8PCyclogram = ({
|
|||||||
}, [allowDataLoad]);
|
}, [allowDataLoad]);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, isRespErr } = useContext(BackEndCtx);
|
const { executeStored, isRespErr } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных циклограммы с сервера
|
//Загрузка данных циклограммы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
//Поднимаем флаг начала загрузки данных
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
//Получаем данные с сервера БД
|
|
||||||
const data = await executeStored({
|
const data = await executeStored({
|
||||||
stored,
|
stored,
|
||||||
args: { ...refStoredArgs.current },
|
args: { ...refStoredArgs.current },
|
||||||
@ -83,9 +78,6 @@ const useP8PCyclogram = ({
|
|||||||
respArg,
|
respArg,
|
||||||
...refExecuteStoredArgs.current
|
...refExecuteStoredArgs.current
|
||||||
});
|
});
|
||||||
//Устанавливаем флаг наличия бизнес-данных
|
|
||||||
setIsDataFound(data[contentNodeName]?.tasks?.length > 0);
|
|
||||||
//Устанавливаем бизнес-данные
|
|
||||||
setCyclogram(pv => ({ ...pv, ...data[contentNodeName] }));
|
setCyclogram(pv => ({ ...pv, ...data[contentNodeName] }));
|
||||||
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
||||||
setIsDataLoaded(!isRespErr(data));
|
setIsDataLoaded(!isRespErr(data));
|
||||||
@ -143,7 +135,7 @@ const useP8PCyclogram = ({
|
|||||||
}, [isAllowDataLoad, reload, loadData]);
|
}, [isAllowDataLoad, reload, loadData]);
|
||||||
|
|
||||||
//Возвращаем данные циклограммы
|
//Возвращаем данные циклограммы
|
||||||
return { cyclogram, isDataLoaded, isDataFound, isLoading, doReload };
|
return { cyclogram, isDataLoaded, isLoading, doReload };
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
|||||||
@ -7,18 +7,16 @@
|
|||||||
//Подключение библиотек
|
//Подключение библиотек
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useReducer, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML } from "../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../core/utils"; //Вспомогательные функции
|
||||||
import config from "../../app.config"; //Настройки приложения
|
|
||||||
import { DG_AT, INITIAL_STATE, dataGridReducer } from "./p8p_data_grid_reducer"; //Редьюсер состояния
|
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
//---------
|
//---------
|
||||||
|
|
||||||
//Константы - значения по умолчанию
|
//Константы - значения по умолчанию
|
||||||
const DG_PAGE_SIZE_DEF = config.SYSTEM.PAGE_SIZE; //Размер страницы
|
const DG_PAGE_SIZE_DEF = 10; //Размер страницы
|
||||||
const DG_NODE_NAME_DEF = "XDATA_GRID"; //Наименование узла, содержащего информацию о таблице
|
const DG_NODE_NAME_DEF = "XDATA_GRID"; //Наименование узла, содержащего информацию о таблице
|
||||||
const FILTERS_NODE_NAME_DEF = "filters"; //Наименование узла отборов
|
const FILTERS_NODE_NAME_DEF = "filters"; //Наименование узла отборов
|
||||||
const ORDERS_NODE_NAME_DEF = "orders"; //Наименование узла сортировок
|
const ORDERS_NODE_NAME_DEF = "orders"; //Наименование узла сортировок
|
||||||
@ -40,39 +38,38 @@ const useP8PDataGrid = ({
|
|||||||
initFilters = [],
|
initFilters = [],
|
||||||
initOrders = [],
|
initOrders = [],
|
||||||
storedArgs = {},
|
storedArgs = {},
|
||||||
resetPageNumberOnStoredArgsChange = true,
|
|
||||||
executeStoredArgs = {},
|
executeStoredArgs = {},
|
||||||
resetPageNumberOnExecuteStoredArgsChange = true,
|
|
||||||
allowDataLoad = () => true
|
allowDataLoad = () => true
|
||||||
}) => {
|
}) => {
|
||||||
//Подключим редьюсер состояния
|
//Собственное состояние - таблица данных
|
||||||
const [state, dispatch] = useReducer(dataGridReducer, INITIAL_STATE({ initFilters, initOrders }));
|
const [dataGrid, setDataGrid] = useState({
|
||||||
|
columnsDef: [],
|
||||||
|
groups: [],
|
||||||
|
rows: [],
|
||||||
|
filters: Array.isArray(initFilters) ? [...initFilters] : [],
|
||||||
|
orders: Array.isArray(initOrders) ? [...initOrders] : [],
|
||||||
|
pageNumber: 1,
|
||||||
|
pagesAlign: null,
|
||||||
|
pagesPosition: null,
|
||||||
|
pagesCount: 0,
|
||||||
|
fixedColumns: 0,
|
||||||
|
fixedHeader: false,
|
||||||
|
morePages: true
|
||||||
|
});
|
||||||
|
|
||||||
//Установка даных таблицы
|
//Собственное состояние - признак загрузки данных
|
||||||
const setDataGrid = (dataGridData, pageSize, isError) => dispatch({ type: DG_AT.SET_DATA_GRID, payload: { dataGridData, pageSize, isError } });
|
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
||||||
|
|
||||||
//Установка фильтра таблицы
|
//Собственное состояние - флаг загрузки
|
||||||
const setDataGridFilter = filters => dispatch({ type: DG_AT.SET_DATA_GRID_FILTER, payload: filters });
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
|
||||||
//Установка сортировок таблицы
|
//Собственное состояние - необходимость обновления данных
|
||||||
const setDataGridOrder = orders => dispatch({ type: DG_AT.SET_DATA_GRID_ORDER, payload: orders });
|
const [reload, setReload] = useState(true);
|
||||||
|
|
||||||
//Установка страницы таблицы
|
//Собственное состояние - дополнительные параметры процедуры
|
||||||
const setDataGridPageNumber = pageNumber => dispatch({ type: DG_AT.SET_DATA_GRID_PAGE_NUMBER, payload: pageNumber });
|
|
||||||
|
|
||||||
//Установка флага загруженности данных
|
|
||||||
const setIsDataLoaded = isDataLoaded => dispatch({ type: DG_AT.SET_IS_DATA_LOADED, payload: isDataLoaded });
|
|
||||||
|
|
||||||
//Установка флага активности процесса загрузки данных
|
|
||||||
const setIsLoading = isLoading => dispatch({ type: DG_AT.SET_IS_LOADING, payload: isLoading });
|
|
||||||
|
|
||||||
//Установка флага необходимости обновления данных
|
|
||||||
const setReload = (reload, resetPageNumber = false) => dispatch({ type: DG_AT.SET_RELOAD, payload: { reload, resetPageNumber } });
|
|
||||||
|
|
||||||
//Ссылка на актуальные параметры хранимой процедуры
|
|
||||||
const refStoredArgs = useRef(storedArgs);
|
const refStoredArgs = useRef(storedArgs);
|
||||||
|
|
||||||
//Ссылка на актуальные параметры исполнения хранимой процедуры
|
//Собственное состояние - дополнительные параметры вызова процедуры
|
||||||
const refExecuteStoredArgs = useRef(executeStoredArgs);
|
const refExecuteStoredArgs = useRef(executeStoredArgs);
|
||||||
|
|
||||||
//Признак допустимости обновления данных
|
//Признак допустимости обновления данных
|
||||||
@ -81,46 +78,57 @@ const useP8PDataGrid = ({
|
|||||||
}, [allowDataLoad]);
|
}, [allowDataLoad]);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB, isRespErr } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB, isRespErr } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
//Поднимаем флаг начала загрузки данных
|
setLoading(true);
|
||||||
setIsLoading(true);
|
|
||||||
//Получаем данные с сервера БД
|
|
||||||
const data = await executeStored({
|
const data = await executeStored({
|
||||||
stored,
|
stored,
|
||||||
args: {
|
args: {
|
||||||
CFILTERS: {
|
CFILTERS: { VALUE: object2Base64XML(dataGrid.filters, { arrayNodeName: filtersNodeName }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
|
||||||
VALUE: object2Base64XML(state.dataGrid.filters, { arrayNodeName: filtersNodeName }),
|
CORDERS: { VALUE: object2Base64XML(dataGrid.orders, { arrayNodeName: ordersNodeName }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
|
||||||
SDATA_TYPE: SERV_DATA_TYPE_CLOB
|
NPAGE_NUMBER: dataGrid.pageNumber,
|
||||||
},
|
|
||||||
CORDERS: { VALUE: object2Base64XML(state.dataGrid.orders, { arrayNodeName: ordersNodeName }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
|
|
||||||
NPAGE_NUMBER: state.dataGrid.pageNumber,
|
|
||||||
NPAGE_SIZE: pageSize,
|
NPAGE_SIZE: pageSize,
|
||||||
NINCLUDE_DEF: reloadDef ? 1 : state.isDataLoaded ? 0 : 1,
|
NINCLUDE_DEF: reloadDef ? 1 : dataGrid.dataLoaded ? 0 : 1,
|
||||||
...refStoredArgs.current
|
...refStoredArgs.current
|
||||||
},
|
},
|
||||||
respArg,
|
respArg,
|
||||||
...refExecuteStoredArgs.current
|
...refExecuteStoredArgs.current
|
||||||
});
|
});
|
||||||
//Устанавливаем полученные бизнес-данные, признак загрузки данных с учетом возможных ошибок, признак наличия бизнес-данных
|
setDataGrid(pv => ({
|
||||||
setDataGrid(data[contentNodeName], pageSize, isRespErr(data));
|
...pv,
|
||||||
|
...data[contentNodeName],
|
||||||
|
columnsDef: data[contentNodeName].columnsDef ? [...data[contentNodeName].columnsDef] : pv.columnsDef || [],
|
||||||
|
rows:
|
||||||
|
data[contentNodeName].pagesCount > 0 || pv.pageNumber == 1
|
||||||
|
? [...(data[contentNodeName].rows || [])]
|
||||||
|
: [...(pv.rows || []), ...(data[contentNodeName].rows || [])],
|
||||||
|
groups: data[contentNodeName].groups
|
||||||
|
? data[contentNodeName].pagesCount > 0 || pv.pageNumber == 1
|
||||||
|
? [...(data[contentNodeName].groups || [])]
|
||||||
|
: [...(pv.groups || []), ...data[contentNodeName].groups.filter(g => !pv.groups.find(pg => pg.name == g.name))]
|
||||||
|
: [...(pv.groups || [])],
|
||||||
|
morePages: data[contentNodeName].morePages && (data[contentNodeName].rows || []).length >= pageSize
|
||||||
|
}));
|
||||||
|
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
||||||
|
setIsDataLoaded(!isRespErr(data));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//Если произошла ошибка - данные не загружены
|
//Если произошла ошибка - данные не загружены
|
||||||
setIsDataLoaded(false);
|
setIsDataLoaded(false);
|
||||||
} finally {
|
} finally {
|
||||||
//Сбрасываем признаки загрузки и перезагрузки данных
|
//Сбрасываем признаки загрузки и перезагрузки данных
|
||||||
setIsLoading(false);
|
setLoading(false);
|
||||||
|
setReload(false);
|
||||||
}
|
}
|
||||||
}, [
|
}, [
|
||||||
SERV_DATA_TYPE_CLOB,
|
SERV_DATA_TYPE_CLOB,
|
||||||
contentNodeName,
|
contentNodeName,
|
||||||
state.isDataLoaded,
|
dataGrid.dataLoaded,
|
||||||
state.dataGrid.filters,
|
dataGrid.filters,
|
||||||
state.dataGrid.orders,
|
dataGrid.orders,
|
||||||
state.dataGrid.pageNumber,
|
dataGrid.pageNumber,
|
||||||
executeStored,
|
executeStored,
|
||||||
filtersNodeName,
|
filtersNodeName,
|
||||||
isRespErr,
|
isRespErr,
|
||||||
@ -132,30 +140,48 @@ const useP8PDataGrid = ({
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
//При изменении состояния фильтра
|
//При изменении состояния фильтра
|
||||||
const handleFilterChanged = useCallback(({ filters }) => setDataGridFilter(filters), []);
|
const handleFilterChanged = useCallback(({ filters }) => {
|
||||||
|
setDataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1 }));
|
||||||
|
setReload(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
//При изменении состояния сортировки
|
//При изменении состояния сортировки
|
||||||
const handleOrderChanged = useCallback(({ orders }) => setDataGridOrder(orders), []);
|
const handleOrderChanged = useCallback(({ orders }) => {
|
||||||
|
setDataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1 }));
|
||||||
|
setReload(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
//При изменении количества отображаемых страниц
|
//При изменении количества отображаемых страниц
|
||||||
const handlePagesCountChanged = useCallback(() => setDataGridPageNumber(state.dataGrid.pageNumber + 1), [state.dataGrid.pageNumber]);
|
const handlePagesCountChanged = useCallback(() => {
|
||||||
|
setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1 }));
|
||||||
|
setReload(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
//При изменении страницы отображения
|
//При изменении страницы отображения
|
||||||
const handlePageChange = useCallback(({ page }) => setDataGridPageNumber(page), []);
|
const handlePageChange = useCallback(({ page }) => {
|
||||||
|
setDataGrid(pv => ({ ...pv, pageNumber: page }));
|
||||||
|
setReload(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
//При необходимости обновления таблицы
|
//При необходимости обновления таблицы
|
||||||
const doReload = useCallback(
|
const doReload = useCallback(
|
||||||
({ returnOnFirstPage = false }) => setReload(true, state.dataGrid.pagesCount <= 0 || returnOnFirstPage),
|
({ returnOnFirstPage = false }) => {
|
||||||
[state.dataGrid.pagesCount]
|
//Если это не страничный вывод или установлен признак возврата на первую страницу
|
||||||
|
if (dataGrid.pagesCount <= 0 || returnOnFirstPage) {
|
||||||
|
setDataGrid(pv => ({ ...pv, pageNumber: 1 }));
|
||||||
|
}
|
||||||
|
setReload(true);
|
||||||
|
},
|
||||||
|
[dataGrid.pagesCount]
|
||||||
);
|
);
|
||||||
|
|
||||||
//Проверка изменений параметров
|
//Проверка изменений параметров
|
||||||
const isArgsChanged = useCallback(
|
const isArgsChanged = useCallback(
|
||||||
(currentArgs, args) => {
|
(currentArgs, args) => {
|
||||||
//Если дополнительные параметры изменились (и сейчас не происходит загрузка данных с сервера)
|
//Если дополнительные параметры изменились (и сейчас не происходит загрузка данных с сервера)
|
||||||
return !state.isLoading && JSON.stringify(currentArgs) != JSON.stringify(args);
|
return !isLoading && JSON.stringify(currentArgs) != JSON.stringify(args);
|
||||||
},
|
},
|
||||||
[state.isLoading]
|
[isLoading]
|
||||||
);
|
);
|
||||||
|
|
||||||
//При изменение дополнительных параметров процедуры
|
//При изменение дополнительных параметров процедуры
|
||||||
@ -165,9 +191,9 @@ const useP8PDataGrid = ({
|
|||||||
//Устанавливаем новые дополнительные параметры
|
//Устанавливаем новые дополнительные параметры
|
||||||
refStoredArgs.current = storedArgs;
|
refStoredArgs.current = storedArgs;
|
||||||
//При изменении дополнительных параметров необходимо перезагрузить данные
|
//При изменении дополнительных параметров необходимо перезагрузить данные
|
||||||
setReload(true, resetPageNumberOnStoredArgsChange);
|
setReload(true);
|
||||||
}
|
}
|
||||||
}, [storedArgs, resetPageNumberOnStoredArgsChange, isArgsChanged]);
|
}, [storedArgs, isArgsChanged]);
|
||||||
|
|
||||||
//При изменение дополнительных параметров вызова процедуры
|
//При изменение дополнительных параметров вызова процедуры
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -176,29 +202,19 @@ const useP8PDataGrid = ({
|
|||||||
//Устанавливаем новые дополнительные параметры
|
//Устанавливаем новые дополнительные параметры
|
||||||
refExecuteStoredArgs.current = executeStoredArgs;
|
refExecuteStoredArgs.current = executeStoredArgs;
|
||||||
//При изменении дополнительных параметров необходимо перезагрузить данные
|
//При изменении дополнительных параметров необходимо перезагрузить данные
|
||||||
setReload(true, resetPageNumberOnExecuteStoredArgsChange);
|
setReload(true);
|
||||||
}
|
}
|
||||||
}, [executeStoredArgs, resetPageNumberOnExecuteStoredArgsChange, isArgsChanged]);
|
}, [executeStoredArgs, isArgsChanged]);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isAllowDataLoad && state.reload) {
|
if (isAllowDataLoad && reload) {
|
||||||
loadData();
|
loadData();
|
||||||
}
|
}
|
||||||
}, [isAllowDataLoad, state.reload, loadData]);
|
}, [isAllowDataLoad, reload, loadData]);
|
||||||
|
|
||||||
//Возвращаем данные таблицы
|
//Возвращаем данные таблицы
|
||||||
return {
|
return { dataGrid, isDataLoaded, isLoading, handleFilterChanged, handleOrderChanged, handlePagesCountChanged, handlePageChange, doReload };
|
||||||
dataGrid: state.dataGrid,
|
|
||||||
isDataLoaded: state.isDataLoaded,
|
|
||||||
isDataFound: state.isDataFound,
|
|
||||||
isLoading: state.isLoading,
|
|
||||||
handleFilterChanged,
|
|
||||||
handleOrderChanged,
|
|
||||||
handlePagesCountChanged,
|
|
||||||
handlePageChange,
|
|
||||||
doReload
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
|||||||
@ -1,116 +0,0 @@
|
|||||||
/*
|
|
||||||
Парус 8 - Панели мониторинга
|
|
||||||
Таблица данных - редьюсер состояния
|
|
||||||
*/
|
|
||||||
|
|
||||||
//---------
|
|
||||||
//Константы
|
|
||||||
//---------
|
|
||||||
|
|
||||||
//Типы действий
|
|
||||||
const DG_AT = {
|
|
||||||
SET_DATA_GRID: "SET_DATA_GRID", //Установка даных таблицы
|
|
||||||
SET_DATA_GRID_FILTER: "SET_DATA_GRID_FILTER", //Установка фильтра таблицы
|
|
||||||
SET_DATA_GRID_ORDER: "SET_DATA_GRID_ORDER", //Установка сортировок таблицы
|
|
||||||
SET_DATA_GRID_PAGE_NUMBER: "SET_DATA_GRID_PAGE_NUMBER", //Установка страницы таблицы
|
|
||||||
SET_IS_DATA_LOADED: "SET_IS_DATA_LOADED", //Установка флага загруженности данных
|
|
||||||
SET_IS_LOADING: "SET_IS_LOADING", //Установка флага активности процесса загрузки данных
|
|
||||||
SET_RELOAD: "SET_RELOAD" //Установка флага необходимости обновления данных
|
|
||||||
};
|
|
||||||
|
|
||||||
//Состояние приложения по умолчанию
|
|
||||||
const INITIAL_STATE = ({ initFilters, initOrders }) => ({
|
|
||||||
dataGrid: {
|
|
||||||
columnsDef: [],
|
|
||||||
groups: [],
|
|
||||||
rows: [],
|
|
||||||
filters: Array.isArray(initFilters) ? [...initFilters] : [],
|
|
||||||
orders: Array.isArray(initOrders) ? [...initOrders] : [],
|
|
||||||
pageNumber: 1,
|
|
||||||
pagesAlign: null,
|
|
||||||
pagesPosition: null,
|
|
||||||
pagesCount: 0,
|
|
||||||
fixedColumns: 0,
|
|
||||||
fixedHeader: false,
|
|
||||||
morePages: false
|
|
||||||
},
|
|
||||||
isDataLoaded: false,
|
|
||||||
isDataFound: false,
|
|
||||||
isLoading: false,
|
|
||||||
reload: true
|
|
||||||
});
|
|
||||||
|
|
||||||
//-----------
|
|
||||||
//Тело модуля
|
|
||||||
//-----------
|
|
||||||
|
|
||||||
//Обработчики действий
|
|
||||||
const handlers = {
|
|
||||||
//Установка даных таблицы
|
|
||||||
[DG_AT.SET_DATA_GRID]: (state, { payload }) => {
|
|
||||||
const { dataGridData, pageSize, isError } = payload;
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
dataGrid: {
|
|
||||||
...state.dataGrid,
|
|
||||||
...dataGridData,
|
|
||||||
columnsDef: dataGridData.columnsDef ? [...dataGridData.columnsDef] : state.dataGrid.columnsDef || [],
|
|
||||||
rows:
|
|
||||||
dataGridData.pagesCount > 0 || state.dataGrid.pageNumber == 1
|
|
||||||
? [...(dataGridData.rows || [])]
|
|
||||||
: [...(state.dataGrid.rows || []), ...(dataGridData.rows || [])],
|
|
||||||
groups: dataGridData.groups
|
|
||||||
? dataGridData.pagesCount > 0 || state.dataGrid.pageNumber == 1
|
|
||||||
? [...(dataGridData.groups || [])]
|
|
||||||
: [...(state.dataGrid.groups || []), ...dataGridData.groups.filter(g => !state.dataGrid.groups.find(pg => pg.name == g.name))]
|
|
||||||
: [...(state.dataGrid.groups || [])],
|
|
||||||
morePages: dataGridData.morePages && (dataGridData.rows || []).length >= pageSize
|
|
||||||
},
|
|
||||||
isDataLoaded: isError === true ? false : true,
|
|
||||||
isDataFound:
|
|
||||||
(state.dataGrid.pageNumber == 1 && dataGridData?.rows?.length > 0) ||
|
|
||||||
(state.dataGrid.pageNumber != 1 && state.dataGrid.rows.length > 0)
|
|
||||||
};
|
|
||||||
},
|
|
||||||
//Установка фильтра таблицы
|
|
||||||
[DG_AT.SET_DATA_GRID_FILTER]: (state, { payload }) => ({
|
|
||||||
...state,
|
|
||||||
dataGrid: { ...state.dataGrid, filters: [...payload], pageNumber: 1 },
|
|
||||||
reload: true
|
|
||||||
}),
|
|
||||||
//Установка сортировок таблицы
|
|
||||||
[DG_AT.SET_DATA_GRID_ORDER]: (state, { payload }) => ({
|
|
||||||
...state,
|
|
||||||
dataGrid: { ...state.dataGrid, orders: [...payload], pageNumber: 1 },
|
|
||||||
reload: true
|
|
||||||
}),
|
|
||||||
//Установка страницы таблицы
|
|
||||||
[DG_AT.SET_DATA_GRID_PAGE_NUMBER]: (state, { payload }) => ({ ...state, dataGrid: { ...state.dataGrid, pageNumber: payload }, reload: true }),
|
|
||||||
//Установка флага загруженности данных
|
|
||||||
[DG_AT.SET_IS_DATA_LOADED]: (state, { payload }) => ({ ...state, isDataLoaded: payload }),
|
|
||||||
//Установка флага активности процесса загрузки данных
|
|
||||||
[DG_AT.SET_IS_LOADING]: (state, { payload }) => ({ ...state, isLoading: payload, reload: payload === false ? false : state.reload }),
|
|
||||||
//Установка флага необходимости обновления данных
|
|
||||||
[DG_AT.SET_RELOAD]: (state, { payload }) => ({
|
|
||||||
...state,
|
|
||||||
reload: payload.reload,
|
|
||||||
...(payload.resetPageNumber ? { dataGrid: { ...state.dataGrid, pageNumber: 1 } } : {})
|
|
||||||
}),
|
|
||||||
//Обработчик по умолчанию
|
|
||||||
DEFAULT: state => state
|
|
||||||
};
|
|
||||||
|
|
||||||
//----------------
|
|
||||||
//Интерфейс модуля
|
|
||||||
//----------------
|
|
||||||
|
|
||||||
//Константы
|
|
||||||
export { DG_AT, INITIAL_STATE };
|
|
||||||
|
|
||||||
//Редьюсер состояния
|
|
||||||
export const dataGridReducer = (state, action) => {
|
|
||||||
//Подберём обработчик
|
|
||||||
const handle = handlers[action.type] || handlers.DEFAULT;
|
|
||||||
//Исполним его
|
|
||||||
return handle(state, action);
|
|
||||||
};
|
|
||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { formatDateJSONDateOnly } from "../core/utils"; //Вспомогательные функции
|
import { formatDateJSONDateOnly } from "../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -48,9 +48,6 @@ const useP8PGantt = ({
|
|||||||
//Собственное состояние - признак загрузки данных
|
//Собственное состояние - признак загрузки данных
|
||||||
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
||||||
|
|
||||||
//Собственное состояние - признак наличия бизнес-данных в загруженных
|
|
||||||
const [isDataFound, setIsDataFound] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - флаг загрузки
|
//Собственное состояние - флаг загрузки
|
||||||
const [isLoading, setLoading] = useState(false);
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
|
||||||
@ -69,14 +66,12 @@ const useP8PGantt = ({
|
|||||||
}, [allowDataLoad]);
|
}, [allowDataLoad]);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, isRespErr } = useContext(BackEndCtx);
|
const { executeStored, isRespErr } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных диаграммы ганта с сервера
|
//Загрузка данных диаграммы ганта с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
//Поднимаем флаг начала загрузки данных
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
//Получаем данные с сервера БД
|
|
||||||
const data = await executeStored({
|
const data = await executeStored({
|
||||||
stored,
|
stored,
|
||||||
args: { ...refStoredArgs.current },
|
args: { ...refStoredArgs.current },
|
||||||
@ -85,9 +80,6 @@ const useP8PGantt = ({
|
|||||||
respArg,
|
respArg,
|
||||||
...refExecuteStoredArgs.current
|
...refExecuteStoredArgs.current
|
||||||
});
|
});
|
||||||
//Устанавливаем флаг наличия бизнес-данных
|
|
||||||
setIsDataFound(data[contentNodeName]?.tasks?.length > 0);
|
|
||||||
//Устанавливаем бизнес-данные
|
|
||||||
setGantt(pv => ({ ...pv, ...data[contentNodeName] }));
|
setGantt(pv => ({ ...pv, ...data[contentNodeName] }));
|
||||||
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
||||||
setIsDataLoaded(!isRespErr(data));
|
setIsDataLoaded(!isRespErr(data));
|
||||||
@ -146,7 +138,7 @@ const useP8PGantt = ({
|
|||||||
}, [isAllowDataLoad, reload, loadData]);
|
}, [isAllowDataLoad, reload, loadData]);
|
||||||
|
|
||||||
//Возвращаем данные диаграммы ганта
|
//Возвращаем данные диаграммы ганта
|
||||||
return { gantt, isDataLoaded, isDataFound, isLoading, doReload };
|
return { gantt, isDataLoaded, isLoading, doReload };
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext, useRef, useMemo } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { P8P_INDICATOR_STATE, P8P_INDICATOR_VARIANT } from "./p8p_indicator";
|
import { P8P_INDICATOR_STATE, P8P_INDICATOR_VARIANT } from "./p8p_indicator";
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -50,9 +50,6 @@ const useP8PIndicator = ({
|
|||||||
//Собственное состояние - признак загрузки данных
|
//Собственное состояние - признак загрузки данных
|
||||||
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
const [isDataLoaded, setIsDataLoaded] = useState(false);
|
||||||
|
|
||||||
//Собственное состояние - признак наличия бизнес-данных в загруженных
|
|
||||||
const [isDataFound, setIsDataFound] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - флаг загрузки
|
//Собственное состояние - флаг загрузки
|
||||||
const [isLoading, setLoading] = useState(false);
|
const [isLoading, setLoading] = useState(false);
|
||||||
|
|
||||||
@ -71,18 +68,13 @@ const useP8PIndicator = ({
|
|||||||
}, [allowDataLoad]);
|
}, [allowDataLoad]);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, isRespErr } = useContext(BackEndCtx);
|
const { executeStored, isRespErr } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных индикатора с сервера
|
//Загрузка данных индикатора с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
//Поднимаем флаг начала загрузки данных
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
//Получаем данные с сервера БД
|
|
||||||
const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current });
|
const data = await executeStored({ stored, respArg, args: { ...refStoredArgs.current }, ...refExecuteStoredArgs.current });
|
||||||
//Устанавливаем флаг наличия бизнес-данных
|
|
||||||
setIsDataFound(data[contentNodeName]?.caption && data[contentNodeName]?.value != undefined);
|
|
||||||
//Устанавливаем бизнес-данные
|
|
||||||
setIndicator(pv => ({ ...pv, ...data[contentNodeName] }));
|
setIndicator(pv => ({ ...pv, ...data[contentNodeName] }));
|
||||||
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
//Устанавливаем признак загрузки данных с учетом возможных ошибок
|
||||||
setIsDataLoaded(!isRespErr(data));
|
setIsDataLoaded(!isRespErr(data));
|
||||||
@ -141,7 +133,7 @@ const useP8PIndicator = ({
|
|||||||
}, [isAllowDataLoad, reload, loadData]);
|
}, [isAllowDataLoad, reload, loadData]);
|
||||||
|
|
||||||
//Возвращаем данные индикатора
|
//Возвращаем данные индикатора
|
||||||
return { indicator, isDataLoaded, isDataFound, isLoading, doReload };
|
return { indicator, isDataLoaded, isLoading, doReload };
|
||||||
};
|
};
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
|
|||||||
@ -10,8 +10,8 @@
|
|||||||
import React, { useReducer, createContext, useEffect, useContext, useCallback, useMemo } from "react"; //ReactJS
|
import React, { useReducer, createContext, useEffect, useContext, useCallback, useMemo } from "react"; //ReactJS
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { APP_AT, INITIAL_STATE, applicationReducer } from "./application_reducer"; //Редьюсер состояния
|
import { APP_AT, INITIAL_STATE, applicationReducer } from "./application_reducer"; //Редьюсер состояния
|
||||||
import { MessagingCtx } from "./messaging"; //Контекст отображения сообщений
|
import { MessagingСtx } from "./messaging"; //Контекст отображения сообщений
|
||||||
import { BackEndCtx } from "./backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "./backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -31,7 +31,7 @@ const APPLICATION_CONTEXT_ERRORS_SHAPE = PropTypes.shape({
|
|||||||
//----------------
|
//----------------
|
||||||
|
|
||||||
//Контекст приложения
|
//Контекст приложения
|
||||||
export const ApplicationCtx = createContext();
|
export const ApplicationСtx = createContext();
|
||||||
|
|
||||||
//Провайдер контекста приложения
|
//Провайдер контекста приложения
|
||||||
export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, config, children }) => {
|
export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, config, children }) => {
|
||||||
@ -39,10 +39,10 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
|
|||||||
const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE(displaySizeGetter));
|
const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE(displaySizeGetter));
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { getConfig, getRespPayload } = useContext(BackEndCtx);
|
const { getConfig, getRespPayload } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту отображения сообщений
|
//Подключение к контексту отображения сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Установка флага инициализированности приложения
|
//Установка флага инициализированности приложения
|
||||||
const setInitialized = () => dispatch({ type: APP_AT.SET_INITIALIZED });
|
const setInitialized = () => dispatch({ type: APP_AT.SET_INITIALIZED });
|
||||||
@ -59,9 +59,6 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
|
|||||||
//Установка заголовка в шапке приложения
|
//Установка заголовка в шапке приложения
|
||||||
const setAppBarTitle = useCallback(appBarTitle => dispatch({ type: APP_AT.SET_APP_BAR_TITLE, payload: appBarTitle }), []);
|
const setAppBarTitle = useCallback(appBarTitle => dispatch({ type: APP_AT.SET_APP_BAR_TITLE, payload: appBarTitle }), []);
|
||||||
|
|
||||||
//Установка флага отображения шапки приложения
|
|
||||||
const setAppBarShow = useCallback(appBarShow => dispatch({ type: APP_AT.SET_APP_BAR_SHOW, payload: appBarShow }), []);
|
|
||||||
|
|
||||||
//Поиск раздела по имени
|
//Поиск раздела по имени
|
||||||
const findPanelByName = name => state.panels.find(panel => panel.name == name);
|
const findPanelByName = name => state.panels.find(panel => panel.name == name);
|
||||||
|
|
||||||
@ -173,10 +170,9 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
|
|||||||
|
|
||||||
//Вернём компонент провайдера
|
//Вернём компонент провайдера
|
||||||
return (
|
return (
|
||||||
<ApplicationCtx.Provider
|
<ApplicationСtx.Provider
|
||||||
value={{
|
value={{
|
||||||
setAppBarTitle,
|
setAppBarTitle,
|
||||||
setAppBarShow,
|
|
||||||
findPanelByName,
|
findPanelByName,
|
||||||
pOnlineShowTab,
|
pOnlineShowTab,
|
||||||
pOnlineShowUnit,
|
pOnlineShowUnit,
|
||||||
@ -190,7 +186,7 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</ApplicationCtx.Provider>
|
</ApplicationСtx.Provider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -13,15 +13,13 @@ const APP_AT = {
|
|||||||
LOAD_PANELS: "LOAD_PANELS", //Загрузка списка панелей
|
LOAD_PANELS: "LOAD_PANELS", //Загрузка списка панелей
|
||||||
SET_INITIALIZED: "SET_INITIALIZED", //Установка флага инициализированности приложения
|
SET_INITIALIZED: "SET_INITIALIZED", //Установка флага инициализированности приложения
|
||||||
SET_DISPLAY_SIZE: "SET_DISPLAY_SIZE", //Установка текущего типового размера экрана
|
SET_DISPLAY_SIZE: "SET_DISPLAY_SIZE", //Установка текущего типового размера экрана
|
||||||
SET_APP_BAR_TITLE: "SET_APP_BAR_TITLE", //Установка заголовка в шапке приложения
|
SET_APP_BAR_TITLE: "SET_APP_BAR_TITLE" //Установка заголовка в шапке приложения
|
||||||
SET_APP_BAR_SHOW: "SET_APP_BAR_SHOW" //Установка флага отображения шапки приложения
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//Состояние приложения по умолчанию
|
//Состояние приложения по умолчанию
|
||||||
const INITIAL_STATE = displaySizeGetter => ({
|
const INITIAL_STATE = displaySizeGetter => ({
|
||||||
displaySize: displaySizeGetter(),
|
displaySize: displaySizeGetter(),
|
||||||
appBarTitle: "",
|
appBarTitle: "",
|
||||||
appBarShow: true,
|
|
||||||
urlBase: "",
|
urlBase: "",
|
||||||
panels: [],
|
panels: [],
|
||||||
panelsLoaded: false,
|
panelsLoaded: false,
|
||||||
@ -52,8 +50,6 @@ const handlers = {
|
|||||||
[APP_AT.SET_DISPLAY_SIZE]: (state, { payload }) => ({ ...state, displaySize: payload }),
|
[APP_AT.SET_DISPLAY_SIZE]: (state, { payload }) => ({ ...state, displaySize: payload }),
|
||||||
//Установка заголовка в шапке приложения
|
//Установка заголовка в шапке приложения
|
||||||
[APP_AT.SET_APP_BAR_TITLE]: (state, { payload }) => ({ ...state, appBarTitle: payload }),
|
[APP_AT.SET_APP_BAR_TITLE]: (state, { payload }) => ({ ...state, appBarTitle: payload }),
|
||||||
//Установка флага отображения шапки приложения
|
|
||||||
[APP_AT.SET_APP_BAR_SHOW]: (state, { payload }) => ({ ...state, appBarShow: payload }),
|
|
||||||
//Обработчик по умолчанию
|
//Обработчик по умолчанию
|
||||||
DEFAULT: state => state
|
DEFAULT: state => state
|
||||||
};
|
};
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
import React, { createContext, useContext, useCallback } from "react"; //ReactJS
|
import React, { createContext, useContext, useCallback } from "react"; //ReactJS
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { MessagingCtx } from "./messaging"; //Контекст сообщений
|
import { MessagingСtx } from "./messaging"; //Контекст сообщений
|
||||||
import { formatErrorMessage } from "../core/utils"; //Вспомогательные функции
|
import { formatErrorMessage } from "../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -34,12 +34,12 @@ const BACKEND_CONTEXT_CLIENT_SHAPE = PropTypes.shape({
|
|||||||
//----------------
|
//----------------
|
||||||
|
|
||||||
//Контекст взаимодействия с серверным API
|
//Контекст взаимодействия с серверным API
|
||||||
export const BackEndCtx = createContext();
|
export const BackEndСtx = createContext();
|
||||||
|
|
||||||
//Провайдер контекста взаимодействия с серверным API
|
//Провайдер контекста взаимодействия с серверным API
|
||||||
export const BackEndContext = ({ client, children }) => {
|
export const BackEndContext = ({ client, children }) => {
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showLoader, hideLoader, showMsgErr } = useContext(MessagingCtx);
|
const { showLoader, hideLoader, showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Проверка ответа на наличие ошибки
|
//Проверка ответа на наличие ошибки
|
||||||
const isRespErr = useCallback(resp => client.isRespErr(resp), [client]);
|
const isRespErr = useCallback(resp => client.isRespErr(resp), [client]);
|
||||||
@ -116,7 +116,7 @@ export const BackEndContext = ({ client, children }) => {
|
|||||||
|
|
||||||
//Вернём компонент провайдера
|
//Вернём компонент провайдера
|
||||||
return (
|
return (
|
||||||
<BackEndCtx.Provider
|
<BackEndСtx.Provider
|
||||||
value={{
|
value={{
|
||||||
SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,
|
SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,
|
||||||
SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,
|
SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,
|
||||||
@ -130,7 +130,7 @@ export const BackEndContext = ({ client, children }) => {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</BackEndCtx.Provider>
|
</BackEndСtx.Provider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,7 @@ const MESSAGING_CONTEXT_BUTTONS_SHAPE = PropTypes.shape({
|
|||||||
//----------------
|
//----------------
|
||||||
|
|
||||||
//Контекст сообщений
|
//Контекст сообщений
|
||||||
export const MessagingCtx = createContext();
|
export const MessagingСtx = createContext();
|
||||||
|
|
||||||
//Провайдер контекста сообщений
|
//Провайдер контекста сообщений
|
||||||
export const MessagingContext = ({ titles, texts, buttons, children }) => {
|
export const MessagingContext = ({ titles, texts, buttons, children }) => {
|
||||||
@ -109,7 +109,7 @@ export const MessagingContext = ({ titles, texts, buttons, children }) => {
|
|||||||
|
|
||||||
//Вернём компонент провайдера
|
//Вернём компонент провайдера
|
||||||
return (
|
return (
|
||||||
<MessagingCtx.Provider
|
<MessagingСtx.Provider
|
||||||
value={{
|
value={{
|
||||||
MSG_TYPE,
|
MSG_TYPE,
|
||||||
showLoader,
|
showLoader,
|
||||||
@ -146,7 +146,7 @@ export const MessagingContext = ({ titles, texts, buttons, children }) => {
|
|||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
{children}
|
{children}
|
||||||
</MessagingCtx.Provider>
|
</MessagingСtx.Provider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import React, { createContext, useContext } from "react"; //ReactJS
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { useLocation, useNavigate } from "react-router-dom"; //Роутер приложения
|
import { useLocation, useNavigate } from "react-router-dom"; //Роутер приложения
|
||||||
import queryString from "query-string"; //Работа со строкой запроса
|
import queryString from "query-string"; //Работа со строкой запроса
|
||||||
import { ApplicationCtx } from "./application"; //Контекст приложения
|
import { ApplicationСtx } from "./application"; //Контекст приложения
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -41,7 +41,7 @@ export const NavigationContext = ({ children }) => {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { findPanelByName, setAppBarTitle } = useContext(ApplicationCtx);
|
const { findPanelByName, setAppBarTitle } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Проверка наличия параметров запроса
|
//Проверка наличия параметров запроса
|
||||||
const isNavigationSearch = () => (location.search ? true : false);
|
const isNavigationSearch = () => (location.search ? true : false);
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import React, { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
import React, { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import {
|
import {
|
||||||
Dialog,
|
Dialog,
|
||||||
@ -56,7 +56,7 @@ const FilterDialog = ({ initial, onFilterChange, onFilterClose, onDocLinksLoad }
|
|||||||
const { handleCatalogTreeOpen, handleEventTypesOpen, handleAgnlistOpen, handleInsDepartmentOpen, handleCostStaffGroupsOpen } = useDictionary();
|
const { handleCatalogTreeOpen, handleEventTypesOpen, handleAgnlistOpen, handleInsDepartmentOpen, handleCostStaffGroupsOpen } = useDictionary();
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При изменении типа события фильтра
|
//При изменении типа события фильтра
|
||||||
const handleTypeChange = callBack =>
|
const handleTypeChange = callBack =>
|
||||||
|
|||||||
@ -12,9 +12,9 @@ import PropTypes from "prop-types"; //Контроль свойств компо
|
|||||||
import { Draggable } from "react-beautiful-dnd"; //Работа с drag&drop
|
import { Draggable } from "react-beautiful-dnd"; //Работа с drag&drop
|
||||||
import { Card, CardHeader, Typography, IconButton, Icon, Box, Menu, MenuItem, CardContent, Avatar, Stack } from "@mui/material"; //Интерфейсные компоненты
|
import { Card, CardHeader, Typography, IconButton, Icon, Box, Menu, MenuItem, CardContent, Avatar, Stack } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { TaskDialog } from "../task_dialog"; //Форма события
|
import { TaskDialog } from "../task_dialog"; //Форма события
|
||||||
import { ApplicationCtx } from "../../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../context/messaging"; //Контекст сообщений
|
||||||
import { TASK_COLORS, getTaskExpiredColor, getTaskBgColorByRule, makeCardActionsArray } from "../layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { TASK_COLORS, getTaskExpiredColor, getTaskBgColorByRule, makeCardActionsArray } from "../layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
import { useDictionary } from "../hooks/dict_hooks"; //Состояние открытия разделов
|
import { useDictionary } from "../hooks/dict_hooks"; //Состояние открытия разделов
|
||||||
import { useTasksFunctions } from "../hooks/tasks_hooks"; //Состояние вспомогательных функций событий
|
import { useTasksFunctions } from "../hooks/tasks_hooks"; //Состояние вспомогательных функций событий
|
||||||
@ -141,13 +141,13 @@ const TaskCard = ({ task, index, onTasksReload, colorRule, pointSettings, onOpen
|
|||||||
const { handleTaskStateChange, handleTaskSend } = useTasksFunctions();
|
const { handleTaskStateChange, handleTaskSend } = useTasksFunctions();
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//По нажатию на открытие меню действий
|
//По нажатию на открытие меню действий
|
||||||
const handleMethodsMenuButtonClick = useCallback(event => {
|
const handleMethodsMenuButtonClick = useCallback(event => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useContext, useCallback } from "react"; //Классы React
|
import { useContext, useCallback } from "react"; //Классы React
|
||||||
import { ApplicationCtx } from "../../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -17,7 +17,7 @@ import { ApplicationCtx } from "../../../context/application"; //Контекс
|
|||||||
//Состояние открытия разделов
|
//Состояние открытия разделов
|
||||||
const useDictionary = () => {
|
const useDictionary = () => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Отображение раздела "Сотрудники"
|
//Отображение раздела "Сотрудники"
|
||||||
const handleClientPersonOpen = useCallback(
|
const handleClientPersonOpen = useCallback(
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
import { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { getRandomColor, getLocalStorageValue } from "../layouts"; //Вспомогательные функции
|
import { getRandomColor, getLocalStorageValue } from "../layouts"; //Вспомогательные функции
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
@ -29,7 +29,7 @@ const useExtraData = filtersType => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Считывание учётных документов
|
//Считывание учётных документов
|
||||||
const handleDocLinksLoad = useCallback(
|
const handleDocLinksLoad = useCallback(
|
||||||
@ -99,7 +99,7 @@ const useColorRules = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости загрузки заливок
|
//При необходимости загрузки заливок
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -165,7 +165,7 @@ const useStatuses = filterType => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости сортировки статусов
|
//При необходимости сортировки статусов
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect } from "react"; //Классы React
|
import { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -48,7 +48,7 @@ const useClientEvent = (taskRn, taskType = "") => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При инициализации события
|
//При инициализации события
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -161,7 +161,7 @@ const useDocsProps = taskType => {
|
|||||||
const [docProps, setDocsProps] = useState({ loaded: false, props: [] });
|
const [docProps, setDocsProps] = useState({ loaded: false, props: [] });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
//Загрузка доп. свойств
|
//Загрузка доп. свойств
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
import { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML } from "../../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../../core/utils"; //Вспомогательные функции
|
||||||
import { convertFilterValuesToArray } from "../layouts"; //Вспомогательные функции
|
import { convertFilterValuesToArray } from "../layouts"; //Вспомогательные функции
|
||||||
import { useDictionary } from "./dict_hooks"; //Состояние открытия разделов
|
import { useDictionary } from "./dict_hooks"; //Состояние открытия разделов
|
||||||
@ -23,7 +23,7 @@ const useTasksFunctions = () => {
|
|||||||
const { handleEventRoutesPointExecutersOpen, handleEventRoutesPointsPassessOpen } = useDictionary();
|
const { handleEventRoutesPointExecutersOpen, handleEventRoutesPointsPassessOpen } = useDictionary();
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Выполнение направления события
|
//Выполнение направления события
|
||||||
const handleSendExec = useCallback(
|
const handleSendExec = useCallback(
|
||||||
@ -310,7 +310,7 @@ const useTasks = (filterValues, ordersValues) => {
|
|||||||
const { handleTaskStateChange } = useTasksFunctions();
|
const { handleTaskStateChange } = useTasksFunctions();
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Инициализация параметров события
|
//Инициализация параметров события
|
||||||
const initTask = (id, task, avatar = null) => {
|
const initTask = (id, task, avatar = null) => {
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import PropTypes from "prop-types"; //Контроль свойств компо
|
|||||||
import { useClientEvent } from "./hooks/task_dialog_hooks"; //Хук для события
|
import { useClientEvent } from "./hooks/task_dialog_hooks"; //Хук для события
|
||||||
import { useDocsProps } from "./hooks/task_dialog_hooks"; //Хук для получения доп. свойств раздела "События"
|
import { useDocsProps } from "./hooks/task_dialog_hooks"; //Хук для получения доп. свойств раздела "События"
|
||||||
import { TaskForm } from "./components/task_form"; //Форма события
|
import { TaskForm } from "./components/task_form"; //Форма события
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { hasValue } from "../../core/utils"; //Вспомогательные процедуры и функции
|
import { hasValue } from "../../core/utils"; //Вспомогательные процедуры и функции
|
||||||
import { P8PDialog } from "../../components/p8p_dialog"; //Типовой диалог
|
import { P8PDialog } from "../../components/p8p_dialog"; //Типовой диалог
|
||||||
@ -37,7 +37,7 @@ const TaskDialog = ({ taskRn, taskType, editable, onTasksReload, onClose }) => {
|
|||||||
const [docPropsReady, setDocPropsReady] = useState(false);
|
const [docPropsReady, setDocPropsReady] = useState(false);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При изменении информации о задаче
|
//При изменении информации о задаче
|
||||||
const handleTaskChange = useCallback(
|
const handleTaskChange = useCallback(
|
||||||
|
|||||||
@ -11,9 +11,9 @@ import React, { useState, useContext, useCallback, useEffect } from "react"; //
|
|||||||
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
import { Box } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
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 { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { headCellRender, dataCellRender, groupCellRender, DIGITS_REG_EXP, MONTH_NAME_REG_EXP, DAY_NAME_REG_EXP } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { headCellRender, dataCellRender, groupCellRender, DIGITS_REG_EXP, MONTH_NAME_REG_EXP, DAY_NAME_REG_EXP } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
||||||
import { Filter } from "./filter"; //Компонент фильтра
|
import { Filter } from "./filter"; //Компонент фильтра
|
||||||
@ -88,13 +88,13 @@ const EqsPrfrm = () => {
|
|||||||
const [refIsDeprecated, setRidFlag] = useState(true);
|
const [refIsDeprecated, setRidFlag] = useState(true);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import React, { useState, useContext } from "react"; //Классы React
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, Grid } from "@mui/material"; //Интерфейсные компоненты
|
import { Dialog, DialogTitle, IconButton, Icon, DialogContent, DialogActions, Button, Box, Grid } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { FilterInputField } from "./filter_input_field"; //Компонент поля ввода
|
import { FilterInputField } from "./filter_input_field"; //Компонент поля ввода
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -77,7 +77,7 @@ const FilterDialog = ({ initial, onCancel, onOk }) => {
|
|||||||
const [filter, setFilter] = useState({ ...initial });
|
const [filter, setFilter] = useState({ ...initial });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При закрытии диалога без изменения фильтра
|
//При закрытии диалога без изменения фильтра
|
||||||
const handleCancel = () => (onCancel ? onCancel() : null);
|
const handleCancel = () => (onCancel ? onCancel() : null);
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -50,7 +50,7 @@ const useMechRecAssemblyMon = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Инициализация каталогов планов
|
//Инициализация каталогов планов
|
||||||
const initPlanCtlgs = useCallback(async () => {
|
const initPlanCtlgs = useCallback(async () => {
|
||||||
@ -134,7 +134,7 @@ const useCostProductComposition = planSpec => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При подключении компонента к странице
|
//При подключении компонента к странице
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -174,7 +174,7 @@ const useProductDetailsTable = (planSpec, product, orders, pageNumber, stored) =
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных при изменении зависимостей
|
//Загрузка данных при изменении зависимостей
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ const useCostJobs = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
//Подключение к контексту навигации
|
//Подключение к контексту навигации
|
||||||
const { getNavigationSearch } = useContext(NavigationCtx);
|
const { getNavigationSearch } = useContext(NavigationCtx);
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ const useCostJobsSpecs = task => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Выдача задания
|
//Выдача задания
|
||||||
const issueCostJobsSpecs = useCallback(
|
const issueCostJobsSpecs = useCallback(
|
||||||
@ -192,7 +192,7 @@ const useEquipConfiguration = (task, fromAction) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Включение станка в строку сменного задания
|
//Включение станка в строку сменного задания
|
||||||
const includeEquipConfiguration = useCallback(
|
const includeEquipConfiguration = useCallback(
|
||||||
|
|||||||
@ -11,7 +11,7 @@ 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 { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { MessagingCtx } 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"; //Вспомогательные хуки
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ const MechRecCostJobs = () => {
|
|||||||
const filteredJobs = useFilteredFcjobs(state.jobList, filter);
|
const filteredJobs = useFilteredFcjobs(state.jobList, filter);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { InlineMsgInfo } = useContext(MessagingCtx);
|
const { InlineMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Выбор плана
|
//Выбор плана
|
||||||
const selectJob = job => {
|
const selectJob = job => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ const useCostJobs = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
//Подключение к контексту навигации
|
//Подключение к контексту навигации
|
||||||
const { getNavigationSearch } = useContext(NavigationCtx);
|
const { getNavigationSearch } = useContext(NavigationCtx);
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ const useCostJobsSpecs = task => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Выдача задания
|
//Выдача задания
|
||||||
const issueCostJobsSpecs = useCallback(
|
const issueCostJobsSpecs = useCallback(
|
||||||
@ -181,7 +181,7 @@ const useCostJobsWorkers = task => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Включение рабочего в строку сменного задания
|
//Включение рабочего в строку сменного задания
|
||||||
const includeWorker = useCallback(
|
const includeWorker = useCallback(
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext } from "react";
|
import { useState, useCallback, useEffect, useContext } from "react";
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML, formatDateRF } from "../../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML, formatDateRF } from "../../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -33,7 +33,7 @@ const useCostRouteLists = (task, taskType) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
@ -104,7 +104,7 @@ const useIncomFromDeps = (task, taskType) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
@ -157,7 +157,7 @@ const useGoodsParties = mainRowRN => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
@ -208,7 +208,7 @@ const useCostDeliveryLists = mainRowRN => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы строк комплектации с сервера
|
//Загрузка данных таблицы строк комплектации с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
|
|||||||
@ -39,8 +39,8 @@ import {
|
|||||||
CardActions,
|
CardActions,
|
||||||
Tooltip
|
Tooltip
|
||||||
} from "@mui/material"; //Интерфейсные элементы
|
} from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
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"; //Заголовок страницы
|
||||||
@ -384,16 +384,16 @@ const MechRecCostProdPlans = () => {
|
|||||||
const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter);
|
const filteredPlanCtgls = useFilteredPlanCtlgs(state.planCtlgs, filter);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { InlineMsgInfo } = useContext(MessagingCtx);
|
const { InlineMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту навигации
|
//Подключение к контексту навигации
|
||||||
const { getNavigationSearch } = useContext(NavigationCtx);
|
const { getNavigationSearch } = useContext(NavigationCtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgInfo } = useContext(MessagingCtx);
|
const { showMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Инициализация каталогов планов
|
//Инициализация каталогов планов
|
||||||
const initPlanCtlgs = useCallback(async () => {
|
const initPlanCtlgs = useCallback(async () => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
import { useState, useCallback, useEffect, useContext } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -40,7 +40,7 @@ const useMechRecDeptCostJobs = (subdiv, fullDate, workHours) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -91,7 +91,7 @@ const useInsDepartment = fullDate => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -142,7 +142,7 @@ const useFilter = (currentMonth, currentYear) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Считываем количества рабочих дней
|
//Считываем количества рабочих дней
|
||||||
const getWorkDays = useCallback(
|
const getWorkDays = useCallback(
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import PropTypes from "prop-types"; //Контроль свойств компо
|
|||||||
import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
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 { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { CostRouteListsSpecsDataGrid } from "./fcroutlstsp"; //Состояние таблицы заказов маршрутных листов
|
import { CostRouteListsSpecsDataGrid } from "./fcroutlstsp"; //Состояние таблицы заказов маршрутных листов
|
||||||
import { useCostRouteLists } from "./hooks.js"; //Хук состояния таблицы маршрутных листов
|
import { useCostRouteLists } from "./hooks.js"; //Хук состояния таблицы маршрутных листов
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ const CostRouteListsDataGrid = ({ task }) => {
|
|||||||
const [costRouteLists, setCostRouteLists] = useCostRouteLists(task);
|
const [costRouteLists, setCostRouteLists] = useCostRouteLists(task);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При изменении состояния сортировки
|
//При изменении состояния сортировки
|
||||||
const handleOrderChanged = ({ orders }) => setCostRouteLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
|
const handleOrderChanged = ({ orders }) => setCostRouteLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import React, { useState, useEffect, useContext, useCallback } from "react"; //Классы React
|
import React, { useState, useEffect, useContext, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -46,7 +46,7 @@ const useDeptCostProdPlans = month => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При подключении компонента к странице
|
//При подключении компонента к странице
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -98,7 +98,7 @@ const useDeptCostProdPlanInfo = plan => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости очистки данных о плане
|
//При необходимости очистки данных о плане
|
||||||
const handleClear = useCallback(
|
const handleClear = useCallback(
|
||||||
@ -187,7 +187,7 @@ const useCostRouteLists = task => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -244,7 +244,7 @@ const useCostRouteListsSpecs = mainRowRN => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -304,7 +304,7 @@ const useIncomFromDeps = task => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заго
|
|||||||
import { useDeptCostProdPlans, useFilteredPlans, useDeptCostProdPlanInfo } from "./hooks"; //Вспомогательные хуки
|
import { useDeptCostProdPlans, useFilteredPlans, useDeptCostProdPlanInfo } from "./hooks"; //Вспомогательные хуки
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
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 { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { IncomFromDepsDataGridDialog } from "./incomefromdeps"; //Диалог сдачи продукции
|
import { IncomFromDepsDataGridDialog } from "./incomefromdeps"; //Диалог сдачи продукции
|
||||||
import { CostRouteListsDataGridDialog } from "./fcroutlst"; //Диалог маршрутных листов
|
import { CostRouteListsDataGridDialog } from "./fcroutlst"; //Диалог маршрутных листов
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ const MechRecDeptCostProdPlans = () => {
|
|||||||
const filteredPlanCtgls = useFilteredPlans(plans.rows, filter);
|
const filteredPlanCtgls = useFilteredPlans(plans.rows, filter);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { InlineMsgInfo } = useContext(MessagingCtx);
|
const { InlineMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Выбор плана
|
//Выбор плана
|
||||||
const selectPlan = plan => {
|
const selectPlan = plan => {
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import React, { useContext, useState } from "react"; //Классы React
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Box, Grid, Typography, Link, List, ListItem, ListItemButton, ListItemText, Divider, Fab, Icon } from "@mui/material"; //Интерфейсные элементы
|
import { Box, Grid, Typography, Link, List, ListItem, ListItemButton, ListItemText, Divider, Fab, Icon } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import img1_1 from "./img/1_1.png"; //Изображение
|
import img1_1 from "./img/1_1.png"; //Изображение
|
||||||
import img1_2 from "./img/1_2.png"; //Изображение
|
import img1_2 from "./img/1_2.png"; //Изображение
|
||||||
import img1_3 from "./img/1_3.png"; //Изображение
|
import img1_3 from "./img/1_3.png"; //Изображение
|
||||||
@ -252,7 +252,7 @@ Img.propTypes = {
|
|||||||
//Ссылка на раздел Системы
|
//Ссылка на раздел Системы
|
||||||
const UnitLink = ({ unitCode, children }) => {
|
const UnitLink = ({ unitCode, children }) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
@ -299,7 +299,7 @@ ChapterLink.propTypes = {
|
|||||||
//Ссылка на информационную панель
|
//Ссылка на информационную панель
|
||||||
const PanelLink = ({ panelName, children }) => {
|
const PanelLink = ({ panelName, children }) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configUrlBase, findPanelByName, pOnlineShowTab } = useContext(ApplicationCtx);
|
const { configUrlBase, findPanelByName, pOnlineShowTab } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -8,8 +8,8 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useEffect, useContext, useCallback, useLayoutEffect } from "react"; //Классы React
|
import { useState, useEffect, useContext, useCallback, useLayoutEffect } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../context/messaging"; //Контекст сообщений
|
||||||
import { object2Base64XML, genUID, xml2JSON } from "../../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML, genUID, xml2JSON } from "../../../core/utils"; //Вспомогательные функции
|
||||||
import { exportXMLFile } from "../layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { exportXMLFile } from "../layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
import { P8P_COMPONENT_SETTINGS_PATHS } from "../../../components/editors/p8p_component_settings"; //Дополнительные настройки источников
|
import { P8P_COMPONENT_SETTINGS_PATHS } from "../../../components/editors/p8p_component_settings"; //Дополнительные настройки источников
|
||||||
@ -184,7 +184,7 @@ const usePanel = () => {
|
|||||||
const [editMode, setEditMode] = useState(true);
|
const [editMode, setEditMode] = useState(true);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости загрузки информации о панели
|
//При необходимости загрузки информации о панели
|
||||||
const loadPanel = async panel => {
|
const loadPanel = async panel => {
|
||||||
@ -244,7 +244,7 @@ const usePanelManager = () => {
|
|||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Добавление панели
|
//Добавление панели
|
||||||
const insertPanel = useCallback(
|
const insertPanel = useCallback(
|
||||||
@ -354,10 +354,10 @@ const usePanelDesc = panel => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Считывание базовой информации о панели
|
//Считывание базовой информации о панели
|
||||||
const getPanelInfo = useCallback(async () => {
|
const getPanelInfo = useCallback(async () => {
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import {
|
|||||||
InputAdornment,
|
InputAdornment,
|
||||||
IconButton
|
IconButton
|
||||||
} from "@mui/material"; //Интерфейсные элементы
|
} from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../../../context/application"; //Контекст приложения
|
||||||
import { P8PEditorBox } from "../../../../components/editors/p8p_editor_box"; //Контейнер редактора
|
import { P8PEditorBox } from "../../../../components/editors/p8p_editor_box"; //Контейнер редактора
|
||||||
import { P8PEditorSubHeader } from "../../../../components/editors/p8p_editor_sub_header"; //Заголовок раздела редактора
|
import { P8PEditorSubHeader } from "../../../../components/editors/p8p_editor_sub_header"; //Заголовок раздела редактора
|
||||||
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Диалог настройки
|
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Диалог настройки
|
||||||
@ -57,7 +57,7 @@ const ItemEditor = ({ item = null, valueProviders = {}, onOk = null, onCancel =
|
|||||||
const [valueProvidersMenuAnchorEl, setValueProvidersMenuAnchorEl] = useState(null);
|
const [valueProvidersMenuAnchorEl, setValueProvidersMenuAnchorEl] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При закрытии редактора с сохранением
|
//При закрытии редактора с сохранением
|
||||||
const handleOk = () => onOk && onOk({ ...state });
|
const handleOk = () => onOk && onOk({ ...state });
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useEffect, useState, useContext } from "react"; //Классы React
|
import React, { useEffect, useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Paper, Stack, Typography, Icon, TextField, IconButton, InputAdornment } from "@mui/material"; //Интерфейсные элементы
|
import { Paper, Stack, Typography, Icon, TextField, IconButton, InputAdornment } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../../../context/application"; //Контекст приложения
|
||||||
import { P8P_COMPONENT_INLINE_MESSAGE, P8PComponentInlineMessage } from "../../../../components/editors/p8p_component_inline_message"; //Информационное сообщение внутри компонента
|
import { P8P_COMPONENT_INLINE_MESSAGE, P8PComponentInlineMessage } from "../../../../components/editors/p8p_component_inline_message"; //Информационное сообщение внутри компонента
|
||||||
import { ITEM_SHAPE, ITEMS_INITIAL, ORIENTATION } from "./common"; //Общие ресурсы и константы формы
|
import { ITEM_SHAPE, ITEMS_INITIAL, ORIENTATION } from "./common"; //Общие ресурсы и константы формы
|
||||||
import { APP_STYLES } from "../../../../../app.styles";
|
import { APP_STYLES } from "../../../../../app.styles";
|
||||||
@ -37,7 +37,7 @@ const COMPONENT_NAME = "Форма";
|
|||||||
//Элемент формы
|
//Элемент формы
|
||||||
const FormItem = ({ item = null, fullWidth = false, value = "", onChange = null } = {}) => {
|
const FormItem = ({ item = null, fullWidth = false, value = "", onChange = null } = {}) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При изменении значения элемента
|
//При изменении значения элемента
|
||||||
const handleChange = e => onChange && onChange(e.target.id, e.target.value);
|
const handleChange = e => onChange && onChange(e.target.id, e.target.value);
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Box, Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
|
import { Box, Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
|
||||||
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../../context/messaging"; //Контекст сообщений
|
||||||
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
|
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
|
||||||
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Типовой диалог настройки
|
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Типовой диалог настройки
|
||||||
import { usePanelManager } from "../components_hooks"; //Пользовательские хуки
|
import { usePanelManager } from "../components_hooks"; //Пользовательские хуки
|
||||||
@ -31,7 +31,7 @@ const PanelsManager = ({ current = null, isEditable = true, onPanelSelect = null
|
|||||||
const [panels, insertPanel, updatePanel, deletePanel, setPanelReady, setPanelPbl, importPanel] = usePanelManager();
|
const [panels, insertPanel, updatePanel, deletePanel, setPanelReady, setPanelPbl, importPanel] = usePanelManager();
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//При добавлении панели
|
//При добавлении панели
|
||||||
const handlePanelAdd = () => setModPanel(true);
|
const handlePanelAdd = () => setModPanel(true);
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import React, { useState, useContext, useEffect } from "react"; //Классы R
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Responsive, WidthProvider } from "react-grid-layout"; //Адаптивный макет
|
import { Responsive, WidthProvider } from "react-grid-layout"; //Адаптивный макет
|
||||||
import { Box, Grid, Menu, MenuItem, Popover } from "@mui/material"; //Интерфейсные элементы
|
import { Box, Grid, Menu, MenuItem, Popover } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Рабочая область приложения
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Рабочая область приложения
|
||||||
import { P8PEditorToolBar } from "../../components/editors/p8p_editor_toolbar"; //Панель инструментов редактора
|
import { P8PEditorToolBar } from "../../components/editors/p8p_editor_toolbar"; //Панель инструментов редактора
|
||||||
import { LayoutItem } from "./layout_item"; //Элемент макета
|
import { LayoutItem } from "./layout_item"; //Элемент макета
|
||||||
@ -89,7 +89,7 @@ const PanelEditor = ({
|
|||||||
const [rowHeight] = useWindowResize();
|
const [rowHeight] = useWindowResize();
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//При перемещении макета
|
//При перемещении макета
|
||||||
const handleOnDrag = layout => {
|
const handleOnDrag = layout => {
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import { P8PConfigDialog } from "../../components/editors/p8p_config_dialog"; //
|
|||||||
import { isElementNameCorrect } from "../../components/editors/p8p_editors_common"; //Общие ресурсы редакторов
|
import { isElementNameCorrect } from "../../components/editors/p8p_editors_common"; //Общие ресурсы редакторов
|
||||||
import { P8PEditorSubHeader } from "../../components/editors/p8p_editor_sub_header"; //Заголовок раздела редактора
|
import { P8PEditorSubHeader } from "../../components/editors/p8p_editor_sub_header"; //Заголовок раздела редактора
|
||||||
import { P8PEditorBox } from "../../components/editors/p8p_editor_box"; //Контейнер редактора
|
import { P8PEditorBox } from "../../components/editors/p8p_editor_box"; //Контейнер редактора
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { STYLES as COMMON_STYLES } from "../../components/editors/p8p_editors_common"; //Общие ресурсы редакторов
|
import { STYLES as COMMON_STYLES } from "../../components/editors/p8p_editors_common"; //Общие ресурсы редакторов
|
||||||
import { P8PChipList } from "../../components/editors/p8p_chip_list"; //Дополнительные настройки редактора
|
import { P8PChipList } from "../../components/editors/p8p_chip_list"; //Дополнительные настройки редактора
|
||||||
@ -127,7 +127,7 @@ const PanelPropsEditor = ({ valueProviders = {}, onSettingsChange, onDependencyC
|
|||||||
const [variableEditor, setVariableEditor] = useState({ display: false, item: null });
|
const [variableEditor, setVariableEditor] = useState({ display: false, item: null });
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//При добавлении новой переменной
|
//При добавлении новой переменной
|
||||||
const handleVariableAdd = () => setVariableEditor({ display: true, item: null });
|
const handleVariableAdd = () => setVariableEditor({ display: true, item: null });
|
||||||
|
|||||||
@ -9,8 +9,8 @@
|
|||||||
|
|
||||||
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { Box, Icon, Fab } from "@mui/material"; //Интерфейсные элементы
|
import { Box, Icon, Fab } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { PanelsManager } from "./components/panels_manager/panels_manager"; //Менеджер панелей
|
import { PanelsManager } from "./components/panels_manager/panels_manager"; //Менеджер панелей
|
||||||
import { usePanel } from "./components/components_hooks"; //Вспомогательные хуки
|
import { usePanel } from "./components/components_hooks"; //Вспомогательные хуки
|
||||||
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
import { NavigationCtx } from "../../context/navigation"; //Контекст навигации
|
||||||
@ -57,9 +57,9 @@ const PanelsEditor = () => {
|
|||||||
//Подключение к контексту навигации
|
//Подключение к контексту навигации
|
||||||
const { getNavigationSearch } = useContext(NavigationCtx);
|
const { getNavigationSearch } = useContext(NavigationCtx);
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { setAppBarTitle } = useContext(ApplicationCtx);
|
const { setAppBarTitle } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При выборе панели
|
//При выборе панели
|
||||||
const handlePanelSelect = panel => {
|
const handlePanelSelect = panel => {
|
||||||
|
|||||||
@ -21,9 +21,9 @@ import {
|
|||||||
} from "../../components/p8p_data_grid"; //Таблица данных
|
} from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
|
import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог
|
||||||
import { P8PChart, useP8PChart } from "../../components/p8p_chart"; //График
|
import { P8PChart, useP8PChart } from "../../components/p8p_chart"; //График
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingCtx } 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 { COMMON_PROJECTS_STYLES, 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"; //Список этапов проекта
|
||||||
@ -61,7 +61,7 @@ const Projects = () => {
|
|||||||
const [stagesFilters, setStagesFilters] = useState([]);
|
const [stagesFilters, setStagesFilters] = useState([]);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Собственное состояние
|
//Собственное состояние
|
||||||
const {
|
const {
|
||||||
@ -83,10 +83,10 @@ const Projects = () => {
|
|||||||
const { chart: costNotesChart, isDataLoaded: isCostNotesLoaded } = useP8PChart({ stored: "PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES" });
|
const { chart: costNotesChart, isDataLoaded: isCostNotesLoaded } = useP8PChart({ stored: "PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES" });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Отображение журнала платежей по этапу проекта
|
//Отображение журнала платежей по этапу проекта
|
||||||
const showPayNotes = async ({ sender, direction }) => {
|
const showPayNotes = async ({ sender, direction }) => {
|
||||||
|
|||||||
@ -20,9 +20,9 @@ import {
|
|||||||
P8P_DATA_GRID_FILTERS_HEIGHT,
|
P8P_DATA_GRID_FILTERS_HEIGHT,
|
||||||
useP8PDataGrid
|
useP8PDataGrid
|
||||||
} from "../../components/p8p_data_grid"; //Таблица данных
|
} from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingCtx } 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"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
@ -56,13 +56,13 @@ const StageArts = ({ stage, filters }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Отображение журнала затрат по статье калькуляции
|
//Отображение журнала затрат по статье калькуляции
|
||||||
const showCostNotes = async ({ sender }) => {
|
const showCostNotes = async ({ sender }) => {
|
||||||
|
|||||||
@ -21,9 +21,9 @@ import {
|
|||||||
P8P_DATA_GRID_FILTERS_HEIGHT,
|
P8P_DATA_GRID_FILTERS_HEIGHT,
|
||||||
useP8PDataGrid
|
useP8PDataGrid
|
||||||
} from "../../components/p8p_data_grid"; //Таблица данных
|
} from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingCtx } 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"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ const STYLES = {
|
|||||||
//Договоры с соисполнителями этапа проекта
|
//Договоры с соисполнителями этапа проекта
|
||||||
const StageContracts = ({ stage, filters }) => {
|
const StageContracts = ({ stage, filters }) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Собственное состояние
|
//Собственное состояние
|
||||||
const {
|
const {
|
||||||
@ -65,10 +65,10 @@ const StageContracts = ({ stage, filters }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Отображение выходящих счетов на оплату от соисполнителя этапа
|
//Отображение выходящих счетов на оплату от соисполнителя этапа
|
||||||
const showPaymentAccountsIn = async ({ sender }) => {
|
const showPaymentAccountsIn = async ({ sender }) => {
|
||||||
|
|||||||
@ -24,9 +24,9 @@ import {
|
|||||||
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"; //Договоры с соисполнителями этапа проекта
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { MessagingCtx } 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 { COMMON_PROJECTS_STYLES, PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { COMMON_PROJECTS_STYLES, PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ const Stages = ({ project, projectName, filters }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument, pOnlineShowUnit, configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Собственное состояние
|
//Собственное состояние
|
||||||
const {
|
const {
|
||||||
@ -77,10 +77,10 @@ const Stages = ({ project, projectName, filters }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Отображение журнала платежей по этапу проекта
|
//Отображение журнала платежей по этапу проекта
|
||||||
const showPayNotes = async ({ sender, direction }) => {
|
const showPayNotes = async ({ sender, direction }) => {
|
||||||
|
|||||||
@ -13,8 +13,8 @@ import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заго
|
|||||||
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
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 { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { dataCellRender, groupCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { dataCellRender, groupCellRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -44,10 +44,10 @@ const PrjGraph = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных таблицы с сервера
|
//Загрузка данных таблицы с сервера
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
|
|||||||
@ -28,7 +28,7 @@ import {
|
|||||||
Icon
|
Icon
|
||||||
} from "@mui/material"; //Интерфейсные элементы
|
} from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import img21_1 from "./img/21_1.png"; //Изображение
|
import img21_1 from "./img/21_1.png"; //Изображение
|
||||||
import img21_2 from "./img/21_2.png"; //Изображение
|
import img21_2 from "./img/21_2.png"; //Изображение
|
||||||
import img21_3 from "./img/21_3.png"; //Изображение
|
import img21_3 from "./img/21_3.png"; //Изображение
|
||||||
@ -171,7 +171,7 @@ Img.propTypes = {
|
|||||||
//Ссылка на раздел Системы
|
//Ссылка на раздел Системы
|
||||||
const UnitLink = ({ unitCode, children }) => {
|
const UnitLink = ({ unitCode, children }) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
@ -218,7 +218,7 @@ ChapterLink.propTypes = {
|
|||||||
//Ссылка на информационную панель
|
//Ссылка на информационную панель
|
||||||
const PanelLink = ({ panelName, children }) => {
|
const PanelLink = ({ panelName, children }) => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configUrlBase, findPanelByName, pOnlineShowTab } = useContext(ApplicationCtx);
|
const { configUrlBase, findPanelByName, pOnlineShowTab } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Button, Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material"; //Интерфейсные элементы
|
import { Button, Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { BUTTONS } from "../../../app.text"; //Типовые тексты
|
import { BUTTONS } from "../../../app.text"; //Типовые тексты
|
||||||
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { FormField } from "./layouts"; //Общие компоненты панели
|
import { FormField } from "./layouts"; //Общие компоненты панели
|
||||||
@ -60,7 +60,7 @@ const FilterDialog = ({ valuesInitial, onOk, onCancel }) => {
|
|||||||
const [values, setValues] = useState({ ...valuesInitial });
|
const [values, setValues] = useState({ ...valuesInitial });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Изменение элемента формы фильтра
|
//Изменение элемента формы фильтра
|
||||||
const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));
|
const handleValueChanged = (name, value) => setValues(pv => ({ ...pv, [name]: value }));
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import { P8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
|
import { P8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { useProjectsDataGrid } from "./projects_hooks"; //Хуки списка проектов
|
import { useProjectsDataGrid } from "./projects_hooks"; //Хуки списка проектов
|
||||||
import { FILTER_INITIAL, Filter } from "./filter"; //Компонент "Фильтр"
|
import { FILTER_INITIAL, Filter } from "./filter"; //Компонент "Фильтр"
|
||||||
import { PROJECTS_STYLES, projectDataCellRender, projectRowExpandRender } from "./projects_layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
import { PROJECTS_STYLES, projectDataCellRender, projectRowExpandRender } from "./projects_layouts"; //Дополнительная разметка и вёрстка клиентских элементов
|
||||||
@ -28,7 +28,7 @@ const Projects = () => {
|
|||||||
const [projectsDataGrid] = useProjectsDataGrid({ ...projects.filter, pageNumber: projects.pageNumber, orders: projects.orders });
|
const [projectsDataGrid] = useProjectsDataGrid({ ...projects.filter, pageNumber: projects.pageNumber, orders: projects.orders });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Отображение записи проекта в штатном разделе
|
//Отображение записи проекта в штатном разделе
|
||||||
const showProject = async rn => pOnlineShowDocument({ unitCode: "Projects", document: rn, modal: false });
|
const showProject = async rn => pOnlineShowDocument({ unitCode: "Projects", document: rn, modal: false });
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect } from "react"; //Классы React
|
import { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
||||||
import config from "../../../app.config"; //Настройки приложения
|
import config from "../../../app.config"; //Настройки приложения
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ const useProjectsDataGrid = ({ prjType, insDep, priceStructStatus, prjState, sea
|
|||||||
const [data, setData] = useState({ init: false, morePages: true });
|
const [data, setData] = useState({ init: false, morePages: true });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -10,9 +10,9 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Grid, Box, Typography, Paper, Drawer, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы
|
import { Grid, Box, Typography, Paper, Drawer, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8PChart } from "../../components/p8p_chart"; //График
|
import { P8PChart } from "../../components/p8p_chart"; //График
|
||||||
@ -38,13 +38,13 @@ const StageDetailData = ({ stageRn }) => {
|
|||||||
const [state, setState] = useState({ artsDisplayType: 0, artsChartType: 0 });
|
const [state, setState] = useState({ artsDisplayType: 0, artsChartType: 0 });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr } = useContext(MessagingCtx);
|
const { showMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Отображение журнала затрат (фактического, по рег. номеру ЛС и статьи затрат)
|
//Отображение журнала затрат (фактического, по рег. номеру ЛС и статьи затрат)
|
||||||
const showCostNotesFact = async ({ faceAccRn, artclRn }) => {
|
const showCostNotesFact = async ({ faceAccRn, artclRn }) => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect } from "react"; //Классы React
|
import { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -23,7 +23,7 @@ const useStageDetailInfoDataGrid = ({ stageRn }) => {
|
|||||||
const [data, setData] = useState({ init: false });
|
const [data, setData] = useState({ init: false });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -58,7 +58,7 @@ const useStageDetailArtsDataGrid = ({ stageRn }) => {
|
|||||||
const [data, setData] = useState({ init: false });
|
const [data, setData] = useState({ init: false });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -93,7 +93,7 @@ const useStageDetailArtsChart = ({ stageRn, display, type }) => {
|
|||||||
const [data, setData] = useState({ init: false, currentType: null });
|
const [data, setData] = useState({ init: false, currentType: null });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography } from "@mui/material"; //Интерфейсные элементы
|
import { Typography } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { P8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
|
import { P8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { useStagesDataGrid } from "./stages_hooks"; //Хуки списка этапов проекта
|
import { useStagesDataGrid } from "./stages_hooks"; //Хуки списка этапов проекта
|
||||||
@ -33,7 +33,7 @@ const Stages = ({ projectRn, projectCode }) => {
|
|||||||
const [stageInfo, setStageInfo] = useState({ showInfo: false, stage: null, sFaceAcc: null });
|
const [stageInfo, setStageInfo] = useState({ showInfo: false, stage: null, sFaceAcc: null });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Отображение записи этапа проекта в штатном разделе
|
//Отображение записи этапа проекта в штатном разделе
|
||||||
const showProjectStage = (prn, rn) => {
|
const showProjectStage = (prn, rn) => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect } from "react"; //Классы React
|
import { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
|
||||||
import config from "../../../app.config"; //Настройки приложения
|
import config from "../../../app.config"; //Настройки приложения
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ const useStagesDataGrid = ({ projectRn, pageNumber, orders }) => {
|
|||||||
const [data, setData] = useState({ init: false, morePages: true });
|
const [data, setData] = useState({ init: false, morePages: true });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости обновить данные таблицы
|
//При необходимости обновить данные таблицы
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -10,8 +10,8 @@
|
|||||||
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Dialog, DialogContent, DialogActions, Button, DialogTitle } from "@mui/material"; //Интерфейсные элементы
|
import { Dialog, DialogContent, DialogActions, Button, DialogTitle } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
@ -36,10 +36,10 @@ const LabFactRptDtl = ({ periodId, title, onHide }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configSystemPageSize } = useContext(ApplicationCtx);
|
const { configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка детализации фактической трудоёмкости по отчетам для ресурса
|
//Загрузка детализации фактической трудоёмкости по отчетам для ресурса
|
||||||
const loadFactRptDtl = useCallback(async () => {
|
const loadFactRptDtl = useCallback(async () => {
|
||||||
|
|||||||
@ -10,8 +10,8 @@
|
|||||||
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Dialog, DialogContent, DialogActions, Button, DialogTitle } from "@mui/material"; //Интерфейсные элементы
|
import { Dialog, DialogContent, DialogActions, Button, DialogTitle } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
@ -35,10 +35,10 @@ const LabPlanFOTDtl = ({ periodId, title, onHide }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configSystemPageSize } = useContext(ApplicationCtx);
|
const { configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка детализации плановой трудоёмкости по ФОТ для ресурса
|
//Загрузка детализации плановой трудоёмкости по ФОТ для ресурса
|
||||||
const loadPlanFOTDtl = useCallback(async () => {
|
const loadPlanFOTDtl = useCallback(async () => {
|
||||||
|
|||||||
@ -10,8 +10,8 @@
|
|||||||
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Dialog, DialogContent, DialogActions, Button, DialogTitle } from "@mui/material"; //Интерфейсные элементы
|
import { Dialog, DialogContent, DialogActions, Button, DialogTitle } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
@ -40,10 +40,10 @@ const LabPlanJobsDtl = ({ periodId, title, onHide, onProjectClick }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configSystemPageSize } = useContext(ApplicationCtx);
|
const { configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка детализации плановой трудоёмкости по графику для ресурса
|
//Загрузка детализации плановой трудоёмкости по графику для ресурса
|
||||||
const loadPlanJobsDtl = useCallback(async () => {
|
const loadPlanJobsDtl = useCallback(async () => {
|
||||||
|
|||||||
@ -29,9 +29,9 @@ import {
|
|||||||
TextField,
|
TextField,
|
||||||
DialogTitle
|
DialogTitle
|
||||||
} from "@mui/material"; //Интерфейсные элементы
|
} from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
|
import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
|
||||||
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 { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
@ -185,7 +185,7 @@ SaveChangesArea.propTypes = {
|
|||||||
//Список проектов
|
//Список проектов
|
||||||
const ProjectsList = ({ projects = [], selectedProject, onClick } = {}) => {
|
const ProjectsList = ({ projects = [], selectedProject, onClick } = {}) => {
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { InlineMsgErr } = useContext(MessagingCtx);
|
const { InlineMsgErr } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return projects.length > 0 ? (
|
return projects.length > 0 ? (
|
||||||
@ -270,13 +270,13 @@ const PrjJobs = () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { InlineMsgInfo } = useContext(MessagingCtx);
|
const { InlineMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка списка проектов
|
//Загрузка списка проектов
|
||||||
const loadProjects = useCallback(
|
const loadProjects = useCallback(
|
||||||
|
|||||||
@ -10,8 +10,8 @@
|
|||||||
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
import React, { useContext, useState, useCallback, useEffect } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_MORE_HEIGHT } from "../../components/p8p_data_grid"; //Таблица данных
|
import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_MORE_HEIGHT } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
@ -57,10 +57,10 @@ const ResMon = ({ ident, onPlanJobsDtlProjectClick }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { configSystemPageSize } = useContext(ApplicationCtx);
|
const { configSystemPageSize } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Загрузка данных монитора балансировки периодов с сервера
|
//Загрузка данных монитора балансировки периодов с сервера
|
||||||
const loadPeriods = useCallback(async () => {
|
const loadPeriods = useCallback(async () => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useContext, useCallback } from "react"; //Классы React
|
import { useContext, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -17,7 +17,7 @@ import { BackEndCtx } from "../../../../context/backend"; //Контекст в
|
|||||||
//Работа с областью SQL-выражения
|
//Работа с областью SQL-выражения
|
||||||
const useQuerySQLExpr = query => {
|
const useQuerySQLExpr = query => {
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Установка флага сокрытия/отображения значений аргументов в SQL-выражении запроса
|
//Установка флага сокрытия/отображения значений аргументов в SQL-выражении запроса
|
||||||
const toggleSubstArgsVals = useCallback(async () => {
|
const toggleSubstArgsVals = useCallback(async () => {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useContext, useCallback } from "react"; //Классы React
|
import { useContext, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//------------------------------------
|
//------------------------------------
|
||||||
//Вспомогательные функции и компоненты
|
//Вспомогательные функции и компоненты
|
||||||
@ -21,7 +21,7 @@ import { BackEndCtx } from "../../../../context/backend"; //Контекст в
|
|||||||
//Работа с аргументами запроса
|
//Работа с аргументами запроса
|
||||||
const useQueryArgs = query => {
|
const useQueryArgs = query => {
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Добавление аргумента запроса
|
//Добавление аргумента запроса
|
||||||
const addArg = useCallback(
|
const addArg = useCallback(
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
|
import { Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
|
||||||
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../../context/messaging"; //Контекст сообщений
|
||||||
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
|
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
|
||||||
import { P8PDialog } from "../../../../components/p8p_dialog"; //Типовой диалог
|
import { P8PDialog } from "../../../../components/p8p_dialog"; //Типовой диалог
|
||||||
import { ARGUMENT_SHAPE } from "../argument/argument"; //Аргумент запроса
|
import { ARGUMENT_SHAPE } from "../argument/argument"; //Аргумент запроса
|
||||||
@ -27,7 +27,7 @@ const QueryArgsDialog = ({ args, onArgAdd, onArgEdit, onArgRemove, onClose }) =>
|
|||||||
const [modArg, setModArg] = useState(null);
|
const [modArg, setModArg] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Нажатие на кнопку "Закрыть"
|
//Нажатие на кнопку "Закрыть"
|
||||||
const handleClose = () => onClose && onClose();
|
const handleClose = () => onClose && onClose();
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useContext, useCallback } from "react"; //Классы React
|
import { useContext, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -17,7 +17,7 @@ import { BackEndCtx } from "../../../../context/backend"; //Контекст в
|
|||||||
//Работа с условиями отбора запроса
|
//Работа с условиями отбора запроса
|
||||||
const useQueryConditions = query => {
|
const useQueryConditions = query => {
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Установка условий отбора в запросе
|
//Установка условий отбора в запросе
|
||||||
const setCond = useCallback(
|
const setCond = useCallback(
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useRef, useContext, useCallback, useEffect, useState } from "react"; //Классы React
|
import { useRef, useContext, useCallback, useEffect, useState } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { object2Base64XML } from "../../../../core/utils"; //Вспомогательные функции
|
import { object2Base64XML } from "../../../../core/utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
@ -30,7 +30,7 @@ const useEntities = (filter, minFilterLen) => {
|
|||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Обновление данных
|
//Обновление данных
|
||||||
const doRefresh = () => setRefresh(true);
|
const doRefresh = () => setRefresh(true);
|
||||||
@ -81,7 +81,7 @@ const useEntities = (filter, minFilterLen) => {
|
|||||||
//Работа с сущностями запроса
|
//Работа с сущностями запроса
|
||||||
const useQueryEntities = query => {
|
const useQueryEntities = query => {
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Добавление сущности в запрос
|
//Добавление сущности в запрос
|
||||||
const addEnt = useCallback(
|
const addEnt = useCallback(
|
||||||
@ -123,7 +123,7 @@ const useEntityAttrs = (query, entity) => {
|
|||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndCtx);
|
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Обновление данных
|
//Обновление данных
|
||||||
const doRefresh = () => setRefresh(true);
|
const doRefresh = () => setRefresh(true);
|
||||||
|
|||||||
@ -10,7 +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 { Icon, Button } from "@mui/material"; //Интерфейсные элементы
|
import { Icon, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений приложения
|
import { MessagingСtx } from "../../../../context/messaging"; //Контекст сообщений приложения
|
||||||
import { P8PEditorSubHeader } from "../../../../components/editors/p8p_editor_sub_header"; //Подзаголовок группы параметров редактора
|
import { P8PEditorSubHeader } from "../../../../components/editors/p8p_editor_sub_header"; //Подзаголовок группы параметров редактора
|
||||||
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы
|
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы
|
||||||
import { ENTITY_SHAPE } from "../entity/entity"; //Описание сущности
|
import { ENTITY_SHAPE } from "../entity/entity"; //Описание сущности
|
||||||
@ -34,7 +34,7 @@ const InspectorQueryEntities = ({ query, entity, onOptionsChanged }) => {
|
|||||||
const { addEnt, removeEnt } = useQueryEntities(query);
|
const { addEnt, removeEnt } = useQueryEntities(query);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Уведомление родителя об изменении свойств
|
//Уведомление родителя об изменении свойств
|
||||||
const notifyOptionsChanged = () => onOptionsChanged && onOptionsChanged();
|
const notifyOptionsChanged = () => onOptionsChanged && onOptionsChanged();
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useContext, useCallback } from "react"; //Классы React
|
import { useContext, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -17,7 +17,7 @@ import { BackEndCtx } from "../../../../context/backend"; //Контекст в
|
|||||||
//Работа со связами запроса
|
//Работа со связами запроса
|
||||||
const useQueryRelations = query => {
|
const useQueryRelations = query => {
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Добавление отношения сущностей в запрос
|
//Добавление отношения сущностей в запрос
|
||||||
const addRl = useCallback(
|
const addRl = useCallback(
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useContext } from "react"; //Классы React
|
import React, { useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Icon, Button, FormControlLabel, Checkbox } from "@mui/material"; //Интерфейсные элементы
|
import { Icon, Button, FormControlLabel, Checkbox } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений приложения
|
import { MessagingСtx } from "../../../../context/messaging"; //Контекст сообщений приложения
|
||||||
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы
|
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы
|
||||||
import { RELATION_SHAPE } from "../relation/relation"; //Описание связи
|
import { RELATION_SHAPE } from "../relation/relation"; //Описание связи
|
||||||
import { useQueryRelations } from "./hooks"; //Хуки для работы со связями
|
import { useQueryRelations } from "./hooks"; //Хуки для работы со связями
|
||||||
@ -36,7 +36,7 @@ const STYLES = {
|
|||||||
//Компонент инспектора - Связи запроса
|
//Компонент инспектора - Связи запроса
|
||||||
const InspectorQueryRelations = ({ query, relation, onOptionsChanged }) => {
|
const InspectorQueryRelations = ({ query, relation, onOptionsChanged }) => {
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Работа со связями на сервере
|
//Работа со связями на сервере
|
||||||
const { removeRl, setRlMandatory } = useQueryRelations(query);
|
const { removeRl, setRlMandatory } = useQueryRelations(query);
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
import { useState, useContext, useEffect, useCallback } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -29,7 +29,7 @@ const useQueries = () => {
|
|||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Обновление данных
|
//Обновление данных
|
||||||
const doRefresh = () => setRefresh(true);
|
const doRefresh = () => setRefresh(true);
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
|
import { Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
|
||||||
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../../context/messaging"; //Контекст сообщений
|
||||||
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
|
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
|
||||||
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Типовой диалог настройки
|
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Типовой диалог настройки
|
||||||
import { useQueries } from "./hooks"; //Хуки для работы с запросами
|
import { useQueries } from "./hooks"; //Хуки для работы с запросами
|
||||||
@ -30,7 +30,7 @@ const QueriesManager = ({ current = null, onQuerySelect = null, onCancel = null
|
|||||||
const [queries, insertQuery, updateQuery, deleteQuery, setQueryReady, setQueryPbl] = useQueries();
|
const [queries, insertQuery, updateQuery, deleteQuery, setQueryReady, setQueryPbl] = useQueries();
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//При добавлении запроса
|
//При добавлении запроса
|
||||||
const handleQueryAdd = () => setModQuery(true);
|
const handleQueryAdd = () => setModQuery(true);
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { useState, useContext, useEffect } from "react"; //Классы React
|
import { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { NODE_TYPE } from "./common"; //Общие ресурсы и константы редактора
|
import { NODE_TYPE } from "./common"; //Общие ресурсы и константы редактора
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -119,7 +119,7 @@ const useQuery = query => {
|
|||||||
const [querySQL, setQuerySQL] = useState(null);
|
const [querySQL, setQuerySQL] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Обновление данных
|
//Обновление данных
|
||||||
const doRefresh = () => setRefresh(true);
|
const doRefresh = () => setRefresh(true);
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import { Box, Grid } from "@mui/material"; //Интерфейсные компоненты MUI
|
import { Box, Grid } from "@mui/material"; //Интерфейсные компоненты MUI
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст взаимодействия с приложением
|
import { ApplicationСtx } from "../../context/application"; //Контекст взаимодействия с приложением
|
||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Компоненты рабочего стола
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Компоненты рабочего стола
|
||||||
import { P8PEditorToolBar } from "../../components/editors/p8p_editor_toolbar"; //Панель инструментов редактора
|
import { P8PEditorToolBar } from "../../components/editors/p8p_editor_toolbar"; //Панель инструментов редактора
|
||||||
import { QueryDiagram } from "./components/query_diagram/query_diagram"; //Диаграмма запроса
|
import { QueryDiagram } from "./components/query_diagram/query_diagram"; //Диаграмма запроса
|
||||||
@ -61,7 +61,7 @@ const QueryEditor = () => {
|
|||||||
const { addRl, removeRl } = useQueryRelations(query);
|
const { addRl, removeRl } = useQueryRelations(query);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { setAppBarTitle } = useContext(ApplicationCtx);
|
const { setAppBarTitle } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Выбор сущности
|
//Выбор сущности
|
||||||
const selectEntity = ent => {
|
const selectEntity = ent => {
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Icon, Button } from "@mui/material"; //Интерфейсные элементы
|
import { Icon, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../context/messaging"; //Контекст сообщений
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
|
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 { APP_STYLES } from "../../../../app.styles"; //Типовые стили
|
import { APP_STYLES } from "../../../../app.styles"; //Типовые стили
|
||||||
@ -56,7 +56,7 @@ const Marks = ({ marks, order, marksLoading, marksInit, onRefresh, onMarkInsert,
|
|||||||
const [modMark, setModMark] = useState(null);
|
const [modMark, setModMark] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Подключение к словарям
|
//Подключение к словарям
|
||||||
const { showMark, showMarkCn, showMarkCnAdd } = useDictionary();
|
const { showMark, showMarkCn, showMarkCnAdd } = useDictionary();
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
import React, { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Box } from "@mui/material"; //Интерфейсные элементы
|
import { Box } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { useConfSectionMarks } from "../hooks"; //Кастомные хуки
|
import { useConfSectionMarks } from "../hooks"; //Кастомные хуки
|
||||||
import { ActionMessage } from "./action_message"; //Сообщение с действиями
|
import { ActionMessage } from "./action_message"; //Сообщение с действиями
|
||||||
import { Marks } from "./marks"; //Показатели раздела
|
import { Marks } from "./marks"; //Показатели раздела
|
||||||
@ -41,7 +41,7 @@ const Section = ({ section = null }) => {
|
|||||||
const [marks, refreshMarks, marksLoading, marksInit] = useConfSectionMarks(section, order.rowOrder, order.columnOrder);
|
const [marks, refreshMarks, marksLoading, marksInit] = useConfSectionMarks(section, order.rowOrder, order.columnOrder);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Добавление показателя
|
//Добавление показателя
|
||||||
const insertMark = async ({ code, name, row, rowCode, rowVersion, column, columnCode, columnVersion }, cb) => {
|
const insertMark = async ({ code, name, row, rowCode, rowVersion, column, columnCode, columnVersion }, cb) => {
|
||||||
|
|||||||
@ -11,9 +11,9 @@ import React, { useState, useEffect, useContext, useCallback } from "react"; //
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Box, Tabs, IconButton, Icon, Stack, Button } from "@mui/material"; //Интерфейсные компоненты
|
import { Box, Tabs, IconButton, Icon, Stack, Button } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { tabsClasses } from "@mui/material/Tabs"; //Классы закладок
|
import { tabsClasses } from "@mui/material/Tabs"; //Классы закладок
|
||||||
import { ApplicationCtx } from "../../../context/application"; //Контекст взаимодействия с приложением
|
import { ApplicationСtx } from "../../../context/application"; //Контекст взаимодействия с приложением
|
||||||
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../../context/messaging"; //Контекст сообщений
|
||||||
import { useConfSections } from "../hooks"; //Кастомные хуки
|
import { useConfSections } from "../hooks"; //Кастомные хуки
|
||||||
import { ActionMessage } from "./action_message"; //Сообщение с действиями
|
import { ActionMessage } from "./action_message"; //Сообщение с действиями
|
||||||
import { SectionTab } from "./section_tab"; //Закладка раздела
|
import { SectionTab } from "./section_tab"; //Закладка раздела
|
||||||
@ -57,13 +57,13 @@ const Sections = ({ conf, onSectionChange, onSectionCountChange }) => {
|
|||||||
const [confDesc, sections, refreshSections, sectionsLoading, sectionsInit] = useConfSections(conf);
|
const [confDesc, sections, refreshSections, sectionsLoading, sectionsInit] = useConfSections(conf);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { setAppBarTitle } = useContext(ApplicationCtx);
|
const { setAppBarTitle } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Выбор раздела
|
//Выбор раздела
|
||||||
const selectSection = useCallback(
|
const selectSection = useCallback(
|
||||||
|
|||||||
@ -9,8 +9,8 @@
|
|||||||
|
|
||||||
import { useState, useContext, useEffect } from "react"; //Классы React
|
import { useState, useContext, useEffect } from "react"; //Классы React
|
||||||
import { xml2JSON } from "../../core/utils"; //Вспомогательные функции
|
import { xml2JSON } from "../../core/utils"; //Вспомогательные функции
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
@ -34,7 +34,7 @@ const useConfSections = conf => {
|
|||||||
const [dataSections, setDataSections] = useState([]);
|
const [dataSections, setDataSections] = useState([]);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Обновление данных
|
//Обновление данных
|
||||||
const doRefresh = () => setRefresh(true);
|
const doRefresh = () => setRefresh(true);
|
||||||
@ -95,7 +95,7 @@ const useConfSectionMarks = (section, rowOrder = 0, columnOrder = 0) => {
|
|||||||
const [data, setData] = useState(null);
|
const [data, setData] = useState(null);
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Обновление данных
|
//Обновление данных
|
||||||
const doRefresh = () => setRefresh(true);
|
const doRefresh = () => setRefresh(true);
|
||||||
@ -152,7 +152,7 @@ const useConfSectionMarks = (section, rowOrder = 0, columnOrder = 0) => {
|
|||||||
//Работа со словарями
|
//Работа со словарями
|
||||||
const useDictionary = () => {
|
const useDictionary = () => {
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDictionary } = useContext(ApplicationCtx);
|
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Выбор строки
|
//Выбор строки
|
||||||
const selectRRPRow = (code, version, callBack) => {
|
const selectRRPRow = (code, version, callBack) => {
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import React, { useContext } from "react"; //Классы React
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Grid, Paper } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Grid, Paper } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { P8PChart, useP8PChart } from "../../components/p8p_chart"; //График
|
import { P8PChart, useP8PChart } from "../../components/p8p_chart"; //График
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -35,7 +35,7 @@ const Chart = ({ title }) => {
|
|||||||
const { chart, isDataLoaded } = useP8PChart({ stored: "PKG_P8PANELS_SAMPLES.CHART" });
|
const { chart, isDataLoaded } = useP8PChart({ stored: "PKG_P8PANELS_SAMPLES.CHART" });
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationCtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Отработка нажатия на график
|
//Отработка нажатия на график
|
||||||
const handleChartClick = ({ item }) => {
|
const handleChartClick = ({ item }) => {
|
||||||
|
|||||||
@ -28,7 +28,7 @@ import { formatDateRF, hasValue } from "../../core/utils"; //Вспомогат
|
|||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
import { P8PCyclogram, useP8PCyclogram } from "../../components/p8p_cyclogram"; //Циклограмма
|
import { P8PCyclogram, useP8PCyclogram } from "../../components/p8p_cyclogram"; //Циклограмма
|
||||||
import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -78,7 +78,7 @@ const CustomTaskDialog = ({ task, ident, onReload, close }) => {
|
|||||||
const textType = task.type === 0 ? "Задачи проекта" : task.type === 1 ? "Этап проекта" : "Работа проекта";
|
const textType = task.type === 0 ? "Задачи проекта" : task.type === 1 ? "Этап проекта" : "Работа проекта";
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При необходимости перезагрузить данные
|
//При необходимости перезагрузить данные
|
||||||
const handleReload = useCallback(() => onReload && onReload(), [onReload]);
|
const handleReload = useCallback(() => onReload && onReload(), [onReload]);
|
||||||
@ -230,7 +230,7 @@ const Cyclogram = ({ title }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//При подключении компонента к странице
|
//При подключении компонента к странице
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -7,12 +7,12 @@
|
|||||||
//Подключение библиотек
|
//Подключение библиотек
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import React, { useContext, useState } from "react"; //Классы React
|
import React, { useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Grid, Stack, Icon, Box, Button, FormControlLabel, Checkbox } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Grid, Stack, Icon, Box, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { P8PDataGrid, P8P_DATA_GRID_SIZE, useP8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
|
import { P8PDataGrid, P8P_DATA_GRID_SIZE, useP8PDataGrid } from "../../components/p8p_data_grid"; //Таблица данных
|
||||||
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
import { APP_STYLES } from "../../../app.styles"; //Типовые стили
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -84,18 +84,14 @@ export const groupCellRender = () => ({ cellStyle: { padding: "2px" } });
|
|||||||
|
|
||||||
//Пример: Таблица данных "P8PDataGrid"
|
//Пример: Таблица данных "P8PDataGrid"
|
||||||
const DataGrid = ({ title }) => {
|
const DataGrid = ({ title }) => {
|
||||||
//Собственное состояние - использование кнопки догрузки данных
|
|
||||||
const [useMoreButton, setUseMoreButton] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - таблица данных
|
//Собственное состояние - таблица данных
|
||||||
const { dataGrid, isDataLoaded, handleFilterChanged, handleOrderChanged, handlePageChange, handlePagesCountChanged } = useP8PDataGrid({
|
const { dataGrid, isDataLoaded, handleFilterChanged, handleOrderChanged, handlePageChange } = useP8PDataGrid({
|
||||||
stored: "PKG_P8PANELS_SAMPLES.DATA_GRID",
|
stored: "PKG_P8PANELS_SAMPLES.DATA_GRID",
|
||||||
pageSize: DATA_GRID_PAGE_SIZE,
|
pageSize: DATA_GRID_PAGE_SIZE
|
||||||
storedArgs: { NUSE_MORE_BUTTON: useMoreButton ? 1 : 0 }
|
|
||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//При нажатии на копку контрагента
|
//При нажатии на копку контрагента
|
||||||
const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" });
|
const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" });
|
||||||
@ -106,11 +102,6 @@ const DataGrid = ({ title }) => {
|
|||||||
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
||||||
{title}
|
{title}
|
||||||
</Typography>
|
</Typography>
|
||||||
<FormControlLabel
|
|
||||||
sx={STYLES.CONTROL}
|
|
||||||
control={<Checkbox onChange={() => setUseMoreButton(!useMoreButton)} />}
|
|
||||||
label="Отображать кнопку догрузки"
|
|
||||||
/>
|
|
||||||
<Grid container spacing={1} pt={5}>
|
<Grid container spacing={1} pt={5}>
|
||||||
<Grid item xs={12}>
|
<Grid item xs={12}>
|
||||||
<Box p={5} display="flex" justifyContent="center" alignItems="center">
|
<Box p={5} display="flex" justifyContent="center" alignItems="center">
|
||||||
@ -130,7 +121,6 @@ const DataGrid = ({ title }) => {
|
|||||||
<Button onClick={() => handleAgnButtonClicked(row.SAGNABBR)}>Показать в разделе</Button>
|
<Button onClick={() => handleAgnButtonClicked(row.SAGNABBR)}>Показать в разделе</Button>
|
||||||
)}
|
)}
|
||||||
onPageChanged={handlePageChange}
|
onPageChanged={handlePageChange}
|
||||||
onPagesCountChanged={handlePagesCountChanged}
|
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import { formatDateRF, hasValue } from "../../core/utils"; //Вспомогат
|
|||||||
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы
|
||||||
import { P8PGantt, useP8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
|
import { P8PGantt, useP8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
|
||||||
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -110,7 +110,7 @@ const Gantt = ({ title }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Изменение данных диаграммы
|
//Изменение данных диаграммы
|
||||||
const modifyData = useCallback(
|
const modifyData = useCallback(
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useContext } from "react"; //Классы React
|
import React, { useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Stack, Divider } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Stack, Divider } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { P8P_INDICATOR_VARIANT, P8P_INDICATOR_STATE, P8PIndicator, useP8PIndicator } from "../../components/p8p_indicator"; //Индикатор
|
import { P8P_INDICATOR_VARIANT, P8P_INDICATOR_STATE, P8PIndicator, useP8PIndicator } from "../../components/p8p_indicator"; //Индикатор
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@ -34,7 +34,7 @@ const Indicator = ({ title }) => {
|
|||||||
const { indicator, isDataLoaded } = useP8PIndicator({ stored: "PKG_P8PANELS_SAMPLES.INDICATOR" });
|
const { indicator, isDataLoaded } = useP8PIndicator({ stored: "PKG_P8PANELS_SAMPLES.INDICATOR" });
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgInfo } = useContext(MessagingCtx);
|
const { showMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useContext } from "react"; //Классы React
|
import React, { useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Button } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -29,7 +29,7 @@ const STYLES = {
|
|||||||
//Пример: Индикатор процесса
|
//Пример: Индикатор процесса
|
||||||
const Loader = ({ title }) => {
|
const Loader = ({ title }) => {
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showLoader, hideLoader } = useContext(MessagingCtx);
|
const { showLoader, hideLoader } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -10,7 +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 { Typography, Divider, Button } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Divider, Button } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -33,7 +33,7 @@ const Messages = ({ title }) => {
|
|||||||
const [state, setState] = useState({ inlineErr: true, inlineWarn: true, inlineInfo: true });
|
const [state, setState] = useState({ inlineErr: true, inlineWarn: true, inlineInfo: true });
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgErr, showMsgWarn, showMsgInfo, InlineMsgErr, InlineMsgInfo, InlineMsgWarn } = useContext(MessagingCtx);
|
const { showMsgErr, showMsgWarn, showMsgInfo, InlineMsgErr, InlineMsgInfo, InlineMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -10,9 +10,9 @@
|
|||||||
import React, { useEffect, useContext, useCallback, useState } from "react"; //Классы React
|
import React, { useEffect, useContext, useCallback, useState } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Grid, List, ListItemButton, ListItem, ListItemText, IconButton, Icon, Button, TextField, Box } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Grid, List, ListItemButton, ListItem, ListItemText, IconButton, Icon, Button, TextField, Box } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||||||
import { MessagingCtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -41,13 +41,13 @@ const Mui = ({ title }) => {
|
|||||||
const [agentForm, setAgentForm] = useState({ agnAbbr: "", agnName: "" });
|
const [agentForm, setAgentForm] = useState({ agnAbbr: "", agnName: "" });
|
||||||
|
|
||||||
//Подключение к контексту взаимодействия с сервером
|
//Подключение к контексту взаимодействия с сервером
|
||||||
const { executeStored } = useContext(BackEndCtx);
|
const { executeStored } = useContext(BackEndСtx);
|
||||||
|
|
||||||
//Подключение к контексту сообщений
|
//Подключение к контексту сообщений
|
||||||
const { showMsgWarn } = useContext(MessagingCtx);
|
const { showMsgWarn } = useContext(MessagingСtx);
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowDocument } = useContext(ApplicationCtx);
|
const { pOnlineShowDocument } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Загрузка списка контрагентов
|
//Загрузка списка контрагентов
|
||||||
const agentsGet = useCallback(async () => {
|
const agentsGet = useCallback(async () => {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Парус 8 - Панели мониторинга - Примеры для разработчиков
|
Парус 8 - Панели мониторинга - Примеры для разработчиков
|
||||||
Пример: API для взаимодействия с "ПАРУС 8 Онлайн" и ядром фреймворка
|
Пример: API для взаимодействия с "ПАРУС 8 Онлайн"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//---------------------
|
//---------------------
|
||||||
@ -10,7 +10,7 @@
|
|||||||
import React, { useState, useContext } from "react"; //Классы React
|
import React, { useState, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Typography, Button, Divider } from "@mui/material"; //Интерфейсные элементы
|
import { Typography, Button, Divider } from "@mui/material"; //Интерфейсные элементы
|
||||||
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -27,20 +27,13 @@ const STYLES = {
|
|||||||
//Тело модуля
|
//Тело модуля
|
||||||
//-----------
|
//-----------
|
||||||
|
|
||||||
//Пример: API для взаимодействия с "ПАРУС 8 Онлайн" и ядром фреймворка
|
//Пример: API для взаимодействия с "ПАРУС 8 Онлайн"
|
||||||
const P8Online = ({ title }) => {
|
const P8Online = ({ title }) => {
|
||||||
//Собственное состояние - флаг отображения пользовательского текста заголовка
|
//Собственное состояние
|
||||||
const [titleCustom, setTitleCustom] = useState(false);
|
|
||||||
|
|
||||||
//Собственное состояние - флаг отображения заголовка
|
|
||||||
const [titleVisible, setTitleVisible] = useState(true);
|
|
||||||
|
|
||||||
//Собственное состояние - выбранный контрагент
|
|
||||||
const [agent, setAgent] = useState("");
|
const [agent, setAgent] = useState("");
|
||||||
|
|
||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit, pOnlineShowTab, pOnlineShowDocument, pOnlineShowDictionary, setAppBarTitle, setAppBarShow, findPanelByName } =
|
const { pOnlineShowUnit, pOnlineShowTab, pOnlineShowDocument, pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||||||
useContext(ApplicationCtx);
|
|
||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
@ -48,44 +41,20 @@ const P8Online = ({ title }) => {
|
|||||||
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
||||||
{title}
|
{title}
|
||||||
</Typography>
|
</Typography>
|
||||||
{/* Изменение текста заголовка */}
|
|
||||||
{titleVisible && (
|
|
||||||
<>
|
|
||||||
<Button
|
|
||||||
variant="contained"
|
|
||||||
onClick={() => {
|
|
||||||
setAppBarTitle(titleCustom ? "" : "Пользовательский текст");
|
|
||||||
setTitleCustom(!titleCustom);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`${titleCustom ? "Восстановить" : "Изменить"} текст заголовка`}
|
|
||||||
</Button>
|
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
{/* Сокрытие/отображение заголовка */}
|
|
||||||
<Button
|
|
||||||
variant="contained"
|
|
||||||
onClick={() => {
|
|
||||||
setAppBarShow(!titleVisible);
|
|
||||||
setTitleVisible(!titleVisible);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{`${titleVisible ? "Скрыть" : "Отобразить"} заголовок`}
|
|
||||||
</Button>
|
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
|
||||||
{/* Поиск панели */}
|
|
||||||
<Button variant="contained" onClick={() => console.log(findPanelByName("Samples"))}>
|
|
||||||
Вывести в консоль сведения о данной панели
|
|
||||||
</Button>
|
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
|
||||||
{/* Открыть новую закладку */}
|
{/* Открыть новую закладку */}
|
||||||
<Button variant="contained" onClick={() => pOnlineShowTab({ caption: "PARUS.COM", url: "https://www.parus.com" })}>
|
<Button variant="contained" onClick={() => pOnlineShowTab({ caption: "PARUS.COM", url: "https://www.parus.com" })}>
|
||||||
Открыть закладку
|
Открыть закладку
|
||||||
</Button>
|
</Button>
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
<Divider sx={STYLES.DIVIDER} />
|
||||||
{/* Открыть раздел */}
|
{/* Открыть раздел */}
|
||||||
<Button variant="contained" onClick={() => pOnlineShowUnit({ unitCode: "Contracts" })}>
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
onClick={() => {
|
||||||
|
pOnlineShowUnit({
|
||||||
|
unitCode: "Contracts"
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
Открыть раздел Договоры
|
Открыть раздел Договоры
|
||||||
</Button>
|
</Button>
|
||||||
<Divider sx={STYLES.DIVIDER} />
|
<Divider sx={STYLES.DIVIDER} />
|
||||||
@ -95,7 +64,12 @@ const P8Online = ({ title }) => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
pOnlineShowDictionary({
|
pOnlineShowDictionary({
|
||||||
unitCode: "AGNLIST",
|
unitCode: "AGNLIST",
|
||||||
inputParameters: [{ name: "in_AGNABBR", value: agent }],
|
inputParameters: [
|
||||||
|
{
|
||||||
|
name: "in_AGNABBR",
|
||||||
|
value: agent
|
||||||
|
}
|
||||||
|
],
|
||||||
callBack: res => (res.success === true ? setAgent(res.outParameters.out_AGNABBR) : null)
|
callBack: res => (res.success === true ? setAgent(res.outParameters.out_AGNABBR) : null)
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@ -108,7 +82,13 @@ const P8Online = ({ title }) => {
|
|||||||
<Divider sx={STYLES.DIVIDER} />
|
<Divider sx={STYLES.DIVIDER} />
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
onClick={() => pOnlineShowDocument({ unitCode: "AGNLIST", document: agent, inRnParameter: "in_AGNABBR" })}
|
onClick={() => {
|
||||||
|
pOnlineShowDocument({
|
||||||
|
unitCode: "AGNLIST",
|
||||||
|
document: agent,
|
||||||
|
inRnParameter: "in_AGNABBR"
|
||||||
|
});
|
||||||
|
}}
|
||||||
>{`Показать контрагента "${agent}"`}</Button>
|
>{`Показать контрагента "${agent}"`}</Button>
|
||||||
</>
|
</>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import { Indicator } from "./indicator"; //Пример: Индикатор "P8P
|
|||||||
|
|
||||||
//Режимы
|
//Режимы
|
||||||
const MODES = {
|
const MODES = {
|
||||||
P8ONLINE: { name: "P8ONLINE", caption: 'API для взаимодействия с "ПАРУС 8 Онлайн" и ядром фреймворка', component: P8Online },
|
P8ONLINE: { name: "P8ONLINE", caption: 'API для взаимодействия с "ПАРУС 8 Онлайн"', component: P8Online },
|
||||||
MUI: { name: "MUI", caption: "Компоненты MUI", component: Mui },
|
MUI: { name: "MUI", caption: "Компоненты MUI", component: Mui },
|
||||||
MESSAGES: { name: "MESSAGES", caption: "Сообщения", component: Messages },
|
MESSAGES: { name: "MESSAGES", caption: "Сообщения", component: Messages },
|
||||||
LOADER: { name: "LOADER", caption: "Индикатор процесса", component: Loader },
|
LOADER: { name: "LOADER", caption: "Индикатор процесса", component: Loader },
|
||||||
|
|||||||
@ -345,14 +345,6 @@ create or replace package PKG_P8PANELS_QE_BASE as
|
|||||||
SQRY_MSG out varchar2 -- Сообщение при формировании SQL-выражения (предупреждения и ошибки формирования)
|
SQRY_MSG out varchar2 -- Сообщение при формировании SQL-выражения (предупреждения и ошибки формирования)
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Исполнение запроса */
|
|
||||||
procedure QUERY_EXECUTE
|
|
||||||
(
|
|
||||||
NRN in number, -- Рег. номер запроса
|
|
||||||
CARGS in clob, -- Значения аргументов
|
|
||||||
CDATA out clob -- Данные
|
|
||||||
);
|
|
||||||
|
|
||||||
end PKG_P8PANELS_QE_BASE;
|
end PKG_P8PANELS_QE_BASE;
|
||||||
/
|
/
|
||||||
create or replace package body PKG_P8PANELS_QE_BASE as
|
create or replace package body PKG_P8PANELS_QE_BASE as
|
||||||
@ -500,7 +492,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
|
|||||||
if (NDATA_TYPE is null) then
|
if (NDATA_TYPE is null) then
|
||||||
P_EXCEPTION(0, 'Не указан тип данных аргумента.');
|
P_EXCEPTION(0, 'Не указан тип данных аргумента.');
|
||||||
end if;
|
end if;
|
||||||
if (NDATA_TYPE not in (PKG_STD.DATA_TYPE_STR(), PKG_STD.DATA_TYPE_NUM(), PKG_STD.DATA_TYPE_DATE())) then
|
if (NDATA_TYPE not in (PKG_STD.DATA_TYPE_STR, PKG_STD.DATA_TYPE_NUM, PKG_STD.DATA_TYPE_DATE)) then
|
||||||
P_EXCEPTION(0,
|
P_EXCEPTION(0,
|
||||||
'Аргументы типа "%s" не поддерживаются.',
|
'Аргументы типа "%s" не поддерживаются.',
|
||||||
COALESCE(TO_CHAR(NDATA_TYPE), '<НЕ УКАЗАН>'));
|
COALESCE(TO_CHAR(NDATA_TYPE), '<НЕ УКАЗАН>'));
|
||||||
@ -2800,7 +2792,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
|
|||||||
'" отсутствует в составе его аргументов.',
|
'" отсутствует в составе его аргументов.',
|
||||||
BCLEAR_QRY => false);
|
BCLEAR_QRY => false);
|
||||||
end if;
|
end if;
|
||||||
/* Ищем следующую */
|
/* Ищем следующу */
|
||||||
SCOND_VAR := PKG_CONTVARLOC.NEXT_(RCONTAINER => RCOND_VARS, SNAME => SCOND_VAR);
|
SCOND_VAR := PKG_CONTVARLOC.NEXT_(RCONTAINER => RCOND_VARS, SNAME => SCOND_VAR);
|
||||||
end loop;
|
end loop;
|
||||||
end if;
|
end if;
|
||||||
@ -2881,7 +2873,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
|
|||||||
if (RENTS(I).RATTRS(J).NSHOW = 1) then
|
if (RENTS(I).RATTRS(J).NSHOW = 1) then
|
||||||
if (RENTS(I).RATTRS(J).SALIAS is null) then
|
if (RENTS(I).RATTRS(J).SALIAS is null) then
|
||||||
P_EXCEPTION(0,
|
P_EXCEPTION(0,
|
||||||
'Для атрибута ("%s") не задан псевдоним.',
|
'Для атрибута ("%s") не задан севдоним.',
|
||||||
RENTS(I).RATTRS(J).SID);
|
RENTS(I).RATTRS(J).SID);
|
||||||
end if;
|
end if;
|
||||||
SFIELD := RENTS(I).RATTRS(J).SID || ' "' || RENTS(I).RATTRS(J).SALIAS || '", ';
|
SFIELD := RENTS(I).RATTRS(J).SID || ' "' || RENTS(I).RATTRS(J).SALIAS || '", ';
|
||||||
@ -2999,15 +2991,15 @@ create or replace package body PKG_P8PANELS_QE_BASE as
|
|||||||
loop
|
loop
|
||||||
begin
|
begin
|
||||||
case
|
case
|
||||||
when ROPT.RARGS(I).NDATA_TYPE = PKG_STD.DATA_TYPE_STR() then
|
when ROPT.RARGS(I).NDATA_TYPE = PKG_STD.DATA_TYPE_STR then
|
||||||
SQRY_BND := PKG_SQL_BUILD.VAR_REPLACE_TO_STR(SSQL => SQRY_BND,
|
SQRY_BND := PKG_SQL_BUILD.VAR_REPLACE_TO_STR(SSQL => SQRY_BND,
|
||||||
SNAME => ROPT.RARGS(I).SNAME,
|
SNAME => ROPT.RARGS(I).SNAME,
|
||||||
SVALUE => ROPT.RARGS(I).SVALUE);
|
SVALUE => ROPT.RARGS(I).SVALUE);
|
||||||
when ROPT.RARGS(I).NDATA_TYPE = PKG_STD.DATA_TYPE_NUM() then
|
when ROPT.RARGS(I).NDATA_TYPE = PKG_STD.DATA_TYPE_NUM then
|
||||||
SQRY_BND := PKG_SQL_BUILD.VAR_REPLACE_TO_NUM(SSQL => SQRY_BND,
|
SQRY_BND := PKG_SQL_BUILD.VAR_REPLACE_TO_NUM(SSQL => SQRY_BND,
|
||||||
SNAME => ROPT.RARGS(I).SNAME,
|
SNAME => ROPT.RARGS(I).SNAME,
|
||||||
NVALUE => TO_NUMBER(ROPT.RARGS(I).SVALUE));
|
NVALUE => TO_NUMBER(ROPT.RARGS(I).SVALUE));
|
||||||
when ROPT.RARGS(I).NDATA_TYPE = PKG_STD.DATA_TYPE_DATE() then
|
when ROPT.RARGS(I).NDATA_TYPE = PKG_STD.DATA_TYPE_DATE then
|
||||||
SQRY_BND := PKG_SQL_BUILD.VAR_REPLACE_TO_DATE(SSQL => SQRY_BND,
|
SQRY_BND := PKG_SQL_BUILD.VAR_REPLACE_TO_DATE(SSQL => SQRY_BND,
|
||||||
SNAME => ROPT.RARGS(I).SNAME,
|
SNAME => ROPT.RARGS(I).SNAME,
|
||||||
DVALUE => TO_DATE(ROPT.RARGS(I).SVALUE, 'yyyy-mm-dd'));
|
DVALUE => TO_DATE(ROPT.RARGS(I).SVALUE, 'yyyy-mm-dd'));
|
||||||
@ -3062,190 +3054,5 @@ create or replace package body PKG_P8PANELS_QE_BASE as
|
|||||||
ADD_QRY_MSG(SMESSAGE => PKG_STATE.SQL_ERRM(), BCLEAR_QRY => false);
|
ADD_QRY_MSG(SMESSAGE => PKG_STATE.SQL_ERRM(), BCLEAR_QRY => false);
|
||||||
end QUERY_QRY_BUILD;
|
end QUERY_QRY_BUILD;
|
||||||
|
|
||||||
/* Исполнение запроса */
|
|
||||||
procedure QUERY_EXECUTE
|
|
||||||
(
|
|
||||||
NRN in number, -- Рег. номер запроса
|
|
||||||
CARGS in clob, -- Значения аргументов
|
|
||||||
CDATA out clob -- Данные
|
|
||||||
)
|
|
||||||
is
|
|
||||||
RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса
|
|
||||||
ICURSOR integer; -- Курсор для исполнения запроса
|
|
||||||
ROPT TOPT; --
|
|
||||||
RARGS TARGS; -- Полученные аргументы
|
|
||||||
NARG PKG_STD.TNUMBER; --
|
|
||||||
SARG_VALUE PKG_STD.TLSTRING; --
|
|
||||||
RCUR_COLS PKG_CONTUNVLOC.TCONTAINER; -- Описание колонок запроса
|
|
||||||
SCOL_VALUE PKG_STD.TLSTRING; --
|
|
||||||
NCOL_VALUE PKG_STD.TLNUMBER; --
|
|
||||||
DCOL_VALUE PKG_STD.TLDATE; --
|
|
||||||
TSCOL_VALUE timestamp; --
|
|
||||||
TZCOL_VALUE timestamp with time zone; --
|
|
||||||
NROW PKG_STD.TNUMBER := 0; --
|
|
||||||
begin
|
|
||||||
/* Читаем описание запроса */
|
|
||||||
RQ := QUERY_GET(NRN => NRN);
|
|
||||||
/* Проверим, что существует SQL-выражение */
|
|
||||||
if (RQ.QRY is null) then
|
|
||||||
P_EXCEPTION(0, 'Для запроса не сформировано SQL-выражение.');
|
|
||||||
end if;
|
|
||||||
/* Читаем настройки запроса */
|
|
||||||
ROPT := QUERY_OPT_FROM_XML(CXML => RQ.OPT);
|
|
||||||
/* Читаем полученные аргументы */
|
|
||||||
RARGS := TARGS_FROM_XML(CXML => CARGS);
|
|
||||||
if (RARGS.COUNT > 0) then
|
|
||||||
for I in RARGS.FIRST .. RARGS.LAST
|
|
||||||
loop
|
|
||||||
DBMS_OUTPUT.PUT_LINE(RARGS(I).SNAME || ' = ' || RARGS(I).SVALUE);
|
|
||||||
end loop;
|
|
||||||
else
|
|
||||||
DBMS_OUTPUT.PUT_LINE('Нет аргументов');
|
|
||||||
end if;
|
|
||||||
/* Если для запроса заявлены аргументы, то проверим, что переданы значения для обязательных */
|
|
||||||
if (ROPT.RARGS.COUNT > 0) then
|
|
||||||
for I in ROPT.RARGS.FIRST .. ROPT.RARGS.LAST
|
|
||||||
loop
|
|
||||||
if (ROPT.RARGS(I).NMANDATORY = 1) then
|
|
||||||
NARG := TARGS_INDEX_BY_NAME(RARGS => RARGS, SNAME => ROPT.RARGS(I).SNAME);
|
|
||||||
if ((NARG is null) or (RARGS(NARG).SVALUE is null)) then
|
|
||||||
P_EXCEPTION(0,
|
|
||||||
'Не указано значение обязательного аргумента запроса "%s".',
|
|
||||||
ROPT.RARGS(I).SNAME);
|
|
||||||
end if;
|
|
||||||
end if;
|
|
||||||
end loop;
|
|
||||||
end if;
|
|
||||||
/* Разбираем его */
|
|
||||||
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
|
|
||||||
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => RQ.QRY);
|
|
||||||
/* Получим описание колонок */
|
|
||||||
PKG_SQL_DML.DESCRIBE_COLUMNS(ICURSOR => ICURSOR, RDESC_CONTAINER => RCUR_COLS);
|
|
||||||
if (PKG_CONTUNVLOC.COUNT_(RCONTAINER => RCUR_COLS) > 0) then
|
|
||||||
/* Обходим их */
|
|
||||||
for I in PKG_CONTUNVLOC.FIRST_(RCONTAINER => RCUR_COLS) .. PKG_CONTUNVLOC.LAST_(RCONTAINER => RCUR_COLS)
|
|
||||||
loop
|
|
||||||
/* Определяем типы данных колонок курсора */
|
|
||||||
case PKG_CONTUNVLOC.GETN(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'DATA_TYPE')
|
|
||||||
when PKG_STD.DATA_TYPE_STR() then
|
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => I);
|
|
||||||
when PKG_STD.DATA_TYPE_NUM() then
|
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => I);
|
|
||||||
when PKG_STD.DATA_TYPE_DATE() then
|
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => I);
|
|
||||||
when PKG_STD.DATA_TYPE_TS() then
|
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_TS(ICURSOR => ICURSOR, IPOSITION => I);
|
|
||||||
when PKG_STD.DATA_TYPE_TZ() then
|
|
||||||
PKG_SQL_DML.DEFINE_COLUMN_TZ(ICURSOR => ICURSOR, IPOSITION => I);
|
|
||||||
else
|
|
||||||
P_EXCEPTION(0,
|
|
||||||
'Тип данных "%s" не поддерживается.',
|
|
||||||
TO_CHAR(PKG_CONTUNVLOC.GETN(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'DATA_TYPE')));
|
|
||||||
end case;
|
|
||||||
DBMS_OUTPUT.PUT_LINE(I || ' - ' ||
|
|
||||||
PKG_CONTUNVLOC.GETS(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'COLUMN_NAME') ||
|
|
||||||
' - ' ||
|
|
||||||
PKG_CONTUNVLOC.GETS(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'NATIVE_NAME') ||
|
|
||||||
' - ' ||
|
|
||||||
PKG_CONTUNVLOC.GETN(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'DATA_TYPE'));
|
|
||||||
end loop;
|
|
||||||
else
|
|
||||||
P_EXCEPTION(0, 'Для запроса не определен набор полей.');
|
|
||||||
end if;
|
|
||||||
/* Делаем подстановку значений аргументов, если они заявлены в запросе */
|
|
||||||
if (ROPT.RARGS.COUNT > 0) then
|
|
||||||
/* Обходим формальные аргументы запроса */
|
|
||||||
for I in ROPT.RARGS.FIRST .. ROPT.RARGS.LAST
|
|
||||||
loop
|
|
||||||
begin
|
|
||||||
/* Ищем значение соответствующего фактического аргумента */
|
|
||||||
NARG := TARGS_INDEX_BY_NAME(RARGS => RARGS, SNAME => ROPT.RARGS(I).SNAME);
|
|
||||||
if (NARG is not null) then
|
|
||||||
SARG_VALUE := RARGS(NARG).SVALUE;
|
|
||||||
else
|
|
||||||
SARG_VALUE := null;
|
|
||||||
end if;
|
|
||||||
/* Подставляем в запрос */
|
|
||||||
case ROPT.RARGS(I).NDATA_TYPE
|
|
||||||
when PKG_STD.DATA_TYPE_STR() then
|
|
||||||
PKG_SQL_DML.BIND_VARIABLE_STR(ICURSOR => ICURSOR, SNAME => ROPT.RARGS(I).SNAME, SVALUE => SARG_VALUE);
|
|
||||||
when PKG_STD.DATA_TYPE_NUM() then
|
|
||||||
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR,
|
|
||||||
SNAME => ROPT.RARGS(I).SNAME,
|
|
||||||
NVALUE => TO_NUMBER(SARG_VALUE));
|
|
||||||
when PKG_STD.DATA_TYPE_DATE() then
|
|
||||||
PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR,
|
|
||||||
SNAME => ROPT.RARGS(I).SNAME,
|
|
||||||
DVALUE => TO_DATE(SARG_VALUE, 'yyyy-mm-dd'));
|
|
||||||
else
|
|
||||||
P_EXCEPTION(0,
|
|
||||||
'Тип данных "%s" не поддерживается.',
|
|
||||||
TO_CHAR(ROPT.RARGS(I).NDATA_TYPE));
|
|
||||||
end case;
|
|
||||||
exception
|
|
||||||
when others then
|
|
||||||
PKG_STATE.DIAGNOSTICS_STACKED();
|
|
||||||
P_EXCEPTION(0, 'Ошибка подстановки аргументов: %s.', PKG_STATE.SQL_ERRM());
|
|
||||||
end;
|
|
||||||
end loop;
|
|
||||||
end if;
|
|
||||||
/* Делаем выборку */
|
|
||||||
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
|
|
||||||
null;
|
|
||||||
end if;
|
|
||||||
/* Обходим выборку */
|
|
||||||
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
|
|
||||||
loop
|
|
||||||
/* Инкремент счетчика строк */
|
|
||||||
NROW := NROW + 1;
|
|
||||||
DBMS_OUTPUT.PUT_LINE('===== СТРОКА # ' || TO_CHAR(NROW) || '=====');
|
|
||||||
/* Обходим колонки */
|
|
||||||
for I in PKG_CONTUNVLOC.FIRST_(RCONTAINER => RCUR_COLS) .. PKG_CONTUNVLOC.LAST_(RCONTAINER => RCUR_COLS)
|
|
||||||
loop
|
|
||||||
/* Сброс значений предыдущей колонки */
|
|
||||||
SCOL_VALUE := null;
|
|
||||||
NCOL_VALUE := null;
|
|
||||||
DCOL_VALUE := null;
|
|
||||||
TSCOL_VALUE := null;
|
|
||||||
TZCOL_VALUE := null;
|
|
||||||
/* Определяем типы данных колонок курсора */
|
|
||||||
case PKG_CONTUNVLOC.GETN(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'DATA_TYPE')
|
|
||||||
when PKG_STD.DATA_TYPE_STR() then
|
|
||||||
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => I, SVALUE => SCOL_VALUE);
|
|
||||||
when PKG_STD.DATA_TYPE_NUM() then
|
|
||||||
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => I, NVALUE => NCOL_VALUE);
|
|
||||||
when PKG_STD.DATA_TYPE_DATE() then
|
|
||||||
PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => I, DVALUE => DCOL_VALUE);
|
|
||||||
when PKG_STD.DATA_TYPE_TS() then
|
|
||||||
PKG_SQL_DML.COLUMN_VALUE_TS(ICURSOR => ICURSOR, IPOSITION => I, TSVALUE => TSCOL_VALUE);
|
|
||||||
when PKG_STD.DATA_TYPE_TZ() then
|
|
||||||
PKG_SQL_DML.COLUMN_VALUE_TZ(ICURSOR => ICURSOR, IPOSITION => I, TZVALUE => TZCOL_VALUE);
|
|
||||||
else
|
|
||||||
P_EXCEPTION(0,
|
|
||||||
'Тип данных "%s" не поддерживается.',
|
|
||||||
TO_CHAR(PKG_CONTUNVLOC.GETN(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'DATA_TYPE')));
|
|
||||||
end case;
|
|
||||||
DBMS_OUTPUT.PUT_LINE(I || ' - ' ||
|
|
||||||
PKG_CONTUNVLOC.GETS(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'COLUMN_NAME') ||
|
|
||||||
' - ' ||
|
|
||||||
PKG_CONTUNVLOC.GETS(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'NATIVE_NAME') ||
|
|
||||||
' - ' ||
|
|
||||||
PKG_CONTUNVLOC.GETN(RCONTAINER => RCUR_COLS, IROWID => I, SCOLUMN_NAME => 'DATA_TYPE') ||
|
|
||||||
' - ' ||
|
|
||||||
NVL(SCOL_VALUE,
|
|
||||||
NVL(TO_CHAR(NCOL_VALUE),
|
|
||||||
NVL(TO_CHAR(DCOL_VALUE), NVL(TO_CHAR(TSCOL_VALUE), TO_CHAR(TZCOL_VALUE))))));
|
|
||||||
end loop;
|
|
||||||
end loop;
|
|
||||||
/* Освобождаем курсор */
|
|
||||||
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
|
|
||||||
exception
|
|
||||||
when others then
|
|
||||||
if (PKG_SQL_DML.IS_OPEN(ICURSOR => ICURSOR)) then
|
|
||||||
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
|
|
||||||
end if;
|
|
||||||
raise;
|
|
||||||
end QUERY_EXECUTE;
|
|
||||||
|
|
||||||
end PKG_P8PANELS_QE_BASE;
|
end PKG_P8PANELS_QE_BASE;
|
||||||
/
|
/
|
||||||
|
|||||||
@ -25,7 +25,6 @@ create or replace package PKG_P8PANELS_SAMPLES as
|
|||||||
(
|
(
|
||||||
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
|
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
|
||||||
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
|
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
|
||||||
NUSE_MORE_BUTTON in number, -- Использовать кнопку догрузки данных (0 - нет, 1 - да)
|
|
||||||
CFILTERS in clob, -- Фильтры
|
CFILTERS in clob, -- Фильтры
|
||||||
CORDERS in clob, -- Сортировки
|
CORDERS in clob, -- Сортировки
|
||||||
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
|
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
|
||||||
@ -258,7 +257,6 @@ create or replace package body PKG_P8PANELS_SAMPLES as
|
|||||||
(
|
(
|
||||||
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
|
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
|
||||||
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
|
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
|
||||||
NUSE_MORE_BUTTON in number, -- Использовать кнопку догрузки данных (0 - нет, 1 - да)
|
|
||||||
CFILTERS in clob, -- Фильтры
|
CFILTERS in clob, -- Фильтры
|
||||||
CORDERS in clob, -- Сортировки
|
CORDERS in clob, -- Сортировки
|
||||||
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
|
NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
|
||||||
@ -362,9 +360,9 @@ create or replace package body PKG_P8PANELS_SAMPLES as
|
|||||||
/* Инициализируем таблицу данных */
|
/* Инициализируем таблицу данных */
|
||||||
RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true,
|
RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true,
|
||||||
NFIXED_COLUMNS => 2,
|
NFIXED_COLUMNS => 2,
|
||||||
|
NPAGES_COUNT => 10,
|
||||||
SPAGES_POSITION => PKG_P8PANELS_VISUAL.STABLE_PAGES_POSITION_BOTTOM,
|
SPAGES_POSITION => PKG_P8PANELS_VISUAL.STABLE_PAGES_POSITION_BOTTOM,
|
||||||
SPAGES_ALIGN => PKG_P8PANELS_VISUAL.STABLE_PAGES_ALIGN_RIGHT,
|
SPAGES_ALIGN => PKG_P8PANELS_VISUAL.STABLE_PAGES_ALIGN_RIGHT);
|
||||||
BMORE_PAGES => case NUSE_MORE_BUTTON when 1 then true else false end);
|
|
||||||
/* Описываем колонки таблицы данных */
|
/* Описываем колонки таблицы данных */
|
||||||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||||||
SNAME => 'SAGNABBR',
|
SNAME => 'SAGNABBR',
|
||||||
@ -524,14 +522,12 @@ create or replace package body PKG_P8PANELS_SAMPLES as
|
|||||||
raise;
|
raise;
|
||||||
end;
|
end;
|
||||||
/* Определяем количество отображаемых страниц */
|
/* Определяем количество отображаемых страниц */
|
||||||
if (NUSE_MORE_BUTTON = 0) then
|
|
||||||
NPAGES_COUNT := PAGES_COUNT_GET(NCOMPANY => NCOMPANY, RDG => RDG, RFILTERS => RF, NPAGE_SIZE => NPAGE_SIZE);
|
NPAGES_COUNT := PAGES_COUNT_GET(NCOMPANY => NCOMPANY, RDG => RDG, RFILTERS => RF, NPAGE_SIZE => NPAGE_SIZE);
|
||||||
/* Если количество страниц определено */
|
/* Если количество страниц определено */
|
||||||
if (NPAGES_COUNT is not null) then
|
if (NPAGES_COUNT is not null) then
|
||||||
/* Устанавливаем количество отображаемых страниц */
|
/* Устанавливаем количество отображаемых страниц */
|
||||||
PKG_P8PANELS_VISUAL.TDG_PAGES_COUNT_SET(RDATA_GRID => RDG, NPAGES_COUNT => NPAGES_COUNT);
|
PKG_P8PANELS_VISUAL.TDG_PAGES_COUNT_SET(RDATA_GRID => RDG, NPAGES_COUNT => NPAGES_COUNT);
|
||||||
end if;
|
end if;
|
||||||
end if;
|
|
||||||
/* Сериализуем описание */
|
/* Сериализуем описание */
|
||||||
COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
|
COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
|
||||||
end DATA_GRID;
|
end DATA_GRID;
|
||||||
|
|||||||
@ -458,7 +458,7 @@ create or replace package PKG_P8PANELS_VISUAL as
|
|||||||
NPAGES_COUNT in number := 0, -- Количество страниц
|
NPAGES_COUNT in number := 0, -- Количество страниц
|
||||||
SPAGES_ALIGN in varchar2 := null, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
|
SPAGES_ALIGN in varchar2 := null, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
|
||||||
SPAGES_POSITION in varchar2 := null, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
|
SPAGES_POSITION in varchar2 := null, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
|
||||||
BMORE_PAGES in boolean := false -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
|
BMORE_PAGES in boolean := true -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
|
||||||
) return TDG; -- Результат работы
|
) return TDG; -- Результат работы
|
||||||
|
|
||||||
/* Установка количества страниц таблицы данных */
|
/* Установка количества страниц таблицы данных */
|
||||||
@ -1453,7 +1453,7 @@ create or replace package body PKG_P8PANELS_VISUAL as
|
|||||||
NPAGES_COUNT in number := 0, -- Количество страниц
|
NPAGES_COUNT in number := 0, -- Количество страниц
|
||||||
SPAGES_ALIGN in varchar2 := null, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
|
SPAGES_ALIGN in varchar2 := null, -- Область блока страниц по вертикали (см. константы STABLE_PAGES_ALIGN_*)
|
||||||
SPAGES_POSITION in varchar2 := null, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
|
SPAGES_POSITION in varchar2 := null, -- Область блока страниц по горизонтали (см. константы STABLE_PAGES_POSITION_*)
|
||||||
BMORE_PAGES in boolean := false -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
|
BMORE_PAGES in boolean := true -- Отображение кнопки догрузки данных (true - отображать, false - не отображать)
|
||||||
) return TDG -- Результат работы
|
) return TDG -- Результат работы
|
||||||
is
|
is
|
||||||
RRES TDG; -- Буфер для результата
|
RRES TDG; -- Буфер для результата
|
||||||
@ -1470,7 +1470,7 @@ create or replace package body PKG_P8PANELS_VISUAL as
|
|||||||
RRES.SPAGES_ALIGN := COALESCE(SPAGES_ALIGN, STABLE_PAGES_ALIGN_RIGHT);
|
RRES.SPAGES_ALIGN := COALESCE(SPAGES_ALIGN, STABLE_PAGES_ALIGN_RIGHT);
|
||||||
RRES.SPAGES_POSITION := COALESCE(SPAGES_POSITION, STABLE_PAGES_POSITION_BOTTOM);
|
RRES.SPAGES_POSITION := COALESCE(SPAGES_POSITION, STABLE_PAGES_POSITION_BOTTOM);
|
||||||
else
|
else
|
||||||
RRES.BMORE_PAGES := COALESCE(BMORE_PAGES, false);
|
RRES.BMORE_PAGES := COALESCE(BMORE_PAGES, true);
|
||||||
RRES.SPAGES_ALIGN := SPAGES_ALIGN;
|
RRES.SPAGES_ALIGN := SPAGES_ALIGN;
|
||||||
RRES.SPAGES_POSITION := SPAGES_POSITION;
|
RRES.SPAGES_POSITION := SPAGES_POSITION;
|
||||||
end if;
|
end if;
|
||||||
@ -1491,6 +1491,11 @@ create or replace package body PKG_P8PANELS_VISUAL as
|
|||||||
begin
|
begin
|
||||||
/* Обновляем значение количества страниц */
|
/* Обновляем значение количества страниц */
|
||||||
RDATA_GRID.NPAGES_COUNT := COALESCE(NPAGES_COUNT, 0);
|
RDATA_GRID.NPAGES_COUNT := COALESCE(NPAGES_COUNT, 0);
|
||||||
|
/* Если количество страниц меньше или равно нулю */
|
||||||
|
if (RDATA_GRID.NPAGES_COUNT <= 0) then
|
||||||
|
/* Обновляем доступность загрузку по кнопке */
|
||||||
|
RDATA_GRID.BMORE_PAGES := true;
|
||||||
|
end if;
|
||||||
end TDG_PAGES_COUNT_SET;
|
end TDG_PAGES_COUNT_SET;
|
||||||
|
|
||||||
/* Поиск описания колонки в таблице данных по наименованию */
|
/* Поиск описания колонки в таблице данных по наименованию */
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |