From 8f015f6ecf628c8e7a3bf7b435ee8ff419ecd9bd Mon Sep 17 00:00:00 2001 From: davay-popozhe Date: Tue, 26 Mar 2024 16:52:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=A2=D0=9E=D0=B8=D0=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/panels/eqs_prfrm/eqs_prfrm.js | 492 +++++++++++++++++++- app/panels/eqs_prfrm/layouts.js | 173 +++++++ dist/p8-panels.js | 723 +++++++++++++++++------------- package-lock.json | 300 ++++++++----- package.json | 5 +- 5 files changed, 1254 insertions(+), 439 deletions(-) create mode 100644 app/panels/eqs_prfrm/layouts.js diff --git a/app/panels/eqs_prfrm/eqs_prfrm.js b/app/panels/eqs_prfrm/eqs_prfrm.js index 4dc9604..aa459d0 100644 --- a/app/panels/eqs_prfrm/eqs_prfrm.js +++ b/app/panels/eqs_prfrm/eqs_prfrm.js @@ -7,7 +7,32 @@ //Подключение библиотек //--------------------- -import React from "react"; //Классы React +import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React +import { + Grid, + Paper, + Box, + Link, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + InputLabel, + FormControl, + OutlinedInput, + InputAdornment, + IconButton, + Icon, + Select, + MenuItem, + FormHelperText +} from "@mui/material"; +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 { headCellRender, dataCellRender, groupCellRender, DIGITS_REG_EXP, MONTH_NAME_REG_EXP, DAY_NAME_REG_EXP } from "./layouts"; //Дополнительная разметка и вёрстка клиентских элементов //----------- //Тело модуля @@ -15,8 +40,469 @@ import React from "react"; //Классы React //Корневая панель выполнения работ const EqsPrfrm = () => { - //Генерация содержимого - return
Выполнение работ ТОиР
; + //Собственное состояние - таблица данных + const [dataGrid, setDataGrid] = useState({ + dataLoaded: false, + columnsDef: [], + groups: [], + rows: [], + reload: false + }); + + const [filter, setFilter] = useState({ + belong: "Демопример", + prodObj: "К2", + techServ: "", + respDep: "", + fromMonth: 1, + fromYear: 2024, + toMonth: 12, + toYear: 2024}); + + // const [filter, setFilter] = useState({ + // belong: "", + // prodObj: "", + // techServ: "", + // respDep: "", + // fromMonth: "", + // fromYear: "", + // toMonth: "", + // toYear: ""}); + + const [info, setInfo] = useState({cntP: 0, sumP: 0, cntF: 0, sumF: 0}); + + //Подключение к контексту приложения + const { pOnlineShowDictionary } = useContext(ApplicationСtx); + + const [filterOpen, setFilterOpen] = useState(false); + + const [filterCopy, setFilterCopy] = useState({...filter}); + + const [filterLock, setFilterLock] = useState(false); + + const openFilter = () => { + setFilterOpen(true); + }; + + const closeFilter = (e) => { + if (filterLock && e != undefined) setFilter(filterCopy); + setFilterOpen(false); + }; + + const clearFilter = () => { + setFilter({ + belong: "", + prodObj: "", + techServ: "", + respDep: "", + fromMonth: "", + fromYear: "", + toMonth: "", + toYear: ""}); + }; + + let yearArray = []; + let today = new Date(); + + const getYearArray = () => { + for (let i = 1990; i <= today.getFullYear(); i++) { + yearArray.push(i); + } + }; + + const monthArray = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]; + + //Подключение к контексту взаимодействия с сервером + const { executeStored } = useContext(BackEndСtx); + + //Загрузка данных таблицы с сервера + const loadData = useCallback(async () => { + if (dataGrid.reload) { + const data = await executeStored({ + stored: "PKG_P8PANELS_EQUIPSRV.EQUIPSRV_GRID", + args: { + SBELONG: filter.belong, + SPRODOBJ: filter.prodObj, + STECHSERV: filter.techServ, + SRESPDEP: filter.respDep, + NFROMMONTH: filter.fromMonth, + NFROMYEAR: filter.fromYear, + NTOMONTH: filter.toMonth, + NTOYEAR: filter.toYear + }, + respArg: "COUT", + attributeValueProcessor: (name, val) => (["caption", "name", "parent"].includes(name) ? undefined : val) + }); + let cP = 0; + let sP = 0; + let cF = 0; + let sF = 0; + let properties = []; + if (data.XROWS != null) + { + data.XROWS.map((row) => { + properties = []; + Object.entries(row).forEach(([key, value]) => + properties.push({ name: key, data: value })); + if (properties[1].data == "Факт" || properties[2].data == "План") + { + if (properties[2].data == "План") + { + properties.map((p) => { + if (DAY_NAME_REG_EXP.test(p.name)) + cP = cP + 1; + }); + } + else if (properties[1].data == "Факт") + { + properties.map((p) => { + if (DAY_NAME_REG_EXP.test(p.name)) + cF = cF + 1; + }); + } + } + else + { + properties.map((p) => { + if (MONTH_NAME_REG_EXP.test(p.name)) + { + let str = p.data; + let m = []; + let i = 0; + while ((m = DIGITS_REG_EXP.exec(str)) != null) { + if (i == 0) + sP = sP + Number(m[0].replace(",", ".")); + else + { + sF = sF + Number(m[0].replace(",", ".")); + } + i++; + } + } + }); + } + }); + } + setInfo({cntP: cP, sumP: sP, cntF: cF, sumF: sF}); + setDataGrid(pv => ({ + ...pv, + columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, + rows: [...(data.XROWS || [])], + groups: [...(data.XGROUPS || [])], + dataLoaded: true, + reload: false + })); + } + }, [dataGrid.reload, filter, executeStored]); + + //пользовательский параметр JuridicalPerson системы + const getJurPers = useCallback(async () => { + const data = await executeStored({ + stored: "PKG_P8PANELS_EQUIPSRV.GET_JUR_PERS_PRM", + respArg: "CRES" + }); + setFilter(pv => ({...pv, belong: data})); + }, [executeStored]); + + useEffect(() => { + if (filterOpen) + { + setFilterCopy({...filter}); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [filterOpen]) + + //При необходимости обновить данные таблицы + useEffect(() => { + loadData(); + },[loadData, dataGrid.reload]); + + //Генерация содержимого + return ( +
+ {getYearArray()} + + Фильтр отбора + theme.palette.grey[500], + }} + > + close + + + + + + Принадлежность + + { + pOnlineShowDictionary({ + unitCode: "JuridicalPersons", + callBack: res => (res.success === true ? setFilter(pv => ({...pv, belong: res.outParameters.out_CODE})) : null) + }); + }} + edge="end" + > + list + + + } + aria-describedby="belong-outlined-helper-text" + label="Принадлежность" + /> + + + {filter.belong ? null : *Обязательное поле} + + + + Значение по умолчанию + + + + + + + + Производственный объект + + { + pOnlineShowDictionary({ + unitCode: "EquipConfiguration", + callBack: res => + res.success === true ? setFilter(pv => ({...pv, prodObj: res.outParameters.out_CODE})) : null + }); + }} + edge="end" + > + list + + + } + aria-describedby="prodObj-outlined-helper-text" + label="Производственный объект" + /> + {filter.prodObj ? null : *Обязательное поле} + + + + + Техническая служба + + { + pOnlineShowDictionary({ + unitCode: "INS_DEPARTMENT", + callBack: res => + res.success === true ? setFilter(pv => ({...pv, techServ: res.outParameters.out_CODE})) : null + }); + }} + edge="end" + > + list + + + } + label="Техническая служба" + /> + + + + + Ответственное подразделение + + { + pOnlineShowDictionary({ + unitCode: "INS_DEPARTMENT", + callBack: res => + res.success === true ? setFilter(pv => ({...pv, respDep: res.outParameters.out_CODE})) : null + }); + }} + edge="end" + > + list + + + } + label="Ответственное подразделение" + /> + + + + + + Начало периода: + + + + Месяц + + {filter.fromMonth ? null : *Обязательное поле} + + + + + Год + + {filter.fromYear ? null : *Обязательное поле} + + + + + + + + Конец периода: + + + + Месяц + + {filter.toMonth ? null : *Обязательное поле} + + + + + Год + + {filter.toYear ? null : *Обязательное поле} + + + + + + + + + + + + + + Фильтр отбора: {filter.belong ? `Принадлежность: ${filter.belong}` : ""} {filter.prodObj ? `Производственный объект: ${filter.prodObj}` : ""} {filter.techServ ? `Техническая служба: ${filter.techServ}` : ""} {filter.respDep ? `Ответственное подразделение: ${filter.respDep}` : ""} {filter.fromMonth && filter.fromYear ? `Начало периода: ${filter.fromMonth < 10 ? "0" + filter.fromMonth : filter.fromMonth}.${filter.fromYear}` : ""} {filter.toMonth && filter.toYear ? `Конец периода: ${filter.toMonth < 10 ? "0" + filter.toMonth : filter.toMonth}.${filter.toYear}` : ""} + + {dataGrid.dataLoaded ? ( + + + + + headCellRender({ ...prms }, + filter.techServ, + info.cntP, + info.sumP, + info.cntF, + info.sumF)} + dataCellRender={prms => dataCellRender({ ...prms })} + groupCellRender={prms => groupCellRender({ ...prms })} + showCellRightBorder={true} + /> + + + + + ) : null} +
+ ); }; //---------------- diff --git a/app/panels/eqs_prfrm/layouts.js b/app/panels/eqs_prfrm/layouts.js new file mode 100644 index 0000000..b9eba49 --- /dev/null +++ b/app/panels/eqs_prfrm/layouts.js @@ -0,0 +1,173 @@ +/* + Парус 8 - + Дополнительная разметка и вёрстка клиентских элементов +*/ + +//--------------------- +//Подключение библиотек +//--------------------- + +import { Grid, Stack } from "@mui/material"; +import React from "react"; //Классы React + +//--------- +//Константы +//--------- + +//Шаблон чисел и имён ячеек дат +export const DIGITS_REG_EXP = /\d+,?\d*/g; +export const MONTH_NAME_REG_EXP = /_\d{4}_\d{1,2}/; +export const DAY_NAME_REG_EXP = /_\d{4}_\d{1,2}_\d{1,2}/; + +let curParent = ""; +let x = 0; + +//----------- +//Тело модуля +//----------- +const formatDate = date => { + const [year, month, day] = date.substring(1).split("_"); + let nd; + if (day == null) nd = `${month < 10 ? "0" + month : month}.${year}`; + else nd = `${day < 10 ? "0" + day : day}.${month < 10 ? "0" + month : month}.${year}`; + return nd; +}; + +export const headCellRender = ({columnDef}, podr, cntP, sumP, cntF, sumF) => { + let cellStyle = {border: "1px solid rgba(0, 0, 0)", textAlign: "center"}; + let cellProps = {}; + let data = columnDef.caption; + + if (columnDef.expandable) + { + // поменять расположение + для развёртывания + } + if (columnDef.name == "STEST") + cellStyle = {display: "none"}; + if (columnDef.name == "SINFO" || columnDef.name == "SINFO2") + { + cellProps = { colSpan: 2 }; + if (columnDef.name == "SINFO") + { + cellStyle = {...cellStyle, padding: "unset"}; + data = + + + Подразделение: + + + {podr} + + + Кол-во ремонтов, план: + + + {cntP} + + + Трудоемкость, час. план: + + + {sumP} + + + Кол-во ремонтов, факт: + + + {cntF} + + + Трудоемкость, час. факт: + + + {sumF} + + + + } + } + + if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) + { + cellStyle = {...cellStyle, + paddingLeft: "5px", + paddingRight: "5px", + minWidth: "25px", + maxWidth: "25px"} + } + + return {cellStyle, cellProps, data}; +}; + +export const dataCellRender = ({ row, columnDef }) => { + let cellStyle = { + padding: "2px", + border: "1px solid rgba(0, 0, 0)", + textAlign: "center" + }; + let cellProps = {}; + let data = " "; + + if (row["SINFO2"] == undefined) { + if (columnDef.name == "STEST") cellProps = { colSpan: 2 }; + if (columnDef.name == "SINFO2") cellStyle = { display: "none" }; + if (columnDef.parent == "" && columnDef.expandable == true && columnDef.expanded == false) { + curParent = columnDef.name; + return { cellStyle: { ...cellStyle, height: "25px" }, data }; + } else if (columnDef.name != "SINFO2" && columnDef.parent != "" && columnDef.expandable == false && columnDef.expanded == true) { + if (columnDef.name.endsWith("_1")) { + curParent = columnDef.parent; + const [year, month] = curParent.substring(1).split("_"); + x = new Date(year, month, 0).getDate(); + cellProps = { colSpan: x }; + data = row[curParent]; + return { cellStyle, cellProps, data }; + } else { + cellStyle = { display: "none" }; + } + } + } + if (columnDef.name == "STEST" && row["SINFO2"] == "План") { + cellStyle = { ...cellStyle }; + cellProps = { rowSpan: 2 }; + } + if (columnDef.name == "STEST" && row["SINFO2"] == "Факт") { + cellStyle = { display: "none" }; + } + + switch (row[columnDef.name]) { + case "blue": + cellStyle = { ...cellStyle, backgroundColor: "royalblue", border: "1px solid rgba(0, 0, 0)" }; + cellProps = { title: formatDate(columnDef.name) }; + return { cellStyle, cellProps, data }; + case "green": + cellStyle = { ...cellStyle, backgroundColor: "lawngreen", border: "1px solid rgba(0, 0, 0)" }; + cellProps = { title: formatDate(columnDef.name) }; + return { cellStyle, cellProps, data }; + case "red": + cellStyle = { ...cellStyle, backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0)" }; + cellProps = { title: formatDate(columnDef.name) }; + return { cellStyle, cellProps, data }; + case "green red": + case "red green": + cellStyle = {...cellStyle, padding: "unset"}; + cellProps = { title: formatDate(columnDef.name) }; + data = + + + +

g

+
+ +

r

+
+
+
+ } + return { cellStyle, cellProps }; +}; + +export const groupCellRender = () => { + let cellStyle = { display: "none" }; + return { cellStyle }; +}; diff --git a/dist/p8-panels.js b/dist/p8-panels.js index 27c69d5..a47e3dc 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/index\": \"./app/panels/eqs_prfrm/index.js\",\n\t\"./eqs_prfrm/index.js\": \"./app/panels/eqs_prfrm/index.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/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.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_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/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\"./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};\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/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\"./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/211.png\": \"./app/panels/prj_help/img/211.png\",\n\t\"./prj_help/img/212.png\": \"./app/panels/prj_help/img/212.png\",\n\t\"./prj_help/img/213.png\": \"./app/panels/prj_help/img/213.png\",\n\t\"./prj_help/img/214.png\": \"./app/panels/prj_help/img/214.png\",\n\t\"./prj_help/img/215.png\": \"./app/panels/prj_help/img/215.png\",\n\t\"./prj_help/img/221.png\": \"./app/panels/prj_help/img/221.png\",\n\t\"./prj_help/img/222.png\": \"./app/panels/prj_help/img/222.png\",\n\t\"./prj_help/img/223.png\": \"./app/panels/prj_help/img/223.png\",\n\t\"./prj_help/img/231.png\": \"./app/panels/prj_help/img/231.png\",\n\t\"./prj_help/img/232.png\": \"./app/panels/prj_help/img/232.png\",\n\t\"./prj_help/img/241.png\": \"./app/panels/prj_help/img/241.png\",\n\t\"./prj_help/img/242.png\": \"./app/panels/prj_help/img/242.png\",\n\t\"./prj_help/img/243.png\": \"./app/panels/prj_help/img/243.png\",\n\t\"./prj_help/img/244.png\": \"./app/panels/prj_help/img/244.png\",\n\t\"./prj_help/img/245.png\": \"./app/panels/prj_help/img/245.png\",\n\t\"./prj_help/img/31.png\": \"./app/panels/prj_help/img/31.png\",\n\t\"./prj_help/img/32.png\": \"./app/panels/prj_help/img/32.png\",\n\t\"./prj_help/img/33.png\": \"./app/panels/prj_help/img/33.png\",\n\t\"./prj_help/img/34.png\": \"./app/panels/prj_help/img/34.png\",\n\t\"./prj_help/img/35.png\": \"./app/panels/prj_help/img/35.png\",\n\t\"./prj_help/img/36.png\": \"./app/panels/prj_help/img/36.png\",\n\t\"./prj_help/img/411.png\": \"./app/panels/prj_help/img/411.png\",\n\t\"./prj_help/img/412.png\": \"./app/panels/prj_help/img/412.png\",\n\t\"./prj_help/img/421.png\": \"./app/panels/prj_help/img/421.png\",\n\t\"./prj_help/img/422.png\": \"./app/panels/prj_help/img/422.png\",\n\t\"./prj_help/img/431.png\": \"./app/panels/prj_help/img/431.png\",\n\t\"./prj_help/img/432.png\": \"./app/panels/prj_help/img/432.png\",\n\t\"./prj_help/img/433.png\": \"./app/panels/prj_help/img/433.png\",\n\t\"./prj_help/img/434.png\": \"./app/panels/prj_help/img/434.png\",\n\t\"./prj_help/img/441.png\": \"./app/panels/prj_help/img/441.png\",\n\t\"./prj_help/img/442.png\": \"./app/panels/prj_help/img/442.png\",\n\t\"./prj_help/img/443.png\": \"./app/panels/prj_help/img/443.png\",\n\t\"./prj_help/img/444.png\": \"./app/panels/prj_help/img/444.png\",\n\t\"./prj_help/img/451.png\": \"./app/panels/prj_help/img/451.png\",\n\t\"./prj_help/img/461.png\": \"./app/panels/prj_help/img/461.png\",\n\t\"./prj_help/img/471.png\": \"./app/panels/prj_help/img/471.png\",\n\t\"./prj_help/img/711.png\": \"./app/panels/prj_help/img/711.png\",\n\t\"./prj_help/img/721.png\": \"./app/panels/prj_help/img/721.png\",\n\t\"./prj_help/img/722.png\": \"./app/panels/prj_help/img/722.png\",\n\t\"./prj_help/img/723.png\": \"./app/panels/prj_help/img/723.png\",\n\t\"./prj_help/img/741.png\": \"./app/panels/prj_help/img/741.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_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/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\"./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};\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_^\\.\\/.*$?"); /***/ }), @@ -191,40 +191,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 */ FocusTrap: () => (/* binding */ FocusTrap)\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_5__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/useForkRef/useForkRef.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/ownerDocument/ownerDocument.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/elementAcceptingRef.js\");\n/* harmony import */ var _mui_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/utils */ \"./node_modules/@mui/utils/esm/exactProp/exactProp.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ \"./node_modules/react/jsx-runtime.js\");\n'use client';\n\n/* eslint-disable consistent-return, jsx-a11y/no-noninteractive-tabindex */\n\n\n\n\n\n// Inspired by https://github.com/focus-trap/tabbable\nconst candidatesSelector = ['input', 'select', 'textarea', 'a[href]', 'button', '[tabindex]', 'audio[controls]', 'video[controls]', '[contenteditable]:not([contenteditable=\"false\"])'].join(',');\nfunction getTabIndex(node) {\n const tabindexAttr = parseInt(node.getAttribute('tabindex') || '', 10);\n if (!Number.isNaN(tabindexAttr)) {\n return tabindexAttr;\n }\n\n // Browsers do not return `tabIndex` correctly for contentEditable nodes;\n // https://bugs.chromium.org/p/chromium/issues/detail?id=661108&q=contenteditable%20tabindex&can=2\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n // in Chrome,
,