Compare commits

..

No commits in common. "e1c77731be40552e1500046694bced1819af9cc9" and "81d22b126c416f72e0972e6acb10c406c832e416" have entirely different histories.

276 changed files with 1190 additions and 2096 deletions

249
README.md
View File

@ -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. При разработке панелей могут быть использованы интерфейсные компоненты и разметка, поставляемые с ней.
![Компоненты MUI](docs/img/61.png) ![Компоненты MUI](docs/img/61.png)
Сочетая компоненты библиотеки [MUI5](https://v5.mui.com/) и описанный выше API для взаимодействия с Системой можно реализовать пользовательский интерфейс любой сложности. Для подключения компонента к панели достаточно импортировать его из модуля `"@mui/material"`. Сочетая компоненты библиотеки [MUI](https://mui.com/) и описанный выше API для взаимодействия с Системой можно реализовать пользовательский интерфейс любой сложности. Для подключения компонента к панели достаточно импортировать его из модуля `"@mui/material"`.
![Пример использования MUI](docs/img/62.png) ![Пример использования MUI](docs/img/62.png)
@ -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"). Их описание дано ниже.
![Примеры модальных сообщений](docs/img/63.png) ![Примеры модальных сообщений](docs/img/63.png)
@ -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` (отображение и сокрытие индикатора процесса соответственно).
![Пример индикатора процесса](docs/img/65.png) ![Пример индикатора процесса](docs/img/65.png)
@ -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 };
- Цветовая индикация пользовательскими цветами - Цветовая индикация пользовательскими цветами
- Обработка нажатий - Обработка нажатий
- Отображение иконки - Отображение иконки
- Управление внешним видом (парение, рамка) - Упрвление внешним видом (парение, рамка)
- Интерактивные подсказки - Интерактивные подсказки
![Пример P8PIndicator](docs/img/74.png) ![Пример P8PIndicator](docs/img/74.png)
@ -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/) для придания индивидуальности панелям и их компонентам.

View File

@ -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;

View File

@ -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 });

View File

@ -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) =>

View File

@ -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(() => {

View File

@ -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,

View File

@ -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 };
}; };
//---------------- //----------------

View File

@ -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 };
}; };
//---------------- //----------------

View File

@ -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
};
}; };
//---------------- //----------------

View File

@ -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);
};

View File

@ -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 };
}; };
//---------------- //----------------

View File

@ -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 };
}; };
//---------------- //----------------

View File

@ -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>
); );
}; };

View File

@ -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
}; };

View File

@ -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>
); );
}; };

View File

@ -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>
); );
}; };

View File

@ -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);

View File

@ -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 =>

View File

@ -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 => {

View File

@ -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(

View File

@ -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(() => {

View File

@ -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(() => {
//Загрузка доп. свойств //Загрузка доп. свойств

View File

@ -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) => {

View File

@ -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(

View File

@ -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 () => {

View File

@ -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);

View File

@ -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(() => {

View File

@ -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(

View File

@ -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 => {

View File

@ -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(

View File

@ -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 () => {

View File

@ -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 () => {

View File

@ -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(

View File

@ -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 }));

View File

@ -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(() => {

View File

@ -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 => {

View File

@ -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 (

View File

@ -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 () => {

View File

@ -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 });

View File

@ -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);

View File

@ -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);

View File

@ -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 => {

View File

@ -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 });

View File

@ -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 => {

View File

@ -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 }) => {

View File

@ -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 }) => {

View File

@ -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 }) => {

View File

@ -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 }) => {

View File

@ -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 () => {

View File

@ -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 (

View File

@ -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 }));

View File

@ -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 });

View File

@ -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(() => {

View File

@ -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 }) => {

View File

@ -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(() => {

View File

@ -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) => {

View File

@ -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(() => {

View File

@ -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 () => {

View File

@ -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 () => {

View File

@ -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 () => {

View File

@ -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(

View File

@ -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 () => {

View File

@ -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 () => {

View File

@ -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(

View File

@ -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();

View File

@ -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(

View File

@ -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);

View File

@ -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();

View File

@ -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(

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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 => {

View File

@ -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();

View File

@ -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) => {

View File

@ -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(

View File

@ -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) => {

View File

@ -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 }) => {

View File

@ -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(() => {

View File

@ -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>

View File

@ -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(

View File

@ -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 (

View File

@ -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 (

View File

@ -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 (

View File

@ -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 () => {

View File

@ -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}

View File

@ -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 },

View File

@ -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;
/ /

View File

@ -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;

View File

@ -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;
/* Поиск описания колонки в таблице данных по наименованию */ /* Поиск описания колонки в таблице данных по наименованию */

View File

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 172 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Some files were not shown because too many files have changed in this diff Show More