diff --git a/README.md b/README.md index c6a6461..65ccda3 100644 --- a/README.md +++ b/README.md @@ -68,13 +68,13 @@ > **Внимание:** > +> - **Проверьте версию "ПАРУС 8 Онлайн"** +> +> Перед копированием расширения из репозитория убедитесь, что в [релизах расширения](https://git.citpb.ru/CITKParus/P8-Panels-ParusOnlineExt/releases) нет специальной сборки для Вашей версии "ПАРУС 8 Онлайн". **Если таковая есть - необходимо устанавливать именно её, а не актуальную сборку из основной ветки репозитория!** +> > - **Для релиза "ПАРУС 8 Онлайн" от 30.08.2024** > -> Требуется [патч до промежуточной сборки 02.09.2024 или старше](https://cloud.mail.ru/public/nEZb/y4oQa1N6D). Установка расширения на данный релиз не рекомендуется, по возможности - пропустите его. -> -> - **Для релизов "ПАРУС 8 Онлайн" до 30.08.2024** -> -> Содержимое папки "bin" следует брать из специальной сборки расширения - [Для сборок Парус-Онлайн до 30.08.2024](https://git.citpb.ru/CITKParus/P8-Panels-ParusOnlineExt/releases/tag/FOR_PARUS_ONLINE_BEFORE_20240830) +> Требуется [патч для "ПАРУС 8 Онлайн" до промежуточной сборки 02.09.2024](https://cloud.mail.ru/public/nEZb/y4oQa1N6D). Установка расширения на данный релиз не рекомендуется, по возможности - пропустите его. 3. Подключите библиотеку расширения к серверу приложений "ПАРУС 8 Онлайн". Для этого добавьте ссылку на библиотеку в файл "Config\extensions.config" сервера приложений: @@ -647,8 +647,8 @@ const MyPanel = () => { В состав API входят: - `pOnlineShowTab` - функция, отображение типовой закладки "ПАРУС 8 Онлайн" -- `pOnlineShowUnit` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме -- `pOnlineShowDocument` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме с позиционированием/отбором по документу +- `pOnlineShowUnit` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме или на закладке +- `pOnlineShowDocument` - функция, отображение раздела "ПАРУС 8 Онлайн" в модальном режиме (или на закладке) с позиционированием/отбором по документу - `pOnlineShowDictionary` - функция, отображение раздела "ПАРУС 8 Онлайн" в режиме словаря - `pOnlineUserProcedure` - функция, исполнение "Пользовательской процедуры" - `pOnlineUserReport` - функция, печать "Пользовательского отчёта" @@ -684,13 +684,15 @@ const MyPanel = () => { { unitCode, showMethod = "main", - inputParameters + inputParameters, + modal = true } ``` `unitCode` - обязательный, строка, код раздела Системы\ `showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\ -`inputParameters` - необязательный, массив объектов вида `[{name: ИМЯ_ПАРАМЕТРА, value: ЗНАЧЕНИЕ_ПАРАМЕТРА},...]`, параметры метода вызова раздела Системы +`inputParameters` - необязательный, массив объектов вида `[{name: ИМЯ_ПАРАМЕТРА, value: ЗНАЧЕНИЕ_ПАРАМЕТРА},...]`, параметры метода вызова раздела Системы\ +`modal` - необязательный, логический, true (по умолчанию) - открыть в модальном окне, false - открыть в закладке (если закладка ранее была открыта с таким же набором параметров - она будет активирована), поддерживается для "ПАРУС 8 Онлайн" с версии 26.12.2024 **Результат:** функция не возвращает значимого результата @@ -705,14 +707,16 @@ const MyPanel = () => { unitCode, document, showMethod = "main", - inRnParameter = "in_RN" + inRnParameter = "in_RN", + modal = true } ``` `unitCode` - обязательный, строка, код раздела Системы\ `document` - обязательный, число, регистрационный номер документа или иной его идентификатор `showMethod` - необязательный, строка, метод вызова раздела Системы (если не указан - будет использован метод вызова "main")\ -`inRnParameter` - необязательный, строка, имя параметра метода вызова для позиционирования/отбора (если не указан, будет применён параметр метода вызова с именем "in_RN") +`inRnParameter` - необязательный, строка, имя параметра метода вызова для позиционирования/отбора (если не указан, будет применён параметр метода вызова с именем "in_RN")\ +`modal` - необязательный, логический, true (по умолчанию) - открыть в модальном окне, false - открыть в закладке (если закладка ранее была открыта с таким же набором параметров - она будет активирована), поддерживается для "ПАРУС 8 Онлайн" с версии 26.12.2024 **Результат:** функция не возвращает значимого результата @@ -1287,15 +1291,15 @@ const MyPanel = () => { **Свойства** -`columnsDef` - обязательный, массив, описание колонок таблицы, содержит объекты вида `{caption: <ЗАГОЛОВОК_КОЛОНКИ>, dataType: <ТИП_ДАННЫХ - NUMB|STR|DATE>, filter: <ПРИЗНАК_ВОЗМОЖНОСТИ_ОТБОРА - true|false>, hint: <ОПИСАНИЕ_КОЛОНКИ_МОЖЕТ_СОДЕРЖАТЬ_HTML_РАЗМЕТКУ>, name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, order: <ПРИЗНАК_ВОЗМОЖНОСТИ_СОРТИРОВКИ - true|false>, values: <МАССИВ_ПРЕДОПРЕДЕЛЁННЫХ_ЗНАЧЕНИЙ>, visible: <ПРИЗНАК_ВИДИМОСТИ_КОЛОНКИ - true|false>,expandable: <ПРИЗНАК_РАЗВОРАЧИВАЕМОСТИ_ГРУППОВОГО_ЗАГОЛОВКА - true|false>, expanded: <ПРИЗНАК_РАЗВЕРНУТОСТИ_ГРУППОВОГО_ЗАГОЛОВКА - true|false>, parent: <НАИМЕНОВАНИЕ_РОДИТЕЛЬСКОЙ_КОЛОНКИ_В_ГРУППОВОМ_ЗАГОЛОВКЕ>, width: <ШИРИНА_КОЛОНКИ>}`\ +`columnsDef` - необязательный, массив, описание колонок таблицы, содержит объекты вида `{caption: <ЗАГОЛОВОК_КОЛОНКИ>, dataType: <ТИП_ДАННЫХ - NUMB|STR|DATE>, filter: <ПРИЗНАК_ВОЗМОЖНОСТИ_ОТБОРА - true|false>, hint: <ОПИСАНИЕ_КОЛОНКИ_МОЖЕТ_СОДЕРЖАТЬ_HTML_РАЗМЕТКУ>, name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, order: <ПРИЗНАК_ВОЗМОЖНОСТИ_СОРТИРОВКИ - true|false>, values: <МАССИВ_ПРЕДОПРЕДЕЛЁННЫХ_ЗНАЧЕНИЙ>, visible: <ПРИЗНАК_ВИДИМОСТИ_КОЛОНКИ - true|false>,expandable: <ПРИЗНАК_РАЗВОРАЧИВАЕМОСТИ_ГРУППОВОГО_ЗАГОЛОВКА - true|false>, expanded: <ПРИЗНАК_РАЗВЕРНУТОСТИ_ГРУППОВОГО_ЗАГОЛОВКА - true|false>, parent: <НАИМЕНОВАНИЕ_РОДИТЕЛЬСКОЙ_КОЛОНКИ_В_ГРУППОВОМ_ЗАГОЛОВКЕ>, width: <ШИРИНА_КОЛОНКИ>}`\ `filtersInitial` - необязательныей, массив, начальное состояние фильтров таблицы, содержит объекты вида `{name: <НАИМЕНОВАНИЕ_КОЛОНКИ>, from: <НАЧАЛО_ДИАПАЗОНА_ЗНАЧЕНИЙ_ФИЛЬТРА>, to: <ОКОНЧАНИЕ_ДИАПАЗОНА_ЗНАЧЕНИЙ_ФИЛЬТРА>}`\ `groups` - необязательный, массив групп данных, содержит объекты вида `{name: <ИМЯ_ГРУППЫ>, caption: <ЗАГОЛОВОК_ГРУППЫ>, expandable: <ПРИЗНАК_РАЗВОРАЧИВАЕМОСТИ_ГРУППЫ - true|false>, expanded: <ПРИЗНАК_РАЗВЕРНУТОСТИ_ГРУППЫ - true|false>}`\ -`rows` - обязательный, массив, отображаемые таблицой строки данных, содержит объекты вида `{groupName: <ИМЯ_ГРУППЫ_СОДЕРЖАЩЕЙ_СТРОКУ>, <ИМЯ_КОЛОНКИ>: <ЗНАЧЕНИЕ>}`\ +`rows` - необязательный, массив, отображаемые таблицой строки данных, содержит объекты вида `{groupName: <ИМЯ_ГРУППЫ_СОДЕРЖАЩЕЙ_СТРОКУ>, <ИМЯ_КОЛОНКИ>: <ЗНАЧЕНИЕ>}`\ `size` - необязательный, строка, размер отступов при вёрстке таблицы, `small|medium` (см. константу `P8P_DATA_GRID_SIZE` в исходном коде компонента)\ -`fixedHeader` - необязательный, логический, признак фиксации заголовка таблицы\ -`fixedColumns` - необязательный, число, количество фиксированных колонок слева -`morePages` - обязательный, логический, признак отображения кнопки догрузки данных\ -`reloading` - обязательный, логический, признак выполнения обновления данных таблицы (служит для корректной выдачи сообщения об отсуствии данных и корректного отображения "разворачивающихся" строк)\ +`fixedHeader` - необязательный, логический, признак фиксации заголовка таблицы, по умолчанию - `false`\ +`fixedColumns` - необязательный, число, количество фиксированных колонок слева, по умолчанию - 0\ +`morePages` - необязательный, логический, признак отображения кнопки догрузки данных, по умолчанию - `false`\ +`reloading` - необязательный, логический, признак выполнения обновления данных таблицы (служит для корректной выдачи сообщения об отсуствии данных и корректного отображения "разворачивающихся" строк), по умолчанию - `false`\ `expandable` - необязательный, логический, признак необходимости формирования "разворачивающихся" строк, по умолчанию - `false`\ `orderAscMenuItemCaption` - обязательный, строка, текст для пункта меню сортировки колонки по возрастанию\ `orderDescMenuItemCaption` - обязательный, строка, текст для пункта меню сортировки колонки по убыванию\ @@ -1341,18 +1345,18 @@ const MyPanel = () => { Такие свойства как `columnsDef`, `groups`, `rows` компонента `P8PDataGrid` требуют от разработчика передачи данных в определённом формате. Это не обязательно должна быть информация из БД Системы, можно, например, просто объявить переменные в коде панели, задать им соответствующие значения и передать в компонент. Но изначально, таблица данных задумывалась для отображения сведений, полученных их учётных регистров Системы. Такие сведения, как правило, собираются хранимым объектом БД, исполняемым из панели посредством вызова `executeStored`. С целью снижения трудозатрат на приведение собранных хранимым объектом данных к форматам, потребляемым `P8PDataGrid`, реализован специальный API на стороне сервера БД. Для таблицы данных это (см. детальные описания программных интерфейсов в пакете `PKG_P8PANELS_VISUAL`): -`PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE` - функция, инициализация таблицы данных, возвращает объект для хранения описания таблицы\ -`PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF` - процедура, добавление описания колонки в таблицу, принимает на вход объект с описанием таблицы и параметры, описывающие добавляемую колонку (её имя, заголовок, тип данных, видимость, доступность отбора и сортировки, набор предопределённых значений и т.д.)\ -`PKG_P8PANELS_VISUAL.TCOL_VALS_ADD` - процедура, служит для формирования коллекции предопределённых значений колонки таблицы (подготовленная коллекция передаётся в `RCOL_VALS` вызова `TDATA_GRID_ADD_COL_DEF`, если необходимо)\ -`PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP` - процедура, служит для добавления описания группы в таблицу данных, на вход принимает объект для хранения описания таблицы и параметры добавляемой группы\ -`PKG_P8PANELS_VISUAL.TROW_ADD_COL` - процедура, добавляет значение колонки к строке таблицы (значение указывается явно в `[S|N|D]VALUE`)\ -`PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COL[S|N|D]` - процедура, добавляет значение колонки к строке таблицы (значение указывается через ссылку на номер колонки `NPOSITION` в курсоре `ICURSOR` динамического SQL)\ -`PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW` - процедура, добавляет сформированную строку со значениями колонок в таблицу данных, на вход принимает объект для хранения описания таблицы и описание строки, сформированное вызовами `TROW_ADD_COL` и `TROW_ADD_CUR_COL[S|N|D]`, а так же год группы, в которую должна быть включена строка\ -`PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML` - функция, производит сериализацию объекта, описывающего таблицу данных, в специальный XML-формат, корректно интерпретируемый клиентским компонентом `P8PDataGrid` при передаче в WEB-приложение\ -`PKG_P8PANELS_VISUAL.TORDERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния сортировок в коллекцию формата `TORDERS`, на вход принимает `CLOB` с сериализованным состоянием сортировок таблицы в виде `BASE64(ИМЯASC|DESC...)` (клиентское приложение должно обеспечить передачу состояния сортировок в этом формате, см. пример ниже)\ -`PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY` - процедура, вспомогательная утилита, производит в тексте SQL-запроса, поданного на вход, замену указанного шаблона на конструкцию `order by`, сформированную с учётом переданной коллекции `RORDERS`\ -`PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния фильтров в коллекцию формата `TFILTERS`, на вход принимает `CLOB` с сериализованным состоянием фильтров таблицы в виде `BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)` (клиентское приложение должно обеспечить передачу состояния фильтров в этом формате, см. пример ниже)\ -`PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY` - процедура, вспомогательная утилита, производит вызов указанной серверной процедуры отбора с учётом переданных переменных окружения и значений в `RFILTERS`\ +`PKG_P8PANELS_VISUAL.TDG_MAKE` - функция, инициализация таблицы данных, возвращает объект для хранения описания таблицы\ +`PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF` - процедура, добавление описания колонки в таблицу, принимает на вход объект с описанием таблицы и параметры, описывающие добавляемую колонку (её имя, заголовок, тип данных, видимость, доступность отбора и сортировки, набор предопределённых значений и т.д.)\ +`PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD` - процедура, служит для формирования коллекции предопределённых значений колонки таблицы (подготовленная коллекция передаётся в `RCOL_VALS` вызова `TDG_ADD_COL_DEF`, если необходимо)\ +`PKG_P8PANELS_VISUAL.TDG_ADD_GROUP` - процедура, служит для добавления описания группы в таблицу данных, на вход принимает объект для хранения описания таблицы и параметры добавляемой группы\ +`PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL` - процедура, добавляет значение колонки к строке таблицы (значение указывается явно в `[S|N|D]VALUE`)\ +`PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COL[S|N|D]` - процедура, добавляет значение колонки к строке таблицы (значение указывается через ссылку на номер колонки `NPOSITION` в курсоре `ICURSOR` динамического SQL)\ +`PKG_P8PANELS_VISUAL.TDG_ADD_ROW` - процедура, добавляет сформированную строку со значениями колонок в таблицу данных, на вход принимает объект для хранения описания таблицы и описание строки, сформированное вызовами `TDG_ROW_ADD_COL` и `TDG_ROW_ADD_CUR_COL[S|N|D]`, а так же год группы, в которую должна быть включена строка\ +`PKG_P8PANELS_VISUAL.TDG_TO_XML` - функция, производит сериализацию объекта, описывающего таблицу данных, в специальный XML-формат, корректно интерпретируемый клиентским компонентом `P8PDataGrid` при передаче в WEB-приложение\ +`PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния сортировок в коллекцию формата `TORDERS`, на вход принимает `CLOB` с сериализованным состоянием сортировок таблицы в виде `BASE64(ИМЯASC|DESC...)` (клиентское приложение должно обеспечить передачу состояния сортировок в этом формате, см. пример ниже)\ +`PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY` - процедура, вспомогательная утилита, производит в тексте SQL-запроса, поданного на вход, замену указанного шаблона на конструкцию `order by`, сформированную с учётом переданной коллекции `RORDERS`\ +`PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML` - функция, служит для десериализации (как правило, полученного от клиентского приложения) состояния фильтров в коллекцию формата `TDG_FILTERS`, на вход принимает `CLOB` с сериализованным состоянием фильтров таблицы в виде `BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)` (клиентское приложение должно обеспечить передачу состояния фильтров в этом формате, см. пример ниже)\ +`PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY` - процедура, вспомогательная утилита, производит вызов указанной серверной процедуры отбора с учётом переданных переменных окружения и значений в `RFILTERS`\ `PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC` - процедура, вспомогательная утилита, служит для конвертации номера страницы данных и размера страницы данных в границы диапазона строк выборки (как правило, клиентскому приложению удобнее прислать на сервер текущий номер страницы и её размер, в то время к в запросах, для выборки, удобнее применять границы диапазонов строк) **Пример** @@ -1372,11 +1376,11 @@ const MyPanel = () => { is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора - RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RAGN_TYPES PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределенные значения "Типа контрагентов" - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RAGN_TYPES PKG_P8PANELS_VISUAL.TDG_COL_VALS; -- Предопределенные значения "Типа контрагентов" + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -1387,71 +1391,71 @@ const MyPanel = () => { NAGNTYPE PKG_STD.TREF; -- Буфер для "Типа" begin /* Читаем фильтры */ - RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); + RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNABBR', - SCAPTION => 'Мнемокод', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'AgentAbbr', - BVISIBLE => true, - BORDER => true, - BFILTER => true, - NWIDTH => 150); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNINFO', - SCAPTION => 'Сведения', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => false, - BFILTER => false, - BEXPANDABLE => true, - NWIDTH => 300); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNNAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'AgentName', - BVISIBLE => true, - BORDER => true, - BFILTER => true, - SPARENT => 'SAGNINFO', - NWIDTH => 200); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 0); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 1); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NAGNTYPE', - SCAPTION => 'Тип', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'AgentType', - BVISIBLE => true, - BORDER => true, - BFILTER => true, - SPARENT => 'SAGNINFO', - NWIDTH => 100, - RCOL_VALS => RAGN_TYPES, - SHINT => 'В Системе бывают контрагенты двух типов:
' || - 'Юридическое лицо - организация, которая имеет в собственности, хозяйственном ведении ' || - 'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' || - 'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.
' || - 'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SFULLNAME', - SCAPTION => 'Полное наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNIDNUMB', - SCAPTION => 'ИНН', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNABBR', + SCAPTION => 'Мнемокод', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'AgentAbbr', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + NWIDTH => 150); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNINFO', + SCAPTION => 'Сведения', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => false, + BFILTER => false, + BEXPANDABLE => true, + NWIDTH => 300); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNNAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'AgentName', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + SPARENT => 'SAGNINFO', + NWIDTH => 200); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 0); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NAGNTYPE', + SCAPTION => 'Тип', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'AgentType', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + SPARENT => 'SAGNINFO', + NWIDTH => 100, + RCOL_VALS => RAGN_TYPES, + SHINT => 'В Системе бывают контрагенты двух типов:
' || + 'Юридическое лицо - организация, которая имеет в собственности, хозяйственном ведении ' || + 'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' || + 'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.
' || + 'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SFULLNAME', + SCAPTION => 'Полное наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNIDNUMB', + SCAPTION => 'ИНН', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -1477,14 +1481,17 @@ const MyPanel = () => { PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Учтём фильтры */ - PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, - NCOMPANY => NCOMPANY, - SUNIT => 'AGNLIST', - SPROCEDURE => 'P_AGNLIST_BASE_COND', - RDATA_GRID => RDG, - RFILTERS => RF); + PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT, + NCOMPANY => NCOMPANY, + SUNIT => 'AGNLIST', + SPROCEDURE => 'P_AGNLIST_BASE_COND', + RDATA_GRID => RDG, + RFILTERS => RF); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1512,29 +1519,38 @@ const MyPanel = () => { if (NAGNTYPE = 0) then SGROUP := 'JUR'; SAGNINFO := SAGNNAME || ', ЮЛ'; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SGROUP, - SCAPTION => 'Юридические лица', - BEXPANDABLE => true, - BEXPANDED => false); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SGROUP, + SCAPTION => 'Юридические лица', + BEXPANDABLE => true, + BEXPANDED => false); else SGROUP := 'PERS'; SAGNINFO := SAGNNAME || ', ФЛ'; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SGROUP, - SCAPTION => 'Физические лица', - BEXPANDABLE => true, - BEXPANDED => false); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SGROUP, + SCAPTION => 'Физические лица', + BEXPANDABLE => true, + BEXPANDED => false); end if; - RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SGROUP); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNABBR', ICURSOR => ICURSOR, NPOSITION => 1); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNINFO', SVALUE => SAGNINFO); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNNAME', SVALUE => SAGNNAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NAGNTYPE', NVALUE => NAGNTYPE); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SFULLNAME', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNIDNUMB', ICURSOR => ICURSOR, NPOSITION => 5); + RDG_ROW := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SGROUP); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGNABBR', + ICURSOR => ICURSOR, + NPOSITION => 1); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNINFO', SVALUE => SAGNINFO); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNNAME', SVALUE => SAGNNAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NAGNTYPE', NVALUE => NAGNTYPE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SFULLNAME', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGNIDNUMB', + ICURSOR => ICURSOR, + NPOSITION => 5); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -1544,7 +1560,7 @@ const MyPanel = () => { raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_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; ``` @@ -1617,18 +1633,14 @@ export const groupCellRender = () => ({ cellStyle: { padding: "2px" } }); //Пример: Таблица данных "P8PDataGrid" const DataGrid = ({ title }) => { //Собственное состояние - таблица данных - const [dataGrid, setdataGrid] = useState({ + const [dataGrid, setDataGrid] = useState({ dataLoaded: false, - columnsDef: [], filters: null, orders: null, - groups: [], - rows: [], - reload: true, pageNumber: 1, morePages: true, - fixedHeader: false, - fixedColumns: 0 + expandable: true, + reloading: true }); //Подключение к контексту взаимодействия с сервером @@ -1639,7 +1651,7 @@ const DataGrid = ({ title }) => { //Загрузка данных таблицы с сервера const loadData = useCallback(async () => { - if (dataGrid.reload) { + if (dataGrid.reloading) { const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.DATA_GRID", args: { @@ -1651,32 +1663,31 @@ const DataGrid = ({ title }) => { }, respArg: "COUT" }); - setdataGrid(pv => ({ + setDataGrid(pv => ({ ...pv, - fixedHeader: data.XDATA_GRID.fixedHeader, - fixedColumns: data.XDATA_GRID.fixedColumns, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], - groups: data.XGROUPS + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [], + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])], + groups: data.XDATA_GRID.groups ? pv.pageNumber == 1 - ? [...data.XGROUPS] - : [...pv.groups, ...data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name))] - : [...pv.groups], + ? [...data.XDATA_GRID.groups] + : [...(pv.groups || []), ...data.XDATA_GRID.groups.filter(g => !pv.groups.find(pg => pg.name == g.name))] + : [...(pv.groups || [])], dataLoaded: true, - reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + reloading: false, + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); } - }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]); + }, [dataGrid.reloading, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]); //При изменении состояния фильтра - const handleFilterChanged = ({ filters }) => setdataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reload: true })); + const handleFilterChanged = ({ filters }) => setDataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reloading: true })); //При изменении состояния сортировки - const handleOrderChanged = ({ orders }) => setdataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true })); + const handleOrderChanged = ({ orders }) => setDataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reloading: true })); //При изменении количества отображаемых страниц - const handlePagesCountChanged = () => setdataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true })); + const handlePagesCountChanged = () => setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reloading: true })); //При нажатии на копку контрагента const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" }); @@ -1684,7 +1695,7 @@ const DataGrid = ({ title }) => { //При необходимости обновить данные таблицы useEffect(() => { loadData(); - }, [dataGrid.reload, loadData]); + }, [dataGrid.reloading, loadData]); //Генерация содержимого return ( @@ -1698,16 +1709,9 @@ const DataGrid = ({ title }) => { {dataGrid.dataLoaded ? ( { onOrderChanged={handleOrderChanged} onFilterChanged={handleFilterChanged} onPagesCountChanged={handlePagesCountChanged} - expandable={true} rowExpandRender={({ row }) => ( )} @@ -1759,7 +1762,7 @@ const MyPanel = () => { `title` - необязательный, строка, заголовок графика, если не указано - заголовок не отображается\ `legendPosition` - необязательный, строка, расположение легенды, может принимать значения `left|right|top|bottom`, если не указано - легенда не отображается\ `options` - необязательный, объект, дополнительные параметры графика, формат и допустимый состав атрибутов определены в документации к библиотеке [ChartJS](https://www.chartjs.org/docs/latest/), будет объединён с параметрами графика уже зафиксированными в компоненте `P8PChart` (см. `useEffect` при подключении компонента к старице в его исходном коде, параметры графика, зафиксированные в компоненте, имеют более высокий приоритет по сравнению с данным свойством) -`labels` - обязательный, массив строк, список меток для значений графика\ +`labels` - необязательный, массив строк, список меток для значений графика\ `datasets` - необязательный, массив объектов, данные для отображения на диаграмме, каждый элемент массива - серия данных для отображения, содержит объекты вида `{label: <ЗАГОЛОВОК_СЕРИИ>, borderColor: <ЦВЕТ_ГРАНИЦЫ_СЕРИИ_НА_ГРАФИКЕ>, backgroundColor: <ЦВЕТ_ЗАЛИВКИ_СЕРИИ_НА_ГРАФИКЕ>, data: <МАССИВ_ЗНАЧЕНИЙ_СЕРИИ_ДАННЫХ>, items: <МАССИВ_ОБЪЕКТОВ_ПРОИЗВОЛЬНОЙ_СТРУКТУРЫ_ДЛЯ_ОПИСАНИЯ_СЕРИИ_ДАННЫХ>}`\ `onClick` - необязательный, функция, будет вызвана при нажатии на элемент графика, сигнатура функции `f({datasetIndex, itemIndex, item})`, результат функции не интерпретируется. Функции будет передан объект, поле `datasetIndex` которого, будет содержать индекс серии данных, `itemIndex` - индекс элемента серии данных, а `item` - описание элмента данных серии, на котором было зафиксировано нажатие.\ `style` - необязательный, объект, стили, которые будут применены к контейнеру `div` графика @@ -1851,7 +1854,7 @@ const STYLES = { //Пример: Графики "P8PChart" const Chart = ({ title }) => { //Собственное состояние - график - const [chart, setChart] = useState({ loaded: false, labels: [], datasets: [] }); + const [chart, setChart] = useState({ loaded: false }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); @@ -2126,12 +2129,10 @@ const taskDialogRenderer = ({ task, close }) => { //Пример: Диаграмма Ганта "P8Gantt" const Gantt = ({ title }) => { //Собственное состояние - const [state, setState] = useState({ + const [gantt, setGantt] = useState({ init: false, dataLoaded: false, ident: null, - ganttDef: {}, - ganttTasks: [], useCustomTaskDialog: false }); @@ -2142,21 +2143,21 @@ const Gantt = ({ title }) => { const loadData = useCallback(async () => { const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT", - args: { NIDENT: state.ident }, + args: { NIDENT: gantt.ident }, attributeValueProcessor: (name, val) => name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val, respArg: "COUT" }); - setState(pv => ({ ...pv, dataLoaded: true, ganttDef: { ...data.XGANTT_DEF }, ganttTasks: [...data.XGANTT_TASKS] })); - }, [state.ident, executeStored]); + setGantt(pv => ({ ...pv, dataLoaded: true, ...data.XGANTT })); + }, [gantt.ident, executeStored]); //Инициализация данных диаграммы const initData = useCallback(async () => { - if (!state.init) { - const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_INIT", args: { NIDENT: state.ident } }); - setState(pv => ({ ...pv, init: true, ident: data.NIDENT })); + if (!gantt.init) { + const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_INIT", args: { NIDENT: gantt.ident } }); + setGantt(pv => ({ ...pv, init: true, ident: data.NIDENT })); } - }, [state.init, state.ident, executeStored]); + }, [gantt.init, gantt.ident, executeStored]); //Изменение данных диаграммы const modifyData = useCallback( @@ -2164,13 +2165,13 @@ const Gantt = ({ title }) => { try { await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_MODIFY", - args: { NIDENT: state.ident, NRN: rn, DDATE_FROM: new Date(start), DDATE_TO: new Date(end) } + args: { NIDENT: gantt.ident, NRN: rn, DDATE_FROM: new Date(start), DDATE_TO: new Date(end) } }); } finally { loadData(); } }, - [state.ident, executeStored, loadData] + [gantt.ident, executeStored, loadData] ); //Обработка измненения сроков задачи в диаграмме Гантта @@ -2180,8 +2181,8 @@ const Gantt = ({ title }) => { //При необходимости обновить данные таблицы useEffect(() => { - if (state.ident) loadData(); - }, [state.ident, loadData]); + if (gantt.ident) loadData(); + }, [gantt.ident, loadData]); //При подключении компонента к странице useEffect(() => { @@ -2196,23 +2197,21 @@ const Gantt = ({ title }) => { {title} setState(pv => ({ ...pv, useCustomTaskDialog: !pv.useCustomTaskDialog }))} />} + sx={STYLES.CONTROL} + control={ setGantt(pv => ({ ...pv, useCustomTaskDialog: !pv.useCustomTaskDialog }))} />} label="Отображать пользовательский диалог задачи" /> - + - {state.dataLoaded ? ( - - - + {gantt.dataLoaded ? ( + ) : null} @@ -2366,6 +2365,503 @@ const Svg = ({ title }) => { Полные актуальные исходные коды примера можно увидеть в "app/panels/samples/svg.js" данного репозитория соответственно. +##### Циклограмма "P8PCyclogram" + +Компонент предназначен для отображения данных в виде циклограммы. Поддерживается: + +- Группировка задач с отображением описания группы при наведении +- Форматирование цвета заливки задачи, текста задачи и цвета при наведении на задачу/группу +- Дополнение задачи произвольными учётными атрибутами +- Диалоговый редактор задачи, отображающий её дополнительные атрибуты с возможностью настройки их форматирования +- Отображение произвольного пользовательского диалога в качестве карточки задачи/редактора задачи +- Масштабирование визуального представления + +![Пример P8PCyclogram](docs/img/72.png) +![Пример P8PCyclogram](docs/img/73.png) + +**Подключение** + +Клиентская часть циклограммы реализована в компоненте `P8PCyclogram`, объявленном в "app/components/p8p_cyclogram". Для использования компонента на панели его необходимо импортировать: + +``` +import { P8PCyclogram } from "../../components/p8p_cyclogram"; + +const MyPanel = () => { + return ( +
+ +
+ ); +} +``` + +**Свойства** + +`containerStyle` - необязательный, объект, стили, которые будут применены к компонету `div`, являющемуся контейнером циклограммы\ +`lineHeight` - необязательный, число, высота строки в пикселях (по умолчанию 20)\ +`title` - необязательный, строка, заголовок циклограммы (если не указан - не отображается)\ +`titleStyle` - необязательный, объект, стили, которые будут применены к компонету `Typography` заголовка циклограммы\ +`onTitleClick` - необязательный, функция, будет вызвана при нажатии пользователем на заголовок (если указана - заголовок формируется в виде гиперссылки), сигнатура функции `f()`, результат функции не интерпретируется\ +`zoomBar` - необязательный, логический, признак отображения панели управления масштабом (по умолчанию - не отображается)\ +`zoom` - необязательный, число, масштаб циклограммы\ +`columns` - обязательный, массив, колонки, отображаемые на циклограмме, должен состоять из объектов вида `{name: <НАИМЕНОВАНИЕ>, start: <ПОЗИЦИЯ_НАЧАЛА_КОЛОНКИ>, end: <ПОЗИЦИЯ_ОКОНЧАНИЯ_КОЛОНКИ>}` (см. константу `P8P_CYCLOGRAM_COLUMN_SHAPE` в коде компонента)\ +`columnRenderer` - необязательный, функция формирования представления колонки (если не указана - отображение по умолчанию). Сигнатура функции: `f({column})`. Будет вызвана для каждой колонки циклограммы, в функцию будет передан объект, в поле `column` которого будет содержаться описание текущей генерируемой колонки (элемент массива `columns`, см. выше описание полей). Должна возвращать значение или React-компонент.\ +`groups` - необязательный, массив, группы задач, которые отображаются на циклограмме, должен состоять из объектов вида `{name: <НАИМЕНОВАНИЕ>, height: <ВЫСОТА_ОТОБРАЖЕНИЯ_ГРУППЫ>, width: <ШИРИНА_ОТОБРАЖЕНИЯ_ГРУППЫ>, visible: <ПРИЗНАК_ОТОБРАЖЕНИЯ_ГРУППЫ>}` (см. константу `P8P_CYCLOGRAM_GROUP_SHAPE` в коде компонента). Группа отображается только при наведении на соответствующую задачу, которая относится к данной группе.\ +`groupHeaderRenderer` - необязательный, функция формирования представления всплывающей информации о группе (если не указана - отображение по умолчанию). Сигнатура функции: `f({group})`. Будет вызвана для каждой группы циклограммы, в функцию будет передан объект, в поле `group` которого будет содержаться описание текущей генерируемой группы (элемент массив `groups`, см. выше описание полей). Должна возвращать значение или React-компонент.\ +`tasks` - обязательный, массив, задачи, отображаемые на циклограмме, должен состоять из объектов вида `{id: <УНИКАЛЬНЫЙ_ИДЕНТИФИКАТОР>, rn: <ССЫЛКА_НА_ЗАПИСЬ_В_СИСТЕМЕ>, name: <НАИМЕНОВАНИЕ>, fullName: <ПОЛНОЕ_НАИМЕНОВАНИЕ>, lineNumb: <НОМЕР_СТРОКИ_ЗАДАЧИ>, start: <ПОЗИЦИЯ_НАЧАЛА_ЗАДАЧИ>, end: <ПОЗИЦИЯ_ОКОНЧАНИЯ_ЗАДАЧИ>, group: <НАИМЕНОВАНИЕ_ГРУППЫ>, bgColor: <ЦВЕТ_ЗАЛИВКИ>, textColor: <ЦВЕТ_ТЕКСТА>, highlightColor: <ЦВЕТ_НАВЕДЕНИЯ>, [<ИМЯ_ДОПОЛНИТЕЛЬНОГО_АТРИБУТА1>:<ЗНАЧЕНИЕ1>, <ИМЯ_ДОПОЛНИТЕЛЬНОГО_АТРИБУТА2>:<ЗНАЧЕНИЕ2>,...]}` (см. константу `P8P_CYCLOGRAM_TASK_SHAPE` в коде компонента).\ +`taskRenderer` - необязательный, функция формирования представления задачи на циклограмме (если не указана - отображение по умолчанию). Сигнатура функции: `f({task, taskHeight, taskWidth})`. Будет вызвана для каждой задачи циклограммы, в функцию будет передан объект, в поле `task` которого будет содержаться описание текущей генерируемой задаче (элемент массив `tasks`, см. выше описание полей), в поле `taskHeight` описание высоты задачи, в поле `taskWidth` описание ширины задачи. Должна возвращать объект вида `{taskStyle: <СТИЛИ_ДЛЯ_ЭЛЕМЕНТА_ЗАДАЧИ>, taskProps: <СВОЙСТВА_ДЛЯ_ЭЛЕМЕНТА_ЗАДАЧИ>, data: <ЗНАЧЕНИЕ_ИЛИ_КОМПОНЕНТ_React_ДЛЯ_СОДЕРЖИМОГО_ЭЛЕМЕНТА_ЗАДАЧИ>}` или `undefined`, если для задачи не предполагается специального представления.\ +`taskAttributes` - необязательный, массив, состав (не значения) дополнительных атрибутутов задач, должен состоять из объектов вида `{name: <ИМЯ_ДОПОЛНИТЕЛЬНОГО_АТРИБУТА>, caption: <ЗАГОЛОВОК_ДОПОЛНИТЕЛЬНОГО_АТРИБУТА>, visible: <ПРИЗНАК_ОТОБРАЖЕНИЯ_ДОПОЛНИТЕЛЬНОГО_АТРИБУТА - true|false>}` (см. константу `P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE` в коде компонента)\ +`taskAttributeRenderer` - необязательный, функция, если указана - будет вызвана при отображении диалога редактора здачи, результат функции будет применён для отображения области дополнительных атрибутов задачи в диалоге редактора, если не указана - дополнительные атрибуты будут отображены с форматированием по умолчанию. Сигнатура функции - `f({task, attribute})`, в функцию будет передан объект в поле `task`, которого, будет содержаться описание задачи для которой отображается редактор (элемент массива `tasks`, см. выше описание полей), в поле `attribute` - описание дополнительного атрибута формируемого в диалоге редактора (элемент массива `taskAttributes`, см. выше описание полей). Должна возвращать значение или React-компонент.\ +`taskDialogRenderer` - необязательный, функция, если указана - будет вызвана до отображения диалога редактора задачи. Результат функции будет показан в качестве содержимого диалога редактора, вместо типовой формы. Сигнатура функции - `f({task, taskAttributes, close})`, в функцию будет передан объект в поле `task`, которого, будет содержаться описание задачи для которой отображается редактор (элемент массива `tasks`, см. выше описание полей), в поле `taskAttributes` - массив `taskAttributes` (см. выше описание полей), описывающий состав полей задачи, в поле `close` - функция закрытия диалога задачи, может быть вызвана возвращаемым Reac-компонентом для сокрытия диалога. Должна возвращать значение или React-компонент.\ +`noDataFoundText` - обязательный, строка, текст для отображения ошибки об отсутствии данных\ +`nameTaskEditorCaption` - обязательный, строка, подпись стандартного атрибута `name` в диалоге редактора задачи\ +`okTaskEditorBtnCaption` - обязательный, строка, подпись кнопки "ОК" диалога редактора задачи\ +`cancelTaskEditorBtnCaption` - обязательный, строка, подпись кнопки "ОТМЕНА" диалога редактора задачи + +Некоторые параметры циклограммы вынесены в свойства компонента `P8PCyclogram` для минимизации его связи с фреймворком и поддержания возможности стороннего использования (например, свойства `noDataFoundText`, `okTaskEditorBtnCaption`, `cancelTaskEditorBtnCaption` и т.п.) . Тем не менее, в настройках фреймворка и его окружении уже есть реализации для данных свойств. Например, в "app.text.js" уже содержатся объявления типовых констант для текстов подписей кнопок и пунктов меню. Поэтому, в "app/config_wrapper.js" для привязки свойств `P8PCyclogram` к контексту фреймворка реализованы специальные декораторы и объекты-шаблоны, облегчающие подключение экземпляра `P8PCyclogram` к панели и снимающие с разработчика необходимость указывать некоторые из перечисленных выше обязательных свойств. В предложенном ниже примере, из модуля "config_wrapper" в панель импортируется объект `P8P_CYCLOGRAM_CONFIG_PROPS`, который уже содержт преднастроенное описание свойств `noDataFoundText`,`nameTaskEditorCaption`, `okTaskEditorBtnCaption` и `cancelTaskEditorBtnCaption`, полученное из окружения фреймворка. Таким образом, прикладной разработчик может не указывать их значения при использовании `P8PCyclogram` (если по каким-то причинам не хочет их переопределить, конечно). + +``` +import { P8PCyclogram } from "../../components/p8p_cyclogram"; +import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; + +const MyPanel = () => { + return ( +
+ +
+ ); +} +``` + +**API на сервере БД** + +Компонент `P8PCyclogram` требует от разработчика передачи данных в определённом формате. С целью снижения трудозатрат на приведение собранных хранимым объектом данных Системы к форматам, потребляемым `P8PCyclogram`, реализован специальный API на стороне сервера БД. + +Для циклограммы это (см. детальные описания программных интерфейсов в пакете `PKG_P8PANELS_VISUAL`): +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_MAKE` - функция, инициализация циклограммы, возвращает объект для хранения её описания\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR` - процедура, добавляет, к указанному объекту описания циклограммы, описатель дополнительного атрибута задачи\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE` - функция, инициализирует и возвращает объект для описания задачи в циклограмме (поставщик данных для `TCYCLOGRAM_ADD_TASK`)\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL` - процедура, добавляет, к указанному объекту описания задачи, значение дополнительного атрибута\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_COLUMN` - процедура, добавляет, к указанному объекту описания циклограммы, новую колонку\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_GROUP` - процедура, добавляет, к указанному объекту описания циклограммы, новую группу\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK` - процедура, добавляет, к указанному объекту описания циклограммы, новую задачу, ранее описанную через `TCYCLOGRAM_TASK_MAKE`\ +`PKG_P8PANELS_VISUAL.TCYCLOGRAM_TO_XML` - функция, производит сериализацию объекта, описывающего циклограмму, в специальный XML-формат, корректно интерпретируемый клиентским компонентом `P8PCyclogram` при передаче в WEB-приложение + +**Пример** + +Код на стороне сервера БД (хранимая процедура в клиентском пакете `PKG_P8PANELS_SAMPLES`, требует наличия таблицы `P8PNL_SMPL_CYCLOGRAM`, см. "db/P8PNL_SMPL_CYCLOGRAM.sql"): + +``` + procedure CYCLOGRAM + ( + NIDENT in number, -- Идентификатор процесса + COUT out clob -- Сериализованные данные для циклограммы + ) + is + CG PKG_P8PANELS_VISUAL.TCYCLOGRAM; -- Описание циклограммы + RTASK PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK; -- Описание задачи циклограммы + NLINE_NUMB PKG_STD.TNUMBER := 0; -- Номер строки + NLINE_NUMB_TMP PKG_STD.TNUMBER := 0; -- Номер строки (буфер) + DTASK_DATE_START PKG_STD.TLDATE; -- Дата начала этапа + DTASK_DATE_END PKG_STD.TLDATE; -- Дата окончания этапа + NTASK_START PKG_STD.TNUMBER := 0; -- Позиция начала этапа + NTASK_END PKG_STD.TNUMBER := 0; -- Позиция окончания этапа + STASK_NAME PKG_STD.TSTRING; -- Наименование задачи + SCOLOR_WHITE PKG_STD.TSTRING := 'white'; -- Цвет - белый + SBG_TASK_COLOR_W_GRP PKG_STD.TSTRING := '#6bc982'; -- Цвет задачи с группой + SHL_TASK_COLOR_W_GRP PKG_STD.TSTRING := '#7dd592'; -- Цвет наведения задачи с группой + SBG_TASK_COLOR_WO_GRP PKG_STD.TSTRING := '#e36d6d'; -- Цвет задачи без группы + STEXT_COLOR_TASK_WO_GRP PKG_STD.TSTRING := '#e5e5e5'; -- Цвет текста задачи без группы + SBG_TASK_COLOR_GRP PKG_STD.TSTRING := 'cadetblue'; -- Цвет групповой задачи + SHL_TASK_COLOR_GRP PKG_STD.TSTRING := '#6fadaf'; -- Цвет наведения групповой задачи + + /* Считывание значений группирующей задачи */ + procedure GROUP_TASK_GET + ( + NIDENT in number, -- Идентификатор процесса + NGROUP in number := null, -- Рег. номер группы + NFLAG_WO_GROUP in number := 0, -- Признак отбора задач без групп (0 - нет, 1 - да) + DTASK_DATE_START out date, -- Дата начала этапа + DTASK_DATE_END out date, -- Дата окончания этапа + NTASK_START out number, -- Позиция начала этапа + NTASK_END out number -- Позиция окончания этапа + ) + is + begin + ... + end GROUP_TASK_GET; + begin + /* Инициализируем циклограмму */ + CG := PKG_P8PANELS_VISUAL.TCYCLOGRAM_MAKE(STITLE => 'Задачи на ' || TO_CHAR(EXTRACT(year from sysdate)) || ' год'); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR(RCYCLOGRAM => CG, + SNAME => 'ddate_start', + SCAPTION => 'Дата начала', + BVISIBLE => true, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR(RCYCLOGRAM => CG, + SNAME => 'ddate_end', + SCAPTION => 'Дата окончания', + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR(RCYCLOGRAM => CG, + SNAME => 'type', + SCAPTION => 'Тип', + BVISIBLE => false); + /* Обходим колонки */ + for CLMN in (select T.NAME, + T.POS_START, + T.POS_END + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 0) + loop + /* Добавляем колонку */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_COLUMN(RCYCLOGRAM => CG, + SNAME => CLMN.NAME, + NSTART => CLMN.POS_START, + NEND => CLMN.POS_END); + end loop; + /* Считываем значения для задач проекта */ + GROUP_TASK_GET(NIDENT => NIDENT, + NFLAG_WO_GROUP => 0, + DTASK_DATE_START => DTASK_DATE_START, + DTASK_DATE_END => DTASK_DATE_END, + NTASK_START => NTASK_START, + NTASK_END => NTASK_END); + /* Формируем задачу (этап) */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => 1, + SCAPTION => 'Задачи проекта', + SNAME => 'Задачи проекта', + NLINE_NUMB => NLINE_NUMB, + NSTART => NTASK_START, + NEND => NTASK_END, + SBG_COLOR => SCOLOR_WHITE); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_START), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_END)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 0); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Обходим группы */ + for GRP in (select T.RN, + T.NAME, + ROWNUM RNUM + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 1 + order by T.RN asc) + loop + ... + /* Добавляем группу */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_GROUP(RCYCLOGRAM => CG, + SNAME => GRP.NAME, + NHEADER_HEIGHT => 30, + NHEADER_WIDTH => 200); + /* Считываем значения этапа группы */ + GROUP_TASK_GET(NIDENT => NIDENT, + NGROUP => GRP.RN, + DTASK_DATE_START => DTASK_DATE_START, + DTASK_DATE_END => DTASK_DATE_END, + NTASK_START => NTASK_START, + NTASK_END => NTASK_END); + /* Формируем задачу (этап) */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => GRP.RN, + SCAPTION => 'Этап ' || TO_CHAR(GRP.RNUM), + SNAME => 'Этап ' || TO_CHAR(GRP.RNUM), + NLINE_NUMB => NLINE_NUMB, + NSTART => NTASK_START, + NEND => NTASK_END, + SBG_COLOR => SBG_TASK_COLOR_GRP, + STEXT_COLOR => SCOLOR_WHITE, + SHIGHLIGHT_COLOR => SHL_TASK_COLOR_GRP); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_START), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_END)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 1); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + /* Обходим задачи группы */ + for TASK in (select T.RN, + T.NAME, + T.POS_START, + T.POS_END, + T.DATE_FROM, + T.DATE_TO, + ROWNUM RNUM + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 2 + and T.TASK_GROUP = GRP.RN) + loop + ... + end loop; + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + end loop; + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Считываем значения для обособленных задач */ + GROUP_TASK_GET(NIDENT => NIDENT, + NFLAG_WO_GROUP => 1, + DTASK_DATE_START => DTASK_DATE_START, + DTASK_DATE_END => DTASK_DATE_END, + NTASK_START => NTASK_START, + NTASK_END => NTASK_END); + /* Формируем задачу (этап) */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => 1, + SCAPTION => 'Обособленные задачи', + SNAME => 'Обособленные задачи', + NLINE_NUMB => NLINE_NUMB, + NSTART => NTASK_START, + NEND => NTASK_END, + SBG_COLOR => SCOLOR_WHITE); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_START), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_END)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 0); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Цикл по обособленным задачам */ + for REC in (select T.RN, + T.NAME, + T.POS_START, + T.POS_END, + T.DATE_FROM, + T.DATE_TO, + ROWNUM RNUM + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 2 + and T.TASK_GROUP is null) + loop + ... + end loop; + /* Формируем список */ + COUT := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TO_XML(RCYCLOGRAM => CG); + end CYCLOGRAM; +``` + +Код панели на стороне клиента (WEB-приложения): + +``` +/* + Парус 8 - Панели мониторинга - Примеры для разработчиков + Пример: Циклограмма "P8PCyclogram" +*/ + +//--------------------- +//Подключение библиотек +//--------------------- + +import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React +import PropTypes from "prop-types"; //Контроль свойств компонента +import { + Typography, + Grid, + Button, + Box, + DialogContent, + List, + ListItem, + ListItemText, + Divider, + TextField, + DialogActions, + Stack, + Icon +} from "@mui/material"; //Интерфейсные элементы +import { formatDateJSONDateOnly, formatDateRF } from "../../core/utils"; //Вспомогательные функции +import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы +import { P8PCyclogram } from "../../components/p8p_cyclogram"; //Циклограмма +import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения +import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером + +//--------- +//Константы +//--------- + +//Отступ контейнера страницы от заголовка +const CONTAINER_PADDING_TOP = "20px"; + +//Высота заголовка страницы +const TITLE_HEIGHT = "47px"; + +//Высота строк +const LINE_HEIGHT = 30; + +//Стили +const STYLES = { + CONTAINER: { textAlign: "center", paddingTop: CONTAINER_PADDING_TOP }, + TITLE: { paddingBottom: "15px", height: TITLE_HEIGHT }, + CYCLOGRAM_CONTAINER: { + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTAINER_PADDING_TOP})`, + width: "100vw", + paddingTop: "5px" + }, + TASK_EDITOR_CONTENT: { minWidth: 400, overflowX: "auto" }, + TASK_EDITOR_LIST: { width: "100%", minWidth: 300, maxWidth: 700, bgcolor: "background.paper" }, + GROUP_HEADER: height => ({ + border: "1px solid", + backgroundColor: "#ecf8fb", + height: height, + borderRadius: "10px", + display: "flex", + alignItems: "center", + justifyContent: "space-around" + }) +}; + +//--------------------------------------------- +//Вспомогательные функции форматирования данных +//--------------------------------------------- + +//Диалог открытия задачи +const CustomTaskDialog = ({ task, ident, handleReload, close }) => { + ... +}; + +//Контроль свойств - Диалог открытия задачи +CustomTaskDialog.propTypes = { + task: PropTypes.object.isRequired, + ident: PropTypes.number.isRequired, + handleReload: PropTypes.func.isRequired, + close: PropTypes.func.isRequired +}; + +//Заголовок группы +const CustomGroupHeader = ({ group }) => { + ... +}; + +//Контроль свойств - Заголовок группы +CustomGroupHeader.propTypes = { + group: PropTypes.object.isRequired +}; + +//Отображение задачи +const taskRenderer = ({ task }) => { + ... +}; + +//----------- +//Тело модуля +//----------- + +//Пример: Циклограмма "P8PCyclogram" +const Cyclogram = ({ title }) => { + //Собственное состояние + const [state, setState] = useState({ + init: false, + dataLoaded: false, + reload: true, + ident: null + }); + + //Подключение к контексту взаимодействия с сервером + const { executeStored } = useContext(BackEndСtx); + + //При необходимости перезагрузки + const handleReload = () => { + setState(pv => ({ ...pv, reload: true })); + }; + + //При необходимости обновить данные таблицы + useEffect(() => { + //Загрузка данных циклограммы с сервера + const loadData = async () => { + const data = await executeStored({ + stored: "PKG_P8PANELS_SAMPLES.CYCLOGRAM", + args: { NIDENT: state.ident }, + attributeValueProcessor: (name, val) => + name === "name" ? undefined : ["ddate_start", "ddate_end"].includes(name) ? formatDateJSONDateOnly(val) : val, + respArg: "COUT" + }); + setState(pv => ({ ...pv, dataLoaded: true, ...data.XCYCLOGRAM, reload: false })); + }; + //Если указан идентификатор и требуется перезагрузить + if (state.ident && state.reload) loadData(); + }, [state.ident, state.reload, executeStored]); + + //При подключении компонента к странице + useEffect(() => { + //Инициализация данных циклограммы + const initData = async () => { + const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.CYCLOGRAM_INIT", args: { NIDENT: state.ident } }); + setState(pv => ({ ...pv, init: true, ident: data.NIDENT, reload: true })); + }; + //Если требуется проинициализировать + if (!state.init) { + initData(); + } + }, [executeStored, state.ident, state.init]); + + return ( + +
+ + {title} + + + + {state.dataLoaded ? ( + ( + + )} + taskRenderer={prms => taskRenderer(prms)} + groupHeaderRenderer={prms => } + /> + ) : null} + + +
+
+ ); +}; + +//Контроль свойств - Пример: Циклограмма "P8PCyclogram" +Cyclogram.propTypes = { + title: PropTypes.string.isRequired +}; + +//---------------- +//Интерфейс модуля +//---------------- + +export { Cyclogram }; +``` + +Полные актуальные исходные коды примеров можно увидеть в "db/PKG_P8PANELS_SAMPLES.pck" и "app/panels/samples/cyclogram.js" данного репозитория соответственно. + ### Ограничения дизайна пользовательского интерфейса Фреймворк позволяет реализовать любые пользовательские интерфейсы, вёрстка которых не противоречит возможностям современного HTML. Тем не менее, при разработке пользовательских интерфейсов панелей важно придерживаться предложенных ниже правил. Это позволит создавать их в едином ключе и упростит работу конечного пользователя при их освоении. diff --git a/app.text.js b/app.text.js index 131baf9..f6e8b7c 100644 --- a/app.text.js +++ b/app.text.js @@ -53,6 +53,7 @@ export const CAPTIONS = { export const ERRORS = { UNDER_CONSTRUCTION: "Панель в разработке", P8O_API_UNAVAILABLE: '"ПАРУС 8 Онлайн" недоступен', + P8O_API_UNSUPPORTED: 'Функция "ПАРУС 8 Онлайн" не поддерживается', DEFAULT: "Неожиданная ошибка" }; diff --git a/app/components/p8p_app_workspace.js b/app/components/p8p_app_workspace.js index 88a37fd..334ad76 100644 --- a/app/components/p8p_app_workspace.js +++ b/app/components/p8p_app_workspace.js @@ -23,7 +23,8 @@ import { ListItemIcon, ListItemText } from "@mui/material"; //Интерфейсные компоненты -import { P8PPanelsMenuDrawer, P8P_PANELS_MENU_PANEL_SHAPE } from "./p8p_panels_menu"; +import { P8PPanelsMenuDrawer, P8P_PANELS_MENU_PANEL_SHAPE } from "./p8p_panels_menu"; //Меню +import { APP_STYLES } from "../../app.styles"; //Типовые стили //--------- //Константы @@ -34,6 +35,7 @@ const APP_BAR_HEIGHT = "64px"; //Стили const STYLES = { + DRAWER: { [`& .MuiDrawer-paper`]: { ...APP_STYLES.SCROLL } }, ROOT_BOX: { display: "flex" }, APP_BAR: { position: "fixed" }, APP_BAR_BUTTON: { mr: 2 }, @@ -88,7 +90,7 @@ const P8PAppWorkspace = ({ children, panels = [], selectedPanel, closeCaption, h - + diff --git a/app/components/p8p_chart.js b/app/components/p8p_chart.js index a56e687..32c6efa 100644 --- a/app/components/p8p_chart.js +++ b/app/components/p8p_chart.js @@ -7,7 +7,7 @@ //Подключение библиотек //--------------------- -import React, { useEffect, useRef } from "react"; //Классы React +import React, { useCallback, useEffect, useRef } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import Chart from "chart.js/auto"; //Диаграммы и графики @@ -37,23 +37,26 @@ const P8P_CHART_DATASET_SHAPE = PropTypes.shape({ //----------- //График -const P8PChart = ({ type, title, legendPosition, options, labels, datasets, onClick, style }) => { +const P8PChart = ({ type, title, legendPosition, options = {}, labels = [], datasets = [], onClick, style }) => { //Ссылки на DOM const chartCanvasRef = useRef(null); const chartRef = useRef(null); //Обработка нажатия на элемент графика - const handleClick = e => { - const bar = chartRef.current.getElementsAtEventForMode(e, "nearest", { intersect: true }, true)[0]; - if (onClick && bar) - onClick({ - datasetIndex: bar.datasetIndex, - itemIndex: bar.index, - item: chartRef.current.data.datasets[bar.datasetIndex].items - ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] - : null - }); - }; + const handleClick = useCallback( + e => { + const bar = chartRef.current.getElementsAtEventForMode(e, "nearest", { intersect: true }, true)[0]; + if (onClick && bar) + onClick({ + datasetIndex: bar.datasetIndex, + itemIndex: bar.index, + item: chartRef.current.data.datasets[bar.datasetIndex].items + ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] + : null + }); + }, + [onClick] + ); //При подключении к старнице useEffect(() => { @@ -89,9 +92,10 @@ const P8PChart = ({ type, title, legendPosition, options, labels, datasets, onCl if (chartRef.current) { chartRef.current.data.labels = [...labels]; chartRef.current.data.datasets = [...datasets]; + chartRef.current.options.onClick = handleClick; chartRef.current.update(); } - }, [datasets, labels]); + }, [datasets, labels, handleClick]); //Генерация содержимого return ( @@ -107,7 +111,7 @@ P8PChart.propTypes = { title: PropTypes.string, legendPosition: PropTypes.string, options: PropTypes.object, - labels: PropTypes.arrayOf(PropTypes.string).isRequired, + labels: PropTypes.arrayOf(PropTypes.string), datasets: PropTypes.arrayOf(P8P_CHART_DATASET_SHAPE), onClick: PropTypes.func, style: PropTypes.object diff --git a/app/components/p8p_cyclogram.js b/app/components/p8p_cyclogram.js new file mode 100644 index 0000000..bd0e3b1 --- /dev/null +++ b/app/components/p8p_cyclogram.js @@ -0,0 +1,819 @@ +/* + Парус 8 - Панели мониторинга + Компонент: Циклограмма +*/ + +//--------------------- +//Подключение библиотек +//--------------------- + +import React, { useEffect, useState, useRef } from "react"; //Классы React +import PropTypes from "prop-types"; //Контроль свойств компонента +import { + Box, + Typography, + Dialog, + DialogActions, + DialogContent, + Button, + List, + ListItem, + ListItemText, + Link, + Divider, + IconButton, + Icon +} from "@mui/material"; //Интерфейсные компоненты +import { P8PAppInlineError } from "./p8p_app_message"; //Встраиваемое сообщение об ошибке +import { hasValue } from "../core/utils"; //Вспомогательный функции + +//--------- +//Константы +//--------- + +//Уровни масштаба +const P8P_CYCLOGRAM_ZOOM = [0.2, 0.4, 0.7, 1, 1.5, 2, 2.5]; + +//Параметры элементов циклограммы +const NDEFAULT_LINE_HEIGHT = 20; +const NDEFAULT_HEADER_HEIGHT = 35; + +//Высота заголовка +const TITLE_HEIGHT = "44px"; + +//Высота панели масштабирования +const ZOOM_HEIGHT = "56px"; + +//Стили +const STYLES = { + CYCLOGRAM_TITLE: { height: TITLE_HEIGHT }, + CYCLOGRAM_ZOOM: { height: ZOOM_HEIGHT }, + HEADER_COLUMN: { + fontSize: "12px", + textOverflow: "ellipsis", + overflow: "hidden", + whiteSpace: "pre", + textAlign: "center", + lineHeight: "3", + padding: "0px 5px" + }, + CYCLOGRAM_BOX: (noData, title, zoomBar) => ({ + position: "relative", + overflow: "auto", + padding: "0px 8px", + height: `calc(100% - ${zoomBar ? ZOOM_HEIGHT : "0px"} - ${title ? TITLE_HEIGHT : "0px"})`, + display: noData ? "none" : "" + }), + GRID_ROW: index => (index % 2 === 0 ? { backgroundColor: "#ffffff" } : { backgroundColor: "#f5f5f5" }), + GROUP_HEADER_BOX: { + border: "1px solid", + backgroundColor: "#ebebeb", + display: "flex", + alignItems: "center", + justifyContent: "center" + }, + GROUP_HEADER: { + fontSize: "14px", + textAlign: "center", + wordWrap: "break-word" + }, + TASK_EDITOR_CONTENT: { minWidth: 400, overflowX: "auto" }, + TASK_EDITOR_LIST: { width: "100%", minWidth: 300, maxWidth: 700, bgcolor: "background.paper" }, + TASK_BOX: (lineHeight, bgColor, textColor, highlightColor) => ({ + display: "flex", + alignItems: "center", + backgroundColor: bgColor ? bgColor : "#b4b9bf", + ...(textColor ? { color: textColor } : {}), + height: lineHeight, + "&:hover": { + ...(highlightColor + ? { backgroundColor: `${highlightColor} !important`, filter: "brightness(1) !important" } + : { filter: "brightness(1.25) !important" }), + cursor: "pointer !important" + } + }), + TASK: lineHeight => { + const availableLines = Math.floor(lineHeight / 18); + return { + width: "100%", + fontSize: "12px", + overflowWrap: "break-word", + wordBreak: "break-all", + overflow: "hidden", + textOverflow: "ellipsis", + display: "-webkit-box", + lineHeight: "18px", + maxHeight: lineHeight, + WebkitLineClamp: availableLines < 1 ? 1 : availableLines, + WebkitBoxOrient: "vertical" + }; + } +}; + +//Структура колонки +const P8P_CYCLOGRAM_COLUMN_SHAPE = PropTypes.shape({ + name: PropTypes.string.isRequired, + start: PropTypes.number.isRequired, + end: PropTypes.number.isRequired +}); + +//Структура группы +const P8P_CYCLOGRAM_GROUP_SHAPE = PropTypes.shape({ + name: PropTypes.string.isRequired, + height: PropTypes.number.isRequired, + width: PropTypes.number.isRequired, + visible: PropTypes.bool.isRequired +}); + +//Структура задачи +const P8P_CYCLOGRAM_TASK_SHAPE = PropTypes.shape({ + id: PropTypes.string.isRequired, + rn: PropTypes.number.isRequired, + name: PropTypes.string.isRequired, + fullName: PropTypes.string.isRequired, + lineNumb: PropTypes.number.isRequired, + start: PropTypes.number.isRequired, + end: PropTypes.number.isRequired, + group: PropTypes.string, + bgColor: PropTypes.string, + textColor: PropTypes.string, + highlightColor: PropTypes.string +}); + +//Структура динамического атрибута задачи +const P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE = PropTypes.shape({ + name: PropTypes.string.isRequired, + caption: PropTypes.string.isRequired, + visible: PropTypes.bool.isRequired +}); + +//-------------------------------- +//Вспомогательные классы и функции +//-------------------------------- + +//Определение сдвига для максимальной ширины колонок +const getShift = (columns, currentColumnsMaxWidth, maxCyclogramWidth) => { + //Определяем доступное пространство для расширения + let maxWidthDiff = maxCyclogramWidth - currentColumnsMaxWidth; + //Инициализируем значение сдвига + let shift = 1; + //Если доступно больше ширины и есть пространство для расширения + if (maxCyclogramWidth > currentColumnsMaxWidth && maxCyclogramWidth - maxWidthDiff > columns.length) { + //Определяем доступный сдвиг колонок + shift = maxCyclogramWidth / currentColumnsMaxWidth; + } + //Возвращаем сдвиг + return shift; +}; + +//Формирование стилей для группы +const getGroupStyles = (indexGrp, highlightColor) => { + return `.main .TaskGrp${indexGrp}:hover .TaskGrp${indexGrp} { + ${highlightColor ? `background: ${highlightColor};` : `filter: brightness(1.15);`} + } + .main:has(.TaskGrp${indexGrp}:hover) .TaskGrpHeader${indexGrp} { + display: block; + } + `; + //cursor: pointer; +}; + +//Фон строк таблицы +const P8PCyclogramRowsGrid = ({ rows, maxWidth, lineHeight }) => { + return ( + + {rows.map((el, index) => ( + + + + ))} + + ); +}; + +//Контроль свойств - Фон строк таблицы +P8PCyclogramRowsGrid.propTypes = { + rows: PropTypes.array.isRequired, + maxWidth: PropTypes.number.isRequired, + lineHeight: PropTypes.number.isRequired +}; + +//Линии строк таблицы +const P8PCyclogramRowsLines = ({ rows, maxWidth, lineHeight }) => { + return ( + + {rows.map((el, index) => ( + + ))} + + ); +}; + +//Контроль свойств - Линии строк таблицы +P8PCyclogramRowsLines.propTypes = { + rows: PropTypes.array.isRequired, + maxWidth: PropTypes.number.isRequired, + lineHeight: PropTypes.number.isRequired +}; + +//Линии колонок таблицы +const P8PCyclogramColumnsLines = ({ columns, shift, y1, y2 }) => { + //Инициализируем старт текущей колонки + let prevColumnEnd = 0; + return ( + + {columns.map((column, index) => { + //Аккумулируем окончание последней колонки с учетом сдвига + prevColumnEnd = index !== 0 ? prevColumnEnd + (columns[index - 1].end - columns[index - 1].start) * shift : 0; + return ; + })} + + + ); +}; + +//Контроль свойств - Линии колонок таблицы +P8PCyclogramColumnsLines.propTypes = { + columns: PropTypes.array.isRequired, + shift: PropTypes.number.isRequired, + y1: PropTypes.number.isRequired, + y2: PropTypes.number.isRequired +}; + +//Фон таблицы циклограммы +const P8PCyclogramGrid = ({ tasks, columns, shift, maxWidth, maxHeight, lineHeight }) => { + //Формируем массив строк исходя из максимального значения строки задачи + const rows = Array.from(Array(Math.max(...tasks.map(o => o.lineNumb)) + 1).keys()); + return ( + + + + + + + ); +}; + +//Контроль свойств - Фон таблицы циклограммы +P8PCyclogramGrid.propTypes = { + tasks: PropTypes.array.isRequired, + columns: PropTypes.array.isRequired, + shift: PropTypes.number.isRequired, + maxWidth: PropTypes.number.isRequired, + maxHeight: PropTypes.number.isRequired, + lineHeight: PropTypes.number.isRequired +}; + +//Колонка заголовка циклограммы +const P8PCyclogramHeaderColumn = ({ column, start, shift, columnRenderer }) => { + //Рассчитываем ширину колонки + const columnWidth = column.end - column.start; + //Формируем собственное отображение, если требуется + const customView = columnRenderer ? columnRenderer({ column }) : null; + return ( + <> + + {customView ? ( + customView + ) : ( + + {column.name} + + )} + + + ); +}; + +//Контроль свойств - Колонка заголовка циклограммы +P8PCyclogramHeaderColumn.propTypes = { + column: PropTypes.object.isRequired, + start: PropTypes.number.isRequired, + shift: PropTypes.number.isRequired, + maxHeight: PropTypes.number.isRequired, + lastElement: PropTypes.bool, + columnRenderer: PropTypes.func +}; + +//Заголовок циклограммы +const P8PCyclogramHeader = ({ columns, shift, maxWidth, maxHeight, columnRenderer, headerBlock }) => { + //Инициализируем старт текущей колонки + let prevColumnEnd = 0; + return ( + + + {columns.map((column, index) => { + //Аккумулируем окончание последней колонки с учетом сдвига + prevColumnEnd = index !== 0 ? prevColumnEnd + (columns[index - 1].end - columns[index - 1].start) * shift : 0; + return ( + + ); + })} + + + + + ); +}; + +//Контроль свойств - Заголовок циклограммы +P8PCyclogramHeader.propTypes = { + columns: PropTypes.array.isRequired, + shift: PropTypes.number.isRequired, + maxWidth: PropTypes.number.isRequired, + maxHeight: PropTypes.number.isRequired, + columnRenderer: PropTypes.func, + headerBlock: PropTypes.object +}; + +//Задача циклограммы +const P8PCyclogramTask = ({ task, indexGrp, shift, lineHeight, openTaskEditor, taskRenderer }) => { + //Рассчитываем ширину задачи + const width = task.end !== 0 ? (task.end - task.start) * shift : 0; + //Формируем собственное отображение, если требуется + const customView = taskRenderer ? taskRenderer({ task, taskHeight: lineHeight, taskWidth: width }) || {} : {}; + return ( + + openTaskEditor(task)} + > + {customView.data ? ( + customView.data + ) : ( + + {task.name} + + )} + + + ); +}; + +//Контроль свойств - Группы циклограммы +P8PCyclogramTask.propTypes = { + task: PropTypes.object.isRequired, + indexGrp: PropTypes.number, + shift: PropTypes.number.isRequired, + lineHeight: PropTypes.number.isRequired, + openTaskEditor: PropTypes.func.isRequired, + taskRenderer: PropTypes.func +}; + +//Основная информация циклограммы +const P8PCyclogramMain = ({ + columns, + groups, + tasks, + shift, + lineHeight, + maxWidth, + maxHeight, + openTaskEditor, + groupHeaderRenderer, + taskRenderer, + columnRenderer, + headerBlock +}) => { + //Инициализируем коллекцию тасков с группами + const tasksWithGroup = tasks.filter(task => hasValue(task.groupName)); + //Инициализируем коллекцию тасков без групп + const tasksWithoutGroup = tasks.filter(task => !hasValue(task.groupName)); + //Инициализируем коллекцию отображаемых групп + const visibleGroups = groups ? groups.filter(group => group.visible) : []; + return ( + + + {visibleGroups.length !== 0 + ? visibleGroups.map((grp, indexGrp) => { + //Считываем задачи группы + let groupTasks = tasksWithGroup.filter(task => task.groupName === grp.name); + //Если по данной группе нет тасков - ничего не выводим + if (groupTasks.length === 0) { + return null; + } + return ( + + {groupTasks.map((task, index) => ( + + ))} + + + ); + }) + : null} + + {tasksWithoutGroup.map((task, index) => { + return ( + + ); + })} + + + + {visibleGroups.length !== 0 ? ( + + {visibleGroups.map((grp, indexGrp) => { + //Инициализируем параметры группы + let defaultView = null; + let customView = null; + let groupHeaderX = 0; + let groupHeaderY = 0; + let groupTasks = tasksWithGroup.filter(task => task.groupName === grp.name); + //Если по данной группе нет тасков - ничего не выводим + if (groupTasks.length === 0) { + return null; + } + //Если требуется отображать заголовок группы + if (grp.visible) { + //Формируем отображение по умолчанию + defaultView = ( + + {grp.name} + + ); + //Формируем собственное отображение, если требуется + customView = groupHeaderRenderer ? groupHeaderRenderer({ group: grp }) : null; + //Рассчитываем координаты заголовка группы + groupHeaderX = Math.min(...groupTasks.map(o => o.start)) * shift; + groupHeaderY = NDEFAULT_HEADER_HEIGHT + Math.min(...groupTasks.map(o => o.lineNumb)) * lineHeight - grp.height - 5; + } + return ( + + {customView ? customView : defaultView} + + ); + })} + + ) : null} + + ); +}; + +//Контроль свойств - Основная информация циклограммы +P8PCyclogramMain.propTypes = { + columns: PropTypes.array.isRequired, + groups: PropTypes.array, + tasks: PropTypes.array.isRequired, + shift: PropTypes.number.isRequired, + lineHeight: PropTypes.number.isRequired, + maxWidth: PropTypes.number.isRequired, + maxHeight: PropTypes.number.isRequired, + openTaskEditor: PropTypes.func.isRequired, + groupHeaderRenderer: PropTypes.func, + taskRenderer: PropTypes.func, + columnRenderer: PropTypes.func, + headerBlock: PropTypes.object +}; + +//Редактор задачи +const P8PCyclogramTaskEditor = ({ + task, + taskAttributes, + onOk, + onCancel, + taskAttributeRenderer, + taskDialogRenderer, + nameCaption, + okBtnCaption, + cancelBtnCaption +}) => { + //Собственное состояние + const [state] = useState({ + start: task.start, + end: task.end + }); + + //Отображаемые атрибуты + const dispTaskAttributes = + Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => attr.visible && hasValue(task[attr.name])) : []; + + //При сохранении + const handleOk = () => (onOk && state.start && state.end ? onOk() : null); + + //При отмене + const handleCancel = () => (onCancel ? onCancel() : null); + + //Генерация содержимого + return ( + + {taskDialogRenderer ? ( + taskDialogRenderer({ task, taskAttributes, close: handleCancel }) + ) : ( + <> + + + + + + {dispTaskAttributes.length > 0 ? : null} + {dispTaskAttributes.length > 0 + ? dispTaskAttributes.map((attr, i) => { + const defaultView = task[attr.name]; + const customView = taskAttributeRenderer ? taskAttributeRenderer({ task, attribute: attr }) : null; + return ( + + + + + {i < dispTaskAttributes.length - 1 ? : null} + + ); + }) + : null} + + + + + + + + )} + + ); +}; + +//Контроль свойств - Редактор задачи +P8PCyclogramTaskEditor.propTypes = { + task: P8P_CYCLOGRAM_TASK_SHAPE, + taskAttributes: PropTypes.arrayOf(P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE), + onOk: PropTypes.func, + onCancel: PropTypes.func, + taskAttributeRenderer: PropTypes.func, + taskDialogRenderer: PropTypes.func, + nameCaption: PropTypes.string.isRequired, + okBtnCaption: PropTypes.string.isRequired, + cancelBtnCaption: PropTypes.string.isRequired +}; + +//Циклограмма +const P8PCyclogram = ({ + containerStyle, + lineHeight, + title, + titleStyle, + onTitleClick, + zoomBar, + zoom, + columns, + columnRenderer, + groups, + groupHeaderRenderer, + tasks, + taskRenderer, + taskAttributes, + taskAttributeRenderer, + taskDialogRenderer, + noDataFoundText, + nameTaskEditorCaption, + okTaskEditorBtnCaption, + cancelTaskEditorBtnCaption +}) => { + //Хук основного блока (для последующего определения доступной ширины) + const mainBlock = useRef(null); + //Хук для заголовка таблицы + const headerBlock = useRef(null); + //Собственное состояние + const [state, setState] = useState({ + noData: true, + loaded: false, + lineHeight: NDEFAULT_LINE_HEIGHT, + maxWidth: 0, + maxHeight: 0, + shift: 0, + zoom: P8P_CYCLOGRAM_ZOOM.includes(zoom) ? zoom : 1, + tasks: [], + editTask: null + }); + + //Обновление масштаба циклограммы + const handleZoomChange = direction => { + //Считываем текущий индекс + const currentIndex = P8P_CYCLOGRAM_ZOOM.indexOf(state.zoom); + setState(pv => ({ + ...pv, + zoom: + currentIndex + direction !== P8P_CYCLOGRAM_ZOOM.length && currentIndex + direction !== -1 + ? P8P_CYCLOGRAM_ZOOM[currentIndex + direction] + : pv.zoom + })); + }; + + //Открытие редактора задачи + const openTaskEditor = task => setState(pv => ({ ...pv, editTask: { ...task } })); + + //При сохранении задачи в редакторе + const handleTaskEditorSave = () => { + setState(pv => ({ ...pv, editTask: null })); + }; + + //При закрытии редактора задачи без сохранения + const handleTaskEditorCancel = () => setState(pv => ({ ...pv, editTask: null })); + + //При скролле блока + const handleScroll = e => { + //Изменяем позицию заголовка таблицы относительно скролла + headerBlock.current.setAttribute("transform", "translate(0," + e.currentTarget.scrollTop + ")"); + }; + + //При изменении данных + useEffect(() => { + //Если есть колонки и задачи + if (Array.isArray(columns) && columns.length > 0 && Array.isArray(tasks) && tasks.length > 0) { + //Определяем текущую максимальную ширину колонок + let currentColumnsMaxWidth = Math.max(...columns.map(o => o.end)); + //Определяем доступный сдвиг для ширины колонок (16 - паддинг по бокам) + let columnShift = getShift(columns, currentColumnsMaxWidth, mainBlock.current.offsetWidth - 16) * state.zoom; + //Устанавливаем значения исходя из колонок/задач + setState(pv => ({ + ...pv, + loaded: true, + lineHeight: lineHeight ? lineHeight : NDEFAULT_LINE_HEIGHT, + maxWidth: columnShift !== 0 ? currentColumnsMaxWidth * columnShift : currentColumnsMaxWidth, + maxHeight: NDEFAULT_HEADER_HEIGHT + (Math.max(...tasks.map(o => o.lineNumb)) + 1) * (lineHeight ? lineHeight : NDEFAULT_LINE_HEIGHT), + shift: columnShift, + tasks: tasks, + noData: false + })); + } else { + //Устанавливаем значения исходя из колонок/задач + setState(pv => ({ + ...pv, + noData: true + })); + } + }, [columns, lineHeight, state.zoom, tasks]); + + //Генерация содержимого + return ( + <> +
+ {state.noData ? : null} + {state.loaded ? ( + <> + {title ? ( + + {onTitleClick ? ( + onTitleClick()}> + {title} + + ) : ( + title + )} + + ) : null} + {zoomBar ? ( + + handleZoomChange(1)} + disabled={state.zoom == P8P_CYCLOGRAM_ZOOM[P8P_CYCLOGRAM_ZOOM.length - 1]} + > + zoom_in + + handleZoomChange(-1)} disabled={state.zoom == P8P_CYCLOGRAM_ZOOM[0]}> + zoom_out + + + ) : null} + + + + + + + + ) : null} + {state.editTask ? ( + + ) : null} +
+ + ); +}; + +//Контроль свойств - Циклограмма +P8PCyclogram.propTypes = { + containerStyle: PropTypes.object, + lineHeight: PropTypes.number, + title: PropTypes.string, + titleStyle: PropTypes.object, + onTitleClick: PropTypes.func, + zoomBar: PropTypes.bool, + zoom: PropTypes.number, + columns: PropTypes.arrayOf(P8P_CYCLOGRAM_COLUMN_SHAPE).isRequired, + columnRenderer: PropTypes.func, + groups: PropTypes.arrayOf(P8P_CYCLOGRAM_GROUP_SHAPE), + groupHeaderRenderer: PropTypes.func, + tasks: PropTypes.arrayOf(P8P_CYCLOGRAM_TASK_SHAPE).isRequired, + taskRenderer: PropTypes.func, + taskAttributes: PropTypes.arrayOf(P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE), + taskAttributeRenderer: PropTypes.func, + taskDialogRenderer: PropTypes.func, + noDataFoundText: PropTypes.string.isRequired, + nameTaskEditorCaption: PropTypes.string.isRequired, + okTaskEditorBtnCaption: PropTypes.string.isRequired, + cancelTaskEditorBtnCaption: PropTypes.string.isRequired +}; + +//---------------- +//Интерфейс модуля +//---------------- + +export { P8PCyclogram }; diff --git a/app/components/p8p_data_grid.js b/app/components/p8p_data_grid.js index 441aac0..3107f2e 100644 --- a/app/components/p8p_data_grid.js +++ b/app/components/p8p_data_grid.js @@ -36,15 +36,15 @@ const P8P_DATA_GRID_FILTERS_HEIGHT = P8P_TABLE_FILTERS_HEIGHT; //Таблица данных const P8PDataGrid = ({ - columnsDef, + columnsDef = [], filtersInitial, - groups, - rows, + groups = [], + rows = [], size, fixedHeader = false, fixedColumns = 0, morePages = false, - reloading, + reloading = false, expandable, orderAscMenuItemCaption, orderDescMenuItemCaption, @@ -154,15 +154,15 @@ const P8PDataGrid = ({ //Контроль свойств - Таблица данных P8PDataGrid.propTypes = { - columnsDef: PropTypes.array.isRequired, + columnsDef: PropTypes.array, filtersInitial: PropTypes.arrayOf(P8P_DATA_GRID_FILTER_SHAPE), groups: PropTypes.array, - rows: PropTypes.array.isRequired, + rows: PropTypes.array, size: PropTypes.string, fixedHeader: PropTypes.bool, fixedColumns: PropTypes.number, morePages: PropTypes.bool, - reloading: PropTypes.bool.isRequired, + reloading: PropTypes.bool, expandable: PropTypes.bool, orderAscMenuItemCaption: PropTypes.string.isRequired, orderDescMenuItemCaption: PropTypes.string.isRequired, diff --git a/app/components/p8p_fullscreen_dialog.js b/app/components/p8p_fullscreen_dialog.js index c51a4ff..b37fd3a 100644 --- a/app/components/p8p_fullscreen_dialog.js +++ b/app/components/p8p_fullscreen_dialog.js @@ -27,7 +27,7 @@ const STYLES = { //----------- //Полноэкранный диалог -const P8PFullScreenDialog = ({ title, onClose, children }) => { +const P8PFullScreenDialog = ({ title, onClose, contentProps, children }) => { const handleClose = () => { onClose ? onClose() : null; }; @@ -46,7 +46,7 @@ const P8PFullScreenDialog = ({ title, onClose, children }) => { - {children} + {children} ); }; @@ -55,7 +55,8 @@ const P8PFullScreenDialog = ({ title, onClose, children }) => { P8PFullScreenDialog.propTypes = { title: PropTypes.string.isRequired, onClose: PropTypes.func, - children: PropTypes.element + children: PropTypes.element, + contentProps: PropTypes.object }; //---------------- diff --git a/app/components/p8p_gantt.js b/app/components/p8p_gantt.js index 0cb42f8..5e3f20b 100644 --- a/app/components/p8p_gantt.js +++ b/app/components/p8p_gantt.js @@ -33,7 +33,7 @@ import { P8PAppInlineError } from "./p8p_app_message"; //Встраиваемо //--------- //Уровни масштаба -const P8P_GANTT_ZOOM = [0, 1, 2, 3, 4]; +const P8P_GANTT_ZOOM = [0, 1, 2, 3, 4, 5]; //Уровни масштаба (строковые наименования в терминах библиотеки) const P8P_GANTT_ZOOM_VIEW_MODES = { @@ -41,7 +41,8 @@ const P8P_GANTT_ZOOM_VIEW_MODES = { 1: "Half Day", 2: "Day", 3: "Week", - 4: "Month" + 4: "Month", + 5: "Year" }; //Структура задачи diff --git a/app/components/p8p_panels_menu.js b/app/components/p8p_panels_menu.js index 48212d5..15b8c97 100644 --- a/app/components/p8p_panels_menu.js +++ b/app/components/p8p_panels_menu.js @@ -62,8 +62,15 @@ const STYLES = { GRID_PANEL_CARD_CONTENT_TITLE_ICON: { paddingTop: "4px" }, GRID_PANEL_CARD_ACTIONS: { marginTop: "auto", display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, DESKTOP_GROUP_HEADER: { fontWeight: "bold", fontFamily: "tahoma, arial, verdana, sans-serif!important", fontSize: "13px!important" }, - DESKTOP_ITEM_BUTTON: { fontSize: "12px", textTransform: "none", "&:hover": { backgroundColor: "#c3e1ff" }, maxWidth: "150px" }, - DESKTOP_ITEM_STACK: { justifyContent: "center", alignItems: "center", fontSize: "12px" }, + DESKTOP_ITEM_BUTTON: { + fontSize: "12px", + textTransform: "none", + "&:hover": { backgroundColor: "#c3e1ff" }, + width: "150px", + height: "90px", + flexDirection: "column", + justifyContent: "flex-start" + }, DESKTOP_ITEM_ICON: { width: "48px", height: "48px", fontSize: "48px" }, DESKTOP_ITEM_CATION: { display: "-webkit-box", @@ -128,7 +135,14 @@ const getPanelsLinks = ({ variant, panels, selectedPanel, group, defaultGroupTyt {panel.preview ? ( - ) : null} + ) : ( + + )} {panel.icon ? {panel.icon} : null} @@ -165,12 +179,10 @@ const getPanelsLinks = ({ variant, panels, selectedPanel, group, defaultGroupTyt sx={STYLES.DESKTOP_ITEM_BUTTON} title={panel.caption} > - - {panel.icon} - - {panel.caption} - - + {panel.icon} + + {panel.caption} + ) ); @@ -230,7 +242,12 @@ const P8PPanelsMenuDesktop = ({ group, onItemNavigate, panels = [], defaultGroup const panelsLinks = getPanelsLinks({ variant: P8P_PANELS_MENU_VARIANT.DESKTOP, panels, group, defaultGroupTytle, onItemNavigate }); //Генерация содержимого - return {panelsLinks}; + return ( + + {panelsLinks[0]} + {panelsLinks.map((l, i) => (i > 0 ? l : null))} + + ); }; //Контроль свойств - Меню панелей - рабочий стол diff --git a/app/components/p8p_table.js b/app/components/p8p_table.js index f5d3c31..e3fa147 100644 --- a/app/components/p8p_table.js +++ b/app/components/p8p_table.js @@ -118,7 +118,9 @@ const STYLES = { }, TABLE_CELL_EXPAND_CONTAINER: { paddingBottom: 0, - paddingTop: 0 + paddingTop: 0, + paddingLeft: 0, + paddingRight: 0 }, TABLE_CELL_GROUP_HEADER: { backgroundColor: "lightgray" @@ -486,16 +488,16 @@ P8PTableFiltersChips.propTypes = { //Таблица const P8PTable = ({ - columnsDef, - groups, - rows, + columnsDef = [], + groups = [], + rows = [], orders, filters, size, fixedHeader = false, fixedColumns = 0, morePages = false, - reloading, + reloading = false, expandable, orderAscMenuItemCaption, orderDescMenuItemCaption, @@ -531,7 +533,9 @@ const P8PTable = ({ const [expanded, setExpanded] = useState({}); //Собственное состояния - развёрнутые группы - const [expandedGroups, setExpandedGroups] = useState({}); + const [expandedGroups, setExpandedGroups] = useState( + Array.isArray(groups) && groups.length > 0 ? Object.assign({}, ...groups.map(g => ({ [g.name]: g.expanded }))) : {} + ); //Собственное состояние - колонка с отображаемой подсказкой const [displayHintColumn, setDisplayHintColumn] = useState(null); @@ -931,7 +935,7 @@ P8PTable.propTypes = { fixedHeader: PropTypes.bool, fixedColumns: PropTypes.number, morePages: PropTypes.bool, - reloading: PropTypes.bool.isRequired, + reloading: PropTypes.bool, expandable: PropTypes.bool, orderAscMenuItemCaption: PropTypes.string.isRequired, orderDescMenuItemCaption: PropTypes.string.isRequired, diff --git a/app/config_wrapper.js b/app/config_wrapper.js index 4372f0f..86de65d 100644 --- a/app/config_wrapper.js +++ b/app/config_wrapper.js @@ -15,6 +15,7 @@ import { P8PAppWorkspace } from "./components/p8p_app_workspace"; //Рабоче import { P8PTable, P8P_TABLE_DATA_TYPE, P8P_TABLE_SIZE, P8P_TABLE_FILTER_SHAPE } from "./components/p8p_table"; //Таблица данных import { P8PDataGrid, P8P_DATA_GRID_DATA_TYPE, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "./components/p8p_data_grid"; //Таблица данных import { P8PGantt, P8P_GANTT_TASK_SHAPE, P8P_GANTT_TASK_ATTRIBUTE_SHAPE, P8P_GANTT_TASK_COLOR_SHAPE } from "./components/p8p_gantt"; //Диаграмма Ганта +import { P8PCyclogram } from "./components/p8p_cyclogram"; //Циклограмма //--------- //Константы @@ -76,6 +77,14 @@ const P8P_GANTT_CONFIG_PROPS = { cancelTaskEditorBtnCaption: BUTTONS.CANCEL }; +//Конфигурируемые свойства "Циклограммы" (P8PCyclogram) +const P8P_CYCLOGRAM_CONFIG_PROPS = { + noDataFoundText: TEXTS.NO_DATA_FOUND, + nameTaskEditorCaption: CAPTIONS.NAME, + okTaskEditorBtnCaption: BUTTONS.OK, + cancelTaskEditorBtnCaption: BUTTONS.CANCEL +}; + //----------------------- //Вспомогательные функции //----------------------- @@ -90,6 +99,7 @@ const addConfigChildProps = children => if (child.type.name === "P8PTable") configProps = P8P_TABLE_CONFIG_PROPS; if (child.type.name === "P8PDataGrid") configProps = P8P_DATA_GRID_CONFIG_PROPS; if (child.type.name === "P8PGantt") configProps = P8P_GANTT_CONFIG_PROPS; + if (child.type.name === "P8PCyclogram") configProps = P8P_CYCLOGRAM_CONFIG_PROPS; return React.createElement(child.type, { ...configProps, ...restProps }, addConfigChildProps(children)); }); @@ -112,6 +122,9 @@ const P8PDataGridConfigWrapped = (props = {}) => ; +//Обёртка для компонента "Циклограмма" (P8PCyclogram) +const P8PCyclogramConfigWrapped = (props = {}) => ; + //Универсальный элемент-обёртка в параметры конфигурации const ConfigWrapper = ({ children }) => addConfigChildProps(children); @@ -132,6 +145,7 @@ export { P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE, P8P_GANTT_CONFIG_PROPS, + P8P_CYCLOGRAM_CONFIG_PROPS, P8P_GANTT_TASK_SHAPE, P8P_GANTT_TASK_ATTRIBUTE_SHAPE, P8P_GANTT_TASK_COLOR_SHAPE, @@ -140,5 +154,6 @@ export { P8PTableConfigWrapped, P8PDataGridConfigWrapped, P8PGanttConfigWrapped, + P8PCyclogramConfigWrapped, ConfigWrapper }; diff --git a/app/context/application.js b/app/context/application.js index d613fcc..6ff8919 100644 --- a/app/context/application.js +++ b/app/context/application.js @@ -22,7 +22,8 @@ const P8O_API = window.top?.parus?.clientApi; //Структура объекта с описанием ошибок const APPLICATION_CONTEXT_ERRORS_SHAPE = PropTypes.shape({ - P8O_API_UNAVAILABLE: PropTypes.string.isRequired + P8O_API_UNAVAILABLE: PropTypes.string.isRequired, + P8O_API_UNSUPPORTED: PropTypes.string.isRequired }); //---------------- @@ -72,21 +73,38 @@ export const ApplicationContext = ({ errors, displaySizeGetter, guidGenerator, c //Отображение раздела "ПАРУС 8 Онлайн" const pOnlineShowUnit = useCallback( - ({ unitCode, showMethod = "main", inputParameters }) => { - if (P8O_API) P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters }); + ({ unitCode, showMethod = "main", inputParameters, modal = true }) => { + if (P8O_API) + modal + ? P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters }) + : P8O_API.fn.openDocument + ? P8O_API.fn.openDocument({ unitcode: unitCode, method: showMethod, inputParameters }) + : showMsgErr(errors.P8O_API_UNSUPPORTED); else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr, errors.P8O_API_UNAVAILABLE] + [showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED] ); //Отображение документа "ПАРУС 8 Онлайн" const pOnlineShowDocument = useCallback( - ({ unitCode, document, showMethod = "main", inRnParameter = "in_RN" }) => { + ({ unitCode, document, showMethod = "main", inRnParameter = "in_RN", modal = true }) => { if (P8O_API) - P8O_API.fn.openDocumentModal({ unitcode: unitCode, method: showMethod, inputParameters: [{ name: inRnParameter, value: document }] }); + modal + ? P8O_API.fn.openDocumentModal({ + unitcode: unitCode, + method: showMethod, + inputParameters: [{ name: inRnParameter, value: document }] + }) + : P8O_API.fn.openDocument + ? P8O_API.fn.openDocument({ + unitcode: unitCode, + method: showMethod, + inputParameters: [{ name: inRnParameter, value: document }] + }) + : showMsgErr(errors.P8O_API_UNSUPPORTED); else showMsgErr(errors.P8O_API_UNAVAILABLE); }, - [showMsgErr, errors.P8O_API_UNAVAILABLE] + [showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED] ); //Отображение словаря "ПАРУС 8 Онлайн" diff --git a/app/core/utils.js b/app/core/utils.js index 1ca71b9..65e24b3 100644 --- a/app/core/utils.js +++ b/app/core/utils.js @@ -33,34 +33,42 @@ const DISPLAY_SIZE = { //Типовые пути конвертации в массив (при переводе XML -> JSON) const XML_ALWAYS_ARRAY_PATHS = [ "XRESPOND.XPAYLOAD.XOUT_ARGUMENTS", - "XRESPOND.XPAYLOAD.XROWS", - "XRESPOND.XPAYLOAD.XCOLUMNS_DEF", - "XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values", - "XRESPOND.XPAYLOAD.XGROUPS", - "XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes", - "XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors", - "XRESPOND.XPAYLOAD.XGANTT_TASKS", - "XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies", + "XRESPOND.XPAYLOAD.XDATA_GRID.rows", + "XRESPOND.XPAYLOAD.XDATA_GRID.columnsDef", + "XRESPOND.XPAYLOAD.XDATA_GRID.columnsDef.values", + "XRESPOND.XPAYLOAD.XDATA_GRID.groups", + "XRESPOND.XPAYLOAD.XGANTT.taskAttributes", + "XRESPOND.XPAYLOAD.XGANTT.taskColors", + "XRESPOND.XPAYLOAD.XGANTT.tasks", + "XRESPOND.XPAYLOAD.XGANTT.tasks.dependencies", "XRESPOND.XPAYLOAD.XCHART.labels", "XRESPOND.XPAYLOAD.XCHART.datasets", "XRESPOND.XPAYLOAD.XCHART.datasets.data", - "XRESPOND.XPAYLOAD.XCHART.datasets.items" + "XRESPOND.XPAYLOAD.XCHART.datasets.items", + "XRESPOND.XPAYLOAD.XCYCLOGRAM.taskAttributes", + "XRESPOND.XPAYLOAD.XCYCLOGRAM.columns", + "XRESPOND.XPAYLOAD.XCYCLOGRAM.groups", + "XRESPOND.XPAYLOAD.XCYCLOGRAM.tasks" ]; //Типовые шаблоны конвертации в массив (при переводе XML -> JSON) const XML_ALWAYS_ARRAY_PATH_PATTERNS = [ - /(.*)XROWS$/, - /(.*)XCOLUMNS_DEF$/, - /(.*)XCOLUMNS_DEF.values$/, - /(.*)XGROUPS$/, - /(.*)XGANTT_DEF.taskAttributes$/, - /(.*)XGANTT_DEF.taskColors$/, - /(.*)XGANTT_TASKS$/, - /(.*)XGANTT_TASKS.dependencies$/, + /(.*)XDATA_GRID.rows$/, + /(.*)XDATA_GRID.columnsDef$/, + /(.*)XDATA_GRID.columnsDef.values$/, + /(.*)XDATA_GRID.groups$/, + /(.*)XGANTT.taskAttributes$/, + /(.*)XGANTT.taskColors$/, + /(.*)XGANTT.tasks$/, + /(.*)XGANTT.tasks.dependencies$/, /(.*)XCHART.labels$/, /(.*)XCHART.datasets$/, /(.*)XCHART.datasets.data$/, - /(.*)XCHART.datasets.items$/ + /(.*)XCHART.datasets.items$/, + /(.*)XCYCLOGRAM.taskAttributes$/, + /(.*)XCYCLOGRAM.columns$/, + /(.*)XCYCLOGRAM.groups$/, + /(.*)XCYCLOGRAM.tasks$/ ]; //Типовой постфикс тега для массива (при переводе XML -> JSON) @@ -68,11 +76,13 @@ const XML_ALWAYS_ARRAY_POSTFIX = "__SYSTEM__ARRAY__"; //Типовые шаблоны конвертации значения атрибута в строку (при переводе XML -> JSON) const XML_ATTR_ALWAYS_STR_PATH_PATTERNS = [ - /(.*)XCOLUMNS_DEF.name$/, - /(.*)XCOLUMNS_DEF.caption$/, - /(.*)XCOLUMNS_DEF.parent$/, - /(.*)XGROUPS.name$/, - /(.*)XGROUPS.caption$/ + /(.*)XDATA_GRID.columnsDef.name$/, + /(.*)XDATA_GRID.columnsDef.caption$/, + /(.*)XDATA_GRID.columnsDef.parent$/, + /(.*)XDATA_GRID.groups.name$/, + /(.*)XDATA_GRID.groups.caption$/, + /(.*)XCYCLOGRAM.columns.name$/, + /(.*)XCYCLOGRAM.groups.name$/ ]; //----------- @@ -97,7 +107,6 @@ const deepCopyObject = obj => JSON.parse(JSON.stringify(obj)); //Конвертация объекта в Base64 XML const object2Base64XML = (obj, builderOptions) => { const builder = new XMLBuilder(builderOptions); - //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) }); return btoa(unescape(encodeURIComponent(builder.build(obj)))); }; @@ -140,6 +149,9 @@ const xml2JSON = ({ xmlDoc, isArray, transformTagName, tagValueProcessor, attrib //Форматирование даты в формат РФ const formatDateRF = value => (value ? dayjs(value).format("DD.MM.YYYY") : null); +//Форматирование даты и времени в формат РФ +const formatDateTimeRF = value => (value ? dayjs(value).format("DD.MM.YYYY HH:mm:ss") : null); + //Форматирование даты в формат JSON (только дата, без времени) const formatDateJSONDateOnly = value => (value ? dayjs(value).format("YYYY-MM-DD") : null); @@ -163,6 +175,7 @@ export { object2Base64XML, xml2JSON, formatDateRF, + formatDateTimeRF, formatDateJSONDateOnly, formatNumberRFCurrency, genGUID diff --git a/app/panels/eqs_prfrm/eqs_prfrm.js b/app/panels/eqs_prfrm/eqs_prfrm.js index 01e4014..3fbb30c 100644 --- a/app/panels/eqs_prfrm/eqs_prfrm.js +++ b/app/panels/eqs_prfrm/eqs_prfrm.js @@ -119,8 +119,8 @@ const EqsPrfrm = () => { let cF = 0; let sF = 0; let properties = []; - if (data.XROWS != null) { - data.XROWS.map(row => { + if (data.XDATA_GRID.rows != null) { + data.XDATA_GRID.rows.map(row => { properties = []; Object.entries(row).forEach(([key, value]) => properties.push({ name: key, data: value })); let info2 = properties.find(element => { @@ -156,11 +156,10 @@ const EqsPrfrm = () => { } setDataGrid(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: [...(data.XROWS || [])], - fixedHeader: data.XDATA_GRID.fixedHeader, - fixedColumns: data.XDATA_GRID.fixedColumns, - groups: [...(data.XGROUPS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: [...(data.XDATA_GRID.rows || [])], + groups: [...(data.XDATA_GRID.groups || [])], dataLoaded: true, reload: false })); @@ -214,7 +213,7 @@ const EqsPrfrm = () => { } }); if (data.NIDENT) { - if (type == 0) pOnlineShowUnit({ unitCode: "EquipTechServices", inputParameters: [{ name: "in_SelectList_Ident", value: data.NIDENT }] }); + if (type == 0) pOnlineShowUnit({ unitCode: "EquipTechServices", inputParameters: [{ name: "in_Ident", value: data.NIDENT }] }); else pOnlineShowUnit({ unitCode: "EquipRepairSheets", inputParameters: [{ name: "in_Ident", value: data.NIDENT }] }); } else showMsgErr(TEXTS.NO_DATA_FOUND); }; diff --git a/app/panels/mech_rec_assembly_mon/components/plan_detail.js b/app/panels/mech_rec_assembly_mon/components/plan_detail.js index 25e9e03..4292263 100644 --- a/app/panels/mech_rec_assembly_mon/components/plan_detail.js +++ b/app/panels/mech_rec_assembly_mon/components/plan_detail.js @@ -15,6 +15,7 @@ import { P8PSVG } from "../../../components/p8p_svg"; //Интерактивны import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения import { useCostProductComposition, useProductDetailsTable } from "../hooks"; //Вспомогательные хуки import { ProgressBox } from "./progress_box"; //Информация по прогрессу объекта +import { APP_STYLES } from "../../../../app.styles"; //Типовые стили //--------- //Константы @@ -26,6 +27,7 @@ const STYLES = { border: "1px solid", borderRadius: "25px", height: "35vh", + minHeight: "250px", backgroundColor: "background.detail_table" }, BOX_INFO_SUB: isMessage => ({ @@ -47,6 +49,7 @@ const STYLES = { border: "1px solid", borderRadius: "25px", height: "17vh", + minHeight: "120px", backgroundColor: "background.detail_info" }, PRODUCT_SELECTOR_CONTAINER: { @@ -57,6 +60,7 @@ const STYLES = { border: "1px solid", borderRadius: "25px", height: "53vh", + minHeight: "379px", marginTop: "16px", backgroundColor: "background.product_selector" }, @@ -72,7 +76,12 @@ const STYLES = { width: "280px", borderBottom: "1px solid" }, - TABLE_DETAILS: { backgroundColor: "background.detail_table", height: "240px" }, + TABLE_DETAILS: { + backgroundColor: "background.detail_table", + height: "28vh", + minHeight: "187px", + ...APP_STYLES.SCROLL + }, TABLE_DETAILS_HEADER_CELL: maxWidth => ({ backgroundColor: "background.detail_table", color: "text.detail_table.fontColor", @@ -107,7 +116,7 @@ const PlanSpecInfo = ({ planSpec }) => { - Номер борта: + Номер заказа: {planSpec.SNUMB} diff --git a/app/panels/mech_rec_assembly_mon/components/plans_list_item.js b/app/panels/mech_rec_assembly_mon/components/plans_list_item.js index 0ac1900..a8c04a9 100644 --- a/app/panels/mech_rec_assembly_mon/components/plans_list_item.js +++ b/app/panels/mech_rec_assembly_mon/components/plans_list_item.js @@ -70,11 +70,11 @@ const PlanSpecsListItem = ({ card, cardIndex, onClick }) => { return ( (onClick ? onClick(card, cardIndex) : null)}> - + - Номер борта + Номер заказа - {card.SNUMB} + {card.SNUMB || "-"} { progressVariant={"h3"} detailVariant={"PlanSpecProgressDetail"} /> - + Год выпуска: - {card.NYEAR} + {card.NYEAR || "-"} diff --git a/app/panels/mech_rec_assembly_mon/hooks.js b/app/panels/mech_rec_assembly_mon/hooks.js index 7b70dff..dbb39b5 100644 --- a/app/panels/mech_rec_assembly_mon/hooks.js +++ b/app/panels/mech_rec_assembly_mon/hooks.js @@ -195,9 +195,10 @@ const useProductDetailsTable = (planSpec, product, orders, pageNumber, stored) = }); setData(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], - morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE, + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], + morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE, init: true })); } finally { diff --git a/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js b/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js index 156dd7c..90fcf63 100644 --- a/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js +++ b/app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js @@ -27,6 +27,7 @@ import { Icon } from "@mui/material"; //Интерфейсные элементы import { ThemeProvider } from "@mui/material/styles"; //Подключение темы +import { APP_STYLES } from "../../../app.styles"; //Типовые стили import { PlanSpecsList } from "./components/plans_list"; //Список планов import { PlanSpecDetail } from "./components/plan_detail"; //Детали плана import { lightTheme, darkTheme } from "./styles/themes"; //Стиль темы @@ -63,7 +64,8 @@ const STYLES = { display: "inline-block", boxSizing: "border-box", backgroundColor: "background.plans_drawer_paper", - color: "text.plans_finder.fontColor" + color: "text.plans_finder.fontColor", + ...APP_STYLES.SCROLL } }, PLANS_LIST_BOX: { paddingTop: "20px" }, @@ -240,26 +242,32 @@ const MechRecAssemblyMon = () => { {state.init == true ? ( state.selectedPlanCtlg.NRN ? ( - <> - - {title} + state.planSpecs.length !== 0 ? ( + <> + + {title} + + {state.planSpecsLoaded == true ? ( + state.selectedPlanSpec.NRN ? ( + + ) : ( + + + + ) + ) : null} + + ) : ( + + В каталоге планов отсутствуют записи подходящих первичных документов - {state.planSpecsLoaded == true ? ( - state.selectedPlanSpec.NRN ? ( - - ) : ( - - - - ) - ) : null} - + ) ) : ( Укажите каталог планов для отображения спецификаций diff --git a/app/panels/mech_rec_cost_jobs_manage/hooks.js b/app/panels/mech_rec_cost_jobs_manage/hooks.js index 01eab21..9b060d3 100644 --- a/app/panels/mech_rec_cost_jobs_manage/hooks.js +++ b/app/panels/mech_rec_cost_jobs_manage/hooks.js @@ -150,12 +150,13 @@ const useCostJobsSpecs = task => { }); setCostJobsSpecs(pv => ({ ...pv, + ...data.XDATA_GRID, task: task, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); }; loadData(); @@ -256,12 +257,13 @@ const useEquipConfiguration = (task, fromAction) => { }); setEquipConfiguration(pv => ({ ...pv, + ...data.XDATA_GRID, task: task, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); }; loadData(); diff --git a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js index 5d97e7d..ae7643b 100644 --- a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js +++ b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js @@ -10,6 +10,7 @@ import React, { useContext, useState } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { Drawer, Fab, Box, List, ListItemButton, ListItemText, Typography, TextField } from "@mui/material"; //Интерфейсные элементы +import { APP_STYLES } from "../../../app.styles"; //Типовые стили import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { CostJobsSpecsDataGrid } from "./fcjobssp"; //Собственные хуки таблиц import { useCostJobs, useFilteredFcjobs } from "./hooks"; //Вспомогательные хуки @@ -35,7 +36,7 @@ const STYLES = { width: "350px", display: "inline-block", flexShrink: 0, - [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" } + [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL } }, CONTAINER: { textAlign: "center" } }; diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js b/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js index 04e626f..b913052 100644 --- a/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js +++ b/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js @@ -53,14 +53,15 @@ const useCostRouteLists = (task, taskType) => { }); setCostRouteLists(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE, - quantPlanSum: data.XROWS ? data.XROWS.reduce((a, b) => a + b["NQUANT_PLAN"], 0) : 0, - uniqueNomns: data.XROWS - ? data.XROWS.reduce((accumulator, current) => { + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE, + quantPlanSum: data.XDATA_GRID.rows ? data.XDATA_GRID.rows.reduce((a, b) => a + b["NQUANT_PLAN"], 0) : 0, + uniqueNomns: data.XDATA_GRID.rows + ? data.XDATA_GRID.rows.reduce((accumulator, current) => { if (!accumulator.find(item => item.SMATRES_PLAN_NOMEN === current.SMATRES_PLAN_NOMEN)) { accumulator.push(current); } @@ -122,11 +123,12 @@ const useIncomFromDeps = (task, taskType) => { }); setIncomFromDeps(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -172,11 +174,12 @@ const useGoodsParties = mainRowRN => { }); setGoodsParties(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -223,11 +226,12 @@ const useCostDeliveryLists = mainRowRN => { }); setCostDeliveryLists(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js index cea0cad..8c009b2 100644 --- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js +++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js @@ -43,11 +43,12 @@ import { MessagingСtx } from "../../context/messaging"; //Контекст со import { NavigationCtx } from "../../context/navigation"; //Контекст навигации import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы +import { APP_STYLES } from "../../../app.styles"; //Типовые стили import { P8PGantt, taskLegendDesc } from "../../components/p8p_gantt"; //Диаграмма Ганта import { xml2JSON, formatDateJSONDateOnly, formatDateRF, hasValue } from "../../core/utils"; //Вспомогательные функции import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки -import { CostRouteListsDataGrid } from "./datagrids/fcroutlst"; -import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps"; +import { CostRouteListsDataGrid } from "./datagrids/fcroutlst"; //Таблица "Маршрутные листы" +import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps"; //Таблица "Приходы из подразделений" //--------- //Константы @@ -72,7 +73,7 @@ const STYLES = { width: "350px", display: "inline-block", flexShrink: 0, - [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" } + [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL } }, GANTT_CONTAINER: { height: `calc(100vh - ${APP_BAR_HEIGHT})`, width: "100vw", paddingTop: "24px" }, GANTT_TITLE: { paddingLeft: "250px", paddingRight: "250px" }, @@ -97,7 +98,7 @@ const parseProdPlanSpXML = async xmlDoc => { attributeValueProcessor: (name, val) => ["numb", "title"].includes(name) ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val }); - return data.XDATA; + return data.XDATA.XGANTT; }; //Форматирование для отображения количества документов @@ -237,8 +238,7 @@ const MechRecCostProdPlans = () => { selectedPlanCtlgLevel: null, selectedPlanCtlgSort: null, selectedPlanCtlgMenuItems: null, - selectedPlanCtlgGanttDef: {}, - selectedPlanCtlgSpecs: [], + gantt: {}, selectedTaskDetail: null, selectedTaskDetailType: null, planSpec: null @@ -282,8 +282,7 @@ const MechRecCostProdPlans = () => { selectedPlanCtlgLevel: null, selectedPlanCtlgSort: null, selectedPlanCtlgMenuItems: null, - selectedPlanCtlgSpecs: [], - selectedPlanCtlgGanttDef: {}, + gantt: {}, showPlanList: false, selectedTaskDetail: null, selectedTaskDetailType: null @@ -300,8 +299,7 @@ const MechRecCostProdPlans = () => { selectedPlanCtlgLevel: null, selectedPlanCtlgSort: null, selectedPlanCtlgMenuItems: null, - selectedPlanCtlgSpecs: [], - selectedPlanCtlgGanttDef: {}, + gantt: {}, showPlanList: false, selectedTaskDetail: null, selectedTaskDetailType: null @@ -324,8 +322,7 @@ const MechRecCostProdPlans = () => { ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1), selectedPlanCtlgSpecsLoaded: true, - selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? { ...doc.XGANTT_DEF } : {}, - selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])] + gantt: { ...doc, tasks: [...(doc?.tasks || [])] } })); }, // eslint-disable-next-line react-hooks/exhaustive-deps @@ -401,7 +398,7 @@ const MechRecCostProdPlans = () => { {state.selectedPlanCtlgSpecsLoaded ? ( - state.selectedPlanCtlgSpecs.length === 0 ? ( + state.gantt.tasks.length === 0 ? ( { ) : null} taskDialogRenderer({ ...prms, handleTaskDetailOpen })} /> diff --git a/app/panels/mech_rec_dept_cost_jobs/hooks.js b/app/panels/mech_rec_dept_cost_jobs/hooks.js index e5ef297..ebeb832 100644 --- a/app/panels/mech_rec_dept_cost_jobs/hooks.js +++ b/app/panels/mech_rec_dept_cost_jobs/hooks.js @@ -62,13 +62,12 @@ const useMechRecDeptCostJobs = (subdiv, fullDate, workHours) => { }); setCostJobs(pv => ({ ...pv, - fixedHeader: data.XDATA_GRID.fixedHeader, - fixedColumns: data.XDATA_GRID.fixedColumns, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE, + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE, date: fullDate })); }; @@ -109,11 +108,12 @@ const useInsDepartment = fullDate => { }); setInsDepartments(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_SMALL + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_SMALL })); }; if (insDepartments.reload) { diff --git a/app/panels/mech_rec_dept_cost_prod_plans/hooks.js b/app/panels/mech_rec_dept_cost_prod_plans/hooks.js index c82d41a..38b4e2c 100644 --- a/app/panels/mech_rec_dept_cost_prod_plans/hooks.js +++ b/app/panels/mech_rec_dept_cost_prod_plans/hooks.js @@ -75,13 +75,12 @@ const useDeptCostProdPlans = () => { }); setState(pv => ({ ...pv, - fixedHeader: data.XDATA_GRID.fixedHeader, - fixedColumns: data.XDATA_GRID.fixedColumns, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE })); }; if (state.reload) { @@ -144,11 +143,12 @@ const useCostRouteLists = task => { }); setCostRouteLists(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_SMALL + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_SMALL })); }; if (costRouteLists.reload && task) { @@ -202,11 +202,12 @@ const useCostRouteListsSpecs = mainRowRN => { }); setCostRouteListsSpecs(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE })); }; if (costRouteListsSpecs.reload) { @@ -258,11 +259,12 @@ const useIncomFromDeps = task => { }); setIncomFromDeps(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE })); }; if (incomFromDeps.reload) { diff --git a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js index 4dbde82..f037bb1 100644 --- a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js +++ b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js @@ -41,7 +41,7 @@ const STYLES = { width: "350px", display: "inline-block", flexShrink: 0, - [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" } + [`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box", ...APP_STYLES.SCROLL } }, CONTAINER: { textAlign: "center" }, TITLE: { height: TITLE_HEIGHT, overflow: "hidden", paddingTop: TITLE_PADDING_TOP, paddingBottom: TITLE_PADDING_BOTTOM, display: "inline-table" }, diff --git a/app/panels/prj_fin/layouts.js b/app/panels/prj_fin/layouts.js index 0984959..d3488d7 100644 --- a/app/panels/prj_fin/layouts.js +++ b/app/panels/prj_fin/layouts.js @@ -23,6 +23,13 @@ export const PANEL_UNITS = { PROJECT_STAGE_ARTS: "PROJECT_STAGE_ARTS" }; +//Общие стили +export const COMMON_PROJECTS_STYLES = { + FULL_SCREEN_DIALOG_CONTENT: { + padding: 0 + } +}; + //----------- //Тело модуля //----------- @@ -250,6 +257,7 @@ export const rowExpandRender = ({ columnsDef, row, pOnlineShowDocument, + pOnlineShowUnit, showStages, showPayNotes, showCostNotes, @@ -275,42 +283,55 @@ export const rowExpandRender = ({ const linkButtons = () => panelUnit === PANEL_UNITS.PROJECTS ? ( <> - - ) : panelUnit === PANEL_UNITS.PROJECT_STAGES ? ( <> - - - ) : panelUnit === PANEL_UNITS.PROJECT_STAGE_CONTRACTS ? ( ) : null; //Сборка содержимого return ( - - {linkButtons()} + + + {linkButtons()} + - + diff --git a/app/panels/prj_fin/projects.js b/app/panels/prj_fin/projects.js index 9855e07..e692926 100644 --- a/app/panels/prj_fin/projects.js +++ b/app/panels/prj_fin/projects.js @@ -11,23 +11,34 @@ import React, { useState, useCallback, useEffect, useContext } from "react"; // import { Box, Grid, Paper, Fab, Icon } from "@mui/material"; //Интерфейсные компоненты import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы -import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных +import { APP_STYLES } from "../../../app.styles"; //Типовые стили +import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы +import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_MORE_HEIGHT, P8P_DATA_GRID_FILTERS_HEIGHT } from "../../components/p8p_data_grid"; //Таблица данных import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог import { P8PChart } from "../../components/p8p_chart"; //График import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения -import { PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов +import { COMMON_PROJECTS_STYLES, PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов import { Stages } from "./stages"; //Список этапов проекта //--------- //Константы //--------- +//Высота графиков +const CHART_HEIGHT = "300px"; + //Стили const STYLES = { - CHART: { maxHeight: "300px", display: "flex", justifyContent: "center" }, + TABLE_PROJECTS: (showCharts, morePages, filters) => ({ + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${showCharts ? CHART_HEIGHT : "0px"} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${ + filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px" + } - 25px)`, + ...APP_STYLES.SCROLL + }), + CHART: { maxHeight: CHART_HEIGHT, display: "flex", justifyContent: "center" }, CHART_PAPER: { height: "100%" }, CHART_FAB: { position: "absolute", top: 80, left: 16 } }; @@ -84,11 +95,12 @@ const Projects = () => { }); setProjectsDataGrid(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ @@ -219,12 +231,16 @@ const Projects = () => { {projectsDataGrid.dataLoaded ? ( 0) + }} columnsDef={projectsDataGrid.columnsDef} rows={projectsDataGrid.rows} size={P8P_DATA_GRID_SIZE.SMALL} filtersInitial={projectsDataGrid.filters} morePages={projectsDataGrid.morePages} reloading={projectsDataGrid.reload} + fixedHeader={true} expandable={true} headCellRender={headCellRender} dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECTS, showStages })} @@ -244,7 +260,11 @@ const Projects = () => { /> ) : null} {projectsDataGrid.selectedProject ? ( - + ({ + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px"} - 16px)`, + ...APP_STYLES.SCROLL + }) +}; + //----------- //Тело модуля //----------- @@ -57,8 +71,9 @@ const StageArts = ({ stage, filters }) => { }); setStageArtsDataGrid(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: [...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: [...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false })); @@ -99,10 +114,12 @@ const StageArts = ({ stage, filters }) => { {stageArtsDataGrid.dataLoaded ? ( 0), elevation: 0 }} columnsDef={stageArtsDataGrid.columnsDef} filtersInitial={filters} rows={stageArtsDataGrid.rows} size={P8P_DATA_GRID_SIZE.SMALL} + fixedHeader={true} morePages={false} reloading={stageArtsDataGrid.reload} dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGE_ARTS, showCostNotes, showContracts })} diff --git a/app/panels/prj_fin/stage_contracts.js b/app/panels/prj_fin/stage_contracts.js index dddc3fb..01ed0a9 100644 --- a/app/panels/prj_fin/stage_contracts.js +++ b/app/panels/prj_fin/stage_contracts.js @@ -12,13 +12,35 @@ import PropTypes from "prop-types"; //Контроль свойств компо import { Box } from "@mui/material"; //Интерфейсные компоненты import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы -import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных +import { APP_STYLES } from "../../../app.styles"; //Типовые стили +import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы +import { + P8PDataGrid, + P8P_DATA_GRID_SIZE, + P8P_DATA_GRID_FILTER_SHAPE, + P8P_DATA_GRID_MORE_HEIGHT, + P8P_DATA_GRID_FILTERS_HEIGHT +} from "../../components/p8p_data_grid"; //Таблица данных import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { PANEL_UNITS, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов +//--------- +//Константы +//--------- + +//Стили +const STYLES = { + TABLE_CONTRACTS: (morePages, filters) => ({ + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${ + filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px" + } - 16px)`, + ...APP_STYLES.SCROLL + }) +}; + //----------- //Тело модуля //----------- @@ -67,11 +89,12 @@ const StageContracts = ({ stage, filters }) => { }); setStageContractsDataGrid(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ @@ -136,12 +159,17 @@ const StageContracts = ({ stage, filters }) => { {stageContractsDataGrid.dataLoaded ? ( 0), + elevation: 0 + }} columnsDef={stageContractsDataGrid.columnsDef} filtersInitial={filters} rows={stageContractsDataGrid.rows} size={P8P_DATA_GRID_SIZE.SMALL} morePages={stageContractsDataGrid.morePages} reloading={stageContractsDataGrid.reload} + fixedHeader={true} expandable={true} dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGE_CONTRACTS, pOnlineShowDocument })} rowExpandRender={prms => diff --git a/app/panels/prj_fin/stages.js b/app/panels/prj_fin/stages.js index 9fec2da..2f5969d 100644 --- a/app/panels/prj_fin/stages.js +++ b/app/panels/prj_fin/stages.js @@ -12,7 +12,15 @@ import PropTypes from "prop-types"; //Контроль свойств компо import { Box } from "@mui/material"; //Интерфейсные компоненты import { object2Base64XML } from "../../core/utils"; //Вспомогательные процедуры и функции import { TEXTS } from "../../../app.text"; //Тектовые ресурсы и константы -import { P8PDataGrid, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "../../components/p8p_data_grid"; //Таблица данных +import { APP_STYLES } from "../../../app.styles"; //Типовые стили +import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы +import { + P8PDataGrid, + P8P_DATA_GRID_SIZE, + P8P_DATA_GRID_FILTER_SHAPE, + P8P_DATA_GRID_MORE_HEIGHT, + P8P_DATA_GRID_FILTERS_HEIGHT +} from "../../components/p8p_data_grid"; //Таблица данных import { P8PFullScreenDialog } from "../../components/p8p_fullscreen_dialog"; //Полноэкранный диалог import { StageArts } from "./stage_arts"; //Калькуляция этапа проекта import { StageContracts } from "./stage_contracts"; //Договоры с соисполнителями этапа проекта @@ -20,7 +28,21 @@ import { BackEndСtx } from "../../context/backend"; //Контекст взаи import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения -import { PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов +import { COMMON_PROJECTS_STYLES, PANEL_UNITS, headCellRender, dataCellRender, valueFormatter, rowExpandRender } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов + +//--------- +//Константы +//--------- + +//Стили +const STYLES = { + TABLE_STAGES: (morePages, filters) => ({ + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${morePages ? P8P_DATA_GRID_MORE_HEIGHT : "0px"} - ${ + filters ? P8P_DATA_GRID_FILTERS_HEIGHT : "0px" + } - 16px)`, + ...APP_STYLES.SCROLL + }) +}; //----------- //Тело модуля @@ -71,11 +93,12 @@ const Stages = ({ project, projectName, filters }) => { }); setStagesDataGrid(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ @@ -154,12 +177,17 @@ const Stages = ({ project, projectName, filters }) => { {stagesDataGrid.dataLoaded ? ( 0), + elevation: 0 + }} columnsDef={stagesDataGrid.columnsDef} filtersInitial={filters} rows={stagesDataGrid.rows} size={P8P_DATA_GRID_SIZE.SMALL} morePages={stagesDataGrid.morePages} reloading={stagesDataGrid.reload} + fixedHeader={true} expandable={true} headCellRender={headCellRender} dataCellRender={prms => dataCellRender({ ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGES, showStageArts, showContracts })} @@ -168,6 +196,7 @@ const Stages = ({ project, projectName, filters }) => { ...prms, panelUnit: PANEL_UNITS.PROJECT_STAGES, pOnlineShowDocument, + pOnlineShowUnit, showStageArts, showContracts, showPayNotes, @@ -185,6 +214,7 @@ const Stages = ({ project, projectName, filters }) => { @@ -193,6 +223,7 @@ const Stages = ({ project, projectName, filters }) => { diff --git a/app/panels/prj_graph/prj_graph.js b/app/panels/prj_graph/prj_graph.js index bc26b95..a46c83d 100644 --- a/app/panels/prj_graph/prj_graph.js +++ b/app/panels/prj_graph/prj_graph.js @@ -55,11 +55,10 @@ const PrjGraph = () => { const data = await executeStored({ stored: "PKG_P8PANELS_PROJECTS.GRAPH", args: {}, respArg: "COUT" }); setdataGrid(pv => ({ ...pv, - fixedHeader: data.XDATA_GRID.fixedHeader, - fixedColumns: data.XDATA_GRID.fixedColumns, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: [...(data.XROWS || [])], - groups: [...(data.XGROUPS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: [...(data.XDATA_GRID.rows || [])], + groups: [...(data.XDATA_GRID.groups || [])], dataLoaded: true, reload: false })); diff --git a/app/panels/prj_jobs/lab_fact_rpt_dtl.js b/app/panels/prj_jobs/lab_fact_rpt_dtl.js index f443384..e368b48 100644 --- a/app/panels/prj_jobs/lab_fact_rpt_dtl.js +++ b/app/panels/prj_jobs/lab_fact_rpt_dtl.js @@ -57,11 +57,12 @@ const LabFactRptDtl = ({ periodId, title, onHide }) => { }); setFactRptDtl(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ diff --git a/app/panels/prj_jobs/lab_plan_fot_dtl.js b/app/panels/prj_jobs/lab_plan_fot_dtl.js index 520360b..e3e323b 100644 --- a/app/panels/prj_jobs/lab_plan_fot_dtl.js +++ b/app/panels/prj_jobs/lab_plan_fot_dtl.js @@ -56,11 +56,12 @@ const LabPlanFOTDtl = ({ periodId, title, onHide }) => { }); setPlanFOTDtl(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ diff --git a/app/panels/prj_jobs/lab_plan_jobs_dtl.js b/app/panels/prj_jobs/lab_plan_jobs_dtl.js index 251dd68..a1ee815 100644 --- a/app/panels/prj_jobs/lab_plan_jobs_dtl.js +++ b/app/panels/prj_jobs/lab_plan_jobs_dtl.js @@ -61,11 +61,12 @@ const LabPlanJobsDtl = ({ periodId, title, onHide, onProjectClick }) => { }); setPlanJobsDtl(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js index ffafa48..fc2e5b1 100644 --- a/app/panels/prj_jobs/prj_jobs.js +++ b/app/panels/prj_jobs/prj_jobs.js @@ -265,8 +265,7 @@ const PrjJobs = () => { selectedProjectJobsLoaded: false, selectedProject: null, selectedProjectDocRn: null, - selectedProjectGanttDef: {}, - selectedProjectTasks: [], + gantt: {}, showInitDialog: false }); @@ -308,8 +307,9 @@ const PrjJobs = () => { setState(pv => ({ ...pv, selectedProjectJobsLoaded: true, - selectedProjectGanttDef: tasksOnly === true ? { ...pv.selectedProjectGanttDef } : data.XGANTT_DEF ? { ...data.XGANTT_DEF } : {}, - selectedProjectTasks: [...data.XGANTT_TASKS] + gantt: { + ...(tasksOnly === true ? { ...pv.gantt, tasks: [...data.XGANTT.tasks] } : data.XGANTT ? { ...data.XGANTT } : {}) + } })); }, [executeStored, state.ident, state.selectedProject] @@ -394,8 +394,7 @@ const PrjJobs = () => { selectedProject: project, selectedProjectDocRn: projectDocRn, selectedProjectJobsLoaded: false, - selectedProjectTasks: [], - selectedProjectGanttDef: {}, + gantt: {}, showProjectsList: false })); }; @@ -407,8 +406,7 @@ const PrjJobs = () => { selectedProjectJobsLoaded: false, selectedProject: null, selectedProjectDocRn: null, - selectedProjectTasks: [], - selectedProjectGanttDef: {}, + gantt: {}, showProjectsList: false })); @@ -515,11 +513,10 @@ const PrjJobs = () => { {state.selectedProjectJobsLoaded ? ( diff --git a/app/panels/prj_jobs/res_mon.js b/app/panels/prj_jobs/res_mon.js index d3a2ba9..d499255 100644 --- a/app/panels/prj_jobs/res_mon.js +++ b/app/panels/prj_jobs/res_mon.js @@ -79,11 +79,12 @@ const ResMon = ({ ident, onPlanJobsDtlProjectClick }) => { }); setPeriods(pv => ({ ...pv, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef, + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reload: false, - morePages: (data.XROWS || []).length >= configSystemPageSize + morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize })); } }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]); diff --git a/app/panels/rrp_conf_editor/hooks.js b/app/panels/rrp_conf_editor/hooks.js index 03b8066..8030d1d 100644 --- a/app/panels/rrp_conf_editor/hooks.js +++ b/app/panels/rrp_conf_editor/hooks.js @@ -97,16 +97,15 @@ const useConf = (currentTab, handleSectionChange) => { sections.map(s => { let dg = {}; Object.assign(dg, dataGrid, { + ...s.XDATA.XDATA_GRID, rn: s.NRN, code: s.SCODE, name: s.SNAME, delete_allow: s.NDELETE_ALLOW, dataLoaded: true, - columnsDef: [...(s.XDATA.XCOLUMNS_DEF || [])], - groups: [...(s.XDATA.XGROUPS || [])], - rows: [...(s.XDATA.XROWS || [])], - fixedHeader: s.XDATA.XDATA_GRID.fixedHeader, - fixedColumns: s.XDATA.XDATA_GRID.fixedColumns, + columnsDef: [...(s.XDATA.XDATA_GRID.columnsDef || [])], + groups: [...(s.XDATA.XDATA_GRID.groups || [])], + rows: [...(s.XDATA.XDATA_GRID.rows || [])], reload: false }); //Если раздел имеет составы показателей diff --git a/app/panels/samples/chart.js b/app/panels/samples/chart.js index 8c5ef52..5f2adb8 100644 --- a/app/panels/samples/chart.js +++ b/app/panels/samples/chart.js @@ -33,7 +33,7 @@ const STYLES = { //Пример: Графики "P8PChart" const Chart = ({ title }) => { //Собственное состояние - график - const [chart, setChart] = useState({ loaded: false, labels: [], datasets: [] }); + const [chart, setChart] = useState({ loaded: false }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); diff --git a/app/panels/samples/cyclogram.js b/app/panels/samples/cyclogram.js new file mode 100644 index 0000000..1ffca33 --- /dev/null +++ b/app/panels/samples/cyclogram.js @@ -0,0 +1,301 @@ +/* + Парус 8 - Панели мониторинга - Примеры для разработчиков + Пример: Циклограмма "P8PCyclogram" +*/ + +//--------------------- +//Подключение библиотек +//--------------------- + +import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React +import PropTypes from "prop-types"; //Контроль свойств компонента +import { + Typography, + Grid, + Button, + Box, + DialogContent, + List, + ListItem, + ListItemText, + Divider, + TextField, + DialogActions, + Stack, + Icon +} from "@mui/material"; //Интерфейсные элементы +import { formatDateJSONDateOnly, formatDateRF } from "../../core/utils"; //Вспомогательные функции +import { APP_BAR_HEIGHT } from "../../components/p8p_app_workspace"; //Заголовок страницы +import { P8PCyclogram } from "../../components/p8p_cyclogram"; //Циклограмма +import { P8P_CYCLOGRAM_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения +import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером + +//--------- +//Константы +//--------- + +//Отступ контейнера страницы от заголовка +const CONTAINER_PADDING_TOP = "20px"; + +//Высота заголовка страницы +const TITLE_HEIGHT = "47px"; + +//Высота строк +const LINE_HEIGHT = 30; + +//Стили +const STYLES = { + CONTAINER: { textAlign: "center", paddingTop: CONTAINER_PADDING_TOP }, + TITLE: { paddingBottom: "15px", height: TITLE_HEIGHT }, + CYCLOGRAM_CONTAINER: { + height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTAINER_PADDING_TOP})`, + width: "100vw", + paddingTop: "5px" + }, + TASK_EDITOR_CONTENT: { minWidth: 400, overflowX: "auto" }, + TASK_EDITOR_LIST: { width: "100%", minWidth: 300, maxWidth: 700, bgcolor: "background.paper" }, + GROUP_HEADER: height => ({ + border: "1px solid", + backgroundColor: "#ecf8fb", + height: height, + borderRadius: "10px", + display: "flex", + alignItems: "center", + justifyContent: "space-around" + }) +}; + +//--------------------------------------------- +//Вспомогательные функции форматирования данных +//--------------------------------------------- + +//Диалог открытия задачи +const CustomTaskDialog = ({ task, ident, handleReload, close }) => { + //Собственное состояние + const [taskDates, setTaskDates] = useState({ start: task.ddate_start, end: task.ddate_end }); + + //Тип проекта + const textType = task.type === 0 ? "Задачи проекта" : task.type === 1 ? "Этап проекта" : "Работа проекта"; + + //Подключение к контексту взаимодействия с сервером + const { executeStored } = useContext(BackEndСtx); + + //Изменение дат задачи + const changeDates = useCallback(async () => { + //Изменяем даты задачи + await executeStored({ + stored: "PKG_P8PANELS_SAMPLES.CYCLOGRAM_TASK_MODIFY", + args: { + NIDENT: ident, + NRN: task.rn, + SDATE_FROM: formatDateRF(taskDates.start), + SDATE_TO: formatDateRF(taskDates.end) + } + }); + handleReload(); + close(); + }, [close, executeStored, handleReload, ident, task.rn, taskDates.end, taskDates.start]); + + //При нажатии OK + const handleOk = () => { + //Изменяем даты задачи + changeDates(); + }; + + return ( + <> + + + + + + + + setTaskDates(pv => ({ ...pv, start: e.target.value }))} + variant="standard" + size="small" + margin="normal" + > + } + /> + + + + setTaskDates(pv => ({ ...pv, end: e.target.value }))} + variant="standard" + size="small" + margin="normal" + > + } + /> + + + + + {task.type === 0 ? "description" : task.type === 1 ? "check" : "work_outline"} + {textType} + + } + /> + + + + + + + + + ); +}; + +//Контроль свойств - Диалог открытия задачи +CustomTaskDialog.propTypes = { + task: PropTypes.object.isRequired, + ident: PropTypes.number.isRequired, + handleReload: PropTypes.func.isRequired, + close: PropTypes.func.isRequired +}; + +//Заголовок группы +const CustomGroupHeader = ({ group }) => { + return ( + + {group.name} + + ); +}; + +//Контроль свойств - Заголовок группы +CustomGroupHeader.propTypes = { + group: PropTypes.object.isRequired +}; + +//Отображение задачи +const taskRenderer = ({ task }) => { + //Если это задачи проекта + if (task.type === 0) { + return { + taskStyle: { border: "3px solid #ebe058" } + }; + } +}; + +//----------- +//Тело модуля +//----------- + +//Пример: Циклограмма "P8PCyclogram" +const Cyclogram = ({ title }) => { + //Собственное состояние + const [state, setState] = useState({ + init: false, + dataLoaded: false, + reload: true, + ident: null + }); + + //Подключение к контексту взаимодействия с сервером + const { executeStored } = useContext(BackEndСtx); + + //При необходимости перезагрузки + const handleReload = () => { + setState(pv => ({ ...pv, reload: true })); + }; + + //При необходимости обновить данные таблицы + useEffect(() => { + //Загрузка данных циклограммы с сервера + const loadData = async () => { + const data = await executeStored({ + stored: "PKG_P8PANELS_SAMPLES.CYCLOGRAM", + args: { NIDENT: state.ident }, + attributeValueProcessor: (name, val) => (["ddate_start", "ddate_end"].includes(name) ? formatDateJSONDateOnly(val) : val), + respArg: "COUT" + }); + setState(pv => ({ ...pv, dataLoaded: true, ...data.XCYCLOGRAM, reload: false })); + }; + //Если указан идентификатор и требуется перезагрузить + if (state.ident && state.reload) loadData(); + }, [state.ident, state.reload, executeStored]); + + //При подключении компонента к странице + useEffect(() => { + //Инициализация данных циклограммы + const initData = async () => { + const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.CYCLOGRAM_INIT", args: { NIDENT: state.ident } }); + setState(pv => ({ ...pv, init: true, ident: data.NIDENT, reload: true })); + }; + //Если требуется проинициализировать + if (!state.init) { + initData(); + } + }, [executeStored, state.ident, state.init]); + + return ( + +
+ + {title} + + + + {state.dataLoaded ? ( + ( + + )} + taskRenderer={prms => taskRenderer(prms)} + groupHeaderRenderer={prms => } + /> + ) : null} + + +
+
+ ); +}; + +//Контроль свойств - Пример: Циклограмма "P8PCyclogram" +Cyclogram.propTypes = { + title: PropTypes.string.isRequired +}; + +//---------------- +//Интерфейс модуля +//---------------- + +export { Cyclogram }; diff --git a/app/panels/samples/data_grid.js b/app/panels/samples/data_grid.js index c5b9bc3..f7009f0 100644 --- a/app/panels/samples/data_grid.js +++ b/app/panels/samples/data_grid.js @@ -15,6 +15,7 @@ import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid" import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { ApplicationСtx } from "../../context/application"; //Контекст приложения +import { APP_STYLES } from "../../../app.styles"; //Типовые стили //--------- //Константы @@ -27,7 +28,7 @@ const DATA_GRID_PAGE_SIZE = 5; const STYLES = { CONTAINER: { textAlign: "center", paddingTop: "20px" }, TITLE: { paddingBottom: "15px" }, - DATA_GRID_CONTAINER: { maxWidth: 700, maxHeight: 500, minHeight: 500 } + DATA_GRID_CONTAINER: { maxWidth: 700, maxHeight: 500, minHeight: 500, ...APP_STYLES.SCROLL } }; //--------------------------------------------- @@ -86,18 +87,14 @@ export const groupCellRender = () => ({ cellStyle: { padding: "2px" } }); //Пример: Таблица данных "P8PDataGrid" const DataGrid = ({ title }) => { //Собственное состояние - таблица данных - const [dataGrid, setdataGrid] = useState({ + const [dataGrid, setDataGrid] = useState({ dataLoaded: false, - columnsDef: [], filters: null, orders: null, - groups: [], - rows: [], - reload: true, pageNumber: 1, morePages: true, - fixedHeader: false, - fixedColumns: 0 + expandable: true, + reloading: true }); //Подключение к контексту взаимодействия с сервером @@ -108,7 +105,7 @@ const DataGrid = ({ title }) => { //Загрузка данных таблицы с сервера const loadData = useCallback(async () => { - if (dataGrid.reload) { + if (dataGrid.reloading) { const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.DATA_GRID", args: { @@ -120,32 +117,31 @@ const DataGrid = ({ title }) => { }, respArg: "COUT" }); - setdataGrid(pv => ({ + setDataGrid(pv => ({ ...pv, - fixedHeader: data.XDATA_GRID.fixedHeader, - fixedColumns: data.XDATA_GRID.fixedColumns, - columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, - rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], - groups: data.XGROUPS + ...data.XDATA_GRID, + columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [], + rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])], + groups: data.XDATA_GRID.groups ? pv.pageNumber == 1 - ? [...data.XGROUPS] - : [...pv.groups, ...data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name))] - : [...pv.groups], + ? [...data.XDATA_GRID.groups] + : [...(pv.groups || []), ...data.XDATA_GRID.groups.filter(g => !pv.groups.find(pg => pg.name == g.name))] + : [...(pv.groups || [])], dataLoaded: true, - reload: false, - morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE + reloading: false, + morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE })); } - }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]); + }, [dataGrid.reloading, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]); //При изменении состояния фильтра - const handleFilterChanged = ({ filters }) => setdataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reload: true })); + const handleFilterChanged = ({ filters }) => setDataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reloading: true })); //При изменении состояния сортировки - const handleOrderChanged = ({ orders }) => setdataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true })); + const handleOrderChanged = ({ orders }) => setDataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reloading: true })); //При изменении количества отображаемых страниц - const handlePagesCountChanged = () => setdataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true })); + const handlePagesCountChanged = () => setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reloading: true })); //При нажатии на копку контрагента const handleAgnButtonClicked = agnCode => pOnlineShowDocument({ unitCode: "AGNLIST", document: agnCode, inRnParameter: "in_AGNABBR" }); @@ -153,7 +149,7 @@ const DataGrid = ({ title }) => { //При необходимости обновить данные таблицы useEffect(() => { loadData(); - }, [dataGrid.reload, loadData]); + }, [dataGrid.reloading, loadData]); //Генерация содержимого return ( @@ -167,16 +163,9 @@ const DataGrid = ({ title }) => { {dataGrid.dataLoaded ? ( { onOrderChanged={handleOrderChanged} onFilterChanged={handleFilterChanged} onPagesCountChanged={handlePagesCountChanged} - expandable={true} rowExpandRender={({ row }) => ( )} diff --git a/app/panels/samples/gantt.js b/app/panels/samples/gantt.js index 663f9e2..392067e 100644 --- a/app/panels/samples/gantt.js +++ b/app/panels/samples/gantt.js @@ -97,12 +97,10 @@ const taskDialogRenderer = ({ task, close }) => { //Пример: Диаграмма Ганта "P8Gantt" const Gantt = ({ title }) => { //Собственное состояние - const [state, setState] = useState({ + const [gantt, setGantt] = useState({ init: false, dataLoaded: false, ident: null, - ganttDef: {}, - ganttTasks: [], useCustomTaskDialog: false }); @@ -113,21 +111,21 @@ const Gantt = ({ title }) => { const loadData = useCallback(async () => { const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT", - args: { NIDENT: state.ident }, + args: { NIDENT: gantt.ident }, attributeValueProcessor: (name, val) => name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val, respArg: "COUT" }); - setState(pv => ({ ...pv, dataLoaded: true, ganttDef: { ...data.XGANTT_DEF }, ganttTasks: [...data.XGANTT_TASKS] })); - }, [state.ident, executeStored]); + setGantt(pv => ({ ...pv, dataLoaded: true, ...data.XGANTT })); + }, [gantt.ident, executeStored]); //Инициализация данных диаграммы const initData = useCallback(async () => { - if (!state.init) { - const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_INIT", args: { NIDENT: state.ident } }); - setState(pv => ({ ...pv, init: true, ident: data.NIDENT })); + if (!gantt.init) { + const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_INIT", args: { NIDENT: gantt.ident } }); + setGantt(pv => ({ ...pv, init: true, ident: data.NIDENT })); } - }, [state.init, state.ident, executeStored]); + }, [gantt.init, gantt.ident, executeStored]); //Изменение данных диаграммы const modifyData = useCallback( @@ -135,13 +133,13 @@ const Gantt = ({ title }) => { try { await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_MODIFY", - args: { NIDENT: state.ident, NRN: rn, DDATE_FROM: new Date(start), DDATE_TO: new Date(end) } + args: { NIDENT: gantt.ident, NRN: rn, DDATE_FROM: new Date(start), DDATE_TO: new Date(end) } }); } finally { loadData(); } }, - [state.ident, executeStored, loadData] + [gantt.ident, executeStored, loadData] ); //Обработка измненения сроков задачи в диаграмме Гантта @@ -151,8 +149,8 @@ const Gantt = ({ title }) => { //При необходимости обновить данные таблицы useEffect(() => { - if (state.ident) loadData(); - }, [state.ident, loadData]); + if (gantt.ident) loadData(); + }, [gantt.ident, loadData]); //При подключении компонента к странице useEffect(() => { @@ -168,20 +166,19 @@ const Gantt = ({ title }) => { setState(pv => ({ ...pv, useCustomTaskDialog: !pv.useCustomTaskDialog }))} />} + control={ setGantt(pv => ({ ...pv, useCustomTaskDialog: !pv.useCustomTaskDialog }))} />} label="Отображать пользовательский диалог задачи" /> - {state.dataLoaded ? ( + {gantt.dataLoaded ? ( ) : null} diff --git a/app/panels/samples/samples.js b/app/panels/samples/samples.js index cbf8df8..3746450 100644 --- a/app/panels/samples/samples.js +++ b/app/panels/samples/samples.js @@ -18,6 +18,7 @@ import { DataGrid } from "./data_grid"; //Пример: Таблица данн import { Chart } from "./chart"; //Пример: Графики "P8PChart" import { Gantt } from "./gantt"; //Пример: Диаграмма Ганта "P8PGantt" import { Svg } from "./svg"; //Пример: Интерактивные изображения "P8PSVG" +import { Cyclogram } from "./cyclogram"; //Пример: Циклограмма "P8PCyclogram" //--------- //Константы @@ -32,7 +33,8 @@ const MODES = { DATAGRID: { name: "DATAGRID", caption: 'Таблица данных "P8PDataGrid"', component: DataGrid }, CHART: { name: "CHART", caption: 'Графики "P8PChart"', component: Chart }, GANTT: { name: "GANTT", caption: 'Диаграмма Ганта "P8PGantt"', component: Gantt }, - SVG: { name: "SVG", caption: 'Интерактивные изображения "P8PSVG"', component: Svg } + SVG: { name: "SVG", caption: 'Интерактивные изображения "P8PSVG"', component: Svg }, + CYCLOGRAM: { name: "CYCLOGRAM", caption: 'Циклограмма "P8PCyclogram"', component: Cyclogram } }; //Стили diff --git a/db/P8PNL_JB_JOBS.sql b/db/P8PNL_JB_JOBS.sql index ee8b4f9..9fd707f 100644 --- a/db/P8PNL_JB_JOBS.sql +++ b/db/P8PNL_JB_JOBS.sql @@ -19,8 +19,8 @@ create table P8PNL_JB_JOBS EDITABLE number(1) default 0 not null, -- Признак возможности редактирования (0 - нет, 1 - да) CHANGED number(1) default 0 not null, -- Признак наличия изменений, требующих сохранения (0 - нет, 1 - да) constraint C_P8PNL_JB_JOBS_RN_PK primary key (RN), - constraint C_P8PNL_JB_JOBS_PRN_FK foreign key (PRN) references P8PNL_JB_PRJCTS (RN), - constraint C_P8PNL_JB_JOBS_HRN_FK foreign key (HRN) references P8PNL_JB_JOBS (RN), + constraint C_P8PNL_JB_JOBS_PRN_FK foreign key (PRN) references P8PNL_JB_PRJCTS (RN) on delete cascade, + constraint C_P8PNL_JB_JOBS_HRN_FK foreign key (HRN) references P8PNL_JB_JOBS (RN) on delete cascade, constraint C_P8PNL_JB_JOBS_STAGE_VAL check (STAGE in (0, 1)), constraint C_P8PNL_JB_JOBS_EDTBL_VAL check (EDITABLE in (0, 1)), constraint C_P8PNL_JB_JOBS_CHNGD_VAL check (CHANGED in (0, 1)), diff --git a/db/P8PNL_JB_JOBSPREV.sql b/db/P8PNL_JB_JOBSPREV.sql index 9ef7cbc..8eb7a85 100644 --- a/db/P8PNL_JB_JOBSPREV.sql +++ b/db/P8PNL_JB_JOBSPREV.sql @@ -9,7 +9,7 @@ create table P8PNL_JB_JOBSPREV PRN number(17) not null, -- Рег. номер родителя JB_JOBS number(17) not null, -- Рег. номер предшествующей работы/этапа constraint C_P8PNL_JB_JOBSPREV_RN_PK primary key (RN), - constraint C_P8PNL_JB_JOBSPREV_PRN_FK foreign key (PRN) references P8PNL_JB_JOBS (RN), - constraint C_P8PNL_JB_JOBSPREV_JB_JOBS_FK foreign key (JB_JOBS) references P8PNL_JB_JOBS (RN), + constraint C_P8PNL_JB_JOBSPREV_PRN_FK foreign key (PRN) references P8PNL_JB_JOBS (RN) on delete cascade, + constraint C_P8PNL_JB_JOBSPREV_JB_JOBS_FK foreign key (JB_JOBS) references P8PNL_JB_JOBS (RN) on delete cascade, constraint C_P8PNL_JB_JOBSPREV_UN unique (IDENT, PRN, JB_JOBS) ); diff --git a/db/P8PNL_JB_PERIODS.sql b/db/P8PNL_JB_PERIODS.sql index b3ba077..fdff88c 100644 --- a/db/P8PNL_JB_PERIODS.sql +++ b/db/P8PNL_JB_PERIODS.sql @@ -15,7 +15,7 @@ create table P8PNL_JB_PERIODS LAB_PLAN_JOBS number(17,3) default 0 not null, -- Трудоёмкость (план, по графику) constraint C_P8PNL_JB_PERIODS_RN_PK primary key (RN), constraint C_P8PNL_JB_PERIODS_DATE_VAL check (DATE_FROM <= DATE_TO), - constraint C_P8PNL_JB_PERIODS_INS_DEP_FK foreign key (INS_DEPARTMENT) references INS_DEPARTMENT (RN), - constraint C_P8PNL_JB_PERIODS_FCMNPWR_FK foreign key (FCMANPOWER) references FCMANPOWER (RN), + constraint C_P8PNL_JB_PERIODS_INS_DEP_FK foreign key (INS_DEPARTMENT) references INS_DEPARTMENT (RN) on delete cascade, + constraint C_P8PNL_JB_PERIODS_FCMNPWR_FK foreign key (FCMANPOWER) references FCMANPOWER (RN) on delete cascade, constraint C_P8PNL_JB_PERIODS_UN unique (IDENT, DATE_FROM, INS_DEPARTMENT, FCMANPOWER) ); diff --git a/db/P8PNL_JB_PRJCTS.sql b/db/P8PNL_JB_PRJCTS.sql index 35b4a65..efb7dd1 100644 --- a/db/P8PNL_JB_PRJCTS.sql +++ b/db/P8PNL_JB_PRJCTS.sql @@ -11,7 +11,7 @@ create table P8PNL_JB_PRJCTS EDITABLE number(1) default 0 not null, -- Признак возможности редактирования (0 - нет, 1 - да) CHANGED number(1) default 0 not null, -- Признак наличия изменений, требующих сохранения (0 - нет, 1 - да) constraint C_P8PNL_JB_PRJCTS_RN_PK primary key (RN), - constraint C_P8PNL_JB_PRJCTS_PROJECT_FK foreign key (PROJECT) references PROJECT (RN), + constraint C_P8PNL_JB_PRJCTS_PROJECT_FK foreign key (PROJECT) references PROJECT (RN) on delete cascade, constraint C_P8PNL_JB_PRJCTS_JOBS_VAL check (JOBS in (0, 1)), constraint C_P8PNL_JB_PRJCTS_EDTBL_VAL check (EDITABLE in (0, 1)), constraint C_P8PNL_JB_PRJCTS_CHNGD_VAL check (CHANGED in (0, 1)), diff --git a/db/P8PNL_SMPL_CYCLOGRAM.sql b/db/P8PNL_SMPL_CYCLOGRAM.sql new file mode 100644 index 0000000..77634ee --- /dev/null +++ b/db/P8PNL_SMPL_CYCLOGRAM.sql @@ -0,0 +1,18 @@ +/* + Парус 8 - Панели мониторинга - Примеры + Буфер для циклограммы +*/ +create table P8PNL_SMPL_CYCLOGRAM +( + RN number(17) not null, -- Рег. номер записи + IDENT number(17) not null, -- Идентификатор процесса + TYPE number(1) not null, -- Тип (0 - колонка, 1 - группа, 2 - задача) + NAME varchar2(200) not null, -- Наименование + POS_START number(17) default null, -- Начальная позиция на циклограмме + POS_END number(17) default null, -- Конечная позиция на циклограмме + DATE_FROM date default null, -- Дата начала + DATE_TO date default null, -- Дата окончания + TASK_GROUP number(17) default null, -- Группа задач + constraint C_P8PNL_SMPL_CYCLOGRAM_RN_PK primary key (RN), + constraint C_P8PNL_SMPL_CYCLOGRAM_TP_VAL check (TYPE in (0, 1, 2)) +); diff --git a/db/PKG_P8PANELS_BASE.pck b/db/PKG_P8PANELS_BASE.pck index 2a54068..483dffa 100644 --- a/db/PKG_P8PANELS_BASE.pck +++ b/db/PKG_P8PANELS_BASE.pck @@ -27,6 +27,13 @@ create or replace package PKG_P8PANELS_BASE as NDOCUMENT in number -- Рег. номер документа ) return number; -- Флаг доступности (см. константы NACCESS_*) + /* Подготовка пользовательской строки поиска для вставки в запрос */ + procedure UTL_SEARCH_PREPARE + ( + SSEARCH in varchar2, -- Пользовательская строка поиска + SSEARCH_PREPARED out varchar2 -- Подготовленная строка поиска + ); + /* Базовое исполнение действий */ procedure PROCESS ( @@ -191,6 +198,36 @@ create or replace package body PKG_P8PANELS_BASE as return NACCESS_NO; end UTL_DOC_ACCESS_CHECK; + /* Подготовка пользовательской строки поиска для вставки в запрос */ + procedure UTL_SEARCH_PREPARE + ( + SSEARCH in varchar2, -- Пользовательская строка поиска + SSEARCH_PREPARED out varchar2 -- Подготовленная строка поиска + ) + is + /* Локальные константы */ + SANY_SYS constant char(1) := '%'; -- Маска "любое количество любых символов" Oracle + SONE_SYS constant char(1) := '_'; -- Маска "любой один символ" Oracle + SENT_WRD_DELIM constant varchar2(1) := ' '; -- Разделитель слов в предложении + SANY_PRS constant varchar2(240) := PKG_OPTIONS.STARSYMB; -- Маска "любое количество любых символов" Парус + SONE_PRS constant varchar2(240) := PKG_OPTIONS.QUESTSYMB; -- Маска "любой один символ" Парус + begin + /* Если пользовательская строка пустая - то это всё что угодно */ + if (SSEARCH is null) + then + SSEARCH_PREPARED := SANY_SYS; + else + /* Подменим пользовательские маски на системные и соберем подготовленную строку поиска */ + SSEARCH_PREPARED := '%' || replace(replace(replace(SSEARCH + ,SANY_PRS + ,SANY_SYS) + ,SONE_PRS + ,SONE_SYS) + ,SENT_WRD_DELIM + ,SANY_SYS) || '%'; + end if; + end UTL_SEARCH_PREPARE; + /* Формирование сообщения об отсутствии значения */ function MSG_NO_DATA_MAKE ( diff --git a/db/PKG_P8PANELS_EQUIPSRV.pck b/db/PKG_P8PANELS_EQUIPSRV.pck index e11f20d..6cd469f 100644 --- a/db/PKG_P8PANELS_EQUIPSRV.pck +++ b/db/PKG_P8PANELS_EQUIPSRV.pck @@ -227,10 +227,10 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации SPRJ_GROUP_NAME PKG_STD.TSTRING; -- Наименование группы для проекта BEXPANDED boolean; -- Флаг раскрытости уровня - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW_INFO PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с информацией по объекту ремонта - RDG_ROW_PLAN PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с планом по объекту ремонта - RDG_ROW_FACT PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с фактом по объекту ремонта + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW_INFO PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы с информацией по объекту ремонта + RDG_ROW_PLAN PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы с планом по объекту ремонта + RDG_ROW_FACT PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы с фактом по объекту ремонта NCURYEAR PKG_STD.TNUMBER; -- Текущий год NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце @@ -399,99 +399,99 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as /* Определим дату конца периода */ NTODATE := LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(NTOMONTH), 2, '0') || '.' || TO_CHAR(NTOYEAR), 'dd.mm.yyyy')); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); /* Формируем структуру заголовка */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SOBJINFO', - SCAPTION => 'Информация по объекту ремонта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SINFO', - SCAPTION => 'Объект ремонта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SWRKTYPE', - SCAPTION => 'Тип работ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SPARENT => 'SINFO', - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SWORKNAME', - SCAPTION => 'Наименование работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STECHOBJCODE', - SCAPTION => 'Код тех. объекта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STECHOBJNAME', - SCAPTION => 'Наименование тех. объекта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SBELONG', - SCAPTION => 'Принадлежность', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRODOBJ', - SCAPTION => 'Производственный объект', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STECHSERV', - SCAPTION => 'Тех. служба', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SRESPDEP', - SCAPTION => 'Отвественное подразделение', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STECSERVCODE', - SCAPTION => 'Вид ремонта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DDATEPLANBEG', - SCAPTION => 'Начало работы (план)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DDATEPLANEND', - SCAPTION => 'Окончание работы (план)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DDATEFACTBEG', - SCAPTION => 'Начало работы (факт)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DDATEFACTEND', - SCAPTION => 'Окончание работы (факт)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STECSRVKINDCODE', - SCAPTION => 'Код типа работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'STECSRVKINDNAME', - SCAPTION => 'Наименование типа работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SOBJINFO', + SCAPTION => 'Информация по объекту ремонта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SINFO', + SCAPTION => 'Объект ремонта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SWRKTYPE', + SCAPTION => 'Тип работ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SPARENT => 'SINFO', + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SWORKNAME', + SCAPTION => 'Наименование работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'STECHOBJCODE', + SCAPTION => 'Код тех. объекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'STECHOBJNAME', + SCAPTION => 'Наименование тех. объекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SBELONG', + SCAPTION => 'Принадлежность', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRODOBJ', + SCAPTION => 'Производственный объект', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'STECHSERV', + SCAPTION => 'Тех. служба', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SRESPDEP', + SCAPTION => 'Отвественное подразделение', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'STECSERVCODE', + SCAPTION => 'Вид ремонта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DDATEPLANBEG', + SCAPTION => 'Начало работы (план)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DDATEPLANEND', + SCAPTION => 'Окончание работы (план)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DDATEFACTBEG', + SCAPTION => 'Начало работы (факт)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DDATEFACTEND', + SCAPTION => 'Окончание работы (факт)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'STECSRVKINDCODE', + SCAPTION => 'Код типа работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'STECSRVKINDNAME', + SCAPTION => 'Наименование типа работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); /* Очистка коллекций */ PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); @@ -530,12 +530,12 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as else BEXPANDED := false; end if; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), - SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BEXPANDABLE => true, - BEXPANDED => BEXPANDED); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M), + SCAPTION => LPAD(TO_CHAR(M), 2, '0') || ' ' || TO_CHAR(Y), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BEXPANDABLE => true, + BEXPANDED => BEXPANDED); /* Подсчёт кол-ва дней в месяце */ NTOTALDAYS := TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), 'dd.mm.yyyy')), @@ -544,12 +544,11 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as /* Цикл по дням месяца */ for D in 1 .. NTOTALDAYS loop - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || - TO_CHAR(D), - SCAPTION => TO_CHAR(D, '99'), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M)); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M) || '_' || TO_CHAR(D), + SCAPTION => TO_CHAR(D, '99'), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SPARENT => '_' || TO_CHAR(Y) || '_' || TO_CHAR(M)); end loop; end loop; end loop; @@ -573,7 +572,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as if (NFROMYEAR = NTOYEAR) then NMS := NFROMMONTH; NME := NTOMONTH; - /* Иначе вычисляем кол-во месяцев в каждом году периода отчёта */ + /* Иначе вычисляем кол-во месяцев в каждом году периода отчёта */ else if (Y = NFROMYEAR) then NMS := NFROMMONTH; @@ -590,14 +589,14 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as for M in NMS .. NME loop SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO, - SNAME => SPERIODNAME, - SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_P'), - 1)) || ' факт: ' || - HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_F'), - 1))); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_INFO, + SNAME => SPERIODNAME, + SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_P'), + 1)) || ' факт: ' || + HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F'), + 1))); /* Добавление в коллекцию трудоёмкость план */ PKG_CONTVALLOC1S.PUTN(RCONTAINER => YM, SROWID => SPERIODNAME || '_P', NVALUE => 0); /* Добавление в коллекцию трудоёмкость факт */ @@ -605,17 +604,17 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as end loop; end loop; /* Добавление строки с трудоёмкостью */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO); end if; /* Добавление группы с объектом ремонта */ SCURTECHOBJ := QQ.STECHOBJNAME; SPRJ_GROUP_NAME := SCURTECHOBJ; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SPRJ_GROUP_NAME, - SCAPTION => QQ.STECHOBJNAME, - BEXPANDABLE => false); - RDG_ROW_INFO := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SPRJ_GROUP_NAME, + SCAPTION => QQ.STECHOBJNAME, + BEXPANDABLE => false); + RDG_ROW_INFO := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_INFO, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ); end if; /* Формируем имя группы для вида ремонта */ SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE; @@ -623,7 +622,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => GF, SROWID => SCURTSKCODE) = false) then /* Добавляем строку плана */ if (RDG_ROW_PLAN.RCOLS is not null) then - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN); end if; /* Добавляем строку факта */ if (RDG_ROW_FACT.RCOLS is not null) then @@ -631,27 +630,27 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as /* Цикл по коллекции для закрашивания месяцев */ for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR) loop - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT, - SNAME => CR, - SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_FACT, + SNAME => CR, + SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR); end loop; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT); end if; PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); /* Добвим группу для вида ремонта */ SPRJ_GROUP_NAME := SCURTSKCODE; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SPRJ_GROUP_NAME, - SCAPTION => QQ.STECSRVKINDCODE, - BEXPANDABLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SPRJ_GROUP_NAME, + SCAPTION => QQ.STECSRVKINDCODE, + BEXPANDABLE => false); /* Строка плана */ - RDG_ROW_PLAN := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SWRKTYPE', SVALUE => 'План'); + RDG_ROW_PLAN := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SWRKTYPE', SVALUE => 'План'); /* Строка факта */ - RDG_ROW_FACT := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT, SNAME => 'SWRKTYPE', SVALUE => 'Факт'); + RDG_ROW_FACT := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_FACT, SNAME => 'SWRKTYPE', SVALUE => 'Факт'); /* Добавляем в заполненные группы */ PKG_CONTVALLOC1S.PUTS(RCONTAINER => GF, SROWID => SPRJ_GROUP_NAME, SVALUE => ''); end if; @@ -676,7 +675,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as /* Закрашивание месяца плана синим */ if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') = false) then - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue'); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue'); PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SVALUE => ''); @@ -686,7 +685,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as /* Закрашивание дня плана синим */ if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') = false) then - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue'); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue'); PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN', SVALUE => ''); @@ -783,37 +782,37 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as for M in NMS .. NME loop SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO, - SNAME => SPERIODNAME, - SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_P'), - 1)) || ' факт: ' || - HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, - SROWID => SPERIODNAME || '_F'), - 1))); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_INFO, + SNAME => SPERIODNAME, + SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_P'), + 1)) || ' факт: ' || + HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM, + SROWID => SPERIODNAME || '_F'), + 1))); end loop; end loop; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO); end if; /* План для последней записи */ if ((RDG_ROW_PLAN.RCOLS is not null) and (NROWS = 0)) then - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN); end if; /* Факт для последней записи */ if ((RDG_ROW_FACT.RCOLS is not null) and (NROWS = 0)) then CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR); for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR) loop - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT, - SNAME => CR, - SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW_FACT, + SNAME => CR, + SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR)); CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR); end loop; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT); end if; end loop; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); /* Очищаем контейнеры */ PKG_CONTVALLOC1S.PURGE(RCONTAINER => YM); PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR); diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 1153fa3..ce4dcf8 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -390,7 +390,7 @@ create or replace package body PKG_P8PANELS_MECHREC as TDAYS(TDAYS.LAST).DDATE := DDATE; TDAYS(TDAYS.LAST).NVALUE := NVALUE; TDAYS(TDAYS.LAST).NTYPE := NTYPE; - end TJOB_DAYS_ADD; + end TJOB_DAYS_ADD; /* Инциализация списка маршрутных листов (с иерархией) */ procedure UTL_FCROUTLST_IDENT_INIT @@ -911,9 +911,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -921,62 +921,62 @@ create or replace package body PKG_P8PANELS_MECHREC as NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_INFO', - SCAPTION => 'Накладная', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_INFO', + SCAPTION => 'Накладная', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */ if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_STATE', - SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_STATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); end if; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DWORK_DATE', - SCAPTION => 'Дата сдачи', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_VALID_INFO', - SCAPTION => 'Маршрутный лист', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SOUT_DEPARTMENT', - SCAPTION => 'Сдающий цех', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTORE', - SCAPTION => 'Склад цеха потребителя', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_FACT', - SCAPTION => 'Количество сдано', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DWORK_DATE', + SCAPTION => 'Дата сдачи', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_VALID_INFO', + SCAPTION => 'Маршрутный лист', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SOUT_DEPARTMENT', + SCAPTION => 'Сдающий цех', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTORE', + SCAPTION => 'Склад цеха потребителя', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_FACT', + SCAPTION => 'Количество сдано', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); /* Инициализируем список маршрутных листов */ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT); /* Обходим данные */ @@ -1034,7 +1034,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1062,41 +1065,44 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_INFO', - ICURSOR => ICURSOR, - NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_INFO', + ICURSOR => ICURSOR, + NPOSITION => 2); /* Если тип "Приход из подразделений и маршрутные листы", то необходимо включать состояние */ if (NTYPE = NTASK_TYPE_INC_DEPS_RL) then - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_STATE', - ICURSOR => ICURSOR, - NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_STATE', + ICURSOR => ICURSOR, + NPOSITION => 3); end if; - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DWORK_DATE', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_VALID_INFO', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SOUT_DEPARTMENT', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTORE', ICURSOR => ICURSOR, NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_FACT', - ICURSOR => ICURSOR, - NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DWORK_DATE', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_VALID_INFO', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SOUT_DEPARTMENT', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTORE', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_FACT', + ICURSOR => ICURSOR, + NPOSITION => 8); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -1106,7 +1112,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Очищаем отмеченные маршрутные листы */ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); exception when others then /* Очищаем отмеченные маршрутные листы */ @@ -1126,71 +1132,71 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRESPL_CODE', - SCAPTION => 'Обозначение', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRESPL_NAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPROD_QUANT', - SCAPTION => 'Применяемость', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_PLAN', - SCAPTION => 'Количество план', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NREST', - SCAPTION => 'Остаток', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_FACT', - SCAPTION => 'Скомплектовано', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DRES_DATE_TO', - SCAPTION => 'Зарезервировано', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRESPL_NOMEN', - SCAPTION => 'Номенклатура', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRESPL_CODE', + SCAPTION => 'Обозначение', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRESPL_NAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPROD_QUANT', + SCAPTION => 'Применяемость', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_PLAN', + SCAPTION => 'Количество план', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NREST', + SCAPTION => 'Остаток', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_FACT', + SCAPTION => 'Скомплектовано', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DRES_DATE_TO', + SCAPTION => 'Зарезервировано', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRESPL_NOMEN', + SCAPTION => 'Номенклатура', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -1228,7 +1234,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1256,42 +1265,42 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DRES_DATE_TO', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRESPL_NOMEN', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRESPL_CODE', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRESPL_NAME', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NPROD_QUANT', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NREST', ICURSOR => ICURSOR, NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_FACT', - ICURSOR => ICURSOR, - NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DRES_DATE_TO', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRESPL_NOMEN', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRESPL_CODE', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRESPL_NAME', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPROD_QUANT', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NREST', ICURSOR => ICURSOR, NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_FACT', + ICURSOR => ICURSOR, + NPOSITION => 9); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -1299,7 +1308,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCDELIVERYLISTSP_DG_GET; /* Получение таблицы товарных запасов на основании маршрутного листа */ @@ -1317,9 +1326,9 @@ create or replace package body PKG_P8PANELS_MECHREC as NSTORAGE_IN PKG_STD.TREF; -- Рег. номер склада получения NNOMENCLATURE PKG_STD.TREF; -- Рег. номер номенклатуры основного материала NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -1352,50 +1361,50 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Инициализируем даты */ DDATE := TRUNC(sysdate); /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SINDOC', - SCAPTION => 'Партия', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTORE', - SCAPTION => 'Склад', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSALE', - SCAPTION => 'К продаже', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRESTFACT', - SCAPTION => 'Фактический остаток', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRESERV', - SCAPTION => 'Резерв', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRICEMEAS', - SCAPTION => 'Единица измерения', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SINDOC', + SCAPTION => 'Партия', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTORE', + SCAPTION => 'Склад', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSALE', + SCAPTION => 'К продаже', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRESTFACT', + SCAPTION => 'Фактический остаток', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRESERV', + SCAPTION => 'Резерв', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRICEMEAS', + SCAPTION => 'Единица измерения', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -1454,7 +1463,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1482,24 +1494,30 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SINDOC', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTORE', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSALE', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRESTFACT', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRESERV', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPRICEMEAS', - ICURSOR => ICURSOR, - NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SINDOC', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTORE', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSALE', ICURSOR => ICURSOR, NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRESTFACT', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRESERV', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPRICEMEAS', + ICURSOR => ICURSOR, + NPOSITION => 6); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -1507,7 +1525,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end GOODSPARTIES_DG_GET; /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по детали) */ @@ -1522,71 +1540,71 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOCPREF', - SCAPTION => 'Префикс', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOCNUMB', - SCAPTION => 'Номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DEXEC_DATE', - SCAPTION => 'Дата запуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRES_PLAN_NOMEN', - SCAPTION => 'Номенклатура основного материала', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRES_PLAN_NAME', - SCAPTION => 'Наименование основного материала', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT', - SCAPTION => 'Количество запуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_PLAN', - SCAPTION => 'Выдать по норме', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOCPREF', + SCAPTION => 'Префикс', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOCNUMB', + SCAPTION => 'Номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DEXEC_DATE', + SCAPTION => 'Дата запуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRES_PLAN_NOMEN', + SCAPTION => 'Номенклатура основного материала', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRES_PLAN_NAME', + SCAPTION => 'Наименование основного материала', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT', + SCAPTION => 'Количество запуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_PLAN', + SCAPTION => 'Выдать по норме', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -1639,7 +1657,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1666,38 +1687,41 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOCPREF', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DEXEC_DATE', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRES_PLAN_NOMEN', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRES_PLAN_NAME', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOCPREF', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOCNUMB', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DEXEC_DATE', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRES_PLAN_NOMEN', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRES_PLAN_NAME', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 8); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -1705,7 +1729,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCROUTLST_DG_BY_DTL; /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по изделию) */ @@ -1720,65 +1744,65 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOCPREF', - SCAPTION => 'Префикс', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOCNUMB', - SCAPTION => 'Номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DEXEC_DATE', - SCAPTION => 'Дата запуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT', - SCAPTION => 'Количество запуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DREL_DATE', - SCAPTION => 'Дата выпуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NREL_QUANT', - SCAPTION => 'Количество выпуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOCPREF', + SCAPTION => 'Префикс', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOCNUMB', + SCAPTION => 'Номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DEXEC_DATE', + SCAPTION => 'Дата запуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT', + SCAPTION => 'Количество запуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DREL_DATE', + SCAPTION => 'Дата выпуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NREL_QUANT', + SCAPTION => 'Количество выпуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -1829,7 +1853,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1855,34 +1882,37 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOCPREF', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DEXEC_DATE', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DREL_DATE', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NREL_QUANT', - ICURSOR => ICURSOR, - NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOCPREF', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOCNUMB', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DEXEC_DATE', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DREL_DATE', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NREL_QUANT', + ICURSOR => ICURSOR, + NPOSITION => 7); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -1890,7 +1920,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCROUTLST_DG_BY_PRDCT; /* Получение таблицы маршрутных листов, связанных со спецификацией плана (для приходов) */ @@ -1905,77 +1935,77 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOCPREF', - SCAPTION => 'Префикс', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOCNUMB', - SCAPTION => 'Номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DEXEC_DATE', - SCAPTION => 'Дата запуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT', - SCAPTION => 'Количество запуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DREL_DATE', - SCAPTION => 'Дата выпуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NREL_QUANT', - SCAPTION => 'Количество выпуска', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_FACT', - SCAPTION => 'Сдано', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPROCENT', - SCAPTION => '% готовности', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOCPREF', + SCAPTION => 'Префикс', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOCNUMB', + SCAPTION => 'Номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DEXEC_DATE', + SCAPTION => 'Дата запуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT', + SCAPTION => 'Количество запуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DREL_DATE', + SCAPTION => 'Дата выпуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NREL_QUANT', + SCAPTION => 'Количество выпуска', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_FACT', + SCAPTION => 'Сдано', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPROCENT', + SCAPTION => '% готовности', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -2048,7 +2078,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -2076,33 +2109,45 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCPREF', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DEXEC_DATE', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NQUANT', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DREL_DATE', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NREL_QUANT', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_FACT', - ICURSOR => ICURSOR, - NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROCENT', ICURSOR => ICURSOR, NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOCPREF', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOCNUMB', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DEXEC_DATE', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DREL_DATE', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NREL_QUANT', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_FACT', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPROCENT', + ICURSOR => ICURSOR, + NPOSITION => 9); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -2110,7 +2155,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCROUTLST_DG_BY_DEPS; /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */ @@ -2757,6 +2802,11 @@ create or replace package body PKG_P8PANELS_MECHREC as if (NTASK_CLASS = NCLASS_PART_DEFICIT) then /* Определяем пропорции прогресса */ NTASK_PROGRESS := ROUND(C.NREL_FACT / C.NMAIN_QUANT * 100); + /* Если значение прогресса задачи больше 100 */ + if (NTASK_PROGRESS > 100) then + /* Устанавливаем максимальное допустимое значение - 100 */ + NTASK_PROGRESS := 100; + end if; else /* Не требуется */ NTASK_PROGRESS := null; @@ -2975,9 +3025,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -3028,56 +3078,56 @@ create or replace package body PKG_P8PANELS_MECHREC as end FCROUTLSTORD_QUANT_GET; begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_INFO', - SCAPTION => 'Документ (тип, №, дата)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT', - SCAPTION => 'Количество план', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPROCENT', - SCAPTION => 'Готовность партии', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPRIOR_PARTY', - SCAPTION => 'Приоритет партии', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPROD_ORDER', - SCAPTION => 'Заказ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_INFO', + SCAPTION => 'Документ (тип, №, дата)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT', + SCAPTION => 'Количество план', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPROCENT', + SCAPTION => 'Готовность партии', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPRIOR_PARTY', + SCAPTION => 'Приоритет партии', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPROD_ORDER', + SCAPTION => 'Заказ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); /*! Пока отключен */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCHANGE_FACEACC', - SCAPTION => 'Изменить заказ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCHANGE_FACEACC', + SCAPTION => 'Изменить заказ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false, + BORDER => true); /* Считываем рег. номер связанной спецификации из "Производственная программа" */ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP); /* Если спецификация производственной программы найдена */ @@ -3151,7 +3201,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -3179,17 +3232,17 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCROUTLST); /* Добавляем колонку с рег. номером */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true); /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_INFO', - ICURSOR => ICURSOR, - NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_INFO', + ICURSOR => ICURSOR, + NPOSITION => 2); /* Проверяем наличие прямой связи между МЛ и спецификацией плана */ if (PKG_DOCLINKS.FIND(NFLAG_SMART => 1, SIN_UNITCODE => 'CostProductPlansSpecs', @@ -3203,30 +3256,33 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Если сумма "Количество" в "Заказы" больше 0 */ if (NFCROUTLSTORD_QUANT > 0) then /* Указываем её */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NFCROUTLSTORD_QUANT); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NFCROUTLSTORD_QUANT); else /* Берем из заголовка МЛ */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT', - ICURSOR => ICURSOR, - NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT', + ICURSOR => ICURSOR, + NPOSITION => 3); end if; else /* Указываем 0 */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => 0); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => 0); end if; - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROCENT', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NPRIOR_PARTY', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPROD_ORDER', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCHANGE_FACEACC', SVALUE => null); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPROCENT', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPRIOR_PARTY', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPROD_ORDER', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCHANGE_FACEACC', SVALUE => null); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -3237,7 +3293,7 @@ create or replace package body PKG_P8PANELS_MECHREC as P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); exception when others then /* Очищаем отмеченные маршрутные листы */ @@ -3257,9 +3313,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -3292,65 +3348,65 @@ create or replace package body PKG_P8PANELS_MECHREC as end FCROUTLSTSP_STATE_NAME_GET; begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTATE', - SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SOPER_NUMB', - SCAPTION => 'Номер операции', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SROUTSHTSP_NAME', - SCAPTION => 'Операция', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSUBDIV', - SCAPTION => 'Цех, участок', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_PLAN', - SCAPTION => 'План', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_FACT', - SCAPTION => 'Факт', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NT_SHT_PLAN', - SCAPTION => 'Трудоемкость план', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLABOUR_FACT', - SCAPTION => 'Трудоемкость факт', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMUNIT', - SCAPTION => 'ЕИ трудоемкости', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SOPER_NUMB', + SCAPTION => 'Номер операции', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SROUTSHTSP_NAME', + SCAPTION => 'Операция', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSUBDIV', + SCAPTION => 'Цех, участок', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_PLAN', + SCAPTION => 'План', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_FACT', + SCAPTION => 'Факт', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NT_SHT_PLAN', + SCAPTION => 'Трудоемкость план', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLABOUR_FACT', + SCAPTION => 'Трудоемкость факт', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMUNIT', + SCAPTION => 'ЕИ трудоемкости', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -3376,7 +3432,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -3405,44 +3464,50 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); /* Читаем состояние из курсора */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NSTATE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'SSTATE', - SVALUE => FCROUTLSTSP_STATE_NAME_GET(NSTATE => NSTATE)); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SOPER_NUMB', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SROUTSHTSP_NAME', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_FACT', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NT_SHT_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLABOUR_FACT', - ICURSOR => ICURSOR, - NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SMUNIT', ICURSOR => ICURSOR, NPOSITION => 10); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'SSTATE', + SVALUE => FCROUTLSTSP_STATE_NAME_GET(NSTATE => NSTATE)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SOPER_NUMB', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SROUTSHTSP_NAME', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSUBDIV', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_FACT', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NT_SHT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLABOUR_FACT', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMUNIT', + ICURSOR => ICURSOR, + NPOSITION => 10); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -3450,7 +3515,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCROUTLSTSP_DEPT_DG_GET; /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */ @@ -3465,9 +3530,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -3476,43 +3541,43 @@ create or replace package body PKG_P8PANELS_MECHREC as NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTATE', - SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_INFO', - SCAPTION => 'Документ (тип, №, дата)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_FACT', - SCAPTION => 'Количество сдано', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DDUE_DATE', - SCAPTION => 'Дата сдачи', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => true, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_INFO', + SCAPTION => 'Документ (тип, №, дата)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_FACT', + SCAPTION => 'Количество сдано', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DDUE_DATE', + SCAPTION => 'Дата сдачи', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => true, + BORDER => true); /* Считываем рег. номер связанной спецификации из "Производственная программа" */ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP); /* Если спецификация производственной программы найдена */ @@ -3557,7 +3622,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -3582,29 +3650,29 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SSTATE', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_INFO', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_FACT', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DDUE_DATE', - ICURSOR => ICURSOR, - NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTATE', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_INFO', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_FACT', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DDUE_DATE', + ICURSOR => ICURSOR, + NPOSITION => 5); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -3615,7 +3683,7 @@ create or replace package body PKG_P8PANELS_MECHREC as P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); exception when others then /* Очищаем отмеченные маршрутные листы */ @@ -3635,9 +3703,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -3679,16 +3747,16 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Инициализация дней месяца */ procedure INIT_DAYS ( - RDG in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы - DDATE_FROM in date, -- Дата начала месяца - DDATE_TO in date -- Дата окончания месяца + RDG in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы + DDATE_FROM in date, -- Дата начала месяца + DDATE_TO in date -- Дата окончания месяца ) is - DDATE PKG_STD.TLDATE; -- Сформированная дата дня - NMONTH PKG_STD.TNUMBER; -- Текущий месяц - NYEAR PKG_STD.TNUMBER; -- Текущий год - SDATE_NAME PKG_STD.TSTRING; -- Строковое представление даты для наименования колонки - SPARENT_NAME PKG_STD.TSTRING; -- Наименование родительской строки + DDATE PKG_STD.TLDATE; -- Сформированная дата дня + NMONTH PKG_STD.TNUMBER; -- Текущий месяц + NYEAR PKG_STD.TNUMBER; -- Текущий год + SDATE_NAME PKG_STD.TSTRING; -- Строковое представление даты для наименования колонки + SPARENT_NAME PKG_STD.TSTRING; -- Наименование родительской строки begin /* Считываем месяц и год текущей даты */ NMONTH := D_MONTH(DDATE => sysdate); @@ -3703,11 +3771,11 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Формируем наименование родительской строки */ SPARENT_NAME := 'N_' || SDATE_NAME || '_PLAN_FACT'; /* Описываем родительскую колонку таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => SPARENT_NAME, - SCAPTION => LPAD(D_DAY(DDATE), 2, '0'), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SPARENT => 'NVALUE_BY_DAYS'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => SPARENT_NAME, + SCAPTION => LPAD(D_DAY(DDATE), 2, '0'), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SPARENT => 'NVALUE_BY_DAYS'); end loop; end INIT_DAYS; @@ -3745,98 +3813,98 @@ create or replace package body PKG_P8PANELS_MECHREC as FCPRODPLANSP_CALC(NFCPRODPLAN => NFCPRODPLAN, NCOMPANY => NCOMPANY); end if; /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 7); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 7); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTATUS', - SCAPTION => 'Статус', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPROD_ORDER', - SCAPTION => 'Заказ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true, - SHINT => 'Содержит ссылку на связанные сдаточные накладные.', - NWIDTH => 100); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRES_CODE', - SCAPTION => 'Обозначение', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true, - SHINT => 'Содержит ссылку на связанные маршрутные листы.

' || - 'Цвет залики отражает следующие статусы:
' || - 'Зеленый - "Факт" равен "План";
' || - 'Голубой - "План" меньше или равно "Факт" + "Запущено";
' || - 'Желтый - предыдущие условия не выполнены и на текущую дату сумма "Количество план" = 0 или меньше "План", то "Факт" больше или равно "План". ' || - 'Иначе сумма "Количество факт" больше или равно сумме "Количество план";
' || - 'Красный - ни одно из предыдущих условий не выполнено.
', - NWIDTH => 120); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRES_NAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true, - NWIDTH => 200); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSUBDIV', - SCAPTION => 'Цех-получатель', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true, - NWIDTH => 180); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMAIN_QUANT', - SCAPTION => 'План', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NREL_FACT', - SCAPTION => 'Факт', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFCROUTLST_QUANT', - SCAPTION => 'Запущено', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - NWIDTH => 90); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NVALUE_BY_DAYS', - SCAPTION => 'План/факт по дням', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - SHINT => 'Значения по спецификации "График сдачи":
' || - 'Черный - значение "Количество план";
' || - 'Синий - значение "Количество факт".

' || - 'Заливка серым определяет текущий день.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSUM_PLAN', - SCAPTION => 'Сумма "Количество план"', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSUM_FACT', - SCAPTION => 'Сумма "Количество факт"', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTATUS', + SCAPTION => 'Статус', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPROD_ORDER', + SCAPTION => 'Заказ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true, + SHINT => 'Содержит ссылку на связанные сдаточные накладные.', + NWIDTH => 100); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRES_CODE', + SCAPTION => 'Обозначение', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true, + SHINT => 'Содержит ссылку на связанные маршрутные листы.

' || + 'Цвет залики отражает следующие статусы:
' || + 'Зеленый - "Факт" равен "План";
' || + 'Голубой - "План" меньше или равно "Факт" + "Запущено";
' || + 'Желтый - предыдущие условия не выполнены и на текущую дату сумма "Количество план" = 0 или меньше "План", то "Факт" больше или равно "План". ' || + 'Иначе сумма "Количество факт" больше или равно сумме "Количество план";
' || + 'Красный - ни одно из предыдущих условий не выполнено.
', + NWIDTH => 120); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRES_NAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true, + NWIDTH => 200); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSUBDIV', + SCAPTION => 'Цех-получатель', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true, + NWIDTH => 180); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMAIN_QUANT', + SCAPTION => 'План', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NREL_FACT', + SCAPTION => 'Факт', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFCROUTLST_QUANT', + SCAPTION => 'Запущено', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + NWIDTH => 90); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NVALUE_BY_DAYS', + SCAPTION => 'План/факт по дням', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + SHINT => 'Значения по спецификации "График сдачи":
' || + 'Черный - значение "Количество план";
' || + 'Синий - значение "Количество факт".

' || + 'Заливка серым определяет текущий день.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSUM_PLAN', + SCAPTION => 'Сумма "Количество план"', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSUM_FACT', + SCAPTION => 'Сумма "Количество факт"', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); /* Считываем первый и последний день месяца */ P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO); /* Инициализация дней месяца */ @@ -3903,7 +3971,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -3932,33 +4003,36 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NFCPRODPLANSP); /* Добавляем колонку с рег. номером */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCPRODPLANSP, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCPRODPLANSP, BCLEAR => true); /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPROD_ORDER', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRES_CODE', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SMATRES_NAME', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NMAIN_QUANT', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NREL_FACT', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NFCROUTLST_QUANT', - ICURSOR => ICURSOR, - NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPROD_ORDER', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRES_CODE', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRES_NAME', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSUBDIV', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NMAIN_QUANT', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NREL_FACT', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NFCROUTLST_QUANT', + ICURSOR => ICURSOR, + NPOSITION => 8); /* Считываем рег. номер связанной спецификации из "Производственная программа" */ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP); /* Если есть связанная спецификация из производственной программы */ @@ -4023,9 +4097,9 @@ create or replace package body PKG_P8PANELS_MECHREC as group by TMP.DOC_DATE) loop /* Добавляем значение план/факт в соответствующую колонку */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'N_' || TO_CHAR(REC.DOC_DATE, SCOL_PATTERN_DATE) || '_PLAN_FACT', - SVALUE => TO_CHAR(REC.QUANT_PLAN) || '/' || TO_CHAR(REC.QUANT_FACT)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'N_' || TO_CHAR(REC.DOC_DATE, SCOL_PATTERN_DATE) || '_PLAN_FACT', + SVALUE => TO_CHAR(REC.QUANT_PLAN) || '/' || TO_CHAR(REC.QUANT_FACT)); /* Если это ранее текущей даты */ if (REC.DOC_DATE <= DDATE) then /* Добавляем к сумме по строке */ @@ -4034,10 +4108,10 @@ create or replace package body PKG_P8PANELS_MECHREC as end if; end loop; /* Добавляем колонки с суммами */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_PLAN', NVALUE => NSUM_PLAN); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_FACT', NVALUE => NSUM_FACT); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_PLAN', NVALUE => NSUM_PLAN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_FACT', NVALUE => NSUM_FACT); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); /* Очищаем отмеченные маршрутные листы */ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); end loop; @@ -4049,7 +4123,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCPRODPLANSP_DEPT_DG_GET; /* Инициализация записей раздела "Планы и отчеты производства изделий" */ @@ -4598,9 +4672,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -4608,7 +4682,7 @@ create or replace package body PKG_P8PANELS_MECHREC as NVERSION PKG_STD.TREF; -- Версия контрагентов begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Считываем версию контрагентов */ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION); /* Преобразуем номер и размер страницы в номер строк с и по */ @@ -4617,64 +4691,64 @@ create or replace package body PKG_P8PANELS_MECHREC as NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 8); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 8); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSELECT', - SCAPTION => 'Выбран', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPRIOR_PARTY', - SCAPTION => 'Приоритет партии', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SFCROUTLST', - SCAPTION => 'МЛ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMATRES', - SCAPTION => 'ДСЕ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SOPER', - SCAPTION => 'Операция', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_PLAN', - SCAPTION => 'Количество', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLABOUR_PLAN', - SCAPTION => 'Трудоемкость', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SEQCONFIG', - SCAPTION => 'Станок', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NEQCONFIG', - SCAPTION => 'Рег. номер станка', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NEQUIP_PLAN', - SCAPTION => 'Рег. номер оборудования', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DBEG_FACT', - SCAPTION => 'Дата начала факт', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSELECT', + SCAPTION => 'Выбран', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPRIOR_PARTY', + SCAPTION => 'Приоритет партии', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SFCROUTLST', + SCAPTION => 'МЛ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMATRES', + SCAPTION => 'ДСЕ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SOPER', + SCAPTION => 'Операция', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_PLAN', + SCAPTION => 'Количество', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLABOUR_PLAN', + SCAPTION => 'Трудоемкость', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SEQCONFIG', + SCAPTION => 'Станок', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NEQCONFIG', + SCAPTION => 'Рег. номер станка', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NEQUIP_PLAN', + SCAPTION => 'Рег. номер оборудования', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DBEG_FACT', + SCAPTION => 'Дата начала факт', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -4713,7 +4787,10 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Если сортировки не указаны */ if (CORDERS is not null) then /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); else /* Устанавливаем стандартную сортировку */ CSQL := replace(CSQL, '%ORDER_BY%', 'order by T.PRIOR_PARTY asc, T.BEG_PLAN asc'); @@ -4747,48 +4824,51 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NPRIOR_PARTY', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SFCROUTLST', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SMATRES', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SOPER', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLABOUR_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SEQCONFIG', - ICURSOR => ICURSOR, - NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NEQCONFIG', - ICURSOR => ICURSOR, - NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NEQUIP_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 10); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DBEG_FACT', - ICURSOR => ICURSOR, - NPOSITION => 11); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPRIOR_PARTY', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SFCROUTLST', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SMATRES', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SOPER', ICURSOR => ICURSOR, NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLABOUR_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SEQCONFIG', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NEQCONFIG', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NEQUIP_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 10); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DBEG_FACT', + ICURSOR => ICURSOR, + NPOSITION => 11); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -4796,7 +4876,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCJOBSSP_DG_GET; /* Получение составов оборудования подразделения */ @@ -4812,9 +4892,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -4828,44 +4908,44 @@ create or replace package body PKG_P8PANELS_MECHREC as NDICMUNTS_WD PKG_STD.TREF; -- Рег. номер ед. изм. нормочасов begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSELECT', - SCAPTION => 'Выбран', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCODE', - SCAPTION => 'Станок', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSUM_LABOUR', - SCAPTION => 'Загрузка в н/ч', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLOADING', - SCAPTION => 'Загрузка в %', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NEQUIPMENT', - SCAPTION => 'Рег. номер оборудования', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSELECT', + SCAPTION => 'Выбран', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCODE', + SCAPTION => 'Станок', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSUM_LABOUR', + SCAPTION => 'Загрузка в н/ч', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLOADING', + SCAPTION => 'Загрузка в %', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NEQUIPMENT', + SCAPTION => 'Рег. номер оборудования', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); /* Считываем единицу измерения минут */ FIND_DICMUNTS_CODE(NFLAG_SMART => 0, NFLAG_OPTION => 0, @@ -4907,7 +4987,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -4962,17 +5045,20 @@ create or replace package body PKG_P8PANELS_MECHREC as end if; end if; /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NEQCONFIG, BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_LABOUR', NVALUE => NSUM_LABOUR); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOADING', NVALUE => NLOADING); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NEQUIPMENT', - ICURSOR => ICURSOR, - NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NEQCONFIG, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSELECT', NVALUE => 0); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUM_LABOUR', NVALUE => NSUM_LABOUR); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCODE', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOADING', NVALUE => NLOADING); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NEQUIPMENT', + ICURSOR => ICURSOR, + NPOSITION => 3); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -4981,7 +5067,7 @@ create or replace package body PKG_P8PANELS_MECHREC as end; end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end EQCONFIG_DG_GET; /* Инициализация записей раздела "Планы и отчеты производства изделий" */ @@ -5181,8 +5267,8 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -5196,29 +5282,29 @@ create or replace package body PKG_P8PANELS_MECHREC as NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCODE', - SCAPTION => 'Мнемокод', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DBGNDATE', - SCAPTION => 'Действует с', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DENDDATE', - SCAPTION => 'Действует по', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCODE', + SCAPTION => 'Мнемокод', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DBGNDATE', + SCAPTION => 'Действует с', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DENDDATE', + SCAPTION => 'Действует по', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE); /* Считываем первый и последний день месяца */ P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH_YEAR, 'mm.yyyy'), DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO); /* Обходим данные */ @@ -5268,17 +5354,23 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, SNAME => 'DBGNDATE', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, SNAME => 'DENDDATE', ICURSOR => ICURSOR, NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DBGNDATE', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DENDDATE', + ICURSOR => ICURSOR, + NPOSITION => 5); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -5286,7 +5378,7 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end INS_DEPARTMENT_DG_GET; /* Получение загрузки цеха */ @@ -5304,9 +5396,9 @@ create or replace package body PKG_P8PANELS_MECHREC as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -5435,16 +5527,16 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Инициализация дней месяца */ procedure DAYS_INIT ( - RDG in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы - TJOB_DAYS in out nocopy TJOB_DAYS, -- Коллекция дней месяца - DDATE_FROM in date, -- Дата начала месяца - DDATE_TO in date -- Дата окончания месяца + RDG in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы + TJOB_DAYS in out nocopy TJOB_DAYS, -- Коллекция дней месяца + DDATE_FROM in date, -- Дата начала месяца + DDATE_TO in date -- Дата окончания месяца ) is - DDATE PKG_STD.TLDATE; -- Сформированная дата дня - NMONTH PKG_STD.TNUMBER; -- Текущий месяц - NYEAR PKG_STD.TNUMBER; -- Текущий год - SDATE_NAME PKG_STD.TSTRING; -- Строковое представление даты для наименования колонки + DDATE PKG_STD.TLDATE; -- Сформированная дата дня + NMONTH PKG_STD.TNUMBER; -- Текущий месяц + NYEAR PKG_STD.TNUMBER; -- Текущий год + SDATE_NAME PKG_STD.TSTRING; -- Строковое представление даты для наименования колонки begin /* Считываем месяц и год текущей даты */ NMONTH := D_MONTH(DDATE => DDATE_FROM); @@ -5457,18 +5549,18 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Строковое представление даты для наименования колонки */ SDATE_NAME := TO_CHAR(DDATE, SCOL_PATTERN_DATE); /* Описываем родительскую колонку таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'N_' || SDATE_NAME || '_VALUE', - SCAPTION => LPAD(D_DAY(DDATE), 2, '0'), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SPARENT => 'NVALUE_BY_DAYS'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'N_' || SDATE_NAME || '_VALUE', + SCAPTION => LPAD(D_DAY(DDATE), 2, '0'), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SPARENT => 'NVALUE_BY_DAYS'); /* Описываем родительскую колонку таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'N_' || SDATE_NAME || '_TYPE', - SCAPTION => LPAD(D_DAY(DDATE), 2, '0'), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false, - SPARENT => 'NVALUE_BY_DAYS'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'N_' || SDATE_NAME || '_TYPE', + SCAPTION => LPAD(D_DAY(DDATE), 2, '0'), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false, + SPARENT => 'NVALUE_BY_DAYS'); /* Добавляем день в коллекцию */ TJOB_DAYS_ADD(TDAYS => TJOB_DAYS, DDATE => DDATE, NVALUE => null, NTYPE => 0); end loop; @@ -5565,50 +5657,50 @@ create or replace package body PKG_P8PANELS_MECHREC as end DAYS_FILL; begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 4); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSUBDIV', - SCAPTION => 'Участок', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - NWIDTH => 120); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNAME', - SCAPTION => 'Станок', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - NWIDTH => 240); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLOAD', - SCAPTION => 'Загрузка (н/ч)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPROCENT_LOAD', - SCAPTION => 'Загрузка (%)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - NWIDTH => 80); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NVALUE_BY_DAYS', - SCAPTION => 'Загрузка в н/ч по дням месяца', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SHINT => 'Отображает сумму трудоемкости по дням месяца.

' || - 'Цвет значения отражает трудоемкость план/факт.
' || - 'Если дата месяца больше или равна текущей, то отображается трудоемкость "План", иначе "Факт":
' || - 'Черный - сумма трудоемкости "План";
' || - 'Голубой - сумма трудоемкости "Факт";
'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSUBDIV', + SCAPTION => 'Участок', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + NWIDTH => 120); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNAME', + SCAPTION => 'Станок', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + NWIDTH => 240); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLOAD', + SCAPTION => 'Загрузка (н/ч)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPROCENT_LOAD', + SCAPTION => 'Загрузка (%)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + NWIDTH => 80); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NVALUE_BY_DAYS', + SCAPTION => 'Загрузка в н/ч по дням месяца', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SHINT => 'Отображает сумму трудоемкости по дням месяца.

' || + 'Цвет значения отражает трудоемкость план/факт.
' || + 'Если дата месяца больше или равна текущей, то отображается трудоемкость "План", иначе "Факт":
' || + 'Черный - сумма трудоемкости "План";
' || + 'Голубой - сумма трудоемкости "Факт";
'); /* Считываем первый и последний день месяца */ P_FIRST_LAST_DAY(DCALCDATE => TO_DATE(SMONTH_YEAR, 'mm.yyyy'), DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO); /* Считываем единицу измерения нормочасов */ @@ -5681,7 +5773,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -5711,12 +5806,15 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Считываем рег. номер станка */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NEQCONFIG); /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NEQCONFIG, BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SSUBDIV', - ICURSOR => ICURSOR, - NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NEQCONFIG, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SNAME', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSUBDIV', + ICURSOR => ICURSOR, + NPOSITION => 3); /* Считываем загрузку в нормочасах */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 4, NVALUE => NLOAD); /* Округляем загрузку */ @@ -5730,8 +5828,8 @@ create or replace package body PKG_P8PANELS_MECHREC as NPROCENT_LOAD := 0; end if; /* Устанавливаем загрузку */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOAD', NVALUE => NLOAD); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPROCENT_LOAD', NVALUE => NPROCENT_LOAD); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLOAD', NVALUE => NLOAD); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPROCENT_LOAD', NVALUE => NPROCENT_LOAD); /* Если у оборудования есть загрузка */ if (NLOAD <> 0) then /* Обходим загруженность по дням */ @@ -5776,17 +5874,19 @@ create or replace package body PKG_P8PANELS_MECHREC as for I in TDAYS.FIRST .. TDAYS.LAST loop /* Отмечаем значение дня */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_VALUE', - NVALUE => ROUND(TDAYS(I).NVALUE, 1)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || + '_VALUE', + NVALUE => ROUND(TDAYS(I).NVALUE, 1)); /* Если рабочий календарь считан */ if (NENPERIOD is not null) then /* Отмечаем тип дня */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_TYPE', - NVALUE => DAY_TYPE_GET(NENPERIOD => NENPERIOD, - DDATE => TDAYS(I).DDATE, - DCURRENT_DAY => DCURRENT_DAY)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || + '_TYPE', + NVALUE => DAY_TYPE_GET(NENPERIOD => NENPERIOD, + DDATE => TDAYS(I).DDATE, + DCURRENT_DAY => DCURRENT_DAY)); end if; /* Обнуляем значение */ TDAYS(I).NVALUE := null; @@ -5796,22 +5896,24 @@ create or replace package body PKG_P8PANELS_MECHREC as for I in TDAYS.FIRST .. TDAYS.LAST loop /* Отмечаем значение дня */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_VALUE', - NVALUE => null); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || + '_VALUE', + NVALUE => null); /* Если рабочий календарь считан */ if (NENPERIOD is not null) then /* Отмечаем тип дня */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || '_TYPE', - NVALUE => DAY_TYPE_GET(NENPERIOD => NENPERIOD, - DDATE => TDAYS(I).DDATE, - DCURRENT_DAY => DCURRENT_DAY)); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'N_' || TO_CHAR(TDAYS(I).DDATE, SCOL_PATTERN_DATE) || + '_TYPE', + NVALUE => DAY_TYPE_GET(NENPERIOD => NENPERIOD, + DDATE => TDAYS(I).DDATE, + DCURRENT_DAY => DCURRENT_DAY)); end if; end loop; end if; /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -5820,7 +5922,7 @@ create or replace package body PKG_P8PANELS_MECHREC as end; end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCJOBS_DEP_LOAD_DG_GET; /* @@ -5839,9 +5941,9 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -5850,40 +5952,40 @@ create or replace package body PKG_P8PANELS_MECHREC as NDICMUNTS_WD PKG_STD.TREF; -- Рег. номер ед. измерения нормочасов begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNUMB', - SCAPTION => '% п/п', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SOPERATION', - SCAPTION => 'Содержание работ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SEXECUTOR', - SCAPTION => 'Исполнитель', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NREMN_LABOUR', - SCAPTION => 'Остаточная трудоемкость, в н/ч', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNUMB', + SCAPTION => '% п/п', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SOPERATION', + SCAPTION => 'Содержание работ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SEXECUTOR', + SCAPTION => 'Исполнитель', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NREMN_LABOUR', + SCAPTION => 'Остаточная трудоемкость, в н/ч', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); /* Если спецификация считалась */ if (NFCPRODPLANSP is not null) then /* Инициализируем список маршрутных листов */ @@ -5923,7 +6025,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -5948,29 +6053,29 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SNUMB', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SOPERATION', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SEXECUTOR', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NREMN_LABOUR', - ICURSOR => ICURSOR, - NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SNUMB', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SOPERATION', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SEXECUTOR', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NREMN_LABOUR', + ICURSOR => ICURSOR, + NPOSITION => 5); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -5981,7 +6086,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Очищаем отмеченные маршрутные листы */ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT); /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); exception when others then /* Очищаем отмеченные маршрутные листы */ @@ -6001,49 +6106,49 @@ create or replace package body PKG_P8PANELS_MECHREC as ) is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса begin /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNOMEN', - SCAPTION => 'Номенклатура', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NQUANT_PLAN', - SCAPTION => 'Применяемость', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPROVIDER', - SCAPTION => 'Поставщик', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NDEFICIT', - SCAPTION => 'Дефицит', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNOMEN', + SCAPTION => 'Номенклатура', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NQUANT_PLAN', + SCAPTION => 'Применяемость', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPROVIDER', + SCAPTION => 'Поставщик', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NDEFICIT', + SCAPTION => 'Дефицит', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); /* Если спецификация считалась */ if (NFCPRODPLANSP is not null) then begin @@ -6073,7 +6178,10 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -6097,29 +6205,29 @@ create or replace package body PKG_P8PANELS_MECHREC as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SNOMEN', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NQUANT_PLAN', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPROVIDER', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NDEFICIT', - ICURSOR => ICURSOR, - NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SNOMEN', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPROVIDER', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NDEFICIT', + ICURSOR => ICURSOR, + NPOSITION => 5); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; exception when others then @@ -6128,7 +6236,7 @@ create or replace package body PKG_P8PANELS_MECHREC as end; end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end FCDELIVSH_DG_BY_LINKED_GET; /* Получение изображения для записи "Планы и отчеты производства изделий" по мат. ресурсу */ @@ -6190,11 +6298,11 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Определяем детализацию по прогрессу */ case when (NPROGRESS >= 70) then - SRESULT := 'Основная сборка: Стыковка агрегатов выполнена'; + SRESULT := 'Основная сборка'; when (NPROGRESS >= 40) then - SRESULT := 'Изготовление агрегатов: Фюзеляж и ОЧК не переданы в цех ОС'; + SRESULT := 'Изготовление агрегатов'; when (NPROGRESS >= 10) then - SRESULT := 'Изготовление ДСЕ: Фюзеляж и ОЧК не укомлектованы ДСЕ'; + SRESULT := 'Изготовление ДСЕ'; else SRESULT := 'Изготовление ДСЕ не начато'; end case; @@ -6213,16 +6321,18 @@ create or replace package body PKG_P8PANELS_MECHREC as D_YEAR(SP.REP_DATE_TO) NYEAR, COALESCE(SP.LABOUR_FACT, 0) NLABOUR_FACT, COALESCE(SP.LABOUR_PLAN, 0) NLABOUR_PLAN - from FCPRODPLAN P - left outer join FCPRODPLANSP SP - on P.RN = SP.PRN - and ((SP.LABOUR_PLAN is not null) or (SP.LABOUR_FACT is not null)), FINSTATE FS, ENPERIOD EN + from FCPRODPLAN P, + FCPRODPLANSP SP, + FINSTATE FS, + ENPERIOD EN where P.CRN = NCRN and P.CATEGORY = NFCPRODPLAN_CATEGORY_MON and P.STATUS = NFCPRODPLAN_STATUS_MON and FS.RN = P.TYPE and FS.CODE = SFCPRODPLAN_TYPE_MON and EN.RN = P.CALC_PERIOD + and SP.PRN = P.RN + and ((SP.LABOUR_PLAN is not null) or (SP.LABOUR_FACT is not null)) and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ null from USERPRIV UP @@ -6322,6 +6432,10 @@ create or replace package body PKG_P8PANELS_MECHREC as and P.CATEGORY = NFCPRODPLAN_CATEGORY_MON and P.STATUS = NFCPRODPLAN_STATUS_MON and P.COMPANY = GET_SESSION_COMPANY() + and exists (select null + from FCPRODPLANSP S + where S.PRN = P.RN + and ((S.LABOUR_PLAN is not null) or (S.LABOUR_FACT is not null))) and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ null from USERPRIV UP @@ -6419,17 +6533,7 @@ create or replace package body PKG_P8PANELS_MECHREC as into NRESULT from FCPRODPLAN T, FCPRODPLANSP S - where T.RN = (select P.RN - from DOCLINKS L, - FCPRODPLAN P, - FCPRODPLANSP SP - where SP.RN = NFCPRODPLANSP - and L.IN_DOCUMENT = SP.PRN - and L.IN_UNITCODE = 'CostProductPlans' - and L.OUT_UNITCODE = 'CostProductPlans' - and P.RN = L.OUT_DOCUMENT - and P.CATEGORY = 1 - and ROWNUM = 1) + where S.PRN_NODE = NFCPRODPLANSP and S.PRN = T.RN and S.PRODCMPSP = NPRODCMPSP; exception diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck index 960779a..424a7b0 100644 --- a/db/PKG_P8PANELS_PROJECTS.pck +++ b/db/PKG_P8PANELS_PROJECTS.pck @@ -1026,11 +1026,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора - RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TDG_COL_VALS; -- Предопределённые значения столбцов NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -1038,250 +1038,250 @@ create or replace package body PKG_P8PANELS_PROJECTS as NECON_RESP_DP PKG_STD.TREF; -- Рег. номер ДС "Ответственный экономист" begin /* Читаем фильтры */ - RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); + RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); /* Читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCODE', - SCAPTION => 'Код', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDMNEMO', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDNAME', - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNAME_USL', - SCAPTION => 'Условное наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDNAME_USL', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SEXPECTED_RES', - SCAPTION => 'Ожидаемые результаты', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRJTYPE', - SCAPTION => 'Тип', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDPROJECTTYPE', - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SEXT_CUST', - SCAPTION => 'Заказчик', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDEXT_CUST', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SGOVCNTRID', - SCAPTION => 'ИГК', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_OSN', - SCAPTION => 'Документ-основание', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_SDOC_OSN', - SCAPTION => 'Документ-основание (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_SDOC_OSN', - SCAPTION => 'Документ-основание (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSUBDIV_RESP', - SCAPTION => 'Подразделение-исполнитель', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SRESPONSIBLE', - SCAPTION => 'Ответственный исполнитель', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SECON_RESP', - SCAPTION => 'Ответственный экономист', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 2); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 3); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 4); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 5); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSTATE', - SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'CGSTATE', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DBEGPLAN', - SCAPTION => 'Дата начала', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDPLANBEGFrom', - SCOND_TO => 'EDPLANBEGTo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DENDPLAN', - SCAPTION => 'Дата окончания', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDPLANENDFrom', - SCOND_TO => 'EDPLANENDTo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_SUM', - SCAPTION => 'Стоимость', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCURNAMES', - SCAPTION => 'Валюта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFIN_IN', - SCAPTION => 'Входящее финансирование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_NFIN_IN', - SCAPTION => 'Входящее финансирование (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_NFIN_IN', - SCAPTION => 'Входящее финансирование (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFIN_OUT', - SCAPTION => 'Исходящее финансирование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_NFIN_OUT', - SCAPTION => 'Исходящее финансирование (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_NFIN_OUT', - SCAPTION => 'Исходящее финансирование (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_FIN', - SCAPTION => 'Фин-е (исх.)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_FIN', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителями в рамках проекта.
' || - 'Требует внимания - в проекте есть этапы, для которых не все выставленные соисполнителями счета оплачены.
' || - 'В норме - нет этапов с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_CONTR', - SCAPTION => 'Контр-я', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_CONTR', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Контрактация - контроль суммы договоров, заключеных с соисполнителями в рамках проекта.
' || - 'Требует внимания - в проекте есть этапы, для которых сумма договоров с соисполнителями превышает заложенные в калькуляцию плановые показатели.
' || - 'В норме - нет этапов с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для всех этапов заданы плановые калькуляции.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_COEXEC', - SCAPTION => 'Соисп-е', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_COEXEC', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Соисполнение - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках проекта.
' || - 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' || - TO_CHAR(NDAYS_LEFT_LIMIT) || - ' дней, при этом зафиксирован положительный остаток к поставке/актированию по договорам соисполнителей данного этапа.
' || - 'В норме - нет этапов с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями и плановые сроки окончания.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_PERIOD', - SCAPTION => 'Сроки', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_PERIOD', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Сроки - контроль сроков исполнения работ по проекту.
' || - 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' || - TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' || - 'В норме - нет этапов с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов заданы плановые сроки окончания.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_COST', - SCAPTION => 'Затраты', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_COST', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Затраты - контроль затрат, понесённых в ходе выполнения работ по проекту.
' || - 'Требует внимания - в проекте есть этапы, для которых сумма фактических затрат по статьям калькуляции превысила плановую.
' || - 'В норме - нет этапов с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_ACT', - SCAPTION => 'Актир-е', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_ACT', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Актирование - контроль актирования работ, выполненных по проекту, со стороны заказчика.
' || - 'Требует внимания - в проекте есть этапы, в состоянии "Закрыт", но при этом в Системе отсутствует утверждённая "Расходная накладная на отпуск потребителю" для данного этапа.
' || - 'В норме - нет этапов с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что этапы, по которым завершены работы, переведены в состояние "Закрыт".'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_READY', - SCAPTION => 'Готов (%, затраты)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCOST_READYFrom', - SCOND_TO => 'EDCOST_READYTo', - BORDER => true, - BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCODE', + SCAPTION => 'Код', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDMNEMO', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDNAME', + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNAME_USL', + SCAPTION => 'Условное наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDNAME_USL', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SEXPECTED_RES', + SCAPTION => 'Ожидаемые результаты', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRJTYPE', + SCAPTION => 'Тип', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDPROJECTTYPE', + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SEXT_CUST', + SCAPTION => 'Заказчик', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDEXT_CUST', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SGOVCNTRID', + SCAPTION => 'ИГК', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_OSN', + SCAPTION => 'Документ-основание', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_SDOC_OSN', + SCAPTION => 'Документ-основание (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_SDOC_OSN', + SCAPTION => 'Документ-основание (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSUBDIV_RESP', + SCAPTION => 'Подразделение-исполнитель', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SRESPONSIBLE', + SCAPTION => 'Ответственный исполнитель', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SECON_RESP', + SCAPTION => 'Ответственный экономист', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 2); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 3); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 4); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 5); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSTATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'CGSTATE', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DBEGPLAN', + SCAPTION => 'Дата начала', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDPLANBEGFrom', + SCOND_TO => 'EDPLANBEGTo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DENDPLAN', + SCAPTION => 'Дата окончания', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDPLANENDFrom', + SCOND_TO => 'EDPLANENDTo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_SUM', + SCAPTION => 'Стоимость', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCURNAMES', + SCAPTION => 'Валюта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFIN_IN', + SCAPTION => 'Входящее финансирование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_NFIN_IN', + SCAPTION => 'Входящее финансирование (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_NFIN_IN', + SCAPTION => 'Входящее финансирование (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFIN_OUT', + SCAPTION => 'Исходящее финансирование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_NFIN_OUT', + SCAPTION => 'Исходящее финансирование (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_NFIN_OUT', + SCAPTION => 'Исходящее финансирование (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_FIN', + SCAPTION => 'Фин-е (исх.)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_FIN', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителями в рамках проекта.
' || + 'Требует внимания - в проекте есть этапы, для которых не все выставленные соисполнителями счета оплачены.
' || + 'В норме - нет этапов с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_CONTR', + SCAPTION => 'Контр-я', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_CONTR', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Контрактация - контроль суммы договоров, заключеных с соисполнителями в рамках проекта.
' || + 'Требует внимания - в проекте есть этапы, для которых сумма договоров с соисполнителями превышает заложенные в калькуляцию плановые показатели.
' || + 'В норме - нет этапов с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для всех этапов заданы плановые калькуляции.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_COEXEC', + SCAPTION => 'Соисп-е', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_COEXEC', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Соисполнение - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках проекта.
' || + 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' || + TO_CHAR(NDAYS_LEFT_LIMIT) || + ' дней, при этом зафиксирован положительный остаток к поставке/актированию по договорам соисполнителей данного этапа.
' || + 'В норме - нет этапов с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями и плановые сроки окончания.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_PERIOD', + SCAPTION => 'Сроки', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_PERIOD', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Сроки - контроль сроков исполнения работ по проекту.
' || + 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' || + TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' || + 'В норме - нет этапов с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов заданы плановые сроки окончания.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_COST', + SCAPTION => 'Затраты', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_COST', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Затраты - контроль затрат, понесённых в ходе выполнения работ по проекту.
' || + 'Требует внимания - в проекте есть этапы, для которых сумма фактических затрат по статьям калькуляции превысила плановую.
' || + 'В норме - нет этапов с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_ACT', + SCAPTION => 'Актир-е', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_ACT', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Актирование - контроль актирования работ, выполненных по проекту, со стороны заказчика.
' || + 'Требует внимания - в проекте есть этапы, в состоянии "Закрыт", но при этом в Системе отсутствует утверждённая "Расходная накладная на отпуск потребителю" для данного этапа.
' || + 'В норме - нет этапов с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что этапы, по которым завершены работы, переведены в состояние "Закрыт".'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_READY', + SCAPTION => 'Готов (%, затраты)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCOST_READYFrom', + SCOND_TO => 'EDCOST_READYTo', + BORDER => true, + BFILTER => true); /* Определим дополнительные свойства - ответственный экономист */ FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SDP_SECON_RESP, NRN => NECON_RESP_DP); /* Обходим данные */ @@ -1338,14 +1338,17 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Учтём фильтры */ - PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, - NCOMPANY => NCOMPANY, - SUNIT => 'Projects', - SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.COND'), - RDATA_GRID => RDG, - RFILTERS => RF); + PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT, + NCOMPANY => NCOMPANY, + SUNIT => 'Projects', + SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.COND'), + RDATA_GRID => RDG, + RFILTERS => RF); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -1396,119 +1399,131 @@ create or replace package body PKG_P8PANELS_PROJECTS as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SNAME_USL', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SEXPECTED_RES', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJTYPE', ICURSOR => ICURSOR, NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SEXT_CUST', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SGOVCNTRID', - ICURSOR => ICURSOR, - NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOC_OSN', ICURSOR => ICURSOR, NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_SDOC_OSN', - ICURSOR => ICURSOR, - NPOSITION => 10); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_SDOC_OSN', - ICURSOR => ICURSOR, - NPOSITION => 11); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SSUBDIV_RESP', - ICURSOR => ICURSOR, - NPOSITION => 12); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SRESPONSIBLE', - ICURSOR => ICURSOR, - NPOSITION => 13); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SECON_RESP', - ICURSOR => ICURSOR, - NPOSITION => 14); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSTATE', ICURSOR => ICURSOR, NPOSITION => 15); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DBEGPLAN', - ICURSOR => ICURSOR, - NPOSITION => 16); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DENDPLAN', - ICURSOR => ICURSOR, - NPOSITION => 17); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCOST_SUM', - ICURSOR => ICURSOR, - NPOSITION => 18); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SCURNAMES', - ICURSOR => ICURSOR, - NPOSITION => 19); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NFIN_IN', ICURSOR => ICURSOR, NPOSITION => 20); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_NFIN_IN', - ICURSOR => ICURSOR, - NPOSITION => 21); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_NFIN_IN', - ICURSOR => ICURSOR, - NPOSITION => 22); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NFIN_OUT', - ICURSOR => ICURSOR, - NPOSITION => 23); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_NFIN_OUT', - ICURSOR => ICURSOR, - NPOSITION => 24); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_NFIN_OUT', - ICURSOR => ICURSOR, - NPOSITION => 25); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_FIN', - ICURSOR => ICURSOR, - NPOSITION => 26); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_CONTR', - ICURSOR => ICURSOR, - NPOSITION => 27); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_COEXEC', - ICURSOR => ICURSOR, - NPOSITION => 28); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_PERIOD', - ICURSOR => ICURSOR, - NPOSITION => 29); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_COST', - ICURSOR => ICURSOR, - NPOSITION => 30); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_ACT', - ICURSOR => ICURSOR, - NPOSITION => 31); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCOST_READY', - ICURSOR => ICURSOR, - NPOSITION => 32); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SNAME_USL', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SEXPECTED_RES', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPRJTYPE', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SEXT_CUST', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SGOVCNTRID', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_OSN', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_SDOC_OSN', + ICURSOR => ICURSOR, + NPOSITION => 10); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_SDOC_OSN', + ICURSOR => ICURSOR, + NPOSITION => 11); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSUBDIV_RESP', + ICURSOR => ICURSOR, + NPOSITION => 12); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SRESPONSIBLE', + ICURSOR => ICURSOR, + NPOSITION => 13); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SECON_RESP', + ICURSOR => ICURSOR, + NPOSITION => 14); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NSTATE', + ICURSOR => ICURSOR, + NPOSITION => 15); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DBEGPLAN', + ICURSOR => ICURSOR, + NPOSITION => 16); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DENDPLAN', + ICURSOR => ICURSOR, + NPOSITION => 17); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCOST_SUM', + ICURSOR => ICURSOR, + NPOSITION => 18); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCURNAMES', + ICURSOR => ICURSOR, + NPOSITION => 19); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NFIN_IN', + ICURSOR => ICURSOR, + NPOSITION => 20); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_NFIN_IN', + ICURSOR => ICURSOR, + NPOSITION => 21); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_NFIN_IN', + ICURSOR => ICURSOR, + NPOSITION => 22); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NFIN_OUT', + ICURSOR => ICURSOR, + NPOSITION => 23); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_NFIN_OUT', + ICURSOR => ICURSOR, + NPOSITION => 24); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_NFIN_OUT', + ICURSOR => ICURSOR, + NPOSITION => 25); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_FIN', + ICURSOR => ICURSOR, + NPOSITION => 26); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_CONTR', + ICURSOR => ICURSOR, + NPOSITION => 27); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_COEXEC', + ICURSOR => ICURSOR, + NPOSITION => 28); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_PERIOD', + ICURSOR => ICURSOR, + NPOSITION => 29); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_COST', + ICURSOR => ICURSOR, + NPOSITION => 30); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_ACT', + ICURSOR => ICURSOR, + NPOSITION => 31); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCOST_READY', + ICURSOR => ICURSOR, + NPOSITION => 32); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -1518,7 +1533,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end LIST; /* Сфодный график проектов */ @@ -1535,8 +1550,8 @@ create or replace package body PKG_P8PANELS_PROJECTS as SYEAR_COL_NAME PKG_STD.TSTRING; -- Наименование колонки для года SPRJ_GROUP_NAME PKG_STD.TSTRING; -- Наименование группы для проекта BEXPANDED boolean; -- Флаг раскрытости уровня - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы begin /* Определим даты начала и окончания проектов */ select TRUNC(min(DBEGPLAN), 'mm'), @@ -1563,40 +1578,40 @@ create or replace package body PKG_P8PANELS_PROJECTS as and PS.ENDPLAN is not null and PS.HRN is null); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1); /* Если есть данные о начале и окончании проектов в портфеле */ if ((DFROM is not null) and (DTO is not null)) then /* Формируем структуру заголовка */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SJOB', - SCAPTION => 'Работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - NWIDTH => 300); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SRESP', - SCAPTION => 'Ответственный', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSTATE', - SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DFROM', - SCAPTION => 'Начало работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DTO', - SCAPTION => 'Окончание работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SJOB', + SCAPTION => 'Работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + NWIDTH => 300); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SRESP', + SCAPTION => 'Ответственный', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSTATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DFROM', + SCAPTION => 'Начало работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DTO', + SCAPTION => 'Окончание работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BVISIBLE => false); for Y in EXTRACT(year from DFROM) .. EXTRACT(year from DTO) loop SYEAR_COL_NAME := TO_CHAR(Y); @@ -1605,22 +1620,22 @@ create or replace package body PKG_P8PANELS_PROJECTS as else BEXPANDED := false; end if; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => SYEAR_COL_NAME, - SCAPTION => TO_CHAR(Y), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BEXPANDABLE => true, - BEXPANDED => BEXPANDED); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => SYEAR_COL_NAME, + SCAPTION => TO_CHAR(Y), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BEXPANDABLE => true, + BEXPANDED => BEXPANDED); for M in 1 .. 12 loop DFROM_CUR := TO_DATE('01.' || LPAD(TO_CHAR(M), 2, '0') || '.' || TO_CHAR(Y), 'dd.mm.yyyy'); DTO_CUR := LAST_DAY(DFROM_CUR); if ((DFROM_CUR >= DFROM) and (DTO_CUR <= DTO)) then - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => SYEAR_COL_NAME || '_' || TO_CHAR(M), - SCAPTION => LPAD(TO_CHAR(M), 2, '0'), - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SPARENT => SYEAR_COL_NAME); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => SYEAR_COL_NAME || '_' || TO_CHAR(M), + SCAPTION => LPAD(TO_CHAR(M), 2, '0'), + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SPARENT => SYEAR_COL_NAME); end if; end loop; end loop; @@ -1635,11 +1650,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as loop /* Добвим группу для проекта */ SPRJ_GROUP_NAME := PR.RN; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SPRJ_GROUP_NAME, - SCAPTION => PR.CODE || ' - ' || PR.NAME, - BEXPANDABLE => true, - BEXPANDED => true); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SPRJ_GROUP_NAME, + SCAPTION => PR.CODE || ' - ' || PR.NAME, + BEXPANDABLE => true, + BEXPANDED => true); /* Обходим этапы проекта */ for ST in (select PS.RN NRN, trim(PS.NUMB) || ' - ' || PS.NAME SJOB, @@ -1660,21 +1675,21 @@ create or replace package body PKG_P8PANELS_PROJECTS as order by PS.NUMB) loop /* Инициализируем строку */ - RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME); + RDG_ROW := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SPRJ_GROUP_NAME); /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => ST.NRN); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SJOB', SVALUE => ST.SJOB); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRESP', SVALUE => ST.SRESP); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATE', NVALUE => ST.NSTATE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DFROM', DVALUE => ST.DFROM); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DTO', DVALUE => ST.DTO); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => ST.NRN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SJOB', SVALUE => ST.SJOB); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SRESP', SVALUE => ST.SRESP); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSTATE', NVALUE => ST.NSTATE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DFROM', DVALUE => ST.DFROM); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DTO', DVALUE => ST.DTO); /* Добавим строку для этапа */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; end loop; end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); end GRAPH; /* График по данным проектов - "Топ проблем" */ @@ -2550,11 +2565,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора - RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TDG_COL_VALS; -- Предопределённые значения столбцов NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по NFPDARTCL_REALIZ PKG_STD.TREF; -- Рег. номер статьи калькуляции для реализации @@ -2568,246 +2583,251 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* Определим рег. номер статьи калькуляции для учёта реализации */ FIND_FPDARTCL_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SFPDARTCL_REALIZ, NRN => NFPDARTCL_REALIZ); /* Читаем фильтры */ - RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); + RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); /* Читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNUMB', - SCAPTION => 'Номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDNUMB', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDNAME', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SEXPECTED_RES', - SCAPTION => 'Ожидаемые результаты', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SFACEACC', - SCAPTION => 'Шифр затрат', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 2); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 3); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 4); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 5); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSTATE', - SCAPTION => 'Состояние', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'CGSTATE', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DBEGPLAN', - SCAPTION => 'Дата начала', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDPLANBEGFrom', - SCOND_TO => 'EDPLANBEGTo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DENDPLAN', - SCAPTION => 'Дата окончания', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDPLANENDFrom', - SCOND_TO => 'EDPLANENDTo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_SUM', - SCAPTION => 'Стоимость', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCURNAMES', - SCAPTION => 'Валюта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFIN_IN', - SCAPTION => 'Входящее финансирование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_NFIN_IN', - SCAPTION => 'Входящее финансирование (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_NFIN_IN', - SCAPTION => 'Входящее финансирование (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFIN_OUT', - SCAPTION => 'Исходящее финансирование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_NFIN_OUT', - SCAPTION => 'Исходящее финансирование (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_NFIN_OUT', - SCAPTION => 'Исходящее финансирование (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_FIN', - SCAPTION => 'Фин-е (исх.)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_FIN', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителями по этапу.
' || - 'Требует внимания - к этапу привязаны договоры соисполнителей, для которых не все выставленные соисполнителями счета оплачены.
' || - 'В норме - нет договоров соисполнения с отклонениями, описанными выше.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_CONTR', - SCAPTION => 'Контр-я', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_CONTR', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Контрактация - контроль суммы договоров, заключеных с соисполнителями в рамках этапа.
' || - 'Требует внимания - сумма договоров с соисполнителями, привязанных к этапу, превышает заложенные в калькуляцию плановые показатели по сответствующим статьям.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана калькуляция и для контрагентских статей указаны плановые показатели.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_COEXEC', - SCAPTION => 'Соисп-е', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_COEXEC', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Соисполнение - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках этапа.
' || - 'Требует внимания - до окончания этапа осталось менее ' || - TO_CHAR(NDAYS_LEFT_LIMIT) || - ' дней, при этом зафиксирован положительный остаток к поставке/актированию по привязанным к нему договорам соисполнителей.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана привязка к договорам с соисполнителями и плановый срок окончания.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NDAYS_LEFT', - SCAPTION => 'Дней до окончания', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_PERIOD', - SCAPTION => 'Сроки', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_PERIOD', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Сроки - контроль сроков исполнения работ по этапу.
' || - 'Требует внимания - до окончания этапа осталось менее ' || - TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задан плановый срок окончания.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_FACT', - SCAPTION => 'Сумма фактических затрат', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_NCOST_FACT', - SCAPTION => 'Сумма фактических затрат (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_NCOST_FACT', - SCAPTION => 'Сумма фактических затрат (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSUMM_REALIZ', - SCAPTION => 'Сумма реализации', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_NSUMM_REALIZ', - SCAPTION => 'Сумма реализации (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_NSUMM_REALIZ', - SCAPTION => 'Сумма реализации (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSUMM_INCOME', - SCAPTION => 'Сумма прибыли', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NINCOME_PRC', - SCAPTION => 'Процент прибыли', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_COST', - SCAPTION => 'Затраты', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_COST', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Затраты - контроль затрат, понесённых в ходе выполнения работ по этапу.
' || - 'Требует внимания - сумма фактических затрат этапа по некоторым статьям калькуляции превысила плановую.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_ACT', - SCAPTION => 'Актир-е', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_ACT', - BORDER => true, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Актирование - контроль актирования работ, выполненных по этапу, со стороны заказчика.
' || - 'Требует внимания - этап в состоянии "Закрыт", но при этом в Системе отсутствует утверждённая "Расходная накладная на отпуск потребителю" для данного этапа.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что этап, если работы по нему завершены, переведен в состояние "Закрыт".'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_READY', - SCAPTION => 'Готов (%, затраты)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCOST_READYFrom', - SCOND_TO => 'EDCOST_READYTo', - BORDER => true, - BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNUMB', + SCAPTION => 'Номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDNUMB', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDNAME', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SEXPECTED_RES', + SCAPTION => 'Ожидаемые результаты', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SFACEACC', + SCAPTION => 'Шифр затрат', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 2); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 3); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 4); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 5); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSTATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'CGSTATE', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DBEGPLAN', + SCAPTION => 'Дата начала', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDPLANBEGFrom', + SCOND_TO => 'EDPLANBEGTo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DENDPLAN', + SCAPTION => 'Дата окончания', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDPLANENDFrom', + SCOND_TO => 'EDPLANENDTo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_SUM', + SCAPTION => 'Стоимость', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCURNAMES', + SCAPTION => 'Валюта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFIN_IN', + SCAPTION => 'Входящее финансирование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_NFIN_IN', + SCAPTION => 'Входящее финансирование (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_NFIN_IN', + SCAPTION => 'Входящее финансирование (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFIN_OUT', + SCAPTION => 'Исходящее финансирование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_NFIN_OUT', + SCAPTION => 'Исходящее финансирование (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_NFIN_OUT', + SCAPTION => 'Исходящее финансирование (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_FIN', + SCAPTION => 'Фин-е (исх.)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_FIN', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителями по этапу.
' || + 'Требует внимания - к этапу привязаны договоры соисполнителей, для которых не все выставленные соисполнителями счета оплачены.
' || + 'В норме - нет договоров соисполнения с отклонениями, описанными выше.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_CONTR', + SCAPTION => 'Контр-я', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_CONTR', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Контрактация - контроль суммы договоров, заключеных с соисполнителями в рамках этапа.
' || + 'Требует внимания - сумма договоров с соисполнителями, привязанных к этапу, превышает заложенные в калькуляцию плановые показатели по сответствующим статьям.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана калькуляция и для контрагентских статей указаны плановые показатели.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_COEXEC', + SCAPTION => 'Соисп-е', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_COEXEC', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Соисполнение - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках этапа.
' || + 'Требует внимания - до окончания этапа осталось менее ' || + TO_CHAR(NDAYS_LEFT_LIMIT) || + ' дней, при этом зафиксирован положительный остаток к поставке/актированию по привязанным к нему договорам соисполнителей.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана привязка к договорам с соисполнителями и плановый срок окончания.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NDAYS_LEFT', + SCAPTION => 'Дней до окончания', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_PERIOD', + SCAPTION => 'Сроки', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_PERIOD', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Сроки - контроль сроков исполнения работ по этапу.
' || + 'Требует внимания - до окончания этапа осталось менее ' || + TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задан плановый срок окончания.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_FACT', + SCAPTION => 'Сумма фактических затрат', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_NCOST_FACT', + SCAPTION => 'Сумма фактических затрат (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_NCOST_FACT', + SCAPTION => 'Сумма фактических затрат (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSUMM_REALIZ', + SCAPTION => 'Сумма реализации', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_NSUMM_REALIZ', + SCAPTION => 'Сумма реализации (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_NSUMM_REALIZ', + SCAPTION => 'Сумма реализации (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSUMM_INCOME', + SCAPTION => 'Сумма прибыли', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NINCOME_PRC', + SCAPTION => 'Процент прибыли', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_COST', + SCAPTION => 'Затраты', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_COST', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Затраты - контроль затрат, понесённых в ходе выполнения работ по этапу.
' || + 'Требует внимания - сумма фактических затрат этапа по некоторым статьям калькуляции превысила плановую.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана действующая калькуляция с указанием плановых значений по статьям, подлежащим контролю.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_ACT', + SCAPTION => 'Актир-е', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_ACT', + BORDER => true, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Актирование - контроль актирования работ, выполненных по этапу, со стороны заказчика.
' || + 'Требует внимания - этап в состоянии "Закрыт", но при этом в Системе отсутствует утверждённая "Расходная накладная на отпуск потребителю" для данного этапа.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что этап, если работы по нему завершены, переведен в состояние "Закрыт".'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_READY', + SCAPTION => 'Готов (%, затраты)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCOST_READYFrom', + SCOND_TO => 'EDCOST_READYTo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPROJECT', + SCAPTION => 'Рег. номер проекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -2845,7 +2865,8 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NSUMM_REALIZ,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST') || '(PS.RN) NCTRL_COST,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT') || '(PS.RN) NCTRL_ACT,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(PS.RN) NCOST_READY'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(PS.RN) NCOST_READY,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.PRN NPROJECT'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PROJECTSTAGE PS'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC FAC on PS.FACEACC = FAC.RN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,'); @@ -2857,15 +2878,18 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PS.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Учтём фильтры */ - PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, - NCOMPANY => NCOMPANY, - NPARENT => NPRN, - SUNIT => 'ProjectsStages', - SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_COND'), - RDATA_GRID => RDG, - RFILTERS => RF); + PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT, + NCOMPANY => NCOMPANY, + NPARENT => NPRN, + SUNIT => 'ProjectsStages', + SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_COND'), + RDATA_GRID => RDG, + RFILTERS => RF); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -2906,6 +2930,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 32); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; @@ -2914,80 +2939,95 @@ create or replace package body PKG_P8PANELS_PROJECTS as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNUMB', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SEXPECTED_RES', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SFACEACC', ICURSOR => ICURSOR, NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSTATE', ICURSOR => ICURSOR, NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, SNAME => 'DBEGPLAN', ICURSOR => ICURSOR, NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, SNAME => 'DENDPLAN', ICURSOR => ICURSOR, NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCOST_SUM', - ICURSOR => ICURSOR, - NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SCURNAMES', - ICURSOR => ICURSOR, - NPOSITION => 10); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NFIN_IN', ICURSOR => ICURSOR, NPOSITION => 11); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_NFIN_IN', - ICURSOR => ICURSOR, - NPOSITION => 12); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_NFIN_IN', - ICURSOR => ICURSOR, - NPOSITION => 13); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NFIN_OUT', - ICURSOR => ICURSOR, - NPOSITION => 14); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_NFIN_OUT', - ICURSOR => ICURSOR, - NPOSITION => 15); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_NFIN_OUT', - ICURSOR => ICURSOR, - NPOSITION => 16); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_FIN', - ICURSOR => ICURSOR, - NPOSITION => 17); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_CONTR', - ICURSOR => ICURSOR, - NPOSITION => 18); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_COEXEC', - ICURSOR => ICURSOR, - NPOSITION => 19); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NDAYS_LEFT', - ICURSOR => ICURSOR, - NPOSITION => 20); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_PERIOD', - ICURSOR => ICURSOR, - NPOSITION => 21); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNUMB', ICURSOR => ICURSOR, NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SEXPECTED_RES', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SFACEACC', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NSTATE', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DBEGPLAN', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DENDPLAN', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCOST_SUM', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCURNAMES', + ICURSOR => ICURSOR, + NPOSITION => 10); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NFIN_IN', + ICURSOR => ICURSOR, + NPOSITION => 11); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_NFIN_IN', + ICURSOR => ICURSOR, + NPOSITION => 12); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_NFIN_IN', + ICURSOR => ICURSOR, + NPOSITION => 13); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NFIN_OUT', + ICURSOR => ICURSOR, + NPOSITION => 14); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_NFIN_OUT', + ICURSOR => ICURSOR, + NPOSITION => 15); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_NFIN_OUT', + ICURSOR => ICURSOR, + NPOSITION => 16); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_FIN', + ICURSOR => ICURSOR, + NPOSITION => 17); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_CONTR', + ICURSOR => ICURSOR, + NPOSITION => 18); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_COEXEC', + ICURSOR => ICURSOR, + NPOSITION => 19); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NDAYS_LEFT', + ICURSOR => ICURSOR, + NPOSITION => 20); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_PERIOD', + ICURSOR => ICURSOR, + NPOSITION => 21); PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 22, NVALUE => NCOST_FACT); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOST_FACT', NVALUE => NCOST_FACT); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_NCOST_FACT', - ICURSOR => ICURSOR, - NPOSITION => 23); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_NCOST_FACT', - ICURSOR => ICURSOR, - NPOSITION => 24); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOST_FACT', NVALUE => NCOST_FACT); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_NCOST_FACT', + ICURSOR => ICURSOR, + NPOSITION => 23); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_NCOST_FACT', + ICURSOR => ICURSOR, + NPOSITION => 24); PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 25, NVALUE => NSUMM_REALIZ); if (NSUMM_REALIZ = 0) then NSUMM_INCOME := 0; @@ -2996,31 +3036,35 @@ create or replace package body PKG_P8PANELS_PROJECTS as NSUMM_INCOME := NSUMM_REALIZ - NCOST_FACT; NINCOME_PRC := NSUMM_INCOME / NCOST_FACT * 100; end if; - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM_REALIZ', NVALUE => NSUMM_REALIZ); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_NSUMM_REALIZ', - ICURSOR => ICURSOR, - NPOSITION => 26); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_NSUMM_REALIZ', - ICURSOR => ICURSOR, - NPOSITION => 27); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM_INCOME', NVALUE => NSUMM_INCOME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NINCOME_PRC', NVALUE => NINCOME_PRC); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_COST', - ICURSOR => ICURSOR, - NPOSITION => 28); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCTRL_ACT', - ICURSOR => ICURSOR, - NPOSITION => 29); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NCOST_READY', - ICURSOR => ICURSOR, - NPOSITION => 30); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM_REALIZ', NVALUE => NSUMM_REALIZ); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_NSUMM_REALIZ', + ICURSOR => ICURSOR, + NPOSITION => 26); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_NSUMM_REALIZ', + ICURSOR => ICURSOR, + NPOSITION => 27); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NSUMM_INCOME', NVALUE => NSUMM_INCOME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NINCOME_PRC', NVALUE => NINCOME_PRC); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_COST', + ICURSOR => ICURSOR, + NPOSITION => 28); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCTRL_ACT', + ICURSOR => ICURSOR, + NPOSITION => 29); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NCOST_READY', + ICURSOR => ICURSOR, + NPOSITION => 30); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPROJECT', + ICURSOR => ICURSOR, + NPOSITION => 31); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -3030,7 +3074,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end STAGES_LIST; /* Подбор записей журнала затрат по статье калькуляции этапа проекта */ @@ -3303,84 +3347,86 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* Список статей калькуляции этапа проекта */ procedure STAGE_ARTS_LIST ( - NSTAGE in number, -- Рег. номер этапа проекта - CFILTERS in clob, -- Фильтры - NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ - COUT out clob -- Сериализованная таблица данных + NSTAGE in number, -- Рег. номер этапа проекта + CFILTERS in clob, -- Фильтры + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ) is - RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры - RF_CTRL_COST PKG_P8PANELS_VISUAL.TFILTER; -- Фильтр по колонке "Контроль (затраты)" - NCTRL_COST_FROM PKG_STD.TNUMBER; -- Нижняя граница диапазона фильтра по колонке "Контроль (затраты)" - NCTRL_COST_TO PKG_STD.TNUMBER; -- Верхняя граница диапазона фильтра по колонке "Контроль (затраты)" - RF_CTRL_CONTR PKG_P8PANELS_VISUAL.TFILTER; -- Фильтр по колонке "Контроль (контрактация)" - NCTRL_CONTR_FROM PKG_STD.TNUMBER; -- Нижняя граница диапазона фильтра по колонке "Контроль (контрактация)" - NCTRL_CONTR_TO PKG_STD.TNUMBER; -- Верхняя граница диапазона фильтра по колонке "Контроль (контрактация)" - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов - RSTAGE_ARTS TSTAGE_ARTS; -- Список статей этапа проекта + RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры + RF_CTRL_COST PKG_P8PANELS_VISUAL.TDG_FILTER; -- Фильтр по колонке "Контроль (затраты)" + NCTRL_COST_FROM PKG_STD.TNUMBER; -- Нижняя граница диапазона фильтра по колонке "Контроль (затраты)" + NCTRL_COST_TO PKG_STD.TNUMBER; -- Верхняя граница диапазона фильтра по колонке "Контроль (затраты)" + RF_CTRL_CONTR PKG_P8PANELS_VISUAL.TDG_FILTER; -- Фильтр по колонке "Контроль (контрактация)" + NCTRL_CONTR_FROM PKG_STD.TNUMBER; -- Нижняя граница диапазона фильтра по колонке "Контроль (контрактация)" + NCTRL_CONTR_TO PKG_STD.TNUMBER; -- Верхняя граница диапазона фильтра по колонке "Контроль (контрактация)" + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TDG_COL_VALS; -- Предопределённые значения столбцов + RSTAGE_ARTS TSTAGE_ARTS; -- Список статей этапа проекта begin /* Читаем фильтры */ - RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); + RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); /* Найдем фильтр по контролю затрат */ - RF_CTRL_COST := PKG_P8PANELS_VISUAL.TFILTERS_FIND(RFILTERS => RF, SNAME => 'NCTRL_COST'); - PKG_P8PANELS_VISUAL.TFILTER_TO_NUMBER(RFILTER => RF_CTRL_COST, NFROM => NCTRL_COST_FROM, NTO => NCTRL_COST_TO); + RF_CTRL_COST := PKG_P8PANELS_VISUAL.TDG_FILTERS_FIND(RFILTERS => RF, SNAME => 'NCTRL_COST'); + PKG_P8PANELS_VISUAL.TDG_FILTER_TO_NUMBER(RFILTER => RF_CTRL_COST, NFROM => NCTRL_COST_FROM, NTO => NCTRL_COST_TO); /* Найдем фильтр по контролю контрактации */ - RF_CTRL_CONTR := PKG_P8PANELS_VISUAL.TFILTERS_FIND(RFILTERS => RF, SNAME => 'NCTRL_CONTR'); - PKG_P8PANELS_VISUAL.TFILTER_TO_NUMBER(RFILTER => RF_CTRL_CONTR, NFROM => NCTRL_CONTR_FROM, NTO => NCTRL_CONTR_TO); + RF_CTRL_CONTR := PKG_P8PANELS_VISUAL.TDG_FILTERS_FIND(RFILTERS => RF, SNAME => 'NCTRL_CONTR'); + PKG_P8PANELS_VISUAL.TDG_FILTER_TO_NUMBER(RFILTER => RF_CTRL_CONTR, + NFROM => NCTRL_CONTR_FROM, + NTO => NCTRL_CONTR_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNUMB', - SCAPTION => 'Номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SNAME', - SCAPTION => 'Наименование статьи', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPLAN', - SCAPTION => 'План', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_FACT', - SCAPTION => 'Фактические затраты', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOST_DIFF', - SCAPTION => 'Отклонение по затратам', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_COST', - SCAPTION => 'Контроль (затраты)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BFILTER => true, - RCOL_VALS => RCOL_VALS); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCONTR', - SCAPTION => 'Законтрактовано', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCONTR_LEFT', - SCAPTION => 'Осталось законтрактовать', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_CONTR', - SCAPTION => 'Контроль (контрактация)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BFILTER => true, - RCOL_VALS => RCOL_VALS); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNUMB', + SCAPTION => 'Номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SNAME', + SCAPTION => 'Наименование статьи', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPLAN', + SCAPTION => 'План', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_FACT', + SCAPTION => 'Фактические затраты', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOST_DIFF', + SCAPTION => 'Отклонение по затратам', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_COST', + SCAPTION => 'Контроль (затраты)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BFILTER => true, + RCOL_VALS => RCOL_VALS); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCONTR', + SCAPTION => 'Законтрактовано', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCONTR_LEFT', + SCAPTION => 'Осталось законтрактовать', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_CONTR', + SCAPTION => 'Контроль (контрактация)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BFILTER => true, + RCOL_VALS => RCOL_VALS); /* Сформируем сведения по статям этапа проекта */ STAGE_ARTS_GET(NSTAGE => NSTAGE, NINC_COST => 1, NINC_CONTR => 1, RSTAGE_ARTS => RSTAGE_ARTS); /* Обходим собранные статьи */ @@ -3393,30 +3439,36 @@ create or replace package body PKG_P8PANELS_PROJECTS as ((NCTRL_CONTR_FROM is null) or ((NCTRL_CONTR_FROM is not null) and (NCTRL_CONTR_FROM = RSTAGE_ARTS(I).NCTRL_CONTR)))) then /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'NRN', - NVALUE => RSTAGE_ARTS(I).NRN, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SNUMB', SVALUE => RSTAGE_ARTS(I).SCODE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SNAME', SVALUE => RSTAGE_ARTS(I).SNAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPLAN', NVALUE => RSTAGE_ARTS(I).NPLAN); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOST_FACT', NVALUE => RSTAGE_ARTS(I).NCOST_FACT); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOST_DIFF', NVALUE => RSTAGE_ARTS(I).NCOST_DIFF); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_COST', NVALUE => RSTAGE_ARTS(I).NCTRL_COST); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCONTR', NVALUE => RSTAGE_ARTS(I).NCONTR); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'NCONTR_LEFT', - NVALUE => RSTAGE_ARTS(I).NCONTR_LEFT); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'NCTRL_CONTR', - NVALUE => RSTAGE_ARTS(I).NCTRL_CONTR); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NRN', + NVALUE => RSTAGE_ARTS(I).NRN, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SNUMB', SVALUE => RSTAGE_ARTS(I).SCODE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SNAME', SVALUE => RSTAGE_ARTS(I).SNAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPLAN', NVALUE => RSTAGE_ARTS(I).NPLAN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NCOST_FACT', + NVALUE => RSTAGE_ARTS(I).NCOST_FACT); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NCOST_DIFF', + NVALUE => RSTAGE_ARTS(I).NCOST_DIFF); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NCTRL_COST', + NVALUE => RSTAGE_ARTS(I).NCTRL_COST); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCONTR', NVALUE => RSTAGE_ARTS(I).NCONTR); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NCONTR_LEFT', + NVALUE => RSTAGE_ARTS(I).NCONTR_LEFT); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NCTRL_CONTR', + NVALUE => RSTAGE_ARTS(I).NCTRL_CONTR); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; end loop; end if; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end STAGE_ARTS_LIST; /* Считывание записи соисполнителя этапа проекта */ @@ -3858,11 +3910,11 @@ create or replace package body PKG_P8PANELS_PROJECTS as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора - RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы - RCOL_VALS PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределённые значения столбцов + RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы + RCOL_VALS PKG_P8PANELS_VISUAL.TDG_COL_VALS; -- Предопределённые значения столбцов NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -3878,195 +3930,195 @@ create or replace package body PKG_P8PANELS_PROJECTS as NCTRL_COEXEC PKG_STD.TNUMBER; -- Сведения о соисполнении - состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения) begin /* Читаем фильтры */ - RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); + RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); /* Читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_PREF', - SCAPTION => 'Префикс', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDDOC_PREF', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_SDOC_PREF', - SCAPTION => 'Префикс (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_SDOC_PREF', - SCAPTION => 'Префикс (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SDOC_NUMB', - SCAPTION => 'Номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDDOC_NUMB', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SLNK_UNIT_SDOC_NUMB', - SCAPTION => 'Номер (код раздела ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLNK_DOCUMENT_SDOC_NUMB', - SCAPTION => 'Номер (документ ссылки)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DDOC_DATE', - SCAPTION => 'Дата', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDDOC_DATEFrom', - SCOND_TO => 'EDDOC_DATETo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SEXT_NUMBER', - SCAPTION => 'Внешний номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGENT', - SCAPTION => 'Соисполнитель', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDAGENT', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGENT_INN', - SCAPTION => 'ИНН соисполнителя', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGENT_KPP', - SCAPTION => 'КПП соисполнителя', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SGOVCNTRID', - SCAPTION => 'ИГК', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCSTAGE', - SCAPTION => 'Этап', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDSTAGE', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCSTAGE_DESCRIPTION', - SCAPTION => 'Описание этапа', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DCSTAGE_BEGIN_DATE', - SCAPTION => 'Дата начала', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDCSTAGE_BEGIN_DATEFrom', - SCOND_TO => 'EDCSTAGE_BEGIN_DATETo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DCSTAGE_END_DATE', - SCAPTION => 'Дата окончания', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - SCOND_FROM => 'EDCSTAGE_END_DATEFrom', - SCOND_TO => 'EDCSTAGE_END_DATETo', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NSUMM', - SCAPTION => 'Сумма', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCURR', - SCAPTION => 'Валюта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCOST_ART', - SCAPTION => 'Статья затрат', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'EDSCOST_ART', - BORDER => true, - BFILTER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPAY_IN', - SCAPTION => 'Акцептовано счетов на оплату', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFIN_OUT', - SCAPTION => 'Оплачено счетов', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPAY_IN_REST', - SCAPTION => 'Осталось оплатить счетов', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_FIN', - SCAPTION => 'Фин-е (исх.)', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_FIN', - BORDER => false, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителем в рамках договора.
' || - 'Требует внимания - не все выставленные соисполнителем акцептованные счета оплачены.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для договора с соисполнителем аккуратно ведётся учёт первичных документов оперативного учёта (входящих счетов на оплату).'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NFIN_REST', - SCAPTION => 'Общий остаток к оплате по договору', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOEXEC_IN', - SCAPTION => 'Получено актов/накладных', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOEXEC_REST', - SCAPTION => 'Остаток к актированию/поставке', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCTRL_COEXEC', - SCAPTION => 'Соисполнение', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'EDCTRL_COEXEC', - BORDER => false, - BFILTER => true, - RCOL_VALS => RCOL_VALS, - SHINT => 'Соисполнение - контроль исполнения обязательств по договору с соисполнителем.
' || - 'Требует внимания - до окончания этапа проекта, в рамках которого действует соисполнение, осталось менее ' || - TO_CHAR(NDAYS_LEFT_LIMIT) || - ' дней, при этом зафиксирован положительный остаток к поставке/актированию по договору.
' || - 'В норме - нет описанных выше отклонений.
' || - 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для связанного этапа проекта задана плановая дата окончания, ' || - 'а по договору с соисполнителем аккуратно ведётся учёт первичных документов оперативного учёта (приходных накладных).'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_PREF', + SCAPTION => 'Префикс', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDDOC_PREF', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_SDOC_PREF', + SCAPTION => 'Префикс (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_SDOC_PREF', + SCAPTION => 'Префикс (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SDOC_NUMB', + SCAPTION => 'Номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDDOC_NUMB', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SLNK_UNIT_SDOC_NUMB', + SCAPTION => 'Номер (код раздела ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLNK_DOCUMENT_SDOC_NUMB', + SCAPTION => 'Номер (документ ссылки)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DDOC_DATE', + SCAPTION => 'Дата', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDDOC_DATEFrom', + SCOND_TO => 'EDDOC_DATETo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SEXT_NUMBER', + SCAPTION => 'Внешний номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGENT', + SCAPTION => 'Соисполнитель', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDAGENT', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGENT_INN', + SCAPTION => 'ИНН соисполнителя', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGENT_KPP', + SCAPTION => 'КПП соисполнителя', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SGOVCNTRID', + SCAPTION => 'ИГК', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCSTAGE', + SCAPTION => 'Этап', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDSTAGE', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCSTAGE_DESCRIPTION', + SCAPTION => 'Описание этапа', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DCSTAGE_BEGIN_DATE', + SCAPTION => 'Дата начала', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDCSTAGE_BEGIN_DATEFrom', + SCOND_TO => 'EDCSTAGE_BEGIN_DATETo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DCSTAGE_END_DATE', + SCAPTION => 'Дата окончания', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + SCOND_FROM => 'EDCSTAGE_END_DATEFrom', + SCOND_TO => 'EDCSTAGE_END_DATETo', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NSUMM', + SCAPTION => 'Сумма', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCURR', + SCAPTION => 'Валюта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCOST_ART', + SCAPTION => 'Статья затрат', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'EDSCOST_ART', + BORDER => true, + BFILTER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPAY_IN', + SCAPTION => 'Акцептовано счетов на оплату', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFIN_OUT', + SCAPTION => 'Оплачено счетов', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPAY_IN_REST', + SCAPTION => 'Осталось оплатить счетов', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_FIN', + SCAPTION => 'Фин-е (исх.)', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_FIN', + BORDER => false, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Финансирование (исходящее) - контроль оплаты счетов, выставленных соисполнителем в рамках договора.
' || + 'Требует внимания - не все выставленные соисполнителем акцептованные счета оплачены.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для договора с соисполнителем аккуратно ведётся учёт первичных документов оперативного учёта (входящих счетов на оплату).'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NFIN_REST', + SCAPTION => 'Общий остаток к оплате по договору', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOEXEC_IN', + SCAPTION => 'Получено актов/накладных', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOEXEC_REST', + SCAPTION => 'Остаток к актированию/поставке', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCTRL_COEXEC', + SCAPTION => 'Соисполнение', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'EDCTRL_COEXEC', + BORDER => false, + BFILTER => true, + RCOL_VALS => RCOL_VALS, + SHINT => 'Соисполнение - контроль исполнения обязательств по договору с соисполнителем.
' || + 'Требует внимания - до окончания этапа проекта, в рамках которого действует соисполнение, осталось менее ' || + TO_CHAR(NDAYS_LEFT_LIMIT) || + ' дней, при этом зафиксирован положительный остаток к поставке/актированию по договору.
' || + 'В норме - нет описанных выше отклонений.
' || + 'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для связанного этапа проекта задана плановая дата окончания, ' || + 'а по договору с соисполнителем аккуратно ведётся учёт первичных документов оперативного учёта (приходных накладных).'); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -4113,15 +4165,18 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PSPF.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Учтём фильтры */ - PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, - NCOMPANY => NCOMPANY, - NPARENT => NSTAGE, - SUNIT => 'ProjectsStagesPerformers', - SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_COND'), - RDATA_GRID => RDG, - RFILTERS => RF); + PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT, + NCOMPANY => NCOMPANY, + NPARENT => NSTAGE, + SUNIT => 'ProjectsStagesPerformers', + SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_COND'), + RDATA_GRID => RDG, + RFILTERS => RF); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -4160,71 +4215,83 @@ create or replace package body PKG_P8PANELS_PROJECTS as loop /* Добавляем колонки с данными */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NPROJECTSTAGEPF); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NPROJECTSTAGEPF, BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_PREF', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_SDOC_PREF', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_SDOC_PREF', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_NUMB', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SLNK_UNIT_SDOC_NUMB', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLNK_DOCUMENT_SDOC_NUMB', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DDOC_DATE', - ICURSOR => ICURSOR, - NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SEXT_NUMBER', - ICURSOR => ICURSOR, - NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGENT', ICURSOR => ICURSOR, NPOSITION => 10); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SAGENT_INN', - ICURSOR => ICURSOR, - NPOSITION => 11); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SAGENT_KPP', - ICURSOR => ICURSOR, - NPOSITION => 12); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SGOVCNTRID', - ICURSOR => ICURSOR, - NPOSITION => 13); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCSTAGE', ICURSOR => ICURSOR, NPOSITION => 14); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SCSTAGE_DESCRIPTION', - ICURSOR => ICURSOR, - NPOSITION => 15); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DCSTAGE_BEGIN_DATE', - ICURSOR => ICURSOR, - NPOSITION => 16); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, - SNAME => 'DCSTAGE_END_DATE', - ICURSOR => ICURSOR, - NPOSITION => 17); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSUMM', ICURSOR => ICURSOR, NPOSITION => 18); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCURR', ICURSOR => ICURSOR, NPOSITION => 19); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SCOST_ART', - ICURSOR => ICURSOR, - NPOSITION => 20); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NPROJECTSTAGEPF, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_PREF', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_SDOC_PREF', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_SDOC_PREF', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_NUMB', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SLNK_UNIT_SDOC_NUMB', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLNK_DOCUMENT_SDOC_NUMB', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DDOC_DATE', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SEXT_NUMBER', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGENT', + ICURSOR => ICURSOR, + NPOSITION => 10); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGENT_INN', + ICURSOR => ICURSOR, + NPOSITION => 11); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGENT_KPP', + ICURSOR => ICURSOR, + NPOSITION => 12); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SGOVCNTRID', + ICURSOR => ICURSOR, + NPOSITION => 13); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCSTAGE', + ICURSOR => ICURSOR, + NPOSITION => 14); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCSTAGE_DESCRIPTION', + ICURSOR => ICURSOR, + NPOSITION => 15); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DCSTAGE_BEGIN_DATE', + ICURSOR => ICURSOR, + NPOSITION => 16); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW, + SNAME => 'DCSTAGE_END_DATE', + ICURSOR => ICURSOR, + NPOSITION => 17); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NSUMM', + ICURSOR => ICURSOR, + NPOSITION => 18); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCURR', + ICURSOR => ICURSOR, + NPOSITION => 19); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SCOST_ART', + ICURSOR => ICURSOR, + NPOSITION => 20); STAGE_CONTRACTS_GET(NPROJECTSTAGEPF => NPROJECTSTAGEPF, NINC_FIN => 1, NINC_COEXEC => 1, @@ -4236,16 +4303,16 @@ create or replace package body PKG_P8PANELS_PROJECTS as NCOEXEC_IN => NCOEXEC_IN, NCOEXEC_REST => NCOEXEC_REST, NCTRL_COEXEC => NCTRL_COEXEC); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPAY_IN', NVALUE => NPAY_IN); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NFIN_OUT', NVALUE => NFIN_OUT); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPAY_IN_REST', NVALUE => NPAY_IN_REST); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_FIN', NVALUE => NCTRL_FIN); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NFIN_REST', NVALUE => NFIN_REST); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOEXEC_IN', NVALUE => NCOEXEC_IN); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOEXEC_REST', NVALUE => NCOEXEC_REST); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_COEXEC', NVALUE => NCTRL_COEXEC); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPAY_IN', NVALUE => NPAY_IN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NFIN_OUT', NVALUE => NFIN_OUT); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPAY_IN_REST', NVALUE => NPAY_IN_REST); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_FIN', NVALUE => NCTRL_FIN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NFIN_REST', NVALUE => NFIN_REST); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOEXEC_IN', NVALUE => NCOEXEC_IN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOEXEC_REST', NVALUE => NCOEXEC_REST); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCTRL_COEXEC', NVALUE => NCTRL_COEXEC); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -4255,7 +4322,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end STAGE_CONTRACTS_LIST; /* Считывание записи работы проекта */ @@ -5010,9 +5077,9 @@ create or replace package body PKG_P8PANELS_PROJECTS as NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса NROW_FROM PKG_STD.TREF; -- Номер строки с @@ -5040,30 +5107,30 @@ create or replace package body PKG_P8PANELS_PROJECTS as NROW_TO => NROW_TO); else /* Будем строить курсор по параметрам - читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер исполнения должности', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPERSON', - SCAPTION => 'Сотрудник', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_PLAN_FOT', - SCAPTION => 'Трудоёмкость (' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер исполнения должности', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPERSON', + SCAPTION => 'Сотрудник', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_PLAN_FOT', + SCAPTION => 'Трудоёмкость (' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); end if; /* Обходим данные */ begin @@ -5098,7 +5165,10 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -5134,18 +5204,18 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* При формировании списка для клиента */ if (NMODE = 0) then /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPERSON', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB_PLAN_FOT', NVALUE => NPERS_LAB); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPERSON', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB_PLAN_FOT', NVALUE => NPERS_LAB); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; end loop; /* Освобождаем курсор */ @@ -5158,7 +5228,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* При формировании списка для клиента */ if (NMODE = 0) then /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end if; end JB_PERIODS_PLAN_FOT_BUILD; @@ -5217,9 +5287,9 @@ create or replace package body PKG_P8PANELS_PROJECTS as NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса NROW_FROM PKG_STD.TREF; -- Номер строки с @@ -5245,69 +5315,69 @@ create or replace package body PKG_P8PANELS_PROJECTS as NROW_TO => NROW_TO); else /* Будем строить курсор по параметрам - читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер трудового ресурса отчета', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRJDEPLAN', - SCAPTION => 'Документ', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRJ', - SCAPTION => 'Проект', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTG_JOB', - SCAPTION => 'Этап-работа', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SJOB_NAME', - SCAPTION => 'Наим. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_STATE', - SCAPTION => 'Сост. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_BEG', - SCAPTION => 'Начало работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_END', - SCAPTION => 'Окончание работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_DUR', - SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPERSON', - SCAPTION => 'Сотрудник', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB', - SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер трудового ресурса отчета', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRJDEPLAN', + SCAPTION => 'Документ', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRJ', + SCAPTION => 'Проект', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTG_JOB', + SCAPTION => 'Этап-работа', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SJOB_NAME', + SCAPTION => 'Наим. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_STATE', + SCAPTION => 'Сост. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_BEG', + SCAPTION => 'Начало работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_END', + SCAPTION => 'Окончание работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_DUR', + SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPERSON', + SCAPTION => 'Сотрудник', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB', + SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); end if; /* Обходим данные */ begin @@ -5355,7 +5425,10 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -5408,38 +5481,41 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* При формировании списка для клиента */ if (NMODE = 0) then /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPRJDEPLAN', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SSTG_JOB', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SJOB_NAME', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NJOB_STATE', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SPERSON', - ICURSOR => ICURSOR, - NPOSITION => 9); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB', NVALUE => NJOB_LAB); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPRJDEPLAN', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPRJ', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTG_JOB', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SJOB_NAME', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NJOB_STATE', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPERSON', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NLAB', NVALUE => NJOB_LAB); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; end loop; /* Освобождаем курсор */ @@ -5452,7 +5528,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* При формировании списка для клиента */ if (NMODE = 0) then /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end if; end JB_PERIODS_FACT_RPT_BUILD; @@ -5511,9 +5587,9 @@ create or replace package body PKG_P8PANELS_PROJECTS as NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса RPRD P8PNL_JB_PERIODS%rowtype; -- Запись детализируемого периода RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса NROW_FROM PKG_STD.TREF; -- Номер строки с @@ -5543,76 +5619,76 @@ create or replace package body PKG_P8PANELS_PROJECTS as NROW_TO => NROW_TO); else /* Будем строить курсор по параметрам - читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер работы в буфере балансировки', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPROJECT', - SCAPTION => 'Рег. номер проекта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJB_PRJCTS', - SCAPTION => 'Рег. номер буфера балансировки проекта', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPRJ', - SCAPTION => 'Проект', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SSTG_JOB', - SCAPTION => 'Этап-работа', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SJOB_NAME', - SCAPTION => 'Наим. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_STATE', - SCAPTION => 'Сост. работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_BEG', - SCAPTION => 'Начало работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'DJOB_END', - SCAPTION => 'Окончание работы', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, - BORDER => true); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NJOB_DUR', - SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMP_LAB', - SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMP_LAB_ONE', - SCAPTION => 'Труд. (в ед. длит., ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMP_LAB_PLAN', - SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер работы в буфере балансировки', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NPROJECT', + SCAPTION => 'Рег. номер проекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJB_PRJCTS', + SCAPTION => 'Рег. номер буфера балансировки проекта', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPRJ', + SCAPTION => 'Проект', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTG_JOB', + SCAPTION => 'Этап-работа', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SJOB_NAME', + SCAPTION => 'Наим. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_STATE', + SCAPTION => 'Сост. работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_BEG', + SCAPTION => 'Начало работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'DJOB_END', + SCAPTION => 'Окончание работы', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE, + BORDER => true); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NJOB_DUR', + SCAPTION => 'Длительн. работы (' || RJB_PRMS.DURATION_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMP_LAB', + SCAPTION => 'Труд. (' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMP_LAB_ONE', + SCAPTION => 'Труд. (в ед. длит., ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMP_LAB_PLAN', + SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB); end if; /* Обходим данные */ begin @@ -5655,7 +5731,10 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -5722,40 +5801,43 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* При формировании списка для клиента */ if (NMODE = 0) then /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NPROJECT', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NJB_PRJCTS', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPRJ', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SSTG_JOB', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SJOB_NAME', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NJOB_STATE', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB', NVALUE => NMP_LAB); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_ONE', NVALUE => NMP_LAB_ONE); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_PLAN', NVALUE => NMP_LAB_PLAN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NPROJECT', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NJB_PRJCTS', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPRJ', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SSTG_JOB', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SJOB_NAME', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NJOB_STATE', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_BEG', DVALUE => DJOB_BEG); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'DJOB_END', DVALUE => DJOB_END); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NJOB_DUR', NVALUE => NJOB_DUR); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB', NVALUE => NMP_LAB); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_ONE', NVALUE => NMP_LAB_ONE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NMP_LAB_PLAN', NVALUE => NMP_LAB_PLAN); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end if; end loop; /* Освобождаем курсор */ @@ -5768,7 +5850,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* При формировании списка для клиента */ if (NMODE = 0) then /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end if; end JB_PERIODS_PLAN_JOBS_BUILD; @@ -6011,9 +6093,9 @@ create or replace package body PKG_P8PANELS_PROJECTS as ) is RJB_PRMS P8PNL_JB_PRMS%rowtype; -- Параметры балансировки - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса NROW_FROM PKG_STD.TREF; -- Номер строки с @@ -6022,70 +6104,70 @@ create or replace package body PKG_P8PANELS_PROJECTS as /* Считаем параметры балансировки */ RJB_PRMS := JB_PRMS_GET(NIDENT => NIDENT); /* Читаем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(); /* Добавляем в таблицу описание колонок */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NRN', - SCAPTION => 'Рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPERIOD', - SCAPTION => 'Период', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SINS_DEPARTMENT', - SCAPTION => 'Подразделение', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SFCMANPOWER', - SCAPTION => 'Ресурс', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_PLAN_FOT', - SCAPTION => 'Труд. (план, ФОТ, ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_FACT_RPT', - SCAPTION => 'Труд. (факт, отчёт, ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_DIFF_RPT_FOT', - SCAPTION => 'Отклон. (факт-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => true, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_PLAN_JOBS', - SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true, - BFILTER => false); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NLAB_DIFF_JOBS_FOT', - SCAPTION => 'Отклон. (график-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BORDER => true, - BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NRN', + SCAPTION => 'Рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SPERIOD', + SCAPTION => 'Период', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SINS_DEPARTMENT', + SCAPTION => 'Подразделение', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SFCMANPOWER', + SCAPTION => 'Ресурс', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_PLAN_FOT', + SCAPTION => 'Труд. (план, ФОТ, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_FACT_RPT', + SCAPTION => 'Труд. (факт, отчёт, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_DIFF_RPT_FOT', + SCAPTION => 'Отклон. (факт-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_PLAN_JOBS', + SCAPTION => 'Труд. (план, график, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true, + BFILTER => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLAB_DIFF_JOBS_FOT', + SCAPTION => 'Отклон. (график-план, ' || RJB_PRMS.LAB_MEAS_CODE || ')', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BORDER => true, + BFILTER => false); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -6113,7 +6195,10 @@ create or replace package body PKG_P8PANELS_PROJECTS as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -6140,42 +6225,45 @@ create or replace package body PKG_P8PANELS_PROJECTS as while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) loop /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NRN', - ICURSOR => ICURSOR, - NPOSITION => 1, - BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SPERIOD', ICURSOR => ICURSOR, NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SINS_DEPARTMENT', - ICURSOR => ICURSOR, - NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SFCMANPOWER', - ICURSOR => ICURSOR, - NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLAB_PLAN_FOT', - ICURSOR => ICURSOR, - NPOSITION => 5); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLAB_FACT_RPT', - ICURSOR => ICURSOR, - NPOSITION => 6); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLAB_DIFF_RPT_FOT', - ICURSOR => ICURSOR, - NPOSITION => 7); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLAB_PLAN_JOBS', - ICURSOR => ICURSOR, - NPOSITION => 8); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NLAB_DIFF_JOBS_FOT', - ICURSOR => ICURSOR, - NPOSITION => 9); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NRN', + ICURSOR => ICURSOR, + NPOSITION => 1, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SPERIOD', + ICURSOR => ICURSOR, + NPOSITION => 2); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SINS_DEPARTMENT', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SFCMANPOWER', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLAB_PLAN_FOT', + ICURSOR => ICURSOR, + NPOSITION => 5); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLAB_FACT_RPT', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLAB_DIFF_RPT_FOT', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLAB_PLAN_JOBS', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLAB_DIFF_JOBS_FOT', + ICURSOR => ICURSOR, + NPOSITION => 9); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -6185,7 +6273,7 @@ create or replace package body PKG_P8PANELS_PROJECTS as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); + COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF); end JB_PERIODS_LIST; /* Очистка данных балансировки */ diff --git a/db/PKG_P8PANELS_RRPCONFED.pck b/db/PKG_P8PANELS_RRPCONFED.pck index e531efb..494de72 100644 --- a/db/PKG_P8PANELS_RRPCONFED.pck +++ b/db/PKG_P8PANELS_RRPCONFED.pck @@ -784,8 +784,8 @@ create or replace package body PKG_P8PANELS_RRPCONFED as is NVERSION PKG_STD.TREF; -- Рег. номер версии словаря контрагентов NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы CDG clob; -- XML данных раздела CXML PKG_CONTVALLOC2NS.TCONTAINER; -- Контейнер для данных XML RRRPCONFSCTNMRK RRPCONFSCTNMRK%rowtype; -- Рег. номер показателя @@ -798,8 +798,8 @@ create or replace package body PKG_P8PANELS_RRPCONFED as /* Инициализация колонок граф показателей */ procedure MARKS_COLUMNS_INIT ( - RDG in out nocopy PKG_P8PANELS_VISUAL.TDATA_GRID, -- Описание таблицы - NRRPCONFSCTN in number -- Рег. номер раздела + RDG in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы + NRRPCONFSCTN in number -- Рег. номер раздела ) is begin @@ -816,35 +816,35 @@ create or replace package body PKG_P8PANELS_RRPCONFED as order by C.CODE) loop /* Наименование графы */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SCOL_' || REC.CODE, - SCAPTION => REC.NAME, - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - NWIDTH => 200); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SCOL_' || REC.CODE, + SCAPTION => REC.NAME, + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + NWIDTH => 200); /* Рег. номер графы */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NCOL_RN_' || REC.CODE, - SCAPTION => REC.NAME || ' рег. номер', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NCOL_RN_' || REC.CODE, + SCAPTION => REC.NAME || ' рег. номер', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); /* Рег. номер показателя */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NMARK_RN_' || REC.CODE, - SCAPTION => REC.NAME || ' рег. номер показателя', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NMARK_RN_' || REC.CODE, + SCAPTION => REC.NAME || ' рег. номер показателя', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); /* Мнемокод показателя */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SMARK_CODE_' || REC.CODE, - SCAPTION => REC.NAME || ' мнемокод показателя', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMARK_CODE_' || REC.CODE, + SCAPTION => REC.NAME || ' мнемокод показателя', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); /* Для составов показтелей */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'MARK_CNS_' || REC.CODE, - SCAPTION => REC.NAME || ' состав показателя', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'MARK_CNS_' || REC.CODE, + SCAPTION => REC.NAME || ' состав показателя', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); end loop; end MARKS_COLUMNS_INIT; @@ -897,25 +897,25 @@ create or replace package body PKG_P8PANELS_RRPCONFED as order by T.CODE) loop /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1); /* Формируем структуру заголовка */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SROW_NAME', - SCAPTION => '', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - NWIDTH => 150); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SROW_NAME', + SCAPTION => '', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + NWIDTH => 150); /* Формируем структуру заголовка */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SROW_CODE', - SCAPTION => 'Мнемокод строки', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SROW_CODE', + SCAPTION => 'Мнемокод строки', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => false); /* Формируем структуру заголовка */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NROW_RN', - SCAPTION => 'Рег. номер строки', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NROW_RN', + SCAPTION => 'Рег. номер строки', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => false); /* Если раздел содержит показатели */ if (S.NMARKS_EXISTS = 1) then /* Инициализируем колонки граф */ @@ -938,11 +938,11 @@ create or replace package body PKG_P8PANELS_RRPCONFED as LPAD(R.CODE, 20, '0')) loop /* Заполняем наименование строки */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => R.NAME, BCLEAR => true); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => R.NAME, BCLEAR => true); /* Заполняем мнемокод строки */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_CODE', SVALUE => R.CODE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_CODE', SVALUE => R.CODE); /* Заполняем рег. номер строки */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_RN', NVALUE => R.RN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_RN', NVALUE => R.RN); /* Обходим графы раздела */ for C in (select C.RN, C.CODE, @@ -963,29 +963,29 @@ create or replace package body PKG_P8PANELS_RRPCONFED as /* Считываем показатель по строке/графе */ RRRPCONFSCTNMRK := RRPCONFSCTNMRK_GET_ROWCOL(NRRPCONFSCTN => S.NRN, NRRPROW => R.RN, NRRPCOLUMN => C.RN); /* Заполняем рег. номер графы */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || C.CODE, SVALUE => C.NAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || C.CODE, SVALUE => C.NAME); /* Заполняем рег. номер графы */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOL_RN_' || C.CODE, NVALUE => C.RN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOL_RN_' || C.CODE, NVALUE => C.RN); /* Заполняем рег. номер показателя */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'NMARK_RN_' || C.CODE, - NVALUE => RRRPCONFSCTNMRK.RN); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'NMARK_RN_' || C.CODE, + NVALUE => RRRPCONFSCTNMRK.RN); /* Если ошибка считывания показателя */ if (RRRPCONFSCTNMRK.RN is not null) then /* Заполняем мнемокод показателя */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, - SNAME => 'SMARK_CODE_' || C.CODE, - SVALUE => RRRPCONFSCTNMRK.CODE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'SMARK_CODE_' || C.CODE, + SVALUE => RRRPCONFSCTNMRK.CODE); /* Добавляем атрибут состава показателей */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'MARK_CNS_' || C.CODE, SVALUE => null); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'MARK_CNS_' || C.CODE, SVALUE => null); end if; end loop; /* Добавим строку для раздела */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; end if; /* Сериализуем описание */ - CDG := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); + CDG := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); /* Заполняем контейнер данными о разделе */ PKG_CONTVALLOC2NS.PUTN(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'RN', NVALUE => S.NRN); PKG_CONTVALLOC2NS.PUTS(RCONTAINER => CXML, NTABID => S.RNUM, SROWID => 'CODE', SVALUE => S.SCODE); diff --git a/db/PKG_P8PANELS_SAMPLES.pck b/db/PKG_P8PANELS_SAMPLES.pck index 1f7e228..7aff8e6 100644 --- a/db/PKG_P8PANELS_SAMPLES.pck +++ b/db/PKG_P8PANELS_SAMPLES.pck @@ -59,10 +59,35 @@ create or replace package PKG_P8PANELS_SAMPLES as DDATE_TO in date -- Дата окончания задачи ); + /* Инициализация буфера данных для диаграммы Ганта */ + procedure CYCLOGRAM_INIT + ( + NIDENT in out number -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором) + ); + + /* Сбор данных для отображения циклограммы */ + procedure CYCLOGRAM + ( + NIDENT in number, -- Идентификатор процесса + COUT out clob -- Сериализованные данные для циклограммы + ); + + /* Изменение задачи циклограммы */ + procedure CYCLOGRAM_TASK_MODIFY + ( + NIDENT in number, -- Идентификатор буфера + NRN in number, -- Рег. номер записи + SDATE_FROM in varchar2, -- Дата начала (в строковом представлении) + SDATE_TO in varchar2 -- Дата окончания (в строковом представлении) + ); + end PKG_P8PANELS_SAMPLES; / create or replace package body PKG_P8PANELS_SAMPLES as + /* Константы - циклограмма */ + NCG_MULTIPLIER constant PKG_STD.TNUMBER := 5; -- Множитель для ширины отображения + /* Получение списка контрагентов */ procedure AGNLIST_GET ( @@ -205,6 +230,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as NCONTACT_METHOD => null, SMF_ID => null, SOKOGU => null, + NJURPERS_SUBDIV => null, NRN => NRN); end AGNLIST_INSERT; @@ -231,11 +257,11 @@ create or replace package body PKG_P8PANELS_SAMPLES as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NIDENT PKG_STD.TREF := GEN_IDENT(); -- Идентификатор отбора - RF PKG_P8PANELS_VISUAL.TFILTERS; -- Фильтры - RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки - RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы - RAGN_TYPES PKG_P8PANELS_VISUAL.TCOL_VALS; -- Предопределенные значения "Типа контрагентов" - RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы + RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры + RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки + RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы + RAGN_TYPES PKG_P8PANELS_VISUAL.TDG_COL_VALS; -- Предопределенные значения "Типа контрагентов" + RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы NROW_FROM PKG_STD.TREF; -- Номер строки с NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса @@ -246,71 +272,71 @@ create or replace package body PKG_P8PANELS_SAMPLES as NAGNTYPE PKG_STD.TREF; -- Буфер для "Типа" begin /* Читаем фильтры */ - RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS); + RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS); /* Читем сортировки */ - RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); + RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER, NPAGE_SIZE => NPAGE_SIZE, NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); + RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 2); /* Описываем колонки таблицы данных */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNABBR', - SCAPTION => 'Мнемокод', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'AgentAbbr', - BVISIBLE => true, - BORDER => true, - BFILTER => true, - NWIDTH => 150); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNINFO', - SCAPTION => 'Сведения', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => false, - BFILTER => false, - BEXPANDABLE => true, - NWIDTH => 300); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNNAME', - SCAPTION => 'Наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - SCOND_FROM => 'AgentName', - BVISIBLE => true, - BORDER => true, - BFILTER => true, - SPARENT => 'SAGNINFO', - NWIDTH => 200); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 0); - PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 1); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NAGNTYPE', - SCAPTION => 'Тип', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, - SCOND_FROM => 'AgentType', - BVISIBLE => true, - BORDER => true, - BFILTER => true, - SPARENT => 'SAGNINFO', - NWIDTH => 100, - RCOL_VALS => RAGN_TYPES, - SHINT => 'В Системе бывают контрагенты двух типов:
' || - 'Юридическое лицо - организация, которая имеет в собственности, хозяйственном ведении ' || - 'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' || - 'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.
' || - 'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.'); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SFULLNAME', - SCAPTION => 'Полное наименование', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SAGNIDNUMB', - SCAPTION => 'ИНН', - SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNABBR', + SCAPTION => 'Мнемокод', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'AgentAbbr', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + NWIDTH => 150); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNINFO', + SCAPTION => 'Сведения', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => false, + BFILTER => false, + BEXPANDABLE => true, + NWIDTH => 300); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNNAME', + SCAPTION => 'Наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + SCOND_FROM => 'AgentName', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + SPARENT => 'SAGNINFO', + NWIDTH => 200); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 0); + PKG_P8PANELS_VISUAL.TDG_COL_VALS_ADD(RCOL_VALS => RAGN_TYPES, NVALUE => 1); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NAGNTYPE', + SCAPTION => 'Тип', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + SCOND_FROM => 'AgentType', + BVISIBLE => true, + BORDER => true, + BFILTER => true, + SPARENT => 'SAGNINFO', + NWIDTH => 100, + RCOL_VALS => RAGN_TYPES, + SHINT => 'В Системе бывают контрагенты двух типов:
' || + 'Юридическое лицо - организация, которая имеет в собственности, хозяйственном ведении ' || + 'или оперативном управлении обособленное имущество, отвечает по своим обязательствам этим имуществом, может от своего ' || + 'имени приобретать и осуществлять имущественные и личные неимущественные права, отвечать по своим обязанностям.
' || + 'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.'); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SFULLNAME', + SCAPTION => 'Полное наименование', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); + PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SAGNIDNUMB', + SCAPTION => 'ИНН', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR); /* Обходим данные */ begin /* Добавляем подсказку совместимости */ @@ -336,14 +362,17 @@ create or replace package body PKG_P8PANELS_SAMPLES as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Учтём сортировки */ - PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); + PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG, + RORDERS => RO, + SPATTERN => '%ORDER_BY%', + CSQL => CSQL); /* Учтём фильтры */ - PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT, - NCOMPANY => NCOMPANY, - SUNIT => 'AGNLIST', - SPROCEDURE => 'P_AGNLIST_BASE_COND', - RDATA_GRID => RDG, - RFILTERS => RF); + PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT, + NCOMPANY => NCOMPANY, + SUNIT => 'AGNLIST', + SPROCEDURE => 'P_AGNLIST_BASE_COND', + RDATA_GRID => RDG, + RFILTERS => RF); /* Разбираем его */ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); @@ -356,7 +385,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4); - PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then @@ -371,29 +400,38 @@ create or replace package body PKG_P8PANELS_SAMPLES as if (NAGNTYPE = 0) then SGROUP := 'JUR'; SAGNINFO := SAGNNAME || ', ЮЛ'; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SGROUP, - SCAPTION => 'Юридические лица', - BEXPANDABLE => true, - BEXPANDED => false); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SGROUP, + SCAPTION => 'Юридические лица', + BEXPANDABLE => true, + BEXPANDED => false); else SGROUP := 'PERS'; SAGNINFO := SAGNNAME || ', ФЛ'; - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_GROUP(RDATA_GRID => RDG, - SNAME => SGROUP, - SCAPTION => 'Физические лица', - BEXPANDABLE => true, - BEXPANDED => false); + PKG_P8PANELS_VISUAL.TDG_ADD_GROUP(RDATA_GRID => RDG, + SNAME => SGROUP, + SCAPTION => 'Физические лица', + BEXPANDABLE => true, + BEXPANDED => false); end if; - RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SGROUP); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNABBR', ICURSOR => ICURSOR, NPOSITION => 1); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNINFO', SVALUE => SAGNINFO); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNNAME', SVALUE => SAGNNAME); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NAGNTYPE', NVALUE => NAGNTYPE); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SFULLNAME', ICURSOR => ICURSOR, NPOSITION => 4); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SAGNIDNUMB', ICURSOR => ICURSOR, NPOSITION => 5); + RDG_ROW := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SGROUP); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGNABBR', + ICURSOR => ICURSOR, + NPOSITION => 1); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNINFO', SVALUE => SAGNINFO); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SAGNNAME', SVALUE => SAGNNAME); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NAGNTYPE', NVALUE => NAGNTYPE); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SFULLNAME', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SAGNIDNUMB', + ICURSOR => ICURSOR, + NPOSITION => 5); /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); + PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; /* Освобождаем курсор */ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); @@ -403,7 +441,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as raise; end; /* Сериализуем описание */ - COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_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; /* График */ @@ -666,6 +704,533 @@ create or replace package body PKG_P8PANELS_SAMPLES as DDATE_TO => TRUNC(DDATE_TO)); end loop; end GANTT_MODIFY; + + /* Очистка буфера данных для циклограммы */ + procedure CYCLOGRAM_BASE_CLEAN + ( + NIDENT in number -- Идентификатор буфера + ) + is + begin + /* Удалим из буфера всё с указанным идентификатором */ + delete from P8PNL_SMPL_CYCLOGRAM T where T.IDENT = NIDENT; + end CYCLOGRAM_BASE_CLEAN; + + /* Добавление данных в буфер циклограммы */ + procedure CYCLOGRAM_BASE_INSERT + ( + NIDENT in number, -- Идентификатор буфера + NTYPE in number, -- Тип (0 - колонка, 1 - группа, 2 - задача) + SNAME in varchar2, -- Наименование + NPOS_START in number := null, -- Позиция начала элемента + NPOS_END in number := null, -- Позиция окончания элемента + DDATE_FROM in date := null, -- Дата начала + DDATE_TO in date := null, -- Дата окончания + NTASK_GROUP in number := null, -- Рег. номер группы + NRN out number -- Рег. номер записи + ) + is + begin + /* Генерируем рег. номер записи */ + NRN := GEN_ID(); + /* Добавим запись */ + insert into P8PNL_SMPL_CYCLOGRAM + (RN, IDENT, type, name, POS_START, POS_END, DATE_FROM, DATE_TO, TASK_GROUP) + values + (NRN, NIDENT, NTYPE, SNAME, NPOS_START, NPOS_END, DDATE_FROM, DDATE_TO, NTASK_GROUP); + end CYCLOGRAM_BASE_INSERT; + + /* Исправление данных в буфере циклограммы */ + procedure CYCLOGRAM_BASE_UPDATE + ( + NIDENT in number, -- Идентификатор буфера + NRN in number, -- Рег. номер записи + NTYPE in number, -- Тип задачи (0 - этап/веха, 1 - работа) + SNAME in varchar2, -- Наименование + NPOS_START in number, -- Позиция начала + NPOS_END in number, -- Позиция окончания + DDATE_FROM in date, -- Дата начала + DDATE_TO in date, -- Дата окончания + NTASK_GROUP in number -- Рег. номер группы + ) + is + begin + /* Изменим запись */ + update P8PNL_SMPL_CYCLOGRAM T + set T.TYPE = NTYPE, + T.NAME = SNAME, + T.POS_START = NPOS_START, + T.POS_END = NPOS_END, + T.DATE_FROM = DDATE_FROM, + T.DATE_TO = DDATE_TO, + T.TASK_GROUP = NTASK_GROUP + where T.RN = NRN + and T.IDENT = NIDENT; + end CYCLOGRAM_BASE_UPDATE; + + /* Инициализация буфера данных для циклограммы */ + procedure CYCLOGRAM_INIT + ( + NIDENT in out number -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором) + ) + is + NYEAR PKG_STD.TNUMBER; -- Текущий год + DCYCLOGRAM_START PKG_STD.TLDATE; -- Дата начала циклограммы + DMONTH_CUR PKG_STD.TLDATE; -- Текущий месяц (для расчетов) + DMONTH_START PKG_STD.TLDATE; -- Начало месяца (для расчетов) + DMONTH_END PKG_STD.TLDATE; -- Окончание месяца (для расчетов) + NMONTH_DAYS PKG_STD.TNUMBER; -- Количество дней месяца + NSTART PKG_STD.TNUMBER := 0; -- Позиция начала элемента + NEND PKG_STD.TNUMBER := 0; -- Позиция окончания элемента + NGROUP PKG_STD.TNUMBER; -- Рег. номер группы + NDUMMY PKG_STD.TNUMBER; -- Буфер для рег. номера + NMONTH PKG_STD.TNUMBER; -- Месяц даты + + /* Инициализация группы */ + procedure INIT_GROUP + ( + NIDENT in number, -- Идентификатор буфера + DDATE in date, -- Текущая обрабатываемая дата + NRN in out number -- Рег. номер группы + ) + is + NMONTH PKG_STD.TNUMBER; -- Месяц даты + begin + /* Считываем текущий месяц */ + NMONTH := D_MONTH(DDATE => DDATE); + /* Исходим от даты (формируем группу на начало каждого квартала) */ + case NMONTH + /* Первый квартал */ + when 1 then + /* Добавляем группу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, NTYPE => 1, SNAME => 'I группа', NRN => NRN); + /* Второй квартал */ + when 4 then + /* Добавляем группу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, NTYPE => 1, SNAME => 'II группа', NRN => NRN); + /* Третий квартал */ + when 7 then + /* Добавляем группу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, NTYPE => 1, SNAME => 'III группа', NRN => NRN); + /* Четвертый квартал */ + when 10 then + /* ДОбавляем группу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, NTYPE => 1, SNAME => 'IV группа', NRN => NRN); + else + null; + end case; + end INIT_GROUP; + begin + /* Удаляем старые данные из буфера */ + if (NIDENT is not null) then + CYCLOGRAM_BASE_CLEAN(NIDENT => NIDENT); + else + /* Илиформируем новый идентификатор, если не задан */ + NIDENT := GEN_IDENT(); + end if; + /* Фиксируем текущий год */ + NYEAR := EXTRACT(year from sysdate); + /* Фиксируем дату начала циклограммы */ + DCYCLOGRAM_START := TO_DATE('01.01.' || NYEAR, 'dd.mm.yyyy'); + /* Добавляем колонки и групповые задачи (месяцы года) */ + for I in 0 .. 11 + loop + /* Рассчитываем текущий месяц */ + DMONTH_CUR := ADD_MONTHS(DCYCLOGRAM_START, I); + /* Считываем первый и последний день месяца */ + P_FIRST_LAST_DAY(DCALCDATE => DMONTH_CUR, DBGNDATE => DMONTH_START, DENDDATE => DMONTH_END); + /* Рассчитываем количество дней месяца */ + NMONTH_DAYS := DMONTH_END - DMONTH_START + 1; + /* Рассчитываем позицию окончания элемента */ + NEND := NSTART + (NMONTH_DAYS * NCG_MULTIPLIER); + /* Определяем номер месяца */ + NMONTH := D_MONTH(DDATE => DMONTH_CUR); + /* Добавляем колонку в таблицу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, + NTYPE => 0, + SNAME => TO_CHAR(NMONTH), + NPOS_START => NSTART, + NPOS_END => NEND, + NRN => NDUMMY); + /* Инициализируем группу */ + INIT_GROUP(NIDENT => NIDENT, DDATE => DMONTH_CUR, NRN => NGROUP); + /* Добавляем задачу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, + NTYPE => 2, + SNAME => 'Работа ' || TO_CHAR(I + 1), + NPOS_START => NSTART, + NPOS_END => NEND, + DDATE_FROM => DMONTH_START, + DDATE_TO => DMONTH_END, + NTASK_GROUP => NGROUP, + NRN => NDUMMY); + /* Если это февраль, май, август или ноябрь - добавляем особосбленную задачу */ + if (NMONTH in (2, 5, 8, 11)) then + /* Добавляем обособленную задачу */ + CYCLOGRAM_BASE_INSERT(NIDENT => NIDENT, + NTYPE => 2, + SNAME => 'Обособленная работа ' || NMONTH, + NPOS_START => NSTART, + NPOS_END => NEND, + DDATE_FROM => DMONTH_START, + DDATE_TO => DMONTH_END, + NRN => NDUMMY); + end if; + /* Рассчитываем начало следующего месяца */ + NSTART := NEND; + end loop; + end CYCLOGRAM_INIT; + + /* Сбор данных для отображения циклограммы */ + procedure CYCLOGRAM + ( + NIDENT in number, -- Идентификатор процесса + COUT out clob -- Сериализованные данные для циклограммы + ) + is + CG PKG_P8PANELS_VISUAL.TCYCLOGRAM; -- Описание циклограммы + RTASK PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK; -- Описание задачи циклограммы + NLINE_NUMB PKG_STD.TNUMBER := 0; -- Номер строки + NLINE_NUMB_TMP PKG_STD.TNUMBER := 0; -- Номер строки (буфер) + DTASK_DATE_START PKG_STD.TLDATE; -- Дата начала этапа + DTASK_DATE_END PKG_STD.TLDATE; -- Дата окончания этапа + NTASK_START PKG_STD.TNUMBER := 0; -- Позиция начала этапа + NTASK_END PKG_STD.TNUMBER := 0; -- Позиция окончания этапа + STASK_NAME PKG_STD.TSTRING; -- Наименование задачи + SCOLOR_WHITE PKG_STD.TSTRING := 'white'; -- Цвет - белый + SBG_TASK_COLOR_W_GRP PKG_STD.TSTRING := '#6bc982'; -- Цвет задачи с группой + SHL_TASK_COLOR_W_GRP PKG_STD.TSTRING := '#7dd592'; -- Цвет наведения задачи с группой + SBG_TASK_COLOR_WO_GRP PKG_STD.TSTRING := '#e36d6d'; -- Цвет задачи без группы + STEXT_COLOR_TASK_WO_GRP PKG_STD.TSTRING := '#e5e5e5'; -- Цвет текста задачи без группы + SBG_TASK_COLOR_GRP PKG_STD.TSTRING := 'cadetblue'; -- Цвет групповой задачи + SHL_TASK_COLOR_GRP PKG_STD.TSTRING := '#6fadaf'; -- Цвет наведения групповой задачи + + /* Считывание значений группирующей задачи */ + procedure GROUP_TASK_GET + ( + NIDENT in number, -- Идентификатор процесса + NGROUP in number := null, -- Рег. номер группы + NFLAG_WO_GROUP in number := 0, -- Признак отбора задач без групп (0 - нет, 1 - да) + DTASK_DATE_START out date, -- Дата начала этапа + DTASK_DATE_END out date, -- Дата окончания этапа + NTASK_START out number, -- Позиция начала этапа + NTASK_END out number -- Позиция окончания этапа + ) + is + begin + /* Считываем начало и окончание этапа */ + begin + select min(T.DATE_FROM), + max(T.DATE_TO), + min(T.POS_START), + max(T.POS_END) + into DTASK_DATE_START, + DTASK_DATE_END, + NTASK_START, + NTASK_END + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and (((NFLAG_WO_GROUP = 1) and (T.TASK_GROUP is null)) or ((NFLAG_WO_GROUP = 0) and (T.TASK_GROUP is not null))) + and ((NGROUP is null) or ((NGROUP is not null) and (T.TASK_GROUP = NGROUP))) + and T.TYPE = 2; + end; + end GROUP_TASK_GET; + begin + /* Инициализируем циклограмму */ + CG := PKG_P8PANELS_VISUAL.TCYCLOGRAM_MAKE(STITLE => 'Задачи на ' || TO_CHAR(EXTRACT(year from sysdate)) || ' год'); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR(RCYCLOGRAM => CG, + SNAME => 'ddate_start', + SCAPTION => 'Дата начала', + BVISIBLE => true, + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR(RCYCLOGRAM => CG, + SNAME => 'ddate_end', + SCAPTION => 'Дата окончания', + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK_ATTR(RCYCLOGRAM => CG, + SNAME => 'type', + SCAPTION => 'Тип', + BVISIBLE => false); + /* Обходим колонки */ + for CLMN in (select T.NAME, + T.POS_START, + T.POS_END + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 0) + loop + /* Добавляем колонку */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_COLUMN(RCYCLOGRAM => CG, + SNAME => CLMN.NAME, + NSTART => CLMN.POS_START, + NEND => CLMN.POS_END); + end loop; + /* Считываем значения для задач проекта */ + GROUP_TASK_GET(NIDENT => NIDENT, + NFLAG_WO_GROUP => 0, + DTASK_DATE_START => DTASK_DATE_START, + DTASK_DATE_END => DTASK_DATE_END, + NTASK_START => NTASK_START, + NTASK_END => NTASK_END); + /* Формируем задачу (этап) */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => 1, + SCAPTION => 'Задачи проекта', + SNAME => 'Задачи проекта', + NLINE_NUMB => NLINE_NUMB, + NSTART => NTASK_START, + NEND => NTASK_END, + SBG_COLOR => SCOLOR_WHITE); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_START), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_END)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 0); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Обходим группы */ + for GRP in (select T.RN, + T.NAME, + ROWNUM RNUM + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 1 + order by T.RN asc) + loop + /* Если это вторая группа - сохраним номер строки */ + if (GRP.RNUM = 2) then + NLINE_NUMB_TMP := NLINE_NUMB; + end if; + /* Если это третья группа - вернемся на уровень второй группы */ + if (GRP.RNUM = 3) then + NLINE_NUMB := NLINE_NUMB_TMP; + end if; + /* Добавляем группу */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_GROUP(RCYCLOGRAM => CG, + SNAME => GRP.NAME, + NHEADER_HEIGHT => 30, + NHEADER_WIDTH => 200); + /* Считываем значения этапа группы */ + GROUP_TASK_GET(NIDENT => NIDENT, + NGROUP => GRP.RN, + DTASK_DATE_START => DTASK_DATE_START, + DTASK_DATE_END => DTASK_DATE_END, + NTASK_START => NTASK_START, + NTASK_END => NTASK_END); + /* Формируем задачу (этап) */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => GRP.RN, + SCAPTION => 'Этап ' || TO_CHAR(GRP.RNUM), + SNAME => 'Этап ' || TO_CHAR(GRP.RNUM), + NLINE_NUMB => NLINE_NUMB, + NSTART => NTASK_START, + NEND => NTASK_END, + SBG_COLOR => SBG_TASK_COLOR_GRP, + STEXT_COLOR => SCOLOR_WHITE, + SHIGHLIGHT_COLOR => SHL_TASK_COLOR_GRP); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_START), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_END)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 1); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + /* Обходим задачи группы */ + for TASK in (select T.RN, + T.NAME, + T.POS_START, + T.POS_END, + T.DATE_FROM, + T.DATE_TO, + ROWNUM RNUM + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 2 + and T.TASK_GROUP = GRP.RN) + loop + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Формируем наименование задачи */ + STASK_NAME := 'Работа ' || TO_CHAR(TASK.RNUM) || ' этапа ' || TO_CHAR(GRP.RNUM); + /* Формируем задачу */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => TASK.RN, + SCAPTION => STASK_NAME, + SNAME => STASK_NAME, + NLINE_NUMB => NLINE_NUMB, + NSTART => TASK.POS_START, + NEND => TASK.POS_END, + SGROUP => GRP.NAME, + SBG_COLOR => SBG_TASK_COLOR_W_GRP, + STEXT_COLOR => SCOLOR_WHITE, + SHIGHLIGHT_COLOR => SHL_TASK_COLOR_W_GRP); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => TASK.DATE_FROM), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => TASK.DATE_TO)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'type', + SVALUE => 2); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + end loop; + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + end loop; + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Считываем значения для обособленных задач */ + GROUP_TASK_GET(NIDENT => NIDENT, + NFLAG_WO_GROUP => 1, + DTASK_DATE_START => DTASK_DATE_START, + DTASK_DATE_END => DTASK_DATE_END, + NTASK_START => NTASK_START, + NTASK_END => NTASK_END); + /* Формируем задачу (этап) */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => 1, + SCAPTION => 'Обособленные задачи', + SNAME => 'Обособленные задачи', + NLINE_NUMB => NLINE_NUMB, + NSTART => NTASK_START, + NEND => NTASK_END, + SBG_COLOR => SCOLOR_WHITE); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_START), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => DTASK_DATE_END)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 0); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + /* Указываем следующую строку */ + NLINE_NUMB := NLINE_NUMB + 1; + /* Цикл по обособленным задачам */ + for REC in (select T.RN, + T.NAME, + T.POS_START, + T.POS_END, + T.DATE_FROM, + T.DATE_TO, + ROWNUM RNUM + from P8PNL_SMPL_CYCLOGRAM T + where T.IDENT = NIDENT + and T.TYPE = 2 + and T.TASK_GROUP is null) + loop + /* Формируем наименование задачи */ + STASK_NAME := 'Работа ' || TO_CHAR(REC.RNUM) || ' без этапа '; + /* Формируем задачу */ + RTASK := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_MAKE(NRN => REC.RN, + SCAPTION => STASK_NAME, + SNAME => STASK_NAME, + NLINE_NUMB => NLINE_NUMB, + NSTART => REC.POS_START, + NEND => REC.POS_END, + SBG_COLOR => SBG_TASK_COLOR_WO_GRP, + STEXT_COLOR => STEXT_COLOR_TASK_WO_GRP); + /* Добавляем атрибуты */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_start', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => REC.DATE_FROM), + BCLEAR => true); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, + RTASK => RTASK, + SNAME => 'ddate_end', + SVALUE => PKG_XCONVERT.DATE_TO_XML(DVALUE => REC.DATE_TO)); + PKG_P8PANELS_VISUAL.TCYCLOGRAM_TASK_ADD_ATTR_VAL(RCYCLOGRAM => CG, RTASK => RTASK, SNAME => 'type', SVALUE => 2); + /* Добавляем задачу в циклограмму */ + PKG_P8PANELS_VISUAL.TCYCLOGRAM_ADD_TASK(RCYCLOGRAM => CG, RTASK => RTASK); + end loop; + /* Формируем список */ + COUT := PKG_P8PANELS_VISUAL.TCYCLOGRAM_TO_XML(RCYCLOGRAM => CG); + end CYCLOGRAM; + + /* Изменение задачи циклограммы */ + procedure CYCLOGRAM_TASK_MODIFY + ( + NIDENT in number, -- Идентификатор буфера + NRN in number, -- Рег. номер записи + SDATE_FROM in varchar2, -- Дата начала (в строковом представлении) + SDATE_TO in varchar2 -- Дата окончания (в строковом представлении) + ) + is + DDATE_FROM PKG_STD.TLDATE; -- Дата начала + DDATE_TO PKG_STD.TLDATE; -- Дата окончания + NYEAR PKG_STD.TNUMBER; -- Текущий год + DCYCLOGRAM_START PKG_STD.TLDATE; -- Дата начала циклограммы + NSTART PKG_STD.TNUMBER; -- Позиция начала элемента + NEND PKG_STD.TNUMBER; -- Позиция окончания элемента + begin + /* Фиксируем текущий год */ + NYEAR := EXTRACT(year from sysdate); + /* Переводим даты */ + DDATE_FROM := TO_DATE(SDATE_FROM, 'dd.mm.yyyy'); + DDATE_TO := TO_DATE(SDATE_TO, 'dd.mm.yyyy'); + /* Если дата начала выходит за границы года */ + if (D_YEAR(DDATE => DDATE_FROM) <> NYEAR) then + P_EXCEPTION(0, + 'Дата начала задачи выходит за границы текущего года (%s).', + NYEAR); + end if; + /* Если дата окончания выходит за границы года */ + if (D_YEAR(DDATE => DDATE_TO) <> NYEAR) then + P_EXCEPTION(0, + 'Дата окончания задачи выходит за границы текущего года (%s).', + NYEAR); + end if; + /* Дата окончания не может быть меньше даты начала */ + if (DDATE_TO < DDATE_FROM) then + P_EXCEPTION(0, 'Дата окончания не может быть меньше даты начала.'); + end if; + /* Фиксируем дату начала циклограммы */ + DCYCLOGRAM_START := TO_DATE('01.01.' || NYEAR, 'dd.mm.yyyy'); + /* Рассчитываем новую позицию начала */ + NSTART := (DDATE_FROM - DCYCLOGRAM_START) * NCG_MULTIPLIER; + /* Рассчитываем новую позицию окончания */ + NEND := NSTART + ((DDATE_TO - DDATE_FROM + 1) * NCG_MULTIPLIER); + /* Считываем запись */ + for REC in (select T.* + from P8PNL_SMPL_CYCLOGRAM T + where T.RN = NRN + and T.IDENT = NIDENT) + loop + /* Обновляем запись циклограммы */ + CYCLOGRAM_BASE_UPDATE(NIDENT => REC.IDENT, + NRN => REC.RN, + NTYPE => REC.TYPE, + SNAME => REC.NAME, + NPOS_START => NSTART, + NPOS_END => NEND, + DDATE_FROM => DDATE_FROM, + DDATE_TO => DDATE_TO, + NTASK_GROUP => REC.TASK_GROUP); + end loop; + end CYCLOGRAM_TASK_MODIFY; end PKG_P8PANELS_SAMPLES; / diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck index c1580f2..0c86f8c 100644 --- a/db/PKG_P8PANELS_VISUAL.pck +++ b/db/PKG_P8PANELS_VISUAL.pck @@ -16,20 +16,34 @@ create or replace package PKG_P8PANELS_VISUAL as NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц + /* Константы - масштаб циклограммы */ + NCYCLOGRAM_ZOOM_MIN constant PKG_STD.TLNUMBER := 0.2; -- Минимальный (0.2 от исходного) + NCYCLOGRAM_ZOOM_TINY constant PKG_STD.TLNUMBER := 0.4; -- Мелкий (0.4 от исходного) + NCYCLOGRAM_ZOOM_SMALL constant PKG_STD.TLNUMBER := 0.7; -- Уменьшенный (0.7 от исходного) + NCYCLOGRAM_ZOOM_DEFAULT constant PKG_STD.TLNUMBER := 1; -- Исходный + NCYCLOGRAM_ZOOM_LARGE constant PKG_STD.TLNUMBER := 1.5; -- Увеличенный (1.5 от исходного) + NCYCLOGRAM_ZOOM_HUGE constant PKG_STD.TLNUMBER := 2; -- Большой (2 от исходного) + NCYCLOGRAM_ZOOM_MAX constant PKG_STD.TLNUMBER := 2.5; -- Максимальный (2.5 от исходного) + /* Константы - тип графика */ - SCHART_TYPE_BAR constant PKG_STD.TSTRING := 'bar'; - SCHART_TYPE_LINE constant PKG_STD.TSTRING := 'line'; - SCHART_TYPE_PIE constant PKG_STD.TSTRING := 'pie'; - SCHART_TYPE_DOUGHNUT constant PKG_STD.TSTRING := 'doughnut'; + SCHART_TYPE_BAR constant PKG_STD.TSTRING := 'bar'; -- Столбчатая + SCHART_TYPE_LINE constant PKG_STD.TSTRING := 'line'; -- Линейная + SCHART_TYPE_PIE constant PKG_STD.TSTRING := 'pie'; -- Круговая + SCHART_TYPE_DOUGHNUT constant PKG_STD.TSTRING := 'doughnut'; -- Кольцевая /* Константы - расположение легенды графика */ - SCHART_LGND_POS_LEFT constant PKG_STD.TSTRING := 'left'; - SCHART_LGND_POS_RIGHT constant PKG_STD.TSTRING := 'right'; - SCHART_LGND_POS_TOP constant PKG_STD.TSTRING := 'top'; - SCHART_LGND_POS_BOTTOM constant PKG_STD.TSTRING := 'bottom'; + SCHART_LGND_POS_LEFT constant PKG_STD.TSTRING := 'left'; -- Слева + SCHART_LGND_POS_RIGHT constant PKG_STD.TSTRING := 'right'; -- Справа + SCHART_LGND_POS_TOP constant PKG_STD.TSTRING := 'top'; -- Наверху + SCHART_LGND_POS_BOTTOM constant PKG_STD.TSTRING := 'bottom'; -- Внизу + + /* Константы - циклограмма */ + NCYCLOGRAM_GROUP_DEF_WIDTH constant PKG_STD.TNUMBER := 100; -- Высота заголовка группы (по умолчанию) + NCYCLOGRAM_GROUP_DEF_HEIGHT constant PKG_STD.TNUMBER := 42; -- Ширина заголовка группы (по умолчанию) + NCYCLOGRAM_LINE_HEIGHT constant PKG_STD.TNUMBER := 20; -- Высота строк циклограммы /* Типы данных - значение колонки таблицы данных */ - type TCOL_VAL is record + type TDG_COL_VAL is record ( SVALUE PKG_STD.TLSTRING, -- Значение (строка) NVALUE PKG_STD.TLNUMBER, -- Значение (число) @@ -37,10 +51,10 @@ create or replace package PKG_P8PANELS_VISUAL as ); /* Типы данных - коллекция значений колонки таблицы данных */ - type TCOL_VALS is table of TCOL_VAL; + type TDG_COL_VALS is table of TDG_COL_VAL; /* Типы данных - описатель колонки таблицы данных */ - type TCOL_DEF is record + type TDG_COL_DEF is record ( SNAME PKG_STD.TSTRING, -- Наименование SCAPTION PKG_STD.TSTRING, -- Заголовок @@ -50,7 +64,7 @@ create or replace package PKG_P8PANELS_VISUAL as BVISIBLE boolean, -- Разрешить отображение BORDER boolean, -- Разрешить сортировку BFILTER boolean, -- Разрешить отбор - RCOL_VALS TCOL_VALS, -- Предопределённые значения + RCOL_VALS TDG_COL_VALS, -- Предопределённые значения SHINT PKG_STD.TSTRING, -- Текст всплывающей подсказки SPARENT PKG_STD.TSTRING, -- Наименование родительской колонки BEXPANDABLE boolean, -- Разрешить сокрытие/отображение дочерних колонок @@ -59,30 +73,30 @@ create or replace package PKG_P8PANELS_VISUAL as ); /* Типы данных - коллекция описателей колонок таблицы данных */ - type TCOL_DEFS is table of TCOL_DEF; + type TDG_COL_DEFS is table of TDG_COL_DEF; /* Типы данных - колонка */ - type TCOL is record + type TDG_COL is record ( SNAME PKG_STD.TSTRING, -- Наименование - RCOL_VAL TCOL_VAL -- Значение + RCOL_VAL TDG_COL_VAL -- Значение ); /* Типы данных - коллекция колонок */ - type TCOLS is table of TCOL; + type TDG_COLS is table of TDG_COL; /* Типы данных - строка */ - type TROW is record + type TDG_ROW is record ( SGROUP PKG_STD.TSTRING, -- Наименование группы - RCOLS TCOLS -- Колонки + RCOLS TDG_COLS -- Колонки ); /* Типы данных - коллекция строк */ - type TROWS is table of TROW; + type TDG_ROWS is table of TDG_ROW; /* Типы данных - группа */ - type TGROUP is record + type TDG_GROUP is record ( SNAME PKG_STD.TSTRING, -- Наименование SCAPTION PKG_STD.TSTRING, -- Заголовок @@ -91,20 +105,20 @@ create or replace package PKG_P8PANELS_VISUAL as ); /* Типы данных - коллекция групп */ - type TGROUPS is table of TGROUP; + type TDG_GROUPS is table of TDG_GROUP; /* Типы данных - таблица данных */ - type TDATA_GRID is record + type TDG is record ( BFIXED_HEADER boolean, -- Зафиксировать заголовок NFIXED_COLUMNS PKG_STD.TNUMBER, -- Количество фиксированных колонок - RCOL_DEFS TCOL_DEFS, -- Описание колонок - RGROUPS TGROUPS, -- Описание групп - RROWS TROWS -- Данные строк + RCOL_DEFS TDG_COL_DEFS, -- Описание колонок + RGROUPS TDG_GROUPS, -- Описание групп + RROWS TDG_ROWS -- Данные строк ); /* Типы данных - фильтр */ - type TFILTER is record + type TDG_FILTER is record ( SNAME PKG_STD.TSTRING, -- Наименование SFROM PKG_STD.TSTRING, -- Значение "с" @@ -112,17 +126,17 @@ create or replace package PKG_P8PANELS_VISUAL as ); /* Типы данных - коллекция фильтров */ - type TFILTERS is table of TFILTER; + type TDG_FILTERS is table of TDG_FILTER; /* Типы данных - сортировка */ - type TORDER is record + type TDG_ORDER is record ( SNAME PKG_STD.TSTRING, -- Наименование SDIRECTION PKG_STD.TSTRING -- Направление (см. константы SORDER_DIRECTION_*) ); /* Типы данных - коллекция сортировок */ - type TORDERS is table of TORDER; + type TDG_ORDERS is table of TDG_ORDER; /* Типы данных - описание атрибута задачи для диаграммы Ганта */ type TGANTT_TASK_ATTR is record @@ -242,6 +256,83 @@ create or replace package PKG_P8PANELS_VISUAL as RDATASETS TCHART_DATASETS -- Наборы данных ); + /* Типы данных - описание атрибута задачи для циклограммы */ + type TCYCLOGRAM_TASK_ATTR is record + ( + SNAME PKG_STD.TSTRING, -- Наименование + SCAPTION PKG_STD.TSTRING, -- Заголовок + BVISIBLE boolean -- Разрешить отображение + ); + + /* Типы данных - коллекция описаний атрибутов задачи для циклограммы */ + type TCYCLOGRAM_TASK_ATTRS is table of TCYCLOGRAM_TASK_ATTR; + + /* Типы данных - значение атрибута задачи для циклограммы */ + type TCYCLOGRAM_TASK_ATTR_VAL is record + ( + SNAME PKG_STD.TSTRING, -- Наименование + SVALUE PKG_STD.TSTRING -- Значение + ); + + /* Типы данных - коллекция значений атрибутов задачи для циклограммы */ + type TCYCLOGRAM_TASK_ATTR_VALS is table of TCYCLOGRAM_TASK_ATTR_VAL; + + /* Типы данных - колонка циклограммы */ + type TCYCLOGRAM_COLUMN is record + ( + SNAME PKG_STD.TSTRING, -- Наименование колонки + NSTART PKG_STD.TNUMBER, -- Позиция начала колонки + NEND PKG_STD.TNUMBER -- Позиция конца колонки + ); + + /* Типы данных - коллекция колонок циклограммы */ + type TCYCLOGRAM_COLUMNS is table of TCYCLOGRAM_COLUMN; + + /* Типы данных - строки циклограммы */ + type TCYCLOGRAM_TASK is record + ( + NRN PKG_STD.TREF, -- Рег. номер + SCAPTION PKG_STD.TSTRING, -- Заголовок + SNAME PKG_STD.TSTRING, -- Наименование + NLINE_NUMB PKG_STD.TNUMBER, -- Номер строки + NSTART PKG_STD.TNUMBER, -- Позиция начала задачи + NEND PKG_STD.TNUMBER, -- Позиция конца задачи + SGROUP PKG_STD.TSTRING, -- Наименование группы + SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + STEXT_COLOR PKG_STD.TSTRING := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + SHIGHLIGHT_COLOR PKG_STD.TSTRING := null, -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + RATTR_VALS TCYCLOGRAM_TASK_ATTR_VALS := null -- Значения дополнительных атрбутов (null - дополнительные атрибуты не определены) + ); + + /* Типы данных - коллекция строк циклограммы */ + type TCYCLOGRAM_TASKS is table of TCYCLOGRAM_TASK; + + /* Типы данных - группа строк циклограммы */ + type TCYCLOGRAM_GROUP is record + ( + SNAME PKG_STD.TSTRING, -- Имя группы + BHEADER_VISIBLE boolean, -- Признак отображения заголовка группы + NHEADER_HEIGHT PKG_STD.TNUMBER, -- Высота заголовка группы + NHEADER_WIDTH PKG_STD.TNUMBER, -- Ширина заголовка группы + SHIGHLIGHT_COLOR PKG_STD.TSTRING := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + ); + + /* Типы данных - коллекция групп строк циклограммы */ + type TCYCLOGRAM_GROUPS is table of TCYCLOGRAM_GROUP; + + /* Типы данных - циклограмма */ + type TCYCLOGRAM is record + ( + STITLE PKG_STD.TSTRING, -- Заголовок (null - не отображать) + NLINE_HEIGHT PKG_STD.TLNUMBER, -- Высота строк + NZOOM PKG_STD.TNUMBER := NCYCLOGRAM_ZOOM_DEFAULT, -- Текущий масштаб (см. константы NCYCLOGRAM_ZOOM_*) + BZOOM_BAR boolean := true, -- Обображать панель масштабирования + RCOLUMNS TCYCLOGRAM_COLUMNS, -- Коллекция колонок циклограммы + RGROUPS TCYCLOGRAM_GROUPS, -- Коллекция групп строк циклограммы + RTASKS TCYCLOGRAM_TASKS, -- Коллекция строк циклограммы + RTASK_ATTRS TCYCLOGRAM_TASK_ATTRS -- Описание атрибутов карточки задачи + ); + /* Расчет диапаона выдаваемых записей */ procedure UTL_ROWS_LIMITS_CALC ( @@ -264,80 +355,80 @@ create or replace package PKG_P8PANELS_VISUAL as ) return varchar2; -- Результат /* Добавление значения в коллекцию */ - procedure TCOL_VALS_ADD + procedure TDG_COL_VALS_ADD ( - RCOL_VALS in out nocopy TCOL_VALS, -- Коллекция значений - SVALUE in varchar2 := null, -- Значение (строка) - NVALUE in number := null, -- Значение (число) - DVALUE in date := null, -- Значение (дата) - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RCOL_VALS in out nocopy TDG_COL_VALS, -- Коллекция значений + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Формирование строки */ - function TROW_MAKE + function TDG_ROW_MAKE ( SGROUP in varchar2 := null -- Наименование группы - ) return TROW; -- Результат работы + ) return TDG_ROW; -- Результат работы /* Добавление колонки к строке */ - procedure TROW_ADD_COL + procedure TDG_ROW_ADD_COL ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - SVALUE in varchar2 := null, -- Значение (строка) - NVALUE in number := null, -- Значение (число) - DVALUE in date := null, -- Значение (дата) - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Добавление строковой колонки к строке из курсора динамического запроса */ - procedure TROW_ADD_CUR_COLS + procedure TDG_ROW_ADD_CUR_COLS ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - ICURSOR in integer, -- Курсор - NPOSITION in number, -- Номер колонки в курсоре - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Добавление числовой колонки к строке из курсора динамического запроса */ - procedure TROW_ADD_CUR_COLN + procedure TDG_ROW_ADD_CUR_COLN ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - ICURSOR in integer, -- Курсор - NPOSITION in number, -- Номер колонки в курсоре - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Добавление колонки типа "дата" к строке из курсора динамического запроса */ - procedure TROW_ADD_CUR_COLD + procedure TDG_ROW_ADD_CUR_COLD ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - ICURSOR in integer, -- Курсор - NPOSITION in number, -- Номер колонки в курсоре - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Формирование таблицы данных */ - function TDATA_GRID_MAKE + function TDG_MAKE ( BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок - ) return TDATA_GRID; -- Результат работы + ) return TDG; -- Результат работы /* Поиск описания колонки в таблице данных по наименованию */ - function TDATA_GRID_FIND_COL_DEF + function TDG_FIND_COL_DEF ( - RDATA_GRID in TDATA_GRID, -- Описание таблицы данных - SNAME in varchar2 -- Наименование колонки - ) return TCOL_DEF; -- Найденное описание (null - если не нашли) + RDATA_GRID in TDG, -- Описание таблицы данных + SNAME in varchar2 -- Наименование колонки + ) return TDG_COL_DEF; -- Найденное описание (null - если не нашли) /* Добавление описания колонки к таблице данных */ - procedure TDATA_GRID_ADD_COL_DEF + procedure TDG_ADD_COL_DEF ( - RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + RDATA_GRID in out nocopy TDG, -- Описание таблицы данных SNAME in varchar2, -- Наименование колонки SCAPTION in varchar2, -- Заголовок колонки SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных колонки (см. константы SDATA_TYPE_*) @@ -346,7 +437,7 @@ create or replace package PKG_P8PANELS_VISUAL as BVISIBLE in boolean := true, -- Разрешить отображение BORDER in boolean := false, -- Разрешить сортировку по колонке BFILTER in boolean := false, -- Разрешить отбор по колонке - RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения колонки + RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения колонки SHINT in varchar2 := null, -- Текст всплывающей подсказки SPARENT in varchar2 := null, -- Наименование родительской колонки BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок @@ -356,84 +447,84 @@ create or replace package PKG_P8PANELS_VISUAL as ); /* Добавление описания группы к таблице данных */ - procedure TDATA_GRID_ADD_GROUP + procedure TDG_ADD_GROUP ( - RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных - SNAME in varchar2, -- Наименование группы - SCAPTION in varchar2, -- Заголовок группы - BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних - BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние - BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) + RDATA_GRID in out nocopy TDG, -- Описание таблицы данных + SNAME in varchar2, -- Наименование группы + SCAPTION in varchar2, -- Заголовок группы + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние + BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Добавление описания колонки к таблице данных */ - procedure TDATA_GRID_ADD_ROW + procedure TDG_ADD_ROW ( - RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных - RROW in TROW, -- Строка - BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) + RDATA_GRID in out nocopy TDG, -- Описание таблицы данных + RROW in TDG_ROW, -- Строка + BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ); /* Сериализация таблицы данных */ - function TDATA_GRID_TO_XML + function TDG_TO_XML ( - RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + RDATA_GRID in TDG, -- Описание таблицы данных NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да) ) return clob; -- XML-описание /* Конвертация значений фильтра в число */ - procedure TFILTER_TO_NUMBER + procedure TDG_FILTER_TO_NUMBER ( - RFILTER in TFILTER, -- Фильтр - NFROM out number, -- Значение нижней границы диапазона - NTO out number -- Значение верхней границы диапазона + RFILTER in TDG_FILTER, -- Фильтр + NFROM out number, -- Значение нижней границы диапазона + NTO out number -- Значение верхней границы диапазона ); /* Конвертация значений фильтра в дату */ - procedure TFILTER_TO_DATE + procedure TDG_FILTER_TO_DATE ( - RFILTER in TFILTER, -- Фильтр - DFROM out date, -- Значение нижней границы диапазона - DTO out date -- Значение верхней границы диапазона + RFILTER in TDG_FILTER, -- Фильтр + DFROM out date, -- Значение нижней границы диапазона + DTO out date -- Значение верхней границы диапазона ); /* Поиск фильтра в коллекции */ - function TFILTERS_FIND + function TDG_FILTERS_FIND ( - RFILTERS in TFILTERS, -- Коллекция фильтров - SNAME in varchar2 -- Наименование - ) return TFILTER; -- Найденный фильтр (null - если не нашли) + RFILTERS in TDG_FILTERS, -- Коллекция фильтров + SNAME in varchar2 -- Наименование + ) return TDG_FILTER; -- Найденный фильтр (null - если не нашли) /* Десериализация фильтров */ - function TFILTERS_FROM_XML + function TDG_FILTERS_FROM_XML ( - CFILTERS in clob -- Сериализованное представление фильтров (BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)) - ) return TFILTERS; -- Результат работы + CFILTERS in clob -- Сериализованное представление фильтров (BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)) + ) return TDG_FILTERS; -- Результат работы /* Применение параметров фильтрации в запросе */ - procedure TFILTERS_SET_QUERY + procedure TDG_FILTERS_SET_QUERY ( NIDENT in number, -- Идентификатор отбора NCOMPANY in number, -- Рег. номер организации NPARENT in number := null, -- Рег. номер родителя SUNIT in varchar2, -- Код раздела SPROCEDURE in varchar2, -- Наименование серверной процедуры отбора - RDATA_GRID in TDATA_GRID, -- Описание таблицы данных - RFILTERS in TFILTERS -- Коллекция фильтров + RDATA_GRID in TDG, -- Описание таблицы данных + RFILTERS in TDG_FILTERS -- Коллекция фильтров ); /* Десериализация сортировок */ - function TORDERS_FROM_XML + function TDG_ORDERS_FROM_XML ( CORDERS in clob -- Сериализованное представление сотрировок (BASE64(ИМЯASC/DESC...)) - ) return TORDERS; -- Результат работы + ) return TDG_ORDERS; -- Результат работы /* Применение параметров сортировки в запросе */ - procedure TORDERS_SET_QUERY + procedure TDG_ORDERS_SET_QUERY ( - RDATA_GRID in TDATA_GRID, -- Описание таблицы - RORDERS in TORDERS, -- Коллекция сортировок + RDATA_GRID in TDG, -- Описание таблицы + RORDERS in TDG_ORDERS, -- Коллекция сортировок SPATTERN in varchar2, -- Шаблон для подстановки условий отбора в запрос CSQL in out nocopy clob -- Буфер запроса ); @@ -577,14 +668,92 @@ create or replace package PKG_P8PANELS_VISUAL as RCHART in TCHART, -- Описание графика NINCLUDE_DEF in number := 1 -- Включить описание заголовка (0 - нет, 1 - да) ) return clob; -- XML-описание + + /* Формирование задачи циклограммы */ + function TCYCLOGRAM_TASK_MAKE + ( + NRN in number, -- Рег. номер записи + SCAPTION in varchar2, -- Заголовок + SNAME in varchar2, -- Наименование + NLINE_NUMB in number, -- Номер строки + NSTART in number, -- Позиция начала задачи + NEND in number, -- Позиция конца задачи + SGROUP in varchar2 := null, -- Наименование группы + SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + SHIGHLIGHT_COLOR in varchar2 := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + ) return TCYCLOGRAM_TASK; -- Результат работы + + /* Добавление значения атрибута к задаче циклограммы */ + procedure TCYCLOGRAM_TASK_ADD_ATTR_VAL + ( + RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы + RTASK in out nocopy TCYCLOGRAM_TASK, -- Описание задачи + SNAME in varchar2, -- Наименование + SVALUE in varchar2, -- Значение + BCLEAR in boolean := false -- Флаг очистки коллекции значений атрибутов (false - не очищать, true - очистить коллекцию перед добавлением) + ); + + /* Формирование циклограммы */ + function TCYCLOGRAM_MAKE + ( + STITLE in varchar2, -- Заголовок (null - не отображать) + NLINE_HEIGHT in number := NCYCLOGRAM_LINE_HEIGHT, -- Высота строк + NZOOM in number := NCYCLOGRAM_ZOOM_DEFAULT, -- Текущий масштаб (см. константы NCYCLOGRAM_ZOOM_*) + BZOOM_BAR in boolean := true -- Обображать панель масштабирования + ) return TCYCLOGRAM; -- Результат работы + + /* Добавление колонки в циклограмму */ + procedure TCYCLOGRAM_ADD_COLUMN + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + SNAME in varchar2, -- Заголовок колонки + NSTART in number, -- Позиция начала колонки + NEND in number, -- Позиция конца колонки + BCLEAR in boolean := false -- Флаг очистки коллекции колонок циклограммы (false - не очищать, true - очистить коллекцию перед добавлением) + ); + + /* Добавление группы в циклограмму */ + procedure TCYCLOGRAM_ADD_GROUP + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + SNAME in varchar2, -- Имя группы + BHEADER_VISIBLE in boolean := true, -- Признак отображения заголовка группы + NHEADER_HEIGHT in number := NCYCLOGRAM_GROUP_DEF_HEIGHT, -- Высота заголовка группы + NHEADER_WIDTH in number := NCYCLOGRAM_GROUP_DEF_WIDTH, -- Ширина заголовка группы + SHIGHLIGHT_COLOR in varchar2 := null, -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + BCLEAR in boolean := false -- Флаг очистки коллекции групп (false - не очищать, true - очистить коллекцию перед добавлением) + ); + + /* Добавление задачи в циклограммы */ + procedure TCYCLOGRAM_ADD_TASK + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + RTASK in TCYCLOGRAM_TASK, -- Задача циклограммы + BCLEAR in boolean := false -- Флаг очистки коллекции задач (false - не очищать, true - очистить коллекцию перед добавлением) + ); + + /* Добавление описания атрибута задачи циклограммы */ + procedure TCYCLOGRAM_ADD_TASK_ATTR + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + BVISIBLE boolean := true, -- Разрешить отображение + BCLEAR in boolean := false -- Флаг очистки коллекции атрибутов (false - не очищать, true - очистить коллекцию перед добавлением) + ); + + /* Сериализация циклограммы */ + function TCYCLOGRAM_TO_XML + ( + RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы + NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да) + ) return clob; -- XML-описание end PKG_P8PANELS_VISUAL; / create or replace package body PKG_P8PANELS_VISUAL as -/* -TODO: owner="root" created="18.10.2023" -text="Формат data_grid и gant как в chart" -*/ + /* Константы - тэги запросов */ SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- Тэг для корня данных запроса SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- Тэг для строк данных @@ -596,45 +765,49 @@ text="Формат data_grid и gant как в chart" /* Константы - тэги ответов */ SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных - SRESP_TAG_XROWS constant PKG_STD.TSTRING := 'XROWS'; -- Тэг для строк данных - SRESP_TAG_XCOLUMNS_DEF constant PKG_STD.TSTRING := 'XCOLUMNS_DEF'; -- Тэг для описания колонок - SRESP_TAG_XGROUPS constant PKG_STD.TSTRING := 'XGROUPS'; -- Тэг для описания групп - SRESP_TAG_XGANTT_DEF constant PKG_STD.TSTRING := 'XGANTT_DEF'; -- Тэг для описания заголовка диаграммы Ганта - SRESP_TAG_XGANTT_TASKS constant PKG_STD.TSTRING := 'XGANTT_TASKS'; -- Тэг для описания коллекции задач диаграммы Ганта SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных + SRESP_TAG_XCYCLOGRAM constant PKG_STD.TSTRING := 'XCYCLOGRAM'; -- Тэг для описания циклограммы + SRESP_TAG_XGANTT constant PKG_STD.TSTRING := 'XGANTT'; -- Тэг для описания диаграммы Ганта /* Константы - атрибуты ответов (универсальные) */ - SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования - SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи - SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных - SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости - SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка - SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба - SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора - SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала - SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания - SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера - SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера - SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования - SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания - SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа - SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки - SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы - SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя - SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения - SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения - SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка - SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок - SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины - + SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования + SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи + SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных + SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости + SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка + SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба + SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора + SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала + SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания + SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера + SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера + SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования + SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания + SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа + SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки + SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы + SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя + SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения + SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения + SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка + SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок + SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины + SRESP_ATTR_HEIGHT constant PKG_STD.TSTRING := 'height'; -- Атрибут для высоты + SRESP_ATTR_COLUMNS constant PKG_STD.TSTRING := 'columns'; -- Атрибут для колонок + SRESP_ATTR_TASKS constant PKG_STD.TSTRING := 'tasks'; -- Атрибут для задач + SRESP_ATTR_HL_COLOR constant PKG_STD.TSTRING := 'highlightColor'; -- Атрибут для цвета подсветки + SRESP_ATTR_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба + SRESP_ATTR_ROWS constant PKG_STD.TSTRING := 'rows'; -- Атрибут для строк данных + SRESP_ATTR_COLUMNS_DEF constant PKG_STD.TSTRING := 'columnsDef'; -- Атрибут для описания колонок + SRESP_ATTR_GROUPS constant PKG_STD.TSTRING := 'groups'; -- Атрибут для описания групп + /* Константы - атрибуты ответов (таблица данных) */ SRESP_ATTR_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки SRESP_ATTR_DT_FILTER constant PKG_STD.TSTRING := 'filter'; -- Атрибут для флага отбора SRESP_ATTR_DT_COLUMN_VALUES constant PKG_STD.TSTRING := 'values'; -- Атрибут для предопределённых значений /* Константы - атрибуты ответов (диаграмма Ганта) */ - SRESP_ATTR_GANTT_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба диаграммы Ганта SRESP_ATTR_TASK_PROGRESS constant PKG_STD.TSTRING := 'progress'; -- Атрибут для прогресса задачи SRESP_ATTR_TASK_DEPS constant PKG_STD.TSTRING := 'dependencies'; -- Атрибут для зависимостей задачи SRESP_ATTR_TASK_RO constant PKG_STD.TSTRING := 'readOnly'; -- Атрибут для флага задачи "только для чтения" @@ -657,6 +830,10 @@ text="Формат data_grid и gant как в chart" SRESP_ATTR_CHART_DS_ITEMS constant PKG_STD.TSTRING := 'items'; -- Атрибут для коллекции элементов набора данных SRESP_ATTR_CHART_DS_I_VAL constant PKG_STD.TSTRING := 'value'; -- Атрибут для значения элемента набора данных + /* Константы - атрибуты ответов (циклограмма) */ + SRESP_ATTR_CG_TASK_LINE constant PKG_STD.TSTRING := 'lineNumb'; -- Атрибут для номера строки (по оси Y) + SRESP_ATTR_CG_LINE_HEIGHT constant PKG_STD.TSTRING := 'lineHeight'; -- Атрибут для высоты строк + /* Константы - параметры условий отбора */ SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- Постфикс наименования нижней границы условия отбора SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- Постфикс наименования верхней границы условия отбора @@ -702,14 +879,14 @@ text="Формат data_grid и gant как в chart" end UTL_COND_NAME_MAKE_TO; /* Формирование значения */ - function TCOL_VAL_MAKE + function TDG_COL_VAL_MAKE ( SVALUE in varchar2, -- Значение (строка) NVALUE in number, -- Значение (число) DVALUE in date -- Значение (дата) - ) return TCOL_VAL -- Результат работы + ) return TDG_COL_VAL -- Результат работы is - RRES TCOL_VAL; -- Буфер для результата + RRES TDG_COL_VAL; -- Буфер для результата begin /* Формируем объект */ RRES.SVALUE := SVALUE; @@ -717,30 +894,30 @@ text="Формат data_grid и gant как в chart" RRES.DVALUE := DVALUE; /* Возвращаем результат */ return RRES; - end TCOL_VAL_MAKE; + end TDG_COL_VAL_MAKE; /* Добавление значения в коллекцию */ - procedure TCOL_VALS_ADD + procedure TDG_COL_VALS_ADD ( - RCOL_VALS in out nocopy TCOL_VALS, -- Коллекция значений - SVALUE in varchar2 := null, -- Значение (строка) - NVALUE in number := null, -- Значение (число) - DVALUE in date := null, -- Значение (дата) - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RCOL_VALS in out nocopy TDG_COL_VALS, -- Коллекция значений + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Инициализируем коллекцию если необходимо */ if ((RCOL_VALS is null) or (BCLEAR)) then - RCOL_VALS := TCOL_VALS(); + RCOL_VALS := TDG_COL_VALS(); end if; /* Добавляем элемент */ RCOL_VALS.EXTEND(); - RCOL_VALS(RCOL_VALS.LAST) := TCOL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); - end TCOL_VALS_ADD; + RCOL_VALS(RCOL_VALS.LAST) := TDG_COL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); + end TDG_COL_VALS_ADD; /* Формирование описания колонки */ - function TCOL_DEF_MAKE + function TDG_COL_DEF_MAKE ( SNAME in varchar2, -- Наименование SCAPTION in varchar2, -- Заголовок @@ -750,15 +927,15 @@ text="Формат data_grid и gant как в chart" BVISIBLE in boolean := true, -- Разрешить отображение BORDER in boolean := false, -- Разрешить сортировку BFILTER in boolean := false, -- Разрешить отбор - RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения + RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения SHINT in varchar2 := null, -- Текст всплывающей подсказки SPARENT in varchar2 := null, -- Наименование родительской колонки BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки NWIDTH in number := null -- Ширина колонки (обязательно для фиксированных) - ) return TCOL_DEF -- Результат работы + ) return TDG_COL_DEF -- Результат работы is - RRES TCOL_DEF; -- Буфер для результата + RRES TDG_COL_DEF; -- Буфер для результата begin /* Формируем объект */ RRES.SNAME := SNAME; @@ -769,7 +946,7 @@ text="Формат data_grid и gant как в chart" RRES.BVISIBLE := COALESCE(BVISIBLE, true); RRES.BORDER := COALESCE(BORDER, false); RRES.BFILTER := COALESCE(BFILTER, false); - RRES.RCOL_VALS := COALESCE(RCOL_VALS, TCOL_VALS()); + RRES.RCOL_VALS := COALESCE(RCOL_VALS, TDG_COL_VALS()); RRES.SHINT := SHINT; RRES.SPARENT := SPARENT; RRES.BEXPANDABLE := COALESCE(BEXPANDABLE, false); @@ -777,12 +954,12 @@ text="Формат data_grid и gant как в chart" RRES.NWIDTH := NWIDTH; /* Возвращаем результат */ return RRES; - end TCOL_DEF_MAKE; + end TDG_COL_DEF_MAKE; /* Добавление описания колонки в коллекцию */ - procedure TCOL_DEFS_ADD + procedure TDG_COL_DEFS_ADD ( - RCOL_DEFS in out nocopy TCOL_DEFS, -- Коллекция описаний колонок + RCOL_DEFS in out nocopy TDG_COL_DEFS, -- Коллекция описаний колонок SNAME in varchar2, -- Наименование SCAPTION in varchar2, -- Заголовок SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных (см. константы SDATA_TYPE_*) @@ -791,7 +968,7 @@ text="Формат data_grid и gant как в chart" BVISIBLE in boolean := true, -- Разрешить отображение BORDER in boolean := false, -- Разрешить сортировку BFILTER in boolean := false, -- Разрешить отбор - RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения + RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения SHINT in varchar2 := null, -- Текст всплывающей подсказки SPARENT in varchar2 := null, -- Наименование родительской колонки BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок @@ -803,32 +980,32 @@ text="Формат data_grid и gant как в chart" begin /* Инициализируем коллекцию если необходимо */ if ((RCOL_DEFS is null) or (BCLEAR)) then - RCOL_DEFS := TCOL_DEFS(); + RCOL_DEFS := TDG_COL_DEFS(); end if; /* Добавляем элемент */ RCOL_DEFS.EXTEND(); - RCOL_DEFS(RCOL_DEFS.LAST) := TCOL_DEF_MAKE(SNAME => SNAME, - SCAPTION => SCAPTION, - SDATA_TYPE => SDATA_TYPE, - SCOND_FROM => SCOND_FROM, - SCOND_TO => SCOND_TO, - BVISIBLE => BVISIBLE, - BORDER => BORDER, - BFILTER => BFILTER, - RCOL_VALS => RCOL_VALS, - SHINT => SHINT, - SPARENT => SPARENT, - BEXPANDABLE => BEXPANDABLE, - BEXPANDED => BEXPANDED, - NWIDTH => NWIDTH); - end TCOL_DEFS_ADD; + RCOL_DEFS(RCOL_DEFS.LAST) := TDG_COL_DEF_MAKE(SNAME => SNAME, + SCAPTION => SCAPTION, + SDATA_TYPE => SDATA_TYPE, + SCOND_FROM => SCOND_FROM, + SCOND_TO => SCOND_TO, + BVISIBLE => BVISIBLE, + BORDER => BORDER, + BFILTER => BFILTER, + RCOL_VALS => RCOL_VALS, + SHINT => SHINT, + SPARENT => SPARENT, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED, + NWIDTH => NWIDTH); + end TDG_COL_DEFS_ADD; /* Поиск описания колонки по наименованию */ - function TCOL_DEFS_FIND + function TDG_COL_DEFS_FIND ( - RCOL_DEFS in TCOL_DEFS, -- Описание колонок таблицы данных - SNAME in varchar2 -- Наименование - ) return TCOL_DEF -- Найденное описание (null - если не нашли) + RCOL_DEFS in TDG_COL_DEFS, -- Описание колонок таблицы данных + SNAME in varchar2 -- Наименование + ) return TDG_COL_DEF -- Найденное описание (null - если не нашли) is begin /* Обходим колонки из коллекции описаний */ @@ -842,12 +1019,12 @@ text="Формат data_grid и gant как в chart" end if; /* Ничего не нашли */ return null; - end TCOL_DEFS_FIND; + end TDG_COL_DEFS_FIND; /* Сериализация описания колонок таблицы данных */ - procedure TCOL_DEFS_TO_XML + procedure TDG_COL_DEFS_TO_XML ( - RCOL_DEFS in TCOL_DEFS -- Описание колонок таблицы данных + RCOL_DEFS in TDG_COL_DEFS -- Описание колонок таблицы данных ) is begin @@ -856,7 +1033,7 @@ text="Формат data_grid и gant как в chart" for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST loop /* Открываем описание колонки */ - PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCOLUMNS_DEF); + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_COLUMNS_DEF); /* Атрибуты колонки */ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCOL_DEFS(I).SNAME); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RCOL_DEFS(I).SCAPTION); @@ -899,57 +1076,57 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.UP(); end loop; end if; - end TCOL_DEFS_TO_XML; + end TDG_COL_DEFS_TO_XML; /* Формирование колонки */ - function TCOL_MAKE + function TDG_COL_MAKE ( SNAME in varchar2, -- Наименование колонки SVALUE in varchar2 := null, -- Значение (строка) NVALUE in number := null, -- Значение (число) DVALUE in date := null -- Значение (дата) - ) return TCOL -- Результат работы + ) return TDG_COL -- Результат работы is - RRES TCOL; -- Буфер для результата + RRES TDG_COL; -- Буфер для результата begin /* Формируем объект */ RRES.SNAME := SNAME; - RRES.RCOL_VAL := TCOL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); + RRES.RCOL_VAL := TDG_COL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); /* Возвращаем результат */ return RRES; - end TCOL_MAKE; + end TDG_COL_MAKE; /* Добавление колонки в коллекцию */ - procedure TCOLS_ADD + procedure TDG_COLS_ADD ( - RCOLS in out nocopy TCOLS, -- Коллекция колонок - SNAME in varchar2, -- Наименование колонки - SVALUE in varchar2 := null, -- Значение (строка) - NVALUE in number := null, -- Значение (число) - DVALUE in date := null, -- Значение (дата) - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RCOLS in out nocopy TDG_COLS, -- Коллекция колонок + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Инициализируем коллекцию если необходимо */ if ((RCOLS is null) or (BCLEAR)) then - RCOLS := TCOLS(); + RCOLS := TDG_COLS(); end if; /* Добавляем элемент */ RCOLS.EXTEND(); - RCOLS(RCOLS.LAST) := TCOL_MAKE(SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); - end TCOLS_ADD; + RCOLS(RCOLS.LAST) := TDG_COL_MAKE(SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); + end TDG_COLS_ADD; /* Формирование описания группы */ - function TGROUP_MAKE + function TDG_GROUP_MAKE ( SNAME in varchar2, -- Наименование SCAPTION in varchar2, -- Заголовок BEXPANDABLE in boolean := true, -- Разрешить сокрытие/отображение дочерних BEXPANDED in boolean := true -- Отобразить/скрыть дочерние - ) return TGROUP -- Результат работы + ) return TDG_GROUP -- Результат работы is - RRES TGROUP; -- Буфер для результата + RRES TDG_GROUP; -- Буфер для результата begin /* Формируем объект */ RRES.SNAME := SNAME; @@ -958,24 +1135,24 @@ text="Формат data_grid и gant как в chart" RRES.BEXPANDED := COALESCE(BEXPANDED, true); /* Возвращаем результат */ return RRES; - end TGROUP_MAKE; + end TDG_GROUP_MAKE; /* Добавление описания группы в коллекцию */ - procedure TGROUPS_ADD + procedure TDG_GROUPS_ADD ( - RGROUPS in out nocopy TGROUPS, -- Коллекция описаний колонок - SNAME in varchar2, -- Наименование - SCAPTION in varchar2, -- Заголовок - BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних - BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RGROUPS in out nocopy TDG_GROUPS, -- Коллекция описаний колонок + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - BFND boolean := false; -- Флаг наличия группы в коллекции + BFND boolean := false; -- Флаг наличия группы в коллекции begin /* Инициализируем коллекцию если необходимо */ if ((RGROUPS is null) or (BCLEAR)) then - RGROUPS := TGROUPS(); + RGROUPS := TDG_GROUPS(); end if; /* Проверим наличие */ if (RGROUPS.COUNT > 0) then @@ -984,10 +1161,10 @@ text="Формат data_grid и gant как в chart" if (RGROUPS(I).SNAME = SNAME) then /* Элемент найден - обновим */ BFND := true; - RGROUPS(I) := TGROUP_MAKE(SNAME => SNAME, - SCAPTION => SCAPTION, - BEXPANDABLE => BEXPANDABLE, - BEXPANDED => BEXPANDED); + RGROUPS(I) := TDG_GROUP_MAKE(SNAME => SNAME, + SCAPTION => SCAPTION, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED); exit; end if; end loop; @@ -995,17 +1172,17 @@ text="Формат data_grid и gant как в chart" /* Добавляем элемент если такого нет */ if (not BFND) then RGROUPS.EXTEND(); - RGROUPS(RGROUPS.LAST) := TGROUP_MAKE(SNAME => SNAME, - SCAPTION => SCAPTION, - BEXPANDABLE => BEXPANDABLE, - BEXPANDED => BEXPANDED); + RGROUPS(RGROUPS.LAST) := TDG_GROUP_MAKE(SNAME => SNAME, + SCAPTION => SCAPTION, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED); end if; - end TGROUPS_ADD; + end TDG_GROUPS_ADD; /* Сериализация описания групп таблицы данных */ - procedure TGROUPS_TO_XML + procedure TDG_GROUPS_TO_XML ( - RGROUPS in TGROUPS -- Описание групп таблицы данных + RGROUPS in TDG_GROUPS -- Описание групп таблицы данных ) is begin @@ -1014,7 +1191,7 @@ text="Формат data_grid и gant как в chart" for I in RGROUPS.FIRST .. RGROUPS.LAST loop /* Открываем описание группы */ - PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XGROUPS); + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_GROUPS); /* Атрибуты группы */ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RGROUPS(I).SNAME); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RGROUPS(I).SCAPTION); @@ -1024,109 +1201,129 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.UP(); end loop; end if; - end TGROUPS_TO_XML; + end TDG_GROUPS_TO_XML; /* Формирование строки */ - function TROW_MAKE + function TDG_ROW_MAKE ( SGROUP in varchar2 := null -- Наименование группы ) - return TROW -- Результат работы + return TDG_ROW -- Результат работы is - RRES TROW; -- Буфер для результата + RRES TDG_ROW; -- Буфер для результата begin /* Формируем объект */ RRES.SGROUP := SGROUP; - RRES.RCOLS := TCOLS(); + RRES.RCOLS := TDG_COLS(); /* Возвращаем результат */ return RRES; - end TROW_MAKE; + end TDG_ROW_MAKE; /* Добавление колонки к строке */ - procedure TROW_ADD_COL + procedure TDG_ROW_ADD_COL ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - SVALUE in varchar2 := null, -- Значение (строка) - NVALUE in number := null, -- Значение (число) - DVALUE in date := null, -- Значение (дата) - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + SVALUE in varchar2 := null, -- Значение (строка) + NVALUE in number := null, -- Значение (число) + DVALUE in date := null, -- Значение (дата) + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Сформируем колонку и добавим её к коллекции колонок строки */ - TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE, BCLEAR => BCLEAR); - end TROW_ADD_COL; + TDG_COLS_ADD(RCOLS => RROW.RCOLS, + SNAME => SNAME, + SVALUE => SVALUE, + NVALUE => NVALUE, + DVALUE => DVALUE, + BCLEAR => BCLEAR); + end TDG_ROW_ADD_COL; /* Добавление строковой колонки к строке из курсора динамического запроса */ - procedure TROW_ADD_CUR_COLS + procedure TDG_ROW_ADD_CUR_COLS ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - ICURSOR in integer, -- Курсор - NPOSITION in number, -- Номер колонки в курсоре - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - SVALUE PKG_STD.TLSTRING; -- Буфер для значения курсора + SVALUE PKG_STD.TLSTRING; -- Буфер для значения курсора begin /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => NPOSITION, SVALUE => SVALUE); /* Сформируем колонку и добавим её к коллекции колонок строки */ - TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => SVALUE, NVALUE => null, DVALUE => null, BCLEAR => BCLEAR); - end TROW_ADD_CUR_COLS; + TDG_COLS_ADD(RCOLS => RROW.RCOLS, + SNAME => SNAME, + SVALUE => SVALUE, + NVALUE => null, + DVALUE => null, + BCLEAR => BCLEAR); + end TDG_ROW_ADD_CUR_COLS; /* Добавление числовой колонки к строке из курсора динамического запроса */ - procedure TROW_ADD_CUR_COLN + procedure TDG_ROW_ADD_CUR_COLN ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - ICURSOR in integer, -- Курсор - NPOSITION in number, -- Номер колонки в курсоре - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - NVALUE PKG_STD.TLNUMBER; -- Буфер для значения курсора + NVALUE PKG_STD.TLNUMBER; -- Буфер для значения курсора begin /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => NPOSITION, NVALUE => NVALUE); /* Сформируем колонку и добавим её к коллекции колонок строки */ - TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => null, NVALUE => NVALUE, DVALUE => null, BCLEAR => BCLEAR); - end TROW_ADD_CUR_COLN; + TDG_COLS_ADD(RCOLS => RROW.RCOLS, + SNAME => SNAME, + SVALUE => null, + NVALUE => NVALUE, + DVALUE => null, + BCLEAR => BCLEAR); + end TDG_ROW_ADD_CUR_COLN; /* Добавление колонки типа "дата" к строке из курсора динамического запроса */ - procedure TROW_ADD_CUR_COLD + procedure TDG_ROW_ADD_CUR_COLD ( - RROW in out nocopy TROW, -- Строка - SNAME in varchar2, -- Наименование колонки - ICURSOR in integer, -- Курсор - NPOSITION in number, -- Номер колонки в курсоре - BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + RROW in out nocopy TDG_ROW, -- Строка + SNAME in varchar2, -- Наименование колонки + ICURSOR in integer, -- Курсор + NPOSITION in number, -- Номер колонки в курсоре + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is - DVALUE PKG_STD.TLDATE; -- Буфер для значения курсора + DVALUE PKG_STD.TLDATE; -- Буфер для значения курсора begin /* Читаем данные из курсора */ PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => NPOSITION, DVALUE => DVALUE); /* Сформируем колонку и добавим её к коллекции колонок строки */ - TCOLS_ADD(RCOLS => RROW.RCOLS, SNAME => SNAME, SVALUE => null, NVALUE => null, DVALUE => DVALUE, BCLEAR => BCLEAR); - end TROW_ADD_CUR_COLD; + TDG_COLS_ADD(RCOLS => RROW.RCOLS, + SNAME => SNAME, + SVALUE => null, + NVALUE => null, + DVALUE => DVALUE, + BCLEAR => BCLEAR); + end TDG_ROW_ADD_CUR_COLD; /* Сериализация строки данных таблицы данных */ - procedure TROWS_TO_XML + procedure TDG_ROWS_TO_XML ( - RCOL_DEFS in TCOL_DEFS, -- Описание колонок таблицы данных - RROWS in TROWS -- Строки таблицы данных + RCOL_DEFS in TDG_COL_DEFS, -- Описание колонок таблицы данных + RROWS in TDG_ROWS -- Строки таблицы данных ) is - RCOL_DEF TCOL_DEF; -- Описание текущей сериализуемой колонки + RCOL_DEF TDG_COL_DEF; -- Описание текущей сериализуемой колонки begin /* Обходим строки из коллекции */ if ((RROWS is not null) and (RROWS.COUNT > 0)) then for I in RROWS.FIRST .. RROWS.LAST loop /* Открываем строку */ - PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XROWS); + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_ROWS); /* Если указана группа - добавим её */ if (RROWS(I).SGROUP is not null) then PKG_XFAST.ATTR(SNAME => SRESP_ATTR_GROUP_NAME, SVALUE => RROWS(I).SGROUP); @@ -1136,7 +1333,7 @@ text="Формат data_grid и gant как в chart" for J in RROWS(I).RCOLS.FIRST .. RROWS(I).RCOLS.LAST loop /* Найдём описание колонки */ - RCOL_DEF := TCOL_DEFS_FIND(RCOL_DEFS => RCOL_DEFS, SNAME => RROWS(I).RCOLS(J).SNAME); + RCOL_DEF := TDG_COL_DEFS_FIND(RCOL_DEFS => RCOL_DEFS, SNAME => RROWS(I).RCOLS(J).SNAME); if (RCOL_DEF.SNAME is null) then P_EXCEPTION(0, 'Описание колонки "%s" таблицы данных не определено.', @@ -1162,42 +1359,42 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.UP(); end loop; end if; - end TROWS_TO_XML; + end TDG_ROWS_TO_XML; /* Формирование таблицы данных */ - function TDATA_GRID_MAKE + function TDG_MAKE ( BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок - ) return TDATA_GRID -- Результат работы + ) return TDG -- Результат работы is - RRES TDATA_GRID; -- Буфер для результата + RRES TDG; -- Буфер для результата begin /* Формируем объект */ RRES.BFIXED_HEADER := COALESCE(BFIXED_HEADER, false); RRES.NFIXED_COLUMNS := COALESCE(NFIXED_COLUMNS, 0); - RRES.RCOL_DEFS := TCOL_DEFS(); - RRES.RGROUPS := TGROUPS(); - RRES.RROWS := TROWS(); + RRES.RCOL_DEFS := TDG_COL_DEFS(); + RRES.RGROUPS := TDG_GROUPS(); + RRES.RROWS := TDG_ROWS(); /* Возвращаем результат */ return RRES; - end TDATA_GRID_MAKE; + end TDG_MAKE; /* Поиск описания колонки в таблице данных по наименованию */ - function TDATA_GRID_FIND_COL_DEF + function TDG_FIND_COL_DEF ( - RDATA_GRID in TDATA_GRID, -- Описание таблицы данных - SNAME in varchar2 -- Наименование колонки - ) return TCOL_DEF -- Найденное описание (null - если не нашли) + RDATA_GRID in TDG, -- Описание таблицы данных + SNAME in varchar2 -- Наименование колонки + ) return TDG_COL_DEF -- Найденное описание (null - если не нашли) is begin - return TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => SNAME); - end TDATA_GRID_FIND_COL_DEF; + return TDG_COL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => SNAME); + end TDG_FIND_COL_DEF; /* Добавление описания колонки к таблице данных */ - procedure TDATA_GRID_ADD_COL_DEF + procedure TDG_ADD_COL_DEF ( - RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + RDATA_GRID in out nocopy TDG, -- Описание таблицы данных SNAME in varchar2, -- Наименование колонки SCAPTION in varchar2, -- Заголовок колонки SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных колонки (см. константы SDATA_TYPE_*) @@ -1206,7 +1403,7 @@ text="Формат data_grid и gant как в chart" BVISIBLE in boolean := true, -- Разрешить отображение BORDER in boolean := false, -- Разрешить сортировку по колонке BFILTER in boolean := false, -- Разрешить отбор по колонке - RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения колонки + RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения колонки SHINT in varchar2 := null, -- Текст всплывающей подсказки SPARENT in varchar2 := null, -- Наименование родительской колонки BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок @@ -1217,79 +1414,79 @@ text="Формат data_grid и gant как в chart" is begin /* Формируем описание и добавляем в коллекцию таблицы данных */ - TCOL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, - SNAME => SNAME, - SCAPTION => SCAPTION, - SDATA_TYPE => SDATA_TYPE, - SCOND_FROM => SCOND_FROM, - SCOND_TO => SCOND_TO, - BVISIBLE => BVISIBLE, - BORDER => BORDER, - BFILTER => BFILTER, - RCOL_VALS => RCOL_VALS, - SHINT => SHINT, - SPARENT => SPARENT, - BEXPANDABLE => BEXPANDABLE, - BEXPANDED => BEXPANDED, - NWIDTH => NWIDTH, - BCLEAR => BCLEAR); - end TDATA_GRID_ADD_COL_DEF; + TDG_COL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, + SNAME => SNAME, + SCAPTION => SCAPTION, + SDATA_TYPE => SDATA_TYPE, + SCOND_FROM => SCOND_FROM, + SCOND_TO => SCOND_TO, + BVISIBLE => BVISIBLE, + BORDER => BORDER, + BFILTER => BFILTER, + RCOL_VALS => RCOL_VALS, + SHINT => SHINT, + SPARENT => SPARENT, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED, + NWIDTH => NWIDTH, + BCLEAR => BCLEAR); + end TDG_ADD_COL_DEF; /* Добавление описания группы к таблице данных */ - procedure TDATA_GRID_ADD_GROUP + procedure TDG_ADD_GROUP ( - RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных - SNAME in varchar2, -- Наименование группы - SCAPTION in varchar2, -- Заголовок группы - BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних - BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние - BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) + RDATA_GRID in out nocopy TDG, -- Описание таблицы данных + SNAME in varchar2, -- Наименование группы + SCAPTION in varchar2, -- Заголовок группы + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние + BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Формируем описание и добавляем в коллекцию таблицы данных */ - TGROUPS_ADD(RGROUPS => RDATA_GRID.RGROUPS, - SNAME => SNAME, - SCAPTION => SCAPTION, - BEXPANDABLE => BEXPANDABLE, - BEXPANDED => BEXPANDED, - BCLEAR => BCLEAR); - end TDATA_GRID_ADD_GROUP; + TDG_GROUPS_ADD(RGROUPS => RDATA_GRID.RGROUPS, + SNAME => SNAME, + SCAPTION => SCAPTION, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED, + BCLEAR => BCLEAR); + end TDG_ADD_GROUP; /* Добавление описания колонки к таблице данных */ - procedure TDATA_GRID_ADD_ROW + procedure TDG_ADD_ROW ( - RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных - RROW in TROW, -- Строка - BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) + RDATA_GRID in out nocopy TDG, -- Описание таблицы данных + RROW in TDG_ROW, -- Строка + BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Инициализируем коллекцию если необходимо */ if ((RDATA_GRID.RROWS is null) or (BCLEAR)) then - RDATA_GRID.RROWS := TROWS(); + RDATA_GRID.RROWS := TDG_ROWS(); end if; /* Добавляем элемент */ RDATA_GRID.RROWS.EXTEND(); RDATA_GRID.RROWS(RDATA_GRID.RROWS.LAST) := RROW; - end TDATA_GRID_ADD_ROW; + end TDG_ADD_ROW; /* Сериализация описания таблицы данных */ - procedure TDATA_GRID_DEF_TO_XML + procedure TDG_DEF_TO_XML ( - RDATA_GRID in TDATA_GRID -- Описание таблицы данных + RDATA_GRID in TDG -- Описание таблицы данных ) is begin /* Cтатические атрибуты заголовка */ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_HEADER, BVALUE => RDATA_GRID.BFIXED_HEADER); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_COLUMNS, NVALUE => RDATA_GRID.NFIXED_COLUMNS); - end TDATA_GRID_DEF_TO_XML; + end TDG_DEF_TO_XML; /* Сериализация таблицы данных */ - function TDATA_GRID_TO_XML + function TDG_TO_XML ( - RDATA_GRID in TDATA_GRID, -- Описание таблицы данных + RDATA_GRID in TDG, -- Описание таблицы данных NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да) ) return clob -- XML-описание is @@ -1302,17 +1499,17 @@ text="Формат data_grid и gant как в chart" /* Открываем таблицу данных */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA_GRID); /* Формируем описание таблицы данных */ - TDATA_GRID_DEF_TO_XML(RDATA_GRID => RDATA_GRID); - /* Закрываем таблицу данных */ - PKG_XFAST.UP(); + TDG_DEF_TO_XML(RDATA_GRID => RDATA_GRID); /* Если необходимо включить описание колонок */ if (NINCLUDE_DEF = 1) then - TCOL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS); + TDG_COL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS); end if; /* Формируем описание групп */ - TGROUPS_TO_XML(RGROUPS => RDATA_GRID.RGROUPS); + TDG_GROUPS_TO_XML(RGROUPS => RDATA_GRID.RGROUPS); /* Формируем описание строк */ - TROWS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, RROWS => RDATA_GRID.RROWS); + TDG_ROWS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, RROWS => RDATA_GRID.RROWS); + /* Закрываем таблицу данных */ + PKG_XFAST.UP(); /* Закрываем корень */ PKG_XFAST.UP(); /* Сериализуем */ @@ -1328,14 +1525,14 @@ text="Формат data_grid и gant как в chart" /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); - end TDATA_GRID_TO_XML; + end TDG_TO_XML; /* Конвертация значений фильтра в число */ - procedure TFILTER_TO_NUMBER + procedure TDG_FILTER_TO_NUMBER ( - RFILTER in TFILTER, -- Фильтр - NFROM out number, -- Значение нижней границы диапазона - NTO out number -- Значение верхней границы диапазона + RFILTER in TDG_FILTER, -- Фильтр + NFROM out number, -- Значение нижней границы диапазона + NTO out number -- Значение верхней границы диапазона ) is begin @@ -1361,14 +1558,14 @@ text="Формат data_grid и gant как в chart" RFILTER.STO); end; end if; - end TFILTER_TO_NUMBER; + end TDG_FILTER_TO_NUMBER; /* Конвертация значений фильтра в дату */ - procedure TFILTER_TO_DATE + procedure TDG_FILTER_TO_DATE ( - RFILTER in TFILTER, -- Фильтр - DFROM out date, -- Значение нижней границы диапазона - DTO out date -- Значение верхней границы диапазона + RFILTER in TDG_FILTER, -- Фильтр + DFROM out date, -- Значение нижней границы диапазона + DTO out date -- Значение верхней границы диапазона ) is begin @@ -1394,17 +1591,17 @@ text="Формат data_grid и gant как в chart" RFILTER.STO); end; end if; - end TFILTER_TO_DATE; + end TDG_FILTER_TO_DATE; /* Формирование фильтра */ - function TFILTER_MAKE + function TDG_FILTER_MAKE ( SNAME in varchar2, -- Наименование SFROM in varchar2, -- Значение "с" STO in varchar2 -- Значение "по" - ) return TFILTER -- Результат работы + ) return TDG_FILTER -- Результат работы is - RRES TFILTER; -- Буфер для результата + RRES TDG_FILTER; -- Буфер для результата begin /* Формируем объект */ RRES.SNAME := SNAME; @@ -1412,14 +1609,14 @@ text="Формат data_grid и gant как в chart" RRES.STO := STO; /* Возвращаем результат */ return RRES; - end TFILTER_MAKE; + end TDG_FILTER_MAKE; /* Поиск фильтра в коллекции */ - function TFILTERS_FIND + function TDG_FILTERS_FIND ( - RFILTERS in TFILTERS, -- Коллекция фильтров - SNAME in varchar2 -- Наименование - ) return TFILTER -- Найденный фильтр (null - если не нашли) + RFILTERS in TDG_FILTERS, -- Коллекция фильтров + SNAME in varchar2 -- Наименование + ) return TDG_FILTER -- Найденный фильтр (null - если не нашли) is begin /* Обходим фильтры из коллекции */ @@ -1433,22 +1630,22 @@ text="Формат data_grid и gant как в chart" end if; /* Ничего не нашли */ return null; - end TFILTERS_FIND; + end TDG_FILTERS_FIND; /* Десериализация фильтров */ - function TFILTERS_FROM_XML + function TDG_FILTERS_FROM_XML ( CFILTERS in clob -- Сериализованное представление фильтров (BASE64(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...)) - ) return TFILTERS -- Результат работы + ) return TDG_FILTERS -- Результат работы is - RFILTERS TFILTERS; -- Буфер для результата работы + RFILTERS TDG_FILTERS; -- Буфер для результата работы XDOC PKG_XPATH.TDOCUMENT; -- Документ XML XROOT PKG_XPATH.TNODE; -- Корень документа XML XNODE PKG_XPATH.TNODE; -- Буфер узла документа XNODES PKG_XPATH.TNODES; -- Буфер коллекции узлов документа begin /* Вернём выходную коллекцию */ - RFILTERS := TFILTERS(); + RFILTERS := TDG_FILTERS(); /* Разбираем XML */ XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' || BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CFILTERS), @@ -1465,9 +1662,9 @@ text="Формат data_grid и gant как в chart" XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I); /* Добавим его в коллекцию */ RFILTERS.EXTEND(); - RFILTERS(RFILTERS.LAST) := TFILTER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME), - SFROM => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SFROM), - STO => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_STO)); + RFILTERS(RFILTERS.LAST) := TDG_FILTER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME), + SFROM => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SFROM), + STO => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_STO)); end loop; /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); @@ -1480,21 +1677,21 @@ text="Формат data_grid и gant как в chart" /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); - end TFILTERS_FROM_XML; + end TDG_FILTERS_FROM_XML; /* Применение параметров фильтрации в запросе */ - procedure TFILTERS_SET_QUERY + procedure TDG_FILTERS_SET_QUERY ( NIDENT in number, -- Идентификатор отбора NCOMPANY in number, -- Рег. номер организации NPARENT in number := null, -- Рег. номер родителя SUNIT in varchar2, -- Код раздела SPROCEDURE in varchar2, -- Наименование серверной процедуры отбора - RDATA_GRID in TDATA_GRID, -- Описание таблицы данных - RFILTERS in TFILTERS -- Коллекция фильтров + RDATA_GRID in TDG, -- Описание таблицы данных + RFILTERS in TDG_FILTERS -- Коллекция фильтров ) is - RCOL_DEF TCOL_DEF; -- Описание текущей фильтруемой колонки + RCOL_DEF TDG_COL_DEF; -- Описание текущей фильтруемой колонки BENUM boolean; -- Флаг начиличия перечисляемых значений NFROM PKG_STD.TLNUMBER; -- Буфер для верхней границы диапазона отбора чисел NTO PKG_STD.TLNUMBER; -- Буфер для нижней границы диапазона отбора чисел @@ -1518,7 +1715,7 @@ text="Формат data_grid и gant как в chart" for I in RFILTERS.FIRST .. RFILTERS.LAST loop /* Найдем фильтруемую колонку в описании */ - RCOL_DEF := TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RFILTERS(I).SNAME); + RCOL_DEF := TDG_COL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RFILTERS(I).SNAME); if (RCOL_DEF.SNAME is not null) then /* Определимся с наличием перечисляемых значений */ if ((RCOL_DEF.RCOL_VALS is not null) and (RCOL_DEF.RCOL_VALS.COUNT > 0)) then @@ -1546,7 +1743,7 @@ text="Формат data_grid и gant как в chart" PKG_COND_BROKER.SET_CONDITION_ENUM(SCONDITION_NAME => RCOL_DEF.SCOND_FROM, SCONDITION_ENUM => RFILTERS(I).SFROM); else - TFILTER_TO_NUMBER(RFILTER => RFILTERS(I), NFROM => NFROM, NTO => NTO); + TDG_FILTER_TO_NUMBER(RFILTER => RFILTERS(I), NFROM => NFROM, NTO => NTO); if (NFROM is not null) then PKG_COND_BROKER.SET_CONDITION_NUM(SCONDITION_NAME => RCOL_DEF.SCOND_FROM, NCONDITION_VALUE => NFROM); @@ -1558,11 +1755,11 @@ text="Формат data_grid и gant как в chart" end; when SDATA_TYPE_DATE then begin - if (BENUM) then - PKG_COND_BROKER.SET_CONDITION_EDATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM, + if (BENUM) then + PKG_COND_BROKER.SET_CONDITION_EDATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM, SCONDITION_EDATE => RFILTERS(I).SFROM); else - TFILTER_TO_DATE(RFILTER => RFILTERS(I), DFROM => DFROM, DTO => DTO); + TDG_FILTER_TO_DATE(RFILTER => RFILTERS(I), DFROM => DFROM, DTO => DTO); if (DFROM is not null) then PKG_COND_BROKER.SET_CONDITION_DATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM, DCONDITION_VALUE => DFROM); @@ -1583,38 +1780,38 @@ text="Формат data_grid и gant как в chart" end if; /* Формирование условий отбора - Эпилог */ PKG_COND_BROKER.EPILOGUE(); - end TFILTERS_SET_QUERY; + end TDG_FILTERS_SET_QUERY; /* Формирование сортировки */ - function TORDER_MAKE + function TDG_ORDER_MAKE ( SNAME in varchar2, -- Наименование SDIRECTION in varchar2 -- Направление (см. константы SORDER_DIRECTION_*) - ) return TORDER -- Результат работы + ) return TDG_ORDER -- Результат работы is - RRES TORDER; -- Буфер для результата + RRES TDG_ORDER; -- Буфер для результата begin /* Формируем объект */ RRES.SNAME := SNAME; RRES.SDIRECTION := SDIRECTION; /* Возвращаем результат */ return RRES; - end TORDER_MAKE; + end TDG_ORDER_MAKE; /* Десериализация сортировок */ - function TORDERS_FROM_XML + function TDG_ORDERS_FROM_XML ( CORDERS in clob -- Сериализованное представление сотрировок (BASE64(ИМЯASC/DESC...)) - ) return TORDERS -- Результат работы + ) return TDG_ORDERS -- Результат работы is - RORDERS TORDERS; -- Буфер для результата работы + RORDERS TDG_ORDERS; -- Буфер для результата работы XDOC PKG_XPATH.TDOCUMENT; -- Документ XML XROOT PKG_XPATH.TNODE; -- Корень документа XML XNODE PKG_XPATH.TNODE; -- Буфер узла документа XNODES PKG_XPATH.TNODES; -- Буфер коллекции узлов документа begin /* Инициализируем выходную коллекцию */ - RORDERS := TORDERS(); + RORDERS := TDG_ORDERS(); /* Разбираем XML */ XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' || BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CORDERS), @@ -1631,8 +1828,9 @@ text="Формат data_grid и gant как в chart" XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I); /* Добавим его в коллекцию */ RORDERS.EXTEND(); - RORDERS(RORDERS.LAST) := TORDER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME), - SDIRECTION => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SDIRECTION)); + RORDERS(RORDERS.LAST) := TDG_ORDER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME), + SDIRECTION => PKG_XPATH.VALUE(RNODE => XNODE, + SPATTERN => SRQ_TAG_SDIRECTION)); end loop; /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); @@ -1645,13 +1843,13 @@ text="Формат data_grid и gant как в chart" /* Вернем ошибку */ PKG_STATE.DIAGNOSTICS_STACKED(); P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); - end TORDERS_FROM_XML; + end TDG_ORDERS_FROM_XML; /* Применение параметров сортировки в запросе */ - procedure TORDERS_SET_QUERY + procedure TDG_ORDERS_SET_QUERY ( - RDATA_GRID in TDATA_GRID, -- Описание таблицы - RORDERS in TORDERS, -- Коллекция сортировок + RDATA_GRID in TDG, -- Описание таблицы + RORDERS in TDG_ORDERS, -- Коллекция сортировок SPATTERN in varchar2, -- Шаблон для подстановки условий отбора в запрос CSQL in out nocopy clob -- Буфер запроса ) @@ -1664,7 +1862,7 @@ text="Формат data_grid и gant как в chart" for I in RORDERS.FIRST .. RORDERS.LAST loop /* Перед добавлением в запрос - обязательная проверка, чтобы избежать SQL-инъекций */ - if ((TCOL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RORDERS(I).SNAME).SNAME is not null) and + if ((TDG_COL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RORDERS(I).SNAME).SNAME is not null) and (RORDERS(I).SDIRECTION in (SORDER_DIRECTION_ASC, SORDER_DIRECTION_DESC))) then CSQL_ORDERS := CSQL_ORDERS || RORDERS(I).SNAME || ' ' || RORDERS(I).SDIRECTION; if (I < RORDERS.LAST) then @@ -1674,7 +1872,7 @@ text="Формат data_grid и gant как в chart" end loop; end if; CSQL := replace(CSQL, SPATTERN, CSQL_ORDERS); - end TORDERS_SET_QUERY; + end TDG_ORDERS_SET_QUERY; /* Проверка корректности наименования дополнительного атрибута задачи диаграммы Ганта */ procedure TGANTT_TASK_ATTR_NAME_CHECK @@ -1857,7 +2055,7 @@ text="Формат data_grid и gant как в chart" for I in RTASKS.FIRST .. RTASKS.LAST loop /* Открываем строку */ - PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XGANTT_TASKS); + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASKS); /* Статические тарибуты */ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ID, SVALUE => 'taskId' || RTASKS(I).NRN); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_RN, NVALUE => RTASKS(I).NRN); @@ -2029,12 +2227,10 @@ text="Формат data_grid и gant как в chart" ) is begin - /* Открываем описание заголовка */ - PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XGANTT_DEF); /* Cтатические атрибуты заголовка */ PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TITLE, SVALUE => RGANTT.STITLE); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM, NVALUE => RGANTT.NZOOM); - PKG_XFAST.ATTR(SNAME => SRESP_ATTR_GANTT_ZOOM_BAR, BVALUE => RGANTT.BZOOM_BAR); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM_BAR, BVALUE => RGANTT.BZOOM_BAR); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO, BVALUE => RGANTT.BREAD_ONLY); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_DATES, BVALUE => RGANTT.BREAD_ONLY_DATES); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_PRGRS, BVALUE => RGANTT.BREAD_ONLY_PROGRESS); @@ -2075,8 +2271,6 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.UP(); end loop; end if; - /* Закрываем описание заголовка */ - PKG_XFAST.UP(); end TGANTT_DEF_TO_XML; /* Сериализация диаграммы Ганта */ @@ -2092,12 +2286,16 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); /* Открываем корень */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA); + /* Открываем диаграмму Ганта */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XGANTT); /* Если необходимо включить описание колонок */ if (NINCLUDE_DEF = 1) then TGANTT_DEF_TO_XML(RGANTT => RGANTT); end if; /* Формируем описание задач */ TGANTT_TASKS_TO_XML(RTASKS => RGANTT.RTASKS); + /* Закрываем диаграмму Ганта */ + PKG_XFAST.UP(); /* Закрываем корень */ PKG_XFAST.UP(); /* Сериализуем */ @@ -2382,5 +2580,494 @@ text="Формат data_grid и gant как в chart" P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); end TCHART_TO_XML; + /* Формирование колонки циклограммы */ + function TCYCLOGRAM_COLUMN_MAKE + ( + SNAME in varchar2, -- Заголовок колонки + NSTART in number, -- Позиция начала колонки + NEND in number -- Позиция конца колонки + ) return TCYCLOGRAM_COLUMN -- Результат работы + is + RRES TCYCLOGRAM_COLUMN; -- Буфер для результата + begin + /* Формируем объект */ + RRES.SNAME := SNAME; + RRES.NSTART := NSTART; + RRES.NEND := NEND; + /* Возвращаем результат */ + return RRES; + end TCYCLOGRAM_COLUMN_MAKE; + + /* Добавление колонки циклограммы в коллекцию */ + procedure TCYCLOGRAM_COLUMNS_ADD + ( + RCOLUMNS in out nocopy TCYCLOGRAM_COLUMNS, -- Коллекция колонок циклограммы + SNAME in varchar2, -- Наименование колонки + NSTART in number, -- Позиция начала колонки + NEND in number, -- Позиция конца колонки + BCLEAR in boolean := false -- Флаг очистки коллекции колонок (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Инициализируем коллекцию если необходимо */ + if ((RCOLUMNS is null) or (BCLEAR)) then + RCOLUMNS := TCYCLOGRAM_COLUMNS(); + end if; + /* Добавляем элемент */ + RCOLUMNS.EXTEND(); + RCOLUMNS(RCOLUMNS.LAST) := TCYCLOGRAM_COLUMN_MAKE(SNAME => SNAME, NSTART => NSTART, NEND => NEND); + end TCYCLOGRAM_COLUMNS_ADD; + + /* Формирование группы циклограммы */ + function TCYCLOGRAM_GROUP_MAKE + ( + SNAME in varchar2, -- Имя группы + BHEADER_VISIBLE in boolean := true, -- Признак отображения заголовка группы + NHEADER_HEIGHT in number := NCYCLOGRAM_GROUP_DEF_HEIGHT, -- Высота заголовка группы + NHEADER_WIDTH in number := NCYCLOGRAM_GROUP_DEF_WIDTH, -- Ширина заголовка группы + SHIGHLIGHT_COLOR in varchar2 := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + ) return TCYCLOGRAM_GROUP -- Результат работы + is + RRES TCYCLOGRAM_GROUP; -- Буфер для результата + begin + /* Формируем объект */ + RRES.SNAME := SNAME; + RRES.BHEADER_VISIBLE := BHEADER_VISIBLE; + RRES.NHEADER_HEIGHT := NHEADER_HEIGHT; + RRES.NHEADER_WIDTH := NHEADER_WIDTH; + RRES.SHIGHLIGHT_COLOR := SHIGHLIGHT_COLOR; + /* Возвращаем результат */ + return RRES; + end TCYCLOGRAM_GROUP_MAKE; + + /* Поиск группы циклограммы по наименованию */ + function TCYCLOGRAM_GROUP_FIND + ( + RGROUPS in TCYCLOGRAM_GROUPS, -- Описание групп циклограммы + SNAME in varchar2 -- Наименование + ) return TCYCLOGRAM_GROUP -- Найденное описание группы (null - если не нашли) + is + begin + /* Обходим группы из описания */ + if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then + for I in RGROUPS.FIRST .. RGROUPS.LAST + loop + if (RGROUPS(I).SNAME = SNAME) then + return RGROUPS(I); + end if; + end loop; + end if; + /* Ничего не нашли */ + return null; + end TCYCLOGRAM_GROUP_FIND; + + /* Сериализация описания групп циклограммы */ + procedure TCYCLOGRAM_GROUPS_TO_XML + ( + RGROUPS in TCYCLOGRAM_GROUPS -- Коллекция групп циклограммы + ) + is + begin + /* Обходим группы из коллекции */ + if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then + for I in RGROUPS.FIRST .. RGROUPS.LAST + loop + /* Открываем описание группы */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_GROUPS); + /* Атрибуты группы */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RGROUPS(I).SNAME); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RGROUPS(I).BHEADER_VISIBLE); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HEIGHT, NVALUE => RGROUPS(I).NHEADER_HEIGHT); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_WIDTH, NVALUE => RGROUPS(I).NHEADER_WIDTH); + if (RGROUPS(I).SHIGHLIGHT_COLOR is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HL_COLOR, SVALUE => RGROUPS(I).SHIGHLIGHT_COLOR); + end if; + /* Закрываем описание группы */ + PKG_XFAST.UP(); + end loop; + end if; + end TCYCLOGRAM_GROUPS_TO_XML; + + /* Проверка наличия группы в циклограмме */ + function TCYCLOGRAM_TASK_GROUP_CHECK + ( + RGROUPS in TCYCLOGRAM_GROUPS, -- Описание групп циклограммы + SNAME in varchar2 -- Наименование + ) return TCYCLOGRAM_GROUP -- Найденное описание группы (null - если не нашли) + is + begin + /* Обходим группы из описания */ + if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then + for I in RGROUPS.FIRST .. RGROUPS.LAST + loop + if (RGROUPS(I).SNAME = SNAME) then + return RGROUPS(I); + end if; + end loop; + end if; + /* Ничего не нашли */ + return null; + end TCYCLOGRAM_TASK_GROUP_CHECK; + + /* Формирование задачи циклограммы */ + function TCYCLOGRAM_TASK_MAKE + ( + NRN in number, -- Рег. номер записи + SCAPTION in varchar2, -- Заголовок + SNAME in varchar2, -- Наименование + NLINE_NUMB in number, -- Номер строки + NSTART in number, -- Позиция начала задачи + NEND in number, -- Позиция конца задачи + SGROUP in varchar2 := null, -- Наименование группы + SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + SHIGHLIGHT_COLOR in varchar2 := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + ) return TCYCLOGRAM_TASK -- Результат работы + is + RRES TCYCLOGRAM_TASK; -- Буфер для результата + begin + /* Формируем объект */ + RRES.NRN := NRN; + RRES.SCAPTION := SCAPTION; + RRES.SNAME := SNAME; + RRES.NLINE_NUMB := NLINE_NUMB; + RRES.NSTART := NSTART; + RRES.NEND := NEND; + RRES.SGROUP := SGROUP; + RRES.SBG_COLOR := SBG_COLOR; + RRES.STEXT_COLOR := STEXT_COLOR; + RRES.SHIGHLIGHT_COLOR := SHIGHLIGHT_COLOR; + /* Возвращаем результат */ + return RRES; + end TCYCLOGRAM_TASK_MAKE; + + /* Проверка корректности наименования дополнительного атрибута задачи циклограммы */ + procedure TCYCLOGRAM_TASK_ATTR_NAME_CH + ( + SNAME in varchar2 -- Наименование + ) + is + begin + if (SNAME in (SRESP_ATTR_ID, + SRESP_ATTR_RN, + SRESP_ATTR_CAPTION, + SRESP_ATTR_FULL_NAME, + SRESP_ATTR_START, + SRESP_ATTR_END, + SRESP_ATTR_CG_TASK_LINE, + SRESP_ATTR_GROUP_NAME, + SRESP_ATTR_TASK_BG_COLOR, + SRESP_ATTR_TASK_TEXT_COLOR, + SRESP_ATTR_HL_COLOR)) then + P_EXCEPTION(0, + 'Наименование атрибута "%s" является зарезервированным.', + SNAME); + end if; + end TCYCLOGRAM_TASK_ATTR_NAME_CH; + + /* Поиск атрибута задачи циклограммы по наименованию */ + function TCYCLOGRAM_TASK_ATTR_FIND + ( + RTASK_ATTRS in TCYCLOGRAM_TASK_ATTRS, -- Описание атрибутов задачи циклограммы + SNAME in varchar2 -- Наименование + ) return TCYCLOGRAM_TASK_ATTR -- Найденное описание (null - если не нашли) + is + begin + /* Обходим атрибуты из описания */ + if ((RTASK_ATTRS is not null) and (RTASK_ATTRS.COUNT > 0)) then + for I in RTASK_ATTRS.FIRST .. RTASK_ATTRS.LAST + loop + if (RTASK_ATTRS(I).SNAME = SNAME) then + return RTASK_ATTRS(I); + end if; + end loop; + end if; + /* Ничего не нашли */ + return null; + end TCYCLOGRAM_TASK_ATTR_FIND; + + /* Добавление значения атрибута к задаче циклограммы */ + procedure TCYCLOGRAM_TASK_ADD_ATTR_VAL + ( + RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы + RTASK in out nocopy TCYCLOGRAM_TASK, -- Описание задачи + SNAME in varchar2, -- Наименование + SVALUE in varchar2, -- Значение + BCLEAR in boolean := false -- Флаг очистки коллекции значений атрибутов (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Проверим наименование */ + TCYCLOGRAM_TASK_ATTR_NAME_CH(SNAME => SNAME); + /* Проверим, что такой атрибут зарегистрирован */ + if (TCYCLOGRAM_TASK_ATTR_FIND(RTASK_ATTRS => RCYCLOGRAM.RTASK_ATTRS, SNAME => SNAME).SNAME is null) then + P_EXCEPTION(0, + 'Атрибут "%s" задачи циклограммы не зарегистрирован.', + SNAME); + end if; + /* Инициализируем коллекцию если необходимо */ + if ((RTASK.RATTR_VALS is null) or (BCLEAR)) then + RTASK.RATTR_VALS := TCYCLOGRAM_TASK_ATTR_VALS(); + end if; + /* Добавляем элемент */ + RTASK.RATTR_VALS.EXTEND(); + RTASK.RATTR_VALS(RTASK.RATTR_VALS.LAST).SNAME := SNAME; + RTASK.RATTR_VALS(RTASK.RATTR_VALS.LAST).SVALUE := SVALUE; + end TCYCLOGRAM_TASK_ADD_ATTR_VAL; + + /* Сериализация описания задач группы циклограммы */ + procedure TCYCLOGRAM_TASKS_TO_XML + ( + RTASKS in TCYCLOGRAM_TASKS -- Коллекция задач группы циклограммы + ) + is + begin + /* Обходим задачи из коллекции */ + if ((RTASKS is not null) and (RTASKS.COUNT > 0)) then + for I in RTASKS.FIRST .. RTASKS.LAST + loop + /* Открываем строку */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASKS); + /* Статические тарибуты */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ID, SVALUE => 'taskId' || RTASKS(I).NRN); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_RN, NVALUE => RTASKS(I).NRN); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RTASKS(I).SCAPTION); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FULL_NAME, SVALUE => RTASKS(I).SNAME); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CG_TASK_LINE, NVALUE => RTASKS(I).NLINE_NUMB); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_START, NVALUE => RTASKS(I).NSTART); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_END, NVALUE => RTASKS(I).NEND); + if (RTASKS(I).SGROUP is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_GROUP_NAME, SVALUE => RTASKS(I).SGROUP); + end if; + if (RTASKS(I).SBG_COLOR is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_COLOR, SVALUE => RTASKS(I).SBG_COLOR); + end if; + if (RTASKS(I).STEXT_COLOR is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_TEXT_COLOR, SVALUE => RTASKS(I).STEXT_COLOR); + end if; + if (RTASKS(I).SHIGHLIGHT_COLOR is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HL_COLOR, SVALUE => RTASKS(I).SHIGHLIGHT_COLOR); + end if; + /* Динамические атрибуты */ + if ((RTASKS(I).RATTR_VALS is not null) and (RTASKS(I).RATTR_VALS.COUNT > 0)) then + for J in RTASKS(I).RATTR_VALS.FIRST .. RTASKS(I).RATTR_VALS.LAST + loop + PKG_XFAST.ATTR(SNAME => RTASKS(I).RATTR_VALS(J).SNAME, SVALUE => RTASKS(I).RATTR_VALS(J).SVALUE); + end loop; + end if; + /* Закрываем задачу */ + PKG_XFAST.UP(); + end loop; + end if; + end TCYCLOGRAM_TASKS_TO_XML; + + /* Формирование циклограммы */ + function TCYCLOGRAM_MAKE + ( + STITLE in varchar2, -- Заголовок (null - не отображать) + NLINE_HEIGHT in number := NCYCLOGRAM_LINE_HEIGHT, -- Высота строк + NZOOM in number := NCYCLOGRAM_ZOOM_DEFAULT, -- Текущий масштаб (см. константы NCYCLOGRAM_ZOOM_*) + BZOOM_BAR in boolean := true -- Обображать панель масштабирования + ) return TCYCLOGRAM -- Результат работы + is + RRES TCYCLOGRAM; -- Буфер для результата + begin + /* Формируем объект */ + RRES.STITLE := STITLE; + RRES.NLINE_HEIGHT := NLINE_HEIGHT; + RRES.NZOOM := NZOOM; + RRES.BZOOM_BAR := BZOOM_BAR; + /* Возвращаем результат */ + return RRES; + end TCYCLOGRAM_MAKE; + + /* Добавление колонки в циклограмму */ + procedure TCYCLOGRAM_ADD_COLUMN + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + SNAME in varchar2, -- Заголовок колонки + NSTART in number, -- Позиция начала колонки + NEND in number, -- Позиция конца колонки + BCLEAR in boolean := false -- Флаг очистки коллекции колонок (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Формируем описание и добавляем в коллекцию колонок */ + TCYCLOGRAM_COLUMNS_ADD(RCOLUMNS => RCYCLOGRAM.RCOLUMNS, + SNAME => SNAME, + NSTART => NSTART, + NEND => NEND, + BCLEAR => BCLEAR); + end TCYCLOGRAM_ADD_COLUMN; + + /* Добавление группы в циклограмму */ + procedure TCYCLOGRAM_ADD_GROUP + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + SNAME in varchar2, -- Имя группы + BHEADER_VISIBLE in boolean := true, -- Признак отображения заголовка группы + NHEADER_HEIGHT in number := NCYCLOGRAM_GROUP_DEF_HEIGHT, -- Высота заголовка группы + NHEADER_WIDTH in number := NCYCLOGRAM_GROUP_DEF_WIDTH, -- Ширина заголовка группы + SHIGHLIGHT_COLOR in varchar2 := null, -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + BCLEAR in boolean := false -- Флаг очистки коллекции групп (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Проверяем наличие группы в циклограмме */ + if (TCYCLOGRAM_GROUP_FIND(RGROUPS => RCYCLOGRAM.RGROUPS, SNAME => SNAME).SNAME is null) then + /* Инициализируем коллекцию если необходимо */ + if ((RCYCLOGRAM.RGROUPS is null) or (BCLEAR)) then + RCYCLOGRAM.RGROUPS := TCYCLOGRAM_GROUPS(); + end if; + /* Добавляем элемент */ + RCYCLOGRAM.RGROUPS.EXTEND(); + RCYCLOGRAM.RGROUPS(RCYCLOGRAM.RGROUPS.LAST) := TCYCLOGRAM_GROUP_MAKE(SNAME => SNAME, + BHEADER_VISIBLE => BHEADER_VISIBLE, + NHEADER_HEIGHT => NHEADER_HEIGHT, + NHEADER_WIDTH => NHEADER_WIDTH, + SHIGHLIGHT_COLOR => SHIGHLIGHT_COLOR); + end if; + end TCYCLOGRAM_ADD_GROUP; + + /* Добавление задачи в циклограммы */ + procedure TCYCLOGRAM_ADD_TASK + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + RTASK in TCYCLOGRAM_TASK, -- Задача циклограммы + BCLEAR in boolean := false -- Флаг очистки коллекции задач (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Инициализируем коллекцию если необходимо */ + if ((RCYCLOGRAM.RTASKS is null) or (BCLEAR)) then + RCYCLOGRAM.RTASKS := TCYCLOGRAM_TASKS(); + end if; + /* Если у задачи указана группа */ + if (RTASK.SGROUP is not null) then + /* Проверяем наличие группы в циклограмме */ + if (TCYCLOGRAM_GROUP_FIND(RGROUPS => RCYCLOGRAM.RGROUPS, SNAME => RTASK.SGROUP).SNAME is null) then + P_EXCEPTION(0, 'Группа "%s" циклограммы не зарегистрирована.', RTASK.SGROUP); + end if; + end if; + /* Добавляем элемент */ + RCYCLOGRAM.RTASKS.EXTEND(); + RCYCLOGRAM.RTASKS(RCYCLOGRAM.RTASKS.LAST) := RTASK; + end TCYCLOGRAM_ADD_TASK; + + /* Добавление описания атрибута задачи циклограммы */ + procedure TCYCLOGRAM_ADD_TASK_ATTR + ( + RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + BVISIBLE boolean := true, -- Разрешить отображение + BCLEAR in boolean := false -- Флаг очистки коллекции атрибутов (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Проверим наименование */ + TCYCLOGRAM_TASK_ATTR_NAME_CH(SNAME => SNAME); + /* Проверим, что такого ещё нет */ + if (TCYCLOGRAM_TASK_ATTR_FIND(RTASK_ATTRS => RCYCLOGRAM.RTASK_ATTRS, SNAME => SNAME).SNAME is not null) then + P_EXCEPTION(0, + 'Атрибут "%s" задачи циклограммы уже зарегистрирован.', + SNAME); + end if; + /* Инициализируем коллекцию если необходимо */ + if ((RCYCLOGRAM.RTASK_ATTRS is null) or (BCLEAR)) then + RCYCLOGRAM.RTASK_ATTRS := TCYCLOGRAM_TASK_ATTRS(); + end if; + /* Добавляем элемент */ + RCYCLOGRAM.RTASK_ATTRS.EXTEND(); + RCYCLOGRAM.RTASK_ATTRS(RCYCLOGRAM.RTASK_ATTRS.LAST).SNAME := SNAME; + RCYCLOGRAM.RTASK_ATTRS(RCYCLOGRAM.RTASK_ATTRS.LAST).SCAPTION := SCAPTION; + RCYCLOGRAM.RTASK_ATTRS(RCYCLOGRAM.RTASK_ATTRS.LAST).BVISIBLE := BVISIBLE; + end TCYCLOGRAM_ADD_TASK_ATTR; + + /* Сериализация описания циклограммы */ + procedure TCYCLOGRAM_DEF_TO_XML + ( + RCYCLOGRAM in TCYCLOGRAM -- Описание циклограммы + ) + is + begin + /* Cтатические атрибуты заголовка */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TITLE, SVALUE => RCYCLOGRAM.STITLE); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CG_LINE_HEIGHT, NVALUE => RCYCLOGRAM.NLINE_HEIGHT); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM, NVALUE => RCYCLOGRAM.NZOOM); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM_BAR, BVALUE => RCYCLOGRAM.BZOOM_BAR); + /* Если есть динамические атрибуты */ + if ((RCYCLOGRAM.RTASK_ATTRS is not null) and (RCYCLOGRAM.RTASK_ATTRS.COUNT > 0)) then + /* Обходим динамические атрибуты задачи */ + for I in RCYCLOGRAM.RTASK_ATTRS.FIRST .. RCYCLOGRAM.RTASK_ATTRS.LAST + loop + /* Открываем динамический атрибут задачи */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASK_ATTRIBUTES); + /* Наполняем его атрибутами */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCYCLOGRAM.RTASK_ATTRS(I).SNAME); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RCYCLOGRAM.RTASK_ATTRS(I).SCAPTION); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RCYCLOGRAM.RTASK_ATTRS(I).BVISIBLE); + /* Закрываем динамический атрибут задачи */ + PKG_XFAST.UP(); + end loop; + end if; + /* Обходим колонки циклограммы */ + if ((RCYCLOGRAM.RCOLUMNS is not null) and (RCYCLOGRAM.RCOLUMNS.COUNT > 0)) then + for I in RCYCLOGRAM.RCOLUMNS.FIRST .. RCYCLOGRAM.RCOLUMNS.LAST + loop + /* Открываем описание колонки */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_COLUMNS); + /* Атрибуты колонки */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCYCLOGRAM.RCOLUMNS(I).SNAME); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_START, NVALUE => RCYCLOGRAM.RCOLUMNS(I).NSTART); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_END, NVALUE => RCYCLOGRAM.RCOLUMNS(I).NEND); + /* Закрываем описание колонки */ + PKG_XFAST.UP(); + end loop; + end if; + end TCYCLOGRAM_DEF_TO_XML; + + /* Сериализация циклограммы */ + function TCYCLOGRAM_TO_XML + ( + RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы + NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да) + ) return clob -- XML-описание + is + CRES clob; -- Буфер для результата + begin + /* Начинаем формирование XML */ + PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); + /* Открываем корень */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA); + /* Открываем циклограмму */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCYCLOGRAM); + /* Если необходимо включить описание циклограммы */ + if (NINCLUDE_DEF = 1) then + TCYCLOGRAM_DEF_TO_XML(RCYCLOGRAM => RCYCLOGRAM); + end if; + /* Формируем описание групп циклограммы */ + TCYCLOGRAM_GROUPS_TO_XML(RGROUPS => RCYCLOGRAM.RGROUPS); + /* Описываем задачи */ + TCYCLOGRAM_TASKS_TO_XML(RTASKS => RCYCLOGRAM.RTASKS); + /* Закрываем циклограмму */ + PKG_XFAST.UP(); + /* Закрываем корень */ + PKG_XFAST.UP(); + /* Сериализуем */ + CRES := PKG_XFAST.SERIALIZE_TO_CLOB(); + /* Завершаем формирование XML */ + PKG_XFAST.EPILOGUE(); + /* Возвращаем полученное */ + return CRES; + exception + when others then + /* Завершаем формирование XML */ + PKG_XFAST.EPILOGUE(); + /* Вернем ошибку */ + PKG_STATE.DIAGNOSTICS_STACKED(); + P_EXCEPTION(0, PKG_STATE.SQL_ERRM()); + end TCYCLOGRAM_TO_XML; + end PKG_P8PANELS_VISUAL; / diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 478c709..d64e8f3 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -15,7 +15,7 @@ \***********************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/filter\": \"./app/panels/eqs_prfrm/filter.js\",\n\t\"./eqs_prfrm/filter.js\": \"./app/panels/eqs_prfrm/filter.js\",\n\t\"./eqs_prfrm/filter_dialog\": \"./app/panels/eqs_prfrm/filter_dialog.js\",\n\t\"./eqs_prfrm/filter_dialog.js\": \"./app/panels/eqs_prfrm/filter_dialog.js\",\n\t\"./eqs_prfrm/filter_input_field\": \"./app/panels/eqs_prfrm/filter_input_field.js\",\n\t\"./eqs_prfrm/filter_input_field.js\": \"./app/panels/eqs_prfrm/filter_input_field.js\",\n\t\"./eqs_prfrm/hooks\": \"./app/panels/eqs_prfrm/hooks.js\",\n\t\"./eqs_prfrm/hooks.js\": \"./app/panels/eqs_prfrm/hooks.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./mech_rec_assembly_mon\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/components/plan_detail\": \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\",\n\t\"./mech_rec_assembly_mon/components/plan_detail.js\": \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list\": \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list.js\": \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list_item\": \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list_item.js\": \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.js\",\n\t\"./mech_rec_assembly_mon/components/progress_box\": \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\",\n\t\"./mech_rec_assembly_mon/components/progress_box.js\": \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\",\n\t\"./mech_rec_assembly_mon/hooks\": \"./app/panels/mech_rec_assembly_mon/hooks.js\",\n\t\"./mech_rec_assembly_mon/hooks.js\": \"./app/panels/mech_rec_assembly_mon/hooks.js\",\n\t\"./mech_rec_assembly_mon/index\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/index.js\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/mech_rec_assembly_mon\": \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\",\n\t\"./mech_rec_assembly_mon/mech_rec_assembly_mon.js\": \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\",\n\t\"./mech_rec_assembly_mon/styles/themes\": \"./app/panels/mech_rec_assembly_mon/styles/themes.js\",\n\t\"./mech_rec_assembly_mon/styles/themes.js\": \"./app/panels/mech_rec_assembly_mon/styles/themes.js\",\n\t\"./mech_rec_cost_jobs_manage\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/fcjobssp\": \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\",\n\t\"./mech_rec_cost_jobs_manage/fcjobssp.js\": \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\",\n\t\"./mech_rec_cost_jobs_manage/hooks\": \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\",\n\t\"./mech_rec_cost_jobs_manage/hooks.js\": \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\",\n\t\"./mech_rec_cost_jobs_manage/index\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/index.js\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage\": \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\",\n\t\"./mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\": \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_dept_cost_jobs\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/components/filter\": \"./app/panels/mech_rec_dept_cost_jobs/components/filter.js\",\n\t\"./mech_rec_dept_cost_jobs/components/filter.js\": \"./app/panels/mech_rec_dept_cost_jobs/components/filter.js\",\n\t\"./mech_rec_dept_cost_jobs/components/ins_department_dg\": \"./app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js\",\n\t\"./mech_rec_dept_cost_jobs/components/ins_department_dg.js\": \"./app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js\",\n\t\"./mech_rec_dept_cost_jobs/hooks\": \"./app/panels/mech_rec_dept_cost_jobs/hooks.js\",\n\t\"./mech_rec_dept_cost_jobs/hooks.js\": \"./app/panels/mech_rec_dept_cost_jobs/hooks.js\",\n\t\"./mech_rec_dept_cost_jobs/index\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/index.js\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs\": \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\",\n\t\"./mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\": \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\",\n\t\"./mech_rec_dept_cost_prod_plans\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlst\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlst.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstsp\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstsp.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js\",\n\t\"./mech_rec_dept_cost_prod_plans/hooks\": \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_dept_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_dept_cost_prod_plans/incomefromdeps\": \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\",\n\t\"./mech_rec_dept_cost_prod_plans/incomefromdeps.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\",\n\t\"./mech_rec_dept_cost_prod_plans/index\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/index.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans\": \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\",\n\t\"./mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\",\n\t\"./mech_rec_help\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/img/1_1.png\": \"./app/panels/mech_rec_help/img/1_1.png\",\n\t\"./mech_rec_help/img/1_2.png\": \"./app/panels/mech_rec_help/img/1_2.png\",\n\t\"./mech_rec_help/img/1_3.png\": \"./app/panels/mech_rec_help/img/1_3.png\",\n\t\"./mech_rec_help/img/1_4.png\": \"./app/panels/mech_rec_help/img/1_4.png\",\n\t\"./mech_rec_help/img/1_5.png\": \"./app/panels/mech_rec_help/img/1_5.png\",\n\t\"./mech_rec_help/img/21_1.png\": \"./app/panels/mech_rec_help/img/21_1.png\",\n\t\"./mech_rec_help/img/21_2.png\": \"./app/panels/mech_rec_help/img/21_2.png\",\n\t\"./mech_rec_help/img/21_3.png\": \"./app/panels/mech_rec_help/img/21_3.png\",\n\t\"./mech_rec_help/img/2_1.png\": \"./app/panels/mech_rec_help/img/2_1.png\",\n\t\"./mech_rec_help/img/2_2.png\": \"./app/panels/mech_rec_help/img/2_2.png\",\n\t\"./mech_rec_help/img/2_3.png\": \"./app/panels/mech_rec_help/img/2_3.png\",\n\t\"./mech_rec_help/img/2_4.png\": \"./app/panels/mech_rec_help/img/2_4.png\",\n\t\"./mech_rec_help/img/2_5.png\": \"./app/panels/mech_rec_help/img/2_5.png\",\n\t\"./mech_rec_help/img/31_1.png\": \"./app/panels/mech_rec_help/img/31_1.png\",\n\t\"./mech_rec_help/img/31_10.png\": \"./app/panels/mech_rec_help/img/31_10.png\",\n\t\"./mech_rec_help/img/31_2.png\": \"./app/panels/mech_rec_help/img/31_2.png\",\n\t\"./mech_rec_help/img/31_3.png\": \"./app/panels/mech_rec_help/img/31_3.png\",\n\t\"./mech_rec_help/img/31_4.png\": \"./app/panels/mech_rec_help/img/31_4.png\",\n\t\"./mech_rec_help/img/31_5.png\": \"./app/panels/mech_rec_help/img/31_5.png\",\n\t\"./mech_rec_help/img/31_6.png\": \"./app/panels/mech_rec_help/img/31_6.png\",\n\t\"./mech_rec_help/img/31_7.png\": \"./app/panels/mech_rec_help/img/31_7.png\",\n\t\"./mech_rec_help/img/31_8.png\": \"./app/panels/mech_rec_help/img/31_8.png\",\n\t\"./mech_rec_help/img/31_9.png\": \"./app/panels/mech_rec_help/img/31_9.png\",\n\t\"./mech_rec_help/img/32_1.png\": \"./app/panels/mech_rec_help/img/32_1.png\",\n\t\"./mech_rec_help/img/32_2.png\": \"./app/panels/mech_rec_help/img/32_2.png\",\n\t\"./mech_rec_help/img/32_3.png\": \"./app/panels/mech_rec_help/img/32_3.png\",\n\t\"./mech_rec_help/img/33_1.png\": \"./app/panels/mech_rec_help/img/33_1.png\",\n\t\"./mech_rec_help/img/33_2.png\": \"./app/panels/mech_rec_help/img/33_2.png\",\n\t\"./mech_rec_help/img/33_3.png\": \"./app/panels/mech_rec_help/img/33_3.png\",\n\t\"./mech_rec_help/img/33_4.png\": \"./app/panels/mech_rec_help/img/33_4.png\",\n\t\"./mech_rec_help/img/34_1.png\": \"./app/panels/mech_rec_help/img/34_1.png\",\n\t\"./mech_rec_help/img/34_2.png\": \"./app/panels/mech_rec_help/img/34_2.png\",\n\t\"./mech_rec_help/img/34_3.png\": \"./app/panels/mech_rec_help/img/34_3.png\",\n\t\"./mech_rec_help/img/34_4.png\": \"./app/panels/mech_rec_help/img/34_4.png\",\n\t\"./mech_rec_help/img/34_5.png\": \"./app/panels/mech_rec_help/img/34_5.png\",\n\t\"./mech_rec_help/img/34_6.png\": \"./app/panels/mech_rec_help/img/34_6.png\",\n\t\"./mech_rec_help/img/34_7.png\": \"./app/panels/mech_rec_help/img/34_7.png\",\n\t\"./mech_rec_help/img/34_8.png\": \"./app/panels/mech_rec_help/img/34_8.png\",\n\t\"./mech_rec_help/img/35_1.png\": \"./app/panels/mech_rec_help/img/35_1.png\",\n\t\"./mech_rec_help/img/3_1.png\": \"./app/panels/mech_rec_help/img/3_1.png\",\n\t\"./mech_rec_help/img/410_1.png\": \"./app/panels/mech_rec_help/img/410_1.png\",\n\t\"./mech_rec_help/img/410_2.png\": \"./app/panels/mech_rec_help/img/410_2.png\",\n\t\"./mech_rec_help/img/410_3.png\": \"./app/panels/mech_rec_help/img/410_3.png\",\n\t\"./mech_rec_help/img/410_4.png\": \"./app/panels/mech_rec_help/img/410_4.png\",\n\t\"./mech_rec_help/img/410_5.png\": \"./app/panels/mech_rec_help/img/410_5.png\",\n\t\"./mech_rec_help/img/410_6.png\": \"./app/panels/mech_rec_help/img/410_6.png\",\n\t\"./mech_rec_help/img/410_7.png\": \"./app/panels/mech_rec_help/img/410_7.png\",\n\t\"./mech_rec_help/img/411_1.png\": \"./app/panels/mech_rec_help/img/411_1.png\",\n\t\"./mech_rec_help/img/411_2.png\": \"./app/panels/mech_rec_help/img/411_2.png\",\n\t\"./mech_rec_help/img/411_3.png\": \"./app/panels/mech_rec_help/img/411_3.png\",\n\t\"./mech_rec_help/img/411_4.png\": \"./app/panels/mech_rec_help/img/411_4.png\",\n\t\"./mech_rec_help/img/412_1.png\": \"./app/panels/mech_rec_help/img/412_1.png\",\n\t\"./mech_rec_help/img/412_2.png\": \"./app/panels/mech_rec_help/img/412_2.png\",\n\t\"./mech_rec_help/img/412_3.png\": \"./app/panels/mech_rec_help/img/412_3.png\",\n\t\"./mech_rec_help/img/412_4.png\": \"./app/panels/mech_rec_help/img/412_4.png\",\n\t\"./mech_rec_help/img/413_1.png\": \"./app/panels/mech_rec_help/img/413_1.png\",\n\t\"./mech_rec_help/img/413_2.png\": \"./app/panels/mech_rec_help/img/413_2.png\",\n\t\"./mech_rec_help/img/413_3.png\": \"./app/panels/mech_rec_help/img/413_3.png\",\n\t\"./mech_rec_help/img/413_4.png\": \"./app/panels/mech_rec_help/img/413_4.png\",\n\t\"./mech_rec_help/img/413_5.png\": \"./app/panels/mech_rec_help/img/413_5.png\",\n\t\"./mech_rec_help/img/414_1.png\": \"./app/panels/mech_rec_help/img/414_1.png\",\n\t\"./mech_rec_help/img/414_2.png\": \"./app/panels/mech_rec_help/img/414_2.png\",\n\t\"./mech_rec_help/img/414_3.png\": \"./app/panels/mech_rec_help/img/414_3.png\",\n\t\"./mech_rec_help/img/41_1.png\": \"./app/panels/mech_rec_help/img/41_1.png\",\n\t\"./mech_rec_help/img/41_10.png\": \"./app/panels/mech_rec_help/img/41_10.png\",\n\t\"./mech_rec_help/img/41_11.png\": \"./app/panels/mech_rec_help/img/41_11.png\",\n\t\"./mech_rec_help/img/41_12.png\": \"./app/panels/mech_rec_help/img/41_12.png\",\n\t\"./mech_rec_help/img/41_2.png\": \"./app/panels/mech_rec_help/img/41_2.png\",\n\t\"./mech_rec_help/img/41_3.png\": \"./app/panels/mech_rec_help/img/41_3.png\",\n\t\"./mech_rec_help/img/41_4.png\": \"./app/panels/mech_rec_help/img/41_4.png\",\n\t\"./mech_rec_help/img/41_5.png\": \"./app/panels/mech_rec_help/img/41_5.png\",\n\t\"./mech_rec_help/img/41_6.png\": \"./app/panels/mech_rec_help/img/41_6.png\",\n\t\"./mech_rec_help/img/41_7.png\": \"./app/panels/mech_rec_help/img/41_7.png\",\n\t\"./mech_rec_help/img/41_8.png\": \"./app/panels/mech_rec_help/img/41_8.png\",\n\t\"./mech_rec_help/img/41_9.png\": \"./app/panels/mech_rec_help/img/41_9.png\",\n\t\"./mech_rec_help/img/42_1.png\": \"./app/panels/mech_rec_help/img/42_1.png\",\n\t\"./mech_rec_help/img/42_2.png\": \"./app/panels/mech_rec_help/img/42_2.png\",\n\t\"./mech_rec_help/img/42_3.png\": \"./app/panels/mech_rec_help/img/42_3.png\",\n\t\"./mech_rec_help/img/42_4.png\": \"./app/panels/mech_rec_help/img/42_4.png\",\n\t\"./mech_rec_help/img/43_1.png\": \"./app/panels/mech_rec_help/img/43_1.png\",\n\t\"./mech_rec_help/img/43_2.png\": \"./app/panels/mech_rec_help/img/43_2.png\",\n\t\"./mech_rec_help/img/43_3.png\": \"./app/panels/mech_rec_help/img/43_3.png\",\n\t\"./mech_rec_help/img/43_4.png\": \"./app/panels/mech_rec_help/img/43_4.png\",\n\t\"./mech_rec_help/img/43_5.png\": \"./app/panels/mech_rec_help/img/43_5.png\",\n\t\"./mech_rec_help/img/43_6.png\": \"./app/panels/mech_rec_help/img/43_6.png\",\n\t\"./mech_rec_help/img/43_7.png\": \"./app/panels/mech_rec_help/img/43_7.png\",\n\t\"./mech_rec_help/img/43_8.png\": \"./app/panels/mech_rec_help/img/43_8.png\",\n\t\"./mech_rec_help/img/44_1.png\": \"./app/panels/mech_rec_help/img/44_1.png\",\n\t\"./mech_rec_help/img/44_10.png\": \"./app/panels/mech_rec_help/img/44_10.png\",\n\t\"./mech_rec_help/img/44_2.png\": \"./app/panels/mech_rec_help/img/44_2.png\",\n\t\"./mech_rec_help/img/44_3.png\": \"./app/panels/mech_rec_help/img/44_3.png\",\n\t\"./mech_rec_help/img/44_4.png\": \"./app/panels/mech_rec_help/img/44_4.png\",\n\t\"./mech_rec_help/img/44_5.png\": \"./app/panels/mech_rec_help/img/44_5.png\",\n\t\"./mech_rec_help/img/44_6.png\": \"./app/panels/mech_rec_help/img/44_6.png\",\n\t\"./mech_rec_help/img/44_7.png\": \"./app/panels/mech_rec_help/img/44_7.png\",\n\t\"./mech_rec_help/img/44_8.png\": \"./app/panels/mech_rec_help/img/44_8.png\",\n\t\"./mech_rec_help/img/44_9.png\": \"./app/panels/mech_rec_help/img/44_9.png\",\n\t\"./mech_rec_help/img/45_1.png\": \"./app/panels/mech_rec_help/img/45_1.png\",\n\t\"./mech_rec_help/img/45_10.png\": \"./app/panels/mech_rec_help/img/45_10.png\",\n\t\"./mech_rec_help/img/45_2.png\": \"./app/panels/mech_rec_help/img/45_2.png\",\n\t\"./mech_rec_help/img/45_3.png\": \"./app/panels/mech_rec_help/img/45_3.png\",\n\t\"./mech_rec_help/img/45_4.png\": \"./app/panels/mech_rec_help/img/45_4.png\",\n\t\"./mech_rec_help/img/45_5.png\": \"./app/panels/mech_rec_help/img/45_5.png\",\n\t\"./mech_rec_help/img/45_6.png\": \"./app/panels/mech_rec_help/img/45_6.png\",\n\t\"./mech_rec_help/img/45_7.png\": \"./app/panels/mech_rec_help/img/45_7.png\",\n\t\"./mech_rec_help/img/45_8.png\": \"./app/panels/mech_rec_help/img/45_8.png\",\n\t\"./mech_rec_help/img/45_9.png\": \"./app/panels/mech_rec_help/img/45_9.png\",\n\t\"./mech_rec_help/img/46_1.png\": \"./app/panels/mech_rec_help/img/46_1.png\",\n\t\"./mech_rec_help/img/46_2.png\": \"./app/panels/mech_rec_help/img/46_2.png\",\n\t\"./mech_rec_help/img/46_3.png\": \"./app/panels/mech_rec_help/img/46_3.png\",\n\t\"./mech_rec_help/img/46_4.png\": \"./app/panels/mech_rec_help/img/46_4.png\",\n\t\"./mech_rec_help/img/46_5.png\": \"./app/panels/mech_rec_help/img/46_5.png\",\n\t\"./mech_rec_help/img/46_6.png\": \"./app/panels/mech_rec_help/img/46_6.png\",\n\t\"./mech_rec_help/img/47_1.png\": \"./app/panels/mech_rec_help/img/47_1.png\",\n\t\"./mech_rec_help/img/47_10.png\": \"./app/panels/mech_rec_help/img/47_10.png\",\n\t\"./mech_rec_help/img/47_11.png\": \"./app/panels/mech_rec_help/img/47_11.png\",\n\t\"./mech_rec_help/img/47_12.png\": \"./app/panels/mech_rec_help/img/47_12.png\",\n\t\"./mech_rec_help/img/47_2.png\": \"./app/panels/mech_rec_help/img/47_2.png\",\n\t\"./mech_rec_help/img/47_3.png\": \"./app/panels/mech_rec_help/img/47_3.png\",\n\t\"./mech_rec_help/img/47_4.png\": \"./app/panels/mech_rec_help/img/47_4.png\",\n\t\"./mech_rec_help/img/47_5.png\": \"./app/panels/mech_rec_help/img/47_5.png\",\n\t\"./mech_rec_help/img/47_6.png\": \"./app/panels/mech_rec_help/img/47_6.png\",\n\t\"./mech_rec_help/img/47_7.png\": \"./app/panels/mech_rec_help/img/47_7.png\",\n\t\"./mech_rec_help/img/47_8.png\": \"./app/panels/mech_rec_help/img/47_8.png\",\n\t\"./mech_rec_help/img/47_9.png\": \"./app/panels/mech_rec_help/img/47_9.png\",\n\t\"./mech_rec_help/img/48_1.png\": \"./app/panels/mech_rec_help/img/48_1.png\",\n\t\"./mech_rec_help/img/48_2.png\": \"./app/panels/mech_rec_help/img/48_2.png\",\n\t\"./mech_rec_help/img/48_3.png\": \"./app/panels/mech_rec_help/img/48_3.png\",\n\t\"./mech_rec_help/img/48_4.png\": \"./app/panels/mech_rec_help/img/48_4.png\",\n\t\"./mech_rec_help/img/49_1.png\": \"./app/panels/mech_rec_help/img/49_1.png\",\n\t\"./mech_rec_help/img/49_2.png\": \"./app/panels/mech_rec_help/img/49_2.png\",\n\t\"./mech_rec_help/img/49_3.png\": \"./app/panels/mech_rec_help/img/49_3.png\",\n\t\"./mech_rec_help/img/add1_1.png\": \"./app/panels/mech_rec_help/img/add1_1.png\",\n\t\"./mech_rec_help/img/add1_2.png\": \"./app/panels/mech_rec_help/img/add1_2.png\",\n\t\"./mech_rec_help/img/add1_3.png\": \"./app/panels/mech_rec_help/img/add1_3.png\",\n\t\"./mech_rec_help/img/add1_4.png\": \"./app/panels/mech_rec_help/img/add1_4.png\",\n\t\"./mech_rec_help/img/add1_5.png\": \"./app/panels/mech_rec_help/img/add1_5.png\",\n\t\"./mech_rec_help/img/add1_6.png\": \"./app/panels/mech_rec_help/img/add1_6.png\",\n\t\"./mech_rec_help/img/add1_7.png\": \"./app/panels/mech_rec_help/img/add1_7.png\",\n\t\"./mech_rec_help/img/add1_8.png\": \"./app/panels/mech_rec_help/img/add1_8.png\",\n\t\"./mech_rec_help/img/add1_9.png\": \"./app/panels/mech_rec_help/img/add1_9.png\",\n\t\"./mech_rec_help/index\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/index.js\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/mech_rec_help\": \"./app/panels/mech_rec_help/mech_rec_help.js\",\n\t\"./mech_rec_help/mech_rec_help.js\": \"./app/panels/mech_rec_help/mech_rec_help.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/21_1.png\": \"./app/panels/prj_help/img/21_1.png\",\n\t\"./prj_help/img/21_2.png\": \"./app/panels/prj_help/img/21_2.png\",\n\t\"./prj_help/img/21_3.png\": \"./app/panels/prj_help/img/21_3.png\",\n\t\"./prj_help/img/21_4.png\": \"./app/panels/prj_help/img/21_4.png\",\n\t\"./prj_help/img/21_5.png\": \"./app/panels/prj_help/img/21_5.png\",\n\t\"./prj_help/img/22_1.png\": \"./app/panels/prj_help/img/22_1.png\",\n\t\"./prj_help/img/22_2.png\": \"./app/panels/prj_help/img/22_2.png\",\n\t\"./prj_help/img/22_3.png\": \"./app/panels/prj_help/img/22_3.png\",\n\t\"./prj_help/img/23_1.png\": \"./app/panels/prj_help/img/23_1.png\",\n\t\"./prj_help/img/23_2.png\": \"./app/panels/prj_help/img/23_2.png\",\n\t\"./prj_help/img/24_1.png\": \"./app/panels/prj_help/img/24_1.png\",\n\t\"./prj_help/img/24_2.png\": \"./app/panels/prj_help/img/24_2.png\",\n\t\"./prj_help/img/24_3.png\": \"./app/panels/prj_help/img/24_3.png\",\n\t\"./prj_help/img/24_4.png\": \"./app/panels/prj_help/img/24_4.png\",\n\t\"./prj_help/img/24_5.png\": \"./app/panels/prj_help/img/24_5.png\",\n\t\"./prj_help/img/3_1.png\": \"./app/panels/prj_help/img/3_1.png\",\n\t\"./prj_help/img/3_2.png\": \"./app/panels/prj_help/img/3_2.png\",\n\t\"./prj_help/img/3_3.png\": \"./app/panels/prj_help/img/3_3.png\",\n\t\"./prj_help/img/3_4.png\": \"./app/panels/prj_help/img/3_4.png\",\n\t\"./prj_help/img/3_5.png\": \"./app/panels/prj_help/img/3_5.png\",\n\t\"./prj_help/img/3_6.png\": \"./app/panels/prj_help/img/3_6.png\",\n\t\"./prj_help/img/41_1.png\": \"./app/panels/prj_help/img/41_1.png\",\n\t\"./prj_help/img/41_2.png\": \"./app/panels/prj_help/img/41_2.png\",\n\t\"./prj_help/img/42_1.png\": \"./app/panels/prj_help/img/42_1.png\",\n\t\"./prj_help/img/42_2.png\": \"./app/panels/prj_help/img/42_2.png\",\n\t\"./prj_help/img/43_1.png\": \"./app/panels/prj_help/img/43_1.png\",\n\t\"./prj_help/img/43_2.png\": \"./app/panels/prj_help/img/43_2.png\",\n\t\"./prj_help/img/43_3.png\": \"./app/panels/prj_help/img/43_3.png\",\n\t\"./prj_help/img/43_4.png\": \"./app/panels/prj_help/img/43_4.png\",\n\t\"./prj_help/img/44_1.png\": \"./app/panels/prj_help/img/44_1.png\",\n\t\"./prj_help/img/44_2.png\": \"./app/panels/prj_help/img/44_2.png\",\n\t\"./prj_help/img/44_3.png\": \"./app/panels/prj_help/img/44_3.png\",\n\t\"./prj_help/img/44_4.png\": \"./app/panels/prj_help/img/44_4.png\",\n\t\"./prj_help/img/45_1.png\": \"./app/panels/prj_help/img/45_1.png\",\n\t\"./prj_help/img/46_1.png\": \"./app/panels/prj_help/img/46_1.png\",\n\t\"./prj_help/img/47_1.png\": \"./app/panels/prj_help/img/47_1.png\",\n\t\"./prj_help/img/71_1.png\": \"./app/panels/prj_help/img/71_1.png\",\n\t\"./prj_help/img/72_1.png\": \"./app/panels/prj_help/img/72_1.png\",\n\t\"./prj_help/img/72_2.png\": \"./app/panels/prj_help/img/72_2.png\",\n\t\"./prj_help/img/72_3.png\": \"./app/panels/prj_help/img/72_3.png\",\n\t\"./prj_help/img/74_1.png\": \"./app/panels/prj_help/img/74_1.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl.js\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/layouts\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/layouts.js\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./rrp_conf_editor\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_dialog\": \"./app/panels/rrp_conf_editor/IUD/iud_form_dialog.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_dialog.js\": \"./app/panels/rrp_conf_editor/IUD/iud_form_dialog.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_text_field\": \"./app/panels/rrp_conf_editor/IUD/iud_form_text_field.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_text_field.js\": \"./app/panels/rrp_conf_editor/IUD/iud_form_text_field.js\",\n\t\"./rrp_conf_editor/components/layouts\": \"./app/panels/rrp_conf_editor/components/layouts.js\",\n\t\"./rrp_conf_editor/components/layouts.js\": \"./app/panels/rrp_conf_editor/components/layouts.js\",\n\t\"./rrp_conf_editor/components/rrp_section\": \"./app/panels/rrp_conf_editor/components/rrp_section.js\",\n\t\"./rrp_conf_editor/components/rrp_section.js\": \"./app/panels/rrp_conf_editor/components/rrp_section.js\",\n\t\"./rrp_conf_editor/components/section_tab_panel\": \"./app/panels/rrp_conf_editor/components/section_tab_panel.js\",\n\t\"./rrp_conf_editor/components/section_tab_panel.js\": \"./app/panels/rrp_conf_editor/components/section_tab_panel.js\",\n\t\"./rrp_conf_editor/hooks\": \"./app/panels/rrp_conf_editor/hooks.js\",\n\t\"./rrp_conf_editor/hooks.js\": \"./app/panels/rrp_conf_editor/hooks.js\",\n\t\"./rrp_conf_editor/index\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/index.js\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/rrp_conf_editor\": \"./app/panels/rrp_conf_editor/rrp_conf_editor.js\",\n\t\"./rrp_conf_editor/rrp_conf_editor.js\": \"./app/panels/rrp_conf_editor/rrp_conf_editor.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\",\n\t\"./samples/svg\": \"./app/panels/samples/svg.js\",\n\t\"./samples/svg.js\": \"./app/panels/samples/svg.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); +eval("var map = {\n\t\"./dummy\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/dummy\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/dummy.js\": \"./app/panels/dummy/dummy.js\",\n\t\"./dummy/index\": \"./app/panels/dummy/index.js\",\n\t\"./dummy/index.js\": \"./app/panels/dummy/index.js\",\n\t\"./eqs_prfrm\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/eqs_prfrm\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/eqs_prfrm.js\": \"./app/panels/eqs_prfrm/eqs_prfrm.js\",\n\t\"./eqs_prfrm/filter\": \"./app/panels/eqs_prfrm/filter.js\",\n\t\"./eqs_prfrm/filter.js\": \"./app/panels/eqs_prfrm/filter.js\",\n\t\"./eqs_prfrm/filter_dialog\": \"./app/panels/eqs_prfrm/filter_dialog.js\",\n\t\"./eqs_prfrm/filter_dialog.js\": \"./app/panels/eqs_prfrm/filter_dialog.js\",\n\t\"./eqs_prfrm/filter_input_field\": \"./app/panels/eqs_prfrm/filter_input_field.js\",\n\t\"./eqs_prfrm/filter_input_field.js\": \"./app/panels/eqs_prfrm/filter_input_field.js\",\n\t\"./eqs_prfrm/hooks\": \"./app/panels/eqs_prfrm/hooks.js\",\n\t\"./eqs_prfrm/hooks.js\": \"./app/panels/eqs_prfrm/hooks.js\",\n\t\"./eqs_prfrm/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/layouts\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./eqs_prfrm/layouts.js\": \"./app/panels/eqs_prfrm/layouts.js\",\n\t\"./mech_rec_assembly_mon\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/components/plan_detail\": \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\",\n\t\"./mech_rec_assembly_mon/components/plan_detail.js\": \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list\": \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list.js\": \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list_item\": \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.js\",\n\t\"./mech_rec_assembly_mon/components/plans_list_item.js\": \"./app/panels/mech_rec_assembly_mon/components/plans_list_item.js\",\n\t\"./mech_rec_assembly_mon/components/progress_box\": \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\",\n\t\"./mech_rec_assembly_mon/components/progress_box.js\": \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\",\n\t\"./mech_rec_assembly_mon/hooks\": \"./app/panels/mech_rec_assembly_mon/hooks.js\",\n\t\"./mech_rec_assembly_mon/hooks.js\": \"./app/panels/mech_rec_assembly_mon/hooks.js\",\n\t\"./mech_rec_assembly_mon/index\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/index.js\": \"./app/panels/mech_rec_assembly_mon/index.js\",\n\t\"./mech_rec_assembly_mon/mech_rec_assembly_mon\": \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\",\n\t\"./mech_rec_assembly_mon/mech_rec_assembly_mon.js\": \"./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js\",\n\t\"./mech_rec_assembly_mon/styles/themes\": \"./app/panels/mech_rec_assembly_mon/styles/themes.js\",\n\t\"./mech_rec_assembly_mon/styles/themes.js\": \"./app/panels/mech_rec_assembly_mon/styles/themes.js\",\n\t\"./mech_rec_cost_jobs_manage\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/fcjobssp\": \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\",\n\t\"./mech_rec_cost_jobs_manage/fcjobssp.js\": \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\",\n\t\"./mech_rec_cost_jobs_manage/hooks\": \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\",\n\t\"./mech_rec_cost_jobs_manage/hooks.js\": \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\",\n\t\"./mech_rec_cost_jobs_manage/index\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/index.js\": \"./app/panels/mech_rec_cost_jobs_manage/index.js\",\n\t\"./mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage\": \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\",\n\t\"./mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\": \"./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js\",\n\t\"./mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/backend_dg.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/fcroutlst.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/goodparties.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\": \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\",\n\t\"./mech_rec_cost_prod_plans/hooks\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_cost_prod_plans/index\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/index.js\": \"./app/panels/mech_rec_cost_prod_plans/index.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\": \"./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js\",\n\t\"./mech_rec_dept_cost_jobs\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/components/filter\": \"./app/panels/mech_rec_dept_cost_jobs/components/filter.js\",\n\t\"./mech_rec_dept_cost_jobs/components/filter.js\": \"./app/panels/mech_rec_dept_cost_jobs/components/filter.js\",\n\t\"./mech_rec_dept_cost_jobs/components/ins_department_dg\": \"./app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js\",\n\t\"./mech_rec_dept_cost_jobs/components/ins_department_dg.js\": \"./app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js\",\n\t\"./mech_rec_dept_cost_jobs/hooks\": \"./app/panels/mech_rec_dept_cost_jobs/hooks.js\",\n\t\"./mech_rec_dept_cost_jobs/hooks.js\": \"./app/panels/mech_rec_dept_cost_jobs/hooks.js\",\n\t\"./mech_rec_dept_cost_jobs/index\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/index.js\": \"./app/panels/mech_rec_dept_cost_jobs/index.js\",\n\t\"./mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs\": \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\",\n\t\"./mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\": \"./app/panels/mech_rec_dept_cost_jobs/mech_rec_dept_cost_jobs.js\",\n\t\"./mech_rec_dept_cost_prod_plans\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlst\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlst.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstsp\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js\",\n\t\"./mech_rec_dept_cost_prod_plans/fcroutlstsp.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js\",\n\t\"./mech_rec_dept_cost_prod_plans/hooks\": \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_dept_cost_prod_plans/hooks.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\",\n\t\"./mech_rec_dept_cost_prod_plans/incomefromdeps\": \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\",\n\t\"./mech_rec_dept_cost_prod_plans/incomefromdeps.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\",\n\t\"./mech_rec_dept_cost_prod_plans/index\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/index.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/index.js\",\n\t\"./mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans\": \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\",\n\t\"./mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\": \"./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js\",\n\t\"./mech_rec_help\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/img/1_1.png\": \"./app/panels/mech_rec_help/img/1_1.png\",\n\t\"./mech_rec_help/img/1_2.png\": \"./app/panels/mech_rec_help/img/1_2.png\",\n\t\"./mech_rec_help/img/1_3.png\": \"./app/panels/mech_rec_help/img/1_3.png\",\n\t\"./mech_rec_help/img/1_4.png\": \"./app/panels/mech_rec_help/img/1_4.png\",\n\t\"./mech_rec_help/img/1_5.png\": \"./app/panels/mech_rec_help/img/1_5.png\",\n\t\"./mech_rec_help/img/21_1.png\": \"./app/panels/mech_rec_help/img/21_1.png\",\n\t\"./mech_rec_help/img/21_2.png\": \"./app/panels/mech_rec_help/img/21_2.png\",\n\t\"./mech_rec_help/img/21_3.png\": \"./app/panels/mech_rec_help/img/21_3.png\",\n\t\"./mech_rec_help/img/2_1.png\": \"./app/panels/mech_rec_help/img/2_1.png\",\n\t\"./mech_rec_help/img/2_2.png\": \"./app/panels/mech_rec_help/img/2_2.png\",\n\t\"./mech_rec_help/img/2_3.png\": \"./app/panels/mech_rec_help/img/2_3.png\",\n\t\"./mech_rec_help/img/2_4.png\": \"./app/panels/mech_rec_help/img/2_4.png\",\n\t\"./mech_rec_help/img/2_5.png\": \"./app/panels/mech_rec_help/img/2_5.png\",\n\t\"./mech_rec_help/img/31_1.png\": \"./app/panels/mech_rec_help/img/31_1.png\",\n\t\"./mech_rec_help/img/31_10.png\": \"./app/panels/mech_rec_help/img/31_10.png\",\n\t\"./mech_rec_help/img/31_2.png\": \"./app/panels/mech_rec_help/img/31_2.png\",\n\t\"./mech_rec_help/img/31_3.png\": \"./app/panels/mech_rec_help/img/31_3.png\",\n\t\"./mech_rec_help/img/31_4.png\": \"./app/panels/mech_rec_help/img/31_4.png\",\n\t\"./mech_rec_help/img/31_5.png\": \"./app/panels/mech_rec_help/img/31_5.png\",\n\t\"./mech_rec_help/img/31_6.png\": \"./app/panels/mech_rec_help/img/31_6.png\",\n\t\"./mech_rec_help/img/31_7.png\": \"./app/panels/mech_rec_help/img/31_7.png\",\n\t\"./mech_rec_help/img/31_8.png\": \"./app/panels/mech_rec_help/img/31_8.png\",\n\t\"./mech_rec_help/img/31_9.png\": \"./app/panels/mech_rec_help/img/31_9.png\",\n\t\"./mech_rec_help/img/32_1.png\": \"./app/panels/mech_rec_help/img/32_1.png\",\n\t\"./mech_rec_help/img/32_2.png\": \"./app/panels/mech_rec_help/img/32_2.png\",\n\t\"./mech_rec_help/img/32_3.png\": \"./app/panels/mech_rec_help/img/32_3.png\",\n\t\"./mech_rec_help/img/33_1.png\": \"./app/panels/mech_rec_help/img/33_1.png\",\n\t\"./mech_rec_help/img/33_2.png\": \"./app/panels/mech_rec_help/img/33_2.png\",\n\t\"./mech_rec_help/img/33_3.png\": \"./app/panels/mech_rec_help/img/33_3.png\",\n\t\"./mech_rec_help/img/33_4.png\": \"./app/panels/mech_rec_help/img/33_4.png\",\n\t\"./mech_rec_help/img/34_1.png\": \"./app/panels/mech_rec_help/img/34_1.png\",\n\t\"./mech_rec_help/img/34_2.png\": \"./app/panels/mech_rec_help/img/34_2.png\",\n\t\"./mech_rec_help/img/34_3.png\": \"./app/panels/mech_rec_help/img/34_3.png\",\n\t\"./mech_rec_help/img/34_4.png\": \"./app/panels/mech_rec_help/img/34_4.png\",\n\t\"./mech_rec_help/img/34_5.png\": \"./app/panels/mech_rec_help/img/34_5.png\",\n\t\"./mech_rec_help/img/34_6.png\": \"./app/panels/mech_rec_help/img/34_6.png\",\n\t\"./mech_rec_help/img/34_7.png\": \"./app/panels/mech_rec_help/img/34_7.png\",\n\t\"./mech_rec_help/img/34_8.png\": \"./app/panels/mech_rec_help/img/34_8.png\",\n\t\"./mech_rec_help/img/35_1.png\": \"./app/panels/mech_rec_help/img/35_1.png\",\n\t\"./mech_rec_help/img/3_1.png\": \"./app/panels/mech_rec_help/img/3_1.png\",\n\t\"./mech_rec_help/img/410_1.png\": \"./app/panels/mech_rec_help/img/410_1.png\",\n\t\"./mech_rec_help/img/410_2.png\": \"./app/panels/mech_rec_help/img/410_2.png\",\n\t\"./mech_rec_help/img/410_3.png\": \"./app/panels/mech_rec_help/img/410_3.png\",\n\t\"./mech_rec_help/img/410_4.png\": \"./app/panels/mech_rec_help/img/410_4.png\",\n\t\"./mech_rec_help/img/410_5.png\": \"./app/panels/mech_rec_help/img/410_5.png\",\n\t\"./mech_rec_help/img/410_6.png\": \"./app/panels/mech_rec_help/img/410_6.png\",\n\t\"./mech_rec_help/img/410_7.png\": \"./app/panels/mech_rec_help/img/410_7.png\",\n\t\"./mech_rec_help/img/411_1.png\": \"./app/panels/mech_rec_help/img/411_1.png\",\n\t\"./mech_rec_help/img/411_2.png\": \"./app/panels/mech_rec_help/img/411_2.png\",\n\t\"./mech_rec_help/img/411_3.png\": \"./app/panels/mech_rec_help/img/411_3.png\",\n\t\"./mech_rec_help/img/411_4.png\": \"./app/panels/mech_rec_help/img/411_4.png\",\n\t\"./mech_rec_help/img/412_1.png\": \"./app/panels/mech_rec_help/img/412_1.png\",\n\t\"./mech_rec_help/img/412_2.png\": \"./app/panels/mech_rec_help/img/412_2.png\",\n\t\"./mech_rec_help/img/412_3.png\": \"./app/panels/mech_rec_help/img/412_3.png\",\n\t\"./mech_rec_help/img/412_4.png\": \"./app/panels/mech_rec_help/img/412_4.png\",\n\t\"./mech_rec_help/img/413_1.png\": \"./app/panels/mech_rec_help/img/413_1.png\",\n\t\"./mech_rec_help/img/413_2.png\": \"./app/panels/mech_rec_help/img/413_2.png\",\n\t\"./mech_rec_help/img/413_3.png\": \"./app/panels/mech_rec_help/img/413_3.png\",\n\t\"./mech_rec_help/img/413_4.png\": \"./app/panels/mech_rec_help/img/413_4.png\",\n\t\"./mech_rec_help/img/413_5.png\": \"./app/panels/mech_rec_help/img/413_5.png\",\n\t\"./mech_rec_help/img/414_1.png\": \"./app/panels/mech_rec_help/img/414_1.png\",\n\t\"./mech_rec_help/img/414_2.png\": \"./app/panels/mech_rec_help/img/414_2.png\",\n\t\"./mech_rec_help/img/414_3.png\": \"./app/panels/mech_rec_help/img/414_3.png\",\n\t\"./mech_rec_help/img/41_1.png\": \"./app/panels/mech_rec_help/img/41_1.png\",\n\t\"./mech_rec_help/img/41_10.png\": \"./app/panels/mech_rec_help/img/41_10.png\",\n\t\"./mech_rec_help/img/41_11.png\": \"./app/panels/mech_rec_help/img/41_11.png\",\n\t\"./mech_rec_help/img/41_12.png\": \"./app/panels/mech_rec_help/img/41_12.png\",\n\t\"./mech_rec_help/img/41_2.png\": \"./app/panels/mech_rec_help/img/41_2.png\",\n\t\"./mech_rec_help/img/41_3.png\": \"./app/panels/mech_rec_help/img/41_3.png\",\n\t\"./mech_rec_help/img/41_4.png\": \"./app/panels/mech_rec_help/img/41_4.png\",\n\t\"./mech_rec_help/img/41_5.png\": \"./app/panels/mech_rec_help/img/41_5.png\",\n\t\"./mech_rec_help/img/41_6.png\": \"./app/panels/mech_rec_help/img/41_6.png\",\n\t\"./mech_rec_help/img/41_7.png\": \"./app/panels/mech_rec_help/img/41_7.png\",\n\t\"./mech_rec_help/img/41_8.png\": \"./app/panels/mech_rec_help/img/41_8.png\",\n\t\"./mech_rec_help/img/41_9.png\": \"./app/panels/mech_rec_help/img/41_9.png\",\n\t\"./mech_rec_help/img/42_1.png\": \"./app/panels/mech_rec_help/img/42_1.png\",\n\t\"./mech_rec_help/img/42_2.png\": \"./app/panels/mech_rec_help/img/42_2.png\",\n\t\"./mech_rec_help/img/42_3.png\": \"./app/panels/mech_rec_help/img/42_3.png\",\n\t\"./mech_rec_help/img/42_4.png\": \"./app/panels/mech_rec_help/img/42_4.png\",\n\t\"./mech_rec_help/img/43_1.png\": \"./app/panels/mech_rec_help/img/43_1.png\",\n\t\"./mech_rec_help/img/43_2.png\": \"./app/panels/mech_rec_help/img/43_2.png\",\n\t\"./mech_rec_help/img/43_3.png\": \"./app/panels/mech_rec_help/img/43_3.png\",\n\t\"./mech_rec_help/img/43_4.png\": \"./app/panels/mech_rec_help/img/43_4.png\",\n\t\"./mech_rec_help/img/43_5.png\": \"./app/panels/mech_rec_help/img/43_5.png\",\n\t\"./mech_rec_help/img/43_6.png\": \"./app/panels/mech_rec_help/img/43_6.png\",\n\t\"./mech_rec_help/img/43_7.png\": \"./app/panels/mech_rec_help/img/43_7.png\",\n\t\"./mech_rec_help/img/43_8.png\": \"./app/panels/mech_rec_help/img/43_8.png\",\n\t\"./mech_rec_help/img/44_1.png\": \"./app/panels/mech_rec_help/img/44_1.png\",\n\t\"./mech_rec_help/img/44_10.png\": \"./app/panels/mech_rec_help/img/44_10.png\",\n\t\"./mech_rec_help/img/44_2.png\": \"./app/panels/mech_rec_help/img/44_2.png\",\n\t\"./mech_rec_help/img/44_3.png\": \"./app/panels/mech_rec_help/img/44_3.png\",\n\t\"./mech_rec_help/img/44_4.png\": \"./app/panels/mech_rec_help/img/44_4.png\",\n\t\"./mech_rec_help/img/44_5.png\": \"./app/panels/mech_rec_help/img/44_5.png\",\n\t\"./mech_rec_help/img/44_6.png\": \"./app/panels/mech_rec_help/img/44_6.png\",\n\t\"./mech_rec_help/img/44_7.png\": \"./app/panels/mech_rec_help/img/44_7.png\",\n\t\"./mech_rec_help/img/44_8.png\": \"./app/panels/mech_rec_help/img/44_8.png\",\n\t\"./mech_rec_help/img/44_9.png\": \"./app/panels/mech_rec_help/img/44_9.png\",\n\t\"./mech_rec_help/img/45_1.png\": \"./app/panels/mech_rec_help/img/45_1.png\",\n\t\"./mech_rec_help/img/45_10.png\": \"./app/panels/mech_rec_help/img/45_10.png\",\n\t\"./mech_rec_help/img/45_2.png\": \"./app/panels/mech_rec_help/img/45_2.png\",\n\t\"./mech_rec_help/img/45_3.png\": \"./app/panels/mech_rec_help/img/45_3.png\",\n\t\"./mech_rec_help/img/45_4.png\": \"./app/panels/mech_rec_help/img/45_4.png\",\n\t\"./mech_rec_help/img/45_5.png\": \"./app/panels/mech_rec_help/img/45_5.png\",\n\t\"./mech_rec_help/img/45_6.png\": \"./app/panels/mech_rec_help/img/45_6.png\",\n\t\"./mech_rec_help/img/45_7.png\": \"./app/panels/mech_rec_help/img/45_7.png\",\n\t\"./mech_rec_help/img/45_8.png\": \"./app/panels/mech_rec_help/img/45_8.png\",\n\t\"./mech_rec_help/img/45_9.png\": \"./app/panels/mech_rec_help/img/45_9.png\",\n\t\"./mech_rec_help/img/46_1.png\": \"./app/panels/mech_rec_help/img/46_1.png\",\n\t\"./mech_rec_help/img/46_2.png\": \"./app/panels/mech_rec_help/img/46_2.png\",\n\t\"./mech_rec_help/img/46_3.png\": \"./app/panels/mech_rec_help/img/46_3.png\",\n\t\"./mech_rec_help/img/46_4.png\": \"./app/panels/mech_rec_help/img/46_4.png\",\n\t\"./mech_rec_help/img/46_5.png\": \"./app/panels/mech_rec_help/img/46_5.png\",\n\t\"./mech_rec_help/img/46_6.png\": \"./app/panels/mech_rec_help/img/46_6.png\",\n\t\"./mech_rec_help/img/47_1.png\": \"./app/panels/mech_rec_help/img/47_1.png\",\n\t\"./mech_rec_help/img/47_10.png\": \"./app/panels/mech_rec_help/img/47_10.png\",\n\t\"./mech_rec_help/img/47_11.png\": \"./app/panels/mech_rec_help/img/47_11.png\",\n\t\"./mech_rec_help/img/47_12.png\": \"./app/panels/mech_rec_help/img/47_12.png\",\n\t\"./mech_rec_help/img/47_2.png\": \"./app/panels/mech_rec_help/img/47_2.png\",\n\t\"./mech_rec_help/img/47_3.png\": \"./app/panels/mech_rec_help/img/47_3.png\",\n\t\"./mech_rec_help/img/47_4.png\": \"./app/panels/mech_rec_help/img/47_4.png\",\n\t\"./mech_rec_help/img/47_5.png\": \"./app/panels/mech_rec_help/img/47_5.png\",\n\t\"./mech_rec_help/img/47_6.png\": \"./app/panels/mech_rec_help/img/47_6.png\",\n\t\"./mech_rec_help/img/47_7.png\": \"./app/panels/mech_rec_help/img/47_7.png\",\n\t\"./mech_rec_help/img/47_8.png\": \"./app/panels/mech_rec_help/img/47_8.png\",\n\t\"./mech_rec_help/img/47_9.png\": \"./app/panels/mech_rec_help/img/47_9.png\",\n\t\"./mech_rec_help/img/48_1.png\": \"./app/panels/mech_rec_help/img/48_1.png\",\n\t\"./mech_rec_help/img/48_2.png\": \"./app/panels/mech_rec_help/img/48_2.png\",\n\t\"./mech_rec_help/img/48_3.png\": \"./app/panels/mech_rec_help/img/48_3.png\",\n\t\"./mech_rec_help/img/48_4.png\": \"./app/panels/mech_rec_help/img/48_4.png\",\n\t\"./mech_rec_help/img/49_1.png\": \"./app/panels/mech_rec_help/img/49_1.png\",\n\t\"./mech_rec_help/img/49_2.png\": \"./app/panels/mech_rec_help/img/49_2.png\",\n\t\"./mech_rec_help/img/49_3.png\": \"./app/panels/mech_rec_help/img/49_3.png\",\n\t\"./mech_rec_help/img/add1_1.png\": \"./app/panels/mech_rec_help/img/add1_1.png\",\n\t\"./mech_rec_help/img/add1_2.png\": \"./app/panels/mech_rec_help/img/add1_2.png\",\n\t\"./mech_rec_help/img/add1_3.png\": \"./app/panels/mech_rec_help/img/add1_3.png\",\n\t\"./mech_rec_help/img/add1_4.png\": \"./app/panels/mech_rec_help/img/add1_4.png\",\n\t\"./mech_rec_help/img/add1_5.png\": \"./app/panels/mech_rec_help/img/add1_5.png\",\n\t\"./mech_rec_help/img/add1_6.png\": \"./app/panels/mech_rec_help/img/add1_6.png\",\n\t\"./mech_rec_help/img/add1_7.png\": \"./app/panels/mech_rec_help/img/add1_7.png\",\n\t\"./mech_rec_help/img/add1_8.png\": \"./app/panels/mech_rec_help/img/add1_8.png\",\n\t\"./mech_rec_help/img/add1_9.png\": \"./app/panels/mech_rec_help/img/add1_9.png\",\n\t\"./mech_rec_help/index\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/index.js\": \"./app/panels/mech_rec_help/index.js\",\n\t\"./mech_rec_help/mech_rec_help\": \"./app/panels/mech_rec_help/mech_rec_help.js\",\n\t\"./mech_rec_help/mech_rec_help.js\": \"./app/panels/mech_rec_help/mech_rec_help.js\",\n\t\"./prj_fin\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/index.js\": \"./app/panels/prj_fin/index.js\",\n\t\"./prj_fin/layouts\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/layouts.js\": \"./app/panels/prj_fin/layouts.js\",\n\t\"./prj_fin/prj_fin\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/prj_fin.js\": \"./app/panels/prj_fin/prj_fin.js\",\n\t\"./prj_fin/projects\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/projects.js\": \"./app/panels/prj_fin/projects.js\",\n\t\"./prj_fin/stage_arts\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_arts.js\": \"./app/panels/prj_fin/stage_arts.js\",\n\t\"./prj_fin/stage_contracts\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stage_contracts.js\": \"./app/panels/prj_fin/stage_contracts.js\",\n\t\"./prj_fin/stages\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_fin/stages.js\": \"./app/panels/prj_fin/stages.js\",\n\t\"./prj_graph\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/index.js\": \"./app/panels/prj_graph/index.js\",\n\t\"./prj_graph/layouts\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/layouts.js\": \"./app/panels/prj_graph/layouts.js\",\n\t\"./prj_graph/prj_graph\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_graph/prj_graph.js\": \"./app/panels/prj_graph/prj_graph.js\",\n\t\"./prj_help\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/img/21_1.png\": \"./app/panels/prj_help/img/21_1.png\",\n\t\"./prj_help/img/21_2.png\": \"./app/panels/prj_help/img/21_2.png\",\n\t\"./prj_help/img/21_3.png\": \"./app/panels/prj_help/img/21_3.png\",\n\t\"./prj_help/img/21_4.png\": \"./app/panels/prj_help/img/21_4.png\",\n\t\"./prj_help/img/21_5.png\": \"./app/panels/prj_help/img/21_5.png\",\n\t\"./prj_help/img/22_1.png\": \"./app/panels/prj_help/img/22_1.png\",\n\t\"./prj_help/img/22_2.png\": \"./app/panels/prj_help/img/22_2.png\",\n\t\"./prj_help/img/22_3.png\": \"./app/panels/prj_help/img/22_3.png\",\n\t\"./prj_help/img/23_1.png\": \"./app/panels/prj_help/img/23_1.png\",\n\t\"./prj_help/img/23_2.png\": \"./app/panels/prj_help/img/23_2.png\",\n\t\"./prj_help/img/24_1.png\": \"./app/panels/prj_help/img/24_1.png\",\n\t\"./prj_help/img/24_2.png\": \"./app/panels/prj_help/img/24_2.png\",\n\t\"./prj_help/img/24_3.png\": \"./app/panels/prj_help/img/24_3.png\",\n\t\"./prj_help/img/24_4.png\": \"./app/panels/prj_help/img/24_4.png\",\n\t\"./prj_help/img/24_5.png\": \"./app/panels/prj_help/img/24_5.png\",\n\t\"./prj_help/img/3_1.png\": \"./app/panels/prj_help/img/3_1.png\",\n\t\"./prj_help/img/3_2.png\": \"./app/panels/prj_help/img/3_2.png\",\n\t\"./prj_help/img/3_3.png\": \"./app/panels/prj_help/img/3_3.png\",\n\t\"./prj_help/img/3_4.png\": \"./app/panels/prj_help/img/3_4.png\",\n\t\"./prj_help/img/3_5.png\": \"./app/panels/prj_help/img/3_5.png\",\n\t\"./prj_help/img/3_6.png\": \"./app/panels/prj_help/img/3_6.png\",\n\t\"./prj_help/img/41_1.png\": \"./app/panels/prj_help/img/41_1.png\",\n\t\"./prj_help/img/41_2.png\": \"./app/panels/prj_help/img/41_2.png\",\n\t\"./prj_help/img/42_1.png\": \"./app/panels/prj_help/img/42_1.png\",\n\t\"./prj_help/img/42_2.png\": \"./app/panels/prj_help/img/42_2.png\",\n\t\"./prj_help/img/43_1.png\": \"./app/panels/prj_help/img/43_1.png\",\n\t\"./prj_help/img/43_2.png\": \"./app/panels/prj_help/img/43_2.png\",\n\t\"./prj_help/img/43_3.png\": \"./app/panels/prj_help/img/43_3.png\",\n\t\"./prj_help/img/43_4.png\": \"./app/panels/prj_help/img/43_4.png\",\n\t\"./prj_help/img/44_1.png\": \"./app/panels/prj_help/img/44_1.png\",\n\t\"./prj_help/img/44_2.png\": \"./app/panels/prj_help/img/44_2.png\",\n\t\"./prj_help/img/44_3.png\": \"./app/panels/prj_help/img/44_3.png\",\n\t\"./prj_help/img/44_4.png\": \"./app/panels/prj_help/img/44_4.png\",\n\t\"./prj_help/img/45_1.png\": \"./app/panels/prj_help/img/45_1.png\",\n\t\"./prj_help/img/46_1.png\": \"./app/panels/prj_help/img/46_1.png\",\n\t\"./prj_help/img/47_1.png\": \"./app/panels/prj_help/img/47_1.png\",\n\t\"./prj_help/img/71_1.png\": \"./app/panels/prj_help/img/71_1.png\",\n\t\"./prj_help/img/72_1.png\": \"./app/panels/prj_help/img/72_1.png\",\n\t\"./prj_help/img/72_2.png\": \"./app/panels/prj_help/img/72_2.png\",\n\t\"./prj_help/img/72_3.png\": \"./app/panels/prj_help/img/72_3.png\",\n\t\"./prj_help/img/74_1.png\": \"./app/panels/prj_help/img/74_1.png\",\n\t\"./prj_help/index\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/index.js\": \"./app/panels/prj_help/index.js\",\n\t\"./prj_help/prj_help\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_help/prj_help.js\": \"./app/panels/prj_help/prj_help.js\",\n\t\"./prj_jobs\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/index.js\": \"./app/panels/prj_jobs/index.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_fact_rpt_dtl.js\": \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_fot_dtl.js\": \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/lab_plan_jobs_dtl.js\": \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\",\n\t\"./prj_jobs/layouts\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/layouts.js\": \"./app/panels/prj_jobs/layouts.js\",\n\t\"./prj_jobs/prj_jobs\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/prj_jobs.js\": \"./app/panels/prj_jobs/prj_jobs.js\",\n\t\"./prj_jobs/res_mon\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./prj_jobs/res_mon.js\": \"./app/panels/prj_jobs/res_mon.js\",\n\t\"./rrp_conf_editor\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_dialog\": \"./app/panels/rrp_conf_editor/IUD/iud_form_dialog.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_dialog.js\": \"./app/panels/rrp_conf_editor/IUD/iud_form_dialog.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_text_field\": \"./app/panels/rrp_conf_editor/IUD/iud_form_text_field.js\",\n\t\"./rrp_conf_editor/IUD/iud_form_text_field.js\": \"./app/panels/rrp_conf_editor/IUD/iud_form_text_field.js\",\n\t\"./rrp_conf_editor/components/layouts\": \"./app/panels/rrp_conf_editor/components/layouts.js\",\n\t\"./rrp_conf_editor/components/layouts.js\": \"./app/panels/rrp_conf_editor/components/layouts.js\",\n\t\"./rrp_conf_editor/components/rrp_section\": \"./app/panels/rrp_conf_editor/components/rrp_section.js\",\n\t\"./rrp_conf_editor/components/rrp_section.js\": \"./app/panels/rrp_conf_editor/components/rrp_section.js\",\n\t\"./rrp_conf_editor/components/section_tab_panel\": \"./app/panels/rrp_conf_editor/components/section_tab_panel.js\",\n\t\"./rrp_conf_editor/components/section_tab_panel.js\": \"./app/panels/rrp_conf_editor/components/section_tab_panel.js\",\n\t\"./rrp_conf_editor/hooks\": \"./app/panels/rrp_conf_editor/hooks.js\",\n\t\"./rrp_conf_editor/hooks.js\": \"./app/panels/rrp_conf_editor/hooks.js\",\n\t\"./rrp_conf_editor/index\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/index.js\": \"./app/panels/rrp_conf_editor/index.js\",\n\t\"./rrp_conf_editor/rrp_conf_editor\": \"./app/panels/rrp_conf_editor/rrp_conf_editor.js\",\n\t\"./rrp_conf_editor/rrp_conf_editor.js\": \"./app/panels/rrp_conf_editor/rrp_conf_editor.js\",\n\t\"./samples\": \"./app/panels/samples/index.js\",\n\t\"./samples/\": \"./app/panels/samples/index.js\",\n\t\"./samples/chart\": \"./app/panels/samples/chart.js\",\n\t\"./samples/chart.js\": \"./app/panels/samples/chart.js\",\n\t\"./samples/cyclogram\": \"./app/panels/samples/cyclogram.js\",\n\t\"./samples/cyclogram.js\": \"./app/panels/samples/cyclogram.js\",\n\t\"./samples/data_grid\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/data_grid.js\": \"./app/panels/samples/data_grid.js\",\n\t\"./samples/gantt\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/gantt.js\": \"./app/panels/samples/gantt.js\",\n\t\"./samples/index\": \"./app/panels/samples/index.js\",\n\t\"./samples/index.js\": \"./app/panels/samples/index.js\",\n\t\"./samples/loader\": \"./app/panels/samples/loader.js\",\n\t\"./samples/loader.js\": \"./app/panels/samples/loader.js\",\n\t\"./samples/messages\": \"./app/panels/samples/messages.js\",\n\t\"./samples/messages.js\": \"./app/panels/samples/messages.js\",\n\t\"./samples/mui\": \"./app/panels/samples/mui.js\",\n\t\"./samples/mui.js\": \"./app/panels/samples/mui.js\",\n\t\"./samples/p8online\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/p8online.js\": \"./app/panels/samples/p8online.js\",\n\t\"./samples/samples\": \"./app/panels/samples/samples.js\",\n\t\"./samples/samples.js\": \"./app/panels/samples/samples.js\",\n\t\"./samples/svg\": \"./app/panels/samples/svg.js\",\n\t\"./samples/svg.js\": \"./app/panels/samples/svg.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/panels sync recursive ^\\\\.\\\\/.*$\";\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/_sync_^\\.\\/.*$?"); /***/ }), @@ -4470,7 +4470,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BUTTONS: () => (/* binding */ BUTTONS),\n/* harmony export */ CAPTIONS: () => (/* binding */ CAPTIONS),\n/* harmony export */ ERRORS: () => (/* binding */ ERRORS),\n/* harmony export */ ERRORS_HTTP: () => (/* binding */ ERRORS_HTTP),\n/* harmony export */ TEXTS: () => (/* binding */ TEXTS),\n/* harmony export */ TITLES: () => (/* binding */ TITLES)\n/* harmony export */ });\n/*\r\n Парус 8 - Панели мониторинга\r\n Текстовые ресурсы и константы\r\n*/\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Заголовки\nconst TITLES = {\n INFO: \"Информация\",\n //Информационный блок\n WARN: \"Предупреждение\",\n //Блок предупреждения\n ERR: \"Ошибка\",\n //Информация об ошибке\n DEFAULT_PANELS_GROUP: \"Без привязки к группе\" //Заголовок группы панелей по умолчанию\n};\n\n//Текст\nconst TEXTS = {\n LOADING: \"Ожидайте...\",\n //Ожидание завершения процесса\n NO_DATA_FOUND: \"Данных не найдено\" //Отсутствие данных\n};\n\n//Текст кнопок\nconst BUTTONS = {\n NAVIGATE_HOME: \"Домой\",\n //Переход к домашней странице\n NAVIGATE_BACK: \"Назад\",\n //Возврат назад по навигации\n NAVIGATE: \"Перейти\",\n //Переход к разделу/панели/адресу\n OK: \"ОК\",\n //Ок\n CANCEL: \"Отмена\",\n //Отмена\n CLOSE: \"Закрыть\",\n //Сокрытие\n CLEAR: \"Очистить\",\n //Очистка\n ORDER_ASC: \"По возрастанию\",\n //Сортировка по возрастанию\n ORDER_DESC: \"По убыванию\",\n //Сортировка по убыванию\n FILTER: \"Фильтр\",\n //Фильтрация\n MORE: \"Ещё\" //Догрузка данных\n};\n\n//Метки атрибутов, сопроводительные надписи\nconst CAPTIONS = {\n VALUE: \"Значение\",\n VALUE_FROM: \"С\",\n VALUE_TO: \"По\",\n NUMB: \"Номер\",\n NAME: \"Наименование\",\n START: \"Начало\",\n END: \"Окончание\",\n PROGRESS: \"Прогресс\",\n LEGEND: \"Легенда\"\n};\n\n//Типовые сообщения об ошибках\nconst ERRORS = {\n UNDER_CONSTRUCTION: \"Панель в разработке\",\n P8O_API_UNAVAILABLE: '\"ПАРУС 8 Онлайн\" недоступен',\n DEFAULT: \"Неожиданная ошибка\"\n};\n\n//Типовые сообщения для ошибок HTTP\nconst ERRORS_HTTP = {\n 404: \"Адрес не найден\"\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app.text.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BUTTONS: () => (/* binding */ BUTTONS),\n/* harmony export */ CAPTIONS: () => (/* binding */ CAPTIONS),\n/* harmony export */ ERRORS: () => (/* binding */ ERRORS),\n/* harmony export */ ERRORS_HTTP: () => (/* binding */ ERRORS_HTTP),\n/* harmony export */ TEXTS: () => (/* binding */ TEXTS),\n/* harmony export */ TITLES: () => (/* binding */ TITLES)\n/* harmony export */ });\n/*\r\n Парус 8 - Панели мониторинга\r\n Текстовые ресурсы и константы\r\n*/\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Заголовки\nconst TITLES = {\n INFO: \"Информация\",\n //Информационный блок\n WARN: \"Предупреждение\",\n //Блок предупреждения\n ERR: \"Ошибка\",\n //Информация об ошибке\n DEFAULT_PANELS_GROUP: \"Без привязки к группе\" //Заголовок группы панелей по умолчанию\n};\n\n//Текст\nconst TEXTS = {\n LOADING: \"Ожидайте...\",\n //Ожидание завершения процесса\n NO_DATA_FOUND: \"Данных не найдено\" //Отсутствие данных\n};\n\n//Текст кнопок\nconst BUTTONS = {\n NAVIGATE_HOME: \"Домой\",\n //Переход к домашней странице\n NAVIGATE_BACK: \"Назад\",\n //Возврат назад по навигации\n NAVIGATE: \"Перейти\",\n //Переход к разделу/панели/адресу\n OK: \"ОК\",\n //Ок\n CANCEL: \"Отмена\",\n //Отмена\n CLOSE: \"Закрыть\",\n //Сокрытие\n CLEAR: \"Очистить\",\n //Очистка\n ORDER_ASC: \"По возрастанию\",\n //Сортировка по возрастанию\n ORDER_DESC: \"По убыванию\",\n //Сортировка по убыванию\n FILTER: \"Фильтр\",\n //Фильтрация\n MORE: \"Ещё\" //Догрузка данных\n};\n\n//Метки атрибутов, сопроводительные надписи\nconst CAPTIONS = {\n VALUE: \"Значение\",\n VALUE_FROM: \"С\",\n VALUE_TO: \"По\",\n NUMB: \"Номер\",\n NAME: \"Наименование\",\n START: \"Начало\",\n END: \"Окончание\",\n PROGRESS: \"Прогресс\",\n LEGEND: \"Легенда\"\n};\n\n//Типовые сообщения об ошибках\nconst ERRORS = {\n UNDER_CONSTRUCTION: \"Панель в разработке\",\n P8O_API_UNAVAILABLE: '\"ПАРУС 8 Онлайн\" недоступен',\n P8O_API_UNSUPPORTED: 'Функция \"ПАРУС 8 Онлайн\" не поддерживается',\n DEFAULT: \"Неожиданная ошибка\"\n};\n\n//Типовые сообщения для ошибок HTTP\nconst ERRORS_HTTP = {\n 404: \"Адрес не найден\"\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app.text.js?"); /***/ }), @@ -4525,7 +4525,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APP_BAR_HEIGHT: () => (/* binding */ APP_BAR_HEIGHT),\n/* harmony export */ P8PAppWorkspace: () => (/* binding */ P8PAppWorkspace)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CssBaseline/CssBaseline.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Рабочее пространство\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n\n//---------\n//Константы\n//---------\n\n//Высота главного меню\nconst APP_BAR_HEIGHT = \"64px\";\n\n//Стили\nconst STYLES = {\n ROOT_BOX: {\n display: \"flex\"\n },\n APP_BAR: {\n position: \"fixed\"\n },\n APP_BAR_BUTTON: {\n mr: 2\n },\n MAIN: {\n flexGrow: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Рабочее пространство\nconst P8PAppWorkspace = ({\n children,\n panels = [],\n selectedPanel,\n closeCaption,\n homeCaption,\n onHomeNavigate,\n onItemNavigate\n} = {}) => {\n //Собственное состояния\n const [open, setOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Отработка открытия бокового меню\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n //Отработка закрытия бового меню\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n //Отработка нажатия на домашнюю страницу\n const handleHomeClick = () => onHomeNavigate ? onHomeNavigate() : null;\n\n //Отработка нажатия на элемент бокового меню\n const handleItemNavigate = panel => {\n handleDrawerClose();\n onItemNavigate ? onItemNavigate(panel) : null;\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.ROOT_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n color: \"inherit\",\n \"aria-label\": \"open drawer\",\n onClick: open ? handleDrawerClose : handleDrawerOpen,\n edge: \"start\",\n sx: STYLES.APP_BAR_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, open ? \"chevron_left\" : \"menu\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h6\",\n noWrap: true,\n component: \"div\"\n }, selectedPanel?.caption))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n anchor: \"left\",\n open: open,\n onClose: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: closeCaption\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: handleHomeClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null, \"home\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n primary: homeCaption\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8PPanelsMenuDrawer, {\n panels: panels,\n selectedPanel: selectedPanel,\n onItemNavigate: handleItemNavigate\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"main\", {\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null), children));\n};\n\n//Контроль свойств - Рабочее пространство\nP8PAppWorkspace.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().element),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_14___default().arrayOf(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE,\n closeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n homeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().string).isRequired,\n onHomeNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_workspace.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ APP_BAR_HEIGHT: () => (/* binding */ APP_BAR_HEIGHT),\n/* harmony export */ P8PAppWorkspace: () => (/* binding */ P8PAppWorkspace)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CssBaseline/CssBaseline.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.styles */ \"./app.styles.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Рабочее пространство\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Меню\n //Типовые стили\n\n//---------\n//Константы\n//---------\n\n//Высота главного меню\nconst APP_BAR_HEIGHT = \"64px\";\n\n//Стили\nconst STYLES = {\n DRAWER: {\n [`& .MuiDrawer-paper`]: {\n ..._app_styles__WEBPACK_IMPORTED_MODULE_2__.APP_STYLES.SCROLL\n }\n },\n ROOT_BOX: {\n display: \"flex\"\n },\n APP_BAR: {\n position: \"fixed\"\n },\n APP_BAR_BUTTON: {\n mr: 2\n },\n MAIN: {\n flexGrow: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Рабочее пространство\nconst P8PAppWorkspace = ({\n children,\n panels = [],\n selectedPanel,\n closeCaption,\n homeCaption,\n onHomeNavigate,\n onItemNavigate\n} = {}) => {\n //Собственное состояния\n const [open, setOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Отработка открытия бокового меню\n const handleDrawerOpen = () => {\n setOpen(true);\n };\n\n //Отработка закрытия бового меню\n const handleDrawerClose = () => {\n setOpen(false);\n };\n\n //Отработка нажатия на домашнюю страницу\n const handleHomeClick = () => onHomeNavigate ? onHomeNavigate() : null;\n\n //Отработка нажатия на элемент бокового меню\n const handleItemNavigate = panel => {\n handleDrawerClose();\n onItemNavigate ? onItemNavigate(panel) : null;\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.ROOT_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n color: \"inherit\",\n \"aria-label\": \"open drawer\",\n onClick: open ? handleDrawerClose : handleDrawerOpen,\n edge: \"start\",\n sx: STYLES.APP_BAR_BUTTON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, open ? \"chevron_left\" : \"menu\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n variant: \"h6\",\n noWrap: true,\n component: \"div\"\n }, selectedPanel?.caption))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n anchor: \"left\",\n open: open,\n onClose: handleDrawerClose,\n sx: STYLES.DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleDrawerClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n primary: closeCaption\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleHomeClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, \"home\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n primary: homeCaption\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8PPanelsMenuDrawer, {\n panels: panels,\n selectedPanel: selectedPanel,\n onItemNavigate: handleItemNavigate\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"main\", {\n style: STYLES.MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null), children));\n};\n\n//Контроль свойств - Рабочее пространство\nP8PAppWorkspace.propTypes = {\n children: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().element),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_15___default().arrayOf(_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: _p8p_panels_menu__WEBPACK_IMPORTED_MODULE_1__.P8P_PANELS_MENU_PANEL_SHAPE,\n closeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string).isRequired,\n homeCaption: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string).isRequired,\n onHomeNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_app_workspace.js?"); /***/ }), @@ -4536,7 +4536,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PChart: () => (/* binding */ P8PChart),\n/* harmony export */ P8P_CHART_TYPE: () => (/* binding */ P8P_CHART_TYPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js/auto */ \"./node_modules/chart.js/auto/auto.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: График\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Диаграммы и графики\n\n//---------\n//Константы\n//---------\n\n//Виды графиков\nconst P8P_CHART_TYPE = {\n BAR: \"bar\",\n LINE: \"line\",\n PIE: \"pie\",\n DOUGHNUT: \"doughnut\"\n};\n\n//Структура элемента набора данных\nconst P8P_CHART_DATASET_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n label: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n borderColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n data: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)),\n items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().object))\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//График\nconst P8PChart = ({\n type,\n title,\n legendPosition,\n options,\n labels,\n datasets,\n onClick,\n style\n}) => {\n //Ссылки на DOM\n const chartCanvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chartRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент графика\n const handleClick = e => {\n const bar = chartRef.current.getElementsAtEventForMode(e, \"nearest\", {\n intersect: true\n }, true)[0];\n if (onClick && bar) onClick({\n datasetIndex: bar.datasetIndex,\n itemIndex: bar.index,\n item: chartRef.current.data.datasets[bar.datasetIndex].items ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] : null\n });\n };\n\n //При подключении к старнице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!chartRef.current) {\n const ctx = chartCanvasRef.current.getContext(\"2d\");\n chartRef.current = new chart_js_auto__WEBPACK_IMPORTED_MODULE_1__[\"default\"](ctx, {\n type,\n data: {\n labels: [...labels],\n datasets: [...datasets]\n },\n options: {\n ...options,\n ...{\n responsive: true,\n plugins: {\n legend: {\n display: legendPosition ? true : false,\n position: legendPosition\n },\n title: {\n display: title ? true : false,\n text: title\n }\n }\n },\n onClick: handleClick\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (chartRef.current) {\n chartRef.current.data.labels = [...labels];\n chartRef.current.data.datasets = [...datasets];\n chartRef.current.update();\n }\n }, [datasets, labels]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...style\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"canvas\", {\n ref: chartCanvasRef\n }));\n};\n\n//Контроль свойств - График\nP8PChart.propTypes = {\n type: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n legendPosition: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n options: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n labels: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)).isRequired,\n datasets: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_CHART_DATASET_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n style: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_chart.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PChart: () => (/* binding */ P8PChart),\n/* harmony export */ P8P_CHART_TYPE: () => (/* binding */ P8P_CHART_TYPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var chart_js_auto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js/auto */ \"./node_modules/chart.js/auto/auto.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: График\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Диаграммы и графики\n\n//---------\n//Константы\n//---------\n\n//Виды графиков\nconst P8P_CHART_TYPE = {\n BAR: \"bar\",\n LINE: \"line\",\n PIE: \"pie\",\n DOUGHNUT: \"doughnut\"\n};\n\n//Структура элемента набора данных\nconst P8P_CHART_DATASET_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n label: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n borderColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n backgroundColor: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().string), prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string))]),\n data: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().number)),\n items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().object))\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//График\nconst P8PChart = ({\n type,\n title,\n legendPosition,\n options = {},\n labels = [],\n datasets = [],\n onClick,\n style\n}) => {\n //Ссылки на DOM\n const chartCanvasRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n const chartRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Обработка нажатия на элемент графика\n const handleClick = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(e => {\n const bar = chartRef.current.getElementsAtEventForMode(e, \"nearest\", {\n intersect: true\n }, true)[0];\n if (onClick && bar) onClick({\n datasetIndex: bar.datasetIndex,\n itemIndex: bar.index,\n item: chartRef.current.data.datasets[bar.datasetIndex].items ? chartRef.current.data.datasets[bar.datasetIndex].items[bar.index] : null\n });\n }, [onClick]);\n\n //При подключении к старнице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!chartRef.current) {\n const ctx = chartCanvasRef.current.getContext(\"2d\");\n chartRef.current = new chart_js_auto__WEBPACK_IMPORTED_MODULE_1__[\"default\"](ctx, {\n type,\n data: {\n labels: [...labels],\n datasets: [...datasets]\n },\n options: {\n ...options,\n ...{\n responsive: true,\n plugins: {\n legend: {\n display: legendPosition ? true : false,\n position: legendPosition\n },\n title: {\n display: title ? true : false,\n text: title\n }\n }\n },\n onClick: handleClick\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При обновлении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (chartRef.current) {\n chartRef.current.data.labels = [...labels];\n chartRef.current.data.datasets = [...datasets];\n chartRef.current.options.onClick = handleClick;\n chartRef.current.update();\n }\n }, [datasets, labels, handleClick]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...style\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"canvas\", {\n ref: chartCanvasRef\n }));\n};\n\n//Контроль свойств - График\nP8PChart.propTypes = {\n type: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n legendPosition: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n options: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n labels: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)),\n datasets: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_CHART_DATASET_SHAPE),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n style: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_chart.js?"); + +/***/ }), + +/***/ "./app/components/p8p_cyclogram.js": +/*!*****************************************!*\ + !*** ./app/components/p8p_cyclogram.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PCyclogram: () => (/* binding */ P8PCyclogram)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/utils */ \"./app/core/utils.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Циклограмма\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n //Вспомогательный функции\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_CYCLOGRAM_ZOOM = [0.2, 0.4, 0.7, 1, 1.5, 2, 2.5];\n\n//Параметры элементов циклограммы\nconst NDEFAULT_LINE_HEIGHT = 20;\nconst NDEFAULT_HEADER_HEIGHT = 35;\n\n//Высота заголовка\nconst TITLE_HEIGHT = \"44px\";\n\n//Высота панели масштабирования\nconst ZOOM_HEIGHT = \"56px\";\n\n//Стили\nconst STYLES = {\n CYCLOGRAM_TITLE: {\n height: TITLE_HEIGHT\n },\n CYCLOGRAM_ZOOM: {\n height: ZOOM_HEIGHT\n },\n HEADER_COLUMN: {\n fontSize: \"12px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\",\n textAlign: \"center\",\n lineHeight: \"3\",\n padding: \"0px 5px\"\n },\n CYCLOGRAM_BOX: (noData, title, zoomBar) => ({\n position: \"relative\",\n overflow: \"auto\",\n padding: \"0px 8px\",\n height: `calc(100% - ${zoomBar ? ZOOM_HEIGHT : \"0px\"} - ${title ? TITLE_HEIGHT : \"0px\"})`,\n display: noData ? \"none\" : \"\"\n }),\n GRID_ROW: index => index % 2 === 0 ? {\n backgroundColor: \"#ffffff\"\n } : {\n backgroundColor: \"#f5f5f5\"\n },\n GROUP_HEADER_BOX: {\n border: \"1px solid\",\n backgroundColor: \"#ebebeb\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\"\n },\n GROUP_HEADER: {\n fontSize: \"14px\",\n textAlign: \"center\",\n wordWrap: \"break-word\"\n },\n TASK_EDITOR_CONTENT: {\n minWidth: 400,\n overflowX: \"auto\"\n },\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n },\n TASK_BOX: (lineHeight, bgColor, textColor, highlightColor) => ({\n display: \"flex\",\n alignItems: \"center\",\n backgroundColor: bgColor ? bgColor : \"#b4b9bf\",\n ...(textColor ? {\n color: textColor\n } : {}),\n height: lineHeight,\n \"&:hover\": {\n ...(highlightColor ? {\n backgroundColor: `${highlightColor} !important`,\n filter: \"brightness(1) !important\"\n } : {\n filter: \"brightness(1.25) !important\"\n }),\n cursor: \"pointer !important\"\n }\n }),\n TASK: lineHeight => {\n const availableLines = Math.floor(lineHeight / 18);\n return {\n width: \"100%\",\n fontSize: \"12px\",\n overflowWrap: \"break-word\",\n wordBreak: \"break-all\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n lineHeight: \"18px\",\n maxHeight: lineHeight,\n WebkitLineClamp: availableLines < 1 ? 1 : availableLines,\n WebkitBoxOrient: \"vertical\"\n };\n }\n};\n\n//Структура колонки\nconst P8P_CYCLOGRAM_COLUMN_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired\n});\n\n//Структура группы\nconst P8P_CYCLOGRAM_GROUP_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n height: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n width: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n});\n\n//Структура задачи\nconst P8P_CYCLOGRAM_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n lineNumb: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n highlightColor: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n});\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Определение сдвига для максимальной ширины колонок\nconst getShift = (columns, currentColumnsMaxWidth, maxCyclogramWidth) => {\n //Определяем доступное пространство для расширения\n let maxWidthDiff = maxCyclogramWidth - currentColumnsMaxWidth;\n //Инициализируем значение сдвига\n let shift = 1;\n //Если доступно больше ширины и есть пространство для расширения\n if (maxCyclogramWidth > currentColumnsMaxWidth && maxCyclogramWidth - maxWidthDiff > columns.length) {\n //Определяем доступный сдвиг колонок\n shift = maxCyclogramWidth / currentColumnsMaxWidth;\n }\n //Возвращаем сдвиг\n return shift;\n};\n\n//Формирование стилей для группы\nconst getGroupStyles = (indexGrp, highlightColor) => {\n return `.main .TaskGrp${indexGrp}:hover .TaskGrp${indexGrp} {\n ${highlightColor ? `background: ${highlightColor};` : `filter: brightness(1.15);`}\n }\n .main:has(.TaskGrp${indexGrp}:hover) .TaskGrpHeader${indexGrp} {\n display: block;\n }\n `;\n //cursor: pointer;\n};\n\n//Фон строк таблицы\nconst P8PCyclogramRowsGrid = ({\n rows,\n maxWidth,\n lineHeight\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", null, rows.map((el, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"foreignObject\", {\n x: \"0\",\n y: NDEFAULT_HEADER_HEIGHT + index * lineHeight,\n width: maxWidth,\n height: lineHeight,\n key: index\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.GRID_ROW(index),\n height: lineHeight\n }))));\n};\n\n//Контроль свойств - Фон строк таблицы\nP8PCyclogramRowsGrid.propTypes = {\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n maxWidth: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n lineHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired\n};\n\n//Линии строк таблицы\nconst P8PCyclogramRowsLines = ({\n rows,\n maxWidth,\n lineHeight\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", null, rows.map((el, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"line\", {\n x1: \"0\",\n y1: NDEFAULT_HEADER_HEIGHT + lineHeight + index * lineHeight,\n x2: maxWidth,\n y2: NDEFAULT_HEADER_HEIGHT + lineHeight + index * lineHeight,\n key: index\n })));\n};\n\n//Контроль свойств - Линии строк таблицы\nP8PCyclogramRowsLines.propTypes = {\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n maxWidth: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n lineHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired\n};\n\n//Линии колонок таблицы\nconst P8PCyclogramColumnsLines = ({\n columns,\n shift,\n y1,\n y2\n}) => {\n //Инициализируем старт текущей колонки\n let prevColumnEnd = 0;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", null, columns.map((column, index) => {\n //Аккумулируем окончание последней колонки с учетом сдвига\n prevColumnEnd = index !== 0 ? prevColumnEnd + (columns[index - 1].end - columns[index - 1].start) * shift : 0;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"line\", {\n x1: prevColumnEnd,\n y1: y1,\n x2: prevColumnEnd,\n y2: y2,\n stroke: \"#e0e0e0\",\n key: index\n });\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"line\", {\n x1: prevColumnEnd + (columns[columns.length - 1].end - columns[columns.length - 1].start) * shift,\n y1: y1,\n x2: prevColumnEnd + (columns[columns.length - 1].end - columns[columns.length - 1].start) * shift,\n y2: y2,\n stroke: \"#e0e0e0\"\n }));\n};\n\n//Контроль свойств - Линии колонок таблицы\nP8PCyclogramColumnsLines.propTypes = {\n columns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n shift: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n y1: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n y2: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired\n};\n\n//Фон таблицы циклограммы\nconst P8PCyclogramGrid = ({\n tasks,\n columns,\n shift,\n maxWidth,\n maxHeight,\n lineHeight\n}) => {\n //Формируем массив строк исходя из максимального значения строки задачи\n const rows = Array.from(Array(Math.max(...tasks.map(o => o.lineNumb)) + 1).keys());\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: \"grid\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: maxWidth,\n height: maxHeight\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramRowsGrid, {\n rows: rows,\n maxWidth: maxWidth,\n lineHeight: lineHeight\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramRowsLines, {\n rows: rows,\n maxWidth: maxWidth,\n lineHeight: lineHeight\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramColumnsLines, {\n columns: columns,\n shift: shift,\n y1: NDEFAULT_HEADER_HEIGHT,\n y2: maxHeight\n }));\n};\n\n//Контроль свойств - Фон таблицы циклограммы\nP8PCyclogramGrid.propTypes = {\n tasks: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n shift: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxWidth: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n lineHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired\n};\n\n//Колонка заголовка циклограммы\nconst P8PCyclogramHeaderColumn = ({\n column,\n start,\n shift,\n columnRenderer\n}) => {\n //Рассчитываем ширину колонки\n const columnWidth = column.end - column.start;\n //Формируем собственное отображение, если требуется\n const customView = columnRenderer ? columnRenderer({\n column\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"foreignObject\", {\n x: start,\n y: \"0\",\n width: columnWidth * shift,\n height: NDEFAULT_HEADER_HEIGHT\n }, customView ? customView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n ...STYLES.HEADER_COLUMN,\n height: NDEFAULT_HEADER_HEIGHT\n },\n title: column.name\n }, column.name)));\n};\n\n//Контроль свойств - Колонка заголовка циклограммы\nP8PCyclogramHeaderColumn.propTypes = {\n column: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n shift: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n lastElement: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n columnRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Заголовок циклограммы\nconst P8PCyclogramHeader = ({\n columns,\n shift,\n maxWidth,\n maxHeight,\n columnRenderer,\n headerBlock\n}) => {\n //Инициализируем старт текущей колонки\n let prevColumnEnd = 0;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: \"header\",\n ref: headerBlock\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"rect\", {\n x: \"0\",\n y: \"0\",\n width: maxWidth,\n height: NDEFAULT_HEADER_HEIGHT,\n fill: \"#ffffff\",\n stroke: \"#e0e0e0\",\n strokeWidth: \"1.4\"\n }), columns.map((column, index) => {\n //Аккумулируем окончание последней колонки с учетом сдвига\n prevColumnEnd = index !== 0 ? prevColumnEnd + (columns[index - 1].end - columns[index - 1].start) * shift : 0;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramHeaderColumn, {\n column: column,\n shift: shift,\n start: prevColumnEnd,\n maxHeight: maxHeight,\n lastElement: columns.length - 1 === index,\n columnRenderer: columnRenderer,\n key: index\n });\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: \"columnsDividers\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramColumnsLines, {\n columns: columns,\n shift: shift,\n y1: 0,\n y2: NDEFAULT_HEADER_HEIGHT\n })));\n};\n\n//Контроль свойств - Заголовок циклограммы\nP8PCyclogramHeader.propTypes = {\n columns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n shift: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxWidth: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n columnRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n headerBlock: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object)\n};\n\n//Задача циклограммы\nconst P8PCyclogramTask = ({\n task,\n indexGrp,\n shift,\n lineHeight,\n openTaskEditor,\n taskRenderer\n}) => {\n //Рассчитываем ширину задачи\n const width = task.end !== 0 ? (task.end - task.start) * shift : 0;\n //Формируем собственное отображение, если требуется\n const customView = taskRenderer ? taskRenderer({\n task,\n taskHeight: lineHeight,\n taskWidth: width\n }) || {} : {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"foreignObject\", {\n x: task.start !== 0 ? task.start * shift : 0,\n y: NDEFAULT_HEADER_HEIGHT + task.lineNumb * lineHeight,\n width: width,\n height: lineHeight\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], _extends({\n className: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.hasValue)(indexGrp) ? `TaskGrp${indexGrp}` : null,\n sx: {\n ...STYLES.TASK_BOX(lineHeight, task.bgColor, task.textColor, task.highlightColor),\n ...customView.taskStyle\n }\n }, customView.taskProps, {\n onClick: () => openTaskEditor(task)\n }), customView.data ? customView.data : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TASK(lineHeight),\n title: task.name\n }, task.name)));\n};\n\n//Контроль свойств - Группы циклограммы\nP8PCyclogramTask.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n indexGrp: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\n shift: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n lineHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n openTaskEditor: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n taskRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Основная информация циклограммы\nconst P8PCyclogramMain = ({\n columns,\n groups,\n tasks,\n shift,\n lineHeight,\n maxWidth,\n maxHeight,\n openTaskEditor,\n groupHeaderRenderer,\n taskRenderer,\n columnRenderer,\n headerBlock\n}) => {\n //Инициализируем коллекцию тасков с группами\n const tasksWithGroup = tasks.filter(task => (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.hasValue)(task.groupName));\n //Инициализируем коллекцию тасков без групп\n const tasksWithoutGroup = tasks.filter(task => !(0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.hasValue)(task.groupName));\n //Инициализируем коллекцию отображаемых групп\n const visibleGroups = groups ? groups.filter(group => group.visible) : [];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: \"main\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: \"tasks\"\n }, visibleGroups.length !== 0 ? visibleGroups.map((grp, indexGrp) => {\n //Считываем задачи группы\n let groupTasks = tasksWithGroup.filter(task => task.groupName === grp.name);\n //Если по данной группе нет тасков - ничего не выводим\n if (groupTasks.length === 0) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: `TaskGrp${indexGrp}`,\n key: indexGrp\n }, groupTasks.map((task, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramTask, {\n task: task,\n indexGrp: indexGrp,\n shift: shift,\n lineHeight: lineHeight,\n openTaskEditor: openTaskEditor,\n taskRenderer: taskRenderer,\n key: index\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"style\", null, getGroupStyles(indexGrp, grp.highlightColor)));\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: `TasksWithoutGroups`\n }, tasksWithoutGroup.map((task, index) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramTask, {\n task: task,\n shift: shift,\n lineHeight: lineHeight,\n openTaskEditor: openTaskEditor,\n taskRenderer: taskRenderer,\n key: index\n });\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramHeader, {\n columns: columns,\n shift: shift,\n maxWidth: maxWidth,\n maxHeight: maxHeight,\n columnRenderer: columnRenderer,\n headerBlock: headerBlock\n }), visibleGroups.length !== 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"g\", {\n className: \"groups\"\n }, visibleGroups.map((grp, indexGrp) => {\n //Инициализируем параметры группы\n let defaultView = null;\n let customView = null;\n let groupHeaderX = 0;\n let groupHeaderY = 0;\n let groupTasks = tasksWithGroup.filter(task => task.groupName === grp.name);\n //Если по данной группе нет тасков - ничего не выводим\n if (groupTasks.length === 0) {\n return null;\n }\n //Если требуется отображать заголовок группы\n if (grp.visible) {\n //Формируем отображение по умолчанию\n defaultView = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: {\n ...STYLES.GROUP_HEADER_BOX,\n height: grp.height\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n ...STYLES.GROUP_HEADER,\n maxWidth: grp.width,\n maxHeight: grp.height\n }\n }, grp.name));\n //Формируем собственное отображение, если требуется\n customView = groupHeaderRenderer ? groupHeaderRenderer({\n group: grp\n }) : null;\n //Рассчитываем координаты заголовка группы\n groupHeaderX = Math.min(...groupTasks.map(o => o.start)) * shift;\n groupHeaderY = NDEFAULT_HEADER_HEIGHT + Math.min(...groupTasks.map(o => o.lineNumb)) * lineHeight - grp.height - 5;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"foreignObject\", {\n x: groupHeaderX,\n y: groupHeaderY,\n width: grp.width,\n height: grp.height,\n className: `TaskGrpHeader${indexGrp}`,\n display: \"none\",\n key: indexGrp\n }, customView ? customView : defaultView);\n })) : null);\n};\n\n//Контроль свойств - Основная информация циклограммы\nP8PCyclogramMain.propTypes = {\n columns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n groups: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n tasks: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n shift: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n lineHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxWidth: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n maxHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number).isRequired,\n openTaskEditor: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n groupHeaderRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n taskRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n columnRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n headerBlock: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object)\n};\n\n//Редактор задачи\nconst P8PCyclogramTaskEditor = ({\n task,\n taskAttributes,\n onOk,\n onCancel,\n taskAttributeRenderer,\n taskDialogRenderer,\n nameCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end\n });\n\n //Отображаемые атрибуты\n const dispTaskAttributes = Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => attr.visible && (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.hasValue)(task[attr.name])) : [];\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk() : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, taskDialogRenderer ? taskDialogRenderer({\n task,\n taskAttributes,\n close: handleCancel\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TASK_EDITOR_CONTENT\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n component: \"li\"\n }) : null, dispTaskAttributes.length > 0 ? dispTaskAttributes.map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < dispTaskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption))));\n};\n\n//Контроль свойств - Редактор задачи\nP8PCyclogramTaskEditor.propTypes = {\n task: P8P_CYCLOGRAM_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n taskDialogRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n};\n\n//Циклограмма\nconst P8PCyclogram = ({\n containerStyle,\n lineHeight,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n zoom,\n columns,\n columnRenderer,\n groups,\n groupHeaderRenderer,\n tasks,\n taskRenderer,\n taskAttributes,\n taskAttributeRenderer,\n taskDialogRenderer,\n noDataFoundText,\n nameTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Хук основного блока (для последующего определения доступной ширины)\n const mainBlock = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n //Хук для заголовка таблицы\n const headerBlock = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n loaded: false,\n lineHeight: NDEFAULT_LINE_HEIGHT,\n maxWidth: 0,\n maxHeight: 0,\n shift: 0,\n zoom: P8P_CYCLOGRAM_ZOOM.includes(zoom) ? zoom : 1,\n tasks: [],\n editTask: null\n });\n\n //Обновление масштаба циклограммы\n const handleZoomChange = direction => {\n //Считываем текущий индекс\n const currentIndex = P8P_CYCLOGRAM_ZOOM.indexOf(state.zoom);\n setState(pv => ({\n ...pv,\n zoom: currentIndex + direction !== P8P_CYCLOGRAM_ZOOM.length && currentIndex + direction !== -1 ? P8P_CYCLOGRAM_ZOOM[currentIndex + direction] : pv.zoom\n }));\n };\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = () => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При скролле блока\n const handleScroll = e => {\n //Изменяем позицию заголовка таблицы относительно скролла\n headerBlock.current.setAttribute(\"transform\", \"translate(0,\" + e.currentTarget.scrollTop + \")\");\n };\n\n //При изменении данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если есть колонки и задачи\n if (Array.isArray(columns) && columns.length > 0 && Array.isArray(tasks) && tasks.length > 0) {\n //Определяем текущую максимальную ширину колонок\n let currentColumnsMaxWidth = Math.max(...columns.map(o => o.end));\n //Определяем доступный сдвиг для ширины колонок (16 - паддинг по бокам)\n let columnShift = getShift(columns, currentColumnsMaxWidth, mainBlock.current.offsetWidth - 16) * state.zoom;\n //Устанавливаем значения исходя из колонок/задач\n setState(pv => ({\n ...pv,\n loaded: true,\n lineHeight: lineHeight ? lineHeight : NDEFAULT_LINE_HEIGHT,\n maxWidth: columnShift !== 0 ? currentColumnsMaxWidth * columnShift : currentColumnsMaxWidth,\n maxHeight: NDEFAULT_HEADER_HEIGHT + (Math.max(...tasks.map(o => o.lineNumb)) + 1) * (lineHeight ? lineHeight : NDEFAULT_LINE_HEIGHT),\n shift: columnShift,\n tasks: tasks,\n noData: false\n }));\n } else {\n //Устанавливаем значения исходя из колонок/задач\n setState(pv => ({\n ...pv,\n noData: true\n }));\n }\n }, [columns, lineHeight, state.zoom, tasks]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: mainBlock,\n style: {\n ...(containerStyle ? containerStyle : {})\n }\n }, state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 1,\n sx: {\n ...STYLES.CYCLOGRAM_TITLE,\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n p: 1,\n sx: STYLES.CYCLOGRAM_ZOOM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_CYCLOGRAM_ZOOM[P8P_CYCLOGRAM_ZOOM.length - 1]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == P8P_CYCLOGRAM_ZOOM[0]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, \"zoom_out\"))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n className: \"scroll\",\n sx: STYLES.CYCLOGRAM_BOX(state.noData, title, zoomBar),\n onScroll: handleScroll\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"cyclogram\",\n width: state.maxWidth,\n height: state.maxHeight\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramGrid, {\n tasks: state.tasks,\n columns: columns,\n shift: state.shift,\n maxWidth: state.maxWidth,\n maxHeight: state.maxHeight,\n lineHeight: state.lineHeight\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramMain, {\n columns: columns,\n groups: groups,\n tasks: state.tasks,\n shift: state.shift,\n lineHeight: state.lineHeight,\n maxWidth: state.maxWidth,\n maxHeight: state.maxHeight,\n groupHeaderRenderer: groupHeaderRenderer,\n openTaskEditor: openTaskEditor,\n taskRenderer: taskRenderer,\n columnRenderer: columnRenderer,\n headerBlock: headerBlock\n })))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PCyclogramTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n taskDialogRenderer: taskDialogRenderer,\n nameCaption: nameTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null));\n};\n\n//Контроль свойств - Циклограмма\nP8PCyclogram.propTypes = {\n containerStyle: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object),\n lineHeight: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\n columns: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_CYCLOGRAM_COLUMN_SHAPE).isRequired,\n columnRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_CYCLOGRAM_GROUP_SHAPE),\n groupHeaderRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_CYCLOGRAM_TASK_SHAPE).isRequired,\n taskRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_CYCLOGRAM_TASK_ATTRIBUTE_SHAPE),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n taskDialogRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_cyclogram.js?"); /***/ }), @@ -4547,7 +4558,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PDataGrid: () => (/* binding */ P8PDataGrid),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* binding */ P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTERS_HEIGHT: () => (/* binding */ P8P_DATA_GRID_FILTERS_HEIGHT),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* binding */ P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_MORE_HEIGHT: () => (/* binding */ P8P_DATA_GRID_MORE_HEIGHT),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* binding */ P8P_DATA_GRID_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _p8p_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_table */ \"./app/components/p8p_table.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица данных\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Таблица\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_DATA_GRID_SIZE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_SIZE;\n\n//Типы данных\nconst P8P_DATA_GRID_DATA_TYPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_DATA_TYPE;\n\n//Формат фильтра\nconst P8P_DATA_GRID_FILTER_SHAPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTER_SHAPE;\n\n//Высота кнопки догрузки данных\nconst P8P_DATA_GRID_MORE_HEIGHT = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_MORE_HEIGHT;\n\n//Высота фильтров таблицы\nconst P8P_DATA_GRID_FILTERS_HEIGHT = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTERS_HEIGHT;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица данных\nconst P8PDataGrid = ({\n columnsDef,\n filtersInitial,\n groups,\n rows,\n size,\n fixedHeader = false,\n fixedColumns = 0,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n morePagesBtnProps,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n containerComponent,\n containerComponentProps,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - сортировки\n const [orders, setOrders] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Собственное состояние - фильтры\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filtersInitial || []);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n columnName,\n direction\n }) => {\n let newOrders = objectsCopier(orders);\n const curOrder = newOrders.find(o => o.name == columnName);\n if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);\n if (direction != null && !curOrder) newOrders.push({\n name: columnName,\n direction\n });\n if (direction != null && curOrder) curOrder.direction = direction;\n setOrders(newOrders);\n if (onOrderChanged) onOrderChanged({\n orders: newOrders\n });\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n columnName,\n from,\n to\n }) => {\n let newFilters = objectsCopier(filters);\n let curFilter = newFilters.find(f => f.name == columnName);\n if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);\n if ((from != null || to != null) && !curFilter) newFilters.push({\n name: columnName,\n from,\n to\n });\n if ((from != null || to != null) && curFilter) {\n curFilter.from = from;\n curFilter.to = to;\n }\n setFilters(newFilters);\n if (onFilterChanged) onFilterChanged({\n filters: newFilters\n });\n };\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //При изменении списка установленных извне фильтров\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setFilters(filtersInitial || []);\n }, [filtersInitial]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8PTable, {\n columnsDef: columnsDef,\n groups: groups,\n rows: rows,\n orders: orders,\n filters: filters,\n size: size || P8P_DATA_GRID_SIZE.MEDIUM,\n fixedHeader: fixedHeader,\n fixedColumns: fixedColumns,\n morePages: morePages,\n reloading: reloading,\n expandable: expandable,\n orderAscMenuItemCaption: orderAscMenuItemCaption,\n orderDescMenuItemCaption: orderDescMenuItemCaption,\n filterMenuItemCaption: filterMenuItemCaption,\n valueFilterCaption: valueFilterCaption,\n valueFromFilterCaption: valueFromFilterCaption,\n valueToFilterCaption: valueToFilterCaption,\n okFilterBtnCaption: okFilterBtnCaption,\n clearFilterBtnCaption: clearFilterBtnCaption,\n cancelFilterBtnCaption: cancelFilterBtnCaption,\n morePagesBtnCaption: morePagesBtnCaption,\n noDataFoundText: noDataFoundText,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n rowExpandRender: rowExpandRender,\n valueFormatter: valueFormatter,\n objectsCopier: objectsCopier,\n containerComponent: containerComponent,\n containerComponentProps: containerComponentProps,\n morePagesBtnProps: morePagesBtnProps,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n });\n};\n\n//Контроль свойств - Таблица данных\nP8PDataGrid.propTypes = {\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n filtersInitial: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_DATA_GRID_FILTER_SHAPE),\n groups: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n fixedHeader: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n fixedColumns: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PDataGrid: () => (/* binding */ P8PDataGrid),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* binding */ P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTERS_HEIGHT: () => (/* binding */ P8P_DATA_GRID_FILTERS_HEIGHT),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* binding */ P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_MORE_HEIGHT: () => (/* binding */ P8P_DATA_GRID_MORE_HEIGHT),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* binding */ P8P_DATA_GRID_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _p8p_table__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_table */ \"./app/components/p8p_table.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица данных\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Таблица\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_DATA_GRID_SIZE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_SIZE;\n\n//Типы данных\nconst P8P_DATA_GRID_DATA_TYPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_DATA_TYPE;\n\n//Формат фильтра\nconst P8P_DATA_GRID_FILTER_SHAPE = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTER_SHAPE;\n\n//Высота кнопки догрузки данных\nconst P8P_DATA_GRID_MORE_HEIGHT = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_MORE_HEIGHT;\n\n//Высота фильтров таблицы\nconst P8P_DATA_GRID_FILTERS_HEIGHT = _p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8P_TABLE_FILTERS_HEIGHT;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица данных\nconst P8PDataGrid = ({\n columnsDef = [],\n filtersInitial,\n groups = [],\n rows = [],\n size,\n fixedHeader = false,\n fixedColumns = 0,\n morePages = false,\n reloading = false,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n morePagesBtnProps,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n containerComponent,\n containerComponentProps,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier\n}) => {\n //Собственное состояние - сортировки\n const [orders, setOrders] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Собственное состояние - фильтры\n const [filters, setFilters] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(filtersInitial || []);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n columnName,\n direction\n }) => {\n let newOrders = objectsCopier(orders);\n const curOrder = newOrders.find(o => o.name == columnName);\n if (direction == null && curOrder) newOrders.splice(newOrders.indexOf(curOrder), 1);\n if (direction != null && !curOrder) newOrders.push({\n name: columnName,\n direction\n });\n if (direction != null && curOrder) curOrder.direction = direction;\n setOrders(newOrders);\n if (onOrderChanged) onOrderChanged({\n orders: newOrders\n });\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n columnName,\n from,\n to\n }) => {\n let newFilters = objectsCopier(filters);\n let curFilter = newFilters.find(f => f.name == columnName);\n if (from == null && to == null && curFilter) newFilters.splice(newFilters.indexOf(curFilter), 1);\n if ((from != null || to != null) && !curFilter) newFilters.push({\n name: columnName,\n from,\n to\n });\n if ((from != null || to != null) && curFilter) {\n curFilter.from = from;\n curFilter.to = to;\n }\n setFilters(newFilters);\n if (onFilterChanged) onFilterChanged({\n filters: newFilters\n });\n };\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //При изменении списка установленных извне фильтров\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setFilters(filtersInitial || []);\n }, [filtersInitial]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_table__WEBPACK_IMPORTED_MODULE_1__.P8PTable, {\n columnsDef: columnsDef,\n groups: groups,\n rows: rows,\n orders: orders,\n filters: filters,\n size: size || P8P_DATA_GRID_SIZE.MEDIUM,\n fixedHeader: fixedHeader,\n fixedColumns: fixedColumns,\n morePages: morePages,\n reloading: reloading,\n expandable: expandable,\n orderAscMenuItemCaption: orderAscMenuItemCaption,\n orderDescMenuItemCaption: orderDescMenuItemCaption,\n filterMenuItemCaption: filterMenuItemCaption,\n valueFilterCaption: valueFilterCaption,\n valueFromFilterCaption: valueFromFilterCaption,\n valueToFilterCaption: valueToFilterCaption,\n okFilterBtnCaption: okFilterBtnCaption,\n clearFilterBtnCaption: clearFilterBtnCaption,\n cancelFilterBtnCaption: cancelFilterBtnCaption,\n morePagesBtnCaption: morePagesBtnCaption,\n noDataFoundText: noDataFoundText,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n rowExpandRender: rowExpandRender,\n valueFormatter: valueFormatter,\n objectsCopier: objectsCopier,\n containerComponent: containerComponent,\n containerComponentProps: containerComponentProps,\n morePagesBtnProps: morePagesBtnProps,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n });\n};\n\n//Контроль свойств - Таблица данных\nP8PDataGrid.propTypes = {\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n filtersInitial: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_DATA_GRID_FILTER_SHAPE),\n groups: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n size: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n fixedHeader: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n fixedColumns: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n morePagesBtnProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_2___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_data_grid.js?"); /***/ }), @@ -4558,7 +4569,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PFullScreenDialog: () => (/* binding */ P8PFullScreenDialog)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Полноэкранный диалог\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DIALOG_TITLE: {\n padding: 0\n },\n APP_BAR: {\n position: \"relative\"\n },\n TITLE_TYPOGRAPHY: {\n ml: 2,\n flex: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Полноэкранный диалог\nconst P8PFullScreenDialog = ({\n title,\n onClose,\n children\n}) => {\n const handleClose = () => {\n onClose ? onClose() : null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n fullScreen: true,\n open: true,\n onClose: handleClose,\n scroll: \"paper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.DIALOG_TITLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n edge: \"start\",\n color: \"inherit\",\n onClick: handleClose,\n \"aria-label\": \"close\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE_TYPOGRAPHY,\n variant: \"h6\",\n component: \"div\"\n }, title)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, children));\n};\n\n//Контроль свойств - Полноэкранный диалог\nP8PFullScreenDialog.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_fullscreen_dialog.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PFullScreenDialog: () => (/* binding */ P8PFullScreenDialog)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/AppBar/AppBar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Toolbar/Toolbar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Полноэкранный диалог\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DIALOG_TITLE: {\n padding: 0\n },\n APP_BAR: {\n position: \"relative\"\n },\n TITLE_TYPOGRAPHY: {\n ml: 2,\n flex: 1\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Полноэкранный диалог\nconst P8PFullScreenDialog = ({\n title,\n onClose,\n contentProps,\n children\n}) => {\n const handleClose = () => {\n onClose ? onClose() : null;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n fullScreen: true,\n open: true,\n onClose: handleClose,\n scroll: \"paper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.DIALOG_TITLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.APP_BAR\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n edge: \"start\",\n color: \"inherit\",\n onClick: handleClose,\n \"aria-label\": \"close\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, \"close\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TITLE_TYPOGRAPHY,\n variant: \"h6\",\n component: \"div\"\n }, title)))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], contentProps ? contentProps : {}, children));\n};\n\n//Контроль свойств - Полноэкранный диалог\nP8PFullScreenDialog.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n onClose: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n children: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().element),\n contentProps: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_fullscreen_dialog.js?"); /***/ }), @@ -4569,7 +4580,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PGantt: () => (/* binding */ P8PGantt),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* binding */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* binding */ P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* binding */ P8P_GANTT_TASK_SHAPE),\n/* harmony export */ taskLegendDesc: () => (/* binding */ taskLegendDesc)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Slider/Slider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Диаграмма Ганта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_GANTT_ZOOM = [0, 1, 2, 3, 4];\n\n//Уровни масштаба (строковые наименования в терминах библиотеки)\nconst P8P_GANTT_ZOOM_VIEW_MODES = {\n 0: \"Quarter Day\",\n 1: \"Half Day\",\n 2: \"Day\",\n 3: \"Week\",\n 4: \"Month\"\n};\n\n//Структура задачи\nconst P8P_GANTT_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number).isRequired,\n numb: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n dependencies: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_GANTT_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired\n});\n\n//Структура описания цвета задачи\nconst P8P_GANTT_TASK_COLOR_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Высота заголовка\nconst TITLE_HEIGHT = \"44px\";\n\n//Высота панели масштабирования\nconst ZOOM_HEIGHT = \"56px\";\n\n//Стили\nconst STYLES = {\n TASK_EDITOR_CONTENT: {\n minWidth: 400,\n overflowX: \"auto\"\n },\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n },\n GANTT_TITLE: {\n height: TITLE_HEIGHT\n },\n GANTT_ZOOM: {\n height: ZOOM_HEIGHT\n },\n GANTT: (noData, title, zoomBar) => ({\n height: `calc(100% - ${zoomBar ? ZOOM_HEIGHT : \"0px\"} - ${title ? TITLE_HEIGHT : \"0px\"})`,\n display: noData ? \"none\" : \"\"\n })\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Формирование описания для легенды\nconst taskLegendDesc = ({\n task,\n taskColors\n}) => {\n if (Array.isArray(taskColors) && taskColors.length > 0) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) return {\n text: colorDesc.desc,\n style: {\n ...(colorDesc.bgProgressColor ? {\n background: `linear-gradient(to right, ${colorDesc.bgProgressColor} ,${colorDesc.bgColor ? colorDesc.bgColor : \"transparent\"})`\n } : colorDesc.bgColor ? {\n backgroundColor: colorDesc.bgColor\n } : {}),\n ...(colorDesc.textColor ? {\n color: colorDesc.textColor\n } : {})\n }\n };else return null;\n } else return null;\n};\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n taskDialogRenderer,\n numbCaption,\n nameCaption,\n startCaption,\n endCaption,\n progressCaption,\n legendCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end,\n progress: task.progress\n });\n\n //Отображаемые атрибуты\n const dispTaskAttributes = Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => attr.visible && hasValue(task[attr.name])) : [];\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk({\n task,\n start: state.start,\n end: state.end,\n progress: state.progress\n }) : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //При изменении сроков\n const handlePeriodChanged = e => setState(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //При изменении прогресса\n const handleProgressChanged = (e, newValue) => setState(prev => ({\n ...prev,\n progress: newValue\n }));\n\n //Описание легенды для задачи\n const legendDesc = taskLegendDesc({\n task,\n taskColors\n });\n let legend = legendDesc ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: legendDesc.style\n },\n primary: legendCaption,\n secondary: legendDesc.text\n }) : null;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, taskDialogRenderer ? taskDialogRenderer({\n task,\n taskAttributes,\n taskColors,\n close: handleCancel\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TASK_EDITOR_CONTENT\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: numbCaption,\n secondary: task.numb\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: startCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.start,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.start,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: endCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.end,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.end,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), hasValue(task.progress) || legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null, hasValue(task.progress) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: `${progressCaption}${task.readOnly === true || task.readOnlyProgress === true ? ` (${task.progress}%)` : \"\"}`,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n disabled: task.readOnly === true || task.readOnlyProgress === true,\n defaultValue: task.progress,\n valueLabelDisplay: \"auto\",\n onChange: handleProgressChanged\n })\n })), legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : null, legend ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, legend), dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : null, dispTaskAttributes.length > 0 ? dispTaskAttributes.map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < dispTaskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n disabled: !state.start || !state.end || task.readOnly,\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption))));\n};\n\n//Контроль свойств - Редактор задачи\nP8PGanttTaskEditor.propTypes = {\n task: P8P_GANTT_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskDialogRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n numbCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Диаграмма Ганта\nconst P8PGantt = ({\n containerStyle,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n zoom,\n tasks,\n taskAttributes,\n taskColors,\n onTaskDatesChange,\n onTaskProgressChange,\n taskAttributeRenderer,\n taskDialogRenderer,\n noDataFoundText,\n numbTaskEditorCaption,\n nameTaskEditorCaption,\n startTaskEditorCaption,\n endTaskEditorCaption,\n progressTaskEditorCaption,\n legendTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n gantt: null,\n zoom: P8P_GANTT_ZOOM.includes(zoom) ? zoom : 3,\n editTask: null\n });\n\n //Ссылки на DOM\n const svgContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Отображение диаграммы\n const showGantt = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (!state.gantt) {\n // eslint-disable-next-line no-undef\n const gantt = new Gantt(\"#__gantt__\", tasks, {\n view_mode: P8P_GANTT_ZOOM_VIEW_MODES[state.zoom],\n date_format: \"YYYY-MM-DD\",\n language: \"ru\",\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n on_date_change: (task, start, end, isMain) => onTaskDatesChange ? onTaskDatesChange({\n task,\n start,\n end,\n isMain\n }) : null,\n on_progress_change: (task, progress) => onTaskProgressChange ? onTaskProgressChange({\n task,\n progress\n }) : null,\n on_click: openTaskEditor\n });\n setState(pv => ({\n ...pv,\n gantt,\n noData: false\n }));\n } else {\n state.gantt.refresh(tasks);\n setState(pv => ({\n ...pv,\n noData: false\n }));\n }\n }, [state.gantt, state.zoom, readOnly, readOnlyDates, readOnlyProgress, tasks, onTaskDatesChange, onTaskProgressChange]);\n\n //Обновление масштаба диаграммы\n const handleZoomChange = direction => setState(pv => ({\n ...pv,\n zoom: pv.zoom + direction < 0 ? 0 : pv.zoom + direction >= P8P_GANTT_ZOOM.length ? P8P_GANTT_ZOOM.length - 1 : pv.zoom + direction\n }));\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = ({\n task,\n start,\n end,\n progress\n }) => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n if (onTaskDatesChange && (task.start != start || task.end != end)) onTaskDatesChange({\n task,\n start,\n end,\n isMain: true\n });\n if (onTaskProgressChange && task.progress != progress) onTaskProgressChange({\n task,\n progress\n });\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При изменении масштаба\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.gantt) state.gantt.change_view_mode(P8P_GANTT_ZOOM_VIEW_MODES[state.zoom]);\n }, [state.gantt, state.zoom]);\n\n //При изменении списка задач\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (Array.isArray(tasks) && tasks.length > 0) showGantt();else setState(pv => ({\n ...pv,\n noData: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tasks]);\n\n //При подключении компонента к старице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n svgContainerRef.current.children[0].classList.add(\"scroll\");\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...(containerStyle ? containerStyle : {})\n }\n }, state.gantt && state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.gantt && !state.noData && title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 1,\n sx: {\n ...STYLES.GANTT_TITLE,\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, state.gantt && !state.noData && zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 1,\n sx: STYLES.GANTT_ZOOM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_GANTT_ZOOM.length - 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_out\"))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PGanttTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n taskColors: taskColors,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n taskDialogRenderer: taskDialogRenderer,\n numbCaption: numbTaskEditorCaption,\n nameCaption: nameTaskEditorCaption,\n startCaption: startTaskEditorCaption,\n endCaption: endTaskEditorCaption,\n progressCaption: progressTaskEditorCaption,\n legendCaption: legendTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.GANTT(state.noData, title, zoomBar),\n ref: svgContainerRef\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n containerStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_SHAPE).isRequired,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onTaskDatesChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onTaskProgressChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskDialogRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n numbTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_gantt.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PGantt: () => (/* binding */ P8PGantt),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* binding */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* binding */ P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* binding */ P8P_GANTT_TASK_SHAPE),\n/* harmony export */ taskLegendDesc: () => (/* binding */ taskLegendDesc)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Slider/Slider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Диаграмма Ганта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Встраиваемое сообщение об ошибке\n\n//---------\n//Константы\n//---------\n\n//Уровни масштаба\nconst P8P_GANTT_ZOOM = [0, 1, 2, 3, 4, 5];\n\n//Уровни масштаба (строковые наименования в терминах библиотеки)\nconst P8P_GANTT_ZOOM_VIEW_MODES = {\n 0: \"Quarter Day\",\n 1: \"Half Day\",\n 2: \"Day\",\n 3: \"Week\",\n 4: \"Month\",\n 5: \"Year\"\n};\n\n//Структура задачи\nconst P8P_GANTT_TASK_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n id: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n rn: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number).isRequired,\n numb: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n fullName: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n start: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n end: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n dependencies: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().array),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)\n});\n\n//Структура динамического атрибута задачи\nconst P8P_GANTT_TASK_ATTRIBUTE_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool).isRequired\n});\n\n//Структура описания цвета задачи\nconst P8P_GANTT_TASK_COLOR_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({\n bgColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n textColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n bgProgressColor: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n});\n\n//Высота заголовка\nconst TITLE_HEIGHT = \"44px\";\n\n//Высота панели масштабирования\nconst ZOOM_HEIGHT = \"56px\";\n\n//Стили\nconst STYLES = {\n TASK_EDITOR_CONTENT: {\n minWidth: 400,\n overflowX: \"auto\"\n },\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n },\n GANTT_TITLE: {\n height: TITLE_HEIGHT\n },\n GANTT_ZOOM: {\n height: ZOOM_HEIGHT\n },\n GANTT: (noData, title, zoomBar) => ({\n height: `calc(100% - ${zoomBar ? ZOOM_HEIGHT : \"0px\"} - ${title ? TITLE_HEIGHT : \"0px\"})`,\n display: noData ? \"none\" : \"\"\n })\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Формирование описания для легенды\nconst taskLegendDesc = ({\n task,\n taskColors\n}) => {\n if (Array.isArray(taskColors) && taskColors.length > 0) {\n const colorDesc = taskColors.find(color => task.bgColor === color.bgColor && task.textColor === color.textColor && task.bgProgressColor === color.bgProgressColor);\n if (colorDesc) return {\n text: colorDesc.desc,\n style: {\n ...(colorDesc.bgProgressColor ? {\n background: `linear-gradient(to right, ${colorDesc.bgProgressColor} ,${colorDesc.bgColor ? colorDesc.bgColor : \"transparent\"})`\n } : colorDesc.bgColor ? {\n backgroundColor: colorDesc.bgColor\n } : {}),\n ...(colorDesc.textColor ? {\n color: colorDesc.textColor\n } : {})\n }\n };else return null;\n } else return null;\n};\n\n//Редактор задачи\nconst P8PGanttTaskEditor = ({\n task,\n taskAttributes,\n taskColors,\n onOk,\n onCancel,\n taskAttributeRenderer,\n taskDialogRenderer,\n numbCaption,\n nameCaption,\n startCaption,\n endCaption,\n progressCaption,\n legendCaption,\n okBtnCaption,\n cancelBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.start,\n end: task.end,\n progress: task.progress\n });\n\n //Отображаемые атрибуты\n const dispTaskAttributes = Array.isArray(taskAttributes) && taskAttributes.length > 0 ? taskAttributes.filter(attr => attr.visible && hasValue(task[attr.name])) : [];\n\n //При сохранении\n const handleOk = () => onOk && state.start && state.end ? onOk({\n task,\n start: state.start,\n end: state.end,\n progress: state.progress\n }) : null;\n\n //При отмене\n const handleCancel = () => onCancel ? onCancel() : null;\n\n //При изменении сроков\n const handlePeriodChanged = e => setState(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //При изменении прогресса\n const handleProgressChanged = (e, newValue) => setState(prev => ({\n ...prev,\n progress: newValue\n }));\n\n //Описание легенды для задачи\n const legendDesc = taskLegendDesc({\n task,\n taskColors\n });\n let legend = legendDesc ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n p: 1,\n sx: legendDesc.style\n },\n primary: legendCaption,\n secondary: legendDesc.text\n }) : null;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n open: true,\n onClose: handleCancel\n }, taskDialogRenderer ? taskDialogRenderer({\n task,\n taskAttributes,\n taskColors,\n close: handleCancel\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TASK_EDITOR_CONTENT\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: numbCaption,\n secondary: task.numb\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: nameCaption,\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: startCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.start,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.start,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: endCaption,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n error: !state.end,\n disabled: task.readOnly === true || task.readOnlyDates === true,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: state.end,\n onChange: handlePeriodChanged,\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), hasValue(task.progress) || legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null, hasValue(task.progress) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: `${progressCaption}${task.readOnly === true || task.readOnlyProgress === true ? ` (${task.progress}%)` : \"\"}`,\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n disabled: task.readOnly === true || task.readOnlyProgress === true,\n defaultValue: task.progress,\n valueLabelDisplay: \"auto\",\n onChange: handleProgressChanged\n })\n })), legend || dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : null, legend ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, legend), dispTaskAttributes.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null) : null, dispTaskAttributes.length > 0 ? dispTaskAttributes.map((attr, i) => {\n const defaultView = task[attr.name];\n const customView = taskAttributeRenderer ? taskAttributeRenderer({\n task,\n attribute: attr\n }) : null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n primary: attr.caption,\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: customView ? customView : defaultView\n })), i < dispTaskAttributes.length - 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n component: \"li\"\n }) : null);\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n disabled: !state.start || !state.end || task.readOnly,\n onClick: handleOk\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: handleCancel\n }, cancelBtnCaption))));\n};\n\n//Контроль свойств - Редактор задачи\nP8PGanttTaskEditor.propTypes = {\n task: P8P_GANTT_TASK_SHAPE,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskDialogRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n numbCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Диаграмма Ганта\nconst P8PGantt = ({\n containerStyle,\n title,\n titleStyle,\n onTitleClick,\n zoomBar,\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n zoom,\n tasks,\n taskAttributes,\n taskColors,\n onTaskDatesChange,\n onTaskProgressChange,\n taskAttributeRenderer,\n taskDialogRenderer,\n noDataFoundText,\n numbTaskEditorCaption,\n nameTaskEditorCaption,\n startTaskEditorCaption,\n endTaskEditorCaption,\n progressTaskEditorCaption,\n legendTaskEditorCaption,\n okTaskEditorBtnCaption,\n cancelTaskEditorBtnCaption\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n noData: true,\n gantt: null,\n zoom: P8P_GANTT_ZOOM.includes(zoom) ? zoom : 3,\n editTask: null\n });\n\n //Ссылки на DOM\n const svgContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n\n //Отображение диаграммы\n const showGantt = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n if (!state.gantt) {\n // eslint-disable-next-line no-undef\n const gantt = new Gantt(\"#__gantt__\", tasks, {\n view_mode: P8P_GANTT_ZOOM_VIEW_MODES[state.zoom],\n date_format: \"YYYY-MM-DD\",\n language: \"ru\",\n readOnly,\n readOnlyDates,\n readOnlyProgress,\n on_date_change: (task, start, end, isMain) => onTaskDatesChange ? onTaskDatesChange({\n task,\n start,\n end,\n isMain\n }) : null,\n on_progress_change: (task, progress) => onTaskProgressChange ? onTaskProgressChange({\n task,\n progress\n }) : null,\n on_click: openTaskEditor\n });\n setState(pv => ({\n ...pv,\n gantt,\n noData: false\n }));\n } else {\n state.gantt.refresh(tasks);\n setState(pv => ({\n ...pv,\n noData: false\n }));\n }\n }, [state.gantt, state.zoom, readOnly, readOnlyDates, readOnlyProgress, tasks, onTaskDatesChange, onTaskProgressChange]);\n\n //Обновление масштаба диаграммы\n const handleZoomChange = direction => setState(pv => ({\n ...pv,\n zoom: pv.zoom + direction < 0 ? 0 : pv.zoom + direction >= P8P_GANTT_ZOOM.length ? P8P_GANTT_ZOOM.length - 1 : pv.zoom + direction\n }));\n\n //Открытие редактора задачи\n const openTaskEditor = task => setState(pv => ({\n ...pv,\n editTask: {\n ...task\n }\n }));\n\n //При сохранении задачи в редакторе\n const handleTaskEditorSave = ({\n task,\n start,\n end,\n progress\n }) => {\n setState(pv => ({\n ...pv,\n editTask: null\n }));\n if (onTaskDatesChange && (task.start != start || task.end != end)) onTaskDatesChange({\n task,\n start,\n end,\n isMain: true\n });\n if (onTaskProgressChange && task.progress != progress) onTaskProgressChange({\n task,\n progress\n });\n };\n\n //При закрытии редактора задачи без сохранения\n const handleTaskEditorCancel = () => setState(pv => ({\n ...pv,\n editTask: null\n }));\n\n //При изменении масштаба\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.gantt) state.gantt.change_view_mode(P8P_GANTT_ZOOM_VIEW_MODES[state.zoom]);\n }, [state.gantt, state.zoom]);\n\n //При изменении списка задач\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (Array.isArray(tasks) && tasks.length > 0) showGantt();else setState(pv => ({\n ...pv,\n noData: true\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tasks]);\n\n //При подключении компонента к старице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n svgContainerRef.current.children[0].classList.add(\"scroll\");\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n ...(containerStyle ? containerStyle : {})\n }\n }, state.gantt && state.noData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }) : null, state.gantt && !state.noData && title ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n p: 1,\n sx: {\n ...STYLES.GANTT_TITLE,\n ...(titleStyle ? titleStyle : {})\n },\n align: \"center\",\n color: \"textSecondary\",\n variant: \"subtitle1\"\n }, onTitleClick ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n underline: \"hover\",\n onClick: () => onTitleClick()\n }, title) : title) : null, state.gantt && !state.noData && zoomBar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n p: 1,\n sx: STYLES.GANTT_ZOOM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(-1),\n disabled: state.zoom == 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_in\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => handleZoomChange(1),\n disabled: state.zoom == P8P_GANTT_ZOOM.length - 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, \"zoom_out\"))) : null, state.editTask ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PGanttTaskEditor, {\n task: state.editTask,\n taskAttributes: taskAttributes,\n taskColors: taskColors,\n onOk: handleTaskEditorSave,\n onCancel: handleTaskEditorCancel,\n taskAttributeRenderer: taskAttributeRenderer,\n taskDialogRenderer: taskDialogRenderer,\n numbCaption: numbTaskEditorCaption,\n nameCaption: nameTaskEditorCaption,\n startCaption: startTaskEditorCaption,\n endCaption: endTaskEditorCaption,\n progressCaption: progressTaskEditorCaption,\n legendCaption: legendTaskEditorCaption,\n okBtnCaption: okTaskEditorBtnCaption,\n cancelBtnCaption: cancelTaskEditorBtnCaption\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.GANTT(state.noData, title, zoomBar),\n ref: svgContainerRef\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n id: \"__gantt__\",\n width: \"100%\"\n })));\n};\n\n//Контроль свойств - Диаграмма Ганта\nP8PGantt.propTypes = {\n containerStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n title: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string),\n titleStyle: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().object),\n onTitleClick: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n zoomBar: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnly: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyDates: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n readOnlyProgress: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().bool),\n zoom: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().number),\n tasks: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_SHAPE).isRequired,\n taskAttributes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n taskColors: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(P8P_GANTT_TASK_COLOR_SHAPE),\n onTaskDatesChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n onTaskProgressChange: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskAttributeRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n taskDialogRenderer: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().func),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n numbTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n nameTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n startTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n endTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n progressTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n legendTaskEditorCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n okTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired,\n cancelTaskEditorBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_gantt.js?"); /***/ }), @@ -4580,7 +4591,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Меню панелей\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"flex-start\"\n },\n GRID_PANEL_CARD_CONTENT_TITLE_ICON: {\n paddingTop: \"4px\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n },\n maxWidth: \"150px\"\n },\n DESKTOP_ITEM_STACK: {\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: \"12px\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"48px\",\n height: \"48px\",\n fontSize: \"48px\"\n },\n DESKTOP_ITEM_CATION: {\n display: \"-webkit-box\",\n overflow: \"hidden\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n fontSize: \"12px\",\n maxWidth: \"140px\",\n lineHeight: \"1.2\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE_ICON\n }, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON,\n title: panel.caption\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_CATION,\n variant: \"body1\"\n }, panel.caption))));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PPanelsMenuDesktop: () => (/* binding */ P8PPanelsMenuDesktop),\n/* harmony export */ P8PPanelsMenuDrawer: () => (/* binding */ P8PPanelsMenuDrawer),\n/* harmony export */ P8PPanelsMenuGrid: () => (/* binding */ P8PPanelsMenuGrid),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* binding */ P8P_PANELS_MENU_PANEL_SHAPE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardMedia/CardMedia.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Меню панелей\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n\n//---------\n//Константы\n//---------\n\n//Типы меню\nconst P8P_PANELS_MENU_VARIANT = {\n DRAWER: \"DRAWER\",\n GRID: \"GRID\",\n DESKTOP: \"DESKTOP\"\n};\n\n//Структура элемента описания панели\nconst P8P_PANELS_MENU_PANEL_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_1___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n desc: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n icon: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n path: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n preview: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n showInPanelsList: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().bool).isRequired,\n url: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n});\n\n//Стили\nconst STYLES = {\n GRID_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n minHeight: \"100vh\"\n },\n GRID: {\n maxWidth: 1200,\n direction: \"row\",\n justifyContent: \"left\",\n alignItems: \"stretch\"\n },\n GRID_PANEL_CARD: {\n maxWidth: 400,\n height: \"100%\",\n flexDirection: \"column\",\n display: \"flex\"\n },\n GRID_PANEL_CARD_MEDIA: {\n height: 140\n },\n GRID_PANEL_CARD_CONTENT_TITLE: {\n alignItems: \"flex-start\"\n },\n GRID_PANEL_CARD_CONTENT_TITLE_ICON: {\n paddingTop: \"4px\"\n },\n GRID_PANEL_CARD_ACTIONS: {\n marginTop: \"auto\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n alignItems: \"flex-start\"\n },\n DESKTOP_GROUP_HEADER: {\n fontWeight: \"bold\",\n fontFamily: \"tahoma, arial, verdana, sans-serif!important\",\n fontSize: \"13px!important\"\n },\n DESKTOP_ITEM_BUTTON: {\n fontSize: \"12px\",\n textTransform: \"none\",\n \"&:hover\": {\n backgroundColor: \"#c3e1ff\"\n },\n width: \"150px\",\n height: \"90px\",\n flexDirection: \"column\",\n justifyContent: \"flex-start\"\n },\n DESKTOP_ITEM_ICON: {\n width: \"48px\",\n height: \"48px\",\n fontSize: \"48px\"\n },\n DESKTOP_ITEM_CATION: {\n display: \"-webkit-box\",\n overflow: \"hidden\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 2,\n fontSize: \"12px\",\n maxWidth: \"140px\",\n lineHeight: \"1.2\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Формирование групп\nconst getGroups = (panels, group) => {\n let res = [];\n let addDefaultGroup = false;\n for (const panel of panels) if (panel.showInPanelsList == true) {\n if (panel.group && !res.includes(panel.group)) res.push(panel.group);\n if (!panel.group) addDefaultGroup = true;\n }\n if (addDefaultGroup || res.length == 0) res.push(null);\n if (group) res = res.filter(g => g == group);\n return res;\n};\n\n//Формирование ссылок на панели\nconst getPanelsLinks = ({\n variant,\n panels,\n selectedPanel,\n group,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n}) => {\n //Получим группы\n let grps = getGroups(panels, group);\n\n //Построим ссылки\n const panelsLinks = [];\n for (const grp of grps) {\n if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 12,\n md: 12,\n lg: 12,\n xl: 12,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\",\n color: \"secondary\"\n }, grp ? grp : defaultGroupTytle)) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: grp\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n pb: 1,\n key: grp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h7\",\n sx: STYLES.DESKTOP_GROUP_HEADER\n }, grp ? grp : defaultGroupTytle)));\n for (const panel of panels) {\n if (panel.showInPanelsList == true && (grp && panel.group === grp || !grp && !panel.group)) panelsLinks.push(variant === P8P_PANELS_MENU_VARIANT.GRID ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n item: true,\n xs: 12,\n sm: 6,\n md: 4,\n lg: 4,\n xl: 4,\n key: panel.name\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD\n }, panel.preview ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: panel.preview,\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n component: \"img\",\n alt: panel.name,\n image: \"./img/default_preview.png\",\n sx: STYLES.GRID_PANEL_CARD_MEDIA\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n gap: 1,\n direction: \"row\",\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE\n }, panel.icon ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_CONTENT_TITLE_ICON\n }, panel.icon) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"h5\"\n }, panel.caption)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, panel.desc)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.GRID_PANEL_CARD_ACTIONS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n size: \"large\",\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, navigateCaption)))) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: panel.name,\n disablePadding: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n selected: selectedPanel?.name === panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, panel.icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n primary: panel.caption\n }))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 3,\n key: panel.name,\n onClick: () => onItemNavigate ? onItemNavigate(panel) : null,\n sx: STYLES.DESKTOP_ITEM_BUTTON,\n title: panel.caption\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_ICON\n }, panel.icon), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n sx: STYLES.DESKTOP_ITEM_CATION,\n variant: \"body1\"\n }, panel.caption)));\n }\n }\n\n //Вернём ссылки\n return panelsLinks;\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Меню панелей - сдвигающееся боковое меню\nconst P8PPanelsMenuDrawer = ({\n onItemNavigate,\n panels = [],\n selectedPanel\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DRAWER,\n panels,\n selectedPanel,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: {\n paddingTop: 0\n }\n }, panelsLinks);\n};\n\n//Контроль свойств - Меню панелей - сдвигающееся боковое меню\nP8PPanelsMenuDrawer.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE\n};\n\n//Меню панелей - грид\nconst P8PPanelsMenuGrid = ({\n onItemNavigate,\n navigateCaption,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.GRID,\n panels,\n defaultGroupTytle,\n navigateCaption,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.GRID_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n container: true,\n spacing: 2,\n p: 2,\n sx: STYLES.GRID\n }, panelsLinks));\n};\n\n//Контроль свойств - Меню панелей - грид\nP8PPanelsMenuGrid.propTypes = {\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n navigateCaption: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired,\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//Меню панелей - рабочий стол\nconst P8PPanelsMenuDesktop = ({\n group,\n onItemNavigate,\n panels = [],\n defaultGroupTytle\n} = {}) => {\n //Формируем ссылки на панели\n const panelsLinks = getPanelsLinks({\n variant: P8P_PANELS_MENU_VARIANT.DESKTOP,\n panels,\n group,\n defaultGroupTytle,\n onItemNavigate\n });\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n p: 2\n }, panelsLinks[0], /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n direction: \"row\"\n }, panelsLinks.map((l, i) => i > 0 ? l : null)));\n};\n\n//Контроль свойств - Меню панелей - рабочий стол\nP8PPanelsMenuDesktop.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),\n onItemNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().func),\n panels: prop_types__WEBPACK_IMPORTED_MODULE_1___default().arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired,\n defaultGroupTytle: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_panels_menu.js?"); /***/ }), @@ -4602,7 +4613,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTERS_HEIGHT: () => (/* binding */ P8P_TABLE_FILTERS_HEIGHT),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_MORE_HEIGHT: () => (/* binding */ P8P_TABLE_MORE_HEIGHT),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_styles__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/useTheme.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8p_table_reducer */ \"./app/components/p8p_table_reducer.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Взаимодействие со стилями MUI\n //Встраиваемое сообщение об ошибке\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\",\n EXPAND_TOGGLE: \"EXPAND_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any)\n});\n\n//Высота кнопки догрузки данных\nconst P8P_TABLE_MORE_HEIGHT = \"49px\";\n\n//Высота фильтров таблицы\nconst P8P_TABLE_FILTERS_HEIGHT = \"48px\";\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_HEAD_STICKY: {\n position: \"sticky\",\n top: 0,\n zIndex: 1000\n },\n TABLE_HEAD_CELL_STICKY: (theme, left) => ({\n position: \"sticky\",\n left,\n backgroundColor: theme.palette.background.default,\n zIndex: 1000\n }),\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_STICKY: (theme, left) => ({\n position: \"sticky\",\n left,\n backgroundColor: theme.palette.background.default,\n zIndex: 500\n }),\n TABLE_CELL_EXPAND_CONTROL: {\n minWidth: \"60px\",\n maxWidth: \"60px\"\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_CELL_GROUP_HEADER_STICKY: {\n position: \"sticky\",\n left: 0\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Панель инструментов столбца (левая)\nconst P8PTableColumnToolBarLeft = ({\n columnDef,\n onItemClick\n}) => {\n //Кнопка развёртывания/свёртывания\n let expButton = null;\n if (columnDef.expandable) expButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, columnDef.expanded ? \"indeterminate_check_box\" : \"add_box\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, expButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (левая)\nP8PTableColumnToolBarLeft.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Панель инструментов столбца (правая)\nconst P8PTableColumnToolBarRight = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if ((0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.from) || (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"filter_alt\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (правая)\nP8PTableColumnToolBarRight.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n p: 1\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef,\n groups,\n rows,\n orders,\n filters,\n size,\n fixedHeader = false,\n fixedColumns = 0,\n morePages = false,\n reloading,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n morePagesBtnProps,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier,\n containerComponent,\n containerComponentProps\n}) => {\n //Собственное состояние - описание заголовка\n const [header, dispatchHeaderAction] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.p8pTableReducer, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.HEADER_INITIAL_STATE)());\n\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояния - развёрнутые группы\n const [expandedGroups, setExpandedGroups] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Стили\n const theme = (0,_mui_material_styles__WEBPACK_IMPORTED_MODULE_17__[\"default\"])();\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Формирование заголовка таблицы\n const setHeader = ({\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.SET_HEADER,\n payload: {\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n }\n });\n\n //Сворачивание/разворачивание уровня заголовка таблицы\n const toggleHeaderExpand = ({\n columnName,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.TOGGLE_HEADER_EXPAND,\n payload: {\n columnName,\n expandable,\n fixedColumns,\n objectsCopier\n }\n });\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE:\n toggleHeaderExpand({\n columnName,\n objectsCopier\n });\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //При изменении описания колонок\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setHeader({\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n });\n }, [columnsDef, expandable, fixedColumns, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return header.displayDataColumns.map((columnDef, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `group-header-cell-${i}`\n }, customRender.cellProps, {\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle,\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(i == 0 && fixedColumns ? STYLES.TABLE_CELL_GROUP_HEADER_STICKY : {})\n },\n colSpan: expandable && rowExpandRender ? 2 : 1\n }), i == 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.TABLE_COLUMN_STACK\n }, group.expandable ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => {\n setExpandedGroups(pv => ({\n ...pv,\n ...{\n [group.name]: !pv[group.name]\n }\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expandedGroups[group.name] ? \"indeterminate_check_box\" : \"add_box\")) : null, customRender.data ? customRender.data : group.caption) : null));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], _extends({\n component: containerComponent ? containerComponent : _mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"]\n }, containerComponentProps ? containerComponentProps : {}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n stickyHeader: fixedHeader,\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: fixedHeader ? STYLES.TABLE_HEAD_STICKY : {}\n }, header.displayLevels.map((level, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: level\n }, expandable && rowExpandRender && i == 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\",\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTROL,\n ...(fixedColumns ? STYLES.TABLE_HEAD_CELL_STICKY(theme, 0) : {})\n },\n rowSpan: header.displayLevelsColumns[level][0].rowSpan\n }) : null, header.displayLevelsColumns[level].map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(columnDef.fixed ? STYLES.TABLE_HEAD_CELL_STICKY(theme, columnDef.fixedLeft) : {}),\n ...customRender.cellStyle\n },\n rowSpan: columnDef.rowSpan,\n colSpan: columnDef.colSpan\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarLeft, {\n columnDef: columnDef,\n onItemClick: handleToolBarItemClick\n }), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarRight, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], null, rows.length > 0 ? (Array.isArray(groups) && groups.length > 0 ? groups : [{}]).map((group, g) => {\n const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\",\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTROL,\n ...(fixedColumns ? STYLES.TABLE_CELL_STICKY(theme, 0) : {})\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, header.displayDataColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(columnDef.fixed ? STYLES.TABLE_CELL_STICKY(theme, columnDef.fixedLeft) : {}),\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTAINER,\n ...(fixedColumns ? STYLES.TABLE_CELL_STICKY(theme, 0) : {})\n },\n colSpan: fixedColumns ? header.displayFixedColumnsCount + 1 : header.displayDataColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null) : null);\n return !group?.name ? rowsView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `group-${g}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n colSpan: header.displayDataColumnsCount\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }))) : null))), morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _extends({\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnProps ? morePagesBtnProps : {}), morePagesBtnCaption)) : null);\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n parent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n width: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number)\n })).isRequired,\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n fixedHeader: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n fixedColumns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ P8PTable: () => (/* binding */ P8PTable),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* binding */ P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTERS_HEIGHT: () => (/* binding */ P8P_TABLE_FILTERS_HEIGHT),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* binding */ P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_MORE_HEIGHT: () => (/* binding */ P8P_TABLE_MORE_HEIGHT),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* binding */ P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Menu/Menu.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Chip/Chip.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableContainer/TableContainer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableHead/TableHead.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material_styles__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/useTheme.js\");\n/* harmony import */ var _p8p_app_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./p8p_app_message */ \"./app/components/p8p_app_message.js\");\n/* harmony import */ var _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8p_table_reducer */ \"./app/components/p8p_table_reducer.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Компонент: Таблица\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Взаимодействие со стилями MUI\n //Встраиваемое сообщение об ошибке\n //Редьюсер состояния\n\n//---------\n//Константы\n//---------\n\n//Размеры отступов\nconst P8P_TABLE_SIZE = {\n SMALL: \"small\",\n MEDIUM: \"medium\"\n};\n\n//Типы данных\nconst P8P_TABLE_DATA_TYPE = {\n STR: \"STR\",\n NUMB: \"NUMB\",\n DATE: \"DATE\"\n};\n\n//Направления сортировки\nconst P8P_TABLE_COLUMN_ORDER_DIRECTIONS = {\n ASC: \"ASC\",\n DESC: \"DESC\"\n};\n\n//Действия панели инструментов столбца\nconst P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS = {\n ORDER_TOGGLE: \"ORDER_TOGGLE\",\n FILTER_TOGGLE: \"FILTER_TOGGLE\",\n EXPAND_TOGGLE: \"EXPAND_TOGGLE\"\n};\n\n//Действия меню столбца\nconst P8P_TABLE_COLUMN_MENU_ACTIONS = {\n ORDER_ASC: \"ORDER_ASC\",\n ORDER_DESC: \"ORDER_DESC\",\n FILTER: \"FILTER\"\n};\n\n//Структура элемента описания фильтра\nconst P8P_TABLE_FILTER_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any)\n});\n\n//Высота кнопки догрузки данных\nconst P8P_TABLE_MORE_HEIGHT = \"49px\";\n\n//Высота фильтров таблицы\nconst P8P_TABLE_FILTERS_HEIGHT = \"48px\";\n\n//Стили\nconst STYLES = {\n TABLE: {\n with: \"100%\"\n },\n TABLE_HEAD_STICKY: {\n position: \"sticky\",\n top: 0,\n zIndex: 1000\n },\n TABLE_HEAD_CELL_STICKY: (theme, left) => ({\n position: \"sticky\",\n left,\n backgroundColor: theme.palette.background.default,\n zIndex: 1000\n }),\n TABLE_ROW: {\n \"&:last-child td, &:last-child th\": {\n border: 0\n }\n },\n TABLE_CELL_STICKY: (theme, left) => ({\n position: \"sticky\",\n left,\n backgroundColor: theme.palette.background.default,\n zIndex: 500\n }),\n TABLE_CELL_EXPAND_CONTROL: {\n minWidth: \"60px\",\n maxWidth: \"60px\"\n },\n TABLE_CELL_EXPAND_CONTAINER: {\n paddingBottom: 0,\n paddingTop: 0,\n paddingLeft: 0,\n paddingRight: 0\n },\n TABLE_CELL_GROUP_HEADER: {\n backgroundColor: \"lightgray\"\n },\n TABLE_CELL_GROUP_HEADER_STICKY: {\n position: \"sticky\",\n left: 0\n },\n TABLE_COLUMN_STACK: {\n alignItems: \"center\"\n },\n TABLE_COLUMN_MENU_ITEM_ICON: {\n paddingRight: \"10px\"\n },\n FILTER_CHIP: {\n alignItems: \"center\"\n },\n MORE_BUTTON_CONTAINER: {\n with: \"100%\",\n textAlign: \"center\",\n padding: \"5px\"\n }\n};\n\n//--------------------------------\n//Вспомогательные классы и функции\n//--------------------------------\n\n//Панель инструментов столбца (левая)\nconst P8PTableColumnToolBarLeft = ({\n columnDef,\n onItemClick\n}) => {\n //Кнопка развёртывания/свёртывания\n let expButton = null;\n if (columnDef.expandable) expButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, columnDef.expanded ? \"indeterminate_check_box\" : \"add_box\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, expButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (левая)\nP8PTableColumnToolBarLeft.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Панель инструментов столбца (правая)\nconst P8PTableColumnToolBarRight = ({\n columnDef,\n orders,\n filters,\n onItemClick\n}) => {\n //Кнопка сортировки\n const order = orders.find(o => o.name == columnDef.name);\n let orderButton = null;\n if (order) orderButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, order.direction === P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? \"arrow_upward\" : \"arrow_downward\"));\n\n //Кнопка фильтрации\n const filter = filters.find(f => f.name == columnDef.name);\n let filterButton = null;\n if ((0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.from) || (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter?.to)) filterButton = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => onItemClick ? onItemClick(P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE, columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"filter_alt\"));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, orderButton, filterButton);\n};\n\n//Контроль свойств - Панель инструментов столбца (правая)\nP8PTableColumnToolBarRight.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orders: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Меню столбца\nconst P8PTableColumnMenu = ({\n columnDef,\n orderAscItemCaption,\n orderDescItemCaption,\n filterItemCaption,\n onItemClick\n}) => {\n //Собственное состояние\n const [anchorEl, setAnchorEl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Флаг отображения\n const open = Boolean(anchorEl);\n\n //По нажатию на открытие меню\n const handleMenuButtonClick = event => {\n setAnchorEl(event.currentTarget);\n };\n\n //По нажатию на пункт меню\n const handleMenuItemClick = (event, index, action, columnName) => {\n if (onItemClick) onItemClick(action, columnName);\n setAnchorEl(null);\n };\n\n //При закрытии меню\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n //Формирование списка элементов меню в зависимости от описания колонки таблицы\n const menuItems = [];\n if (columnDef.order === true) {\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderAsc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_upward\"), orderAscItemCaption));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"orderDesc\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"arrow_downward\"), orderDescItemCaption));\n }\n if (columnDef.filter === true) {\n if (menuItems.length > 0) menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: \"divider\",\n sx: {\n my: 0.5\n }\n }));\n menuItems.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: \"filter\",\n onClick: (event, index) => handleMenuItemClick(event, index, P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER, columnDef.name)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.TABLE_COLUMN_MENU_ITEM_ICON\n }, \"filter_alt\"), filterItemCaption));\n }\n\n //Генерация содержимого\n return menuItems.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n id: `${columnDef.name}_menu_button`,\n \"aria-haspopup\": \"true\",\n onClick: handleMenuButtonClick\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, \"more_vert\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n id: `${columnDef.name}_menu`,\n anchorEl: anchorEl,\n open: open,\n onClose: handleMenuClose\n }, menuItems)) : null;\n};\n\n//Контроль свойств - Меню столбца\nP8PTableColumnMenu.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n orderAscItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onItemClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог подсказки\nconst P8PTableColumnHintDialog = ({\n columnDef,\n okBtnCaption,\n onOk\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onOk ? onOk() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: columnDef.hint\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk() : null\n }, okBtnCaption)));\n};\n\n//Контроль свойств - Диалог подсказки\nP8PTableColumnHintDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Диалог фильтра\nconst P8PTableColumnFilterDialog = ({\n columnDef,\n from,\n to,\n valueCaption,\n valueFromCaption,\n valueToCaption,\n okBtnCaption,\n clearBtnCaption,\n cancelBtnCaption,\n valueFormatter,\n onOk,\n onClear,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [filterValues, setFilterValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n from,\n to\n });\n\n //Отработка воода значения в фильтр\n const handleFilterTextFieldChanged = e => {\n setFilterValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n };\n\n //Элементы ввода значений фильтра\n let inputs = null;\n if (Array.isArray(columnDef.values) && columnDef.values.length > 0) {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n select: true,\n label: valueCaption,\n variant: \"standard\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged\n }, columnDef.values.map((v, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: i,\n value: v\n }, valueFormatter ? valueFormatter({\n value: v,\n columnDef\n }) : v)));\n } else {\n switch (columnDef.dataType) {\n case P8P_TABLE_DATA_TYPE.STR:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n fullWidth: true,\n InputLabelProps: {\n shrink: true\n },\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueCaption,\n variant: \"standard\"\n });\n break;\n }\n case P8P_TABLE_DATA_TYPE.NUMB:\n case P8P_TABLE_DATA_TYPE.DATE:\n {\n inputs = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"from\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.from,\n onChange: handleFilterTextFieldChanged,\n label: valueFromCaption,\n variant: \"standard\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n name: \"to\",\n InputLabelProps: {\n shrink: true\n },\n type: columnDef.dataType == P8P_TABLE_DATA_TYPE.NUMB ? \"number\" : \"date\",\n value: filterValues.to,\n onChange: handleFilterTextFieldChanged,\n label: valueToCaption,\n variant: \"standard\"\n }));\n break;\n }\n }\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"filter-dialog-title\",\n \"aria-describedby\": \"filter-dialog-description\",\n onClose: () => onCancel ? onCancel(columnDef.name) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n id: \"filter-dialog-title\"\n }, columnDef.caption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, inputs), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onOk ? onOk(columnDef.name, filterValues.from, filterValues.to) : null\n }, okBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onClear ? onClear(columnDef.name) : null,\n variant: \"secondary\"\n }, clearBtnCaption), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => onCancel ? onCancel(columnDef.name) : null\n }, cancelBtnCaption)));\n};\n\n//Контроль свойств - Диалог фильтра\nP8PTableColumnFilterDialog.propTypes = {\n columnDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object).isRequired,\n from: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n to: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().any),\n valueCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onClear: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//Сводный фильтр\nconst P8PTableFiltersChips = ({\n filters,\n columnsDef,\n valueFromCaption,\n valueToCaption,\n onFilterChipClick,\n onFilterChipDelete,\n valueFormatter\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n spacing: 1,\n p: 1\n }, filters.map((filter, i) => {\n const columnDef = columnsDef.find(columnDef => columnDef.name == filter.name);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n key: i,\n label: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.FILTER_CHIP\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"strong\", null, columnDef.caption), \":\\xA0\", (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? `${valueFromCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.from) ? valueFormatter ? valueFormatter({\n value: filter.from,\n columnDef\n }) : filter.from : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) && !columnDef.values && columnDef.dataType != P8P_TABLE_DATA_TYPE.STR ? ` ${valueToCaption.toLowerCase()} ` : null, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.hasValue)(filter.to) ? valueFormatter ? valueFormatter({\n value: filter.to,\n columnDef\n }) : filter.to : null),\n variant: \"outlined\",\n onClick: () => onFilterChipClick ? onFilterChipClick(columnDef.name) : null,\n onDelete: () => onFilterChipDelete ? onFilterChipDelete(columnDef.name) : null\n });\n }));\n};\n\n//Контроль свойств - Сводный фильтр\nP8PTableFiltersChips.propTypes = {\n filters: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n columnsDef: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n valueFromCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n onFilterChipClick: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChipDelete: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Таблица\nconst P8PTable = ({\n columnsDef = [],\n groups = [],\n rows = [],\n orders,\n filters,\n size,\n fixedHeader = false,\n fixedColumns = 0,\n morePages = false,\n reloading = false,\n expandable,\n orderAscMenuItemCaption,\n orderDescMenuItemCaption,\n filterMenuItemCaption,\n valueFilterCaption,\n valueFromFilterCaption,\n valueToFilterCaption,\n okFilterBtnCaption,\n clearFilterBtnCaption,\n cancelFilterBtnCaption,\n morePagesBtnCaption,\n morePagesBtnProps,\n noDataFoundText,\n headCellRender,\n dataCellRender,\n groupCellRender,\n rowExpandRender,\n valueFormatter,\n onOrderChanged,\n onFilterChanged,\n onPagesCountChanged,\n objectsCopier,\n containerComponent,\n containerComponentProps\n}) => {\n //Собственное состояние - описание заголовка\n const [header, dispatchHeaderAction] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.p8pTableReducer, (0,_p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.HEADER_INITIAL_STATE)());\n\n //Собственное состояние - фильтруемая колонка\n const [filterColumn, setFilterColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Собственное состояние - развёрнутые строки\n const [expanded, setExpanded] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n\n //Собственное состояния - развёрнутые группы\n const [expandedGroups, setExpandedGroups] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(Array.isArray(groups) && groups.length > 0 ? Object.assign({}, ...groups.map(g => ({\n [g.name]: g.expanded\n }))) : {});\n\n //Собственное состояние - колонка с отображаемой подсказкой\n const [displayHintColumn, setDisplayHintColumn] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n\n //Стили\n const theme = (0,_mui_material_styles__WEBPACK_IMPORTED_MODULE_17__[\"default\"])();\n\n //Описание фильтруемой колонки\n const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;\n\n //Описание колонки с отображаемой подсказкой\n const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;\n\n //Значения фильтра фильтруемой колонки\n const [filterColumnFrom, filterColumnTo] = filterColumn ? (() => {\n const filter = filters.find(filter => filter.name == filterColumn);\n return filter ? [filter.from == null ? \"\" : filter.from, filter.to == null ? \"\" : filter.to] : [\"\", \"\"];\n })() : [\"\", \"\"];\n\n //Формирование заголовка таблицы\n const setHeader = ({\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.SET_HEADER,\n payload: {\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n }\n });\n\n //Сворачивание/разворачивание уровня заголовка таблицы\n const toggleHeaderExpand = ({\n columnName,\n objectsCopier\n }) => dispatchHeaderAction({\n type: _p8p_table_reducer__WEBPACK_IMPORTED_MODULE_2__.P8P_TABLE_AT.TOGGLE_HEADER_EXPAND,\n payload: {\n columnName,\n expandable,\n fixedColumns,\n objectsCopier\n }\n });\n\n //Выравнивание в зависимости от типа данных\n const getAlignByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"right\" : \"left\";\n\n //Упорядочение содержимого в зависимости от типа данных\n const getJustifyContentByDataType = ({\n dataType,\n hasChild\n }) => dataType === P8P_TABLE_DATA_TYPE.DATE || hasChild ? \"center\" : dataType === P8P_TABLE_DATA_TYPE.NUMB ? \"flex-end\" : \"flex-start\";\n\n //Отработка нажатия на элемент пункта меню\n const handleToolBarItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.ORDER_TOGGLE:\n {\n const colOrder = orders.find(o => o.name == columnName);\n const newDirection = colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC ? P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC : colOrder?.direction == P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC ? null : P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC;\n if (onOrderChanged) onOrderChanged({\n columnName,\n direction: newDirection\n });\n break;\n }\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.FILTER_TOGGLE:\n setFilterColumn(columnName);\n break;\n case P8P_TABLE_COLUMN_TOOL_BAR_ACTIONS.EXPAND_TOGGLE:\n toggleHeaderExpand({\n columnName,\n objectsCopier\n });\n break;\n }\n };\n\n //Отработка нажатия на пункты меню\n const handleMenuItemClick = (action, columnName) => {\n switch (action) {\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_ASC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.ASC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.ORDER_DESC:\n onOrderChanged({\n columnName,\n direction: P8P_TABLE_COLUMN_ORDER_DIRECTIONS.DESC\n });\n break;\n case P8P_TABLE_COLUMN_MENU_ACTIONS.FILTER:\n setFilterColumn(columnName);\n break;\n }\n };\n\n //Отработка ввода значения фильтра колонки\n const handleFilterOk = (columnName, from, to) => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: from === \"\" ? null : from,\n to: to === \"\" ? null : to\n });\n setFilterColumn(null);\n };\n\n //Отработка очистки значения фильтра колонки\n const handleFilterClear = columnName => {\n if (onFilterChanged) onFilterChanged({\n columnName,\n from: null,\n to: null\n });\n setFilterColumn(null);\n };\n\n //Отработка отмены ввода значения фильтра колонки\n const handleFilterCancel = () => {\n setFilterColumn(null);\n };\n\n //Отработка нажатия на элемент сводного фильтра\n const handleFilterChipClick = columnName => setFilterColumn(columnName);\n\n //Отработка удаления элемента сводного фильтра\n const handleFilterChipDelete = columnName => onFilterChanged ? onFilterChanged({\n columnName,\n from: null,\n to: null\n }) : null;\n\n //Отработка нажатия на кнопку догрузки страницы\n const handleMorePagesBtnClick = () => {\n if (onPagesCountChanged) onPagesCountChanged();\n };\n\n //Отработка нажатия на элемент отображения подсказки по колонке\n const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);\n\n //Отработка сокрытия подсказки по колонке\n const handleHintOk = () => setDisplayHintColumn(null);\n\n //Отработка нажатия на кнопку раскрытия элемента\n const handleExpandClick = rowIndex => {\n if (expanded[rowIndex] === true) setExpanded(pv => {\n let res = {\n ...pv\n };\n delete res[rowIndex];\n return res;\n });else setExpanded(pv => ({\n ...pv,\n [rowIndex]: true\n }));\n };\n\n //При перезагрузке данных\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (reloading) setExpanded({});\n }, [reloading]);\n\n //При изменении описания колонок\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setHeader({\n columnsDef,\n expandable,\n fixedColumns,\n objectsCopier\n });\n }, [columnsDef, expandable, fixedColumns, objectsCopier]);\n\n //Генерация заголовка группы\n const renderGroupCell = group => {\n let customRender = {};\n if (groupCellRender) customRender = groupCellRender({\n columnsDef: header.columnsDef,\n group\n }) || {};\n return header.displayDataColumns.map((columnDef, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `group-header-cell-${i}`\n }, customRender.cellProps, {\n sx: {\n ...STYLES.TABLE_CELL_GROUP_HEADER,\n ...customRender.cellStyle,\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(i == 0 && fixedColumns ? STYLES.TABLE_CELL_GROUP_HEADER_STICKY : {})\n },\n colSpan: expandable && rowExpandRender ? 2 : 1\n }), i == 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n direction: \"row\",\n sx: STYLES.TABLE_COLUMN_STACK\n }, group.expandable ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => {\n setExpandedGroups(pv => ({\n ...pv,\n ...{\n [group.name]: !pv[group.name]\n }\n }));\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expandedGroups[group.name] ? \"indeterminate_check_box\" : \"add_box\")) : null, customRender.data ? customRender.data : group.caption) : null));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, displayHintColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnHintDialog, {\n columnDef: displayHintColumnDef,\n okBtnCaption: okFilterBtnCaption,\n onOk: handleHintOk\n }) : null, filterColumn ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnFilterDialog, {\n columnDef: filterColumnDef,\n from: filterColumnFrom,\n to: filterColumnTo,\n valueCaption: valueFilterCaption,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n okBtnCaption: okFilterBtnCaption,\n clearBtnCaption: clearFilterBtnCaption,\n cancelBtnCaption: cancelFilterBtnCaption,\n valueFormatter: valueFormatter,\n onOk: handleFilterOk,\n onClear: handleFilterClear,\n onCancel: handleFilterCancel\n }) : null, Array.isArray(filters) && filters.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableFiltersChips, {\n filters: filters,\n columnsDef: columnsDef,\n valueFromCaption: valueFromFilterCaption,\n valueToCaption: valueToFilterCaption,\n onFilterChipClick: handleFilterChipClick,\n onFilterChipDelete: handleFilterChipDelete,\n valueFormatter: valueFormatter\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], _extends({\n component: containerComponent ? containerComponent : _mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"]\n }, containerComponentProps ? containerComponentProps : {}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n stickyHeader: fixedHeader,\n sx: STYLES.TABLE,\n size: size || P8P_TABLE_SIZE.MEDIUM\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: fixedHeader ? STYLES.TABLE_HEAD_STICKY : {}\n }, header.displayLevels.map((level, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: level\n }, expandable && rowExpandRender && i == 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: \"head-cell-expand-control\",\n align: \"center\",\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTROL,\n ...(fixedColumns ? STYLES.TABLE_HEAD_CELL_STICKY(theme, 0) : {})\n },\n rowSpan: header.displayLevelsColumns[level][0].rowSpan\n }) : null, header.displayLevelsColumns[level].map((columnDef, j) => {\n let customRender = {};\n if (headCellRender) customRender = headCellRender({\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `head-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(columnDef.fixed ? STYLES.TABLE_HEAD_CELL_STICKY(theme, columnDef.fixedLeft) : {}),\n ...customRender.cellStyle\n },\n rowSpan: columnDef.rowSpan,\n colSpan: columnDef.colSpan\n }, customRender.cellProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], _extends({\n direction: \"row\",\n justifyContent: getJustifyContentByDataType(columnDef),\n sx: {\n ...STYLES.TABLE_COLUMN_STACK,\n ...customRender.stackStyle\n }\n }, customRender.stackProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarLeft, {\n columnDef: columnDef,\n onItemClick: handleToolBarItemClick\n }), customRender.data ? customRender.data : columnDef.hint ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => handleColumnShowHintClick(columnDef.name)\n }, columnDef.caption) : columnDef.caption, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnToolBarRight, {\n columnDef: columnDef,\n orders: orders,\n filters: filters,\n onItemClick: handleToolBarItemClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(P8PTableColumnMenu, {\n columnDef: columnDef,\n orderAscItemCaption: orderAscMenuItemCaption,\n orderDescItemCaption: orderDescMenuItemCaption,\n filterItemCaption: filterMenuItemCaption,\n onItemClick: handleMenuItemClick\n })));\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], null, rows.length > 0 ? (Array.isArray(groups) && groups.length > 0 ? groups : [{}]).map((group, g) => {\n const rowsView = rows.map((row, i) => !group?.name || group?.name == row.groupName ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `data-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: `data-row-${i}`,\n sx: STYLES.TABLE_ROW\n }, expandable && rowExpandRender ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n key: `data-cell-expand-control-${i}`,\n align: \"center\",\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTROL,\n ...(fixedColumns ? STYLES.TABLE_CELL_STICKY(theme, 0) : {})\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => handleExpandClick(i)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, expanded[i] === true ? \"keyboard_arrow_down\" : \"keyboard_arrow_right\"))) : null, header.displayDataColumns.map((columnDef, j) => {\n let customRender = {};\n if (dataCellRender) customRender = dataCellRender({\n row,\n columnDef\n }) || {};\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], _extends({\n key: `data-cell-${j}`,\n align: getAlignByDataType(columnDef),\n sx: {\n ...(columnDef.width ? {\n minWidth: columnDef.width,\n maxWidth: columnDef.width\n } : {}),\n ...(columnDef.fixed ? STYLES.TABLE_CELL_STICKY(theme, columnDef.fixedLeft) : {}),\n ...customRender.cellStyle\n }\n }, customRender.cellProps), customRender.data ? customRender.data : valueFormatter ? valueFormatter({\n value: row[columnDef.name],\n columnDef\n }) : row[columnDef.name]);\n })), expandable && rowExpandRender && expanded[i] === true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: `data-row-expand-${i}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: {\n ...STYLES.TABLE_CELL_EXPAND_CONTAINER,\n ...(fixedColumns ? STYLES.TABLE_CELL_STICKY(theme, 0) : {})\n },\n colSpan: fixedColumns ? header.displayFixedColumnsCount + 1 : header.displayDataColumnsCount\n }, rowExpandRender({\n columnsDef,\n row\n }))) : null) : null);\n return !group?.name ? rowsView : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: `group-${g}`\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: `group-header-${g}`\n }, renderGroupCell(group)), !group.expandable || expandedGroups[group.name] === true ? rowsView : null);\n }) : noDataFoundText && !reloading ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n colSpan: header.displayDataColumnsCount\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_p8p_app_message__WEBPACK_IMPORTED_MODULE_1__.P8PAppInlineError, {\n text: noDataFoundText\n }))) : null))), morePages ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n style: STYLES.MORE_BUTTON_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], _extends({\n fullWidth: true,\n onClick: handleMorePagesBtnClick\n }, morePagesBtnProps ? morePagesBtnProps : {}), morePagesBtnCaption)) : null);\n};\n\n//Контроль свойств - Таблица\nP8PTable.propTypes = {\n columnsDef: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n order: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n dataType: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n visible: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n values: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array),\n parent: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n width: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number)\n })).isRequired,\n groups: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n caption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired,\n expanded: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool).isRequired\n })),\n rows: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().array).isRequired,\n orders: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n name: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n direction: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired\n })).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf(P8P_TABLE_FILTER_SHAPE).isRequired,\n size: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n fixedHeader: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n fixedColumns: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().number),\n morePages: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n reloading: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n expandable: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().bool),\n orderAscMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n orderDescMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n filterMenuItemCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueFromFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n valueToFilterCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n okFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n clearFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n cancelFilterBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnCaption: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n morePagesBtnProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object),\n noDataFoundText: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string),\n headCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n dataCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n groupCellRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n rowExpandRender: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n valueFormatter: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onOrderChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onFilterChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n onPagesCountChanged: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func),\n objectsCopier: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n containerComponent: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([(prop_types__WEBPACK_IMPORTED_MODULE_3___default().elementType), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string)]),\n containerComponentProps: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().object)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/components/p8p_table.js?"); /***/ }), @@ -4624,7 +4635,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigWrapper: () => (/* binding */ ConfigWrapper),\n/* harmony export */ P8PAppWorkspaceConfigWrapped: () => (/* binding */ P8PAppWorkspaceConfigWrapped),\n/* harmony export */ P8PDataGridConfigWrapped: () => (/* binding */ P8PDataGridConfigWrapped),\n/* harmony export */ P8PGanttConfigWrapped: () => (/* binding */ P8PGanttConfigWrapped),\n/* harmony export */ P8PPanelsMenuGridConfigWrapped: () => (/* binding */ P8PPanelsMenuGridConfigWrapped),\n/* harmony export */ P8PTableConfigWrapped: () => (/* binding */ P8PTableConfigWrapped),\n/* harmony export */ P8P_APP_WORKSPACE_CONFIG_PROPS: () => (/* binding */ P8P_APP_WORKSPACE_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_CONFIG_PROPS: () => (/* binding */ P8P_DATA_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE),\n/* harmony export */ P8P_GANTT_CONFIG_PROPS: () => (/* binding */ P8P_GANTT_CONFIG_PROPS),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_SHAPE),\n/* harmony export */ P8P_PANELS_MENU_GRID_CONFIG_PROPS: () => (/* binding */ P8P_PANELS_MENU_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* reexport safe */ _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8P_PANELS_MENU_PANEL_SHAPE),\n/* harmony export */ P8P_TABLE_CONFIG_PROPS: () => (/* binding */ P8P_TABLE_CONFIG_PROPS),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_table */ \"./app/components/p8p_table.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Обёртки для компонент, обеспечивающие подключение их к настройкам приложения\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Вспомогательные процедуры и функции\n //Текстовые ресурсы и константы\n //Меню панелей\n //Рабочее пространство\n //Таблица данных\n //Таблица данных\n //Диаграмма Ганта\n\n//---------\n//Константы\n//---------\n\n//Конфигурируемые свойства \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8P_PANELS_MENU_GRID_CONFIG_PROPS = {\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE,\n defaultGroupTytle: _app_text__WEBPACK_IMPORTED_MODULE_2__.TITLES.DEFAULT_PANELS_GROUP\n};\n\n//Конфигурируемые свойства \"Рабочего пространства\" (P8PAppWorkspace)\nconst P8P_APP_WORKSPACE_CONFIG_PROPS = {\n closeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLOSE,\n homeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE_HOME\n};\n\n//Конфигурируемые свойства \"Таблицы\" (P8PTable)\nconst P8P_TABLE_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND\n};\n\n//Конфигурируемые свойства \"Таблицы данных\" (P8PDataGrid)\nconst P8P_DATA_GRID_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n objectsCopier: _core_utils__WEBPACK_IMPORTED_MODULE_1__.deepCopyObject\n};\n\n//Конфигурируемые свойства \"Диаграммы Ганта\" (P8PGantt)\nconst P8P_GANTT_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n numbTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NUMB,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n startTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.START,\n endTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.END,\n progressTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.PROGRESS,\n legendTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.LEGEND,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//-----------------------\n//Вспомогательные функции\n//-----------------------\n\n//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов\nconst addConfigChildProps = children => react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(child)) return child;\n const {\n children,\n ...restProps\n } = child.props;\n let configProps = {};\n if (child.type.name === \"P8PPanelsMenuGrid\") configProps = P8P_PANELS_MENU_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PTable\") configProps = P8P_TABLE_CONFIG_PROPS;\n if (child.type.name === \"P8PDataGrid\") configProps = P8P_DATA_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PGantt\") configProps = P8P_GANTT_CONFIG_PROPS;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(child.type, {\n ...configProps,\n ...restProps\n }, addConfigChildProps(children));\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для компонента \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8PPanelsMenuGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8PPanelsMenuGrid, _extends({}, P8P_PANELS_MENU_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Рабочее пространство\" (P8PAppWorkspace)\nconst P8PAppWorkspaceConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, P8P_APP_WORKSPACE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица\" (P8PTable)\nconst P8PTableConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8PTable, _extends({}, P8P_TABLE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица данных\" (P8PDataGrid)\nconst P8PDataGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, P8P_DATA_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Диаграмма Ганта\" (P8PGantt)\nconst P8PGanttConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Универсальный элемент-обёртка в параметры конфигурации\nconst ConfigWrapper = ({\n children\n}) => addConfigChildProps(children);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/config_wrapper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ConfigWrapper: () => (/* binding */ ConfigWrapper),\n/* harmony export */ P8PAppWorkspaceConfigWrapped: () => (/* binding */ P8PAppWorkspaceConfigWrapped),\n/* harmony export */ P8PCyclogramConfigWrapped: () => (/* binding */ P8PCyclogramConfigWrapped),\n/* harmony export */ P8PDataGridConfigWrapped: () => (/* binding */ P8PDataGridConfigWrapped),\n/* harmony export */ P8PGanttConfigWrapped: () => (/* binding */ P8PGanttConfigWrapped),\n/* harmony export */ P8PPanelsMenuGridConfigWrapped: () => (/* binding */ P8PPanelsMenuGridConfigWrapped),\n/* harmony export */ P8PTableConfigWrapped: () => (/* binding */ P8PTableConfigWrapped),\n/* harmony export */ P8P_APP_WORKSPACE_CONFIG_PROPS: () => (/* binding */ P8P_APP_WORKSPACE_CONFIG_PROPS),\n/* harmony export */ P8P_CYCLOGRAM_CONFIG_PROPS: () => (/* binding */ P8P_CYCLOGRAM_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_CONFIG_PROPS: () => (/* binding */ P8P_DATA_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_DATA_GRID_DATA_TYPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_DATA_TYPE),\n/* harmony export */ P8P_DATA_GRID_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_FILTER_SHAPE),\n/* harmony export */ P8P_DATA_GRID_SIZE: () => (/* reexport safe */ _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE),\n/* harmony export */ P8P_GANTT_CONFIG_PROPS: () => (/* binding */ P8P_GANTT_CONFIG_PROPS),\n/* harmony export */ P8P_GANTT_TASK_ATTRIBUTE_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_ATTRIBUTE_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_COLOR_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_COLOR_SHAPE),\n/* harmony export */ P8P_GANTT_TASK_SHAPE: () => (/* reexport safe */ _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_TASK_SHAPE),\n/* harmony export */ P8P_PANELS_MENU_GRID_CONFIG_PROPS: () => (/* binding */ P8P_PANELS_MENU_GRID_CONFIG_PROPS),\n/* harmony export */ P8P_PANELS_MENU_PANEL_SHAPE: () => (/* reexport safe */ _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8P_PANELS_MENU_PANEL_SHAPE),\n/* harmony export */ P8P_TABLE_CONFIG_PROPS: () => (/* binding */ P8P_TABLE_CONFIG_PROPS),\n/* harmony export */ P8P_TABLE_DATA_TYPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_DATA_TYPE),\n/* harmony export */ P8P_TABLE_FILTER_SHAPE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_FILTER_SHAPE),\n/* harmony export */ P8P_TABLE_SIZE: () => (/* reexport safe */ _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8P_TABLE_SIZE)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/p8p_panels_menu */ \"./app/components/p8p_panels_menu.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/p8p_table */ \"./app/components/p8p_table.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _components_p8p_cyclogram__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/p8p_cyclogram */ \"./app/components/p8p_cyclogram.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга\r\n Обёртки для компонент, обеспечивающие подключение их к настройкам приложения\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Вспомогательные процедуры и функции\n //Текстовые ресурсы и константы\n //Меню панелей\n //Рабочее пространство\n //Таблица данных\n //Таблица данных\n //Диаграмма Ганта\n //Циклограмма\n\n//---------\n//Константы\n//---------\n\n//Конфигурируемые свойства \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8P_PANELS_MENU_GRID_CONFIG_PROPS = {\n navigateCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE,\n defaultGroupTytle: _app_text__WEBPACK_IMPORTED_MODULE_2__.TITLES.DEFAULT_PANELS_GROUP\n};\n\n//Конфигурируемые свойства \"Рабочего пространства\" (P8PAppWorkspace)\nconst P8P_APP_WORKSPACE_CONFIG_PROPS = {\n closeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLOSE,\n homeCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.NAVIGATE_HOME\n};\n\n//Конфигурируемые свойства \"Таблицы\" (P8PTable)\nconst P8P_TABLE_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND\n};\n\n//Конфигурируемые свойства \"Таблицы данных\" (P8PDataGrid)\nconst P8P_DATA_GRID_CONFIG_PROPS = {\n orderAscMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_ASC,\n orderDescMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.ORDER_DESC,\n filterMenuItemCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.FILTER,\n valueFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE,\n valueFromFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_FROM,\n valueToFilterCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.VALUE_TO,\n okFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n clearFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CLEAR,\n cancelFilterBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL,\n morePagesBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.MORE,\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n objectsCopier: _core_utils__WEBPACK_IMPORTED_MODULE_1__.deepCopyObject\n};\n\n//Конфигурируемые свойства \"Диаграммы Ганта\" (P8PGantt)\nconst P8P_GANTT_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n numbTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NUMB,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n startTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.START,\n endTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.END,\n progressTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.PROGRESS,\n legendTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.LEGEND,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//Конфигурируемые свойства \"Циклограммы\" (P8PCyclogram)\nconst P8P_CYCLOGRAM_CONFIG_PROPS = {\n noDataFoundText: _app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND,\n nameTaskEditorCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.CAPTIONS.NAME,\n okTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.OK,\n cancelTaskEditorBtnCaption: _app_text__WEBPACK_IMPORTED_MODULE_2__.BUTTONS.CANCEL\n};\n\n//-----------------------\n//Вспомогательные функции\n//-----------------------\n\n//Рекурсивное добавление свойств элемента, получаемых из конфигурационных файлов\nconst addConfigChildProps = children => react__WEBPACK_IMPORTED_MODULE_0___default().Children.map(children, child => {\n if (! /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().isValidElement(child)) return child;\n const {\n children,\n ...restProps\n } = child.props;\n let configProps = {};\n if (child.type.name === \"P8PPanelsMenuGrid\") configProps = P8P_PANELS_MENU_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PTable\") configProps = P8P_TABLE_CONFIG_PROPS;\n if (child.type.name === \"P8PDataGrid\") configProps = P8P_DATA_GRID_CONFIG_PROPS;\n if (child.type.name === \"P8PGantt\") configProps = P8P_GANTT_CONFIG_PROPS;\n if (child.type.name === \"P8PCyclogram\") configProps = P8P_CYCLOGRAM_CONFIG_PROPS;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(child.type, {\n ...configProps,\n ...restProps\n }, addConfigChildProps(children));\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Обёртка для компонента \"Меню панелей (табличное)\" (P8PPanelsMenuGrid)\nconst P8PPanelsMenuGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_panels_menu__WEBPACK_IMPORTED_MODULE_3__.P8PPanelsMenuGrid, _extends({}, P8P_PANELS_MENU_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Рабочее пространство\" (P8PAppWorkspace)\nconst P8PAppWorkspaceConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.P8PAppWorkspace, _extends({}, P8P_APP_WORKSPACE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица\" (P8PTable)\nconst P8PTableConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_table__WEBPACK_IMPORTED_MODULE_5__.P8PTable, _extends({}, P8P_TABLE_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Таблица данных\" (P8PDataGrid)\nconst P8PDataGridConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, P8P_DATA_GRID_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Диаграмма Ганта\" (P8PGantt)\nconst P8PGanttConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Обёртка для компонента \"Циклограмма\" (P8PCyclogram)\nconst P8PCyclogramConfigWrapped = (props = {}) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_cyclogram__WEBPACK_IMPORTED_MODULE_8__.P8PCyclogram, _extends({}, P8P_GANTT_CONFIG_PROPS, props));\n\n//Универсальный элемент-обёртка в параметры конфигурации\nconst ConfigWrapper = ({\n children\n}) => addConfigChildProps(children);\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/config_wrapper.js?"); /***/ }), @@ -4635,7 +4646,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ApplicationContext: () => (/* binding */ ApplicationContext),\n/* harmony export */ \"ApplicationСtx\": () => (/* binding */ ApplicationСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _application_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./application_reducer */ \"./app/context/application_reducer.js\");\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/context/backend.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Редьюсер состояния\n //Контекст отображения сообщений\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Клиентский API \"ПАРУС 8 Онлайн\"\nconst P8O_API = window.top?.parus?.clientApi;\n\n//Структура объекта с описанием ошибок\nconst APPLICATION_CONTEXT_ERRORS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n P8O_API_UNAVAILABLE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст приложения\nconst ApplicationСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста приложения\nconst ApplicationContext = ({\n errors,\n displaySizeGetter,\n guidGenerator,\n config,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_application_reducer__WEBPACK_IMPORTED_MODULE_1__.applicationReducer, (0,_application_reducer__WEBPACK_IMPORTED_MODULE_1__.INITIAL_STATE)(displaySizeGetter));\n\n //Подключение к контексту взаимодействия с сервером\n const {\n getConfig,\n getRespPayload\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту отображения сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Установка флага инициализированности приложения\n const setInitialized = () => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_INITIALIZED\n });\n\n //Установка текущего размера экрана\n const setDisplaySize = displaySize => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_DISPLAY_SIZE,\n payload: displaySize\n });\n\n //Установка базового URL приложения\n const setUrlBase = urlBase => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_URL_BASE,\n payload: urlBase\n });\n\n //Установка списка панелей\n const setPanels = panels => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.LOAD_PANELS,\n payload: panels\n });\n\n //Поиск раздела по имени\n const findPanelByName = name => state.panels.find(panel => panel.name == name);\n\n //Отображение закладки \"ПАРУС 8 Онлайн\" с указанным URL\n const pOnlineShowTab = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n url,\n caption,\n onClose\n }) => {\n if (P8O_API) {\n const _id = id || guidGenerator();\n P8O_API.ui.openTab({\n id: _id,\n url,\n caption,\n onClose: () => onClose ? onClose(_id) : null\n });\n return _id;\n } else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение раздела \"ПАРУС 8 Онлайн\"\n const pOnlineShowUnit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение документа \"ПАРУС 8 Онлайн\"\n const pOnlineShowDocument = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n document,\n showMethod = \"main\",\n inRnParameter = \"in_RN\"\n }) => {\n if (P8O_API) P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение словаря \"ПАРУС 8 Онлайн\"\n const pOnlineShowDictionary = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.openDictionary({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательской процедуры \"ПАРУС 8 Онлайн\"\n const pOnlineUserProcedure = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.performUserProcedureSync({\n code,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательского отчёта \"ПАРУС 8 Онлайн\"\n const pOnlineUserReport = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.performUserReport({\n code,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Получение количества записей на странице\n const configSystemPageSize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);\n\n //Получение базового URL приложения\n const configUrlBase = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => state.urlBase, [state.urlBase]);\n\n //Инициализация приложения\n const initApp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Читаем конфигурацию с сервера\n let res = await getConfig();\n //Сохраняем базовый URL приложения\n setUrlBase(getRespPayload(res)?.Panels?.urlBase);\n //Сохраняем список панелей\n setPanels(getRespPayload(res)?.Panels?.Panel);\n //Установим флаг завершения инициализации\n setInitialized();\n }, [getConfig, getRespPayload]);\n\n //Обработка подключения контекста к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!state.initialized) {\n //Слушаем изменение размеров окна\n window.addEventListener(\"resize\", () => {\n if (displaySizeGetter) setDisplaySize(displaySizeGetter());\n });\n //Инициализируем приложение\n initApp();\n }\n }, [state.initialized, initApp, displaySizeGetter]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ApplicationСtx.Provider, {\n value: {\n findPanelByName,\n pOnlineShowTab,\n pOnlineShowUnit,\n pOnlineShowDocument,\n pOnlineShowDictionary,\n pOnlineUserProcedure,\n pOnlineUserReport,\n configSystemPageSize,\n configUrlBase,\n appState: state\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста приложения\nApplicationContext.propTypes = {\n errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,\n displaySizeGetter: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func),\n guidGenerator: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired,\n config: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object).isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ApplicationContext: () => (/* binding */ ApplicationContext),\n/* harmony export */ \"ApplicationСtx\": () => (/* binding */ ApplicationСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _application_reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./application_reducer */ \"./app/context/application_reducer.js\");\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ \"./app/context/backend.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Приложение\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Редьюсер состояния\n //Контекст отображения сообщений\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Клиентский API \"ПАРУС 8 Онлайн\"\nconst P8O_API = window.top?.parus?.clientApi;\n\n//Структура объекта с описанием ошибок\nconst APPLICATION_CONTEXT_ERRORS_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_4___default().shape({\n P8O_API_UNAVAILABLE: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired,\n P8O_API_UNSUPPORTED: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().string).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст приложения\nconst ApplicationСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста приложения\nconst ApplicationContext = ({\n errors,\n displaySizeGetter,\n guidGenerator,\n config,\n children\n}) => {\n //Подключим редьюсер состояния\n const [state, dispatch] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(_application_reducer__WEBPACK_IMPORTED_MODULE_1__.applicationReducer, (0,_application_reducer__WEBPACK_IMPORTED_MODULE_1__.INITIAL_STATE)(displaySizeGetter));\n\n //Подключение к контексту взаимодействия с сервером\n const {\n getConfig,\n getRespPayload\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту отображения сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Установка флага инициализированности приложения\n const setInitialized = () => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_INITIALIZED\n });\n\n //Установка текущего размера экрана\n const setDisplaySize = displaySize => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_DISPLAY_SIZE,\n payload: displaySize\n });\n\n //Установка базового URL приложения\n const setUrlBase = urlBase => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.SET_URL_BASE,\n payload: urlBase\n });\n\n //Установка списка панелей\n const setPanels = panels => dispatch({\n type: _application_reducer__WEBPACK_IMPORTED_MODULE_1__.APP_AT.LOAD_PANELS,\n payload: panels\n });\n\n //Поиск раздела по имени\n const findPanelByName = name => state.panels.find(panel => panel.name == name);\n\n //Отображение закладки \"ПАРУС 8 Онлайн\" с указанным URL\n const pOnlineShowTab = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n id,\n url,\n caption,\n onClose\n }) => {\n if (P8O_API) {\n const _id = id || guidGenerator();\n P8O_API.ui.openTab({\n id: _id,\n url,\n caption,\n onClose: () => onClose ? onClose(_id) : null\n });\n return _id;\n } else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, guidGenerator, errors.P8O_API_UNAVAILABLE]);\n\n //Отображение раздела \"ПАРУС 8 Онлайн\"\n const pOnlineShowUnit = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n modal = true\n }) => {\n if (P8O_API) modal ? P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }) : P8O_API.fn.openDocument ? P8O_API.fn.openDocument({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }) : showMsgErr(errors.P8O_API_UNSUPPORTED);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED]);\n\n //Отображение документа \"ПАРУС 8 Онлайн\"\n const pOnlineShowDocument = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n document,\n showMethod = \"main\",\n inRnParameter = \"in_RN\",\n modal = true\n }) => {\n if (P8O_API) modal ? P8O_API.fn.openDocumentModal({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n }) : P8O_API.fn.openDocument ? P8O_API.fn.openDocument({\n unitcode: unitCode,\n method: showMethod,\n inputParameters: [{\n name: inRnParameter,\n value: document\n }]\n }) : showMsgErr(errors.P8O_API_UNSUPPORTED);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE, errors.P8O_API_UNSUPPORTED]);\n\n //Отображение словаря \"ПАРУС 8 Онлайн\"\n const pOnlineShowDictionary = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n unitCode,\n showMethod = \"main\",\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.openDictionary({\n unitcode: unitCode,\n method: showMethod,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательской процедуры \"ПАРУС 8 Онлайн\"\n const pOnlineUserProcedure = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters,\n callBack\n }) => {\n if (P8O_API) P8O_API.fn.performUserProcedureSync({\n code,\n inputParameters\n }, res => callBack ? callBack(res) : null);else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Исполнение пользовательского отчёта \"ПАРУС 8 Онлайн\"\n const pOnlineUserReport = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(({\n code,\n inputParameters\n }) => {\n if (P8O_API) P8O_API.fn.performUserReport({\n code,\n inputParameters\n });else showMsgErr(errors.P8O_API_UNAVAILABLE);\n }, [showMsgErr, errors.P8O_API_UNAVAILABLE]);\n\n //Получение количества записей на странице\n const configSystemPageSize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => config.SYSTEM.PAGE_SIZE, [config.SYSTEM.PAGE_SIZE]);\n\n //Получение базового URL приложения\n const configUrlBase = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => state.urlBase, [state.urlBase]);\n\n //Инициализация приложения\n const initApp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Читаем конфигурацию с сервера\n let res = await getConfig();\n //Сохраняем базовый URL приложения\n setUrlBase(getRespPayload(res)?.Panels?.urlBase);\n //Сохраняем список панелей\n setPanels(getRespPayload(res)?.Panels?.Panel);\n //Установим флаг завершения инициализации\n setInitialized();\n }, [getConfig, getRespPayload]);\n\n //Обработка подключения контекста к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!state.initialized) {\n //Слушаем изменение размеров окна\n window.addEventListener(\"resize\", () => {\n if (displaySizeGetter) setDisplaySize(displaySizeGetter());\n });\n //Инициализируем приложение\n initApp();\n }\n }, [state.initialized, initApp, displaySizeGetter]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ApplicationСtx.Provider, {\n value: {\n findPanelByName,\n pOnlineShowTab,\n pOnlineShowUnit,\n pOnlineShowDocument,\n pOnlineShowDictionary,\n pOnlineUserProcedure,\n pOnlineUserReport,\n configSystemPageSize,\n configUrlBase,\n appState: state\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста приложения\nApplicationContext.propTypes = {\n errors: APPLICATION_CONTEXT_ERRORS_SHAPE.isRequired,\n displaySizeGetter: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func),\n guidGenerator: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().func).isRequired,\n config: (prop_types__WEBPACK_IMPORTED_MODULE_4___default().object).isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_4___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_4___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/application.js?"); /***/ }), @@ -4712,7 +4723,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML),\n/* harmony export */ xml2JSON: () => (/* binding */ xml2JSON)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XROWS\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF\", \"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values\", \"XRESPOND.XPAYLOAD.XGROUPS\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS\", \"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\"];\n\n//Типовые шаблоны конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATH_PATTERNS = [/(.*)XROWS$/, /(.*)XCOLUMNS_DEF$/, /(.*)XCOLUMNS_DEF.values$/, /(.*)XGROUPS$/, /(.*)XGANTT_DEF.taskAttributes$/, /(.*)XGANTT_DEF.taskColors$/, /(.*)XGANTT_TASKS$/, /(.*)XGANTT_TASKS.dependencies$/, /(.*)XCHART.labels$/, /(.*)XCHART.datasets$/, /(.*)XCHART.datasets.data$/, /(.*)XCHART.datasets.items$/];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//Типовые шаблоны конвертации значения атрибута в строку (при переводе XML -> JSON)\nconst XML_ATTR_ALWAYS_STR_PATH_PATTERNS = [/(.*)XCOLUMNS_DEF.name$/, /(.*)XCOLUMNS_DEF.caption$/, /(.*)XCOLUMNS_DEF.parent$/, /(.*)XGROUPS.name$/, /(.*)XGROUPS.caption$/];\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n //onOrderChanged({ orders: btoa(ordersBuilder.build(newOrders)) });\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Конвертация XML в JSON\nconst xml2JSON = ({\n xmlDoc,\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n useDefaultPatterns = true\n}) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (useDefaultPatterns) {\n opts.isArray = (name, jPath, isLeafNode, isAttribute) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || XML_ALWAYS_ARRAY_PATH_PATTERNS.some(pattern => pattern.test(jPath)) || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath, isLeafNode, isAttribute) : undefined);\n opts.attributeValueProcessor = (name, val, jPath) => XML_ATTR_ALWAYS_STR_PATH_PATTERNS.some(pattern => pattern.test(`${jPath}.${name}`)) ? undefined : attributeValueProcessor ? attributeValueProcessor(name, val, jPath) : val;\n } else {\n if (isArray) opts.isArray = isArray;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n }\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deepCopyObject: () => (/* binding */ deepCopyObject),\n/* harmony export */ formatDateJSONDateOnly: () => (/* binding */ formatDateJSONDateOnly),\n/* harmony export */ formatDateRF: () => (/* binding */ formatDateRF),\n/* harmony export */ formatDateTimeRF: () => (/* binding */ formatDateTimeRF),\n/* harmony export */ formatNumberRFCurrency: () => (/* binding */ formatNumberRFCurrency),\n/* harmony export */ genGUID: () => (/* binding */ genGUID),\n/* harmony export */ getDisplaySize: () => (/* binding */ getDisplaySize),\n/* harmony export */ hasValue: () => (/* binding */ hasValue),\n/* harmony export */ object2Base64XML: () => (/* binding */ object2Base64XML),\n/* harmony export */ xml2JSON: () => (/* binding */ xml2JSON)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Вспомогательные функции\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n\n//---------\n//Константы\n//---------\n\n//Коды типовых размеров экранов\nconst DISPLAY_SIZE_CODE = {\n XS: \"XS\",\n //eXtra Small - супер маленький экран\n SM: \"SM\",\n //Small - маленький экран\n MD: \"MD\",\n //Middle - средний экран\n LG: \"LG\" //Large - большой экран\n};\n\n//Типовые размеры экранов\nconst DISPLAY_SIZE = {\n [DISPLAY_SIZE_CODE.XS]: {\n WIDTH_FROM: 0,\n WIDTH_TO: 767\n },\n //eXtra Small - супер маленький экран < 768px\n [DISPLAY_SIZE_CODE.SM]: {\n WIDTH_FROM: 768,\n WIDTH_TO: 991\n },\n //Small - маленький экран >= 768px\n [DISPLAY_SIZE_CODE.MD]: {\n WIDTH_FROM: 992,\n WIDTH_TO: 1199\n },\n //Middle - средний экран >= 992px\n [DISPLAY_SIZE_CODE.LG]: {\n WIDTH_FROM: 1200,\n WIDTH_TO: 1000000\n } //Large - большой экран >= 1200px\n};\n\n//Типовые пути конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATHS = [\"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS\", \"XRESPOND.XPAYLOAD.XDATA_GRID.rows\", \"XRESPOND.XPAYLOAD.XDATA_GRID.columnsDef\", \"XRESPOND.XPAYLOAD.XDATA_GRID.columnsDef.values\", \"XRESPOND.XPAYLOAD.XDATA_GRID.groups\", \"XRESPOND.XPAYLOAD.XGANTT.taskAttributes\", \"XRESPOND.XPAYLOAD.XGANTT.taskColors\", \"XRESPOND.XPAYLOAD.XGANTT.tasks\", \"XRESPOND.XPAYLOAD.XGANTT.tasks.dependencies\", \"XRESPOND.XPAYLOAD.XCHART.labels\", \"XRESPOND.XPAYLOAD.XCHART.datasets\", \"XRESPOND.XPAYLOAD.XCHART.datasets.data\", \"XRESPOND.XPAYLOAD.XCHART.datasets.items\", \"XRESPOND.XPAYLOAD.XCYCLOGRAM.taskAttributes\", \"XRESPOND.XPAYLOAD.XCYCLOGRAM.columns\", \"XRESPOND.XPAYLOAD.XCYCLOGRAM.groups\", \"XRESPOND.XPAYLOAD.XCYCLOGRAM.tasks\"];\n\n//Типовые шаблоны конвертации в массив (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_PATH_PATTERNS = [/(.*)XDATA_GRID.rows$/, /(.*)XDATA_GRID.columnsDef$/, /(.*)XDATA_GRID.columnsDef.values$/, /(.*)XDATA_GRID.groups$/, /(.*)XGANTT.taskAttributes$/, /(.*)XGANTT.taskColors$/, /(.*)XGANTT.tasks$/, /(.*)XGANTT.tasks.dependencies$/, /(.*)XCHART.labels$/, /(.*)XCHART.datasets$/, /(.*)XCHART.datasets.data$/, /(.*)XCHART.datasets.items$/, /(.*)XCYCLOGRAM.taskAttributes$/, /(.*)XCYCLOGRAM.columns$/, /(.*)XCYCLOGRAM.groups$/, /(.*)XCYCLOGRAM.tasks$/];\n\n//Типовой постфикс тега для массива (при переводе XML -> JSON)\nconst XML_ALWAYS_ARRAY_POSTFIX = \"__SYSTEM__ARRAY__\";\n\n//Типовые шаблоны конвертации значения атрибута в строку (при переводе XML -> JSON)\nconst XML_ATTR_ALWAYS_STR_PATH_PATTERNS = [/(.*)XDATA_GRID.columnsDef.name$/, /(.*)XDATA_GRID.columnsDef.caption$/, /(.*)XDATA_GRID.columnsDef.parent$/, /(.*)XDATA_GRID.groups.name$/, /(.*)XDATA_GRID.groups.caption$/, /(.*)XCYCLOGRAM.columns.name$/, /(.*)XCYCLOGRAM.groups.name$/];\n\n//-----------\n//Тело модуля\n//-----------\n\n//Проверка существования значения\nconst hasValue = value => typeof value !== \"undefined\" && value !== null && value !== \"\";\n\n//Проверка типа устройства\nconst getDisplaySize = () => {\n let res = DISPLAY_SIZE_CODE.MD;\n Object.keys(DISPLAY_SIZE).map(dspl => {\n if (window.innerWidth >= DISPLAY_SIZE[dspl].WIDTH_FROM && window.innerWidth <= DISPLAY_SIZE[dspl].WIDTH_TO) res = dspl;\n });\n return res;\n};\n\n//Глубокое копирование объекта\nconst deepCopyObject = obj => JSON.parse(JSON.stringify(obj));\n\n//Конвертация объекта в Base64 XML\nconst object2Base64XML = (obj, builderOptions) => {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder(builderOptions);\n return btoa(unescape(encodeURIComponent(builder.build(obj))));\n};\n\n//Конвертация XML в JSON\nconst xml2JSON = ({\n xmlDoc,\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n useDefaultPatterns = true\n}) => {\n return new Promise((resolve, reject) => {\n try {\n let opts = {\n ignoreDeclaration: true,\n ignoreAttributes: false,\n parseAttributeValue: true,\n attributeNamePrefix: \"\"\n };\n if (useDefaultPatterns) {\n opts.isArray = (name, jPath, isLeafNode, isAttribute) => XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || XML_ALWAYS_ARRAY_PATH_PATTERNS.some(pattern => pattern.test(jPath)) || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath, isLeafNode, isAttribute) : undefined);\n opts.attributeValueProcessor = (name, val, jPath) => XML_ATTR_ALWAYS_STR_PATH_PATTERNS.some(pattern => pattern.test(`${jPath}.${name}`)) ? undefined : attributeValueProcessor ? attributeValueProcessor(name, val, jPath) : val;\n } else {\n if (isArray) opts.isArray = isArray;\n if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;\n }\n if (transformTagName) opts.transformTagName = transformTagName;\n if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;\n const parser = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLParser(opts);\n resolve(parser.parse(xmlDoc));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Форматирование даты в формат РФ\nconst formatDateRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY\") : null;\n\n//Форматирование даты и времени в формат РФ\nconst formatDateTimeRF = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"DD.MM.YYYY HH:mm:ss\") : null;\n\n//Форматирование даты в формат JSON (только дата, без времени)\nconst formatDateJSONDateOnly = value => value ? dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DD\") : null;\n\n//Форматирование числа в \"Денежном\" формате РФ\nconst formatNumberRFCurrency = value => hasValue(value) ? new Intl.NumberFormat(\"ru-RU\", {\n minimumFractionDigits: 2\n}).format(value) : null;\n\n//Формирование уникального идентификатора\nconst genGUID = () => \"10000000-1000-4000-8000-100000000000\".replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/utils.js?"); /***/ }), @@ -4756,7 +4767,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./filter */ \"./app/panels/eqs_prfrm/filter.js\");\n/* harmony import */ var _filter_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./filter_dialog */ \"./app/panels/eqs_prfrm/filter_dialog.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./hooks */ \"./app/panels/eqs_prfrm/hooks.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Дополнительная разметка и вёрстка клиентских элементов\n //Тектовые ресурсы и константы\n //Компонент фильтра\n //Компонент диалогового окна фильтра отбора\n //Пользовательские хуки\n\n//---------\n//Константы\n//---------\n\n//Высота меню Парус (пиксели)\nconst pxOuterMenuH = 53;\n//Высота заголовка панели (пиксели)\nconst pxPanelHeaderH = 64;\n//Минимальная ширина таблицы (пиксели)\nconst minGridW = 800;\n//Минимальная высота таблицы (пиксели)\nconst minGridH = 200;\n\n//Стили\nconst STYLES = {\n BOX_ROW: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n GRID_PADDING: {\n paddingTop: 1,\n paddingBottom: 1\n },\n GRID_SIZES: (width, height) => ({\n padding: \"0px\",\n minWidth: minGridW,\n maxWidth: width * 0.975 > minGridW ? width * 0.975 : minGridW,\n minHeight: minGridH,\n maxHeight: (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 > minGridH ? (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 : minGridH\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n fixedHeader: false,\n fixedColumns: 0,\n reload: false\n });\n\n //Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n isOpen: false,\n isDefault: false,\n isSetByUser: false,\n needSave: false,\n values: {\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n }\n });\n\n //Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n\n //Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ,\n SRESPDEP: filter.values.respDep,\n NFROMMONTH: filter.values.fromMonth,\n NFROMYEAR: filter.values.fromYear,\n NTOMONTH: filter.values.toMonth,\n NTOYEAR: filter.values.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XROWS != null) {\n data.XROWS.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //Загрузка значений фильтра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n values: {\n ...pv.values,\n belong: data.JURPERS,\n fromMonth: 1,\n fromYear: data.YEAR,\n toMonth: 12,\n toYear: data.YEAR\n },\n isDefault: true\n }));\n }, [executeStored]);\n\n //Загрузка значений фильтра из локального хранилища браузера\n const loadLocalFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n let vs = filter.values;\n Object.keys(vs).map(function (k) {\n vs[k] = k == \"fromMonth\" || k == \"fromYear\" || k == \"toMonth\" || k == \"toYear\" ? Number(localStorage.getItem(k)) : localStorage.getItem(k);\n });\n setFilter(pv => ({\n ...pv,\n isDefault: true,\n values: {\n ...vs\n }\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ ? filter.values.techServ : null,\n SRESPDEP: filter.values.respDep ? filter.values.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n //Показать/скрыть фильтр\n const setFilterOpen = isOpen => setFilter(pv => ({\n ...pv,\n isOpen\n }));\n\n //Установить значение фильтра\n const setFilterValues = values => setFilter(pv => ({\n ...pv,\n isSetByUser: true,\n needSave: true,\n values: {\n ...values\n }\n }));\n\n //Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n //При изменении фильтра\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isSetByUser) setDataGrid({\n reload: true\n });\n }, [filter.isSetByUser, filter.values.belong, filter.values.prodObj, filter.values.techServ, filter.values.respDep, filter.values.fromMonth, filter.values.fromYear, filter.values.toMonth, filter.values.toYear]);\n\n //При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n //eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n\n //При закрытии панели\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n filter.needSave ? window.addEventListener(\"beforeunload\", function () {\n Object.keys(filter.values).map(function (k) {\n localStorage.setItem(k, filter.values[k]);\n });\n }) : null;\n }, [filter.needSave, filter.values]);\n\n //При загрузке фильтра по умолчанию\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isDefault) setFilterOpen(true);\n }, [filter.isDefault]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n localStorage.getItem(\"belong\") ? loadLocalFilter() : loadDefaultFilter();\n }, [loadDefaultFilter, loadLocalFilter]);\n\n //При открытии диалога фильтра\n const handleFilterClick = () => setFilterOpen(true);\n\n //При изменении фильтра в диалоге\n const handleFilterOk = filter => {\n setFilterValues(filter);\n setFilterOpen(false);\n };\n\n //При закрытии диалога фильтра\n const handleFilterCancel = () => setFilterOpen(false);\n\n //Состояние ширины и высоты рабочей области окна\n const [width, height] = (0,_hooks__WEBPACK_IMPORTED_MODULE_10__.useWindowResize)();\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, filter.isOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter_dialog__WEBPACK_IMPORTED_MODULE_9__.FilterDialog, {\n initial: filter.values,\n onOk: handleFilterOk,\n onCancel: handleFilterCancel\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter__WEBPACK_IMPORTED_MODULE_8__.Filter, {\n filter: filter.values,\n onClick: handleFilterClick\n }), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: {\n ...STYLES.GRID_PADDING,\n ...STYLES.BOX_ROW\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n style: {\n ...STYLES.GRID_SIZES(width, height)\n }\n },\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, width * 0.2, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n }))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ EqsPrfrm: () => (/* binding */ EqsPrfrm)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./layouts */ \"./app/panels/eqs_prfrm/layouts.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./filter */ \"./app/panels/eqs_prfrm/filter.js\");\n/* harmony import */ var _filter_dialog__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./filter_dialog */ \"./app/panels/eqs_prfrm/filter_dialog.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./hooks */ \"./app/panels/eqs_prfrm/hooks.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ТОиР - Выполнение работ\r\n Панель мониторинга: Корневая панель выполнения работ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Дополнительная разметка и вёрстка клиентских элементов\n //Тектовые ресурсы и константы\n //Компонент фильтра\n //Компонент диалогового окна фильтра отбора\n //Пользовательские хуки\n\n//---------\n//Константы\n//---------\n\n//Высота меню Парус (пиксели)\nconst pxOuterMenuH = 53;\n//Высота заголовка панели (пиксели)\nconst pxPanelHeaderH = 64;\n//Минимальная ширина таблицы (пиксели)\nconst minGridW = 800;\n//Минимальная высота таблицы (пиксели)\nconst minGridH = 200;\n\n//Стили\nconst STYLES = {\n BOX_ROW: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n },\n GRID_PADDING: {\n paddingTop: 1,\n paddingBottom: 1\n },\n GRID_SIZES: (width, height) => ({\n padding: \"0px\",\n minWidth: minGridW,\n maxWidth: width * 0.975 > minGridW ? width * 0.975 : minGridW,\n minHeight: minGridH,\n maxHeight: (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 > minGridH ? (height - pxOuterMenuH - pxPanelHeaderH) * 0.975 : minGridH\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выполнения работ\nconst EqsPrfrm = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n fixedHeader: false,\n fixedColumns: 0,\n reload: false\n });\n\n //Состояние фильтра\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n isOpen: false,\n isDefault: false,\n isSetByUser: false,\n needSave: false,\n values: {\n belong: \"\",\n prodObj: \"\",\n techServ: \"\",\n respDep: \"\",\n fromMonth: 1,\n fromYear: 1990,\n toMonth: 1,\n toYear: 1990\n }\n });\n\n //Состояние ячейки заголовка даты (по раскрытию/скрытию)\n const [activeRef, setActiveRef] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)();\n\n //Состояние актуальности ссылки на ячейку\n const [refIsDeprecated, setRidFlag] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_4__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_3__[\"BackEndСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_5__[\"MessagingСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ,\n SRESPDEP: filter.values.respDep,\n NFROMMONTH: filter.values.fromMonth,\n NFROMYEAR: filter.values.fromYear,\n NTOMONTH: filter.values.toMonth,\n NTOYEAR: filter.values.toYear\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"caption\", \"name\", \"parent\"].includes(name) ? undefined : val\n });\n let cP = 0;\n let sP = 0;\n let cF = 0;\n let sF = 0;\n let properties = [];\n if (data.XDATA_GRID.rows != null) {\n data.XDATA_GRID.rows.map(row => {\n properties = [];\n Object.entries(row).forEach(([key, value]) => properties.push({\n name: key,\n data: value\n }));\n let info2 = properties.find(element => {\n return element.name === \"SINFO2\";\n });\n if (info2 != undefined) {\n if (info2.data == \"План\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cP = cP + 1;\n });\n } else if (info2.data == \"Факт\") {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.DAY_NAME_REG_EXP.test(p.name)) cF = cF + 1;\n });\n }\n } else {\n properties.map(p => {\n if (_layouts__WEBPACK_IMPORTED_MODULE_6__.MONTH_NAME_REG_EXP.test(p.name)) {\n let str = p.data;\n let m = [];\n let i = 0;\n while ((m = _layouts__WEBPACK_IMPORTED_MODULE_6__.DIGITS_REG_EXP.exec(str)) != null) {\n if (i == 0) sP = sP + Number(m[0].replace(\",\", \".\"));else {\n sF = sF + Number(m[0].replace(\",\", \".\"));\n }\n i++;\n }\n }\n });\n }\n });\n }\n setDataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: [...(data.XDATA_GRID.rows || [])],\n groups: [...(data.XDATA_GRID.groups || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, filter, executeStored]);\n\n //Загрузка значений фильтра по умолчанию\n const loadDefaultFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP\",\n respArg: \"COUT\"\n });\n setFilter(pv => ({\n ...pv,\n values: {\n ...pv.values,\n belong: data.JURPERS,\n fromMonth: 1,\n fromYear: data.YEAR,\n toMonth: 12,\n toYear: data.YEAR\n },\n isDefault: true\n }));\n }, [executeStored]);\n\n //Загрузка значений фильтра из локального хранилища браузера\n const loadLocalFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n let vs = filter.values;\n Object.keys(vs).map(function (k) {\n vs[k] = k == \"fromMonth\" || k == \"fromYear\" || k == \"toMonth\" || k == \"toYear\" ? Number(localStorage.getItem(k)) : localStorage.getItem(k);\n });\n setFilter(pv => ({\n ...pv,\n isDefault: true,\n values: {\n ...vs\n }\n }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Отбор документа (ТОиР или Ремонтных ведомостей) по ячейке даты\n const showEquipSrv = async ({\n date,\n workType,\n info\n }) => {\n const [techName, servKind] = info.split(\"_\");\n let type;\n if (workType == \"План\") type = 0;else type = 1;\n let [year, month, day] = date.substring(1).split(\"_\");\n const data = await executeStored({\n stored: \"PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV\",\n args: {\n SBELONG: filter.values.belong,\n SPRODOBJ: filter.values.prodObj,\n STECHSERV: filter.values.techServ ? filter.values.techServ : null,\n SRESPDEP: filter.values.respDep ? filter.values.respDep : null,\n STECHNAME: techName,\n SSRVKIND: servKind,\n NYEAR: Number(year),\n NMONTH: Number(month),\n NDAY: day ? Number(day) : null,\n NWORKTYPE: type\n }\n });\n if (data.NIDENT) {\n if (type == 0) pOnlineShowUnit({\n unitCode: \"EquipTechServices\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else pOnlineShowUnit({\n unitCode: \"EquipRepairSheets\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_7__.TEXTS.NO_DATA_FOUND);\n };\n\n //Показать/скрыть фильтр\n const setFilterOpen = isOpen => setFilter(pv => ({\n ...pv,\n isOpen\n }));\n\n //Установить значение фильтра\n const setFilterValues = values => setFilter(pv => ({\n ...pv,\n isSetByUser: true,\n needSave: true,\n values: {\n ...values\n }\n }));\n\n //Отработка события скрытия/раскрытия ячейки даты\n const handleClick = (e, ref) => {\n const curCell = ref.current;\n if (e.target.type == \"button\" || e.target.offsetParent.type == \"button\") {\n setActiveRef(curCell);\n setRidFlag(false);\n }\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [loadData, dataGrid.reload]);\n\n //При изменении фильтра\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isSetByUser) setDataGrid({\n reload: true\n });\n }, [filter.isSetByUser, filter.values.belong, filter.values.prodObj, filter.values.techServ, filter.values.respDep, filter.values.fromMonth, filter.values.fromYear, filter.values.toMonth, filter.values.toYear]);\n\n //При нажатии скрытии/раскрытии ячейки даты, фокус на неё\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (!refIsDeprecated) {\n if (activeRef) {\n var cellRect = activeRef.getBoundingClientRect();\n window.scrollTo(window.scrollX + cellRect.left + activeRef.clientWidth / 2 - window.innerWidth / 2, 0);\n setRidFlag(true);\n }\n }\n //eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refIsDeprecated]);\n\n //При закрытии панели\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n filter.needSave ? window.addEventListener(\"beforeunload\", function () {\n Object.keys(filter.values).map(function (k) {\n localStorage.setItem(k, filter.values[k]);\n });\n }) : null;\n }, [filter.needSave, filter.values]);\n\n //При загрузке фильтра по умолчанию\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.isDefault) setFilterOpen(true);\n }, [filter.isDefault]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n localStorage.getItem(\"belong\") ? loadLocalFilter() : loadDefaultFilter();\n }, [loadDefaultFilter, loadLocalFilter]);\n\n //При открытии диалога фильтра\n const handleFilterClick = () => setFilterOpen(true);\n\n //При изменении фильтра в диалоге\n const handleFilterOk = filter => {\n setFilterValues(filter);\n setFilterOpen(false);\n };\n\n //При закрытии диалога фильтра\n const handleFilterCancel = () => setFilterOpen(false);\n\n //Состояние ширины и высоты рабочей области окна\n const [width, height] = (0,_hooks__WEBPACK_IMPORTED_MODULE_10__.useWindowResize)();\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, filter.isOpen ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter_dialog__WEBPACK_IMPORTED_MODULE_9__.FilterDialog, {\n initial: filter.values,\n onOk: handleFilterOk,\n onCancel: handleFilterCancel\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_filter__WEBPACK_IMPORTED_MODULE_8__.Filter, {\n filter: filter.values,\n onClick: handleFilterClick\n }), dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: {\n ...STYLES.GRID_PADDING,\n ...STYLES.BOX_ROW\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n style: {\n ...STYLES.GRID_SIZES(width, height)\n }\n },\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n headCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.headCellRender)({\n ...prms\n }, handleClick),\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.dataCellRender)({\n ...prms\n }, width * 0.2, showEquipSrv),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_6__.groupCellRender)({\n ...prms\n }),\n showCellRightBorder: true\n }))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/eqs_prfrm/eqs_prfrm.js?"); /***/ }), @@ -4833,7 +4844,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PlanSpecDetail: () => (/* binding */ PlanSpecDetail)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CircularProgress/CircularProgress.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../components/p8p_svg */ \"./app/components/p8p_svg.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../hooks */ \"./app/panels/mech_rec_assembly_mon/hooks.js\");\n/* harmony import */ var _progress_box__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./progress_box */ \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Панель мониторинга: Детализация по объекту\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Таблица данных\n //Интерактивные изображения\n //Подключение компонентов к настройкам приложения\n //Вспомогательные хуки\n //Информация по прогрессу объекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n BOX_INFO_MAIN: {\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"35vh\",\n backgroundColor: \"background.detail_table\"\n },\n BOX_INFO_SUB: isMessage => ({\n overflow: \"hidden\",\n textAlign: \"center\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: isMessage ? \"center\" : \"flex-start\",\n paddingLeft: \"5px\",\n paddingRight: \"5px\",\n ...(isMessage ? {\n padding: \"5px\"\n } : {\n paddingTop: \"10px\"\n })\n }),\n DETAIL_INFO: {\n display: \"flex\",\n justifyContent: \"space-around\",\n alignItems: \"center\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"17vh\",\n backgroundColor: \"background.detail_info\"\n },\n PRODUCT_SELECTOR_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"53vh\",\n marginTop: \"16px\",\n backgroundColor: \"background.product_selector\"\n },\n PRODUCT_SELECTOR_MODEL: {\n width: \"70%\"\n },\n PLAN_INFO_MAIN: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\"\n },\n PLAN_INFO_SUB: {\n display: \"flex\",\n justifyContent: \"space-between\",\n width: \"280px\",\n borderBottom: \"1px solid\"\n },\n TABLE_DETAILS: {\n backgroundColor: \"background.detail_table\",\n height: \"240px\"\n },\n TABLE_DETAILS_HEADER_CELL: maxWidth => ({\n backgroundColor: \"background.detail_table\",\n color: \"text.detail_table.fontColor\",\n padding: \"2px 2px\",\n fontSize: \"11px\",\n textAlign: \"center\",\n lineHeight: \"1rem\",\n ...(maxWidth ? {\n maxWidth\n } : {})\n }),\n TABLE_DETAILS_DATA_CELL: textAlign => ({\n backgroundColor: \"background.detail_table\",\n color: \"text.detail_table.fontColor\",\n padding: \"2px 2px\",\n fontSize: \"11px\",\n ...(textAlign ? {\n textAlign\n } : {})\n }),\n TABLE_DETAILS_MORE_BUTTON: {\n borderRadius: \"25px\",\n height: \"20px\",\n color: \"text.more_button.fontColor\"\n },\n TABLE_DETAILS_TEXT: {\n color: \"text.detail_table.fontColor\"\n },\n CARD_DETAILS_CONTAINER: {\n minWidth: \"1200px\",\n maxWidth: \"1400px\"\n },\n CARD_DETAILS_NAVIGATION_STACK: {\n width: \"100%\"\n },\n NAVIGATE_BUTTONS: {\n color: \"text.title.fontColor\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Информация о выпуске плана\nconst PlanSpecInfo = ({\n planSpec\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLAN_INFO_MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLAN_INFO_SUB\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"PlanSpecInfo\",\n mt: 1\n }, \"\\u041D\\u043E\\u043C\\u0435\\u0440 \\u0431\\u043E\\u0440\\u0442\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle2\"\n }, planSpec.SNUMB)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLAN_INFO_SUB\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"PlanSpecInfo\",\n mt: 1\n }, \"\\u0413\\u043E\\u0434 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle2\"\n }, planSpec.NYEAR))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_progress_box__WEBPACK_IMPORTED_MODULE_5__.ProgressBox, {\n progress: planSpec.NPROGRESS,\n detail: planSpec.SDETAIL,\n width: \"110px\",\n height: \"110px\",\n progressVariant: \"subtitle2\",\n detailVariant: \"body3\"\n }));\n};\n\n//Контроль свойств - Информация о спецификации плана\nPlanSpecInfo.propTypes = {\n planSpec: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().object)\n};\n\n//Модель выпуска плана\nconst PlanSpecProductCompositionModel = ({\n model,\n products,\n onProductSelect\n}) => {\n //При выборе детали на модели\n const handleProductClick = ({\n item\n }) => {\n const product = products.find(p => p.SMODEL_ID == item.id);\n if (product && onProductSelect) onProductSelect(product);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PRODUCT_SELECTOR_MODEL\n }, model ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_svg__WEBPACK_IMPORTED_MODULE_2__.P8PSVG, {\n data: atob(model),\n items: products.map(p => ({\n id: p.SMODEL_ID,\n backgroundColor: p.SMODEL_BG_COLOR || \"red\",\n desc: p.SNAME,\n title: p.SNAME\n })),\n fillOpacity: \"0.3\",\n onItemClick: handleProductClick\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle2\"\n }, \"\\u041C\\u043E\\u0434\\u0435\\u043B\\u044C \\u0438\\u0437\\u0434\\u0435\\u043B\\u0438\\u044F \\u043D\\u0435 \\u0437\\u0430\\u0433\\u0440\\u0443\\u0436\\u0435\\u043D\\u0430\")));\n};\n\n//Контроль свойств - Модель выпуска плана\nPlanSpecProductCompositionModel.propTypes = {\n model: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().any),\n products: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().array),\n onProductSelect: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func)\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => ({\n stackProps: {\n justifyContent: \"center\"\n },\n cellStyle: STYLES.TABLE_DETAILS_HEADER_CELL([\"NREMN_LABOUR\", \"NAPPLICABILITY\"].includes(columnDef.name) ? \"90px\" : [\"NDEFICIT\"].includes(columnDef.name) ? \"55px\" : null)\n});\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef\n}) => ({\n cellStyle: STYLES.TABLE_DETAILS_DATA_CELL([\"SOPERATION\", \"SNOMEN\"].includes(columnDef.name) ? null : \"center\"),\n data: row[columnDef]\n});\n\n//Таблица детализации изделия\nconst ProductDetailsTable = ({\n planSpec,\n product,\n stored,\n noProductMessage,\n noPlanSpecMessage,\n noDataFoundMessage,\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n planSpec: null,\n product: null,\n orders: null,\n pageNumber: 1\n });\n\n //Собственное состояние - данные таблицы\n const {\n data,\n isLoading\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useProductDetailsTable)(state.planSpec, state.product, state.orders, state.pageNumber, stored);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setState(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setState(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1\n }));\n\n //При изменении изделия\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setState(pv => ({\n ...pv,\n planSpec,\n product,\n orders: null,\n pageNumber: 1\n }));\n }, [product, planSpec]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.BOX_INFO_SUB(!product || data.rows.length === 0)\n }, !product ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"ProductDetailMessage\",\n sx: STYLES.TABLE_DETAILS_TEXT\n }, noProductMessage) : !planSpec ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"ProductDetailMessage\",\n sx: STYLES.TABLE_DETAILS_TEXT\n }, noPlanSpecMessage) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n direction: \"row\",\n spacing: 2,\n justifyContent: \"center\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n size: 18,\n sx: {\n opacity: isLoading ? 1 : 0\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"h4\",\n sx: STYLES.TABLE_DETAILS_TEXT\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, title))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n noDataFoundText: isLoading || !data.init ? \"\" : noDataFoundMessage,\n containerComponentProps: {\n sx: STYLES.TABLE_DETAILS,\n elevation: 0\n },\n columnsDef: data.columnsDef,\n rows: data.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: data.morePages,\n morePagesBtnProps: {\n sx: STYLES.TABLE_DETAILS_MORE_BUTTON\n },\n fixedHeader: true,\n reloading: false,\n dataCellRender: dataCellRender,\n headCellRender: headCellRender,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged\n }))));\n};\n\n//Контроль свойств - Таблица детализации изделия\nProductDetailsTable.propTypes = {\n planSpec: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number),\n product: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().number),\n stored: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n noProductMessage: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n noPlanSpecMessage: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n noDataFoundMessage: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация по объекту\nconst PlanSpecDetail = ({\n planSpec,\n disableNavigatePrev = false,\n disableNavigateNext = false,\n onNavigate,\n onBack\n}) => {\n //Собственное состояние - данные производственных составов SVG\n const [costProductComposition, setCostProductComposition] = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useCostProductComposition)(planSpec.NRN);\n\n //Выбор элемента изделия\n const setProduct = product => {\n setCostProductComposition(pv => ({\n ...pv,\n selectedProduct: product ? {\n ...product\n } : null\n }));\n };\n\n //При навигации между карточками\n const handleNavigate = direction => {\n setProduct(null);\n if (onNavigate) onNavigate(direction);\n };\n\n //Формируем представление\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n maxWidth: false,\n sx: STYLES.CARD_DETAILS_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n container: true,\n direction: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n spacing: 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n sx: STYLES.CARD_DETAILS_NAVIGATION_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n disabled: disableNavigatePrev,\n onClick: () => handleNavigate(-1)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.NAVIGATE_BUTTONS\n }, \"navigate_before\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n xs: 10\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n maxWidth: false\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: () => onBack ? onBack() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n direction: \"row\",\n color: \"text.title.fontColor\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, \"chevron_left\"), \"\\u041D\\u0430\\u0437\\u0430\\u0434\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n container: true,\n spacing: 2,\n sx: {\n paddingTop: \"5px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n xs: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.BOX_INFO_MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProductDetailsTable, {\n planSpec: costProductComposition.selectedProduct?.NFCPRODPLANSP_LINK,\n product: costProductComposition.selectedProduct?.NRN,\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DG_BY_LINKED_GET\",\n noProductMessage: \"Укажите элемент модели, чтобы увидеть информацию о маршрутных картах\",\n noPlanSpecMessage: \"Не определена связанная запись производственной программы\",\n noDataFoundMessage: \"Маршрутные карты не найдены\",\n title: \"Маршрутные карты\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.BOX_INFO_MAIN,\n mt: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProductDetailsTable, {\n planSpec: costProductComposition.selectedProduct?.NFCPRODPLANSP_LINK,\n product: costProductComposition.selectedProduct?.NRN,\n stored: \"PKG_P8PANELS_MECHREC.FCDELIVSH_DG_BY_LINKED_GET\",\n noProductMessage: \"Укажите элемент модели, чтобы увидеть информацию о комплектовочных ведомостях\",\n noPlanSpecMessage: \"Не определена связанная запись производственной программы\",\n noDataFoundMessage: \"Комплектовочные ведомости не найдены\",\n title: \"Дефицит комплектующих\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n xs: 7\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.DETAIL_INFO\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanSpecInfo, {\n planSpec: planSpec\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PRODUCT_SELECTOR_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanSpecProductCompositionModel, {\n model: costProductComposition.model,\n products: costProductComposition.products,\n onProductSelect: setProduct\n })))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n sx: STYLES.CARD_DETAILS_NAVIGATION_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n disabled: disableNavigateNext,\n onClick: () => handleNavigate(1)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n sx: STYLES.NAVIGATE_BUTTONS\n }, \"navigate_next\"))))));\n};\n\n//Контроль свойств - Детализация по объекту\nPlanSpecDetail.propTypes = {\n planSpec: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().object),\n disableNavigatePrev: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().bool),\n disableNavigateNext: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().bool),\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func),\n onBack: (prop_types__WEBPACK_IMPORTED_MODULE_8___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plan_detail.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PlanSpecDetail: () => (/* binding */ PlanSpecDetail)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CircularProgress/CircularProgress.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../components/p8p_svg */ \"./app/components/p8p_svg.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../hooks */ \"./app/panels/mech_rec_assembly_mon/hooks.js\");\n/* harmony import */ var _progress_box__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./progress_box */ \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../../app.styles */ \"./app.styles.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Панель мониторинга: Детализация по объекту\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Таблица данных\n //Интерактивные изображения\n //Подключение компонентов к настройкам приложения\n //Вспомогательные хуки\n //Информация по прогрессу объекта\n //Типовые стили\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n BOX_INFO_MAIN: {\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"35vh\",\n minHeight: \"250px\",\n backgroundColor: \"background.detail_table\"\n },\n BOX_INFO_SUB: isMessage => ({\n overflow: \"hidden\",\n textAlign: \"center\",\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: isMessage ? \"center\" : \"flex-start\",\n paddingLeft: \"5px\",\n paddingRight: \"5px\",\n ...(isMessage ? {\n padding: \"5px\"\n } : {\n paddingTop: \"10px\"\n })\n }),\n DETAIL_INFO: {\n display: \"flex\",\n justifyContent: \"space-around\",\n alignItems: \"center\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"17vh\",\n minHeight: \"120px\",\n backgroundColor: \"background.detail_info\"\n },\n PRODUCT_SELECTOR_CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n height: \"53vh\",\n minHeight: \"379px\",\n marginTop: \"16px\",\n backgroundColor: \"background.product_selector\"\n },\n PRODUCT_SELECTOR_MODEL: {\n width: \"70%\"\n },\n PLAN_INFO_MAIN: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\"\n },\n PLAN_INFO_SUB: {\n display: \"flex\",\n justifyContent: \"space-between\",\n width: \"280px\",\n borderBottom: \"1px solid\"\n },\n TABLE_DETAILS: {\n backgroundColor: \"background.detail_table\",\n height: \"28vh\",\n minHeight: \"187px\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n },\n TABLE_DETAILS_HEADER_CELL: maxWidth => ({\n backgroundColor: \"background.detail_table\",\n color: \"text.detail_table.fontColor\",\n padding: \"2px 2px\",\n fontSize: \"11px\",\n textAlign: \"center\",\n lineHeight: \"1rem\",\n ...(maxWidth ? {\n maxWidth\n } : {})\n }),\n TABLE_DETAILS_DATA_CELL: textAlign => ({\n backgroundColor: \"background.detail_table\",\n color: \"text.detail_table.fontColor\",\n padding: \"2px 2px\",\n fontSize: \"11px\",\n ...(textAlign ? {\n textAlign\n } : {})\n }),\n TABLE_DETAILS_MORE_BUTTON: {\n borderRadius: \"25px\",\n height: \"20px\",\n color: \"text.more_button.fontColor\"\n },\n TABLE_DETAILS_TEXT: {\n color: \"text.detail_table.fontColor\"\n },\n CARD_DETAILS_CONTAINER: {\n minWidth: \"1200px\",\n maxWidth: \"1400px\"\n },\n CARD_DETAILS_NAVIGATION_STACK: {\n width: \"100%\"\n },\n NAVIGATE_BUTTONS: {\n color: \"text.title.fontColor\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Информация о выпуске плана\nconst PlanSpecInfo = ({\n planSpec\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLAN_INFO_MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLAN_INFO_SUB\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"PlanSpecInfo\",\n mt: 1\n }, \"\\u041D\\u043E\\u043C\\u0435\\u0440 \\u0437\\u0430\\u043A\\u0430\\u0437\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"subtitle2\"\n }, planSpec.SNUMB)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLAN_INFO_SUB\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"PlanSpecInfo\",\n mt: 1\n }, \"\\u0413\\u043E\\u0434 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"subtitle2\"\n }, planSpec.NYEAR))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_progress_box__WEBPACK_IMPORTED_MODULE_5__.ProgressBox, {\n progress: planSpec.NPROGRESS,\n detail: planSpec.SDETAIL,\n width: \"110px\",\n height: \"110px\",\n progressVariant: \"subtitle2\",\n detailVariant: \"body3\"\n }));\n};\n\n//Контроль свойств - Информация о спецификации плана\nPlanSpecInfo.propTypes = {\n planSpec: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().object)\n};\n\n//Модель выпуска плана\nconst PlanSpecProductCompositionModel = ({\n model,\n products,\n onProductSelect\n}) => {\n //При выборе детали на модели\n const handleProductClick = ({\n item\n }) => {\n const product = products.find(p => p.SMODEL_ID == item.id);\n if (product && onProductSelect) onProductSelect(product);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PRODUCT_SELECTOR_MODEL\n }, model ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_svg__WEBPACK_IMPORTED_MODULE_2__.P8PSVG, {\n data: atob(model),\n items: products.map(p => ({\n id: p.SMODEL_ID,\n backgroundColor: p.SMODEL_BG_COLOR || \"red\",\n desc: p.SNAME,\n title: p.SNAME\n })),\n fillOpacity: \"0.3\",\n onItemClick: handleProductClick\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"subtitle2\"\n }, \"\\u041C\\u043E\\u0434\\u0435\\u043B\\u044C \\u0438\\u0437\\u0434\\u0435\\u043B\\u0438\\u044F \\u043D\\u0435 \\u0437\\u0430\\u0433\\u0440\\u0443\\u0436\\u0435\\u043D\\u0430\")));\n};\n\n//Контроль свойств - Модель выпуска плана\nPlanSpecProductCompositionModel.propTypes = {\n model: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().any),\n products: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().array),\n onProductSelect: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func)\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => ({\n stackProps: {\n justifyContent: \"center\"\n },\n cellStyle: STYLES.TABLE_DETAILS_HEADER_CELL([\"NREMN_LABOUR\", \"NAPPLICABILITY\"].includes(columnDef.name) ? \"90px\" : [\"NDEFICIT\"].includes(columnDef.name) ? \"55px\" : null)\n});\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef\n}) => ({\n cellStyle: STYLES.TABLE_DETAILS_DATA_CELL([\"SOPERATION\", \"SNOMEN\"].includes(columnDef.name) ? null : \"center\"),\n data: row[columnDef]\n});\n\n//Таблица детализации изделия\nconst ProductDetailsTable = ({\n planSpec,\n product,\n stored,\n noProductMessage,\n noPlanSpecMessage,\n noDataFoundMessage,\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n planSpec: null,\n product: null,\n orders: null,\n pageNumber: 1\n });\n\n //Собственное состояние - данные таблицы\n const {\n data,\n isLoading\n } = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useProductDetailsTable)(state.planSpec, state.product, state.orders, state.pageNumber, stored);\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setState(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setState(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1\n }));\n\n //При изменении изделия\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n setState(pv => ({\n ...pv,\n planSpec,\n product,\n orders: null,\n pageNumber: 1\n }));\n }, [product, planSpec]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.BOX_INFO_SUB(!product || data.rows.length === 0)\n }, !product ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"ProductDetailMessage\",\n sx: STYLES.TABLE_DETAILS_TEXT\n }, noProductMessage) : !planSpec ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"ProductDetailMessage\",\n sx: STYLES.TABLE_DETAILS_TEXT\n }, noPlanSpecMessage) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n direction: \"row\",\n spacing: 2,\n justifyContent: \"center\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n size: 18,\n sx: {\n opacity: isLoading ? 1 : 0\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n variant: \"h4\",\n sx: STYLES.TABLE_DETAILS_TEXT\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, title))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n noDataFoundText: isLoading || !data.init ? \"\" : noDataFoundMessage,\n containerComponentProps: {\n sx: STYLES.TABLE_DETAILS,\n elevation: 0\n },\n columnsDef: data.columnsDef,\n rows: data.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_1__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: data.morePages,\n morePagesBtnProps: {\n sx: STYLES.TABLE_DETAILS_MORE_BUTTON\n },\n fixedHeader: true,\n reloading: false,\n dataCellRender: dataCellRender,\n headCellRender: headCellRender,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged\n }))));\n};\n\n//Контроль свойств - Таблица детализации изделия\nProductDetailsTable.propTypes = {\n planSpec: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().number),\n product: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().number),\n stored: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n noProductMessage: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n noPlanSpecMessage: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n noDataFoundMessage: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().string).isRequired\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация по объекту\nconst PlanSpecDetail = ({\n planSpec,\n disableNavigatePrev = false,\n disableNavigateNext = false,\n onNavigate,\n onBack\n}) => {\n //Собственное состояние - данные производственных составов SVG\n const [costProductComposition, setCostProductComposition] = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useCostProductComposition)(planSpec.NRN);\n\n //Выбор элемента изделия\n const setProduct = product => {\n setCostProductComposition(pv => ({\n ...pv,\n selectedProduct: product ? {\n ...product\n } : null\n }));\n };\n\n //При навигации между карточками\n const handleNavigate = direction => {\n setProduct(null);\n if (onNavigate) onNavigate(direction);\n };\n\n //Формируем представление\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n maxWidth: false,\n sx: STYLES.CARD_DETAILS_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n direction: \"row\",\n justifyContent: \"center\",\n alignItems: \"center\",\n spacing: 0\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n sx: STYLES.CARD_DETAILS_NAVIGATION_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n disabled: disableNavigatePrev,\n onClick: () => handleNavigate(-1)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.NAVIGATE_BUTTONS\n }, \"navigate_before\")))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 10\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n maxWidth: false\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onClick: () => onBack ? onBack() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n direction: \"row\",\n color: \"text.title.fontColor\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, \"chevron_left\"), \"\\u041D\\u0430\\u0437\\u0430\\u0434\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n spacing: 2,\n sx: {\n paddingTop: \"5px\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.BOX_INFO_MAIN\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProductDetailsTable, {\n planSpec: costProductComposition.selectedProduct?.NFCPRODPLANSP_LINK,\n product: costProductComposition.selectedProduct?.NRN,\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DG_BY_LINKED_GET\",\n noProductMessage: \"Укажите элемент модели, чтобы увидеть информацию о маршрутных картах\",\n noPlanSpecMessage: \"Не определена связанная запись производственной программы\",\n noDataFoundMessage: \"Маршрутные карты не найдены\",\n title: \"Маршрутные карты\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.BOX_INFO_MAIN,\n mt: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProductDetailsTable, {\n planSpec: costProductComposition.selectedProduct?.NFCPRODPLANSP_LINK,\n product: costProductComposition.selectedProduct?.NRN,\n stored: \"PKG_P8PANELS_MECHREC.FCDELIVSH_DG_BY_LINKED_GET\",\n noProductMessage: \"Укажите элемент модели, чтобы увидеть информацию о комплектовочных ведомостях\",\n noPlanSpecMessage: \"Не определена связанная запись производственной программы\",\n noDataFoundMessage: \"Комплектовочные ведомости не найдены\",\n title: \"Дефицит комплектующих\"\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 7\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.DETAIL_INFO\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanSpecInfo, {\n planSpec: planSpec\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PRODUCT_SELECTOR_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanSpecProductCompositionModel, {\n model: costProductComposition.model,\n products: costProductComposition.products,\n onProductSelect: setProduct\n })))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n display: \"flex\",\n justifyContent: \"center\",\n xs: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n sx: STYLES.CARD_DETAILS_NAVIGATION_STACK\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n disabled: disableNavigateNext,\n onClick: () => handleNavigate(1)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.NAVIGATE_BUTTONS\n }, \"navigate_next\"))))));\n};\n\n//Контроль свойств - Детализация по объекту\nPlanSpecDetail.propTypes = {\n planSpec: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().object),\n disableNavigatePrev: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().bool),\n disableNavigateNext: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().bool),\n onNavigate: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n onBack: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plan_detail.js?"); /***/ }), @@ -4855,7 +4866,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PlanSpecsListItem: () => (/* binding */ PlanSpecsListItem)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ImageList/ImageList.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ImageListItem/ImageListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _progress_box__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./progress_box */ \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Компонент: Элемент списка выпусков планов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Информация по прогрессу объекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n gap: \"24px\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n cursor: \"pointer\",\n backgroundColor: \"background.secondary\"\n },\n TEXT_INFO_FIELD: {\n color: \"text.secondary.fontColor\"\n },\n IMAGE_BOX: {\n width: \"180px\",\n height: \"180px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n display: \"flex\"\n },\n IMAGE_LIST_ITEM: {\n textAlign: \"center\"\n },\n IMAGE_IMG: {\n width: \"160px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Изображение для элемента\nconst PlanSpecsListItemImage = ({\n card\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.IMAGE_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"masonry\",\n cols: 1,\n gap: 8\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: 1,\n sx: STYLES.IMAGE_LIST_ITEM\n }, card[\"BIMAGE\"] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: `data:image/png;base64,${card[\"BIMAGE\"]}`,\n loading: \"lazy\",\n style: STYLES.IMAGE_IMG\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n fontSize: \"5rem\"\n }\n }, \"construction\"))));\n};\n\n//Контроль свойств - Изображение для элемента\nPlanSpecsListItemImage.propTypes = {\n card: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Элемент списка выпусков планов\nconst PlanSpecsListItem = ({\n card,\n cardIndex,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.CONTAINER,\n onClick: () => onClick ? onClick(card, cardIndex) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanSpecsListItemImage, {\n card: card\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n textAlign: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"PlanSpecInfo\",\n sx: STYLES.TEXT_INFO_FIELD\n }, \"\\u041D\\u043E\\u043C\\u0435\\u0440 \\u0431\\u043E\\u0440\\u0442\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"h2\"\n }, card.SNUMB)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_progress_box__WEBPACK_IMPORTED_MODULE_1__.ProgressBox, {\n progress: card.NPROGRESS,\n detail: card.SDETAIL,\n width: \"155px\",\n height: \"155px\",\n progressVariant: \"h3\",\n detailVariant: \"PlanSpecProgressDetail\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"PlanSpecInfo\",\n sx: STYLES.TEXT_INFO_FIELD\n }, \"\\u0413\\u043E\\u0434 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle1\",\n mt: -1\n }, card.NYEAR)));\n};\n\n//Контроль свойств - Элемент списка выпусков планов\nPlanSpecsListItem.propTypes = {\n card: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object),\n cardIndex: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plans_list_item.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PlanSpecsListItem: () => (/* binding */ PlanSpecsListItem)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ImageList/ImageList.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ImageListItem/ImageListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _progress_box__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./progress_box */ \"./app/panels/mech_rec_assembly_mon/components/progress_box.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Компонент: Элемент списка выпусков планов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Информация по прогрессу объекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n gap: \"24px\",\n border: \"1px solid\",\n borderRadius: \"25px\",\n cursor: \"pointer\",\n backgroundColor: \"background.secondary\"\n },\n TEXT_INFO_FIELD: {\n color: \"text.secondary.fontColor\"\n },\n IMAGE_BOX: {\n width: \"180px\",\n height: \"180px\",\n alignItems: \"center\",\n justifyContent: \"center\",\n display: \"flex\"\n },\n IMAGE_LIST_ITEM: {\n textAlign: \"center\"\n },\n IMAGE_IMG: {\n width: \"160px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Изображение для элемента\nconst PlanSpecsListItemImage = ({\n card\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.IMAGE_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n variant: \"masonry\",\n cols: 1,\n gap: 8\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: 1,\n sx: STYLES.IMAGE_LIST_ITEM\n }, card[\"BIMAGE\"] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: `data:image/png;base64,${card[\"BIMAGE\"]}`,\n loading: \"lazy\",\n style: STYLES.IMAGE_IMG\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: {\n fontSize: \"5rem\"\n }\n }, \"construction\"))));\n};\n\n//Контроль свойств - Изображение для элемента\nPlanSpecsListItemImage.propTypes = {\n card: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Элемент списка выпусков планов\nconst PlanSpecsListItem = ({\n card,\n cardIndex,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: STYLES.CONTAINER,\n onClick: () => onClick ? onClick(card, cardIndex) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanSpecsListItemImage, {\n card: card\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n textAlign: \"center\",\n height: \"70px\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"PlanSpecInfo\",\n sx: STYLES.TEXT_INFO_FIELD\n }, \"\\u041D\\u043E\\u043C\\u0435\\u0440 \\u0437\\u0430\\u043A\\u0430\\u0437\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"h2\"\n }, card.SNUMB || \"-\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_progress_box__WEBPACK_IMPORTED_MODULE_1__.ProgressBox, {\n progress: card.NPROGRESS,\n detail: card.SDETAIL,\n width: \"155px\",\n height: \"155px\",\n progressVariant: \"h3\",\n detailVariant: \"PlanSpecProgressDetail\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n height: \"70px\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"PlanSpecInfo\",\n sx: STYLES.TEXT_INFO_FIELD\n }, \"\\u0413\\u043E\\u0434 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430:\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n variant: \"subtitle1\",\n mt: -1\n }, card.NYEAR || \"-\")));\n};\n\n//Контроль свойств - Элемент списка выпусков планов\nPlanSpecsListItem.propTypes = {\n card: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().object),\n cardIndex: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_6___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/components/plans_list_item.js?"); /***/ }), @@ -4877,7 +4888,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostProductComposition: () => (/* binding */ useCostProductComposition),\n/* harmony export */ useFilteredPlanCtlgs: () => (/* binding */ useFilteredPlanCtlgs),\n/* harmony export */ useMechRecAssemblyMon: () => (/* binding */ useMechRecAssemblyMon),\n/* harmony export */ useProductDetailsTable: () => (/* binding */ useProductDetailsTable)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор каталогов по поисковой фразе и наличию планов\nconst useFilteredPlanCtlgs = (planCtlgs, filter) => {\n const filteredPlanCtlgs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter.ctlgName) && (filter.haveDocs ? catalog.NCOUNT_DOCS > 0 : catalog.NCOUNT_DOCS >= 0));\n }, [planCtlgs, filter]);\n return filteredPlanCtlgs;\n};\n\n//Хук для основной таблицы панели\nconst useMechRecAssemblyMon = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlg: {},\n planSpecs: [],\n planSpecsLoaded: false,\n selectedPlanSpec: {}\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_AM_CTLG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Получение информации о планах каталога\n const loadPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NCRN => {\n if (NCRN) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_GET\",\n args: {\n NCRN: NCRN\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_INFO\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planSpecs: [...(data?.XFCPRODPLAN_INFO || [])],\n planSpecsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [executeStored]);\n\n //Выбор каталога планов\n const selectPlanCtlg = planCtlg => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: {\n ...planCtlg\n },\n selectedPlanSpec: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlanCtlg = () => setState(pv => ({\n ...pv,\n selectedPlanCtlg: {},\n selectedPlanSpec: {},\n showPlanList: false\n }));\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При изменении каталога\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если каталог выбран\n if (state.selectedPlanCtlg) {\n loadPlans(state.selectedPlanCtlg.NRN);\n } else {\n setState(pv => ({\n ...pv,\n planSpecs: [],\n planSpecsLoaded: false\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.selectedPlanCtlg]);\n return [state, setState, selectPlanCtlg, unselectPlanCtlg];\n};\n\n//Хук для информации по производственным составам\nconst useCostProductComposition = planSpec => {\n //Собственное состояние\n let [costProductComposition, setCostProductComposition] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n showPlanList: false,\n products: [],\n productsLoaded: false,\n model: null,\n selectedProduct: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODCMP_DETAILS_GET\",\n args: {\n NFCPRODPLANSP: planSpec\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODCMP\"\n });\n setCostProductComposition(pv => ({\n ...pv,\n products: [...(data?.XFCPRODCMP || [])],\n productsLoaded: true,\n model: data?.BMODEL,\n selectedProduct: null\n }));\n };\n if (planSpec) loadData();\n }, [planSpec, executeStored]);\n\n //Вернём данные\n return [costProductComposition, setCostProductComposition];\n};\n\n//Хук для таблицы детализации изделия\nconst useProductDetailsTable = (planSpec, product, orders, pageNumber, stored) => {\n //Собственное состояние - флаг загрузки\n const [isLoading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Собственное состояние - таблица данных\n const [data, setData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n columnsDef: [],\n rows: [],\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных при изменении зависимостей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const data = await executeStored({\n stored,\n args: {\n NFCPRODPLANSP: planSpec,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: pageNumber == 1 ? 1 : 0\n },\n respArg: \"COUT\",\n loader: false\n });\n setData(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE,\n init: true\n }));\n } finally {\n setLoading(false);\n }\n };\n if (planSpec && product) loadData();\n }, [planSpec, product, orders, pageNumber, stored, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Вернём данные\n return {\n data,\n isLoading\n };\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostProductComposition: () => (/* binding */ useCostProductComposition),\n/* harmony export */ useFilteredPlanCtlgs: () => (/* binding */ useFilteredPlanCtlgs),\n/* harmony export */ useMechRecAssemblyMon: () => (/* binding */ useMechRecAssemblyMon),\n/* harmony export */ useProductDetailsTable: () => (/* binding */ useProductDetailsTable)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор каталогов по поисковой фразе и наличию планов\nconst useFilteredPlanCtlgs = (planCtlgs, filter) => {\n const filteredPlanCtlgs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return planCtlgs.filter(catalog => catalog.SNAME.toString().toLowerCase().includes(filter.ctlgName) && (filter.haveDocs ? catalog.NCOUNT_DOCS > 0 : catalog.NCOUNT_DOCS >= 0));\n }, [planCtlgs, filter]);\n return filteredPlanCtlgs;\n};\n\n//Хук для основной таблицы панели\nconst useMechRecAssemblyMon = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlg: {},\n planSpecs: [],\n planSpecsLoaded: false,\n selectedPlanSpec: {}\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_AM_CTLG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Получение информации о планах каталога\n const loadPlans = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async NCRN => {\n if (NCRN) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_GET\",\n args: {\n NCRN: NCRN\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_INFO\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planSpecs: [...(data?.XFCPRODPLAN_INFO || [])],\n planSpecsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [executeStored]);\n\n //Выбор каталога планов\n const selectPlanCtlg = planCtlg => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: {\n ...planCtlg\n },\n selectedPlanSpec: {},\n showPlanList: false\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlanCtlg = () => setState(pv => ({\n ...pv,\n selectedPlanCtlg: {},\n selectedPlanSpec: {},\n showPlanList: false\n }));\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При изменении каталога\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если каталог выбран\n if (state.selectedPlanCtlg) {\n loadPlans(state.selectedPlanCtlg.NRN);\n } else {\n setState(pv => ({\n ...pv,\n planSpecs: [],\n planSpecsLoaded: false\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.selectedPlanCtlg]);\n return [state, setState, selectPlanCtlg, unselectPlanCtlg];\n};\n\n//Хук для информации по производственным составам\nconst useCostProductComposition = planSpec => {\n //Собственное состояние\n let [costProductComposition, setCostProductComposition] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n showPlanList: false,\n products: [],\n productsLoaded: false,\n model: null,\n selectedProduct: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODCMP_DETAILS_GET\",\n args: {\n NFCPRODPLANSP: planSpec\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODCMP\"\n });\n setCostProductComposition(pv => ({\n ...pv,\n products: [...(data?.XFCPRODCMP || [])],\n productsLoaded: true,\n model: data?.BMODEL,\n selectedProduct: null\n }));\n };\n if (planSpec) loadData();\n }, [planSpec, executeStored]);\n\n //Вернём данные\n return [costProductComposition, setCostProductComposition];\n};\n\n//Хук для таблицы детализации изделия\nconst useProductDetailsTable = (planSpec, product, orders, pageNumber, stored) => {\n //Собственное состояние - флаг загрузки\n const [isLoading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Собственное состояние - таблица данных\n const [data, setData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n columnsDef: [],\n rows: [],\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных при изменении зависимостей\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n try {\n setLoading(true);\n const data = await executeStored({\n stored,\n args: {\n NFCPRODPLANSP: planSpec,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: pageNumber == 1 ? 1 : 0\n },\n respArg: \"COUT\",\n loader: false\n });\n setData(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE,\n init: true\n }));\n } finally {\n setLoading(false);\n }\n };\n if (planSpec && product) loadData();\n }, [planSpec, product, orders, pageNumber, stored, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Вернём данные\n return {\n data,\n isLoading\n };\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/hooks.js?"); /***/ }), @@ -4899,7 +4910,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecAssemblyMon: () => (/* binding */ MechRecAssemblyMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material_styles__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/ThemeProvider.js\");\n/* harmony import */ var _components_plans_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/plans_list */ \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\");\n/* harmony import */ var _components_plan_detail__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/plan_detail */ \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\");\n/* harmony import */ var _styles_themes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./styles/themes */ \"./app/panels/mech_rec_assembly_mon/styles/themes.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_assembly_mon/hooks.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Панель мониторинга: Корневая панель мониторинга сборки изделий\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Подключение темы\n //Список планов\n //Детали плана\n //Стиль темы\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\",\n [`& .MuiFormLabel-root.Mui-focused`]: {\n color: \"text.title.fontColor\"\n },\n [`& .MuiInputBase-root`]: {\n color: \"text.plans_finder.fontColor\"\n },\n [`& .MuiInputBase-root.Mui-focused::after`]: {\n borderBottom: \"2px solid black\"\n }\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\",\n [`& .MuiCheckbox-root.Mui-checked`]: {\n color: \"text.title.fontColor\"\n }\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"background.plans_zero_docs\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\",\n backgroundColor: \"background.plans_drawer_paper\",\n color: \"text.plans_finder.fontColor\"\n }\n },\n PLANS_LIST_BOX: {\n paddingTop: \"20px\"\n },\n ROOT_BG: {\n backgroundColor: \"background.main\",\n minHeight: \"calc(100vh - 64px)\",\n overflow: \"hidden\"\n },\n THEME_CHANGER: {\n color: \"text.title.fontColor\"\n },\n MAIN_TITLE: {\n textAlign: \"center\",\n color: \"text.title.fontColor\",\n marginTop: \"-24px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }))\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick({\n NRN: p.NRN,\n SNAME: p.SNAME,\n NMIN_YEAR: p.NMIN_YEAR,\n NMAX_YEAR: p.NMAX_YEAR\n }) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: {\n ...STYLES.PLANS_LIST_ITEM_SECONDARY\n }\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель мониторинга сборки изделий\nconst MechRecAssemblyMon = () => {\n //Состояние - текущая тема\n const [theme, setTheme] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_styles_themes__WEBPACK_IMPORTED_MODULE_3__.lightTheme);\n //Собственное состояние\n const [state, setState, selectPlanCtlg, unselectPlanCtlg] = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useMechRecAssemblyMon)();\n\n //Состояние фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveDocs: false\n });\n\n //Состояние навигации по карточкам детализации\n const [planDetailNavigation, setPlanDetailNavigation] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n disableNavigatePrev: false,\n disableNavigateNext: false,\n currentPlanIndex: 0\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handlePlanCtlgClick = planCtlg => {\n if (state.selectedPlanCtlg.NRN != planCtlg.NRN) selectPlanCtlg(planCtlg);else unselectPlanCtlg();\n };\n\n //Перемещение к нужному плану\n const navigateToPlan = planIndex => {\n if (planIndex < 0) planIndex = 0;\n if (planIndex > state.planSpecs.length - 1) planIndex = state.planSpecs.length - 1;\n setState(pv => ({\n ...pv,\n selectedPlanSpec: {\n ...state.planSpecs[planIndex]\n }\n }));\n setPlanDetailNavigation(pv => ({\n ...pv,\n disableNavigatePrev: planIndex == 0 ? true : false,\n disableNavigateNext: planIndex == state.planSpecs.length - 1 ? true : false,\n currentPlanIndex: planIndex\n }));\n };\n\n //Обработка нажатия на документ плана\n const handlePlanClick = (plan, planIndex) => navigateToPlan(planIndex);\n\n //Обработка нажатия на кнопку \"Назад\"\n const handlePlanDetailBackClick = () => {\n setState(pv => ({\n ...pv,\n selectedPlanSpec: {}\n }));\n };\n\n //Обработка навигации из карточки с деталями плана\n const handlePlanDetailNavigateClick = direction => navigateToPlan(planDetailNavigation.currentPlanIndex + direction);\n\n //Обработка изменения темы\n const handleThemeChange = () => {\n setTheme(theme.palette.type === \"light\" ? _styles_themes__WEBPACK_IMPORTED_MODULE_3__.darkTheme : _styles_themes__WEBPACK_IMPORTED_MODULE_3__.lightTheme);\n };\n\n //Формирование текста заголовка\n const title = `${state.selectedPlanCtlg.SNAME} на ${state.selectedPlanCtlg.NMIN_YEAR} ${state.selectedPlanCtlg.NMIN_YEAR == state.selectedPlanCtlg.NMAX_YEAR ? \"г.\" : `- ${state.selectedPlanCtlg.NMAX_YEAR} г.г.`} `;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_styles__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n theme: theme\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n maxWidth: false,\n disableGutters: true,\n sx: STYLES.ROOT_BG\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg.NRN,\n filter: filter,\n setFilter: setFilter,\n onClick: handlePlanCtlgClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-end\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n onClick: () => handleThemeChange()\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n sx: STYLES.THEME_CHANGER\n }, theme.palette.type === \"light\" ? \"brightness_4\" : \"brightness_7\"))), state.init == true ? state.selectedPlanCtlg.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n variant: \"h3\",\n sx: STYLES.MAIN_TITLE,\n pb: 2\n }, title), state.planSpecsLoaded == true ? state.selectedPlanSpec.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_plan_detail__WEBPACK_IMPORTED_MODULE_2__.PlanSpecDetail, {\n planSpec: state.selectedPlanSpec,\n disableNavigatePrev: planDetailNavigation.disableNavigatePrev,\n disableNavigateNext: planDetailNavigation.disableNavigateNext,\n onNavigate: handlePlanDetailNavigateClick,\n onBack: handlePlanDetailBackClick\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: STYLES.PLANS_LIST_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_plans_list__WEBPACK_IMPORTED_MODULE_1__.PlanSpecsList, {\n planSpecs: state.planSpecs,\n onItemClick: handlePlanClick\n })) : null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n variant: \"h4\",\n sx: STYLES.MAIN_TITLE\n }, \"\\u0423\\u043A\\u0430\\u0436\\u0438\\u0442\\u0435 \\u043A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432 \\u0434\\u043B\\u044F \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u044F \\u0441\\u043F\\u0435\\u0446\\u0438\\u0444\\u0438\\u043A\\u0430\\u0446\\u0438\\u0439\") : null)));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecAssemblyMon: () => (/* binding */ MechRecAssemblyMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Container/Container.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material_styles__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material/styles */ \"./node_modules/@mui/material/styles/ThemeProvider.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_plans_list__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/plans_list */ \"./app/panels/mech_rec_assembly_mon/components/plans_list.js\");\n/* harmony import */ var _components_plan_detail__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/plan_detail */ \"./app/panels/mech_rec_assembly_mon/components/plan_detail.js\");\n/* harmony import */ var _styles_themes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./styles/themes */ \"./app/panels/mech_rec_assembly_mon/styles/themes.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_assembly_mon/hooks.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Мониторинг сборки изделий\r\n Панель мониторинга: Корневая панель мониторинга сборки изделий\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Подключение темы\n //Типовые стили\n //Список планов\n //Детали плана\n //Стиль темы\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\",\n [`& .MuiFormLabel-root.Mui-focused`]: {\n color: \"text.title.fontColor\"\n },\n [`& .MuiInputBase-root`]: {\n color: \"text.plans_finder.fontColor\"\n },\n [`& .MuiInputBase-root.Mui-focused::after`]: {\n borderBottom: \"2px solid black\"\n }\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\",\n [`& .MuiCheckbox-root.Mui-checked`]: {\n color: \"text.title.fontColor\"\n }\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"background.plans_zero_docs\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\",\n backgroundColor: \"background.plans_drawer_paper\",\n color: \"text.plans_finder.fontColor\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n }\n },\n PLANS_LIST_BOX: {\n paddingTop: \"20px\"\n },\n ROOT_BG: {\n backgroundColor: \"background.main\",\n minHeight: \"calc(100vh - 64px)\",\n overflow: \"hidden\"\n },\n THEME_CHANGER: {\n color: \"text.title.fontColor\"\n },\n MAIN_TITLE: {\n textAlign: \"center\",\n color: \"text.title.fontColor\",\n marginTop: \"-24px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }))\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick({\n NRN: p.NRN,\n SNAME: p.SNAME,\n NMIN_YEAR: p.NMIN_YEAR,\n NMAX_YEAR: p.NMAX_YEAR\n }) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n ...STYLES.PLANS_LIST_ITEM_SECONDARY\n }\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_14___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель мониторинга сборки изделий\nconst MechRecAssemblyMon = () => {\n //Состояние - текущая тема\n const [theme, setTheme] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(_styles_themes__WEBPACK_IMPORTED_MODULE_4__.lightTheme);\n //Собственное состояние\n const [state, setState, selectPlanCtlg, unselectPlanCtlg] = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useMechRecAssemblyMon)();\n\n //Состояние фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveDocs: false\n });\n\n //Состояние навигации по карточкам детализации\n const [planDetailNavigation, setPlanDetailNavigation] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n disableNavigatePrev: false,\n disableNavigateNext: false,\n currentPlanIndex: 0\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_5__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handlePlanCtlgClick = planCtlg => {\n if (state.selectedPlanCtlg.NRN != planCtlg.NRN) selectPlanCtlg(planCtlg);else unselectPlanCtlg();\n };\n\n //Перемещение к нужному плану\n const navigateToPlan = planIndex => {\n if (planIndex < 0) planIndex = 0;\n if (planIndex > state.planSpecs.length - 1) planIndex = state.planSpecs.length - 1;\n setState(pv => ({\n ...pv,\n selectedPlanSpec: {\n ...state.planSpecs[planIndex]\n }\n }));\n setPlanDetailNavigation(pv => ({\n ...pv,\n disableNavigatePrev: planIndex == 0 ? true : false,\n disableNavigateNext: planIndex == state.planSpecs.length - 1 ? true : false,\n currentPlanIndex: planIndex\n }));\n };\n\n //Обработка нажатия на документ плана\n const handlePlanClick = (plan, planIndex) => navigateToPlan(planIndex);\n\n //Обработка нажатия на кнопку \"Назад\"\n const handlePlanDetailBackClick = () => {\n setState(pv => ({\n ...pv,\n selectedPlanSpec: {}\n }));\n };\n\n //Обработка навигации из карточки с деталями плана\n const handlePlanDetailNavigateClick = direction => navigateToPlan(planDetailNavigation.currentPlanIndex + direction);\n\n //Обработка изменения темы\n const handleThemeChange = () => {\n setTheme(theme.palette.type === \"light\" ? _styles_themes__WEBPACK_IMPORTED_MODULE_4__.darkTheme : _styles_themes__WEBPACK_IMPORTED_MODULE_4__.lightTheme);\n };\n\n //Формирование текста заголовка\n const title = `${state.selectedPlanCtlg.SNAME} на ${state.selectedPlanCtlg.NMIN_YEAR} ${state.selectedPlanCtlg.NMIN_YEAR == state.selectedPlanCtlg.NMAX_YEAR ? \"г.\" : `- ${state.selectedPlanCtlg.NMAX_YEAR} г.г.`} `;\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material_styles__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n theme: theme\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n maxWidth: false,\n disableGutters: true,\n sx: STYLES.ROOT_BG\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg.NRN,\n filter: filter,\n setFilter: setFilter,\n onClick: handlePlanCtlgClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n display: \"flex\",\n direction: \"row\",\n justifyContent: \"flex-end\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n onClick: () => handleThemeChange()\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: STYLES.THEME_CHANGER\n }, theme.palette.type === \"light\" ? \"brightness_4\" : \"brightness_7\"))), state.init == true ? state.selectedPlanCtlg.NRN ? state.planSpecs.length !== 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"h3\",\n sx: STYLES.MAIN_TITLE,\n pb: 2\n }, title), state.planSpecsLoaded == true ? state.selectedPlanSpec.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_plan_detail__WEBPACK_IMPORTED_MODULE_3__.PlanSpecDetail, {\n planSpec: state.selectedPlanSpec,\n disableNavigatePrev: planDetailNavigation.disableNavigatePrev,\n disableNavigateNext: planDetailNavigation.disableNavigateNext,\n onNavigate: handlePlanDetailNavigateClick,\n onBack: handlePlanDetailBackClick\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: STYLES.PLANS_LIST_BOX\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_plans_list__WEBPACK_IMPORTED_MODULE_2__.PlanSpecsList, {\n planSpecs: state.planSpecs,\n onItemClick: handlePlanClick\n })) : null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"h4\",\n sx: STYLES.MAIN_TITLE\n }, \"\\u0412 \\u043A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0435 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432 \\u043E\\u0442\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u0443\\u044E\\u0442 \\u0437\\u0430\\u043F\\u0438\\u0441\\u0438 \\u043F\\u043E\\u0434\\u0445\\u043E\\u0434\\u044F\\u0449\\u0438\\u0445 \\u043F\\u0435\\u0440\\u0432\\u0438\\u0447\\u043D\\u044B\\u0445 \\u0434\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u043E\\u0432\") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n variant: \"h4\",\n sx: STYLES.MAIN_TITLE\n }, \"\\u0423\\u043A\\u0430\\u0436\\u0438\\u0442\\u0435 \\u043A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432 \\u0434\\u043B\\u044F \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u044F \\u0441\\u043F\\u0435\\u0446\\u0438\\u0444\\u0438\\u043A\\u0430\\u0446\\u0438\\u0439\") : null)));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_assembly_mon/mech_rec_assembly_mon.js?"); /***/ }), @@ -4932,7 +4943,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostJobs: () => (/* binding */ useCostJobs),\n/* harmony export */ useCostJobsSpecs: () => (/* binding */ useCostJobsSpecs),\n/* harmony export */ useEquipConfiguration: () => (/* binding */ useEquipConfiguration),\n/* harmony export */ useFilteredFcjobs: () => (/* binding */ useFilteredFcjobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Контекст навигации\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 50;\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор сменных заданий по поисковой фразе\nconst useFilteredFcjobs = (jobs, filter) => {\n const filteredJobs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return jobs.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.jobName));\n }, [jobs, filter]);\n return filteredJobs;\n};\n\n//Хук для основной таблицы\nconst useCostJobs = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showJobList: false,\n jobList: [],\n jobListLoaded: false,\n selectedJob: {},\n fromAction: false\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const initPlans = async fcJob => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBS_INIT\",\n args: {\n NFCJOBS: fcJob ? parseInt(fcJob) : null\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCJOBS\",\n attributeValueProcessor: (name, val) => [\"NHAVE_NOTE\"].includes(name) ? val == 1 : val\n });\n setState(pv => ({\n ...pv,\n init: true,\n jobList: [...(data.XFCJOBS || [])],\n selectedJob: data.XFCJOBS_SELECTED ? data.XFCJOBS_SELECTED : {},\n jobListLoaded: true,\n fromAction: fcJob ? true : false\n }));\n };\n if (!state.init) {\n //Считаем параметры, переданные из действия\n const actionPrms = getNavigationSearch();\n //Иницализируем планы\n initPlans(actionPrms.NRN);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return [state, setState];\n};\n\n//Хук для таблицы операций\nconst useCostJobsSpecs = task => {\n //Собственное состояние - таблица данных\n const [costJobsSpecs, setCostJobsSpecs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n task: null,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Выдача задания\n const issueCostJobsSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_ISSUE\",\n args: {\n NFCJOBS: prms.NFCJOBS,\n SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если изменилось сменное задание - обновляем состояние\n if (costJobsSpecs.dataLoaded && costJobsSpecs.task !== task) {\n setCostJobsSpecs(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n }\n //Если необходимо перезагрузить\n if (costJobsSpecs.reload) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_DG_GET\",\n args: {\n NFCJOBS: task,\n NPAGE_NUMBER: costJobsSpecs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(costJobsSpecs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: costJobsSpecs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setCostJobsSpecs(pv => ({\n ...pv,\n task: task,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n };\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, costJobsSpecs.dataLoaded, costJobsSpecs.orders, costJobsSpecs.pageNumber, costJobsSpecs.reload, costJobsSpecs.selectedRow, costJobsSpecs.task, executeStored, task]);\n return [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs];\n};\n\n//Хук для таблицы рабочих центров\nconst useEquipConfiguration = (task, fromAction) => {\n //Собственное состояние - таблица данных\n const [equipConfiguration, setEquipConfiguration] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n task: null,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Включение станка в строку сменного задания\n const includeEquipConfiguration = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_INC_EQCONFIG\",\n args: {\n NEQCONFIG: prms.NEQCONFIG,\n NFCJOBSSP: prms.NFCJOBSSP,\n NQUANT_PLAN: prms.NQUANT_PLAN\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //Исключение станка из строки сменного задания\n const excludeEquipConfiguration = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_EXC_EQCONFIG\",\n args: {\n NFCJOBSSP: prms.NFCJOBSSP\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если изменилось сменное задание - обновляем состояние\n if (equipConfiguration.dataLoaded && equipConfiguration.task !== task) {\n setEquipConfiguration(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n }\n if (equipConfiguration.reload) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.EQCONFIG_DG_GET\",\n args: {\n NFCJOBS: task,\n NFROM_ACTION: fromAction ? 1 : 0,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(equipConfiguration.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: equipConfiguration.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: equipConfiguration.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setEquipConfiguration(pv => ({\n ...pv,\n task: task,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n };\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, equipConfiguration.dataLoaded, equipConfiguration.orders, equipConfiguration.pageNumber, equipConfiguration.reload, equipConfiguration.selectedRow, equipConfiguration.task, task, executeStored, fromAction]);\n return [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostJobs: () => (/* binding */ useCostJobs),\n/* harmony export */ useCostJobsSpecs: () => (/* binding */ useCostJobsSpecs),\n/* harmony export */ useEquipConfiguration: () => (/* binding */ useEquipConfiguration),\n/* harmony export */ useFilteredFcjobs: () => (/* binding */ useFilteredFcjobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Контекст навигации\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 50;\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор сменных заданий по поисковой фразе\nconst useFilteredFcjobs = (jobs, filter) => {\n const filteredJobs = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return jobs.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.jobName));\n }, [jobs, filter]);\n return filteredJobs;\n};\n\n//Хук для основной таблицы\nconst useCostJobs = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showJobList: false,\n jobList: [],\n jobListLoaded: false,\n selectedJob: {},\n fromAction: false\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_2__.NavigationCtx);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const initPlans = async fcJob => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBS_INIT\",\n args: {\n NFCJOBS: fcJob ? parseInt(fcJob) : null\n },\n respArg: \"COUT\",\n isArray: name => name === \"XFCJOBS\",\n attributeValueProcessor: (name, val) => [\"NHAVE_NOTE\"].includes(name) ? val == 1 : val\n });\n setState(pv => ({\n ...pv,\n init: true,\n jobList: [...(data.XFCJOBS || [])],\n selectedJob: data.XFCJOBS_SELECTED ? data.XFCJOBS_SELECTED : {},\n jobListLoaded: true,\n fromAction: fcJob ? true : false\n }));\n };\n if (!state.init) {\n //Считаем параметры, переданные из действия\n const actionPrms = getNavigationSearch();\n //Иницализируем планы\n initPlans(actionPrms.NRN);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return [state, setState];\n};\n\n//Хук для таблицы операций\nconst useCostJobsSpecs = task => {\n //Собственное состояние - таблица данных\n const [costJobsSpecs, setCostJobsSpecs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n task: null,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Выдача задания\n const issueCostJobsSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_ISSUE\",\n args: {\n NFCJOBS: prms.NFCJOBS,\n SFCJOBSSP_LIST: prms.SFCJOBSSP_LIST\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если изменилось сменное задание - обновляем состояние\n if (costJobsSpecs.dataLoaded && costJobsSpecs.task !== task) {\n setCostJobsSpecs(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n }\n //Если необходимо перезагрузить\n if (costJobsSpecs.reload) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_DG_GET\",\n args: {\n NFCJOBS: task,\n NPAGE_NUMBER: costJobsSpecs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(costJobsSpecs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: costJobsSpecs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setCostJobsSpecs(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n task: task,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE\n }));\n };\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, costJobsSpecs.dataLoaded, costJobsSpecs.orders, costJobsSpecs.pageNumber, costJobsSpecs.reload, costJobsSpecs.selectedRow, costJobsSpecs.task, executeStored, task]);\n return [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs];\n};\n\n//Хук для таблицы рабочих центров\nconst useEquipConfiguration = (task, fromAction) => {\n //Собственное состояние - таблица данных\n const [equipConfiguration, setEquipConfiguration] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n task: null,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Включение станка в строку сменного задания\n const includeEquipConfiguration = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_INC_EQCONFIG\",\n args: {\n NEQCONFIG: prms.NEQCONFIG,\n NFCJOBSSP: prms.NFCJOBSSP,\n NQUANT_PLAN: prms.NQUANT_PLAN\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //Исключение станка из строки сменного задания\n const excludeEquipConfiguration = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async prms => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBSSP_EXC_EQCONFIG\",\n args: {\n NFCJOBSSP: prms.NFCJOBSSP\n }\n });\n } catch (e) {\n throw new Error(e.message);\n }\n }, [executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если изменилось сменное задание - обновляем состояние\n if (equipConfiguration.dataLoaded && equipConfiguration.task !== task) {\n setEquipConfiguration(pv => ({\n ...pv,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n selectedRow: {},\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n }\n if (equipConfiguration.reload) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.EQCONFIG_DG_GET\",\n args: {\n NFCJOBS: task,\n NFROM_ACTION: fromAction ? 1 : 0,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(equipConfiguration.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: equipConfiguration.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: equipConfiguration.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"NSELECT\"].includes(name) ? val === 1 : val\n });\n setEquipConfiguration(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n task: task,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE\n }));\n };\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, equipConfiguration.dataLoaded, equipConfiguration.orders, equipConfiguration.pageNumber, equipConfiguration.reload, equipConfiguration.selectedRow, equipConfiguration.task, task, executeStored, fromAction]);\n return [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/hooks.js?"); /***/ }), @@ -4954,7 +4965,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MAIN_HEADER_HEIGHT: () => (/* binding */ MAIN_HEADER_HEIGHT),\n/* harmony export */ MechRecCostJobs: () => (/* binding */ MechRecCostJobs),\n/* harmony export */ SUB_HEADER_HEIGHT: () => (/* binding */ SUB_HEADER_HEIGHT)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _fcjobssp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fcjobssp */ \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания\r\n Панель мониторинга: Корневая панель выдачи сменного задания\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст сообщений\n //Собственные хуки таблиц\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота основного заголовка\nconst MAIN_HEADER_HEIGHT = \"35px\";\n\n//Высота подзаголовка\nconst SUB_HEADER_HEIGHT = \"35px\";\n\n//Стили\nconst STYLES = {\n MAIN_HEADER: {\n height: MAIN_HEADER_HEIGHT,\n overflow: \"hidden\"\n },\n SUB_HEADER: {\n height: SUB_HEADER_HEIGHT,\n overflow: \"hidden\"\n },\n JOBS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n JOBS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n JOBS_BUTTON: {\n position: \"absolute\"\n },\n JOBS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n CONTAINER: {\n textAlign: \"center\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Список сменных заданий\nconst JobList = ({\n jobs = [],\n selectedJob,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.JOBS_FINDER,\n name: \"jobFilter\",\n label: \"\\u0421\\u043C\\u0435\\u043D\\u043D\\u043E\\u0435 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u0435\",\n value: filter.jobName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n jobName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], null, jobs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedJob.NRN,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.JOBS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nJobList.propTypes = {\n jobs: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().array),\n selectedJob: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().object),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_9___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выдачи сменного задания\nconst MechRecCostJobs = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useCostJobs)();\n\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n jobName: \"\"\n });\n\n //Массив отфильтрованных каталогов\n const filteredJobs = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useFilteredFcjobs)(state.jobList, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Выбор плана\n const selectJob = job => {\n //Обновляем состояние\n setState(pv => ({\n ...pv,\n selectedJob: job,\n showJobList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectJob = () => {\n //Обновляем состояние\n setState(pv => ({\n ...pv,\n selectedJob: {},\n showJobList: false\n }));\n };\n\n //Обработка нажатия на элемент в списке планов\n const handleJobClick = job => {\n if (state.selectedJob.NRN != job.NRN) selectJob(job);else unselectJob();\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.JOBS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showJobList: !pv.showJobList\n }))\n }, \"\\u0421\\u043C\\u0435\\u043D\\u043D\\u044B\\u0435 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n anchor: \"left\",\n open: state.showJobList,\n onClose: () => setState(pv => ({\n ...pv,\n showJobList: false\n })),\n sx: STYLES.JOBS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(JobList, {\n jobs: filteredJobs,\n selectedJob: state.selectedJob,\n filter: filter,\n setFilter: setFilter,\n onClick: handleJobClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, state.selectedJob.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.MAIN_HEADER,\n variant: \"h6\"\n }, `Сменное задание №${state.selectedJob.SDOC_NUMB} на ${state.selectedJob.SPERIOD}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.SUB_HEADER,\n variant: \"h6\"\n }, `${state.selectedJob.SSUBDIV}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcjobssp__WEBPACK_IMPORTED_MODULE_2__.CostJobsSpecsDataGrid, {\n task: state.selectedJob.NRN,\n haveNote: state.selectedJob.NHAVE_NOTE,\n fromAction: state.fromAction\n })) : !state.selectedJob.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите сменное задание для отображения информации\"\n }) : null));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MAIN_HEADER_HEIGHT: () => (/* binding */ MAIN_HEADER_HEIGHT),\n/* harmony export */ MechRecCostJobs: () => (/* binding */ MechRecCostJobs),\n/* harmony export */ SUB_HEADER_HEIGHT: () => (/* binding */ SUB_HEADER_HEIGHT)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _fcjobssp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fcjobssp */ \"./app/panels/mech_rec_cost_jobs_manage/fcjobssp.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_jobs_manage/hooks.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания\r\n Панель мониторинга: Корневая панель выдачи сменного задания\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Типовые стили\n //Контекст сообщений\n //Собственные хуки таблиц\n //Вспомогательные хуки\n\n//---------\n//Константы\n//---------\n\n//Высота основного заголовка\nconst MAIN_HEADER_HEIGHT = \"35px\";\n\n//Высота подзаголовка\nconst SUB_HEADER_HEIGHT = \"35px\";\n\n//Стили\nconst STYLES = {\n MAIN_HEADER: {\n height: MAIN_HEADER_HEIGHT,\n overflow: \"hidden\"\n },\n SUB_HEADER: {\n height: SUB_HEADER_HEIGHT,\n overflow: \"hidden\"\n },\n JOBS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n JOBS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n JOBS_BUTTON: {\n position: \"absolute\"\n },\n JOBS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n }\n },\n CONTAINER: {\n textAlign: \"center\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Список сменных заданий\nconst JobList = ({\n jobs = [],\n selectedJob,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n sx: STYLES.JOBS_FINDER,\n name: \"jobFilter\",\n label: \"\\u0421\\u043C\\u0435\\u043D\\u043D\\u043E\\u0435 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u0435\",\n value: filter.jobName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n jobName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], null, jobs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedJob.NRN,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.JOBS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nJobList.propTypes = {\n jobs: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().array),\n selectedJob: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель выдачи сменного задания\nconst MechRecCostJobs = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useCostJobs)();\n\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n jobName: \"\"\n });\n\n //Массив отфильтрованных каталогов\n const filteredJobs = (0,_hooks__WEBPACK_IMPORTED_MODULE_4__.useFilteredFcjobs)(state.jobList, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Выбор плана\n const selectJob = job => {\n //Обновляем состояние\n setState(pv => ({\n ...pv,\n selectedJob: job,\n showJobList: false\n }));\n };\n\n //Сброс выбора плана\n const unselectJob = () => {\n //Обновляем состояние\n setState(pv => ({\n ...pv,\n selectedJob: {},\n showJobList: false\n }));\n };\n\n //Обработка нажатия на элемент в списке планов\n const handleJobClick = job => {\n if (state.selectedJob.NRN != job.NRN) selectJob(job);else unselectJob();\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.JOBS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showJobList: !pv.showJobList\n }))\n }, \"\\u0421\\u043C\\u0435\\u043D\\u043D\\u044B\\u0435 \\u0437\\u0430\\u0434\\u0430\\u043D\\u0438\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n anchor: \"left\",\n open: state.showJobList,\n onClose: () => setState(pv => ({\n ...pv,\n showJobList: false\n })),\n sx: STYLES.JOBS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(JobList, {\n jobs: filteredJobs,\n selectedJob: state.selectedJob,\n filter: filter,\n setFilter: setFilter,\n onClick: handleJobClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, state.selectedJob.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.MAIN_HEADER,\n variant: \"h6\"\n }, `Сменное задание №${state.selectedJob.SDOC_NUMB} на ${state.selectedJob.SPERIOD}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.SUB_HEADER,\n variant: \"h6\"\n }, `${state.selectedJob.SSUBDIV}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcjobssp__WEBPACK_IMPORTED_MODULE_3__.CostJobsSpecsDataGrid, {\n task: state.selectedJob.NRN,\n haveNote: state.selectedJob.NHAVE_NOTE,\n fromAction: state.fromAction\n })) : !state.selectedJob.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите сменное задание для отображения информации\"\n }) : null));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js?"); /***/ }), @@ -4965,7 +4976,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostDeliveryLists: () => (/* binding */ useCostDeliveryLists),\n/* harmony export */ useCostRouteLists: () => (/* binding */ useCostRouteLists),\n/* harmony export */ useGoodsParties: () => (/* binding */ useGoodsParties),\n/* harmony export */ useIncomFromDeps: () => (/* binding */ useIncomFromDeps)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../core/utils */ \"./app/core/utils.js\");\n//---------------------\n//Подключение библиотек\n//---------------------\n\n\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 10;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для таблицы маршрутных листов\nconst useCostRouteLists = (task, taskType) => {\n //Собственное состояние - таблица данных\n const [costRouteLists, setCostRouteLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n quantPlanSum: 0,\n uniqueNomns: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costRouteLists.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n NTYPE: taskType,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DEXEC_DATE\", \"DREL_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setCostRouteLists(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE,\n quantPlanSum: data.XROWS ? data.XROWS.reduce((a, b) => a + b[\"NQUANT_PLAN\"], 0) : 0,\n uniqueNomns: data.XROWS ? data.XROWS.reduce((accumulator, current) => {\n if (!accumulator.find(item => item.SMATRES_PLAN_NOMEN === current.SMATRES_PLAN_NOMEN)) {\n accumulator.push(current);\n }\n return accumulator;\n }, []) : []\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costRouteLists.reload, costRouteLists.filters, costRouteLists.orders, costRouteLists.dataLoaded, costRouteLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costRouteLists.reload, loadData]);\n return [costRouteLists, setCostRouteLists];\n};\n\n//Хук для таблицы приходов из подразделений\nconst useIncomFromDeps = (task, taskType) => {\n //Собственное состояние - таблица данных\n const [incomFromDeps, setIncomFromDeps] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (incomFromDeps.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n NTYPE: taskType,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(incomFromDeps.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: incomFromDeps.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DWORK_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setIncomFromDeps(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [incomFromDeps.reload, incomFromDeps.orders, incomFromDeps.dataLoaded, incomFromDeps.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [incomFromDeps.reload, loadData]);\n return [incomFromDeps, setIncomFromDeps];\n};\n\n//Хук для таблицы товарных запасов\nconst useGoodsParties = mainRowRN => {\n //Собственное состояние - таблица данных\n const [goodsParties, setGoodsParties] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (goodsParties.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.GOODSPARTIES_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(goodsParties.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: goodsParties.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: goodsParties.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setGoodsParties(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [goodsParties.reload, goodsParties.orders, goodsParties.dataLoaded, goodsParties.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [goodsParties.reload, loadData]);\n return [goodsParties, setGoodsParties];\n};\n\n//Хук для таблицы строк комплектации\nconst useCostDeliveryLists = mainRowRN => {\n //Собственное состояние - таблица данных\n const [costDeliveryLists, setCostDeliveryLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы строк комплектации с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costDeliveryLists.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCDELIVERYLISTSP_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costDeliveryLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costDeliveryLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costDeliveryLists.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name === \"DRES_DATE_TO\" ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setCostDeliveryLists(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costDeliveryLists.reload, costDeliveryLists.orders, costDeliveryLists.dataLoaded, costDeliveryLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costDeliveryLists.reload, loadData]);\n return [costDeliveryLists, setCostDeliveryLists];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostDeliveryLists: () => (/* binding */ useCostDeliveryLists),\n/* harmony export */ useCostRouteLists: () => (/* binding */ useCostRouteLists),\n/* harmony export */ useGoodsParties: () => (/* binding */ useGoodsParties),\n/* harmony export */ useIncomFromDeps: () => (/* binding */ useIncomFromDeps)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../core/utils */ \"./app/core/utils.js\");\n//---------------------\n//Подключение библиотек\n//---------------------\n\n\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 10;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для таблицы маршрутных листов\nconst useCostRouteLists = (task, taskType) => {\n //Собственное состояние - таблица данных\n const [costRouteLists, setCostRouteLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n quantPlanSum: 0,\n uniqueNomns: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costRouteLists.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n NTYPE: taskType,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DEXEC_DATE\", \"DREL_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setCostRouteLists(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE,\n quantPlanSum: data.XDATA_GRID.rows ? data.XDATA_GRID.rows.reduce((a, b) => a + b[\"NQUANT_PLAN\"], 0) : 0,\n uniqueNomns: data.XDATA_GRID.rows ? data.XDATA_GRID.rows.reduce((accumulator, current) => {\n if (!accumulator.find(item => item.SMATRES_PLAN_NOMEN === current.SMATRES_PLAN_NOMEN)) {\n accumulator.push(current);\n }\n return accumulator;\n }, []) : []\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costRouteLists.reload, costRouteLists.filters, costRouteLists.orders, costRouteLists.dataLoaded, costRouteLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costRouteLists.reload, loadData]);\n return [costRouteLists, setCostRouteLists];\n};\n\n//Хук для таблицы приходов из подразделений\nconst useIncomFromDeps = (task, taskType) => {\n //Собственное состояние - таблица данных\n const [incomFromDeps, setIncomFromDeps] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (incomFromDeps.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n NTYPE: taskType,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(incomFromDeps.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: incomFromDeps.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DWORK_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setIncomFromDeps(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [incomFromDeps.reload, incomFromDeps.orders, incomFromDeps.dataLoaded, incomFromDeps.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [incomFromDeps.reload, loadData]);\n return [incomFromDeps, setIncomFromDeps];\n};\n\n//Хук для таблицы товарных запасов\nconst useGoodsParties = mainRowRN => {\n //Собственное состояние - таблица данных\n const [goodsParties, setGoodsParties] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (goodsParties.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.GOODSPARTIES_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(goodsParties.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: goodsParties.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: goodsParties.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setGoodsParties(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [goodsParties.reload, goodsParties.orders, goodsParties.dataLoaded, goodsParties.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [goodsParties.reload, loadData]);\n return [goodsParties, setGoodsParties];\n};\n\n//Хук для таблицы строк комплектации\nconst useCostDeliveryLists = mainRowRN => {\n //Собственное состояние - таблица данных\n const [costDeliveryLists, setCostDeliveryLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы строк комплектации с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (costDeliveryLists.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCDELIVERYLISTSP_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costDeliveryLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costDeliveryLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: costDeliveryLists.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name === \"DRES_DATE_TO\" ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setCostDeliveryLists(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [costDeliveryLists.reload, costDeliveryLists.orders, costDeliveryLists.dataLoaded, costDeliveryLists.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [costDeliveryLists.reload, loadData]);\n return [costDeliveryLists, setCostDeliveryLists];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js?"); /***/ }), @@ -5042,7 +5053,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardHeader/CardHeader.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var _datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./datagrids/fcroutlst */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\");\n/* harmony import */ var _datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./datagrids/incomefromdeps */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст навигации\n //Подключение компонентов к настройкам приложения\n //Заголовок страницы\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n\n\n\n//---------\n//Константы\n//---------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\"\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"#ebecec\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n left: \"16px\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n paddingTop: \"24px\"\n },\n GANTT_TITLE: {\n paddingLeft: \"250px\",\n paddingRight: \"250px\"\n },\n SECOND_TABLE: {\n paddingTop: \"30px\"\n },\n TASK_DIALOG_CARD_CONTAINER: {\n padding: \"0px\"\n },\n TASK_DIALOG_LIST_ITEM_ICON: {\n justifyContent: \"center\"\n },\n TASK_DIALOG_ICON: {\n fontSize: \"2rem\"\n },\n TASK_DIALOG_ACTION_CONTAINER: {\n border: 1,\n borderColor: \"text.primary\",\n borderRadius: \"5px\",\n width: \"100%\"\n },\n FILTERS: {\n display: \"table\",\n float: \"right\"\n },\n FILTERS_DATE: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n },\n FILTERS_LEVEL: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_7__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => [\"numb\", \"title\"].includes(name) ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_7__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA;\n};\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }))\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_SECONDARY\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_19___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_19___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_19___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_19___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_19___default().func)\n};\n\n//Генерация диалога задачи\nconst taskDialogRenderer = ({\n task,\n taskColors,\n close,\n handleTaskDetailOpen\n}) => {\n //Стиль и описание для легенды\n const legendDesc = (0,_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.taskLegendDesc)({\n task,\n taskColors\n });\n //Элемент карточки задачи\n const cardItem = ({\n listItemsStyle = {},\n icon,\n primaryText = null,\n secondaryText = null\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], {\n disablePadding: true,\n sx: listItemsStyle\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n sx: STYLES.TASK_DIALOG_LIST_ITEM_ICON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: STYLES.TASK_DIALOG_ICON\n }, icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n primary: primaryText,\n secondary: secondaryText\n })));\n //Собираем содержимое диалога\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], {\n title: task.name,\n titleTypographyProps: {\n variant: \"h6\"\n },\n subheader: `${(0,_core_utils__WEBPACK_IMPORTED_MODULE_7__.formatDateRF)(task.start)} - ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_7__.formatDateRF)(task.end)}`,\n action: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n \"aria-label\": \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\",\n onClick: close\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, \"close\"))\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n sx: STYLES.TASK_DIALOG_CARD_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], null, cardItem({\n icon: \"fast_forward\",\n primaryText: `${task.start_fact} ${task.meas}`,\n secondaryText: \"Запущено\"\n }), cardItem({\n icon: \"assessment\",\n primaryText: `${task.main_quant} ${task.meas}`,\n secondaryText: \"Количество план\"\n }), cardItem({\n icon: \"verified\",\n primaryText: `${task.rel_fact} ${task.meas}`,\n secondaryText: \"Количество сдано\"\n }), cardItem({\n icon: \"date_range\",\n primaryText: task.rep_date_to,\n secondaryText: \"Дата выпуска план\"\n }), legendDesc ? cardItem({\n listItemsStyle: legendDesc.style,\n icon: \"palette\",\n secondaryText: legendDesc.text\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n disableSpacing: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n p: 2,\n display: \"flex\",\n justifyContent: \"center\",\n sx: STYLES.TASK_DIALOG_ACTION_CONTAINER\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_7__.hasValue)(task.type) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n size: \"large\",\n variant: \"contained\",\n color: \"primary\",\n onClick: () => handleTaskDetailOpen(task.rn, task.type)\n }, task[\"detail_list\"]) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n color: \"textSecondary\"\n }, `Анализ отклонений недоступен${task[\"detail_list\"] ? `: ${task[\"detail_list\"]}` : \"\"}`))));\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgGanttDef: {},\n selectedPlanCtlgSpecs: [],\n selectedTaskDetail: null,\n selectedTaskDetailType: null,\n planSpec: null\n });\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveDocs: false\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_8__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_3__.NavigationCtx);\n\n //Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_PP_CTLG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n selectedPlanCtlgSpecs: [],\n selectedPlanCtlgGanttDef: {},\n showPlanList: false,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort,\n NFCPRODPLANSP: state.planSpec\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n selectedPlanCtlgGanttDef: doc.XGANTT_DEF ? {\n ...doc.XGANTT_DEF\n } : {},\n selectedPlanCtlgSpecs: [...(doc?.XGANTT_TASKS || [])]\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg, state.planSpec]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const actionPrms = getNavigationSearch();\n if (actionPrms.NSPRN) setState(pv => ({\n ...pv,\n planSpec: parseInt(actionPrms.NSPRN),\n init: true\n }));else initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана или при явном указании позиции спецификации плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg || state.planSpec) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, state.planSpec, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //При закрытии окна детализации\n const handleTaskDetailClose = () => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n };\n\n //При открытии окна детализации\n const handleTaskDetailOpen = (taskRn, taskType) => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: taskRn,\n selectedTaskDetailType: taskType\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], null, !state.planSpec ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n }))) : null, state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.selectedPlanCtlgSpecs.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n pt: 3\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: state.planSpec ? \"Не найдено данных для выбранной позиции плана\" : \"В каталоге планов отсутствуют записи спецификации\"\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], null, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n sx: STYLES.FILTERS,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n sx: STYLES.FILTERS_DATE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n sx: STYLES.FILTERS_LEVEL\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], {\n value: el,\n key: el\n }, el))))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_6__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.selectedPlanCtlgGanttDef, {\n containerStyle: STYLES.GANTT_CONTAINER,\n titleStyle: STYLES.GANTT_TITLE,\n tasks: state.selectedPlanCtlgSpecs,\n taskDialogRenderer: prms => taskDialogRenderer({\n ...prms,\n handleTaskDetailOpen\n })\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n pt: 3\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: state.planSpec ? \"Загружаю график для выбранной позиции плана...\" : \"Укажите каталог планов для отображения их спецификаций\"\n })) : null)) : null, state.selectedTaskDetail ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__[\"default\"], {\n open: true,\n onClose: handleTaskDetailClose,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_37__[\"default\"], null, [0, 1, 4].includes(state.selectedTaskDetailType) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_9__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_10__.IncomFromDepsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }), state.selectedTaskDetailType === 3 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n sx: STYLES.SECOND_TABLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_9__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_38__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n onClick: handleTaskDetailClose\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecCostProdPlans: () => (/* binding */ MechRecCostProdPlans)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormGroup/FormGroup.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardHeader/CardHeader.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/InputLabel/InputLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Select/Select.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/MenuItem/MenuItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_cost_prod_plans/hooks.js\");\n/* harmony import */ var _datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./datagrids/fcroutlst */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js\");\n/* harmony import */ var _datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./datagrids/incomefromdeps */ \"./app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственная программа\r\n Панель мониторинга: Корневая панель производственной программы\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст навигации\n //Подключение компонентов к настройкам приложения\n //Заголовок страницы\n //Типовые стили\n //Диаграмма Ганта\n //Вспомогательные функции\n //Вспомогательные хуки\n //Таблица \"Маршрутные листы\"\n //Таблица \"Приходы из подразделений\"\n\n//---------\n//Константы\n//---------\n\n//Склонения для документов\nconst DECLINATIONS = [\"план\", \"плана\", \"планов\"];\n\n//Поля сортировки\nconst SORT_REP_DATE = \"DREP_DATE\";\nconst SORT_REP_DATE_TO = \"DREP_DATE_TO\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_CHECKBOX_HAVEDOCS: {\n alignContent: \"space-around\"\n },\n PLANS_LIST_ITEM_ZERODOCS: {\n backgroundColor: \"#ebecec\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.6rem\",\n textTransform: \"uppercase\"\n },\n PLANS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n left: \"16px\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n paddingTop: \"24px\"\n },\n GANTT_TITLE: {\n paddingLeft: \"250px\",\n paddingRight: \"250px\"\n },\n SECOND_TABLE: {\n paddingTop: \"30px\"\n },\n TASK_DIALOG_CARD_CONTAINER: {\n padding: \"0px\"\n },\n TASK_DIALOG_LIST_ITEM_ICON: {\n justifyContent: \"center\"\n },\n TASK_DIALOG_ICON: {\n fontSize: \"2rem\"\n },\n TASK_DIALOG_ACTION_CONTAINER: {\n border: 1,\n borderColor: \"text.primary\",\n borderRadius: \"5px\",\n width: \"100%\"\n },\n FILTERS: {\n display: \"table\",\n float: \"right\"\n },\n FILTERS_DATE: {\n display: \"table-cell\",\n verticalAlign: \"middle\"\n },\n FILTERS_LEVEL: {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n paddingLeft: \"15px\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Разбор XML с данными спецификации производственной программы\nconst parseProdPlanSpXML = async xmlDoc => {\n const data = await (0,_core_utils__WEBPACK_IMPORTED_MODULE_8__.xml2JSON)({\n xmlDoc,\n attributeValueProcessor: (name, val) => [\"numb\", \"title\"].includes(name) ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_8__.formatDateJSONDateOnly)(val) : val\n });\n return data.XDATA.XGANTT;\n};\n\n//Форматирование для отображения количества документов\nconst formatCountDocs = nCountDocs => {\n //Получаем последнюю цифру в значении\n let num = nCountDocs % 100 % 10;\n //Документов\n if (nCountDocs > 10 && nCountDocs < 20) return `${nCountDocs} ${DECLINATIONS[2]}`;\n //Документа\n if (num > 1 && num < 5) return `${nCountDocs} ${DECLINATIONS[1]}`;\n //Документ\n if (num == 1) return `${nCountDocs} ${DECLINATIONS[0]}`;\n //Документов\n return `${nCountDocs} ${DECLINATIONS[2]}`;\n};\n\n//Список каталогов планов\nconst PlanCtlgsList = ({\n planCtlgs = [],\n selectedPlanCtlg,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\",\n value: filter.ctlgName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n ctlgName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: STYLES.PLANS_CHECKBOX_HAVEDOCS\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n checked: filter.haveDocs,\n onChange: event => setFilter(pv => ({\n ...pv,\n haveDocs: event.target.checked\n }))\n }),\n label: \"\\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u0441 \\u043F\\u043B\\u0430\\u043D\\u0430\\u043C\\u0438\",\n labelPlacement: \"end\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, planCtlgs.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: p.NCOUNT_DOCS == 0 ? STYLES.PLANS_LIST_ITEM_ZERODOCS : null,\n key: p.NRN,\n selected: p.NRN === selectedPlanCtlg,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_SECONDARY\n }, formatCountDocs(p.NCOUNT_DOCS))\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanCtlgsList.propTypes = {\n planCtlgs: (prop_types__WEBPACK_IMPORTED_MODULE_20___default().array),\n selectedPlanCtlg: (prop_types__WEBPACK_IMPORTED_MODULE_20___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_20___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_20___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_20___default().func)\n};\n\n//Генерация диалога задачи\nconst taskDialogRenderer = ({\n task,\n taskColors,\n close,\n handleTaskDetailOpen\n}) => {\n //Стиль и описание для легенды\n const legendDesc = (0,_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.taskLegendDesc)({\n task,\n taskColors\n });\n //Элемент карточки задачи\n const cardItem = ({\n listItemsStyle = {},\n icon,\n primaryText = null,\n secondaryText = null\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n disablePadding: true,\n sx: listItemsStyle\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: STYLES.TASK_DIALOG_LIST_ITEM_ICON\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n sx: STYLES.TASK_DIALOG_ICON\n }, icon)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n primary: primaryText,\n secondary: secondaryText\n })));\n //Собираем содержимое диалога\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n title: task.name,\n titleTypographyProps: {\n variant: \"h6\"\n },\n subheader: `${(0,_core_utils__WEBPACK_IMPORTED_MODULE_8__.formatDateRF)(task.start)} - ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_8__.formatDateRF)(task.end)}`,\n action: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n \"aria-label\": \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\",\n onClick: close\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], null, \"close\"))\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n sx: STYLES.TASK_DIALOG_CARD_CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, cardItem({\n icon: \"fast_forward\",\n primaryText: `${task.start_fact} ${task.meas}`,\n secondaryText: \"Запущено\"\n }), cardItem({\n icon: \"assessment\",\n primaryText: `${task.main_quant} ${task.meas}`,\n secondaryText: \"Количество план\"\n }), cardItem({\n icon: \"verified\",\n primaryText: `${task.rel_fact} ${task.meas}`,\n secondaryText: \"Количество сдано\"\n }), cardItem({\n icon: \"date_range\",\n primaryText: task.rep_date_to,\n secondaryText: \"Дата выпуска план\"\n }), legendDesc ? cardItem({\n listItemsStyle: legendDesc.style,\n icon: \"palette\",\n secondaryText: legendDesc.text\n }) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n disableSpacing: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n p: 2,\n display: \"flex\",\n justifyContent: \"center\",\n sx: STYLES.TASK_DIALOG_ACTION_CONTAINER\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_8__.hasValue)(task.type) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n size: \"large\",\n variant: \"contained\",\n color: \"primary\",\n onClick: () => handleTaskDetailOpen(task.rn, task.type)\n }, task[\"detail_list\"]) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n color: \"textSecondary\"\n }, `Анализ отклонений недоступен${task[\"detail_list\"] ? `: ${task[\"detail_list\"]}` : \"\"}`))));\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственной программы\nconst MechRecCostProdPlans = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n planCtlgs: [],\n planCtlgsLoaded: false,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n gantt: {},\n selectedTaskDetail: null,\n selectedTaskDetailType: null,\n planSpec: null\n });\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n ctlgName: \"\",\n haveDocs: false\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_9__.useFilteredPlanCtlgs)(state.planCtlgs, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_3__.NavigationCtx);\n\n //Инициализация каталогов планов\n const initPlanCtlgs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_PP_CTLG_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLAN_CRNS\"\n });\n setState(pv => ({\n ...pv,\n init: true,\n planCtlgs: [...(data?.XFCPRODPLAN_CRNS || [])],\n planCtlgsLoaded: true\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.init, executeStored]);\n\n //Выбор каталога планов\n const selectPlan = project => {\n setState(pv => ({\n ...pv,\n selectedPlanCtlg: project,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n gantt: {},\n showPlanList: false,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n };\n\n //Сброс выбора каталога планов\n const unselectPlan = () => setState(pv => ({\n ...pv,\n selectedPlanCtlgSpecsLoaded: false,\n selectedPlanCtlg: null,\n selectedPlanCtlgMaxLevel: null,\n selectedPlanCtlgLevel: null,\n selectedPlanCtlgSort: null,\n selectedPlanCtlgMenuItems: null,\n gantt: {},\n showPlanList: false,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n\n //Загрузка списка спецификаций каталога планов\n const loadPlanCtglSpecs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (level = null, sort = null) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_GET\",\n args: {\n NCRN: state.selectedPlanCtlg,\n NLEVEL: level,\n SSORT_FIELD: sort,\n NFCPRODPLANSP: state.planSpec\n }\n });\n let doc = await parseProdPlanSpXML(data.COUT);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgMaxLevel: data.NMAX_LEVEL,\n selectedPlanCtlgLevel: level || level === 0 ? level : data.NMAX_LEVEL,\n selectedPlanCtlgSort: sort,\n selectedPlanCtlgMenuItems: state.selectedPlanCtlgMenuItems ? state.selectedPlanCtlgMenuItems : [...Array(data.NMAX_LEVEL).keys()].map(el => el + 1),\n selectedPlanCtlgSpecsLoaded: true,\n gantt: {\n ...doc,\n tasks: [...(doc?.tasks || [])]\n }\n }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [executeStored, state.ident, state.selectedPlanCtlg, state.planSpec]);\n\n //Обработка нажатия на элемент в списке каталогов планов\n const handleProjectClick = project => {\n if (state.selectedPlanCtlg != project.NRN) selectPlan(project.NRN);else unselectPlan();\n };\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const actionPrms = getNavigationSearch();\n if (actionPrms.NSPRN) setState(pv => ({\n ...pv,\n planSpec: parseInt(actionPrms.NSPRN),\n init: true\n }));else initPlanCtlgs();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //При смене выбранного каталога плана или при явном указании позиции спецификации плана\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlanCtlg || state.planSpec) loadPlanCtglSpecs(null, SORT_REP_DATE_TO);\n }, [state.selectedPlanCtlg, state.planSpec, loadPlanCtglSpecs]);\n\n //Выбор уровня\n const handleChangeSelectLevel = selectedLevel => {\n loadPlanCtglSpecs(selectedLevel, state.selectedPlanCtlgSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgLevel: selectedLevel\n }));\n };\n\n //Выбор сортировки\n const handleChangeSelectSort = selectedSort => {\n loadPlanCtglSpecs(state.selectedPlanCtlgLevel, selectedSort);\n setState(pv => ({\n ...pv,\n selectedPlanCtlgSort: selectedSort\n }));\n };\n\n //При закрытии окна детализации\n const handleTaskDetailClose = () => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: null,\n selectedTaskDetailType: null\n }));\n };\n\n //При открытии окна детализации\n const handleTaskDetailOpen = (taskRn, taskType) => {\n setState(pv => ({\n ...pv,\n selectedTaskDetail: taskRn,\n selectedTaskDetailType: taskType\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null, !state.planSpec ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041A\\u0430\\u0442\\u0430\\u043B\\u043E\\u0433\\u0438 \\u043F\\u043B\\u0430\\u043D\\u043E\\u0432\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanCtlgsList, {\n planCtlgs: filteredPlanCtgls,\n selectedPlanCtlg: state.selectedPlanCtlg,\n filter: filter,\n setFilter: setFilter,\n onClick: handleProjectClick\n }))) : null, state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedPlanCtlgSpecsLoaded ? state.gantt.tasks.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n pt: 3\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: state.planSpec ? \"Не найдено данных для выбранной позиции плана\" : \"В каталоге планов отсутствуют записи спецификации\"\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null, state.selectedPlanCtlgMaxLevel ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n sx: STYLES.FILTERS,\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n sx: STYLES.FILTERS_DATE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {\n id: \"select-label-sort\"\n }, \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], {\n labelId: \"select-label-sort\",\n id: \"select-sort\",\n value: state.selectedPlanCtlgSort,\n label: \"\\u0421\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u043A\\u0430\",\n onChange: event => {\n handleChangeSelectSort(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__[\"default\"], {\n value: SORT_REP_DATE_TO,\n key: \"1\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0432\\u044B\\u043F\\u0443\\u0441\\u043A\\u0430\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__[\"default\"], {\n value: SORT_REP_DATE,\n key: \"2\"\n }, \"\\u0414\\u0430\\u0442\\u0430 \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\"))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n sx: STYLES.FILTERS_LEVEL\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__[\"default\"], {\n id: \"select-label-level\"\n }, \"\\u0414\\u043E \\u0443\\u0440\\u043E\\u0432\\u043D\\u044F\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__[\"default\"], {\n labelId: \"select-label-level\",\n id: \"select-level\",\n value: state.selectedPlanCtlgLevel,\n label: \"\\u0423\\u0440\\u043E\\u0432\\u0435\\u043D\\u044C\",\n onChange: event => {\n handleChangeSelectLevel(event.target.value);\n },\n defaultValue: state.selectedPlanCtlgLevel\n }, state.selectedPlanCtlgMenuItems.map(el => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__[\"default\"], {\n value: el,\n key: el\n }, el))))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_7__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.gantt, {\n containerStyle: STYLES.GANTT_CONTAINER,\n titleStyle: STYLES.GANTT_TITLE,\n taskDialogRenderer: prms => taskDialogRenderer({\n ...prms,\n handleTaskDetailOpen\n })\n }))) : !state.selectedPlanCtlg ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n pt: 3\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: state.planSpec ? \"Загружаю график для выбранной позиции плана...\" : \"Укажите каталог планов для отображения их спецификаций\"\n })) : null)) : null, state.selectedTaskDetail ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_37__[\"default\"], {\n open: true,\n onClose: handleTaskDetailClose,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_38__[\"default\"], null, [0, 1, 4].includes(state.selectedTaskDetailType) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_10__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_incomefromdeps__WEBPACK_IMPORTED_MODULE_11__.IncomFromDepsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n }), state.selectedTaskDetailType === 3 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], {\n sx: STYLES.SECOND_TABLE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_datagrids_fcroutlst__WEBPACK_IMPORTED_MODULE_10__.CostRouteListsDataGrid, {\n task: state.selectedTaskDetail,\n taskType: state.selectedTaskDetailType\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_39__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n onClick: handleTaskDetailClose\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\"))) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js?"); /***/ }), @@ -5075,7 +5086,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilter: () => (/* binding */ useFilter),\n/* harmony export */ useInsDepartment: () => (/* binding */ useInsDepartment),\n/* harmony export */ useMechRecDeptCostJobs: () => (/* binding */ useMechRecDeptCostJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Загрузка цеха\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE_SMALL = 5;\nconst DATA_GRID_PAGE_SIZE_LARGE = 12;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для основной таблицы панели\nconst useMechRecDeptCostJobs = (subdiv, fullDate, workHours) => {\n //Собственное состояние - таблица данных\n const [costJobs, setCostJobs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0,\n date: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если указано подразделение и необходимо обновить, либо изменилась дата\n if (subdiv && (costJobs.reload || costJobs.date !== fullDate)) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBS_DEP_LOAD_DG_GET\",\n args: {\n NSUBDIV: subdiv,\n SMONTH_YEAR: fullDate,\n NWORKHOURS: workHours,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costJobs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costJobs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: 1\n },\n respArg: \"COUT\"\n });\n setCostJobs(pv => ({\n ...pv,\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE,\n date: fullDate\n }));\n };\n loadData();\n }\n }, [costJobs.reload, subdiv, fullDate, costJobs.date, costJobs.orders, costJobs.pageNumber, executeStored, workHours, SERV_DATA_TYPE_CLOB]);\n return [costJobs, setCostJobs];\n};\n\n//Хук таблицы подразделений цехов\nconst useInsDepartment = fullDate => {\n //Собственное состояние\n let [insDepartments, setInsDepartments] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INS_DEPARTMENT_DG_GET\",\n args: {\n SMONTH_YEAR: fullDate,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_SMALL,\n NINCLUDE_DEF: insDepartments.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"DBGNDATE\", \"DENDDATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val\n });\n setInsDepartments(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_SMALL\n }));\n };\n if (insDepartments.reload) {\n loadData();\n }\n }, [executeStored, fullDate, insDepartments.dataLoaded, insDepartments.reload]);\n return [insDepartments, setInsDepartments];\n};\n\n//Хук для диалога фильтра\nconst useFilter = (currentMonth, currentYear) => {\n //Собственное состояние - фильтр\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: true,\n openedDepartment: false,\n date: {\n month: currentMonth,\n year: currentYear,\n fullDate: currentMonth.toString().padStart(2, \"0\") + \".\" + currentYear\n },\n department: {\n NRN: null,\n SCODE: \"\",\n SNAME: \"\"\n },\n workDays: 0,\n workHours: 0,\n totalWorkHours: 0\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Считываем количества рабочих дней\n const getWorkDays = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n newDate,\n init\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ENPERIOD_WORKDAYS_GET\",\n args: {\n SMONTH_YEAR: newDate.fullDate\n }\n });\n if (init) {\n setFilter(pv => ({\n ...pv,\n workDays: data.NWORKDAYS,\n init: false\n }));\n } else {\n setFilter(pv => ({\n ...pv,\n date: {\n ...newDate\n },\n department: filter.department,\n workDays: data.NWORKDAYS,\n totalWorkHours: data.NWORKDAYS * filter.workHours\n }));\n }\n }, [executeStored, filter]);\n\n //Считываем количество рабочих часов\n const getWorkHours = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async department => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INS_DEPARTMENT_WORKHOURS_GET\",\n args: {\n NSUBDIV: department.NRN\n }\n });\n setFilter(pv => ({\n ...pv,\n openedDepartment: false,\n department: {\n ...department\n },\n workHours: data.NWORKHOURS,\n totalWorkHours: Math.round(filter.workDays * data.NWORKHOURS)\n }));\n }, [executeStored, filter.workDays]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.init) {\n getWorkDays({\n newDate: {\n month: filter.date.month,\n year: filter.date.year,\n fullDate: filter.date.fullDate\n },\n init: filter.init\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filter.init]);\n return [filter, setFilter, getWorkDays, getWorkHours];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_jobs/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useFilter: () => (/* binding */ useFilter),\n/* harmony export */ useInsDepartment: () => (/* binding */ useInsDepartment),\n/* harmony export */ useMechRecDeptCostJobs: () => (/* binding */ useMechRecDeptCostJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Загрузка цеха\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE_SMALL = 5;\nconst DATA_GRID_PAGE_SIZE_LARGE = 12;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для основной таблицы панели\nconst useMechRecDeptCostJobs = (subdiv, fullDate, workHours) => {\n //Собственное состояние - таблица данных\n const [costJobs, setCostJobs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0,\n date: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Если указано подразделение и необходимо обновить, либо изменилась дата\n if (subdiv && (costJobs.reload || costJobs.date !== fullDate)) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCJOBS_DEP_LOAD_DG_GET\",\n args: {\n NSUBDIV: subdiv,\n SMONTH_YEAR: fullDate,\n NWORKHOURS: workHours,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costJobs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costJobs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: 1\n },\n respArg: \"COUT\"\n });\n setCostJobs(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE,\n date: fullDate\n }));\n };\n loadData();\n }\n }, [costJobs.reload, subdiv, fullDate, costJobs.date, costJobs.orders, costJobs.pageNumber, executeStored, workHours, SERV_DATA_TYPE_CLOB]);\n return [costJobs, setCostJobs];\n};\n\n//Хук таблицы подразделений цехов\nconst useInsDepartment = fullDate => {\n //Собственное состояние\n let [insDepartments, setInsDepartments] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INS_DEPARTMENT_DG_GET\",\n args: {\n SMONTH_YEAR: fullDate,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_SMALL,\n NINCLUDE_DEF: insDepartments.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => [\"DBGNDATE\", \"DENDDATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val\n });\n setInsDepartments(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_SMALL\n }));\n };\n if (insDepartments.reload) {\n loadData();\n }\n }, [executeStored, fullDate, insDepartments.dataLoaded, insDepartments.reload]);\n return [insDepartments, setInsDepartments];\n};\n\n//Хук для диалога фильтра\nconst useFilter = (currentMonth, currentYear) => {\n //Собственное состояние - фильтр\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: true,\n openedDepartment: false,\n date: {\n month: currentMonth,\n year: currentYear,\n fullDate: currentMonth.toString().padStart(2, \"0\") + \".\" + currentYear\n },\n department: {\n NRN: null,\n SCODE: \"\",\n SNAME: \"\"\n },\n workDays: 0,\n workHours: 0,\n totalWorkHours: 0\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Считываем количества рабочих дней\n const getWorkDays = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n newDate,\n init\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.ENPERIOD_WORKDAYS_GET\",\n args: {\n SMONTH_YEAR: newDate.fullDate\n }\n });\n if (init) {\n setFilter(pv => ({\n ...pv,\n workDays: data.NWORKDAYS,\n init: false\n }));\n } else {\n setFilter(pv => ({\n ...pv,\n date: {\n ...newDate\n },\n department: filter.department,\n workDays: data.NWORKDAYS,\n totalWorkHours: data.NWORKDAYS * filter.workHours\n }));\n }\n }, [executeStored, filter]);\n\n //Считываем количество рабочих часов\n const getWorkHours = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async department => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INS_DEPARTMENT_WORKHOURS_GET\",\n args: {\n NSUBDIV: department.NRN\n }\n });\n setFilter(pv => ({\n ...pv,\n openedDepartment: false,\n department: {\n ...department\n },\n workHours: data.NWORKHOURS,\n totalWorkHours: Math.round(filter.workDays * data.NWORKHOURS)\n }));\n }, [executeStored, filter.workDays]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (filter.init) {\n getWorkDays({\n newDate: {\n month: filter.date.month,\n year: filter.date.year,\n fullDate: filter.date.fullDate\n },\n init: filter.init\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filter.init]);\n return [filter, setFilter, getWorkDays, getWorkHours];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_jobs/hooks.js?"); /***/ }), @@ -5130,7 +5141,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostRouteLists: () => (/* binding */ useCostRouteLists),\n/* harmony export */ useCostRouteListsSpecs: () => (/* binding */ useCostRouteListsSpecs),\n/* harmony export */ useDeptCostProdPlans: () => (/* binding */ useDeptCostProdPlans),\n/* harmony export */ useFilteredPlans: () => (/* binding */ useFilteredPlans),\n/* harmony export */ useIncomFromDeps: () => (/* binding */ useIncomFromDeps)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственный план цеха\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE_SMALL = 5;\nconst DATA_GRID_PAGE_SIZE_LARGE = 10;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор каталогов по поисковой фразе и наличию планов\nconst useFilteredPlans = (plans, filter) => {\n const filteredPlans = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return plans.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.planName));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//Хук для основной таблицы\nconst useDeptCostProdPlans = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n planList: [],\n planListLoaded: false,\n selectedPlan: {},\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan.NRN) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_DEPT_DG_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan.NRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(state.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: state.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: state.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => name === \"caption\" ? undefined : val\n });\n setState(pv => ({\n ...pv,\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE\n }));\n };\n if (state.reload) {\n loadData();\n }\n }\n }, [state.selectedPlan, state.reload, state.orders, state.pageNumber, state.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const initPlans = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\",\n attributeValueProcessor: (name, val) => name === \"SPERIOD\" ? undefined : val\n });\n setState(pv => ({\n ...pv,\n init: true,\n planList: [...(data?.XFCPRODPLANS || [])],\n planListLoaded: true\n }));\n };\n if (!state.init) {\n initPlans();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return [state, setState];\n};\n\n//Хук для таблицы маршрутных листов\nconst useCostRouteLists = task => {\n //Собственное состояние - таблица данных\n const [costRouteLists, setCostRouteLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n editPriorNRN: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DEPT_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_SMALL,\n NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteLists(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_SMALL\n }));\n };\n if (costRouteLists.reload && task) {\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, costRouteLists.dataLoaded, costRouteLists.orders, costRouteLists.pageNumber, costRouteLists.reload, executeStored, task]);\n return [costRouteLists, setCostRouteLists];\n};\n\n//Хук для таблицы строк маршрутного листа\nconst useCostRouteListsSpecs = mainRowRN => {\n //Собственное состояние - таблица данных\n const [costRouteListsSpecs, setCostRouteListsSpecs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLSTSP_DEPT_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteListsSpecs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteListsSpecs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: costRouteListsSpecs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteListsSpecs(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE\n }));\n };\n if (costRouteListsSpecs.reload) {\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, costRouteListsSpecs.dataLoaded, costRouteListsSpecs.orders, costRouteListsSpecs.pageNumber, costRouteListsSpecs.reload, executeStored, mainRowRN]);\n return [costRouteListsSpecs, setCostRouteListsSpecs];\n};\n\n//Хук для таблицы сдачи продукции\nconst useIncomFromDeps = task => {\n //Собственное состояние - таблица данных\n const [incomFromDeps, setIncomFromDeps] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DEPT_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(incomFromDeps.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: incomFromDeps.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DDUE_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setIncomFromDeps(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE_LARGE\n }));\n };\n if (incomFromDeps.reload) {\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, executeStored, incomFromDeps.dataLoaded, incomFromDeps.orders, incomFromDeps.pageNumber, incomFromDeps.reload, task]);\n return [incomFromDeps, setIncomFromDeps];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCostRouteLists: () => (/* binding */ useCostRouteLists),\n/* harmony export */ useCostRouteListsSpecs: () => (/* binding */ useCostRouteListsSpecs),\n/* harmony export */ useDeptCostProdPlans: () => (/* binding */ useDeptCostProdPlans),\n/* harmony export */ useFilteredPlans: () => (/* binding */ useFilteredPlans),\n/* harmony export */ useIncomFromDeps: () => (/* binding */ useIncomFromDeps)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственный план цеха\r\n Кастомные хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст взаимодействия с сервером\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE_SMALL = 5;\nconst DATA_GRID_PAGE_SIZE_LARGE = 10;\n\n//-----------\n//Тело модуля\n//-----------\n\n//Клиентский отбор каталогов по поисковой фразе и наличию планов\nconst useFilteredPlans = (plans, filter) => {\n const filteredPlans = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {\n return plans.filter(catalog => catalog.SDOC_INFO.toString().toLowerCase().includes(filter.planName));\n }, [plans, filter]);\n return filteredPlans;\n};\n\n//Хук для основной таблицы\nconst useDeptCostProdPlans = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n showPlanList: false,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n planList: [],\n planListLoaded: false,\n selectedPlan: {},\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedPlan.NRN) {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLANSP_DEPT_DG_GET\",\n args: {\n NFCPRODPLAN: state.selectedPlan.NRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(state.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: state.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: state.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\",\n attributeValueProcessor: (name, val) => name === \"caption\" ? undefined : val\n });\n setState(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE\n }));\n };\n if (state.reload) {\n loadData();\n }\n }\n }, [state.selectedPlan, state.reload, state.orders, state.pageNumber, state.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const initPlans = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT\",\n args: {},\n respArg: \"COUT\",\n isArray: name => name === \"XFCPRODPLANS\",\n attributeValueProcessor: (name, val) => name === \"SPERIOD\" ? undefined : val\n });\n setState(pv => ({\n ...pv,\n init: true,\n planList: [...(data?.XFCPRODPLANS || [])],\n planListLoaded: true\n }));\n };\n if (!state.init) {\n initPlans();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return [state, setState];\n};\n\n//Хук для таблицы маршрутных листов\nconst useCostRouteLists = task => {\n //Собственное состояние - таблица данных\n const [costRouteLists, setCostRouteLists] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n editPriorNRN: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLST_DEPT_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteLists.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteLists.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_SMALL,\n NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteLists(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_SMALL\n }));\n };\n if (costRouteLists.reload && task) {\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, costRouteLists.dataLoaded, costRouteLists.orders, costRouteLists.pageNumber, costRouteLists.reload, executeStored, task]);\n return [costRouteLists, setCostRouteLists];\n};\n\n//Хук для таблицы строк маршрутного листа\nconst useCostRouteListsSpecs = mainRowRN => {\n //Собственное состояние - таблица данных\n const [costRouteListsSpecs, setCostRouteListsSpecs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.FCROUTLSTSP_DEPT_DG_GET\",\n args: {\n NFCROUTLST: mainRowRN,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(costRouteListsSpecs.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: costRouteListsSpecs.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: costRouteListsSpecs.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setCostRouteListsSpecs(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE\n }));\n };\n if (costRouteListsSpecs.reload) {\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, costRouteListsSpecs.dataLoaded, costRouteListsSpecs.orders, costRouteListsSpecs.pageNumber, costRouteListsSpecs.reload, executeStored, mainRowRN]);\n return [costRouteListsSpecs, setCostRouteListsSpecs];\n};\n\n//Хук для таблицы сдачи продукции\nconst useIncomFromDeps = task => {\n //Собственное состояние - таблица данных\n const [incomFromDeps, setIncomFromDeps] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DEPT_DG_GET\",\n args: {\n NFCPRODPLANSP: task,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.object2Base64XML)(incomFromDeps.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: incomFromDeps.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE_LARGE,\n NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => [\"DDUE_DATE\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatDateRF)(val) : val,\n respArg: \"COUT\"\n });\n setIncomFromDeps(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE_LARGE\n }));\n };\n if (incomFromDeps.reload) {\n loadData();\n }\n }, [SERV_DATA_TYPE_CLOB, executeStored, incomFromDeps.dataLoaded, incomFromDeps.orders, incomFromDeps.pageNumber, incomFromDeps.reload, task]);\n return [incomFromDeps, setIncomFromDeps];\n};\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/hooks.js?"); /***/ }), @@ -5163,7 +5174,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecDeptCostProdPlans: () => (/* binding */ MechRecDeptCostProdPlans),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _incomefromdeps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./incomefromdeps */ \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\");\n/* harmony import */ var _fcroutlst__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fcroutlst */ \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственный план цеха\r\n Панель мониторинга: Корневая панель производственного плана цеха\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Типовые стили\n //Заголовок страницы\n //Вспомогательные хуки\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст сообщений\n //Диалог сдачи продукции\n //Диалог маршрутных листов\n\n//---------\n//Константы\n//---------\n\n//Высота заголовка\nconst TITLE_HEIGHT = \"35px\";\n\n//Верхний отступ заголовка\nconst TITLE_PADDING_TOP = \"10px\";\n\n//Нижний отступ заголовка\nconst TITLE_PADDING_BOTTOM = \"20px\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\"\n }\n },\n CONTAINER: {\n textAlign: \"center\"\n },\n TITLE: {\n height: TITLE_HEIGHT,\n overflow: \"hidden\",\n paddingTop: TITLE_PADDING_TOP,\n paddingBottom: TITLE_PADDING_BOTTOM,\n display: \"inline-table\"\n },\n DATA_GRID_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__.APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${TITLE_PADDING_TOP} - ${TITLE_PADDING_BOTTOM} - 29px)`,\n width: \"98vw\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n },\n DATA_GRID_GROUP_CELL: {\n padding: \"2px\"\n },\n DATA_GRID_CELL: {\n padding: \"8px\",\n maxWidth: \"300px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\"\n },\n DATA_GRID_CELL_STATUS: (currentStyle, row) => ({\n backgroundColor: getRowBackgroudColor(row),\n ...currentStyle\n }),\n DATA_GRID_CELL_PLAN_FACT: currentStyle => ({\n ...currentStyle,\n backgroundColor: \"lightgrey\"\n }),\n DATA_GRID_CELL_MATRES_CODE: (currentStyle, row) => ({\n backgroundColor: getRowBackgroudColor(row),\n ...currentStyle\n }),\n PLAN_FACT_VALUE: {\n textAlign: \"center\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n PLAN_FACT_DELIMITER: {\n padding: \"0px 5px\"\n },\n FACT_VALUE: {\n color: \"blue\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = ({\n group\n}) => ({\n cellStyle: STYLES.DATA_GRID_GROUP_CELL,\n data: group.caption\n});\n\n//Вычисление цвета заливки для строки\nconst getRowBackgroudColor = row => {\n //Факт === План\n if (row[\"NMAIN_QUANT\"] === row[\"NREL_FACT\"]) return \"lightgreen\";\n //План <= (Факт + Запущено)\n if (row[\"NMAIN_QUANT\"] <= row[\"NREL_FACT\"] + row[\"NFCROUTLST_QUANT\"]) return \"lightblue\";\n //Сумма \"Количество план\" = 0 или < \"План\"\n if (row[\"NSUM_PLAN\"] === 0 || row[\"NSUM_PLAN\"] !== 0 && row[\"NSUM_PLAN\"] < row[\"NMAIN_QUANT\"]) {\n //\"Факт\" >= \"План\"\n if (row[\"NREL_FACT\"] >= row[\"NMAIN_QUANT\"]) return \"#F0E68C\";\n } else {\n //Сумма \"Количество факт\" >= сумма \"Количество план\"\n if (row[\"NSUM_FACT\"] >= row[\"NSUM_PLAN\"]) return \"#F0E68C\";\n }\n return \"lightcoral\";\n};\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef,\n handleProdOrderClick,\n handleMatresCodeClick\n}) => {\n //Описываем общие свойства\n let cellProps = {\n title: row[columnDef.name]\n };\n //Описываем общий стиль\n let cellStyle = STYLES.DATA_GRID_CELL;\n //Для колонки \"Статус\"\n if (columnDef.name === \"SSTATUS\") return {\n cellProps,\n cellStyle: STYLES.DATA_GRID_CELL_STATUS(cellStyle, row),\n data: row[columnDef]\n };\n //Для колонки даты\n if (columnDef.name.indexOf(\"PLAN_FACT\") >= 0) {\n //Получаем текущий день\n let curDay = new Date().getDate().toString().padStart(2, \"0\");\n //Формируем regex для проверки\n let regex = new RegExp(`N_${curDay}.*`, \"g\");\n //Если это значение текущего дня\n if (columnDef.name.match(regex)) cellStyle = STYLES.DATA_GRID_CELL_PLAN_FACT(cellStyle);\n //Если в колонке есть значение\n if (row[columnDef.name]) {\n //Разбиваем его на план/факт\n let values = row[columnDef.name].split(\"/\");\n //Разбиваем значения на блоки\n return {\n cellProps,\n cellStyle,\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLAN_FACT_VALUE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, values[0]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLAN_FACT_DELIMITER\n }, \"/\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.FACT_VALUE\n }, values[1]))\n };\n } else return {\n cellProps,\n cellStyle,\n data: row[columnDef]\n };\n }\n //Для колонки \"Заказ\"\n if (columnDef.name === \"SPROD_ORDER\") {\n return {\n cellProps,\n cellStyle,\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => handleProdOrderClick(row[\"NRN\"])\n }, row[columnDef.name])\n };\n }\n //Для колонки \"Обозначение\"\n if (columnDef.name === \"SMATRES_CODE\") return {\n cellProps,\n cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => handleMatresCodeClick(row[\"NRN\"])\n }, row[columnDef.name])\n };\n //Для всех остальных\n return {\n cellProps,\n cellStyle,\n data: row[columnDef]\n };\n};\n\n//Список каталогов планов\nconst PlanList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter.planName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n planName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan.NRN,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственного плана цеха\nconst MechRecDeptCostProdPlans = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useDeptCostProdPlans)();\n\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n planName: \"\"\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useFilteredPlans)(state.planList, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Выбор плана\n const selectPlan = plan => {\n setState(pv => ({\n ...pv,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n selectedPlan: plan,\n showPlanList: false,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n selectedPlan: {},\n showPlanList: false,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n\n //Обработка нажатия на элемент в списке планов\n const handlePlanClick = plan => {\n if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan);else unselectPlan();\n };\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setState(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setState(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на \"Заказ\"\n const handleProdOrderClick = planSp => {\n setState(pv => ({\n ...pv,\n showIncomeFromDeps: planSp\n }));\n };\n\n //При нажатии на \"Обозначение\"\n const handleMatresCodeClick = planSp => {\n setState(pv => ({\n ...pv,\n showFcroutelst: planSp\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanList, {\n plans: filteredPlanCtgls,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handlePlanClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, state.dataLoaded ? state.rows.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, `Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n sx: STYLES.DATA_GRID_CONTAINER\n },\n fixedHeader: state.fixedHeader,\n fixedColumns: state.fixedColumns,\n columnsDef: state.columnsDef,\n rows: state.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: state.morePages,\n reloading: state.reload,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handleProdOrderClick,\n handleMatresCodeClick\n }),\n groupCellRender: groupCellRender\n })))) : !state.selectedPlan.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения спецификаций\"\n }) : null))), state.showIncomeFromDeps ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_incomefromdeps__WEBPACK_IMPORTED_MODULE_7__.IncomFromDepsDataGridDialog, {\n task: state.showIncomeFromDeps,\n onClose: () => handleProdOrderClick(null)\n }) : null, state.showFcroutelst ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcroutlst__WEBPACK_IMPORTED_MODULE_8__.CostRouteListsDataGridDialog, {\n task: state.showFcroutelst,\n onClose: () => handleMatresCodeClick(null)\n }) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MechRecDeptCostProdPlans: () => (/* binding */ MechRecDeptCostProdPlans),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _hooks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./hooks */ \"./app/panels/mech_rec_dept_cost_prod_plans/hooks.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _incomefromdeps__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./incomefromdeps */ \"./app/panels/mech_rec_dept_cost_prod_plans/incomefromdeps.js\");\n/* harmony import */ var _fcroutlst__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fcroutlst */ \"./app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Производственный план цеха\r\n Панель мониторинга: Корневая панель производственного плана цеха\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Типовые стили\n //Заголовок страницы\n //Вспомогательные хуки\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст сообщений\n //Диалог сдачи продукции\n //Диалог маршрутных листов\n\n//---------\n//Константы\n//---------\n\n//Высота заголовка\nconst TITLE_HEIGHT = \"35px\";\n\n//Верхний отступ заголовка\nconst TITLE_PADDING_TOP = \"10px\";\n\n//Нижний отступ заголовка\nconst TITLE_PADDING_BOTTOM = \"20px\";\n\n//Стили\nconst STYLES = {\n PLANS_FINDER: {\n marginTop: \"10px\",\n marginLeft: \"10px\",\n width: \"93%\"\n },\n PLANS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PLANS_BUTTON: {\n position: \"absolute\"\n },\n PLANS_DRAWER: {\n width: \"350px\",\n display: \"inline-block\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"350px\",\n display: \"inline-block\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n }\n },\n CONTAINER: {\n textAlign: \"center\"\n },\n TITLE: {\n height: TITLE_HEIGHT,\n overflow: \"hidden\",\n paddingTop: TITLE_PADDING_TOP,\n paddingBottom: TITLE_PADDING_BOTTOM,\n display: \"inline-table\"\n },\n DATA_GRID_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__.APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${TITLE_PADDING_TOP} - ${TITLE_PADDING_BOTTOM} - 29px)`,\n width: \"98vw\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n },\n DATA_GRID_GROUP_CELL: {\n padding: \"2px\"\n },\n DATA_GRID_CELL: {\n padding: \"8px\",\n maxWidth: \"300px\",\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"pre\"\n },\n DATA_GRID_CELL_STATUS: (currentStyle, row) => ({\n backgroundColor: getRowBackgroudColor(row),\n ...currentStyle\n }),\n DATA_GRID_CELL_PLAN_FACT: currentStyle => ({\n ...currentStyle,\n backgroundColor: \"lightgrey\"\n }),\n DATA_GRID_CELL_MATRES_CODE: (currentStyle, row) => ({\n backgroundColor: getRowBackgroudColor(row),\n ...currentStyle\n }),\n PLAN_FACT_VALUE: {\n textAlign: \"center\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n PLAN_FACT_DELIMITER: {\n padding: \"0px 5px\"\n },\n FACT_VALUE: {\n color: \"blue\"\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = ({\n group\n}) => ({\n cellStyle: STYLES.DATA_GRID_GROUP_CELL,\n data: group.caption\n});\n\n//Вычисление цвета заливки для строки\nconst getRowBackgroudColor = row => {\n //Факт === План\n if (row[\"NMAIN_QUANT\"] === row[\"NREL_FACT\"]) return \"lightgreen\";\n //План <= (Факт + Запущено)\n if (row[\"NMAIN_QUANT\"] <= row[\"NREL_FACT\"] + row[\"NFCROUTLST_QUANT\"]) return \"lightblue\";\n //Сумма \"Количество план\" = 0 или < \"План\"\n if (row[\"NSUM_PLAN\"] === 0 || row[\"NSUM_PLAN\"] !== 0 && row[\"NSUM_PLAN\"] < row[\"NMAIN_QUANT\"]) {\n //\"Факт\" >= \"План\"\n if (row[\"NREL_FACT\"] >= row[\"NMAIN_QUANT\"]) return \"#F0E68C\";\n } else {\n //Сумма \"Количество факт\" >= сумма \"Количество план\"\n if (row[\"NSUM_FACT\"] >= row[\"NSUM_PLAN\"]) return \"#F0E68C\";\n }\n return \"lightcoral\";\n};\n\n//Генерация заливки строки исходя от значений\nconst dataCellRender = ({\n row,\n columnDef,\n handleProdOrderClick,\n handleMatresCodeClick\n}) => {\n //Описываем общие свойства\n let cellProps = {\n title: row[columnDef.name]\n };\n //Описываем общий стиль\n let cellStyle = STYLES.DATA_GRID_CELL;\n //Для колонки \"Статус\"\n if (columnDef.name === \"SSTATUS\") return {\n cellProps,\n cellStyle: STYLES.DATA_GRID_CELL_STATUS(cellStyle, row),\n data: row[columnDef]\n };\n //Для колонки даты\n if (columnDef.name.indexOf(\"PLAN_FACT\") >= 0) {\n //Получаем текущий день\n let curDay = new Date().getDate().toString().padStart(2, \"0\");\n //Формируем regex для проверки\n let regex = new RegExp(`N_${curDay}.*`, \"g\");\n //Если это значение текущего дня\n if (columnDef.name.match(regex)) cellStyle = STYLES.DATA_GRID_CELL_PLAN_FACT(cellStyle);\n //Если в колонке есть значение\n if (row[columnDef.name]) {\n //Разбиваем его на план/факт\n let values = row[columnDef.name].split(\"/\");\n //Разбиваем значения на блоки\n return {\n cellProps,\n cellStyle,\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLAN_FACT_VALUE\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, values[0]), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.PLAN_FACT_DELIMITER\n }, \"/\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.FACT_VALUE\n }, values[1]))\n };\n } else return {\n cellProps,\n cellStyle,\n data: row[columnDef]\n };\n }\n //Для колонки \"Заказ\"\n if (columnDef.name === \"SPROD_ORDER\") {\n return {\n cellProps,\n cellStyle,\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => handleProdOrderClick(row[\"NRN\"])\n }, row[columnDef.name])\n };\n }\n //Для колонки \"Обозначение\"\n if (columnDef.name === \"SMATRES_CODE\") return {\n cellProps,\n cellStyle: STYLES.DATA_GRID_CELL_MATRES_CODE(cellStyle, row),\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => handleMatresCodeClick(row[\"NRN\"])\n }, row[columnDef.name])\n };\n //Для всех остальных\n return {\n cellProps,\n cellStyle,\n data: row[columnDef]\n };\n};\n\n//Список каталогов планов\nconst PlanList = ({\n plans = [],\n selectedPlan,\n filter,\n setFilter,\n onClick\n} = {}) => {\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n sx: STYLES.PLANS_FINDER,\n name: \"planFilter\",\n label: \"\\u041F\\u043B\\u0430\\u043D\",\n value: filter.planName,\n variant: \"standard\",\n fullWidth: true,\n onChange: event => {\n setFilter(pv => ({\n ...pv,\n planName: event.target.value\n }));\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, plans.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n key: p.NRN,\n selected: p.NRN === selectedPlan.NRN,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.PLANS_LIST_ITEM_PRIMARY\n }, p.SDOC_INFO)\n })))));\n};\n\n//Контроль свойств - Список каталогов планов\nPlanList.propTypes = {\n plans: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().array),\n selectedPlan: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func),\n filter: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object),\n setFilter: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель производственного плана цеха\nconst MechRecDeptCostProdPlans = () => {\n //Собственное состояние - таблица данных\n const [state, setState] = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useDeptCostProdPlans)();\n\n //Состояние для фильтра каталогов\n const [filter, setFilter] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n planName: \"\"\n });\n\n //Массив отфильтрованных каталогов\n const filteredPlanCtgls = (0,_hooks__WEBPACK_IMPORTED_MODULE_3__.useFilteredPlans)(state.planList, filter);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Выбор плана\n const selectPlan = plan => {\n setState(pv => ({\n ...pv,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n selectedPlan: plan,\n showPlanList: false,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n };\n\n //Сброс выбора плана\n const unselectPlan = () => setState(pv => ({\n ...pv,\n showIncomeFromDeps: null,\n showFcroutelst: null,\n selectedPlan: {},\n showPlanList: false,\n dataLoaded: false,\n columnsDef: [],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n }));\n\n //Обработка нажатия на элемент в списке планов\n const handlePlanClick = plan => {\n if (state.selectedPlan.NRN != plan.NRN) selectPlan(plan);else unselectPlan();\n };\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setState(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setState(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на \"Заказ\"\n const handleProdOrderClick = planSp => {\n setState(pv => ({\n ...pv,\n showIncomeFromDeps: planSp\n }));\n };\n\n //При нажатии на \"Обозначение\"\n const handleMatresCodeClick = planSp => {\n setState(pv => ({\n ...pv,\n showFcroutelst: planSp\n }));\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PLANS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPlanList: !pv.showPlanList\n }))\n }, \"\\u041F\\u043B\\u0430\\u043D\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n anchor: \"left\",\n open: state.showPlanList,\n onClose: () => setState(pv => ({\n ...pv,\n showPlanList: false\n })),\n sx: STYLES.PLANS_DRAWER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(PlanList, {\n plans: filteredPlanCtgls,\n selectedPlan: state.selectedPlan,\n filter: filter,\n setFilter: setFilter,\n onClick: handlePlanClick\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, state.dataLoaded ? state.rows.length === 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"В плане отсутствуют записи спецификации\"\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, `Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n sx: STYLES.DATA_GRID_CONTAINER\n },\n fixedHeader: state.fixedHeader,\n fixedColumns: state.fixedColumns,\n columnsDef: state.columnsDef,\n rows: state.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_SIZE.MEDIUM,\n morePages: state.morePages,\n reloading: state.reload,\n onOrderChanged: handleOrderChanged,\n onPagesCountChanged: handlePagesCountChanged,\n dataCellRender: prms => dataCellRender({\n ...prms,\n handleProdOrderClick,\n handleMatresCodeClick\n }),\n groupCellRender: groupCellRender\n })))) : !state.selectedPlan.NRN ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите план для отображения спецификаций\"\n }) : null))), state.showIncomeFromDeps ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_incomefromdeps__WEBPACK_IMPORTED_MODULE_7__.IncomFromDepsDataGridDialog, {\n task: state.showIncomeFromDeps,\n onClose: () => handleProdOrderClick(null)\n }) : null, state.showFcroutelst ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_fcroutlst__WEBPACK_IMPORTED_MODULE_8__.CostRouteListsDataGridDialog, {\n task: state.showFcroutelst,\n onClose: () => handleMatresCodeClick(null)\n }) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js?"); /***/ }), @@ -5207,7 +5218,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PANEL_UNITS: () => (/* binding */ PANEL_UNITS),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender),\n/* harmony export */ rowExpandRender: () => (/* binding */ rowExpandRender),\n/* harmony export */ valueFormatter: () => (/* binding */ valueFormatter)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n\n//---------\n//Константы\n//---------\n\n//Разделы панелей экономики проектов\nconst PANEL_UNITS = {\n PROJECTS: \"PROJECTS\",\n PROJECT_STAGES: \"PROJECT_STAGES\",\n PROJECT_STAGE_CONTRACTS: \"PROJECT_STAGE_CONTRACTS\",\n PROJECT_STAGE_ARTS: \"PROJECT_STAGE_ARTS\"\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Формирование значения для колонки \"Состояние\" проекта\nconst formatPrjStateValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Остановлен\", \"do_not_disturb_on\"] : value == 3 ? [\"Закрыт\", \"lock_outline\"] : value == 4 ? [\"Согласован\", \"thumb_up_alt\"] : [\"Исполнение прекращено\", \"block\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Подбор функции форматирования колонки \"Состояние\" по разделу панели\nconst getStatusFormatter = panelUnit => panelUnit === PANEL_UNITS.PROJECTS ? formatPrjStateValue : formatStageStatusValue;\n\n//Формирование значения для контрольных колонок\nconst formatCtrlValue = (value, addText = false) => {\n if ((0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(value)) {\n const [text, icon, color] = value == 0 ? [\"В норме\", \"done\", \"green\"] : [\"Требует внимания\", \"error\", \"red\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text,\n sx: {\n color\n }\n }, icon), addText == true ? text : null);\n } else return value;\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n panelUnit,\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NSTATE\":\n return getStatusFormatter(panelUnit)(value, true);\n case \"DBEGPLAN\":\n case \"DENDPLAN\":\n case \"DDOC_DATE\":\n case \"DCSTAGE_BEGIN_DATE\":\n case \"DCSTAGE_END_DATE\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value);\n case \"NPLAN\":\n case \"NCOST_FACT\":\n case \"NCONTR\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(value);\n case \"NCTRL_FIN\":\n case \"NCTRL_CONTR\":\n case \"NCTRL_COEXEC\":\n case \"NCTRL_PERIOD\":\n case \"NCTRL_COST\":\n case \"NCTRL_ACT\":\n return formatCtrlValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NSTATE\":\n case \"NCTRL_FIN\":\n case \"NCTRL_CONTR\":\n case \"NCTRL_COEXEC\":\n case \"NCTRL_PERIOD\":\n case \"NCTRL_COST\":\n case \"NCTRL_ACT\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n panelUnit,\n row,\n columnDef,\n pOnlineShowDocument,\n showStages,\n showStageArts,\n showCostNotes,\n showContracts\n}) => {\n //Подбор функции на нажатие в ячейки контрольной колонки в зависимости от контекста\n const getCrlOnClick = () => panelUnit == PANEL_UNITS.PROJECT_STAGES ? [\"NCTRL_FIN\", \"NCTRL_COEXEC\"].includes(columnDef.name) ? showContracts : showStageArts : showStages;\n //Подбор представления ячейки контрольной колонки в зависимости от контекста\n const renderCtl = () => ({\n cellProps: {\n align: panelUnit == PANEL_UNITS.PROJECT_STAGES && columnDef.name == \"NCTRL_PERIOD\" || panelUnit == PANEL_UNITS.PROJECT_STAGE_CONTRACTS && columnDef.name == \"NCTRL_FIN\" || panelUnit == PANEL_UNITS.PROJECT_STAGE_ARTS && [\"NCTRL_COST\", \"NCTRL_CONTR\"].includes(columnDef.name) ? \"right\" : \"center\"\n },\n data: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[columnDef.name]) ? panelUnit == PANEL_UNITS.PROJECT_STAGES && columnDef.name == \"NCTRL_PERIOD\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n justifyContent: \"right\"\n },\n direction: \"row\",\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] === 1 ? \"red\" : \"green\",\n display: \"flex\",\n alignItems: \"center\"\n }\n }, row.NDAYS_LEFT, \" \\u0434\\u043D.\"), formatCtrlValue(row[columnDef.name], false)) : panelUnit == PANEL_UNITS.PROJECT_STAGE_CONTRACTS && columnDef.name == \"NCTRL_FIN\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n justifyContent: \"right\"\n },\n direction: \"row\",\n spacing: 1\n }, row[columnDef.name] === 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: \"red\",\n display: \"flex\",\n alignItems: \"center\"\n },\n title: \"\\u0421\\u0447\\u0435\\u0442\\u043E\\u0432 \\u043A \\u043E\\u043F\\u043B\\u0430\\u0442\\u0435\"\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(row[\"NPAY_IN_REST\"])) : null, formatCtrlValue(row[columnDef.name], false)) : panelUnit == PANEL_UNITS.PROJECT_STAGES && columnDef.name == \"NCTRL_ACT\" || panelUnit == PANEL_UNITS.PROJECT_STAGE_CONTRACTS && columnDef.name == \"NCTRL_COEXEC\" ? formatCtrlValue(row[columnDef.name], false) : panelUnit == PANEL_UNITS.PROJECT_STAGE_ARTS && [\"NCTRL_COST\", \"NCTRL_CONTR\"].includes(columnDef.name) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n justifyContent: \"right\"\n },\n direction: \"row\",\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] === 1 ? \"red\" : \"green\",\n display: \"flex\",\n alignItems: \"center\"\n }\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(row[columnDef.name === \"NCTRL_COST\" ? \"NCOST_DIFF\" : \"NCONTR_LEFT\"])), formatCtrlValue(row[columnDef.name], false)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => getCrlOnClick()({\n sender: row,\n filters: [{\n name: columnDef.name,\n from: row[columnDef.name]\n }]\n })\n }, formatCtrlValue(row[columnDef.name], false)) : null\n });\n //Формирование представлений\n switch (columnDef.name) {\n case \"SCODE\":\n case \"SNAME_USL\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => showStages({\n sender: row\n })\n }, row[columnDef.name])\n };\n case \"SDOC_PREF\":\n case \"SDOC_NUMB\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => pOnlineShowDocument({\n unitCode: row[`SLNK_UNIT_${columnDef.name}`],\n document: row[`NLNK_DOCUMENT_${columnDef.name}`]\n })\n }, row[columnDef.name])\n };\n case \"NCOST_FACT\":\n case \"NCONTR\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => columnDef.name === \"NCOST_FACT\" ? showCostNotes({\n sender: row\n }) : showContracts({\n sender: row\n })\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(row[columnDef.name])) : null\n };\n case \"NSTATE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: getStatusFormatter(panelUnit)(row[columnDef.name], false)\n };\n case \"NCTRL_FIN\":\n case \"NCTRL_CONTR\":\n case \"NCTRL_COEXEC\":\n case \"NCTRL_PERIOD\":\n case \"NCTRL_COST\":\n case \"NCTRL_ACT\":\n return renderCtl();\n }\n};\n\n//Генерация представления расширения строки\nconst rowExpandRender = ({\n panelUnit,\n columnsDef,\n row,\n pOnlineShowDocument,\n showStages,\n showPayNotes,\n showCostNotes,\n showPaymentAccountsIn,\n showIncomingInvoices,\n showGoodsTransInvoicesToConsumers,\n showStageArts,\n showContracts\n}) => {\n //Фильтруем системные атрибуты и атрибуты без значений\n const cardColumns = columnsDef.filter(columnDef => columnDef.visible == false && columnDef.name != \"NRN\" && !columnDef.name.startsWith(\"SLNK_UNIT_\") && !columnDef.name.startsWith(\"NLNK_DOCUMENT_\") && (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[columnDef.name]));\n //Автоформатирование значения (N* - число, D* - дата, всё остальное - строка)\n const formatColumnValue = (name, value) => name.startsWith(\"N\") ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(value) : name.startsWith(\"D\") ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value) : value;\n //Формирование кнопок переходов\n const linkButtons = () => panelUnit === PANEL_UNITS.PROJECTS ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n onClick: () => showStages({\n sender: row\n })\n }, \"\\u042D\\u0442\\u0430\\u043F\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"Projects\",\n document: row.NRN\n })\n }, \"\\u0412 \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\")) : panelUnit === PANEL_UNITS.PROJECT_STAGES ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n onClick: () => showStageArts({\n sender: row\n })\n }, \"\\u0421\\u0442\\u0430\\u0442\\u044C\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n onClick: () => showContracts({\n sender: row\n })\n }, \"\\u0421\\u0438\\u0441\\u043F\\u043E\\u043B\\u043D\\u0438\\u0442\\u0435\\u043B\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"ProjectsStages\",\n document: row.NRN\n })\n }, \"\\u0412 \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\")) : panelUnit === PANEL_UNITS.PROJECT_STAGE_CONTRACTS ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n onClick: () => pOnlineShowDocument({\n unitCode: row.SLNK_UNIT_SDOC_PREF,\n document: row.NLNK_DOCUMENT_SDOC_PREF\n })\n }, \"\\u0412 \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\") : null;\n //Сборка содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12,\n md: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n spacing: 2\n }, linkButtons())), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12,\n md: 11\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n elevation: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: {\n width: \"100%\"\n },\n size: \"small\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, cardColumns.map((cardColumn, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n width: \"1px\",\n whiteSpace: \"nowrap\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"h6\",\n color: \"primary\",\n noWrap: true\n }, cardColumn.caption, \":\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n paddingLeft: 0\n }\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[`SLNK_UNIT_${cardColumn.name}`]) && (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[`NLNK_DOCUMENT_${cardColumn.name}`]) || [\"NPAY_IN\", \"NFIN_OUT\", \"NCOEXEC_IN\"].includes(cardColumn.name) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => [\"NFIN_IN\", \"NFIN_OUT\"].includes(cardColumn.name) ? showPayNotes({\n sender: row,\n direction: row[`NLNK_DOCUMENT_${cardColumn.name}`]\n }) : cardColumn.name == \"NCOST_FACT\" ? showCostNotes({\n sender: row\n }) : cardColumn.name == \"NSUMM_REALIZ\" ? showGoodsTransInvoicesToConsumers({\n sender: row\n }) : cardColumn.name == \"NPAY_IN\" ? showPaymentAccountsIn({\n sender: row\n }) : cardColumn.name == \"NCOEXEC_IN\" ? showIncomingInvoices({\n sender: row\n }) : pOnlineShowDocument({\n unitCode: row[`SLNK_UNIT_${cardColumn.name}`],\n document: row[`NLNK_DOCUMENT_${cardColumn.name}`]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"h6\",\n color: \"text.secondary\"\n }, formatColumnValue(cardColumn.name, row[cardColumn.name]))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"h6\",\n color: \"text.secondary\"\n }, [\"NDAYS_LEFT\", \"NINCOME_PRC\"].includes(cardColumn.name) ? row[cardColumn.name] : formatColumnValue(cardColumn.name, row[cardColumn.name])))))))))));\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/layouts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ COMMON_PROJECTS_STYLES: () => (/* binding */ COMMON_PROJECTS_STYLES),\n/* harmony export */ PANEL_UNITS: () => (/* binding */ PANEL_UNITS),\n/* harmony export */ dataCellRender: () => (/* binding */ dataCellRender),\n/* harmony export */ headCellRender: () => (/* binding */ headCellRender),\n/* harmony export */ rowExpandRender: () => (/* binding */ rowExpandRender),\n/* harmony export */ valueFormatter: () => (/* binding */ valueFormatter)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/IconButton/IconButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Link/Link.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Table/Table.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableBody/TableBody.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableRow/TableRow.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TableCell/TableCell.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Дополнительная разметка и вёрстка клиентских элементов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n\n//---------\n//Константы\n//---------\n\n//Разделы панелей экономики проектов\nconst PANEL_UNITS = {\n PROJECTS: \"PROJECTS\",\n PROJECT_STAGES: \"PROJECT_STAGES\",\n PROJECT_STAGE_CONTRACTS: \"PROJECT_STAGE_CONTRACTS\",\n PROJECT_STAGE_ARTS: \"PROJECT_STAGE_ARTS\"\n};\n\n//Общие стили\nconst COMMON_PROJECTS_STYLES = {\n FULL_SCREEN_DIALOG_CONTENT: {\n padding: 0\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Формирование значения для колонки \"Состояние\" проекта\nconst formatPrjStateValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Остановлен\", \"do_not_disturb_on\"] : value == 3 ? [\"Закрыт\", \"lock_outline\"] : value == 4 ? [\"Согласован\", \"thumb_up_alt\"] : [\"Исполнение прекращено\", \"block\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Формирование значения для колонки \"Состояние\" этапа\nconst formatStageStatusValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Зарегистрирован\", \"app_registration\"] : value == 1 ? [\"Открыт\", \"lock_open\"] : value == 2 ? [\"Закрыт\", \"lock_outline\"] : value == 3 ? [\"Согласован\", \"thumb_up_alt\"] : value == 4 ? [\"Исполнение прекращено\", \"block\"] : [\"Остановлен\", \"do_not_disturb_on\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Подбор функции форматирования колонки \"Состояние\" по разделу панели\nconst getStatusFormatter = panelUnit => panelUnit === PANEL_UNITS.PROJECTS ? formatPrjStateValue : formatStageStatusValue;\n\n//Формирование значения для контрольных колонок\nconst formatCtrlValue = (value, addText = false) => {\n if ((0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(value)) {\n const [text, icon, color] = value == 0 ? [\"В норме\", \"done\", \"green\"] : [\"Требует внимания\", \"error\", \"red\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n title: text,\n sx: {\n color\n }\n }, icon), addText == true ? text : null);\n } else return value;\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n panelUnit,\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NSTATE\":\n return getStatusFormatter(panelUnit)(value, true);\n case \"DBEGPLAN\":\n case \"DENDPLAN\":\n case \"DDOC_DATE\":\n case \"DCSTAGE_BEGIN_DATE\":\n case \"DCSTAGE_END_DATE\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value);\n case \"NPLAN\":\n case \"NCOST_FACT\":\n case \"NCONTR\":\n return (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(value);\n case \"NCTRL_FIN\":\n case \"NCTRL_CONTR\":\n case \"NCTRL_COEXEC\":\n case \"NCTRL_PERIOD\":\n case \"NCTRL_COST\":\n case \"NCTRL_ACT\":\n return formatCtrlValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NSTATE\":\n case \"NCTRL_FIN\":\n case \"NCTRL_CONTR\":\n case \"NCTRL_COEXEC\":\n case \"NCTRL_PERIOD\":\n case \"NCTRL_COST\":\n case \"NCTRL_ACT\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n panelUnit,\n row,\n columnDef,\n pOnlineShowDocument,\n showStages,\n showStageArts,\n showCostNotes,\n showContracts\n}) => {\n //Подбор функции на нажатие в ячейки контрольной колонки в зависимости от контекста\n const getCrlOnClick = () => panelUnit == PANEL_UNITS.PROJECT_STAGES ? [\"NCTRL_FIN\", \"NCTRL_COEXEC\"].includes(columnDef.name) ? showContracts : showStageArts : showStages;\n //Подбор представления ячейки контрольной колонки в зависимости от контекста\n const renderCtl = () => ({\n cellProps: {\n align: panelUnit == PANEL_UNITS.PROJECT_STAGES && columnDef.name == \"NCTRL_PERIOD\" || panelUnit == PANEL_UNITS.PROJECT_STAGE_CONTRACTS && columnDef.name == \"NCTRL_FIN\" || panelUnit == PANEL_UNITS.PROJECT_STAGE_ARTS && [\"NCTRL_COST\", \"NCTRL_CONTR\"].includes(columnDef.name) ? \"right\" : \"center\"\n },\n data: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[columnDef.name]) ? panelUnit == PANEL_UNITS.PROJECT_STAGES && columnDef.name == \"NCTRL_PERIOD\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n justifyContent: \"right\"\n },\n direction: \"row\",\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] === 1 ? \"red\" : \"green\",\n display: \"flex\",\n alignItems: \"center\"\n }\n }, row.NDAYS_LEFT, \" \\u0434\\u043D.\"), formatCtrlValue(row[columnDef.name], false)) : panelUnit == PANEL_UNITS.PROJECT_STAGE_CONTRACTS && columnDef.name == \"NCTRL_FIN\" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n justifyContent: \"right\"\n },\n direction: \"row\",\n spacing: 1\n }, row[columnDef.name] === 1 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: \"red\",\n display: \"flex\",\n alignItems: \"center\"\n },\n title: \"\\u0421\\u0447\\u0435\\u0442\\u043E\\u0432 \\u043A \\u043E\\u043F\\u043B\\u0430\\u0442\\u0435\"\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(row[\"NPAY_IN_REST\"])) : null, formatCtrlValue(row[columnDef.name], false)) : panelUnit == PANEL_UNITS.PROJECT_STAGES && columnDef.name == \"NCTRL_ACT\" || panelUnit == PANEL_UNITS.PROJECT_STAGE_CONTRACTS && columnDef.name == \"NCTRL_COEXEC\" ? formatCtrlValue(row[columnDef.name], false) : panelUnit == PANEL_UNITS.PROJECT_STAGE_ARTS && [\"NCTRL_COST\", \"NCTRL_CONTR\"].includes(columnDef.name) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sx: {\n justifyContent: \"right\"\n },\n direction: \"row\",\n spacing: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n color: row[columnDef.name] === 1 ? \"red\" : \"green\",\n display: \"flex\",\n alignItems: \"center\"\n }\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(row[columnDef.name === \"NCTRL_COST\" ? \"NCOST_DIFF\" : \"NCONTR_LEFT\"])), formatCtrlValue(row[columnDef.name], false)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n onClick: () => getCrlOnClick()({\n sender: row,\n filters: [{\n name: columnDef.name,\n from: row[columnDef.name]\n }]\n })\n }, formatCtrlValue(row[columnDef.name], false)) : null\n });\n //Формирование представлений\n switch (columnDef.name) {\n case \"SCODE\":\n case \"SNAME_USL\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => showStages({\n sender: row\n })\n }, row[columnDef.name])\n };\n case \"SDOC_PREF\":\n case \"SDOC_NUMB\":\n return {\n data: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => pOnlineShowDocument({\n unitCode: row[`SLNK_UNIT_${columnDef.name}`],\n document: row[`NLNK_DOCUMENT_${columnDef.name}`]\n })\n }, row[columnDef.name])\n };\n case \"NCOST_FACT\":\n case \"NCONTR\":\n return {\n data: row[columnDef.name] ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"hover\",\n onClick: () => columnDef.name === \"NCOST_FACT\" ? showCostNotes({\n sender: row\n }) : showContracts({\n sender: row\n })\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(row[columnDef.name])) : null\n };\n case \"NSTATE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: getStatusFormatter(panelUnit)(row[columnDef.name], false)\n };\n case \"NCTRL_FIN\":\n case \"NCTRL_CONTR\":\n case \"NCTRL_COEXEC\":\n case \"NCTRL_PERIOD\":\n case \"NCTRL_COST\":\n case \"NCTRL_ACT\":\n return renderCtl();\n }\n};\n\n//Генерация представления расширения строки\nconst rowExpandRender = ({\n panelUnit,\n columnsDef,\n row,\n pOnlineShowDocument,\n pOnlineShowUnit,\n showStages,\n showPayNotes,\n showCostNotes,\n showPaymentAccountsIn,\n showIncomingInvoices,\n showGoodsTransInvoicesToConsumers,\n showStageArts,\n showContracts\n}) => {\n //Фильтруем системные атрибуты и атрибуты без значений\n const cardColumns = columnsDef.filter(columnDef => columnDef.visible == false && columnDef.name != \"NRN\" && !columnDef.name.startsWith(\"SLNK_UNIT_\") && !columnDef.name.startsWith(\"NLNK_DOCUMENT_\") && (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[columnDef.name]));\n //Автоформатирование значения (N* - число, D* - дата, всё остальное - строка)\n const formatColumnValue = (name, value) => name.startsWith(\"N\") ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatNumberRFCurrency)(value) : name.startsWith(\"D\") ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(value) : value;\n //Формирование кнопок переходов\n const linkButtons = () => panelUnit === PANEL_UNITS.PROJECTS ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"outlined\",\n onClick: () => showStages({\n sender: row\n })\n }, \"\\u042D\\u0442\\u0430\\u043F\\u044B\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"outlined\",\n onClick: () => pOnlineShowDocument({\n unitCode: \"Projects\",\n document: row.NRN,\n modal: false\n })\n }, \"\\u041A \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u0443\")) : panelUnit === PANEL_UNITS.PROJECT_STAGES ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"outlined\",\n onClick: () => showStageArts({\n sender: row\n })\n }, \"\\u0421\\u0442\\u0430\\u0442\\u044C\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"outlined\",\n onClick: () => showContracts({\n sender: row\n })\n }, \"\\u0421\\u0438\\u0441\\u043F\\u043E\\u043B\\u043D\\u0438\\u0442\\u0435\\u043B\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"outlined\",\n onClick: () => pOnlineShowUnit({\n unitCode: \"Projects\",\n inputParameters: [{\n name: \"in_RN\",\n value: row.NPROJECT\n }, {\n name: \"in_STAGE_RN\",\n value: row.NRN\n }],\n modal: false\n })\n }, \"\\u041A \\u044D\\u0442\\u0430\\u043F\\u0443\")) : panelUnit === PANEL_UNITS.PROJECT_STAGE_CONTRACTS ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n variant: \"outlined\",\n onClick: () => pOnlineShowDocument({\n unitCode: row.SLNK_UNIT_SDOC_PREF,\n document: row.NLNK_DOCUMENT_SDOC_PREF,\n modal: false\n })\n }, \"\\u041A \\u0434\\u043E\\u0433\\u043E\\u0432\\u043E\\u0440\\u0443\") : null;\n //Сборка содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n p: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true,\n spacing: 2\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12,\n md: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n spacing: 2,\n direction: \"row\"\n }, linkButtons())), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12,\n md: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n elevation: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: {\n width: \"100%\"\n },\n size: \"small\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, cardColumns.map((cardColumn, i) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n key: i\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n width: \"1px\",\n whiteSpace: \"nowrap\"\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"h6\",\n color: \"primary\",\n noWrap: true\n }, cardColumn.caption, \":\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n sx: {\n paddingLeft: 0\n }\n }, (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[`SLNK_UNIT_${cardColumn.name}`]) && (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.hasValue)(row[`NLNK_DOCUMENT_${cardColumn.name}`]) || [\"NPAY_IN\", \"NFIN_OUT\", \"NCOEXEC_IN\"].includes(cardColumn.name) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n component: \"button\",\n variant: \"body2\",\n align: \"left\",\n underline: \"always\",\n onClick: () => [\"NFIN_IN\", \"NFIN_OUT\"].includes(cardColumn.name) ? showPayNotes({\n sender: row,\n direction: row[`NLNK_DOCUMENT_${cardColumn.name}`]\n }) : cardColumn.name == \"NCOST_FACT\" ? showCostNotes({\n sender: row\n }) : cardColumn.name == \"NSUMM_REALIZ\" ? showGoodsTransInvoicesToConsumers({\n sender: row\n }) : cardColumn.name == \"NPAY_IN\" ? showPaymentAccountsIn({\n sender: row\n }) : cardColumn.name == \"NCOEXEC_IN\" ? showIncomingInvoices({\n sender: row\n }) : pOnlineShowDocument({\n unitCode: row[`SLNK_UNIT_${cardColumn.name}`],\n document: row[`NLNK_DOCUMENT_${cardColumn.name}`]\n })\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"h6\",\n color: \"text.secondary\"\n }, formatColumnValue(cardColumn.name, row[cardColumn.name]))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n variant: \"h6\",\n color: \"text.secondary\"\n }, [\"NDAYS_LEFT\", \"NINCOME_PRC\"].includes(cardColumn.name) ? row[cardColumn.name] : formatColumnValue(cardColumn.name, row[cardColumn.name])))))))))));\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/layouts.js?"); /***/ }), @@ -5229,7 +5240,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projects: () => (/* binding */ Projects)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\n/* harmony import */ var _stages__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./stages */ \"./app/panels/prj_fin/stages.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список проктов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Полноэкранный диалог\n //График\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n //Список этапов проекта\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CHART: {\n maxHeight: \"300px\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n height: \"100%\"\n },\n CHART_FAB: {\n position: \"absolute\",\n top: 80,\n left: 16\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список проектов\nconst Projects = () => {\n //Собственное состояние\n const [projectsDataGrid, setProjectsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedProject: null,\n stagesFilters: []\n });\n\n //Состояния графиков\n const [showCharts, setShowCharts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [problemsChart, setProblemsChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [customersChart, setCustomersChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [costNotesChart, setCostNotesChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных проектов с сервера\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (projectsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.LIST\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: projectsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setProjectsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [projectsDataGrid.reload, projectsDataGrid.filters, projectsDataGrid.orders, projectsDataGrid.dataLoaded, projectsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Получение данных графиков\n const loadChartData = async () => {\n const problemsChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_PROBLEMS\",\n respArg: \"COUT\"\n });\n setProblemsChart(pv => ({\n ...pv,\n loaded: true,\n ...problemsChart.XCHART\n }));\n const customersChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_CUSTOMERS\",\n respArg: \"COUT\"\n });\n setCustomersChart(pv => ({\n ...pv,\n loaded: true,\n ...customersChart.XCHART\n }));\n const costNotesChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES\",\n respArg: \"COUT\"\n });\n setCostNotesChart(pv => ({\n ...pv,\n loaded: true,\n ...costNotesChart.XCHART\n }));\n };\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение детализации точки графика затрат\n const showCostNotesChartDetail = async ({\n year,\n month\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST\",\n args: {\n NYEAR: year,\n NMONTH: month\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение этапов проекта\n const showStages = ({\n sender,\n filters = []\n } = {}) => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: {\n ...sender\n },\n stagesFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setProjectsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка этапов проекта\n const handleStagesClose = () => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: null,\n stagesFilters: []\n }));\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n if (item.SFILTER && item.SFILTER_VALUE) setProjectsDataGrid(pv => ({\n ...pv,\n filters: [{\n name: item.SFILTER,\n from: item.SFILTER_VALUE\n }],\n pageNumber: 1,\n reload: true\n }));\n if (item.SUNITCODE == \"CostNotes\" && item.NYEAR && item.NMONTH) showCostNotesChartDetail({\n year: item.NYEAR,\n month: item.NMONTH\n });\n };\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadProjects();\n }, [projectsDataGrid.reload, loadProjects]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChartData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n container: true,\n spacing: 1\n }, showCharts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, problemsChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, problemsChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, customersChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, customersChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_5__.P8PChart, _extends({}, costNotesChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n item: true,\n xs: 12\n }, projectsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: projectsDataGrid.columnsDef,\n rows: projectsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n filtersInitial: projectsDataGrid.filters,\n morePages: projectsDataGrid.morePages,\n reloading: projectsDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_10__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n showStages\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS,\n pOnlineShowDocument,\n showPayNotes,\n showStages\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECTS\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, projectsDataGrid.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Этапы проекта \"${projectsDataGrid.selectedProject.SNAME_USL}\"`,\n onClose: handleStagesClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stages__WEBPACK_IMPORTED_MODULE_11__.Stages, {\n project: projectsDataGrid.selectedProject.NRN,\n projectName: projectsDataGrid.selectedProject.SNAME_USL,\n filters: projectsDataGrid.stagesFilters\n })) : null)), problemsChart.loaded || customersChart.loaded || costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n size: \"small\",\n color: \"secondary\",\n sx: STYLES.CHART_FAB,\n onClick: () => setShowCharts(!showCharts)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, showCharts ? \"expand_less\" : \"expand_more\")) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/projects.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Projects: () => (/* binding */ Projects)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\n/* harmony import */ var _stages__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./stages */ \"./app/panels/prj_fin/stages.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список проктов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Типовые стили\n //Заголовок страницы\n //Таблица данных\n //Полноэкранный диалог\n //График\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n //Список этапов проекта\n\n//---------\n//Константы\n//---------\n\n//Высота графиков\nconst CHART_HEIGHT = \"300px\";\n\n//Стили\nconst STYLES = {\n TABLE_PROJECTS: (showCharts, morePages, filters) => ({\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.APP_BAR_HEIGHT} - ${showCharts ? CHART_HEIGHT : \"0px\"} - ${morePages ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_MORE_HEIGHT : \"0px\"} - ${filters ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTERS_HEIGHT : \"0px\"} - 25px)`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_3__.APP_STYLES.SCROLL\n }),\n CHART: {\n maxHeight: CHART_HEIGHT,\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n height: \"100%\"\n },\n CHART_FAB: {\n position: \"absolute\",\n top: 80,\n left: 16\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список проектов\nconst Projects = () => {\n //Собственное состояние\n const [projectsDataGrid, setProjectsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedProject: null,\n stagesFilters: []\n });\n\n //Состояния графиков\n const [showCharts, setShowCharts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true);\n const [problemsChart, setProblemsChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [customersChart, setCustomersChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n const [costNotesChart, setCostNotesChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_8__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_9__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_10__[\"MessagingСtx\"]);\n\n //Загрузка данных проектов с сервера\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (projectsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.LIST\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(projectsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: projectsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: projectsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setProjectsDataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [projectsDataGrid.reload, projectsDataGrid.filters, projectsDataGrid.orders, projectsDataGrid.dataLoaded, projectsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Получение данных графиков\n const loadChartData = async () => {\n const problemsChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_PROBLEMS\",\n respArg: \"COUT\"\n });\n setProblemsChart(pv => ({\n ...pv,\n loaded: true,\n ...problemsChart.XCHART\n }));\n const customersChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_CUSTOMERS\",\n respArg: \"COUT\"\n });\n setCustomersChart(pv => ({\n ...pv,\n loaded: true,\n ...customersChart.XCHART\n }));\n const costNotesChart = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES\",\n respArg: \"COUT\"\n });\n setCostNotesChart(pv => ({\n ...pv,\n loaded: true,\n ...costNotesChart.XCHART\n }));\n };\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение детализации точки графика затрат\n const showCostNotesChartDetail = async ({\n year,\n month\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.CHART_FCCOSTNOTES_SELECT_COST\",\n args: {\n NYEAR: year,\n NMONTH: month\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение этапов проекта\n const showStages = ({\n sender,\n filters = []\n } = {}) => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: {\n ...sender\n },\n stagesFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setProjectsDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setProjectsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка этапов проекта\n const handleStagesClose = () => setProjectsDataGrid(pv => ({\n ...pv,\n selectedProject: null,\n stagesFilters: []\n }));\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n if (item.SFILTER && item.SFILTER_VALUE) setProjectsDataGrid(pv => ({\n ...pv,\n filters: [{\n name: item.SFILTER,\n from: item.SFILTER_VALUE\n }],\n pageNumber: 1,\n reload: true\n }));\n if (item.SUNITCODE == \"CostNotes\" && item.NYEAR && item.NMONTH) showCostNotesChartDetail({\n year: item.NYEAR,\n month: item.NMONTH\n });\n };\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadProjects();\n }, [projectsDataGrid.reload, loadProjects]);\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChartData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n p: 1\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n container: true,\n spacing: 1\n }, showCharts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, problemsChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_7__.P8PChart, _extends({}, problemsChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, customersChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_7__.P8PChart, _extends({}, customersChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n item: true,\n xs: 4\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n elevation: 3,\n sx: STYLES.CHART_PAPER\n }, costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_7__.P8PChart, _extends({}, costNotesChart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n item: true,\n xs: 12\n }, projectsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_11__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n sx: STYLES.TABLE_PROJECTS(showCharts, projectsDataGrid.morePages, (projectsDataGrid.filters || []).length > 0)\n },\n columnsDef: projectsDataGrid.columnsDef,\n rows: projectsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n filtersInitial: projectsDataGrid.filters,\n morePages: projectsDataGrid.morePages,\n reloading: projectsDataGrid.reload,\n fixedHeader: true,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_12__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_12__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_12__.PANEL_UNITS.PROJECTS,\n showStages\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_12__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_12__.PANEL_UNITS.PROJECTS,\n pOnlineShowDocument,\n showPayNotes,\n showStages\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_12__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_12__.PANEL_UNITS.PROJECTS\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, projectsDataGrid.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_6__.P8PFullScreenDialog, {\n title: `Этапы проекта \"${projectsDataGrid.selectedProject.SNAME_USL}\"`,\n onClose: handleStagesClose,\n contentProps: {\n sx: _layouts__WEBPACK_IMPORTED_MODULE_12__.COMMON_PROJECTS_STYLES.FULL_SCREEN_DIALOG_CONTENT\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stages__WEBPACK_IMPORTED_MODULE_13__.Stages, {\n project: projectsDataGrid.selectedProject.NRN,\n projectName: projectsDataGrid.selectedProject.SNAME_USL,\n filters: projectsDataGrid.stagesFilters\n })) : null)), problemsChart.loaded || customersChart.loaded || costNotesChart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n size: \"small\",\n color: \"secondary\",\n sx: STYLES.CHART_FAB,\n onClick: () => setShowCharts(!showCharts)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], null, showCharts ? \"expand_less\" : \"expand_more\")) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/projects.js?"); /***/ }), @@ -5240,7 +5251,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageArts: () => (/* binding */ StageArts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Калькуляция этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Калькуляция этапа проекта\nconst StageArts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageArtsDataGrid, setStageArtsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n rows: [],\n reload: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных калькуляции этапа с сервера\n const loadStageArts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageArtsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageArtsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: stageArtsDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStageArtsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [stage, stageArtsDataGrid.reload, stageArtsDataGrid.filters, stageArtsDataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала затрат по статье калькуляции\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение договоров по статье калькуляции\n const showContracts = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_CONTR\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageArtsDataGrid(pv => ({\n ...pv,\n filters,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageArts();\n }, [stageArtsDataGrid.reload, loadStageArts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageArtsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageArtsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageArtsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: false,\n reloading: stageArtsDataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_ARTS,\n showCostNotes,\n showContracts\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onFilterChanged: handleFilterChanged\n })) : null);\n};\n\n//Контроль свойств - Калькуляция этапа проекта\nStageArts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_arts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageArts: () => (/* binding */ StageArts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Калькуляция этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Типовые стили\n //Заголовок страницы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n TABLE_ARTS: filters => ({\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.APP_BAR_HEIGHT} - ${filters ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTERS_HEIGHT : \"0px\"} - 16px)`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_3__.APP_STYLES.SCROLL\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Калькуляция этапа проекта\nconst StageArts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageArtsDataGrid, setStageArtsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n rows: [],\n reload: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных калькуляции этапа с сервера\n const loadStageArts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageArtsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageArtsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NINCLUDE_DEF: stageArtsDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStageArtsDataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: [...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [stage, stageArtsDataGrid.reload, stageArtsDataGrid.filters, stageArtsDataGrid.dataLoaded, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала затрат по статье калькуляции\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_COST_FACT\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение договоров по статье калькуляции\n const showContracts = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_ARTS_SELECT_CONTR\",\n args: {\n NSTAGE: stage,\n NFPDARTCL: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: \"in_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageArtsDataGrid(pv => ({\n ...pv,\n filters,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageArts();\n }, [stageArtsDataGrid.reload, loadStageArts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n pt: 2\n }, stageArtsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n sx: STYLES.TABLE_ARTS((stageArtsDataGrid.filters || []).length > 0),\n elevation: 0\n },\n columnsDef: stageArtsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageArtsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n fixedHeader: true,\n morePages: false,\n reloading: stageArtsDataGrid.reload,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECT_STAGE_ARTS,\n showCostNotes,\n showContracts\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter,\n onFilterChanged: handleFilterChanged\n })) : null);\n};\n\n//Контроль свойств - Калькуляция этапа проекта\nStageArts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_12___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_arts.js?"); /***/ }), @@ -5251,7 +5262,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageContracts: () => (/* binding */ StageContracts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Договоры с соисполнителями этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Договоры с соисполнителями этапа проекта\nconst StageContracts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageContractsDataGrid, setStageContractsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_6__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStageContracts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageContractsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stageContractsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setStageContractsDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [stage, stageContractsDataGrid.reload, stageContractsDataGrid.filters, stageContractsDataGrid.orders, stageContractsDataGrid.dataLoaded, stageContractsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение выходящих счетов на оплату от соисполнителя этапа\n const showPaymentAccountsIn = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PaymentAccountsIn\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение фактических платежей соисполнителю этапа\n const showPayNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение приходных накладных от соисполнителя этапа\n const showIncomingInvoices = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"IncomingInvoices\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStageContractsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageContracts();\n }, [stageContractsDataGrid.reload, loadStageContracts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n pt: 2\n }, stageContractsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stageContractsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageContractsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stageContractsDataGrid.morePages,\n reloading: stageContractsDataGrid.reload,\n expandable: true,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_8__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_8__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument,\n showPaymentAccountsIn,\n showPayNotes,\n showIncomingInvoices\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_8__.valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Договоры с соисполнителями этапа проекта\nStageContracts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_10___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_10___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_contracts.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StageContracts: () => (/* binding */ StageContracts)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Договоры с соисполнителями этапа проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Типовые стили\n //Заголовок страницы\n //Таблица данных\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n TABLE_CONTRACTS: (morePages, filters) => ({\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.APP_BAR_HEIGHT} - ${morePages ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_MORE_HEIGHT : \"0px\"} - ${filters ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTERS_HEIGHT : \"0px\"} - 16px)`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_3__.APP_STYLES.SCROLL\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Договоры с соисполнителями этапа проекта\nconst StageContracts = ({\n stage,\n filters\n}) => {\n //Собственное состояние\n const [stageContractsDataGrid, setStageContractsDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_7__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_8__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStageContracts = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stageContractsDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_LIST\",\n args: {\n NSTAGE: stage,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stageContractsDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stageContractsDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stageContractsDataGrid.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SGOVCNTRID\" ? undefined : val,\n respArg: \"COUT\"\n });\n setStageContractsDataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [stage, stageContractsDataGrid.reload, stageContractsDataGrid.filters, stageContractsDataGrid.orders, stageContractsDataGrid.dataLoaded, stageContractsDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение выходящих счетов на оплату от соисполнителя этапа\n const showPaymentAccountsIn = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_PAY_IN\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PaymentAccountsIn\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение фактических платежей соисполнителю этапа\n const showPayNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_FIN_OUT\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение приходных накладных от соисполнителя этапа\n const showIncomingInvoices = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_SELECT_ININV\",\n args: {\n NPROJECTSTAGEPF: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"IncomingInvoices\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStageContractsDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStageContractsDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStageContracts();\n }, [stageContractsDataGrid.reload, loadStageContracts]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n pt: 2\n }, stageContractsDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_9__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n sx: STYLES.TABLE_CONTRACTS(stageContractsDataGrid.morePages, (stageContractsDataGrid.filters || []).length > 0),\n elevation: 0\n },\n columnsDef: stageContractsDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stageContractsDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stageContractsDataGrid.morePages,\n reloading: stageContractsDataGrid.reload,\n fixedHeader: true,\n expandable: true,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_10__.PANEL_UNITS.PROJECT_STAGE_CONTRACTS,\n pOnlineShowDocument,\n showPaymentAccountsIn,\n showPayNotes,\n showIncomingInvoices\n }),\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_10__.valueFormatter,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null);\n};\n\n//Контроль свойств - Договоры с соисполнителями этапа проекта\nStageContracts.propTypes = {\n stage: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_12___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stage_contracts.js?"); /***/ }), @@ -5262,7 +5273,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Stages: () => (/* binding */ Stages)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _stage_arts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stage_arts */ \"./app/panels/prj_fin/stage_arts.js\");\n/* harmony import */ var _stage_contracts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stage_contracts */ \"./app/panels/prj_fin/stage_contracts.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список этапов проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Таблица данных\n //Полноэкранный диалог\n //Калькуляция этапа проекта\n //Договоры с соисполнителями этапа проекта\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список этапов проекта\nconst Stages = ({\n project,\n projectName,\n filters\n}) => {\n //Собственное состояние\n const [stagesDataGrid, setStagesDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedStageNumb: null,\n showStageArts: null,\n stageArtsFilters: [],\n showStageContracts: null,\n stageContractsFilters: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_7__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_8__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_9__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStages = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stagesDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_LIST\",\n args: {\n NPRN: project,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stagesDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStagesDataGrid(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [project, stagesDataGrid.reload, stagesDataGrid.filters, stagesDataGrid.orders, stagesDataGrid.dataLoaded, stagesDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение журнала затрат по этапу проекта\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение расходных накладных на отпуск потребителям по этапу проекта\n const showGoodsTransInvoicesToConsumers = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"GoodsTransInvoicesToConsumers\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение статей калькуляции по этапу проекта\n const showStageArts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageArtsFilters: [...filters]\n }));\n\n //Отображение договоров с соисполнителями по этапу проекта\n const showContracts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageContractsFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStagesDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStagesDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStagesDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка договоров этапа\n const handleStageContractsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: null,\n stageContractsFilters: []\n }));\n\n //При закрытии калькуляции этапа\n const handleStageArtsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: null,\n stageArtsFilters: []\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStages();\n }, [stagesDataGrid.reload, loadStages]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n pt: 2\n }, stagesDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_10__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: stagesDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stagesDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stagesDataGrid.morePages,\n reloading: stagesDataGrid.reload,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_11__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n showStageArts,\n showContracts\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES,\n pOnlineShowDocument,\n showStageArts,\n showContracts,\n showPayNotes,\n showCostNotes,\n showGoodsTransInvoicesToConsumers\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_11__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_11__.PANEL_UNITS.PROJECT_STAGES\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, stagesDataGrid.showStageContracts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Договоры этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageContractsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_contracts__WEBPACK_IMPORTED_MODULE_6__.StageContracts, {\n stage: stagesDataGrid.showStageContracts,\n filters: stagesDataGrid.stageContractsFilters\n })) : null, stagesDataGrid.showStageArts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_4__.P8PFullScreenDialog, {\n title: `Калькуляция этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageArtsClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_arts__WEBPACK_IMPORTED_MODULE_5__.StageArts, {\n stage: stagesDataGrid.showStageArts,\n filters: stagesDataGrid.stageArtsFilters\n })) : null);\n};\n\n//Контроль свойств - Список этапов проекта\nStages.propTypes = {\n project: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n projectName: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_13___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stages.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Stages: () => (/* binding */ Stages)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_fullscreen_dialog */ \"./app/components/p8p_fullscreen_dialog.js\");\n/* harmony import */ var _stage_arts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stage_arts */ \"./app/panels/prj_fin/stage_arts.js\");\n/* harmony import */ var _stage_contracts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./stage_contracts */ \"./app/panels/prj_fin/stage_contracts.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_fin/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Экономика проектов\r\n Панель мониторинга: Список этапов проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные компоненты\n //Вспомогательные процедуры и функции\n //Тектовые ресурсы и константы\n //Типовые стили\n //Заголовок страницы\n //Таблица данных\n //Полноэкранный диалог\n //Калькуляция этапа проекта\n //Договоры с соисполнителями этапа проекта\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Контекст сообщений\n //Подключение компонентов к настройкам приложения\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n TABLE_STAGES: (morePages, filters) => ({\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_4__.APP_BAR_HEIGHT} - ${morePages ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_MORE_HEIGHT : \"0px\"} - ${filters ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTERS_HEIGHT : \"0px\"} - 16px)`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_3__.APP_STYLES.SCROLL\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Список этапов проекта\nconst Stages = ({\n project,\n projectName,\n filters\n}) => {\n //Собственное состояние\n const [stagesDataGrid, setStagesDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: [...filters],\n orders: null,\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n selectedStageNumb: null,\n showStageArts: null,\n stageArtsFilters: [],\n showStageContracts: null,\n stageContractsFilters: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_9__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument,\n pOnlineShowUnit,\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_10__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_11__[\"MessagingСtx\"]);\n\n //Загрузка данных этапов с сервера\n const loadStages = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (stagesDataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_LIST\",\n args: {\n NPRN: project,\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(stagesDataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: stagesDataGrid.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: stagesDataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setStagesDataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [project, stagesDataGrid.reload, stagesDataGrid.filters, stagesDataGrid.orders, stagesDataGrid.dataLoaded, stagesDataGrid.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //Отображение журнала платежей по этапу проекта\n const showPayNotes = async ({\n sender,\n direction\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_FIN\",\n args: {\n NRN: sender.NRN,\n NDIRECTION: direction\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"PayNotes\",\n inputParameters: [{\n name: \"in_SelectList_Ident\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение журнала затрат по этапу проекта\n const showCostNotes = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_COST_FACT\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"CostNotes\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение расходных накладных на отпуск потребителям по этапу проекта\n const showGoodsTransInvoicesToConsumers = async ({\n sender\n }) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.STAGES_SELECT_SUMM_REALIZ\",\n args: {\n NRN: sender.NRN\n }\n });\n if (data.NIDENT) pOnlineShowUnit({\n unitCode: \"GoodsTransInvoicesToConsumers\",\n inputParameters: [{\n name: \"in_IDENT\",\n value: data.NIDENT\n }]\n });else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_2__.TEXTS.NO_DATA_FOUND);\n };\n\n //Отображение статей калькуляции по этапу проекта\n const showStageArts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageArtsFilters: [...filters]\n }));\n\n //Отображение договоров с соисполнителями по этапу проекта\n const showContracts = ({\n sender,\n filters = []\n } = {}) => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: sender.NRN,\n selectedStageNumb: sender.SNUMB,\n stageContractsFilters: [...filters]\n }));\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setStagesDataGrid(pv => ({\n ...pv,\n filters,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setStagesDataGrid(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setStagesDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При закрытии списка договоров этапа\n const handleStageContractsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageContracts: null,\n stageContractsFilters: []\n }));\n\n //При закрытии калькуляции этапа\n const handleStageArtsClose = () => setStagesDataGrid(pv => ({\n ...pv,\n showStageArts: null,\n stageArtsFilters: []\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadStages();\n }, [stagesDataGrid.reload, loadStages]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n pt: 2\n }, stagesDataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_12__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n sx: STYLES.TABLE_STAGES(stagesDataGrid.morePages, (stagesDataGrid.filters || []).length > 0),\n elevation: 0\n },\n columnsDef: stagesDataGrid.columnsDef,\n filtersInitial: filters,\n rows: stagesDataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: stagesDataGrid.morePages,\n reloading: stagesDataGrid.reload,\n fixedHeader: true,\n expandable: true,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_13__.headCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_13__.dataCellRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_13__.PANEL_UNITS.PROJECT_STAGES,\n showStageArts,\n showContracts\n }),\n rowExpandRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_13__.rowExpandRender)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_13__.PANEL_UNITS.PROJECT_STAGES,\n pOnlineShowDocument,\n pOnlineShowUnit,\n showStageArts,\n showContracts,\n showPayNotes,\n showCostNotes,\n showGoodsTransInvoicesToConsumers\n }),\n valueFormatter: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_13__.valueFormatter)({\n ...prms,\n panelUnit: _layouts__WEBPACK_IMPORTED_MODULE_13__.PANEL_UNITS.PROJECT_STAGES\n }),\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged\n })) : null, stagesDataGrid.showStageContracts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_6__.P8PFullScreenDialog, {\n title: `Договоры этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageContractsClose,\n contentProps: {\n sx: _layouts__WEBPACK_IMPORTED_MODULE_13__.COMMON_PROJECTS_STYLES.FULL_SCREEN_DIALOG_CONTENT\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_contracts__WEBPACK_IMPORTED_MODULE_8__.StageContracts, {\n stage: stagesDataGrid.showStageContracts,\n filters: stagesDataGrid.stageContractsFilters\n })) : null, stagesDataGrid.showStageArts ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_fullscreen_dialog__WEBPACK_IMPORTED_MODULE_6__.P8PFullScreenDialog, {\n title: `Калькуляция этапа \"${stagesDataGrid.selectedStageNumb}\" проекта \"${projectName}\"`,\n onClose: handleStageArtsClose,\n contentProps: {\n sx: _layouts__WEBPACK_IMPORTED_MODULE_13__.COMMON_PROJECTS_STYLES.FULL_SCREEN_DIALOG_CONTENT\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_stage_arts__WEBPACK_IMPORTED_MODULE_7__.StageArts, {\n stage: stagesDataGrid.showStageArts,\n filters: stagesDataGrid.stageArtsFilters\n })) : null);\n};\n\n//Контроль свойств - Список этапов проекта\nStages.propTypes = {\n project: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().number).isRequired,\n projectName: (prop_types__WEBPACK_IMPORTED_MODULE_15___default().string).isRequired,\n filters: prop_types__WEBPACK_IMPORTED_MODULE_15___default().arrayOf(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_FILTER_SHAPE)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_fin/stages.js?"); /***/ }), @@ -5295,7 +5306,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjGraph: () => (/* binding */ PrjGraph)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_graph/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Панель мониторинга: Корневая панель графиков проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Заголовок страницы\n //Типовые стили\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст приложения\n //Контекст взаимодействия с сервером\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DATA_GRID_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_1__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_2__.APP_STYLES.SCROLL\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Графики проектов\nconst PrjGraph = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: true,\n fixedHeader: false,\n fixedColumns: 0\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.GRAPH\",\n args: {},\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: [...(data.XROWS || [])],\n groups: [...(data.XGROUPS || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.dataCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.groupCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n containerComponentProps: {\n elevation: 0,\n sx: STYLES.DATA_GRID_CONTAINER\n }\n })) : null)));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/prj_graph.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjGraph: () => (/* binding */ PrjGraph)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_graph/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Графики проектов\r\n Панель мониторинга: Корневая панель графиков проекта\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Заголовок страницы\n //Типовые стили\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст приложения\n //Контекст взаимодействия с сервером\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DATA_GRID_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_1__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_2__.APP_STYLES.SCROLL\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Графики проектов\nconst PrjGraph = () => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n reload: true,\n fixedHeader: false,\n fixedColumns: 0\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_6__[\"BackEndСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.GRAPH\",\n args: {},\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: [...(data.XDATA_GRID.rows || [])],\n groups: [...(data.XDATA_GRID.groups || [])],\n dataLoaded: true,\n reload: false\n }));\n }\n }, [dataGrid.reload, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_SIZE.LARGE,\n reloading: dataGrid.reload,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.dataCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n groupCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.groupCellRender)({\n ...prms,\n pOnlineShowDocument\n }),\n containerComponentProps: {\n elevation: 0,\n sx: STYLES.DATA_GRID_CONTAINER\n }\n })) : null)));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_graph/prj_graph.js?"); /***/ }), @@ -5339,7 +5350,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации фактической трудоёмкости по отчетам для ресурса\n const loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_FACT_RPT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabFactRptDtl: () => (/* binding */ LabFactRptDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nconst LabFactRptDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [factRptDtl, setFactRptDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации фактической трудоёмкости по отчетам для ресурса\n const loadFactRptDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (factRptDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_FACT_RPT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(factRptDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: factRptDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: factRptDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setFactRptDtl(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, factRptDtl.reload, factRptDtl.orders, factRptDtl.dataLoaded, factRptDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setFactRptDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в факта по \"Планам и отчетам в подразделении\"\n const handlePlanJobsDtlDGPagesCountChanged = () => setFactRptDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadFactRptDtl();\n }, [factRptDtl.reload, loadFactRptDtl]);\n\n //Генерация содержимого\n return factRptDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: factRptDtl.columnsDef,\n rows: factRptDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: factRptDtl.morePages,\n reloading: factRptDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.factRptDtlHeadCellRender,\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\nLabFactRptDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_fact_rpt_dtl.js?"); /***/ }), @@ -5350,7 +5361,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanFOTDtl: () => (/* binding */ LabPlanFOTDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по ФОТ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по ФОТ\nconst LabPlanFOTDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по ФОТ ресурса\n const [planFOTDtl, setPlanFOTDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по ФОТ для ресурса\n const loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planFOTDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_FOT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planFOTDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planFOTDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planFOTDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanFOTDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planFOTDtl.reload, planFOTDtl.orders, planFOTDtl.dataLoaded, planFOTDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGOrderChanged = ({\n orders\n }) => setPlanFOTDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGPagesCountChanged = () => setPlanFOTDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planFOTDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planFOTDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n open: true,\n onClose: onHide\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planFOTDtl.columnsDef,\n rows: planFOTDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planFOTDtl.morePages,\n reloading: planFOTDtl.reload,\n onOrderChanged: handlePlanFOTDtlDGOrderChanged,\n onPagesCountChanged: handlePlanFOTDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по ФОТ\nLabPlanFOTDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_fot_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanFOTDtl: () => (/* binding */ LabPlanFOTDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по ФОТ\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по ФОТ\nconst LabPlanFOTDtl = ({\n periodId,\n title,\n onHide\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по ФОТ ресурса\n const [planFOTDtl, setPlanFOTDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по ФОТ для ресурса\n const loadPlanFOTDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planFOTDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_FOT_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planFOTDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planFOTDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planFOTDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanFOTDtl(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planFOTDtl.reload, planFOTDtl.orders, planFOTDtl.dataLoaded, planFOTDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGOrderChanged = ({\n orders\n }) => setPlanFOTDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в в детализации плана ФОТ по строке ресурса\n const handlePlanFOTDtlDGPagesCountChanged = () => setPlanFOTDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanFOTDtl();\n }, [planFOTDtl.reload, loadPlanFOTDtl]);\n\n //Генерация содержимого\n return planFOTDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n open: true,\n onClose: onHide\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planFOTDtl.columnsDef,\n rows: planFOTDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planFOTDtl.morePages,\n reloading: planFOTDtl.reload,\n onOrderChanged: handlePlanFOTDtlDGOrderChanged,\n onPagesCountChanged: handlePlanFOTDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по ФОТ\nLabPlanFOTDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().func).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_fot_dtl.js?"); /***/ }), @@ -5361,7 +5372,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по графику для ресурса\n const loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_JOBS_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LabPlanJobsDtl: () => (/* binding */ LabPlanJobsDtl)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Детализация плановой трудоёмкости по графику\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Текстовые ресурсы\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//-----------\n//Тело модуля\n//-----------\n\n//Детализация плановой трудоёмкости по графику\nconst LabPlanJobsDtl = ({\n periodId,\n title,\n onHide,\n onProjectClick\n}) => {\n //Состояние таблицы детализации плановой трудоёмкости по графику\n const [planJobsDtl, setPlanJobsDtl] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_2__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка детализации плановой трудоёмкости по графику для ресурса\n const loadPlanJobsDtl = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (planJobsDtl.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_PLAN_JOBS_LIST\",\n args: {\n NJB_PERIODS: periodId,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_3__.object2Base64XML)(planJobsDtl.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: planJobsDtl.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: planJobsDtl.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setPlanJobsDtl(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [periodId, planJobsDtl.reload, planJobsDtl.orders, planJobsDtl.dataLoaded, planJobsDtl.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния сортировки в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGOrderChanged = ({\n orders\n }) => setPlanJobsDtl(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в детализации плановой трудоёмкости по графику\n const handlePlanJobsDtlDGPagesCountChanged = () => setPlanJobsDtl(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализаци\n const handleProjectClick = ({\n sender\n }) => onProjectClick ? onProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPlanJobsDtl();\n }, [planJobsDtl.reload, loadPlanJobsDtl]);\n\n //Генерация содержимого\n return planJobsDtl.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n open: true,\n onClose: onHide,\n fullWidth: true,\n maxWidth: \"xl\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n columnsDef: planJobsDtl.columnsDef,\n rows: planJobsDtl.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: planJobsDtl.morePages,\n reloading: planJobsDtl.reload,\n valueFormatter: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlValueFormatter,\n headCellRender: _layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlHeadCellRender,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_7__.planJobsDtlDataCellRender)({\n ...prms,\n onProjectClick: handleProjectClick\n }),\n onOrderChanged: handlePlanJobsDtlDGOrderChanged,\n onPagesCountChanged: handlePlanJobsDtlDGPagesCountChanged\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: onHide\n }, _app_text__WEBPACK_IMPORTED_MODULE_4__.BUTTONS.CLOSE))) : null;\n};\n\n//Контроль свойств - Детализация плановой трудоёмкости по графику\nLabPlanJobsDtl.propTypes = {\n periodId: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().number).isRequired,\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired,\n onHide: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func).isRequired,\n onProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/lab_plan_jobs_dtl.js?"); /***/ }), @@ -5383,7 +5394,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Заголовок страницы\n //Типовые стили\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Текстовые ресурсы и константы\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n left: \"16px\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n paddingTop: \"24px\"\n },\n GANTT_TITLE: {\n paddingLeft: \"150px\",\n paddingRight: \"150px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n right: \"16px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Диалог параметров инициализации панели\nconst InitPrmsDialog = ({\n dateBegin,\n dateFact,\n onOk,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [values, setValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dateBegin: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateBegin),\n dateFact: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateFact)\n });\n\n //Отработка воода значения в фильтр\n const handleValueTextFieldChanged = e => setValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"init-dialog-title\",\n \"aria-describedby\": \"init-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, \"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u044B \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0438\\u0437\\u0430\\u0446\\u0438\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateBegin\",\n type: \"date\",\n value: values.dateBegin,\n onChange: handleValueTextFieldChanged,\n label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u0435\\u0440\\u0432\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateFact\",\n type: \"date\",\n value: values.dateFact,\n onChange: handleValueTextFieldChanged,\n label: \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430 (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n onClick: () => onOk ? onOk({\n dateBegin: new Date(values.dateBegin),\n dateFact: new Date(values.dateFact)\n }) : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_9__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_9__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitPrmsDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//Область параметров инициализации панели\nconst InitPrmsArea = ({\n dateBegin,\n dateFact,\n durationMeasCode,\n labMeasCode,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateBegin), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateFact), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C: \"), durationMeasCode, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0451\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C: \"), labMeasCode)\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, \"refresh\"),\n onClick: onClick ? onClick : null\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C...\")));\n};\n\n//Контроль свойств - Область параметров инициализации панели\nInitPrmsArea.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date),\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date),\n durationMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string),\n labMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//Область сохранения изменений\nconst SaveChangesArea = ({\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n fullWidth: true,\n color: \"warning\",\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, \"save\"),\n onClick: onClick\n }, \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\")));\n};\n\n//Контроль свойств - Область сохранения изменений\nSaveChangesArea.propTypes = {\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n durationMeasCode: null,\n labMeas: null,\n labMeasCode: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectGanttDef: {},\n selectedProjectTasks: [],\n showInitDialog: false\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n selectedProjectGanttDef: tasksOnly === true ? {\n ...pv.selectedProjectGanttDef\n } : data.XGANTT_DEF ? {\n ...data.XGANTT_DEF\n } : {},\n selectedProjectTasks: [...data.XGANTT_TASKS]\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? state.dateBegin : null,\n DFACT: state.dateFact ? state.dateFact : null,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n reInit: false,\n dateBegin: new Date(data.DBEGIN),\n dateFact: new Date(data.DFACT),\n durationMeas: data.NDURATION_MEAS,\n durationMeasCode: data.SDURATION_MEAS,\n labMeas: data.NLAB_MEAS,\n labMeasCode: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При изменении флага инициализации\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n }, [state.init, initJobs]);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n selectedProjectTasks: [],\n selectedProjectGanttDef: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end));\n };\n\n //Отработка нажатия на отображения диалога параметров инициализации панели\n const handleShowInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: true\n }));\n\n //Отработка нажатия на \"ОК\" в диалоге параметров инициализации панели\n const handleOKInitDialogClick = values => setState(pv => ({\n ...pv,\n dateBegin: values.dateBegin,\n dateFact: values.dateFact,\n showInitDialog: false,\n init: false\n }));\n\n //Отработка нажатия на \"Отмена\" в диалоге параметров инициализации панели\n const handleCancelInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: false\n }));\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, state.showInitDialog ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsDialog, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n onOk: handleOKInitDialogClick,\n onCancel: handleCancelInitDialogClick\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsArea, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n durationMeasCode: state.durationMeasCode,\n labMeasCode: state.labMeasCode,\n onClick: handleShowInitDialogClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null), state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SaveChangesArea, {\n onClick: handleSaveToProjectsClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null)) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_10__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_8__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_CONFIG_PROPS, state.selectedProjectGanttDef, {\n containerStyle: STYLES.GANTT_CONTAINER,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n tasks: state.selectedProjectTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_11__.taskAttributeRenderer\n })) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n pt: 3\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n })) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PrjJobs: () => (/* binding */ PrjJobs)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Dialog/Dialog.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogTitle/DialogTitle.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemButton/ListItemButton.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemIcon/ListItemIcon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Drawer/Drawer.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _res_mon__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./res_mon */ \"./app/panels/prj_jobs/res_mon.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Панель мониторинга: Корневая панель работ проектов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Контекст взаимодействия с сервером\n //Контекст сообщений\n //Контекст приложения\n //Вспомогательные функции\n //Заголовок страницы\n //Типовые стили\n //Подключение компонентов к настройкам приложения\n //Диаграмма Ганта\n //Вспомогательные функции\n //Текстовые ресурсы и константы\n //Монитор ресурсов\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n PROJECTS_LIST_ITEM_NOJOBS: {\n backgroundColor: \"#ff000045\"\n },\n PROJECTS_LIST_ITEM_PRIMARY: {\n wordWrap: \"break-word\"\n },\n PROJECTS_LIST_ITEM_SECONDARY: {\n wordWrap: \"break-word\",\n fontSize: \"0.5rem\",\n textTransform: \"uppercase\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOJOBS: {\n color: \"red\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_NOEDIT: {\n color: \"gray\"\n },\n PROJECTS_LIST_ITEM_SECONDARY_CHANGED: {\n color: \"green\"\n },\n PROJECTS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n left: \"16px\"\n },\n PROJECTS_DRAWER: {\n width: \"250px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"250px\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT})`,\n width: \"100vw\",\n paddingTop: \"24px\"\n },\n GANTT_TITLE: {\n paddingLeft: \"150px\",\n paddingRight: \"150px\"\n },\n PERIODS_BUTTON: {\n position: \"absolute\",\n top: `calc(${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_5__.APP_BAR_HEIGHT} + 16px)`,\n right: \"16px\"\n },\n PERIODS_DRAWER: {\n width: \"1200px\",\n flexShrink: 0,\n [`& .MuiDrawer-paper`]: {\n width: \"1200px\",\n boxSizing: \"border-box\",\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n }\n};\n\n//------------------------------------\n//Вспомогательные функции и компоненты\n//------------------------------------\n\n//Диалог параметров инициализации панели\nconst InitPrmsDialog = ({\n dateBegin,\n dateFact,\n onOk,\n onCancel\n}) => {\n //Собственное состояние - значения с-по\n const [values, setValues] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dateBegin: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateBegin),\n dateFact: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(dateFact)\n });\n\n //Отработка воода значения в фильтр\n const handleValueTextFieldChanged = e => setValues(prev => ({\n ...prev,\n [e.target.name]: e.target.value\n }));\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n open: true,\n \"aria-labelledby\": \"init-dialog-title\",\n \"aria-describedby\": \"init-dialog-description\",\n onClose: () => onCancel ? onCancel() : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], null, \"\\u041F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u044B \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0438\\u0437\\u0430\\u0446\\u0438\\u0438\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateBegin\",\n type: \"date\",\n value: values.dateBegin,\n onChange: handleValueTextFieldChanged,\n label: \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u0435\\u0440\\u0432\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n style: {\n padding: \"10px\"\n },\n name: \"dateFact\",\n type: \"date\",\n value: values.dateFact,\n onChange: handleValueTextFieldChanged,\n label: \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430 (\\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0438\\u0439 \\u0434\\u0435\\u043D\\u044C \\u043C\\u0435\\u0441\\u044F\\u0446\\u0430)\",\n variant: \"standard\",\n fullWidth: true\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n onClick: () => onOk ? onOk({\n dateBegin: new Date(values.dateBegin),\n dateFact: new Date(values.dateFact)\n }) : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_9__.BUTTONS.OK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n onClick: () => onCancel ? onCancel() : null\n }, _app_text__WEBPACK_IMPORTED_MODULE_9__.BUTTONS.CANCEL)));\n};\n\n//Контроль свойств - Диалог параметров инициализации панели\nInitPrmsDialog.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date).isRequired,\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date).isRequired,\n onOk: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func),\n onCancel: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//Область параметров инициализации панели\nconst InitPrmsArea = ({\n dateBegin,\n dateFact,\n durationMeasCode,\n labMeasCode,\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u041D\\u0430\\u0447\\u0430\\u043B\\u043E: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateBegin), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0424\\u0430\\u043A\\u0442 \\u043D\\u0430: \"), (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateRF)(dateFact), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C: \"), durationMeasCode, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, \"\\u0422\\u0440\\u0443\\u0434\\u043E\\u0451\\u043C\\u043A\\u043E\\u0441\\u0442\\u044C: \"), labMeasCode)\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n fullWidth: true,\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, \"refresh\"),\n onClick: onClick ? onClick : null\n }, \"\\u041F\\u0435\\u0440\\u0435\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C...\")));\n};\n\n//Контроль свойств - Область параметров инициализации панели\nInitPrmsArea.propTypes = {\n dateBegin: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date),\n dateFact: prop_types__WEBPACK_IMPORTED_MODULE_18___default().instanceOf(Date),\n durationMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string),\n labMeasCode: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//Область сохранения изменений\nconst SaveChangesArea = ({\n onClick\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n fullWidth: true,\n color: \"warning\",\n variant: \"contained\",\n startIcon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], null, \"save\"),\n onClick: onClick\n }, \"\\u0421\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u044C\")));\n};\n\n//Контроль свойств - Область сохранения изменений\nSaveChangesArea.propTypes = {\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//Список проектов\nconst ProjectsList = ({\n projects = [],\n selectedProject,\n onClick\n} = {}) => {\n //Подключение к контексту сообщений\n const {\n InlineMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Генерация содержимого\n return projects.length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], null, projects.map(p => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__[\"default\"], {\n key: p.NRN,\n sx: p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_NOJOBS : null,\n selected: p.NRN === selectedProject,\n onClick: () => onClick ? onClick(p) : null\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n title: p.NEDITABLE == 1 ? \"Можно редактировать\" : \"Редактирование недоступно\"\n }, p.NEDITABLE == 1 ? \"edit\" : \"edit_off\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__[\"default\"], {\n primary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n sx: STYLES.PROJECTS_LIST_ITEM_PRIMARY\n }, p.SNAME),\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__[\"default\"], {\n sx: {\n ...STYLES.PROJECTS_LIST_ITEM_SECONDARY,\n ...(p.NJOBS == 0 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOJOBS : p.NCHANGED == 1 ? STYLES.PROJECTS_LIST_ITEM_SECONDARY_CHANGED : STYLES.PROJECTS_LIST_ITEM_SECONDARY_NOEDIT)\n }\n }, p.NJOBS == 1 ? p.NEDITABLE == 1 ? p.NCHANGED == 1 ? \"Изменён\" : \"Не изменён\" : \"Редактирование недоступно\" : \"Работы не определены\")\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgErr, {\n okBtn: false,\n text: \"Нет доступных проектов\"\n });\n};\n\n//Контроль свойств - Список проектов\nProjectsList.propTypes = {\n projects: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().array),\n selectedProject: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().number),\n onClick: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().func)\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Корневая панель работ проектов\nconst PrjJobs = () => {\n //Собственное состояние\n let [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n needSave: false,\n showProjectsList: false,\n showPeriodsList: false,\n init: false,\n dateBegin: null,\n dateFact: null,\n durationMeas: null,\n durationMeasCode: null,\n labMeas: null,\n labMeasCode: null,\n resourceStatus: null,\n ident: null,\n projects: [],\n projectsLoaded: false,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n gantt: {},\n showInitDialog: false\n });\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n InlineMsgInfo\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_2__[\"MessagingСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_1__[\"BackEndСtx\"]);\n\n //Загрузка списка проектов\n const loadProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (force = false) => {\n if (!state.projectsLoaded || force) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PRJCTS_LIST\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\",\n isArray: name => name === \"XPROJECTS\"\n });\n setState(pv => ({\n ...pv,\n projectsLoaded: true,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }\n }, [executeStored, state.ident, state.projectsLoaded]);\n\n //Загрузка списка работ проекта\n const loadProjectJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (tasksOnly = false) => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_LIST\",\n args: {\n NIDENT: state.ident,\n NPRN: state.selectedProject,\n NINCLUDE_DEF: tasksOnly === false ? 1 : 0\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: true,\n gantt: {\n ...(tasksOnly === true ? {\n ...pv.gantt,\n tasks: [...data.XGANTT.tasks]\n } : data.XGANTT ? {\n ...data.XGANTT\n } : {})\n }\n }));\n }, [executeStored, state.ident, state.selectedProject]);\n\n //Изменение работы в графике\n const modifyJob = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (job, dateFrom, dateTo) => {\n let data = null;\n try {\n data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_JOBS_MODIFY_PERIOD\",\n args: {\n NJB_JOBS: job,\n DDATE_FROM: dateFrom,\n DDATE_TO: dateTo\n }\n });\n if (data?.NRESOURCE_STATUS != -1) {\n setState(pv => ({\n ...pv,\n resourceStatus: data.NRESOURCE_STATUS,\n needSave: true\n }));\n loadProjects(true);\n }\n } finally {\n loadProjectJobs(true);\n }\n }, [executeStored, loadProjectJobs, loadProjects]);\n\n //Сохранение буфера балансировки в проекты\n const saveProjects = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_SAVE\",\n args: {\n NIDENT: state.ident\n },\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n needSave: false,\n projects: [...(data?.XPROJECTS || [])]\n }));\n }, [executeStored, state.ident]);\n\n //Инициализация данных балансировки\n const initJobs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_INIT\",\n args: {\n DBEGIN: state.dateBegin ? state.dateBegin : null,\n DFACT: state.dateFact ? state.dateFact : null,\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n reInit: false,\n dateBegin: new Date(data.DBEGIN),\n dateFact: new Date(data.DFACT),\n durationMeas: data.NDURATION_MEAS,\n durationMeasCode: data.SDURATION_MEAS,\n labMeas: data.NLAB_MEAS,\n labMeasCode: data.SLAB_MEAS,\n resourceStatus: data.NRESOURCE_STATUS,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.dateBegin, state.dateFact, state.ident, executeStored]);\n\n //Грузим список проектов при смене идентификатора процесса\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadProjects();\n }, [state.ident, loadProjects]);\n\n //При смене выбранного проекта\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.selectedProject) loadProjectJobs(false);\n }, [state.selectedProject, loadProjectJobs]);\n\n //При изменении флага инициализации\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initJobs();\n }, [state.init, initJobs]);\n\n //Выбор проекта\n const selectPoject = (project, projectDocRn) => {\n setState(pv => ({\n ...pv,\n selectedProject: project,\n selectedProjectDocRn: projectDocRn,\n selectedProjectJobsLoaded: false,\n gantt: {},\n showProjectsList: false\n }));\n };\n\n //Сброс выбора проекта\n const unselectProject = () => setState(pv => ({\n ...pv,\n selectedProjectJobsLoaded: false,\n selectedProject: null,\n selectedProjectDocRn: null,\n gantt: {},\n showProjectsList: false\n }));\n\n //Обработка нажатия на элемент в списке проектов\n const handleProjectClick = project => {\n if (state.selectedProject != project.NRN) selectPoject(project.NRN, project.NPROJECT);else unselectProject();\n };\n\n //Отработка нажатия на заголовок плана-графика\n const handleTitleClick = () => state.selectedProjectDocRn ? pOnlineShowDocument({\n unitCode: \"Projects\",\n document: state.selectedProjectDocRn\n }) : null;\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyJob(task.rn, new Date(start), new Date(end));\n };\n\n //Отработка нажатия на отображения диалога параметров инициализации панели\n const handleShowInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: true\n }));\n\n //Отработка нажатия на \"ОК\" в диалоге параметров инициализации панели\n const handleOKInitDialogClick = values => setState(pv => ({\n ...pv,\n dateBegin: values.dateBegin,\n dateFact: values.dateFact,\n showInitDialog: false,\n init: false\n }));\n\n //Отработка нажатия на \"Отмена\" в диалоге параметров инициализации панели\n const handleCancelInitDialogClick = () => setState(pv => ({\n ...pv,\n showInitDialog: false\n }));\n\n //Обработка нажатия на сохранение данных в проект\n const handleSaveToProjectsClick = () => saveProjects();\n\n //Обработка нажатия на проект в таблице детализации трудоёмкости по плану-графику монитора ресурсов\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => {\n setState(pv => ({\n ...pv,\n showPeriodsList: false\n }));\n if (state.selectedProject != sender.NJB_PRJCTS) selectPoject(sender.NJB_PRJCTS, sender.NPROJECT);\n };\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], null, state.showInitDialog ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsDialog, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n onOk: handleOKInitDialogClick,\n onCancel: handleCancelInitDialogClick\n }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PROJECTS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showProjectsList: !pv.showProjectsList\n }))\n }, \"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\\u044B\", state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: {\n color: \"orange\"\n }\n }, \"save\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n anchor: \"left\",\n open: state.showProjectsList,\n onClose: () => setState(pv => ({\n ...pv,\n showProjectsList: false\n })),\n sx: STYLES.PROJECTS_DRAWER\n }, state.projectsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InitPrmsArea, {\n dateBegin: state.dateBegin,\n dateFact: state.dateFact,\n durationMeasCode: state.durationMeasCode,\n labMeasCode: state.labMeasCode,\n onClick: handleShowInitDialogClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null), state.needSave ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SaveChangesArea, {\n onClick: handleSaveToProjectsClick\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__[\"default\"], null)) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProjectsList, {\n projects: state.projects,\n selectedProject: state.selectedProject,\n onClick: handleProjectClick\n })) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.PERIODS_BUTTON,\n onClick: () => setState(pv => ({\n ...pv,\n showPeriodsList: !pv.showPeriodsList\n }))\n }, \"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u044B\", [0, 1].includes(state.resourceStatus) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__[\"default\"], {\n sx: {\n color: state.resourceStatus === 0 ? \"green\" : \"red\"\n }\n }, state.resourceStatus === 0 ? \"done\" : \"error\")) : null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__[\"default\"], {\n anchor: \"right\",\n open: state.showPeriodsList,\n onClose: () => setState(pv => ({\n ...pv,\n showPeriodsList: false\n })),\n sx: STYLES.PERIODS_DRAWER\n }, state.ident ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_res_mon__WEBPACK_IMPORTED_MODULE_10__.ResMon, {\n ident: state.ident,\n onPlanJobsDtlProjectClick: handlePlanJobsDtlProjectClick\n }) : null), state.init == true ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n container: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__[\"default\"], {\n item: true,\n xs: 12\n }, state.selectedProjectJobsLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_8__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_7__.P8P_GANTT_CONFIG_PROPS, state.gantt, {\n containerStyle: STYLES.GANTT_CONTAINER,\n titleStyle: STYLES.GANTT_TITLE,\n onTitleClick: handleTitleClick,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: _layouts__WEBPACK_IMPORTED_MODULE_11__.taskAttributeRenderer\n })) : !state.selectedProject ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__[\"default\"], {\n pt: 3\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InlineMsgInfo, {\n okBtn: false,\n text: \"Укажите проект для отображения его плана-графика\"\n })) : null)) : null);\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/prj_jobs.js?"); /***/ }), @@ -5394,7 +5405,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lab_fact_rpt_dtl */ \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Монитор ресурсов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Типовые стили\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Детализация плановой трудоёмкости по ФОТ\n //Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\n //Детализация плановой трудоёмкости по графику\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DATA_GRID_CONTAINER: morePages => ({\n height: `calc(100vh - ${morePages ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_MORE_HEIGHT : \"0px\"})`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(pv => ({\n ...pv,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= configSystemPageSize\n }));\n }\n }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на фактическую трудоёмкость по отчетам\n const handleLabFactRptClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayFactRptDtl: sender.NRN,\n titleFactRptDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_FACT_RPT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 0,\n sx: STYLES.DATA_GRID_CONTAINER(peridos.morePages)\n },\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n fixedHeader: true,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.periodsDataCellRender)({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabFactRptClick: handleLabFactRptClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_7__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayFactRptDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_8__.LabFactRptDtl, {\n periodId: state.displayFactRptDtl,\n title: state.titleFactRptDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_9__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ResMon: () => (/* binding */ ResMon)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lab_plan_fot_dtl */ \"./app/panels/prj_jobs/lab_plan_fot_dtl.js\");\n/* harmony import */ var _lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./lab_fact_rpt_dtl */ \"./app/panels/prj_jobs/lab_fact_rpt_dtl.js\");\n/* harmony import */ var _lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./lab_plan_jobs_dtl */ \"./app/panels/prj_jobs/lab_plan_jobs_dtl.js\");\n/* harmony import */ var _layouts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./layouts */ \"./app/panels/prj_jobs/layouts.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - ПУП - Работы проектов\r\n Компонент панели: Монитор ресурсов\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Типовые стили\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Вспомогательные функции\n //Подключение компонентов к настройкам приложения\n //Таблица данных\n //Детализация плановой трудоёмкости по ФОТ\n //Детализация фактической трудоёмкости по \"Планам и отчетам подразделений\"\n //Детализация плановой трудоёмкости по графику\n //Дополнительная разметка и вёрстка клиентских элементов\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n DATA_GRID_CONTAINER: morePages => ({\n height: `calc(100vh - ${morePages ? _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_MORE_HEIGHT : \"0px\"})`,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_1__.APP_STYLES.SCROLL\n })\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Монитор ресурсов\nconst ResMon = ({\n ident,\n onPlanJobsDtlProjectClick\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n });\n\n //Состояние таблицы периодов монитора ресурсов\n const [peridos, setPeriods] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n orders: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true\n });\n\n //Подключение к контексту приложения\n const {\n configSystemPageSize\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Загрузка данных монитора балансировки периодов с сервера\n const loadPeriods = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (peridos.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_PROJECTS.JB_PERIODS_LIST\",\n args: {\n NIDENT: ident,\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_4__.object2Base64XML)(peridos.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: peridos.pageNumber,\n NPAGE_SIZE: configSystemPageSize,\n NINCLUDE_DEF: peridos.dataLoaded ? 0 : 1\n },\n attributeValueProcessor: (name, val) => name == \"SPERIOD\" ? undefined : val,\n respArg: \"COUT\"\n });\n setPeriods(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...pv.rows, ...(data.XDATA_GRID.rows || [])],\n dataLoaded: true,\n reload: false,\n morePages: (data.XDATA_GRID.rows || []).length >= configSystemPageSize\n }));\n }\n }, [ident, peridos.reload, peridos.orders, peridos.dataLoaded, peridos.pageNumber, executeStored, configSystemPageSize, SERV_DATA_TYPE_CLOB]);\n\n //При сокрытии детализации\n const handleHideDtl = () => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: null,\n titlePlanFOTDtl: null,\n displayFactRptDtl: null,\n titleFactRptDtl: null,\n displayPlanJobsDtl: null,\n titlePlanJobsDtl: null\n }));\n\n //При нажатии на плановую трудоёмкость по ФОТ\n const handleLabPlanFOTClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanFOTDtl: sender.NRN,\n titlePlanFOTDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_FOT}`\n }));\n\n //При нажатии на фактическую трудоёмкость по отчетам\n const handleLabFactRptClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayFactRptDtl: sender.NRN,\n titleFactRptDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_FACT_RPT}`\n }));\n\n //При нажатии на проект в списке детализации плановой трудоёмкости по графику\n const handleLabPlanJobsClick = ({\n sender\n }) => setState(pv => ({\n ...pv,\n displayPlanJobsDtl: sender.NRN,\n titlePlanJobsDtl: `${sender.SPERIOD} - ${sender.SINS_DEPARTMENT} - ${sender.SFCMANPOWER} - ${sender.NLAB_PLAN_JOBS}`\n }));\n\n //При изменении состояния сортировки в таблице периодов балансировки\n const handlePeriodsOrderChanged = ({\n orders\n }) => setPeriods(pv => ({\n ...pv,\n orders,\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц в таблице периодов балансировки\n const handlePeriodsPagesCountChanged = () => setPeriods(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на проект в таблице детализации трудоёмкости по плану-графику\n const handlePlanJobsDtlProjectClick = ({\n sender\n }) => onPlanJobsDtlProjectClick ? onPlanJobsDtlProjectClick({\n sender\n }) : null;\n\n //При необходимости обновить данные\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadPeriods();\n }, [peridos.reload, loadPeriods]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, peridos.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_5__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 0,\n sx: STYLES.DATA_GRID_CONTAINER(peridos.morePages)\n },\n columnsDef: peridos.columnsDef,\n rows: peridos.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_6__.P8P_DATA_GRID_SIZE.SMALL,\n morePages: peridos.morePages,\n reloading: peridos.reload,\n fixedHeader: true,\n onOrderChanged: handlePeriodsOrderChanged,\n onPagesCountChanged: handlePeriodsPagesCountChanged,\n dataCellRender: prms => (0,_layouts__WEBPACK_IMPORTED_MODULE_10__.periodsDataCellRender)({\n ...prms,\n onLabPlanFOTClick: handleLabPlanFOTClick,\n onLabFactRptClick: handleLabFactRptClick,\n onLabPlanJobsClick: handleLabPlanJobsClick\n })\n })) : null, state.displayPlanFOTDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_fot_dtl__WEBPACK_IMPORTED_MODULE_7__.LabPlanFOTDtl, {\n periodId: state.displayPlanFOTDtl,\n title: state.titlePlanFOTDtl,\n onHide: handleHideDtl\n }) : null, state.displayFactRptDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_fact_rpt_dtl__WEBPACK_IMPORTED_MODULE_8__.LabFactRptDtl, {\n periodId: state.displayFactRptDtl,\n title: state.titleFactRptDtl,\n onHide: handleHideDtl\n }) : null, state.displayPlanJobsDtl ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_lab_plan_jobs_dtl__WEBPACK_IMPORTED_MODULE_9__.LabPlanJobsDtl, {\n periodId: state.displayPlanJobsDtl,\n title: state.titlePlanJobsDtl,\n onHide: handleHideDtl,\n onProjectClick: handlePlanJobsDtlProjectClick\n }) : null);\n};\n\n//Контроль свойств - Монитор ресурсов\nResMon.propTypes = {\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().number).isRequired,\n onPlanJobsDtlProjectClick: (prop_types__WEBPACK_IMPORTED_MODULE_11___default().func)\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/prj_jobs/res_mon.js?"); /***/ }), @@ -5460,7 +5471,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ a11yProps: () => (/* binding */ a11yProps),\n/* harmony export */ useConf: () => (/* binding */ useConf),\n/* harmony export */ useFormDialog: () => (/* binding */ useFormDialog),\n/* harmony export */ useRecOpen: () => (/* binding */ useRecOpen),\n/* harmony export */ useTab: () => (/* binding */ useTab),\n/* harmony export */ useWindowResize: () => (/* binding */ useWindowResize)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./IUD/iud_form_dialog */ \"./app/panels/rrp_conf_editor/IUD/iud_form_dialog.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/*\r\n Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта\r\n Пользовательские хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст приложения\n //Контекст взаимодействия с сервером\n //Контекст навигации\n //Контекст сообщений\n //Статусы диалогов\n //Тексты для ошибок\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для отработки изменений ширины и высоты рабочей области окна\nconst useWindowResize = () => {\n //Состояние размера рабочей области\n const [size, setSize] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([0, 0]);\n\n //При изменении размера\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n const updateSize = () => {\n setSize([document.documentElement.clientWidth, document.documentElement.clientHeight]);\n };\n window.addEventListener(\"resize\", updateSize);\n updateSize();\n return () => window.removeEventListener(\"resize\", updateSize);\n }, []);\n\n //Вернём размеры\n return size;\n};\n\n//Хук для настройки регламентированного отчета\nconst useConf = (currentTab, handleSectionChange) => {\n //Собственное состояние - таблица данных\n const dataGrid = {\n rn: 0,\n code: \"\",\n name: \"\",\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n fixedHeader: false,\n fixedColumns: 0,\n reload: false\n };\n\n //Собственное состояние\n const [rrpConf, setRrpConf] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n docLoaded: false,\n sections: [],\n reload: true\n });\n\n //Состояние массива данных разделов\n const [dataGrids] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_3__.NavigationCtx);\n\n //При необходимости обновить\n const handleReload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n setRrpConf(pv => ({\n ...pv,\n reload: true\n }));\n }, []);\n\n //Загрузка данных разделов регламентированного отчёта\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (rrpConf.reload) {\n //Переменная номера раздела с фокусом\n let tabFocus = currentTab ? currentTab : 0;\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.RRPCONF_GET_SECTIONS\",\n args: {\n NRN_RRPCONF: Number(getNavigationSearch().NRN)\n },\n respArg: \"COUT\"\n });\n //Флаг первой загрузки данных\n let firstLoad = dataGrids.length == 0 ? true : false;\n //Копирование массива уже загруженных разделов\n let cloneDGs = dataGrids.slice();\n //Массив из нескольких разделов и из одного\n const sections = data.SECTIONS ? data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS] : [];\n //Заполнение очередного раздела по шаблону\n sections.map(s => {\n let dg = {};\n Object.assign(dg, dataGrid, {\n rn: s.NRN,\n code: s.SCODE,\n name: s.SNAME,\n delete_allow: s.NDELETE_ALLOW,\n dataLoaded: true,\n columnsDef: [...(s.XDATA.XCOLUMNS_DEF || [])],\n groups: [...(s.XDATA.XGROUPS || [])],\n rows: [...(s.XDATA.XROWS || [])],\n fixedHeader: s.XDATA.XDATA_GRID.fixedHeader,\n fixedColumns: s.XDATA.XDATA_GRID.fixedColumns,\n reload: false\n });\n //Если раздел имеет составы показателей\n if (s.MARK_CNS.MARK_CN) {\n //Обходим строки раздела\n dg.rows.map(row => {\n //Цикл по ключам строки\n for (let key in row) {\n //Если это ключ для группы составов показателей\n if (key.match(/MARK_CNS_.*/)) {\n //Считываем рег. номер показателя\n let markRn = key.substring(9);\n //Переносим из раздела\n row[key] = Array.isArray(s.MARK_CNS.MARK_CN) ? [...s.MARK_CNS.MARK_CN].filter(el => el.NPRN === row[`NMARK_RN_${markRn}`]) : s.MARK_CNS.MARK_CN.NPRN === row[`NMARK_RN_${markRn}`] ? [s.MARK_CNS.MARK_CN] : null;\n }\n }\n });\n }\n //Ищем загружен ли уже раздел с таким же ид.\n const dgItem = dataGrids.find(x => x.rn === dg.rn);\n //Его индекс, если нет соответствия, то -1\n let index = dataGrids.indexOf(dgItem);\n //Если было соответствие\n if (dgItem) {\n //Если в нём не найдено изменений\n if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {\n //То из копированного массива его удаляем\n cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);\n } else {\n //Иначе обновляем раздел в массиве\n dataGrids[index] = dg;\n //Удаляем из копированного массива\n cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);\n //Устанавливаем фокус на обновлённый раздел\n tabFocus = index;\n }\n } else {\n //Если раздел новый, то добавляем его в массив данных\n dataGrids.push(dg);\n //И устанавливаем на него фокус, если флаг первой загрузки = false\n tabFocus = !firstLoad ? dataGrids.length - 1 : 0;\n }\n });\n //Обходим разделы, что остались в копированном массиве (на удаление)\n cloneDGs.map(s => {\n let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));\n //Устаревший раздел удаляем из массива данных\n dataGrids.splice(curIndex, 1);\n //Фокус на предшествующий раздел\n if (curIndex > 0) tabFocus = curIndex - 1;\n //Иначе фокус на следующий, если был удалён первый раздел\n else tabFocus = curIndex;\n });\n setRrpConf(pv => ({\n ...pv,\n docLoaded: true,\n reload: false,\n sections: dataGrids\n }));\n handleSectionChange(tabFocus);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rrpConf.reload, rrpConf.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [rrpConf.reload, dataGrid.reload, loadData]);\n return [rrpConf, handleReload];\n};\n\n//Хук для вкладки\nconst useTab = () => {\n //Состояние раздела\n const [tabValue, setTabValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Переключение раздела\n const handleSectionChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(newValue => {\n setTabValue(newValue);\n }, []);\n return [tabValue, handleSectionChange];\n};\n\n//Хук для функций открытия записей\nconst useRecOpen = handleReload => {\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_4__[\"MessagingСtx\"]);\n\n //Отображение показателя раздела\n const handleMarkOpen = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async nRrpConfSctnMrk => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODES\",\n args: {\n NRN: nRrpConfSctnMrk\n },\n tagValueProcessor: () => undefined\n });\n if (data) {\n pOnlineShowDictionary({\n unitCode: \"RRPConfig\",\n showMethod: \"main_mrk_settings\",\n inputParameters: [{\n name: \"in_CODE\",\n value: data.SRRPCONF\n }, {\n name: \"in_SCTN_CODE\",\n value: data.SRRPCONFSCTN\n }, {\n name: \"in_MRK_CODE\",\n value: data.SRRPCONFSCTNMRK\n }],\n callBack: res => {\n res.success ? handleReload() : null;\n }\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_6__.TEXTS.NO_DATA_FOUND);\n }, [executeStored, handleReload, pOnlineShowDictionary, showMsgErr]);\n\n //Отображение показателя раздела\n const handleMarkCnOpen = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (nRrpConfSctnMrk, nRrpConfSctnMrkCn) => {\n pOnlineShowDictionary({\n unitCode: \"RRPConfigSectionMark\",\n showMethod: \"link_cn\",\n inputParameters: [{\n name: \"in_RN\",\n value: nRrpConfSctnMrk\n }, {\n name: \"in_RRPCONFSCTNMRKCN\",\n value: nRrpConfSctnMrkCn\n }],\n callBack: res => {\n res.success ? handleReload() : null;\n }\n });\n }, [handleReload, pOnlineShowDictionary]);\n\n //Отображение показателя раздела\n const handleMarkCnInsert = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async nRrpConfSctnMrk => {\n pOnlineShowDictionary({\n unitCode: \"RRPConfigSectionMarkConstitution\",\n showMethod: \"link_add\",\n inputParameters: [{\n name: \"in_PRN\",\n value: nRrpConfSctnMrk\n }],\n callBack: res => {\n res.success ? handleReload() : null;\n }\n });\n }, [handleReload, pOnlineShowDictionary]);\n return [handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert];\n};\n\n//Хук для форм диалогового окна\nconst useFormDialog = () => {\n //Состояние открытия диалогового окна\n const [formOpen, setForm] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Состояние диалогового окна\n const [formData, setFormData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n reload: false,\n rn: \"\",\n prn: \"\",\n sctnName: \"\",\n sctnCode: \"\",\n status: \"\",\n code: \"\",\n name: \"\",\n colCode: \"\",\n colRn: null,\n rowCode: \"\",\n rowRn: null\n });\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_3__.NavigationCtx);\n\n //Открытие диалогового окна\n const openForm = () => {\n setForm(true);\n };\n\n //Очистка диалогового окна\n const clearFormData = () => {\n setFormData({\n reload: false,\n rn: \"\",\n prn: \"\",\n sctnName: \"\",\n sctnCode: \"\",\n status: \"\",\n code: \"\",\n name: \"\",\n colCode: \"\",\n colRn: null,\n rowCode: \"\",\n rowRn: null\n });\n };\n\n //Отработка нажатия на кнопку добавления секции\n const handleSectionAdd = () => {\n setFormData({\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.CREATE,\n prn: Number(getNavigationSearch().NRN)\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку исправления секции\n const handleSectionEdit = (rn, code, name) => {\n setFormData({\n rn: rn,\n code: code,\n name: name,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.EDIT\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку удаления секции\n const handleSectionDelete = (rn, code, name) => {\n setFormData({\n rn: rn,\n code: code,\n name: name,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.DELETE\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку добавления показателя раздела\n const handleMarkAdd = (prn, rowRn = null, rowCode = \"\", colRn = null, colCode = \"\") => {\n setFormData({\n reload: rowRn && colRn ? true : false,\n prn: prn,\n rowRn: rowRn,\n rowCode: rowCode,\n colRn: colRn,\n colCode: colCode,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.RRPCONFSCTNMRK_CREATE\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку исправления показателя раздела\n const handleMarkEdit = rn => {\n setFormData({\n reload: true,\n rn: rn,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.RRPCONFSCTNMRK_EDIT\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку удаления показателя раздела\n const handleMarkDelete = rn => {\n setFormData({\n rn: rn,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.RRPCONFSCTNMRK_DELETE\n });\n openForm();\n };\n\n //При закрытии диалога\n const handleDialogClose = () => {\n setForm(false);\n clearFormData();\n };\n return [formOpen, formData, handleSectionAdd, handleSectionEdit, handleSectionDelete, handleMarkAdd, handleMarkEdit, handleMarkDelete, handleDialogClose];\n};\n\n//Формирование разделов\nconst a11yProps = index => {\n return {\n id: `simple-tab-${index}`,\n \"aria-controls\": `simple-tabpanel-${index}`\n };\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/hooks.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ a11yProps: () => (/* binding */ a11yProps),\n/* harmony export */ useConf: () => (/* binding */ useConf),\n/* harmony export */ useFormDialog: () => (/* binding */ useFormDialog),\n/* harmony export */ useRecOpen: () => (/* binding */ useRecOpen),\n/* harmony export */ useTab: () => (/* binding */ useTab),\n/* harmony export */ useWindowResize: () => (/* binding */ useWindowResize)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/navigation */ \"./app/context/navigation.js\");\n/* harmony import */ var _context_messaging__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./IUD/iud_form_dialog */ \"./app/panels/rrp_conf_editor/IUD/iud_form_dialog.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/*\r\n Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта\r\n Пользовательские хуки\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контекст приложения\n //Контекст взаимодействия с сервером\n //Контекст навигации\n //Контекст сообщений\n //Статусы диалогов\n //Тексты для ошибок\n\n//-----------\n//Тело модуля\n//-----------\n\n//Хук для отработки изменений ширины и высоты рабочей области окна\nconst useWindowResize = () => {\n //Состояние размера рабочей области\n const [size, setSize] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([0, 0]);\n\n //При изменении размера\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(() => {\n const updateSize = () => {\n setSize([document.documentElement.clientWidth, document.documentElement.clientHeight]);\n };\n window.addEventListener(\"resize\", updateSize);\n updateSize();\n return () => window.removeEventListener(\"resize\", updateSize);\n }, []);\n\n //Вернём размеры\n return size;\n};\n\n//Хук для настройки регламентированного отчета\nconst useConf = (currentTab, handleSectionChange) => {\n //Собственное состояние - таблица данных\n const dataGrid = {\n rn: 0,\n code: \"\",\n name: \"\",\n dataLoaded: false,\n columnsDef: [],\n groups: [],\n rows: [],\n fixedHeader: false,\n fixedColumns: 0,\n reload: false\n };\n\n //Собственное состояние\n const [rrpConf, setRrpConf] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n docLoaded: false,\n sections: [],\n reload: true\n });\n\n //Состояние массива данных разделов\n const [dataGrids] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_3__.NavigationCtx);\n\n //При необходимости обновить\n const handleReload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n setRrpConf(pv => ({\n ...pv,\n reload: true\n }));\n }, []);\n\n //Загрузка данных разделов регламентированного отчёта\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (rrpConf.reload) {\n //Переменная номера раздела с фокусом\n let tabFocus = currentTab ? currentTab : 0;\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.RRPCONF_GET_SECTIONS\",\n args: {\n NRN_RRPCONF: Number(getNavigationSearch().NRN)\n },\n respArg: \"COUT\"\n });\n //Флаг первой загрузки данных\n let firstLoad = dataGrids.length == 0 ? true : false;\n //Копирование массива уже загруженных разделов\n let cloneDGs = dataGrids.slice();\n //Массив из нескольких разделов и из одного\n const sections = data.SECTIONS ? data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS] : [];\n //Заполнение очередного раздела по шаблону\n sections.map(s => {\n let dg = {};\n Object.assign(dg, dataGrid, {\n ...s.XDATA.XDATA_GRID,\n rn: s.NRN,\n code: s.SCODE,\n name: s.SNAME,\n delete_allow: s.NDELETE_ALLOW,\n dataLoaded: true,\n columnsDef: [...(s.XDATA.XDATA_GRID.columnsDef || [])],\n groups: [...(s.XDATA.XDATA_GRID.groups || [])],\n rows: [...(s.XDATA.XDATA_GRID.rows || [])],\n reload: false\n });\n //Если раздел имеет составы показателей\n if (s.MARK_CNS.MARK_CN) {\n //Обходим строки раздела\n dg.rows.map(row => {\n //Цикл по ключам строки\n for (let key in row) {\n //Если это ключ для группы составов показателей\n if (key.match(/MARK_CNS_.*/)) {\n //Считываем рег. номер показателя\n let markRn = key.substring(9);\n //Переносим из раздела\n row[key] = Array.isArray(s.MARK_CNS.MARK_CN) ? [...s.MARK_CNS.MARK_CN].filter(el => el.NPRN === row[`NMARK_RN_${markRn}`]) : s.MARK_CNS.MARK_CN.NPRN === row[`NMARK_RN_${markRn}`] ? [s.MARK_CNS.MARK_CN] : null;\n }\n }\n });\n }\n //Ищем загружен ли уже раздел с таким же ид.\n const dgItem = dataGrids.find(x => x.rn === dg.rn);\n //Его индекс, если нет соответствия, то -1\n let index = dataGrids.indexOf(dgItem);\n //Если было соответствие\n if (dgItem) {\n //Если в нём не найдено изменений\n if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {\n //То из копированного массива его удаляем\n cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);\n } else {\n //Иначе обновляем раздел в массиве\n dataGrids[index] = dg;\n //Удаляем из копированного массива\n cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);\n //Устанавливаем фокус на обновлённый раздел\n tabFocus = index;\n }\n } else {\n //Если раздел новый, то добавляем его в массив данных\n dataGrids.push(dg);\n //И устанавливаем на него фокус, если флаг первой загрузки = false\n tabFocus = !firstLoad ? dataGrids.length - 1 : 0;\n }\n });\n //Обходим разделы, что остались в копированном массиве (на удаление)\n cloneDGs.map(s => {\n let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));\n //Устаревший раздел удаляем из массива данных\n dataGrids.splice(curIndex, 1);\n //Фокус на предшествующий раздел\n if (curIndex > 0) tabFocus = curIndex - 1;\n //Иначе фокус на следующий, если был удалён первый раздел\n else tabFocus = curIndex;\n });\n setRrpConf(pv => ({\n ...pv,\n docLoaded: true,\n reload: false,\n sections: dataGrids\n }));\n handleSectionChange(tabFocus);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rrpConf.reload, rrpConf.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]);\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [rrpConf.reload, dataGrid.reload, loadData]);\n return [rrpConf, handleReload];\n};\n\n//Хук для вкладки\nconst useTab = () => {\n //Состояние раздела\n const [tabValue, setTabValue] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Переключение раздела\n const handleSectionChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(newValue => {\n setTabValue(newValue);\n }, []);\n return [tabValue, handleSectionChange];\n};\n\n//Хук для функций открытия записей\nconst useRecOpen = handleReload => {\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDictionary\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_1__[\"ApplicationСtx\"]);\n\n //Подключение к контексту сообщений\n const {\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_messaging__WEBPACK_IMPORTED_MODULE_4__[\"MessagingСtx\"]);\n\n //Отображение показателя раздела\n const handleMarkOpen = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async nRrpConfSctnMrk => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_GET_CODES\",\n args: {\n NRN: nRrpConfSctnMrk\n },\n tagValueProcessor: () => undefined\n });\n if (data) {\n pOnlineShowDictionary({\n unitCode: \"RRPConfig\",\n showMethod: \"main_mrk_settings\",\n inputParameters: [{\n name: \"in_CODE\",\n value: data.SRRPCONF\n }, {\n name: \"in_SCTN_CODE\",\n value: data.SRRPCONFSCTN\n }, {\n name: \"in_MRK_CODE\",\n value: data.SRRPCONFSCTNMRK\n }],\n callBack: res => {\n res.success ? handleReload() : null;\n }\n });\n } else showMsgErr(_app_text__WEBPACK_IMPORTED_MODULE_6__.TEXTS.NO_DATA_FOUND);\n }, [executeStored, handleReload, pOnlineShowDictionary, showMsgErr]);\n\n //Отображение показателя раздела\n const handleMarkCnOpen = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (nRrpConfSctnMrk, nRrpConfSctnMrkCn) => {\n pOnlineShowDictionary({\n unitCode: \"RRPConfigSectionMark\",\n showMethod: \"link_cn\",\n inputParameters: [{\n name: \"in_RN\",\n value: nRrpConfSctnMrk\n }, {\n name: \"in_RRPCONFSCTNMRKCN\",\n value: nRrpConfSctnMrkCn\n }],\n callBack: res => {\n res.success ? handleReload() : null;\n }\n });\n }, [handleReload, pOnlineShowDictionary]);\n\n //Отображение показателя раздела\n const handleMarkCnInsert = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async nRrpConfSctnMrk => {\n pOnlineShowDictionary({\n unitCode: \"RRPConfigSectionMarkConstitution\",\n showMethod: \"link_add\",\n inputParameters: [{\n name: \"in_PRN\",\n value: nRrpConfSctnMrk\n }],\n callBack: res => {\n res.success ? handleReload() : null;\n }\n });\n }, [handleReload, pOnlineShowDictionary]);\n return [handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert];\n};\n\n//Хук для форм диалогового окна\nconst useFormDialog = () => {\n //Состояние открытия диалогового окна\n const [formOpen, setForm] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);\n\n //Состояние диалогового окна\n const [formData, setFormData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n reload: false,\n rn: \"\",\n prn: \"\",\n sctnName: \"\",\n sctnCode: \"\",\n status: \"\",\n code: \"\",\n name: \"\",\n colCode: \"\",\n colRn: null,\n rowCode: \"\",\n rowRn: null\n });\n\n //Подключение к контексту навигации\n const {\n getNavigationSearch\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_navigation__WEBPACK_IMPORTED_MODULE_3__.NavigationCtx);\n\n //Открытие диалогового окна\n const openForm = () => {\n setForm(true);\n };\n\n //Очистка диалогового окна\n const clearFormData = () => {\n setFormData({\n reload: false,\n rn: \"\",\n prn: \"\",\n sctnName: \"\",\n sctnCode: \"\",\n status: \"\",\n code: \"\",\n name: \"\",\n colCode: \"\",\n colRn: null,\n rowCode: \"\",\n rowRn: null\n });\n };\n\n //Отработка нажатия на кнопку добавления секции\n const handleSectionAdd = () => {\n setFormData({\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.CREATE,\n prn: Number(getNavigationSearch().NRN)\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку исправления секции\n const handleSectionEdit = (rn, code, name) => {\n setFormData({\n rn: rn,\n code: code,\n name: name,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.EDIT\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку удаления секции\n const handleSectionDelete = (rn, code, name) => {\n setFormData({\n rn: rn,\n code: code,\n name: name,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.DELETE\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку добавления показателя раздела\n const handleMarkAdd = (prn, rowRn = null, rowCode = \"\", colRn = null, colCode = \"\") => {\n setFormData({\n reload: rowRn && colRn ? true : false,\n prn: prn,\n rowRn: rowRn,\n rowCode: rowCode,\n colRn: colRn,\n colCode: colCode,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.RRPCONFSCTNMRK_CREATE\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку исправления показателя раздела\n const handleMarkEdit = rn => {\n setFormData({\n reload: true,\n rn: rn,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.RRPCONFSCTNMRK_EDIT\n });\n openForm();\n };\n\n //Отработка нажатия на кнопку удаления показателя раздела\n const handleMarkDelete = rn => {\n setFormData({\n rn: rn,\n status: _IUD_iud_form_dialog__WEBPACK_IMPORTED_MODULE_5__.STATUSES.RRPCONFSCTNMRK_DELETE\n });\n openForm();\n };\n\n //При закрытии диалога\n const handleDialogClose = () => {\n setForm(false);\n clearFormData();\n };\n return [formOpen, formData, handleSectionAdd, handleSectionEdit, handleSectionDelete, handleMarkAdd, handleMarkEdit, handleMarkDelete, handleDialogClose];\n};\n\n//Формирование разделов\nconst a11yProps = index => {\n return {\n id: `simple-tab-${index}`,\n \"aria-controls\": `simple-tabpanel-${index}`\n };\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/rrp_conf_editor/hooks.js?"); /***/ }), @@ -5493,7 +5504,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Chart: () => (/* binding */ Chart)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Графики \"P8PChart\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //График\n //Контекст взаимодействия с сервером\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n CHART: {\n minWidth: \"65vw\",\n maxHeight: \"65vw\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n padding: \"25px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Графики \"P8PChart\"\nconst Chart = ({\n title\n}) => {\n //Собственное состояние - график\n const [chart, setChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false,\n labels: [],\n datasets: []\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Загрузка данных графика с сервера\n const loadChart = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const chart = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.CHART\",\n respArg: \"COUT\"\n });\n setChart(pv => ({\n ...pv,\n loaded: true,\n ...chart.XCHART\n }));\n }, [executeStored]);\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: item.SCOND,\n value: item.SCOND_VALUE\n }]\n });\n };\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChart();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n container: true,\n spacing: 0,\n pt: 5,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n elevation: 6,\n sx: STYLES.CHART_PAPER\n }, chart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__.P8PChart, _extends({}, chart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))));\n};\n\n//Контроль свойств - Пример: Графики \"P8PChart\"\nChart.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/chart.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Chart: () => (/* binding */ Chart)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Paper/Paper.js\");\n/* harmony import */ var _components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../components/p8p_chart */ \"./app/components/p8p_chart.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Графики \"P8PChart\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //График\n //Контекст взаимодействия с сервером\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n CHART: {\n minWidth: \"65vw\",\n maxHeight: \"65vw\",\n display: \"flex\",\n justifyContent: \"center\"\n },\n CHART_PAPER: {\n padding: \"25px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Графики \"P8PChart\"\nconst Chart = ({\n title\n}) => {\n //Собственное состояние - график\n const [chart, setChart] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n loaded: false\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_2__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowUnit\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_3__[\"ApplicationСtx\"]);\n\n //Загрузка данных графика с сервера\n const loadChart = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const chart = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.CHART\",\n respArg: \"COUT\"\n });\n setChart(pv => ({\n ...pv,\n loaded: true,\n ...chart.XCHART\n }));\n }, [executeStored]);\n\n //Отработка нажатия на график\n const handleChartClick = ({\n item\n }) => {\n pOnlineShowUnit({\n unitCode: \"Contracts\",\n inputParameters: [{\n name: item.SCOND,\n value: item.SCOND_VALUE\n }]\n });\n };\n\n //При подключении к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadChart();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n container: true,\n spacing: 0,\n pt: 5,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n elevation: 6,\n sx: STYLES.CHART_PAPER\n }, chart.loaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_chart__WEBPACK_IMPORTED_MODULE_1__.P8PChart, _extends({}, chart, {\n onClick: handleChartClick,\n style: STYLES.CHART\n })) : null))));\n};\n\n//Контроль свойств - Пример: Графики \"P8PChart\"\nChart.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_7___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/chart.js?"); + +/***/ }), + +/***/ "./app/panels/samples/cyclogram.js": +/*!*****************************************!*\ + !*** ./app/panels/samples/cyclogram.js ***! + \*****************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Cyclogram: () => (/* binding */ Cyclogram)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogContent/DialogContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/List/List.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItem/ListItem.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/ListItemText/ListItemText.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Divider/Divider.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/TextField/TextField.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/DialogActions/DialogActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_cyclogram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_cyclogram */ \"./app/components/p8p_cyclogram.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Циклограмма \"P8PCyclogram\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные функции\n //Заголовок страницы\n //Циклограмма\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Отступ контейнера страницы от заголовка\nconst CONTAINER_PADDING_TOP = \"20px\";\n\n//Высота заголовка страницы\nconst TITLE_HEIGHT = \"47px\";\n\n//Высота строк\nconst LINE_HEIGHT = 30;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: CONTAINER_PADDING_TOP\n },\n TITLE: {\n paddingBottom: \"15px\",\n height: TITLE_HEIGHT\n },\n CYCLOGRAM_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__.APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTAINER_PADDING_TOP})`,\n width: \"100vw\",\n paddingTop: \"5px\"\n },\n TASK_EDITOR_CONTENT: {\n minWidth: 400,\n overflowX: \"auto\"\n },\n TASK_EDITOR_LIST: {\n width: \"100%\",\n minWidth: 300,\n maxWidth: 700,\n bgcolor: \"background.paper\"\n },\n GROUP_HEADER: height => ({\n border: \"1px solid\",\n backgroundColor: \"#ecf8fb\",\n height: height,\n borderRadius: \"10px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-around\"\n })\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Диалог открытия задачи\nconst CustomTaskDialog = ({\n task,\n ident,\n handleReload,\n close\n}) => {\n //Собственное состояние\n const [taskDates, setTaskDates] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n start: task.ddate_start,\n end: task.ddate_end\n });\n\n //Тип проекта\n const textType = task.type === 0 ? \"Задачи проекта\" : task.type === 1 ? \"Этап проекта\" : \"Работа проекта\";\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_5__[\"BackEndСtx\"]);\n\n //Изменение дат задачи\n const changeDates = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n //Изменяем даты задачи\n await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.CYCLOGRAM_TASK_MODIFY\",\n args: {\n NIDENT: ident,\n NRN: task.rn,\n SDATE_FROM: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(taskDates.start),\n SDATE_TO: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(taskDates.end)\n }\n });\n handleReload();\n close();\n }, [close, executeStored, handleReload, ident, task.rn, taskDates.end, taskDates.start]);\n\n //При нажатии OK\n const handleOk = () => {\n //Изменяем даты задачи\n changeDates();\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n sx: STYLES.TASK_EDITOR_CONTENT\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n sx: STYLES.TASK_EDITOR_LIST\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n primary: \"Наименование\",\n secondary: task.fullName\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: \"Начало\",\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n error: !taskDates.start,\n disabled: task.type !== 2,\n name: \"start\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: taskDates.start,\n onChange: e => setTaskDates(pv => ({\n ...pv,\n start: e.target.value\n })),\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n secondaryTypographyProps: {\n component: \"span\"\n },\n primary: \"Окончание\",\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n error: !taskDates.end,\n disabled: task.type !== 2,\n name: \"end\",\n fullWidth: true,\n required: true,\n InputLabelProps: {\n shrink: true\n },\n type: \"date\",\n value: taskDates.end,\n onChange: e => setTaskDates(pv => ({\n ...pv,\n end: e.target.value\n })),\n variant: \"standard\",\n size: \"small\",\n margin: \"normal\"\n })\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n component: \"li\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n alignItems: \"flex-start\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n primary: \"Тип\",\n secondaryTypographyProps: {\n component: \"span\"\n },\n secondary: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n direction: \"row\",\n gap: 0.5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n title: textType\n }, task.type === 0 ? \"description\" : task.type === 1 ? \"check\" : \"work_outline\"), textType)\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: handleOk\n }, \"\\u041E\\u041A\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n onClick: close\n }, \"\\u041E\\u0442\\u043C\\u0435\\u043D\\u0430\")));\n};\n\n//Контроль свойств - Диалог открытия задачи\nCustomTaskDialog.propTypes = {\n task: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object).isRequired,\n ident: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().number).isRequired,\n handleReload: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func).isRequired,\n close: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().func).isRequired\n};\n\n//Заголовок группы\nconst CustomGroupHeader = ({\n group\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n sx: STYLES.GROUP_HEADER(group.height)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n variant: \"body2\"\n }, group.name));\n};\n\n//Контроль свойств - Заголовок группы\nCustomGroupHeader.propTypes = {\n group: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().object).isRequired\n};\n\n//Отображение задачи\nconst taskRenderer = ({\n task\n}) => {\n //Если это задачи проекта\n if (task.type === 0) {\n return {\n taskStyle: {\n border: \"3px solid #ebe058\"\n }\n };\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Циклограмма \"P8PCyclogram\"\nconst Cyclogram = ({\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n dataLoaded: false,\n reload: true,\n ident: null\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_5__[\"BackEndСtx\"]);\n\n //При необходимости перезагрузки\n const handleReload = () => {\n setState(pv => ({\n ...pv,\n reload: true\n }));\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Загрузка данных циклограммы с сервера\n const loadData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.CYCLOGRAM\",\n args: {\n NIDENT: state.ident\n },\n attributeValueProcessor: (name, val) => [\"ddate_start\", \"ddate_end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n dataLoaded: true,\n ...data.XCYCLOGRAM,\n reload: false\n }));\n };\n //Если указан идентификатор и требуется перезагрузить\n if (state.ident && state.reload) loadData();\n }, [state.ident, state.reload, executeStored]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n //Инициализация данных циклограммы\n const initData = async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.CYCLOGRAM_INIT\",\n args: {\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n ident: data.NIDENT,\n reload: true\n }));\n };\n //Если требуется проинициализировать\n if (!state.init) {\n initData();\n }\n }, [executeStored, state.ident, state.init]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n container: true,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__[\"default\"], {\n item: true,\n xs: 12\n }, state.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_cyclogram__WEBPACK_IMPORTED_MODULE_3__.P8PCyclogram, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_CYCLOGRAM_CONFIG_PROPS, state, {\n containerStyle: STYLES.CYCLOGRAM_CONTAINER,\n lineHeight: LINE_HEIGHT,\n taskDialogRenderer: prms => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomTaskDialog, {\n task: prms.task,\n ident: state.ident,\n handleReload: handleReload,\n close: prms.close\n }),\n taskRenderer: prms => taskRenderer(prms),\n groupHeaderRenderer: prms => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(CustomGroupHeader, {\n group: prms.group\n })\n })) : null))));\n};\n\n//Контроль свойств - Пример: Циклограмма \"P8PCyclogram\"\nCyclogram.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_16___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/cyclogram.js?"); /***/ }), @@ -5504,7 +5526,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n DATA_GRID_CONTAINER: {\n maxWidth: 700,\n maxHeight: 500,\n minHeight: 500\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = () => ({\n cellStyle: {\n padding: \"2px\"\n }\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setdataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n columnsDef: [],\n filters: null,\n orders: null,\n groups: [],\n rows: [],\n reload: true,\n pageNumber: 1,\n morePages: true,\n fixedHeader: false,\n fixedColumns: 0\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reload) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setdataGrid(pv => ({\n ...pv,\n fixedHeader: data.XDATA_GRID.fixedHeader,\n fixedColumns: data.XDATA_GRID.fixedColumns,\n columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,\n rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],\n groups: data.XGROUPS ? pv.pageNumber == 1 ? [...data.XGROUPS] : [...pv.groups, ...data.XGROUPS.filter(g => !pv.groups.find(pg => pg.name == g.name))] : [...pv.groups],\n dataLoaded: true,\n reload: false,\n morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reload, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setdataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setdataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reload: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setdataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reload: true\n }));\n\n //При нажатии на копку контрагента\n const handleAgnButtonClicked = agnCode => pOnlineShowDocument({\n unitCode: \"AGNLIST\",\n document: agnCode,\n inRnParameter: \"in_AGNABBR\"\n });\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reload, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n p: 5,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, {\n containerComponentProps: {\n elevation: 6,\n style: STYLES.DATA_GRID_CONTAINER\n },\n columnsDef: dataGrid.columnsDef,\n groups: dataGrid.groups,\n rows: dataGrid.rows,\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n fixedHeader: dataGrid.fixedHeader,\n fixedColumns: dataGrid.fixedColumns,\n filtersInitial: dataGrid.filters,\n morePages: dataGrid.morePages,\n reloading: dataGrid.reload,\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged,\n expandable: true,\n rowExpandRender: ({\n row\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n onClick: () => handleAgnButtonClicked(row.SAGNABBR)\n }, \"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u0442\\u044C \\u0432 \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\")\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_12___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataGrid: () => (/* binding */ DataGrid),\n/* harmony export */ groupCellRender: () => (/* binding */ groupCellRender)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Box/Box.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_data_grid */ \"./app/components/p8p_data_grid.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\n/* harmony import */ var _context_application__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/application */ \"./app/context/application.js\");\n/* harmony import */ var _app_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../app.styles */ \"./app.styles.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Таблица данных \"P8PDataGrid\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные процедуры и функции\n //Таблица данных\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n //Контекст приложения\n //Типовые стили\n\n//---------\n//Константы\n//---------\n\n//Размер страницы данных\nconst DATA_GRID_PAGE_SIZE = 5;\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n TITLE: {\n paddingBottom: \"15px\"\n },\n DATA_GRID_CONTAINER: {\n maxWidth: 700,\n maxHeight: 500,\n minHeight: 500,\n ..._app_styles__WEBPACK_IMPORTED_MODULE_6__.APP_STYLES.SCROLL\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип контрагента\"\nconst formatAgentTypeValue = (value, addText = false) => {\n const [text, icon] = value == 0 ? [\"Юридическое лицо\", \"business\"] : [\"Физическое лицо\", \"person\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n direction: \"row\",\n gap: 0.5,\n alignItems: \"center\",\n justifyContent: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n title: text\n }, icon), addText == true ? text : null);\n};\n\n//Форматирование значений колонок\nconst valueFormatter = ({\n value,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return formatAgentTypeValue(value, true);\n }\n return value;\n};\n\n//Генерация представления ячейки c данными\nconst dataCellRender = ({\n row,\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n cellProps: {\n align: \"center\"\n },\n data: formatAgentTypeValue(row[columnDef.name], false)\n };\n }\n};\n\n//Генерация представления ячейки заголовка\nconst headCellRender = ({\n columnDef\n}) => {\n switch (columnDef.name) {\n case \"NAGNTYPE\":\n return {\n stackProps: {\n justifyContent: \"center\"\n },\n cellProps: {\n align: \"center\"\n }\n };\n }\n};\n\n//Генерация представления ячейки заголовка группы\nconst groupCellRender = () => ({\n cellStyle: {\n padding: \"2px\"\n }\n});\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Таблица данных \"P8PDataGrid\"\nconst DataGrid = ({\n title\n}) => {\n //Собственное состояние - таблица данных\n const [dataGrid, setDataGrid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n dataLoaded: false,\n filters: null,\n orders: null,\n pageNumber: 1,\n morePages: true,\n expandable: true,\n reloading: true\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored,\n SERV_DATA_TYPE_CLOB\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_4__[\"BackEndСtx\"]);\n\n //Подключение к контексту приложения\n const {\n pOnlineShowDocument\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_application__WEBPACK_IMPORTED_MODULE_5__[\"ApplicationСtx\"]);\n\n //Загрузка данных таблицы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (dataGrid.reloading) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.DATA_GRID\",\n args: {\n CFILTERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.filters, {\n arrayNodeName: \"filters\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n CORDERS: {\n VALUE: (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.object2Base64XML)(dataGrid.orders, {\n arrayNodeName: \"orders\"\n }),\n SDATA_TYPE: SERV_DATA_TYPE_CLOB\n },\n NPAGE_NUMBER: dataGrid.pageNumber,\n NPAGE_SIZE: DATA_GRID_PAGE_SIZE,\n NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1\n },\n respArg: \"COUT\"\n });\n setDataGrid(pv => ({\n ...pv,\n ...data.XDATA_GRID,\n columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [],\n rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])],\n groups: data.XDATA_GRID.groups ? pv.pageNumber == 1 ? [...data.XDATA_GRID.groups] : [...(pv.groups || []), ...data.XDATA_GRID.groups.filter(g => !pv.groups.find(pg => pg.name == g.name))] : [...(pv.groups || [])],\n dataLoaded: true,\n reloading: false,\n morePages: (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE\n }));\n }\n }, [dataGrid.reloading, dataGrid.filters, dataGrid.orders, dataGrid.dataLoaded, dataGrid.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);\n\n //При изменении состояния фильтра\n const handleFilterChanged = ({\n filters\n }) => setDataGrid(pv => ({\n ...pv,\n filters: [...filters],\n pageNumber: 1,\n reloading: true\n }));\n\n //При изменении состояния сортировки\n const handleOrderChanged = ({\n orders\n }) => setDataGrid(pv => ({\n ...pv,\n orders: [...orders],\n pageNumber: 1,\n reloading: true\n }));\n\n //При изменении количества отображаемых страниц\n const handlePagesCountChanged = () => setDataGrid(pv => ({\n ...pv,\n pageNumber: pv.pageNumber + 1,\n reloading: true\n }));\n\n //При нажатии на копку контрагента\n const handleAgnButtonClicked = agnCode => pOnlineShowDocument({\n unitCode: \"AGNLIST\",\n document: agnCode,\n inRnParameter: \"in_AGNABBR\"\n });\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n loadData();\n }, [dataGrid.reloading, loadData]);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n container: true,\n spacing: 1,\n pt: 5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n item: true,\n xs: 12\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n p: 5,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\"\n }, dataGrid.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8PDataGrid, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_3__.P8P_DATA_GRID_CONFIG_PROPS, dataGrid, {\n size: _components_p8p_data_grid__WEBPACK_IMPORTED_MODULE_2__.P8P_DATA_GRID_SIZE.LARGE,\n containerComponentProps: {\n elevation: 6,\n sx: STYLES.DATA_GRID_CONTAINER\n },\n valueFormatter: valueFormatter,\n headCellRender: headCellRender,\n dataCellRender: dataCellRender,\n groupCellRender: groupCellRender,\n onOrderChanged: handleOrderChanged,\n onFilterChanged: handleFilterChanged,\n onPagesCountChanged: handlePagesCountChanged,\n rowExpandRender: ({\n row\n }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => handleAgnButtonClicked(row.SAGNABBR)\n }, \"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u0442\\u044C \\u0432 \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B\\u0435\")\n })) : null))));\n};\n\n//Контроль свойств - Пример: Таблица данных \"P8PDataGrid\"\nDataGrid.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_13___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/data_grid.js?"); /***/ }), @@ -5515,7 +5537,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gantt: () => (/* binding */ Gantt)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardHeader/CardHeader.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Avatar/Avatar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Диаграмма Ганта \"P8PGantt\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные функции\n //Заголовок страницы\n //Диаграмма Ганта\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Отступ контейнера страницы от заголовка\nconst CONTAINER_PADDING_TOP = \"20px\";\n\n//Высота заголовка страницы\nconst TITLE_HEIGHT = \"47px\";\n\n//Высота элементов управления\nconst CONTROL_HEIGHT = \"42px\";\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: CONTAINER_PADDING_TOP\n },\n TITLE: {\n paddingBottom: \"15px\",\n height: TITLE_HEIGHT\n },\n CONTROL: {\n height: CONTROL_HEIGHT\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__.APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTROL_HEIGHT} - ${CONTAINER_PADDING_TOP})`,\n width: \"100vw\",\n paddingTop: \"5px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип задачи\"\nconst formatTaskTypeValue = value => {\n const [text, icon] = value == 0 ? [\"Этап проекта\", \"check\"] : [\"Работа проекта\", \"work_outline\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n direction: \"row\",\n gap: 0.5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Генерация кастомных представлений атрибутов задачи в редакторе\nconst taskAttributeRenderer = ({\n task,\n attribute\n}) => {\n switch (attribute.name) {\n case \"type\":\n return formatTaskTypeValue(task.type);\n default:\n return null;\n }\n};\n\n//Генерация кастомного диалога задачи\nconst taskDialogRenderer = ({\n task,\n close\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n avatar: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: {\n bgcolor: task.bgColor\n }\n }, task.type == 0 ? \"Эт\" : \"Ра\"),\n title: task.name,\n subheader: `с ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(task.start)} по ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(task.end)}`\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, \"\\u042D\\u0442\\u043E \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0439 \\u0434\\u0438\\u0430\\u043B\\u043E\\u0433 \\u0441 \\u0434\\u0430\\u043D\\u043D\\u044B\\u043C\\u0438 \\u043E \\u0437\\u0430\\u0434\\u0430\\u0447\\u0435. \\u0412\\u044B \\u043C\\u043E\\u0436\\u0435\\u0442\\u0435 \\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0442\\u0430\\u043A\\u0438\\u0435 \\u0443\\u043A\\u0430\\u0437\\u0430\\u0432 \\u0441\\u0432\\u043E\\u0439 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u043E\\u043D\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439 \\u043A\\u043E\\u043C\\u043F\\u043E\\u043D\\u0435\\u043D\\u0442 \\u0432 \\u043A\\u0430\\u0447\\u0435\\u0441\\u0442\\u0432\\u0435 \\u0441\\u0432\\u043E\\u0439\\u0441\\u0442\\u0432\\u0430 \\\"taskDialogRenderer\\\" \\u043A\\u043E\\u043C\\u043F\\u043E\\u043D\\u0435\\u043D\\u0442\\u0430 \\\"P8PGantt\\\".\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n disableSpacing: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n size: \"small\",\n onClick: close\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\")));\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Диаграмма Ганта \"P8Gantt\"\nconst Gantt = ({\n title\n}) => {\n //Собственное состояние\n const [state, setState] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n dataLoaded: false,\n ident: null,\n ganttDef: {},\n ganttTasks: [],\n useCustomTaskDialog: false\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_5__[\"BackEndСtx\"]);\n\n //Загрузка данных диаграммы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT\",\n args: {\n NIDENT: state.ident\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setState(pv => ({\n ...pv,\n dataLoaded: true,\n ganttDef: {\n ...data.XGANTT_DEF\n },\n ganttTasks: [...data.XGANTT_TASKS]\n }));\n }, [state.ident, executeStored]);\n\n //Инициализация данных диаграммы\n const initData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!state.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_INIT\",\n args: {\n NIDENT: state.ident\n }\n });\n setState(pv => ({\n ...pv,\n init: true,\n ident: data.NIDENT\n }));\n }\n }, [state.init, state.ident, executeStored]);\n\n //Изменение данных диаграммы\n const modifyData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n rn,\n start,\n end\n }) => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_MODIFY\",\n args: {\n NIDENT: state.ident,\n NRN: rn,\n DDATE_FROM: new Date(start),\n DDATE_TO: new Date(end)\n }\n });\n } finally {\n loadData();\n }\n }, [state.ident, executeStored, loadData]);\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyData({\n rn: task.rn,\n start,\n end\n });\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (state.ident) loadData();\n }, [state.ident, loadData]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.CONTROL,\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onChange: () => setState(pv => ({\n ...pv,\n useCustomTaskDialog: !pv.useCustomTaskDialog\n }))\n }),\n label: \"\\u041E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0442\\u044C \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0439 \\u0434\\u0438\\u0430\\u043B\\u043E\\u0433 \\u0437\\u0430\\u0434\\u0430\\u0447\\u0438\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, state.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_3__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, state.ganttDef, {\n containerStyle: STYLES.GANTT_CONTAINER,\n tasks: state.ganttTasks,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer,\n taskDialogRenderer: state.useCustomTaskDialog ? taskDialogRenderer : null\n })) : null)));\n};\n\n//Контроль свойств - Пример: Диаграмма Ганта \"P8Gantt\"\nGantt.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/gantt.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Gantt: () => (/* binding */ Gantt)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Stack/Stack.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Card/Card.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardHeader/CardHeader.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Avatar/Avatar.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardContent/CardContent.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Typography/Typography.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/CardActions/CardActions.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/FormControlLabel/FormControlLabel.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Checkbox/Checkbox.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Grid/Grid.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../core/utils */ \"./app/core/utils.js\");\n/* harmony import */ var _components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/p8p_app_workspace */ \"./app/components/p8p_app_workspace.js\");\n/* harmony import */ var _components_p8p_gantt__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/p8p_gantt */ \"./app/components/p8p_gantt.js\");\n/* harmony import */ var _config_wrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config_wrapper */ \"./app/config_wrapper.js\");\n/* harmony import */ var _context_backend__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../context/backend */ \"./app/context/backend.js\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Пример: Диаграмма Ганта \"P8PGantt\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Контроль свойств компонента\n //Интерфейсные элементы\n //Вспомогательные функции\n //Заголовок страницы\n //Диаграмма Ганта\n //Подключение компонентов к настройкам приложения\n //Контекст взаимодействия с сервером\n\n//---------\n//Константы\n//---------\n\n//Отступ контейнера страницы от заголовка\nconst CONTAINER_PADDING_TOP = \"20px\";\n\n//Высота заголовка страницы\nconst TITLE_HEIGHT = \"47px\";\n\n//Высота элементов управления\nconst CONTROL_HEIGHT = \"42px\";\n\n//Стили\nconst STYLES = {\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: CONTAINER_PADDING_TOP\n },\n TITLE: {\n paddingBottom: \"15px\",\n height: TITLE_HEIGHT\n },\n CONTROL: {\n height: CONTROL_HEIGHT\n },\n GANTT_CONTAINER: {\n height: `calc(100vh - ${_components_p8p_app_workspace__WEBPACK_IMPORTED_MODULE_2__.APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTROL_HEIGHT} - ${CONTAINER_PADDING_TOP})`,\n width: \"100vw\",\n paddingTop: \"5px\"\n }\n};\n\n//---------------------------------------------\n//Вспомогательные функции форматирования данных\n//---------------------------------------------\n\n//Формирование значения для колонки \"Тип задачи\"\nconst formatTaskTypeValue = value => {\n const [text, icon] = value == 0 ? [\"Этап проекта\", \"check\"] : [\"Работа проекта\", \"work_outline\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n direction: \"row\",\n gap: 0.5\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__[\"default\"], {\n title: text\n }, icon), text);\n};\n\n//Генерация кастомных представлений атрибутов задачи в редакторе\nconst taskAttributeRenderer = ({\n task,\n attribute\n}) => {\n switch (attribute.name) {\n case \"type\":\n return formatTaskTypeValue(task.type);\n default:\n return null;\n }\n};\n\n//Генерация кастомного диалога задачи\nconst taskDialogRenderer = ({\n task,\n close\n}) => {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n avatar: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n sx: {\n bgcolor: task.bgColor\n }\n }, task.type == 0 ? \"Эт\" : \"Ра\"),\n title: task.name,\n subheader: `с ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(task.start)} по ${(0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateRF)(task.end)}`\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n variant: \"body2\",\n color: \"text.secondary\"\n }, \"\\u042D\\u0442\\u043E \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0439 \\u0434\\u0438\\u0430\\u043B\\u043E\\u0433 \\u0441 \\u0434\\u0430\\u043D\\u043D\\u044B\\u043C\\u0438 \\u043E \\u0437\\u0430\\u0434\\u0430\\u0447\\u0435. \\u0412\\u044B \\u043C\\u043E\\u0436\\u0435\\u0442\\u0435 \\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0442\\u0430\\u043A\\u0438\\u0435 \\u0443\\u043A\\u0430\\u0437\\u0430\\u0432 \\u0441\\u0432\\u043E\\u0439 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u043E\\u043D\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439 \\u043A\\u043E\\u043C\\u043F\\u043E\\u043D\\u0435\\u043D\\u0442 \\u0432 \\u043A\\u0430\\u0447\\u0435\\u0441\\u0442\\u0432\\u0435 \\u0441\\u0432\\u043E\\u0439\\u0441\\u0442\\u0432\\u0430 \\\"taskDialogRenderer\\\" \\u043A\\u043E\\u043C\\u043F\\u043E\\u043D\\u0435\\u043D\\u0442\\u0430 \\\"P8PGantt\\\".\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n disableSpacing: true\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__[\"default\"], {\n size: \"small\",\n onClick: close\n }, \"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\")));\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Пример: Диаграмма Ганта \"P8Gantt\"\nconst Gantt = ({\n title\n}) => {\n //Собственное состояние\n const [gantt, setGantt] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n init: false,\n dataLoaded: false,\n ident: null,\n useCustomTaskDialog: false\n });\n\n //Подключение к контексту взаимодействия с сервером\n const {\n executeStored\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_context_backend__WEBPACK_IMPORTED_MODULE_5__[\"BackEndСtx\"]);\n\n //Загрузка данных диаграммы с сервера\n const loadData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT\",\n args: {\n NIDENT: gantt.ident\n },\n attributeValueProcessor: (name, val) => name == \"numb\" ? undefined : [\"start\", \"end\"].includes(name) ? (0,_core_utils__WEBPACK_IMPORTED_MODULE_1__.formatDateJSONDateOnly)(val) : val,\n respArg: \"COUT\"\n });\n setGantt(pv => ({\n ...pv,\n dataLoaded: true,\n ...data.XGANTT\n }));\n }, [gantt.ident, executeStored]);\n\n //Инициализация данных диаграммы\n const initData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n if (!gantt.init) {\n const data = await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_INIT\",\n args: {\n NIDENT: gantt.ident\n }\n });\n setGantt(pv => ({\n ...pv,\n init: true,\n ident: data.NIDENT\n }));\n }\n }, [gantt.init, gantt.ident, executeStored]);\n\n //Изменение данных диаграммы\n const modifyData = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n rn,\n start,\n end\n }) => {\n try {\n await executeStored({\n stored: \"PKG_P8PANELS_SAMPLES.GANTT_MODIFY\",\n args: {\n NIDENT: gantt.ident,\n NRN: rn,\n DDATE_FROM: new Date(start),\n DDATE_TO: new Date(end)\n }\n });\n } finally {\n loadData();\n }\n }, [gantt.ident, executeStored, loadData]);\n\n //Обработка измненения сроков задачи в диаграмме Гантта\n const handleTaskDatesChange = ({\n task,\n start,\n end,\n isMain\n }) => {\n if (isMain) modifyData({\n rn: task.rn,\n start,\n end\n });\n };\n\n //При необходимости обновить данные таблицы\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n if (gantt.ident) loadData();\n }, [gantt.ident, loadData]);\n\n //При подключении компонента к странице\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n initData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n sx: STYLES.TITLE,\n variant: \"h6\"\n }, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__[\"default\"], {\n sx: STYLES.CONTROL,\n control: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__[\"default\"], {\n onChange: () => setGantt(pv => ({\n ...pv,\n useCustomTaskDialog: !pv.useCustomTaskDialog\n }))\n }),\n label: \"\\u041E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0442\\u044C \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0439 \\u0434\\u0438\\u0430\\u043B\\u043E\\u0433 \\u0437\\u0430\\u0434\\u0430\\u0447\\u0438\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n container: true,\n direction: \"column\",\n alignItems: \"center\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__[\"default\"], {\n item: true,\n xs: 12\n }, gantt.dataLoaded ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_p8p_gantt__WEBPACK_IMPORTED_MODULE_3__.P8PGantt, _extends({}, _config_wrapper__WEBPACK_IMPORTED_MODULE_4__.P8P_GANTT_CONFIG_PROPS, gantt, {\n containerStyle: STYLES.GANTT_CONTAINER,\n onTaskDatesChange: handleTaskDatesChange,\n taskAttributeRenderer: taskAttributeRenderer,\n taskDialogRenderer: gantt.useCustomTaskDialog ? taskDialogRenderer : null\n })) : null)));\n};\n\n//Контроль свойств - Пример: Диаграмма Ганта \"P8Gantt\"\nGantt.propTypes = {\n title: (prop_types__WEBPACK_IMPORTED_MODULE_18___default().string).isRequired\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/gantt.js?"); /***/ }), @@ -5581,7 +5603,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Samples: () => (/* binding */ Samples)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _p8online__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8online */ \"./app/panels/samples/p8online.js\");\n/* harmony import */ var _mui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mui */ \"./app/panels/samples/mui.js\");\n/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./messages */ \"./app/panels/samples/messages.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader */ \"./app/panels/samples/loader.js\");\n/* harmony import */ var _data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./data_grid */ \"./app/panels/samples/data_grid.js\");\n/* harmony import */ var _chart__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./chart */ \"./app/panels/samples/chart.js\");\n/* harmony import */ var _gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./gantt */ \"./app/panels/samples/gantt.js\");\n/* harmony import */ var _svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svg */ \"./app/panels/samples/svg.js\");\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Панель мониторинга: Примеры для разработчиков\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Текстовые ресурсы и константы\n //Пример: API для взаимодействия с \"ПАРУС 8 Онлайн\"\n //Пример: Компоненты MUI\n //Пример: Сообщения\n //Пример: Индикатор процесса\n //Пример: Таблица данных \"P8PDataGrid\"\n //Пример: Графики \"P8PChart\"\n //Пример: Диаграмма Ганта \"P8PGantt\"\n //Пример: Интерактивные изображения \"P8PSVG\"\n\n//---------\n//Константы\n//---------\n\n//Режимы\nconst MODES = {\n P8ONLINE: {\n name: \"P8ONLINE\",\n caption: 'API для взаимодействия с \"ПАРУС 8 Онлайн\"',\n component: _p8online__WEBPACK_IMPORTED_MODULE_2__.P8Online\n },\n MUI: {\n name: \"MUI\",\n caption: \"Компоненты MUI\",\n component: _mui__WEBPACK_IMPORTED_MODULE_3__.Mui\n },\n MESSAGES: {\n name: \"MESSAGES\",\n caption: \"Сообщения\",\n component: _messages__WEBPACK_IMPORTED_MODULE_4__.Messages\n },\n LOADER: {\n name: \"LOADER\",\n caption: \"Индикатор процесса\",\n component: _loader__WEBPACK_IMPORTED_MODULE_5__.Loader\n },\n DATAGRID: {\n name: \"DATAGRID\",\n caption: 'Таблица данных \"P8PDataGrid\"',\n component: _data_grid__WEBPACK_IMPORTED_MODULE_6__.DataGrid\n },\n CHART: {\n name: \"CHART\",\n caption: 'Графики \"P8PChart\"',\n component: _chart__WEBPACK_IMPORTED_MODULE_7__.Chart\n },\n GANTT: {\n name: \"GANTT\",\n caption: 'Диаграмма Ганта \"P8PGantt\"',\n component: _gantt__WEBPACK_IMPORTED_MODULE_8__.Gantt\n },\n SVG: {\n name: \"SVG\",\n caption: 'Интерактивные изображения \"P8PSVG\"',\n component: _svg__WEBPACK_IMPORTED_MODULE_9__.Svg\n }\n};\n\n//Стили\nconst STYLES = {\n ROOT: {\n height: \"calc(100vh - 64px)\"\n },\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n BACK_BUTTON: {\n position: \"absolute\",\n left: \"20px\",\n marginTop: \"20px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Примеры\nconst Samples = () => {\n //Собственное состояние\n const [mode, setMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.ROOT\n }, mode ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.BACK_BUTTON,\n onClick: () => setMode(\"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], null, \"arrow_back_ios\"), _app_text__WEBPACK_IMPORTED_MODULE_1__.BUTTONS.NAVIGATE_BACK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MODES[mode]?.component || (() => {}), {\n title: MODES[mode]?.caption\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, Object.entries(MODES).map(m => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: m[0]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], {\n onClick: () => setMode(m[1].name)\n }, m[1].caption)))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/samples.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Samples: () => (/* binding */ Samples)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Fab/Fab.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Icon/Icon.js\");\n/* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ \"./node_modules/@mui/material/Button/Button.js\");\n/* harmony import */ var _app_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../app.text */ \"./app.text.js\");\n/* harmony import */ var _p8online__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./p8online */ \"./app/panels/samples/p8online.js\");\n/* harmony import */ var _mui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mui */ \"./app/panels/samples/mui.js\");\n/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./messages */ \"./app/panels/samples/messages.js\");\n/* harmony import */ var _loader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./loader */ \"./app/panels/samples/loader.js\");\n/* harmony import */ var _data_grid__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./data_grid */ \"./app/panels/samples/data_grid.js\");\n/* harmony import */ var _chart__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./chart */ \"./app/panels/samples/chart.js\");\n/* harmony import */ var _gantt__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./gantt */ \"./app/panels/samples/gantt.js\");\n/* harmony import */ var _svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./svg */ \"./app/panels/samples/svg.js\");\n/* harmony import */ var _cyclogram__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cyclogram */ \"./app/panels/samples/cyclogram.js\");\n/*\r\n Парус 8 - Панели мониторинга - Примеры для разработчиков\r\n Панель мониторинга: Примеры для разработчиков\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Классы React\n //Интерфейсные элементы\n //Текстовые ресурсы и константы\n //Пример: API для взаимодействия с \"ПАРУС 8 Онлайн\"\n //Пример: Компоненты MUI\n //Пример: Сообщения\n //Пример: Индикатор процесса\n //Пример: Таблица данных \"P8PDataGrid\"\n //Пример: Графики \"P8PChart\"\n //Пример: Диаграмма Ганта \"P8PGantt\"\n //Пример: Интерактивные изображения \"P8PSVG\"\n //Пример: Циклограмма \"P8PCyclogram\"\n\n//---------\n//Константы\n//---------\n\n//Режимы\nconst MODES = {\n P8ONLINE: {\n name: \"P8ONLINE\",\n caption: 'API для взаимодействия с \"ПАРУС 8 Онлайн\"',\n component: _p8online__WEBPACK_IMPORTED_MODULE_2__.P8Online\n },\n MUI: {\n name: \"MUI\",\n caption: \"Компоненты MUI\",\n component: _mui__WEBPACK_IMPORTED_MODULE_3__.Mui\n },\n MESSAGES: {\n name: \"MESSAGES\",\n caption: \"Сообщения\",\n component: _messages__WEBPACK_IMPORTED_MODULE_4__.Messages\n },\n LOADER: {\n name: \"LOADER\",\n caption: \"Индикатор процесса\",\n component: _loader__WEBPACK_IMPORTED_MODULE_5__.Loader\n },\n DATAGRID: {\n name: \"DATAGRID\",\n caption: 'Таблица данных \"P8PDataGrid\"',\n component: _data_grid__WEBPACK_IMPORTED_MODULE_6__.DataGrid\n },\n CHART: {\n name: \"CHART\",\n caption: 'Графики \"P8PChart\"',\n component: _chart__WEBPACK_IMPORTED_MODULE_7__.Chart\n },\n GANTT: {\n name: \"GANTT\",\n caption: 'Диаграмма Ганта \"P8PGantt\"',\n component: _gantt__WEBPACK_IMPORTED_MODULE_8__.Gantt\n },\n SVG: {\n name: \"SVG\",\n caption: 'Интерактивные изображения \"P8PSVG\"',\n component: _svg__WEBPACK_IMPORTED_MODULE_9__.Svg\n },\n CYCLOGRAM: {\n name: \"CYCLOGRAM\",\n caption: 'Циклограмма \"P8PCyclogram\"',\n component: _cyclogram__WEBPACK_IMPORTED_MODULE_10__.Cyclogram\n }\n};\n\n//Стили\nconst STYLES = {\n ROOT: {\n height: \"calc(100vh - 64px)\"\n },\n CONTAINER: {\n textAlign: \"center\",\n paddingTop: \"20px\"\n },\n BACK_BUTTON: {\n position: \"absolute\",\n left: \"20px\",\n marginTop: \"20px\"\n }\n};\n\n//-----------\n//Тело модуля\n//-----------\n\n//Примеры\nconst Samples = () => {\n //Собственное состояние\n const [mode, setMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n\n //Генерация содержимого\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.ROOT\n }, mode ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__[\"default\"], {\n variant: \"extended\",\n sx: STYLES.BACK_BUTTON,\n onClick: () => setMode(\"\")\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__[\"default\"], null, \"arrow_back_ios\"), _app_text__WEBPACK_IMPORTED_MODULE_1__.BUTTONS.NAVIGATE_BACK), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MODES[mode]?.component || (() => {}), {\n title: MODES[mode]?.caption\n })) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: STYLES.CONTAINER\n }, Object.entries(MODES).map(m => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: m[0]\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__[\"default\"], {\n onClick: () => setMode(m[1].name)\n }, m[1].caption)))));\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/panels/samples/samples.js?"); /***/ }), diff --git a/docs/img/72.png b/docs/img/72.png new file mode 100644 index 0000000..2235039 Binary files /dev/null and b/docs/img/72.png differ diff --git a/docs/img/73.png b/docs/img/73.png new file mode 100644 index 0000000..9a4cacf Binary files /dev/null and b/docs/img/73.png differ diff --git a/index.html b/index.html index 236ddf3..adcd761 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@ - +